From 20525cb83f9982bb76cd80544fe8368d11321fa3 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Mon, 6 May 2024 16:48:02 -0500 Subject: [PATCH 001/221] ISSUE-249: [update] Spectral & OAS, add obj properties and array items to linter + fixes (#254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #249 ## What changed? * Update spectral linter to remove old caveats * Update spectral linter to add the following requirements * all objects have a properties attribute * all arrays have an items attribute * all schemas with a properties attribute have type: object * Update the spec files to meet the new linting requirements ## Release notes draft * ## Anything else? ping @jb-gourav --- .spectral.yaml | 131 ++-- reference/.spectral.yaml | 4 - reference/abandoned_cart_emails.v3.yaml | 1 + reference/abandoned_carts.v3.yml | 3 + reference/carts.sf.yml | 45 +- reference/carts.v3.yml | 29 +- reference/catalog/brands_catalog.v3.yml | 4 + reference/catalog/categories_catalog.v3.yml | 5 + .../catalog/product-modifiers_catalog.v3.yml | 12 - .../product-variant-options_catalog.v3.yml | 20 +- .../catalog/product-variants_catalog.v3.yml | 10 +- reference/catalog/products_catalog.v3.yml | 24 +- reference/channels.v3.yml | 13 +- reference/checkouts.sf.yml | 565 +++++++++--------- reference/checkouts.v3.yml | 14 +- reference/consent.sf.yml | 5 + reference/currencies.v2.yml | 4 + reference/current_customer.yml | 7 +- reference/custom-template-associations.v3.yml | 3 + reference/customer_login.yml | 2 + reference/customers.sf.yml | 5 + reference/customers.v3.yml | 213 ++++--- reference/email_templates.v3.yml | 3 + reference/form_fields.sf.yml | 5 + reference/geography.v2.yml | 32 +- reference/marketing.v2.yml | 14 +- reference/orders.sf.yml | 2 + reference/orders.v2.oas2.yml | 36 +- reference/orders.v3.yml | 97 +-- reference/pages.v3.yml | 365 ++++------- .../payments/accepted-methods_payments.v3.yml | 5 + .../payments/access-tokens_payments.v3.yml | 6 + reference/payments/process_payments.yml | 4 + reference/price_lists.v3.yml | 196 +++--- reference/settings.v3.yml | 90 +-- reference/shipping.v2.yml | 127 ++-- reference/shipping.v3.yml | 4 +- reference/shipping_provider.yml | 4 + reference/sites.v3.yml | 2 + reference/store_content.v2.yml | 12 +- reference/store_logs.v3.yml | 1 + reference/storefront_tokens.v3.yml | 1 + reference/subscribers.v3.yml | 5 +- reference/tax_properties.v3.yml | 2 + reference/tax_provider.yml | 10 +- reference/themes.v3.yml | 37 +- reference/webhooks.v3.yml | 257 ++++---- reference/widgets.v3.yml | 26 +- reference/wishlists.v3.yml | 2 + 49 files changed, 1170 insertions(+), 1294 deletions(-) diff --git a/.spectral.yaml b/.spectral.yaml index 27c0c07b7..a2fa648a4 100644 --- a/.spectral.yaml +++ b/.spectral.yaml @@ -1,93 +1,44 @@ extends: spectral:oas rules: - info-contact: off oas3-unused-component: off - oas2-unused-definition: off -except: - 'reference/tax_provider.yml': - - oas3-schema - 'reference/carts.v3.yml': - - oas2-oneOf - - oas2-valid-schema-example - - operation-tag-defined - 'reference/catalog.v3.yml': - - oas2-operation-security-defined - - oas3-schema - - oas2-schema - - oas2-valid-media-example - - oas2-valid-schema-example - 'reference/channels.v3.yml': - - oas3-schema - - oas3-valid-media-example - 'reference/current_customer.yml': - - operation-success-response - 'reference/custom-template-associations.v3.yml': - - openapi-tags - - operation-tag-defined - 'reference/customer_login.yml': - - operation-success-response - 'reference/email_templates.v3.yml': - - oas3-schema - 'reference/geography.v2.yml': - - oas2-valid-media-example - 'reference/orders.v2.oas2.yml': - - oas3-valid-schema-example - - oas3-valid-media-example - - oas3-schema - 'reference/orders.v3.yml': - - oas2-valid-schema-example - - oas2-valid-media-example - - oas2-anyOf - 'reference/settings.v3.yml': - - oas3-valid-media-example - 'reference/sites.v3.yml': - - oas2-valid-media-example - 'reference/store_information.v2.yml': - - oas2-valid-media-example - - oas2-valid-schema-example - 'reference/themes.v3.yml': - - oas3-schema - 'reference/webhooks.v3.yml': - - oas3-valid-media-example - 'carts.v3.yml': - - oas2-oneOf - - oas2-valid-schema-example - 'catalog.v3.yml': - - oas2-operation-security-defined - - oas3-schema - - oas2-schema - - oas2-valid-media-example - - oas2-valid-schema-example - 'channels.v3.yml': - - oas3-schema - - oas3-valid-media-example - 'current_customer.yml': - - operation-success-response - 'customer_login.yml': - - operation-success-response - 'email_templates.v3.yml': - - oas3-schema - 'geography.v2.yml': - - oas2-valid-media-example - 'orders.v2.oas2.yml': - - oas3-valid-schema-example - - oas3-valid-media-example - - oas3-schema - 'orders.v3.yml': - - oas2-valid-schema-example - - oas2-valid-media-example - - oas2-anyOf - 'settings.v3.yml': - - oas3-valid-media-example - 'sites.v3.yml': - - oas2-valid-media-example - 'store_information.v2.yml': - - oas2-valid-media-example - - oas2-valid-schema-example - 'themes.v3.yml': - - oas3-schema - 'webhooks.v3.yml': - - oas3-valid-media-example - 'pages.v3.yml': - - oas3-valid-media-example - - oas3-valid-schema-example + properties-type-object: + description: "type: object must have a properties sibling." + given: "$..[?(@ && @.type == 'object')]" + severity: error + # must not be resolved because $ref-defined objects shall have its type + # defined in the referenced schema, not the referencing field (and $ref + # must be the only property, anyway) + resolved: false + # type field must be defined and contain the value object + then: + - field: "properties" + function: "truthy" + items-type-array: + description: "type: array must have an items sibling." + given: "$..[?(@ && @.type == 'array')]" + severity: error + # must not be resolved because $ref-defined objects shall have its type + # defined in the referenced schema, not the referencing field (and $ref + # must be the only property, anyway) + resolved: false + # type field must be defined and contain the value object + then: + - field: "items" + function: "truthy" + type-object-properties: + description: "Objects with properties must have type: object." + given: "$..[?(@ && @.properties)]" + severity: error + # must not be resolved because $ref-defined objects shall have its type + # defined in the referenced schema, not the referencing field (and $ref + # must be the only property, anyway) + resolved: false + # type field must be defined and contain the value object + then: + - field: "type" + function: defined + - field: "type" + function: enumeration + functionOptions: + values: + - object diff --git a/reference/.spectral.yaml b/reference/.spectral.yaml index ed9abd2b9..f38a96245 100644 --- a/reference/.spectral.yaml +++ b/reference/.spectral.yaml @@ -1,7 +1,3 @@ extends: - spectral:oas - ../.spectral.yaml -rules: - info-contact: off - oas3-unused-components: off - oas2-unused-definition: off \ No newline at end of file diff --git a/reference/abandoned_cart_emails.v3.yaml b/reference/abandoned_cart_emails.v3.yaml index 2b74b7992..f1523dcb4 100644 --- a/reference/abandoned_cart_emails.v3.yaml +++ b/reference/abandoned_cart_emails.v3.yaml @@ -227,6 +227,7 @@ paths: required: - locale - keys + type: object properties: locale: type: string diff --git a/reference/abandoned_carts.v3.yml b/reference/abandoned_carts.v3.yml index 49c1d4b43..5bcab5296 100644 --- a/reference/abandoned_carts.v3.yml +++ b/reference/abandoned_carts.v3.yml @@ -360,6 +360,7 @@ components: properties: errors: type: object + properties: {} additionalProperties: type: string title: DetailedErrors @@ -508,6 +509,8 @@ components: type: string errors: type: object + properties: {} + additionalProperties: true x-tags: - Models diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 68172a982..82b25d622 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -381,8 +381,9 @@ components: requestCart: title: Create Cart Request Object description: Cart object used in create cart requests. - oneOf: - - properties: + anyOf: + - type: object + properties: lineItems: type: array items: @@ -391,7 +392,8 @@ components: type: string required: - lineItems - - properties: + - type: object + properties: giftCertificates: type: array items: @@ -400,7 +402,8 @@ components: type: string required: - giftCertificates - - properties: + - type: object + properties: lineItems: type: array items: @@ -412,8 +415,6 @@ components: required: - lineItems - giftCertificates - type: object - x-internal: false responseCartLineItemsPhysicalItemGiftWrapping: title: Gift Wrapping type: object @@ -498,22 +499,25 @@ components: example: Happy Birthday LineItemsRequest: title: requestLineItems - oneOf: - - properties: + anyOf: + - type: object + properties: lineItems: type: array items: $ref: '#/components/schemas/requestCartPostLineItem' required: - lineItems - - properties: + - type: object + properties: giftCertificates: type: array items: $ref: '#/components/schemas/requestLineItemGiftCertificate' required: - giftCertificates - - properties: + - type: object + properties: lineItems: type: array items: @@ -523,25 +527,27 @@ components: required: - lineItems - giftCertificates - type: object description: Cart object used in add items requests. x-internal: false requestLineItemPut: title: requestLineItemPut - oneOf: - - properties: + anyOf: + - type: object + properties: lineItem: $ref: '#/components/schemas/requestCartPostLineItem' required: - lineItem title: Line item - - properties: + - type: object + properties: giftCertificates: $ref: '#/components/schemas/requestLineItemGiftCertificate' required: - giftCertificates title: Gift certificate item - - properties: + - type: object + properties: lineItem: $ref: '#/components/schemas/requestCartPostLineItem' giftCertificates: @@ -551,8 +557,6 @@ components: - giftCertificates title: line & gift certificate items description: '' - type: object - x-internal: false responseCartCurrency: title: Currency type: object @@ -904,7 +908,8 @@ components: requestCartPostLineItem: title: Line Item Request Data anyOf: - - properties: + - type: object + properties: productId: type: number description: ID of the product. @@ -917,7 +922,8 @@ components: - productId - quantity title: Simple product - - properties: + - type: object + properties: productId: type: number description: ID of the product. @@ -939,7 +945,6 @@ components: productId: 0 quantity: 0 x-internal: false - type: object requestLineItemGiftCertificateRecipient: title: Contact Entity type: object diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index a9d1f5470..4f71d7c4f 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -360,7 +360,6 @@ paths: * When redirecting the shopper, you can add a set of `query_params` to the URL. The `query_params` feature allows passing additional information to the redirect URL. tags: - Redirects - - Cart Redirect URLs requestBody: content: application/json: @@ -1715,6 +1714,7 @@ components: ItemDigital: allOf: - title: Base Item + type: object properties: id: type: string @@ -1884,7 +1884,8 @@ components: - variant_id - product_id - quantity - - properties: + - type: object + properties: download_file_urls: description: URLs to download all product files. type: array @@ -1898,11 +1899,11 @@ components: download_size: description: 'Specifies the combined download size of all files in human-readable style; for example, `30MB`.' type: string - type: object - title: '' + title: 'Digital Item' ItemDigitalGet: allOf: - title: Base Item + type: object properties: id: type: string @@ -2062,7 +2063,8 @@ components: type: number description: The product option value identifier in number format. example: 128 - - properties: + - type: object + properties: download_file_urls: description: URLs to download all product files. type: array @@ -2076,8 +2078,7 @@ components: download_size: description: 'Specifies the combined download size of all files in human-readable style; for example, `30MB`.' type: string - type: object - title: '' + title: 'Digital Item Response' description: '' ItemPhysical: allOf: @@ -2509,6 +2510,7 @@ components: description: The discounted amount. x-internal: false GiftWrapping: + type: object properties: name: type: string @@ -2758,11 +2760,12 @@ components: properties: line_items: oneOf: - - items: + - type: array + items: $ref: '#/components/schemas/cart_PostVariant' - - items: + - type: array + items: $ref: '#/components/schemas/cart_PostModifier' - type: array gift_certificates: type: array items: @@ -2905,6 +2908,8 @@ components: type: string errors: type: object + properties: {} + additionalProperties: true x-tags: - Models LineItemsGet: @@ -3346,6 +3351,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -3367,6 +3373,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -3431,6 +3438,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index d8add32c6..fef12c3ef 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -1887,6 +1887,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -1943,6 +1944,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2019,6 +2021,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 7551516a3..4aee7c0c6 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -817,6 +817,7 @@ paths: meta: title: Meta type: object + properties: {} description: Empty meta object; may be used later. '207': $ref: '#/components/responses/General207Status' @@ -2221,6 +2222,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2277,6 +2279,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2363,6 +2366,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/catalog/product-modifiers_catalog.v3.yml b/reference/catalog/product-modifiers_catalog.v3.yml index 5cac45e15..0db02525e 100644 --- a/reference/catalog/product-modifiers_catalog.v3.yml +++ b/reference/catalog/product-modifiers_catalog.v3.yml @@ -334,11 +334,9 @@ paths: type: array items: title: Modifier Value - type: object description: 'Part of Modifier Value Response ' allOf: - title: Modifier Value Base - type: object allOf: - title: Option Value Base required: @@ -460,7 +458,6 @@ paths: properties: data: title: Modifier - type: object description: Product modifier allOf: - title: Modifier Base @@ -639,11 +636,9 @@ paths: type: array items: title: Modifier Value - type: object description: 'Part of Modifier Value Response ' allOf: - title: Modifier Value Base - type: object allOf: - title: Option Value Base required: @@ -1082,7 +1077,6 @@ paths: properties: data: title: Modifier - type: object description: Product modifier allOf: - title: Modifier Base @@ -1261,11 +1255,9 @@ paths: type: array items: title: Modifier Value - type: object description: 'Part of Modifier Value Response ' allOf: - title: Modifier Value Base - type: object allOf: - title: Option Value Base required: @@ -1651,11 +1643,9 @@ paths: properties: data: title: Modifier Value - type: object description: 'Part of Modifier Value Response ' allOf: - title: Modifier Value Base - type: object allOf: - title: Option Value Base required: @@ -2002,11 +1992,9 @@ paths: properties: data: title: Modifier Value - type: object description: 'Part of Modifier Value Response ' allOf: - title: Modifier Value Base - type: object allOf: - title: Option Value Base required: diff --git a/reference/catalog/product-variant-options_catalog.v3.yml b/reference/catalog/product-variant-options_catalog.v3.yml index 6ec9eace7..5a8a6fbce 100644 --- a/reference/catalog/product-variant-options_catalog.v3.yml +++ b/reference/catalog/product-variant-options_catalog.v3.yml @@ -138,6 +138,7 @@ paths: allOf: - title: Option Base description: Common Option properties. + type: object properties: product_id: type: integer @@ -331,6 +332,7 @@ paths: allOf: - title: Option Value Base description: Common Option Value properties. + type: object properties: is_default: type: boolean @@ -361,16 +363,15 @@ paths: required: - label - sort_order - - properties: + - type: object + properties: id: type: integer description: | The unique numeric ID of the value; increments sequentially. - type: object image_url: type: string description: Publicly available image url - type: object required: true responses: '200': @@ -383,7 +384,6 @@ paths: properties: data: title: Option - type: object allOf: - title: Option Base description: Common Option properties. @@ -580,6 +580,7 @@ paths: allOf: - title: Option Value Base description: Common Option Value properties. + type: object properties: is_default: type: boolean @@ -610,12 +611,12 @@ paths: required: - label - sort_order - - properties: + - type: object + properties: id: type: integer description: | The unique numeric ID of the value; increments sequentially. - type: object image_url: type: string description: Publicly available image url @@ -1030,7 +1031,6 @@ paths: type: array items: title: Option Value - type: object allOf: - title: Option Value Base required: @@ -1090,7 +1090,6 @@ paths: properties: data: title: Option - type: object allOf: - title: Option Base type: object @@ -1280,7 +1279,6 @@ paths: type: array items: title: Option Value - type: object allOf: - title: Option Value Base required: @@ -1469,7 +1467,6 @@ paths: type: array items: title: Option Value - type: object allOf: - title: Option Value Base required: @@ -1624,7 +1621,6 @@ paths: properties: data: title: Option Value - type: object allOf: - title: Option Value Base required: @@ -1729,7 +1725,6 @@ paths: properties: data: title: Option Value - type: object allOf: - title: Option Value Base required: @@ -1877,7 +1872,6 @@ paths: properties: data: title: Option Value - type: object allOf: - title: Option Value Base required: diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index a9f8ac9b7..1161758da 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1006,7 +1006,6 @@ paths: data: type: array items: - type: object allOf: - title: Variant Base type: object @@ -1126,7 +1125,6 @@ paths: description: Array of option and option values IDs that make up this variant. Will be empty if the variant is the productʼs base variant. items: title: Option Value Variant - type: object allOf: - title: Option Value Product Base type: object @@ -1213,7 +1211,6 @@ paths: type: array items: title: Variant Put - type: object description: | The model for a PUT to update variants on a product. allOf: @@ -1349,7 +1346,6 @@ paths: data: type: array items: - type: object allOf: - title: Variant Base type: object @@ -1469,7 +1465,6 @@ paths: description: Array of option and option values IDs that make up this variant. Will be empty if the variant is the productʼs base variant. items: title: Option Value Variant - type: object allOf: - title: Option Value Product Base type: object @@ -1579,7 +1574,6 @@ paths: type: array items: title: Error Response - type: object allOf: - title: Base Error type: object @@ -2516,6 +2510,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2573,6 +2568,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2659,6 +2655,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index f13e51ea2..f31d6f633 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -1741,7 +1741,6 @@ paths: properties: data: title: Product Image - type: object allOf: - title: Product Image Base type: object @@ -2010,7 +2009,6 @@ paths: properties: data: title: Product Image - type: object allOf: - title: Product Image Base type: object @@ -2285,6 +2283,7 @@ paths: allOf: - title: Product Video Base description: Common Product Video properties. + type: object properties: title: maxLength: 255 @@ -2311,7 +2310,8 @@ paths: The video type (a short name of a host site). enum: - youtube - - properties: + - type: object + properties: video_id: type: string maxLength: 25 @@ -2321,7 +2321,6 @@ paths: x-required: - post example: z3fRu9pkuXE - type: object required: true responses: '200': @@ -2334,7 +2333,6 @@ paths: properties: data: title: Product Video - type: object description: | A product video model. allOf: @@ -2541,7 +2539,6 @@ paths: properties: data: title: Product Video - type: object description: | A product video model. allOf: @@ -4373,7 +4370,6 @@ paths: type: array items: title: Product Review - type: object description: | A product review model. allOf: @@ -4534,7 +4530,6 @@ paths: properties: data: title: Product Review - type: object description: | A product review model. allOf: @@ -4659,7 +4654,6 @@ paths: properties: data: title: Product Review - type: object description: | A product review model. allOf: @@ -4829,7 +4823,6 @@ paths: properties: data: title: Product Review - type: object description: | A product review model. allOf: @@ -6007,8 +6000,9 @@ components: title: product_Put description: The model for a PUT to update a product. allOf: - - $ref: '#/components/schemas/product_Base' - type: object + properties: {} + - $ref: '#/components/schemas/product_Base' x-internal: false metafield_Base: title: metafield_Base @@ -7642,6 +7636,7 @@ components: x-tags: - Models ProductChannelAssignment: + type: object properties: product_id: type: integer @@ -7650,6 +7645,7 @@ components: x-tags: - Models ProductCategoryAssignment: + type: object properties: product_id: type: integer @@ -7796,6 +7792,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -7852,6 +7849,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -7938,6 +7936,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: @@ -8330,6 +8330,7 @@ components: content: application/json: schema: + type: object properties: data: type: array @@ -8342,6 +8343,7 @@ components: content: application/json: schema: + type: object properties: data: $ref: '#/components/schemas/customFieldData' diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 09f5efb42..08c32a641 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -532,6 +532,8 @@ paths: default: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' errors: type: object + properties: {} + additionalProperties: true delete: summary: Delete a Siteʼs Checkout URL operationId: deleteCheckoutUrl @@ -1603,15 +1605,16 @@ components: links: current: '?page=1&limit=50' allOf: - - properties: + - type: object + properties: data: type: array items: $ref: '#/components/schemas/metafield_Base' - - properties: + - type: object + properties: meta: $ref: '#/components/schemas/MetaWithFullPagination' - type: object examples: {} examples: create_channel_req_example: @@ -2429,6 +2432,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2485,6 +2489,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -2572,6 +2577,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index 2a91d0c39..c509c3760 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -77,7 +77,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -244,7 +244,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -389,7 +389,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -530,7 +530,7 @@ paths: lineItems: physicalItems: - id: 69791a88-85c9-4c19-8042-e537621e8a55 - parentId: {} + parentId: '' variantId: 364 productId: 184 sku: SMA-RED @@ -555,7 +555,7 @@ paths: giftWrapping: {} addedByPromotion: false - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - parentId: {} + parentId: '' variantId: 341 productId: 170 sku: '' @@ -578,7 +578,7 @@ paths: giftWrapping: {} addedByPromotion: false - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - parentId: {} + parentId: '' variantId: 376 productId: 158 sku: SKU-A0C8A203 @@ -602,7 +602,7 @@ paths: addedByPromotion: false digitalItems: - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - parentId: {} + parentId: '' variantId: 360 productId: 189 name: Gather Journal Issue 7 - Digital @@ -767,7 +767,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -925,7 +925,7 @@ paths: lineItems: physicalItems: - id: 69791a88-85c9-4c19-8042-e537621e8a55 - parentId: {} + parentId: '' variantId: 364 productId: 184 sku: SMA-RED @@ -950,7 +950,7 @@ paths: giftWrapping: {} addedByPromotion: false - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - parentId: {} + parentId: '' variantId: 341 productId: 170 sku: '' @@ -973,7 +973,7 @@ paths: giftWrapping: {} addedByPromotion: false - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - parentId: {} + parentId: '' variantId: 376 productId: 158 sku: SKU-A0C8A203 @@ -997,7 +997,7 @@ paths: addedByPromotion: false digitalItems: - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - parentId: {} + parentId: '' variantId: 360 productId: 189 name: Gather Journal Issue 7 - Digital @@ -1189,7 +1189,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -1353,7 +1353,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -1482,7 +1482,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -1623,7 +1623,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -1716,6 +1716,7 @@ paths: application/json: schema: type: object + properties: {} x-codegen-request-body-name: body '/checkouts/{checkoutId}/gift-certificates/{giftCertificateCode}': parameters: @@ -1801,7 +1802,7 @@ paths: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' @@ -2167,6 +2168,7 @@ paths: application/json: schema: type: object + properties: {} '/checkouts/{checkoutId}/spam-protection': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -2651,13 +2653,11 @@ components: lineItems: type: object description: '' - items: - title: Line Item - required: - - digitalItems - - physicalItems - type: object - properties: + title: Line Items + required: + - digitalItems + - physicalItems + properties: physicalItems: type: array description: '' @@ -2961,7 +2961,6 @@ components: description: A cart contains a collection of items, prices, discounts, etc. It does not contain customer-related data. billingAddress: title: Address Response - type: object allOf: - title: Address Properties required: @@ -3039,7 +3038,6 @@ components: x-deprecated: true address: title: Address Response - type: object allOf: - title: Address Properties required: @@ -3106,7 +3104,6 @@ components: description: This is available only when "include=consignments.availableShippingOptions" is presented in the URL. items: title: Shipping Option Entity - type: object allOf: - title: Selected Shipping Option type: object @@ -3637,275 +3634,273 @@ components: lineItems: type: object description: '' - items: - title: Line Item - required: - - digitalItems - - physicalItems - type: object - properties: - physicalItems: - type: array - description: '' - items: - title: Item Physical - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: The product is part of a bundle such as a product pick list, then the parentId or the main product ID will populate. - variantId: - type: integer - description: ID of the variant. - productId: - type: integer - description: ID of the product. - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: A list of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. The final price before tax calculation. - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - comparisonPrice: - type: number - description: The itemʼs comparison price - extendedComparisonPrice: - type: number - description: The itemʼs comparison price multiplied by the quantity. - type: - type: string - description: the product type - physical or digital - addedByPromotion: - type: boolean - description: If the item was added automatically by a promotion, such as a coupon or buy one, get one. - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - isMutable: - type: boolean - description: '' - giftWrapping: - title: Gift Wrapping + title: Line Items + required: + - digitalItems + - physicalItems + properties: + physicalItems: + type: array + description: '' + items: + title: Item Physical + required: + - quantity + type: object + properties: + id: + type: string + description: The line-item ID. + parentId: + type: string + description: The product is part of a bundle such as a product pick list, then the parentId or the main product ID will populate. + variantId: + type: integer + description: ID of the variant. + productId: + type: integer + description: ID of the product. + sku: + type: string + description: SKU of the variant. + name: + type: string + description: The itemʼs product name. + url: + type: string + description: The product URL. + quantity: + type: number + description: Quantity of this item. + format: double + isTaxable: + type: boolean + description: Whether the item is taxable. + imageUrl: + type: string + description: A publicly-accessible URL for an image of this item. + discounts: + type: array + description: A list of discounts applied to this item, as an array of AppliedDiscount objects. + items: + title: Applied Discount type: object properties: name: type: string - description: '' - message: - type: string - description: '' - amount: + description: The name provided by the merchant. + discountedAmount: type: number - description: '' + description: The discounted amount applied within a given context. format: double - digitalItems: - type: array - description: '' - items: - title: Item Digital - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: Bundled items will have their parentʼs item ID. - variantId: - type: number - description: ID of the variant. - format: double - productId: - type: number - description: ID of the product. - format: double - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: A list of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. The final price before tax calculation. - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - type: - type: string - description: The product type - physical or digital. - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - downloadFileUrls: - type: array - description: URLs to download all product files. - items: + discountAmount: + type: number + description: The total value of all discounts applied to this item (excluding coupon). + format: double + couponAmount: + type: number + description: The total value of all coupons applied to this item. + format: double + listPrice: + type: number + description: The item’s list price, as quoted by the manufacturer or distributor. + format: double + salePrice: + type: number + description: The itemʼs price after all discounts are applied. The final price before tax calculation. + format: double + extendedListPrice: + type: number + description: The itemʼs list price multiplied by the quantity. + format: double + extendedSalePrice: + type: number + description: The itemʼs sale price multiplied by the quantity. + format: double + comparisonPrice: + type: number + description: The itemʼs comparison price + extendedComparisonPrice: + type: number + description: The itemʼs comparison price multiplied by the quantity. + type: + type: string + description: the product type - physical or digital + addedByPromotion: + type: boolean + description: If the item was added automatically by a promotion, such as a coupon or buy one, get one. + isShippingRequired: + type: boolean + description: Whether this item requires shipping to a physical address. + isMutable: + type: boolean + description: '' + giftWrapping: + title: Gift Wrapping + type: object + properties: + name: type: string - downloadPageUrl: - type: string - description: The URL for the combined downloads page. - downloadSize: - type: string - description: 'Specifies the combined download size in human-readable style; for example, `30MB`.' - giftCertificate: - type: array - description: '' - items: - title: Item Gift Certificate - required: - - amount - - recipient - - sender - - theme - type: object - properties: - id: - type: string - description: Gift certificate identifier - name: - type: string - description: 'The name of the purchased gift certificate; for example, `$20 Gift Certificate`.' - theme: - type: string - description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' - amount: - type: number - description: 'Value must be between $1.00 and $1,000.00.' - format: double - taxable: - type: boolean - description: '' - sender: - title: Contact Entity - type: object - properties: - name: - type: string - description: '' - email: - type: string - description: '' - recipient: - title: Contact Entity + description: '' + message: + type: string + description: '' + amount: + type: number + description: '' + format: double + digitalItems: + type: array + description: '' + items: + title: Item Digital + required: + - quantity + type: object + properties: + id: + type: string + description: The line-item ID. + parentId: + type: string + description: Bundled items will have their parentʼs item ID. + variantId: + type: number + description: ID of the variant. + format: double + productId: + type: number + description: ID of the product. + format: double + sku: + type: string + description: SKU of the variant. + name: + type: string + description: The itemʼs product name. + url: + type: string + description: The product URL. + quantity: + type: number + description: Quantity of this item. + format: double + isTaxable: + type: boolean + description: Whether the item is taxable. + imageUrl: + type: string + description: A publicly-accessible URL for an image of this item. + discounts: + type: array + description: A list of discounts applied to this item, as an array of AppliedDiscount objects. + items: + title: Applied Discount type: object properties: name: type: string - description: '' - email: - type: string - description: '' - message: - type: string - description: Limited to 200 characters. - type: + description: The name provided by the merchant. + discountedAmount: + type: number + description: The discounted amount applied within a given context. + format: double + discountAmount: + type: number + description: The total value of all discounts applied to this item (excluding coupon). + format: double + couponAmount: + type: number + description: The total value of all coupons applied to this item. + format: double + listPrice: + type: number + description: The item’s list price, as quoted by the manufacturer or distributor. + format: double + salePrice: + type: number + description: The itemʼs price after all discounts are applied. The final price before tax calculation. + format: double + extendedListPrice: + type: number + description: The itemʼs list price multiplied by the quantity. + format: double + extendedSalePrice: + type: number + description: The itemʼs sale price multiplied by the quantity. + format: double + type: + type: string + description: The product type - physical or digital. + isShippingRequired: + type: boolean + description: Whether this item requires shipping to a physical address. + downloadFileUrls: + type: array + description: URLs to download all product files. + items: type: string - description: Explicitly specifying the gift certificate type. - customItems: + downloadPageUrl: + type: string + description: The URL for the combined downloads page. + downloadSize: + type: string + description: 'Specifies the combined download size in human-readable style; for example, `30MB`.' + giftCertificate: + type: array + description: '' + items: + title: Item Gift Certificate + required: + - amount + - recipient + - sender + - theme + type: object + properties: + id: + type: string + description: Gift certificate identifier + name: + type: string + description: 'The name of the purchased gift certificate; for example, `$20 Gift Certificate`.' + theme: + type: string + description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' + amount: + type: number + description: 'Value must be between $1.00 and $1,000.00.' + format: double + taxable: + type: boolean + description: '' + sender: + title: Contact Entity + type: object + properties: + name: + type: string + description: '' + email: + type: string + description: '' + recipient: + title: Contact Entity + type: object + properties: + name: + type: string + description: '' + email: + type: string + description: '' + message: + type: string + description: Limited to 200 characters. + type: + type: string + description: Explicitly specifying the gift certificate type. + customItems: type: array items: title: Item Custom @@ -4027,7 +4022,7 @@ components: lineItems: physicalItems: - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: {} + parentId: '' variantId: 345 productId: 174 sku: '' diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index 069ef683e..e1208d026 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -7774,6 +7774,8 @@ paths: example: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' errors: type: object + properties: {} + additionalProperties: true '422': description: Invalid JSON request body - missing or invalid data. content: @@ -8214,6 +8216,7 @@ components: title: Address Response allOf: - title: Address Properties + type: object properties: first_name: type: string @@ -8265,11 +8268,11 @@ components: field_value: type: string description: 'This can also be an array for fields that need to support a list of values (e.g., a set of check boxes.)' - - properties: + - type: object + properties: id: type: string description: '' - type: object consignments: type: array description: '' @@ -8283,11 +8286,14 @@ components: description: '' shippingAddress: type: object + properties: {} + additionalProperties: true x-deprecated: true address: title: Address Response allOf: - title: Address Properties + type: object properties: first_name: type: string @@ -8342,11 +8348,11 @@ components: required: - email - country_code - - properties: + - type: object + properties: id: type: string description: '' - type: object available_shipping_options: type: array description: This is available only when "include=consignments.available_shipping_options" is presented in the URL. diff --git a/reference/consent.sf.yml b/reference/consent.sf.yml index 760410199..bd3558ed2 100644 --- a/reference/consent.sf.yml +++ b/reference/consent.sf.yml @@ -14,6 +14,11 @@ info: For info about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication#same-origin-cors-authentication). version: Storefront + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com tags: - name: Consent paths: diff --git a/reference/currencies.v2.yml b/reference/currencies.v2.yml index bbd9438b5..502991b26 100644 --- a/reference/currencies.v2.yml +++ b/reference/currencies.v2.yml @@ -125,6 +125,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true /currencies/{id}: parameters: - $ref: '#/components/parameters/Accept' @@ -191,6 +193,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true components: schemas: currency_Post: diff --git a/reference/current_customer.yml b/reference/current_customer.yml index dfef142db..b4bb0bb56 100644 --- a/reference/current_customer.yml +++ b/reference/current_customer.yml @@ -17,6 +17,11 @@ info: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com version: '' servers: - url: 'https://{store_domain}' @@ -45,7 +50,7 @@ paths: parameters: - $ref: '#/components/parameters/AppClientId' responses: - default: + '200': description: |- A JWT to decode using the client secret that corresponds with the app client ID you sent as a query parameter. diff --git a/reference/custom-template-associations.v3.yml b/reference/custom-template-associations.v3.yml index bf5a15300..5df1e0fe9 100644 --- a/reference/custom-template-associations.v3.yml +++ b/reference/custom-template-associations.v3.yml @@ -116,6 +116,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true '422': description: Error response for batch PUT of Custom template associations. Includes the errors for each reference ID. content: @@ -238,6 +240,7 @@ components: x-internal: false DetailedErrors: type: object + properties: {} additionalProperties: type: string x-internal: false diff --git a/reference/customer_login.yml b/reference/customer_login.yml index f79c94414..9c876eb9d 100644 --- a/reference/customer_login.yml +++ b/reference/customer_login.yml @@ -53,6 +53,8 @@ paths: '*/*': schema: type: object + properties: {} + additionalProperties: true components: schemas: customerLoginSSO: diff --git a/reference/customers.sf.yml b/reference/customers.sf.yml index 84b68e766..68c125c4a 100644 --- a/reference/customers.sf.yml +++ b/reference/customers.sf.yml @@ -8,6 +8,11 @@ info: The REST Storefront API uses [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) headers for authentication, and therefore has no required scopes. You do not need to send any BigCommerce-specific tokens with your requests to these endpoints. For info about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication#same-origin-cors-authentication). + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com servers: - url: 'https://{store_domain}/api/storefront' variables: diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index bf93bb513..0e906de72 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -795,6 +795,8 @@ paths: $ref: '#/components/schemas/CustomerSettingsObject' meta: type: object + properties: {} + additionalProperties: true examples: data: value: @@ -837,6 +839,8 @@ paths: $ref: '#/components/schemas/CustomerSettingsObject' meta: type: object + properties: {} + additionalProperties: true examples: data: value: @@ -877,6 +881,8 @@ paths: $ref: '#/components/schemas/CustomerChannelSettingsObject' meta: type: object + properties: {} + additionalProperties: true examples: data: value: @@ -935,6 +941,8 @@ paths: $ref: '#/components/schemas/CustomerSettingsObject' meta: type: object + properties: {} + additionalProperties: true examples: example: value: @@ -2231,6 +2239,7 @@ components: postal_code: '78759' state_or_province: Texas meta: {} + type: object properties: data: type: array @@ -2311,6 +2320,8 @@ components: meta: $ref: '#/components/schemas/MetaOpen' - title: DuplicateAddressCollectionResponse + type: object + properties: {} example: {} type: object properties: @@ -2873,95 +2884,98 @@ components: properties: data: type: array - id: - type: integer - description: Unique ID of the *Metafield*. Read-Only. - readOnly: true - example: 0 - key: - type: string - description: The key for the metafields. - example: Staff Name - value: - type: string - description: The description for the metafield. - example: Ronaldo - namespace: - type: string - description: | - Namespace for the metafield, for organizational purposes. - example: Sales Department - minLength: 1 - maxLength: 64 - permission_set: - type: string - description: | - Determines the visibility and writeability of the field by other API consumers. - | Value | Description | - | :--- | :--- | - | `app_only` | Private to the app that owns the field. | - | `read` | Visible to other API consumers. | - | `write` | Open for reading and writing by other API consumers. | - | `read_and_sf_access` | Visible to other API consumers, including on storefront. | - | `write_and_sf_access` | Open for reading and writing by other API consumers, including on storefront. | - enum: - - app_only - - read - - write - - read_and_sf_access - - write_and_sf_access - resource_type: - type: string - description: | - The type of resource with which the metafield is associated. - enum: - - brand - - product - - variant - - category - - cart - - channel - - location - - order - - customer - example: cart - resource_id: - type: integer - description: | - The unique identifier for the resource with which the metafield is associated. - example: 0 - readOnly: true - description: - type: string - description: | - Description for the metafields. - example: order - date_created: - type: string - format: date-time - description: Date and time of the metafieldʼs creation. - example: '2022-06-16T18:39:00+00:00' - date_modified: - type: string - format: date-time - description: Date and time when the metafield was last updated. - example: '2022-06-16T18:39:00+00:00' - owner_client_id: - type: string - description: Client ID for the metafield's creator. - readOnly: true - example: ramciw4fnoz87it3ynjfif2zrkil5p - required: - - namespace - - key - - value - - permission_set - - resource_type - - resource_id - - description - - id - - date_created - - date_modified + items: + type: object + properties: + id: + type: integer + description: Unique ID of the *Metafield*. Read-Only. + readOnly: true + example: 0 + key: + type: string + description: The key for the metafields. + example: Staff Name + value: + type: string + description: The description for the metafield. + example: Ronaldo + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 + permission_set: + type: string + description: | + Determines the visibility and writeability of the field by other API consumers. + | Value | Description | + | :--- | :--- | + | `app_only` | Private to the app that owns the field. | + | `read` | Visible to other API consumers. | + | `write` | Open for reading and writing by other API consumers. | + | `read_and_sf_access` | Visible to other API consumers, including on storefront. | + | `write_and_sf_access` | Open for reading and writing by other API consumers, including on storefront. | + enum: + - app_only + - read + - write + - read_and_sf_access + - write_and_sf_access + resource_type: + type: string + description: | + The type of resource with which the metafield is associated. + enum: + - brand + - product + - variant + - category + - cart + - channel + - location + - order + - customer + example: cart + resource_id: + type: integer + description: | + The unique identifier for the resource with which the metafield is associated. + example: 0 + readOnly: true + description: + type: string + description: | + Description for the metafields. + example: order + date_created: + type: string + format: date-time + description: Date and time of the metafieldʼs creation. + example: '2022-06-16T18:39:00+00:00' + date_modified: + type: string + format: date-time + description: Date and time when the metafield was last updated. + example: '2022-06-16T18:39:00+00:00' + owner_client_id: + type: string + description: Client ID for the metafield's creator. + readOnly: true + example: ramciw4fnoz87it3ynjfif2zrkil5p + required: + - namespace + - key + - value + - permission_set + - resource_type + - resource_id + - description + - id + - date_created + - date_modified consent_Resp: description: '' content: @@ -3057,6 +3071,7 @@ components: type: string errors: type: object + properties: {} additionalProperties: type: string x-internal: false @@ -3874,16 +3889,14 @@ components: x-internal: false customerAuthentication_PostPut: title: customerAuthentication_PostPut - allOf: - - properties: - force_password_reset: - description: 'If `true`, this customer will be forced to change password on next login.' - type: boolean - - properties: - new_password: - description: New password for customer. Write only field. - type: string type: object + properties: + force_password_reset: + description: 'If `true`, this customer will be forced to change password on next login.' + type: boolean + new_password: + description: New password for customer. Write only field. + type: string x-internal: false Links: title: Links @@ -4447,6 +4460,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -4503,6 +4517,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -4589,6 +4604,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: diff --git a/reference/email_templates.v3.yml b/reference/email_templates.v3.yml index b06697d31..6d1cef7dd 100644 --- a/reference/email_templates.v3.yml +++ b/reference/email_templates.v3.yml @@ -209,6 +209,7 @@ components: x-internal: false DetailedErrors: type: object + properties: {} additionalProperties: type: string x-internal: false @@ -259,6 +260,8 @@ components: description: 'Locale code for this language, such as "en", "en-us", "fr-ca".' keys: type: object + properties: {} + additionalProperties: true example: reset_password: 'To change your customer account password at {{name}} please click this link or copy and paste it into your browser:' description: Language keys for the template. User-defined. Should match any lang keys used in the template. diff --git a/reference/form_fields.sf.yml b/reference/form_fields.sf.yml index 28c211a5b..5f71b8109 100644 --- a/reference/form_fields.sf.yml +++ b/reference/form_fields.sf.yml @@ -11,6 +11,11 @@ info: > #### Warning > Breaking changes may be introduced to this endpoint while in beta. version: '' + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com servers: - url: 'https://{store_domain}/api/storefront' variables: diff --git a/reference/geography.v2.yml b/reference/geography.v2.yml index b605bdde1..1be63ddc4 100644 --- a/reference/geography.v2.yml +++ b/reference/geography.v2.yml @@ -4,7 +4,23 @@ info: title: Geography description: |- Get countries, states, and provinces. - + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +security: + - X-Auth-Token: [] +tags: + - name: Countries + - name: States +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v2' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway paths: '/countries': get: @@ -287,20 +303,6 @@ paths: required: true schema: type: string - -security: - - X-Auth-Token: [] -tags: - - name: Countries - - name: States - -servers: - - url: 'https://api.bigcommerce.com/stores/{store_hash}/v2' - variables: - store_hash: - default: store_hash - description: Permanent ID of the BigCommerce store. - description: BigCommerce API Gateway components: responses: countriesResponse: diff --git a/reference/marketing.v2.yml b/reference/marketing.v2.yml index aec5cd070..aa4a60859 100644 --- a/reference/marketing.v2.yml +++ b/reference/marketing.v2.yml @@ -879,6 +879,7 @@ paths: application/json: schema: type: object + properties: {} components: parameters: Accept: @@ -1047,11 +1048,11 @@ components: banner_Base: title: banner_Base required: - - content - - date_type - - location - - name - - page + - content + - date_type + - location + - name + - page type: object properties: name: @@ -1124,8 +1125,7 @@ components: banner_Put: title: banner_Put allOf: - - type: object - - $ref: '#/components/schemas/banner_Base' + - $ref: '#/components/schemas/banner_Base' x-internal: false giftCertificate_Base: title: giftCertificate_Base diff --git a/reference/orders.sf.yml b/reference/orders.sf.yml index 3d1e353a3..345d6ffc1 100644 --- a/reference/orders.sf.yml +++ b/reference/orders.sf.yml @@ -331,6 +331,7 @@ components: description: Categories the item belongs to. items: type: object + properties: {} x-internal: false GiftWrapping: title: Gift Wrapping @@ -437,6 +438,7 @@ components: description: Categories the item belongs to. items: type: object + properties: {} x-internal: false OrderItemGiftCertificate: title: Order Item Gift Certificate diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 427b73bcc..118e609b6 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -2564,20 +2564,20 @@ components: timestamp: 'Mon, 20 Aug 2018 14:47:13 +0000' shipping_provider_id: bcrealtime shipping_provider_quote: - rate: - value: '44.11' - unit: USD - transitTime: 1 business day - name: UPS Next Day Air® - signatureConfirmationFee: {} - carrierName: '' - carrierCode: {} - code: {} - deliveryMessage: '' - labelSizes: [] - insuredMailFee: {} - dates: [] - rateId: {} + - rate: + value: '44.11' + unit: USD + transitTime: 1 business day + name: UPS Next Day Air® + signatureConfirmationFee: {} + carrierName: '' + carrierCode: {} + code: {} + deliveryMessage: '' + labelSizes: [] + insuredMailFee: {} + dates: [] + rateId: {} provider_code: upsready carrier_code: '' rate_code: '' @@ -3421,6 +3421,7 @@ components: - type: number - type: string - type: array + items: {} example: 123BAF items: type: string @@ -3496,6 +3497,7 @@ components: type: string customer: type: object + properties: {} title: orderMessages x-internal: false shippingQuotes_Resource: @@ -3540,7 +3542,10 @@ components: shipping_provider_quote: type: array description: This can vary based on the shipping provider. Manual shipping methods such as fixed will return an empty array. Shipping providers such as UPS will return an object with the shipping information. Since the shipping quote is tied to a shipping address only one quote will return in the response. - items: {} + items: + type: object + properties: {} + additionalProperties: true provider_code: type: string example: shipping_byweight @@ -3677,7 +3682,6 @@ components: x-internal: false ordersCountStatus: title: ordersCountStatus - type: object allOf: - $ref: '#/components/schemas/orderStatus_Base' - type: object diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index 5d0a87a6b..5840918b0 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -471,10 +471,9 @@ paths: required: true x-examples: application/json: - - items: - - item_id: 76 - item_type: PRODUCT - quantity: 1 + - item_id: 76 + item_type: PRODUCT + quantity: 1 tax_adjustment_amount: 0 responses: '201': @@ -764,9 +763,9 @@ paths: application/json: schema: allOf: - - type: object - $ref: '#/components/schemas/GlobalOrderSettings' - - properties: + - type: object + properties: meta: $ref: '#/components/schemas/metaEmpty_Full' '400': @@ -1679,6 +1678,7 @@ components: Transaction: allOf: - title: Transaction Base + type: object properties: event: type: string @@ -1808,7 +1808,8 @@ components: - amount - currency - gateway - - properties: + - type: object + properties: id: type: integer description: | @@ -1905,7 +1906,6 @@ components: type: number format: float example: 35.42 - type: object title: '' x-examples: Example 1: @@ -2829,6 +2829,7 @@ components: $ref: '#/components/schemas/Metafield' errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -3094,6 +3095,7 @@ components: - 125 errors: type: array + items: {} description: Empty for 200 responses. example: [] meta: @@ -3180,6 +3182,8 @@ components: $ref: '#/components/schemas/ErrorDetail' ErrorDetail: type: object + properties: {} + additionalProperties: true description: | Error detail response payload for the BigCommerce API. example: @@ -3278,6 +3282,8 @@ components: properties: errors: type: object + properties: {} + additionalProperties: true x-tags: - Models BaseError: @@ -3297,10 +3303,6 @@ components: type: string x-tags: - Models - betaDetailedErrors: - type: object - x-tags: - - Models responses: Return_Resp: description: '' @@ -3321,6 +3323,7 @@ components: content: application/json: schema: + type: object properties: data: $ref: '#/components/schemas/UpdateReturnStatuses' @@ -3353,6 +3356,7 @@ components: content: application/json: schema: + type: object properties: data: $ref: '#/components/schemas/ReceivedItems_Base' @@ -3367,6 +3371,7 @@ components: content: application/json: schema: + type: object properties: data: $ref: '#/components/schemas/ReviewedItems_Base' @@ -3502,6 +3507,8 @@ components: application/json: schema: type: object + properties: {} + additionalProperties: true RefundCollection_Resp: description: '' content: @@ -3574,40 +3581,40 @@ components: content: application/json: schema: - allOf: - - properties: - data: - $ref: '#/components/schemas/Transaction_Post' - - properties: - id: - type: integer - description: | - Unique identifier for the transaction. - order_id: - type: string - description: Identifier for the BigCommerce Order with which this transaction is associated. - date_created: - type: string - format: date-time - description: | - The datetime of the transaction. - payment_instrument_token: - type: string - description: This field contains internal BigPay token for stored card that is then mapped to the actual third-party token. We currently do not offer a way to get third party tokens.These tokens are read-only and do not return any information about the payment. - avs_result: - $ref: '#/components/schemas/AVSResult' - cvv_result: - $ref: '#/components/schemas/CVVResult' - credit_card: - $ref: '#/components/schemas/CreditCard' - gift_certificate: - $ref: '#/components/schemas/GiftCertificate' - store_credit: - $ref: '#/components/schemas/StoreCredit' - - properties: - meta: - $ref: '#/components/schemas/metaEmpty_Full' type: object + properties: + data: + allOf: + - $ref: '#/components/schemas/Transaction_Post' + - type: object + properties: + id: + type: integer + description: | + Unique identifier for the transaction. + order_id: + type: string + description: Identifier for the BigCommerce Order with which this transaction is associated. + date_created: + type: string + format: date-time + description: | + The datetime of the transaction. + payment_instrument_token: + type: string + description: This field contains internal BigPay token for stored card that is then mapped to the actual third-party token. We currently do not offer a way to get third party tokens.These tokens are read-only and do not return any information about the payment. + avs_result: + $ref: '#/components/schemas/AVSResult' + cvv_result: + $ref: '#/components/schemas/CVVResult' + credit_card: + $ref: '#/components/schemas/CreditCard' + gift_certificate: + $ref: '#/components/schemas/GiftCertificate' + store_credit: + $ref: '#/components/schemas/StoreCredit' + meta: + $ref: '#/components/schemas/metaEmpty_Full' RefundQuotesBATCH_Resp: description: '' content: diff --git a/reference/pages.v3.yml b/reference/pages.v3.yml index fc185a079..76b61001d 100644 --- a/reference/pages.v3.yml +++ b/reference/pages.v3.yml @@ -188,25 +188,25 @@ paths: schema: $ref: '#/components/schemas/PagesCollectionResponse' examples: - update meta descriptions for two pages: + Update meta descriptions for two pages: value: data: - id: 20 channel_id: 1 - name: all about powder detergents + name: Powder detergents meta_title: '' is_visible: false parent_id: 0 sort_order: 0 meta_keywords: null type: page - meta_description: cornpone + meta_description: eco-friendly is_homepage: false is_customers_only: false search_keywords: '' - id: 19 channel_id: 1 - name: sign up to dream big + name: Contact us meta_title: '' email: '' is_visible: false @@ -215,7 +215,7 @@ paths: meta_keywords: null contact_fields: '' type: contact_form - meta_description: arugula + meta_description: contact is_homepage: false is_customers_only: false search_keywords: '' @@ -311,144 +311,107 @@ paths: schema: $ref: '#/components/schemas/SinglePageResponse' examples: - several data types: + Blog: value: data: - - id: 3 - channel_id: 1 - name: Blog - meta_title: Blog - is_visible: false - parent_id: 0 - sort_order: 4 - meta_keywords: '' - type: blog - meta_description: '' - is_homepage: false - is_customers_only: false - search_keywords: '0' - url: /blog/ - - id: 5 - channel_id: 1 - name: Contact Us - meta_title: '' - email: '' - is_visible: true - parent_id: 0 - sort_order: 3 - meta_keywords: contact keyword - contact_fields: 'fullname,companyname,phone,orderno,rma' - type: contact_form - meta_description: contact meta desc - is_homepage: false - is_customers_only: true - search_keywords: contact search keyword - - id: 16 - channel_id: 1 - name: all about powder detergents 2 - meta_title: '' - is_visible: false - parent_id: 0 - sort_order: 0 - meta_keywords: null - type: page - meta_description: '' - is_homepage: false - is_customers_only: false - search_keywords: '' - - id: 17 - channel_id: 1 - name: one hundred million red balloons 3 - is_visible: false - parent_id: 0 - sort_order: 0 - type: raw - is_homepage: false - is_customers_only: false - search_keywords: '' - content_type: text/html - - id: 18 - channel_id: 1 - name: diaper pin purveyors 3 - is_visible: false - parent_id: 0 - sort_order: 0 - link: 'https://example.com/diaper-pins' - type: link - is_homepage: false - is_customers_only: false - - id: 19 - channel_id: 1 - name: sign up to crush dreams 3 - meta_title: '' - email: '' - is_visible: false - parent_id: 0 - sort_order: 0 - meta_keywords: null - contact_fields: '' - type: contact_form - meta_description: '' - is_homepage: false - is_customers_only: false - search_keywords: '' - - id: 20 - channel_id: 1 - name: all about powder detergents 3 - meta_title: '' - is_visible: false - parent_id: 0 - sort_order: 0 - meta_keywords: null - type: page - meta_description: '' - is_homepage: false - is_customers_only: false - search_keywords: '' - - id: 21 - channel_id: 1 - name: feed monsters 3 - meta_title: '' - is_visible: false - parent_id: 0 - sort_order: 0 - meta_keywords: null - feed: /rss/monsters - type: feed - meta_description: '' - is_homepage: false - is_customers_only: false - search_keywords: '' - - id: 22 - channel_id: 1 - name: one hundred million red balloons 4 - is_visible: false - parent_id: 0 - sort_order: 0 - type: raw - is_homepage: false - is_customers_only: false - search_keywords: '' - content_type: text/html - - id: 23 - channel_id: 1 - name: diaper pin purveyors 4 - is_visible: false - parent_id: 0 - sort_order: 0 - link: 'https://example.com/diaper-pins' - type: link - is_homepage: false - is_customers_only: false - meta: - pagination: - total: 6 - count: 6 - per_page: 50 - current_page: 1 - total_pages: 1 - links: - current: '?page=1&limit=50' + id: 3 + channel_id: 1 + name: Blog + meta_title: Blog + is_visible: false + parent_id: 0 + sort_order: 4 + meta_keywords: '' + type: blog + meta_description: '' + is_homepage: false + is_customers_only: false + search_keywords: '0' + url: /blog/ + meta: {} + Contact form: + value: + data: + id: 5 + channel_id: 1 + name: Contact Us + meta_title: '' + email: '' + is_visible: true + parent_id: 0 + sort_order: 3 + meta_keywords: contact keyword + contact_fields: 'fullname,companyname,phone,orderno,rma' + type: contact_form + meta_description: contact meta desc + is_homepage: false + is_customers_only: true + search_keywords: contact search keyword + meta: {} + Page: + value: + data: + id: 16 + channel_id: 1 + name: Powder Detergents + meta_title: '' + is_visible: false + parent_id: 0 + sort_order: 0 + meta_keywords: null + type: page + meta_description: '' + is_homepage: false + is_customers_only: false + search_keywords: '' + meta: {} + Raw: + value: + data: + id: 17 + channel_id: 1 + name: Compare Detergents + is_visible: false + parent_id: 0 + sort_order: 0 + type: raw + is_homepage: false + is_customers_only: false + search_keywords: '' + content_type: text/html + meta: {} + Link: + value: + data: + id: 18 + channel_id: 1 + name: California carcinogen list + is_visible: false + parent_id: 0 + sort_order: 0 + link: 'https://california.example.com/known-carcinogens' + type: link + is_homepage: false + is_customers_only: false + meta: {} + Feed: + value: + data: + id: 21 + channel_id: 1 + name: Detergents podcast feed + meta_title: '' + is_visible: false + parent_id: 0 + sort_order: 0 + meta_keywords: null + feed: /rss/detergents + type: feed + meta_description: '' + is_homepage: false + is_customers_only: false + search_keywords: '' + meta: {} '404': description: Not Found. content: @@ -572,13 +535,6 @@ components: schema: type: string default: application/json - storeHashPath: - schema: - type: string - name: store_hash - in: path - required: true - description: The permanent ID of the BigCommerce store. pageIdPath: schema: type: string @@ -649,21 +605,6 @@ components: in: query name: page description: The ordered grouping of results to return. See `meta.pagination.current_page` in the response body. - headers: - Content-Type: - description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' - schema: - type: string - default: application/json - Accept: - description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' - schema: - type: string - default: application/json - X-Auth-Token: - description: Your API account's access token. - schema: - type: string securitySchemes: X-Auth-Token: name: X-Auth-Token @@ -820,7 +761,6 @@ components: x-examples: {} properties: data: - type: object anyOf: - $ref: '#/components/schemas/typePage' - $ref: '#/components/schemas/typeBlog' @@ -832,25 +772,6 @@ components: $ref: '#/components/schemas/ResponseMeta' title: PageResponseObject type: object - ContactFields: - allOf: - - properties: - fullname: - type: string - description: Full name of the customer who is submitting the form. - phone: - type: string - description: 'Customer’s phone number, as submitted on the form.' - companyname: - type: string - description: Customer’s submitted company name. - orderno: - type: string - description: Customer’s submitted order number. - rma: - type: string - description: Customer’s submitted RMA (Return Merchandise Authorization) number. - type: object PagePutObj: type: object description: Properties of the page modification request body. @@ -1051,7 +972,8 @@ components: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' - $ref: '#/components/schemas/searchKeywords' - - properties: + - type: object + properties: url: type: string description: | @@ -1064,7 +986,8 @@ components: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' - $ref: '#/components/schemas/searchKeywords' - - properties: + - type: object + properties: email: type: string description: 'Applicable when the page type is `contact_form`: contact email address that receives messages sent using the form. Must be unique.' @@ -1089,7 +1012,8 @@ components: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' - $ref: '#/components/schemas/searchKeywords' - - properties: + - type: object + properties: feed: type: string description: | @@ -1102,7 +1026,8 @@ components: allOf: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/searchKeywords' - - properties: + - type: object + properties: body: type: string description: | @@ -1120,7 +1045,8 @@ components: `type: link`. A link to an external absolute URL. Displays in the menu of other pages that contain markup. Does not contain a body. allOf: - $ref: '#/components/schemas/anyTypePage' - - properties: + - type: object + properties: link: type: string description: The link for the page type `link`. @@ -1155,51 +1081,6 @@ components: nullable: true default: '""' readOnly: false - ReadShared: - type: object - properties: - name: - type: string - description: The name of the page. Must be unique. - minLength: 1 - maxLength: 100 - uniqueItems: true - example: About Our Company - is_visible: - type: boolean - description: Indicates whether the page is available to users and visible in any menus. - parent_id: - type: integer - description: 'ID of the parent page, if any.' - example: 0 - default: 0 - sort_order: - type: integer - description: Determines the order in which the page is displayed in the parent page’s menu. Pages with lower integers display earlier. - example: 0 - default: 0 - type: - type: string - description: 'Determines the type of page. See [Pages v3 page types](/docs/rest-content/pages#page-types) for more about the differences.' - example: page - enum: - - page - - contact_form - - raw - - blog - - feed - - link - is_homepage: - type: boolean - description: 'Determines whether this page loads at the siteʼs root route. For example, at `https://example.com/`.' - default: false - is_customers_only: - type: boolean - description: 'When `true`, this page is not visible to merchant users who are signed in to the store control panel.' - default: false - required: - - name - - type responses: HTTP207Response: description: 'Multiple operations have occurred and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occurred, such as when a `POST` or `PUT` request is successful, but saving the URL has failed.' @@ -1232,21 +1113,3 @@ components: $ref: '#/components/schemas/ResponseMeta' HTTP204: description: No content. A 204 response with no payload indicates successful deletion of all specified pages. - HTTP400: - description: '' - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ResponseErrorBrief' - HTTP404: - description: '' - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ResponseErrorDetailed' - HTTP422: - description: '' - content: - application/problem+json: - schema: - $ref: '#/components/schemas/ResponseErrorDetailed' diff --git a/reference/payments/accepted-methods_payments.v3.yml b/reference/payments/accepted-methods_payments.v3.yml index e75aca489..70b4fd295 100644 --- a/reference/payments/accepted-methods_payments.v3.yml +++ b/reference/payments/accepted-methods_payments.v3.yml @@ -102,6 +102,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -135,6 +136,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -168,6 +170,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -201,6 +204,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -234,6 +238,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: diff --git a/reference/payments/access-tokens_payments.v3.yml b/reference/payments/access-tokens_payments.v3.yml index 6d5386ca6..a5a4678c2 100644 --- a/reference/payments/access-tokens_payments.v3.yml +++ b/reference/payments/access-tokens_payments.v3.yml @@ -154,6 +154,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -187,6 +188,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -220,6 +222,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -253,6 +256,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -286,6 +290,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: @@ -319,6 +324,7 @@ paths: format: int32 errors: type: object + properties: {} additionalProperties: type: string required: diff --git a/reference/payments/process_payments.yml b/reference/payments/process_payments.yml index 496c0ff16..193aa29f5 100644 --- a/reference/payments/process_payments.yml +++ b/reference/payments/process_payments.yml @@ -252,6 +252,7 @@ paths: errors: description: '' type: object + properties: {} additionalProperties: type: string required: @@ -286,6 +287,7 @@ paths: errors: description: '' type: object + properties: {} additionalProperties: type: string required: @@ -320,6 +322,7 @@ paths: errors: description: '' type: object + properties: {} additionalProperties: type: string required: @@ -354,6 +357,7 @@ paths: errors: description: '' type: object + properties: {} additionalProperties: type: string required: diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index 099056f6e..2125f860e 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -160,7 +160,6 @@ paths: type: array items: title: Price List - type: object allOf: - type: object properties: @@ -324,7 +323,6 @@ paths: properties: data: title: Price List - type: object allOf: - type: object properties: @@ -461,6 +459,8 @@ paths: schema: title: Delete Price Lists Response type: object + properties: {} + additionalProperties: true nullable: true '/pricelists/{price_list_id}': parameters: @@ -622,7 +622,6 @@ paths: properties: data: title: Price List - type: object allOf: - type: object properties: @@ -1005,7 +1004,6 @@ paths: type: array items: title: Price Record - type: object description: The Price Record object. allOf: - type: object @@ -1036,31 +1034,29 @@ paths: example: 158 readOnly: true - title: Price Record Identifiers - type: object description: Price Record object used in batch create or update. - allOf: - - type: object - properties: - price_list_id: - type: integer - description: | - The Price List with which this price set is associated. - example: 2 - variant_id: - type: integer - description: | - The variant with which this price set is associated. Either `variant_id` or `sku` is required. - example: 325 - sku: - type: string - description: | - The variant with which this price set is associated. Either `sku` or `variant_id` is required. - currency: - type: string - description: | - The 3-letter currency code with which this price set is associated. - format: ISO-4217 - example: usd + type: object + properties: + price_list_id: + type: integer + description: | + The Price List with which this price set is associated. + example: 2 + variant_id: + type: integer + description: | + The variant with which this price set is associated. Either `variant_id` or `sku` is required. + example: 325 + sku: + type: string + description: | + The variant with which this price set is associated. Either `sku` or `variant_id` is required. + currency: + type: string + description: | + The 3-letter currency code with which this price set is associated. + format: ISO-4217 + example: usd - title: PriceRecord Base type: object properties: @@ -1467,7 +1463,8 @@ paths: title: PriceRecord Batch Item description: Price Record object used in batch create or update. allOf: - - properties: + - type: object + properties: variant_id: type: integer description: | @@ -1485,6 +1482,7 @@ paths: format: ISO-4217 example: usd - title: PriceRecord Base + type: object description: Common Price Record properties. properties: price: @@ -1552,7 +1550,6 @@ paths: description: | The SKU code associated with this `Price Record` if requested and it exists. example: SMB-123 - type: object required: true description: '' responses: @@ -1586,31 +1583,29 @@ paths: properties: data: title: Price Record Identifiers - type: object description: Price Record object used in batch create or update. - allOf: - - type: object - properties: - price_list_id: - type: integer - description: | - The Price List with which this price set is associated. - example: 2 - variant_id: - type: integer - description: | - The variant ID with which this price set is associated. Either `variant_id` or `sku` is required. - example: 325 - sku: - type: string - description: | - The variant with which this price set is associated. Either `sku` or `variant_id` is required. - currency: - type: string - description: | - The 3-letter currency code with which this price set is associated. - format: ISO-4217 - example: usd + type: object + properties: + price_list_id: + type: integer + description: | + The Price List with which this price set is associated. + example: 2 + variant_id: + type: integer + description: | + The variant ID with which this price set is associated. Either `variant_id` or `sku` is required. + example: 325 + sku: + type: string + description: | + The variant with which this price set is associated. Either `sku` or `variant_id` is required. + currency: + type: string + description: | + The 3-letter currency code with which this price set is associated. + format: ISO-4217 + example: usd field_errors: title: Detailed Errors type: object @@ -1725,7 +1720,8 @@ paths: title: Price Record description: The Price Record object. allOf: - - properties: + - type: object + properties: calculated_price: type: number description: | @@ -1753,6 +1749,7 @@ paths: readOnly: true - title: Price Record Identifiers description: Price Record object used in batch create or update. + type: object properties: price_list_id: type: integer @@ -1775,6 +1772,7 @@ paths: example: usd - title: PriceRecord Base description: Common Price Record properties. + type: object properties: price: type: number @@ -1841,7 +1839,6 @@ paths: description: | The SKU code associated with this `Price Record` if requested and it exists. example: SMB-123 - type: object meta: title: Collection Meta type: object @@ -1969,7 +1966,6 @@ paths: properties: data: title: Price Record - type: object description: The Price Record object. allOf: - type: object @@ -2002,29 +1998,27 @@ paths: - title: Price Record Identifiers type: object description: Price Record object used in batch create or update requests. - allOf: - - type: object - properties: - price_list_id: - type: integer - description: | - The Price List with which this price set is associated. - example: 2 - variant_id: - type: integer - description: | - The variant with which this price set is associated. Either `variant_id` or `sku` is required. - example: 325 - sku: - type: string - description: | - The variant with which this price set is associated. Either `sku` or `variant_id` is required. - currency: - type: string - description: | - The 3-letter currency code with which this price set is associated. - format: ISO-4217 - example: usd + properties: + price_list_id: + type: integer + description: | + The Price List with which this price set is associated. + example: 2 + variant_id: + type: integer + description: | + The variant with which this price set is associated. Either `variant_id` or `sku` is required. + example: 325 + sku: + type: string + description: | + The variant with which this price set is associated. Either `sku` or `variant_id` is required. + currency: + type: string + description: | + The 3-letter currency code with which this price set is associated. + format: ISO-4217 + example: usd - title: PriceRecord Base type: object properties: @@ -2241,7 +2235,8 @@ paths: data: description: The Price Record object. allOf: - - properties: + - type: object + properties: calculated_price: type: number format: double @@ -2268,8 +2263,7 @@ paths: example: 158 readOnly: true - description: Price Record object used in a batch create or update request. - allOf: - - properties: + properties: price_list_id: type: integer description: | @@ -2356,7 +2350,6 @@ paths: The SKU code associated with this `Price Record` if requested and it exists. example: SMB-123 title: Price Record - type: object meta: $ref: '#/components/schemas/Meta' title: Price Record Response @@ -2882,9 +2875,13 @@ components: properties: data: type: object + properties: {} + additionalProperties: true example: {} meta: type: object + properties: {} + additionalProperties: true example: {} PriceRecordBatchErrorResponse: type: object @@ -2897,24 +2894,23 @@ components: PriceRecordIdentifiers: type: object description: The `Price Record` object used in batch create or update. - allOf: - - type: object - properties: - price_list_id: - type: integer - description: The Price List with which this price record is associated. - variant_id: - type: integer - description: The variant with which this price record is associated. Either `variant_id` or `sku` is required. - sku: - type: string - description: The variant with which this price record is associated. Either `sku` or `variant_id` is required. - currency: - type: string - description: The 3-letter currency code with which this price set is associated. - format: ISO-4217 + properties: + price_list_id: + type: integer + description: The Price List with which this price record is associated. + variant_id: + type: integer + description: The variant with which this price record is associated. Either `variant_id` or `sku` is required. + sku: + type: string + description: The variant with which this price record is associated. Either `sku` or `variant_id` is required. + currency: + type: string + description: The 3-letter currency code with which this price set is associated. + format: ISO-4217 DetailedErrors: type: object + properties: {} additionalProperties: type: string PriceListAssignmentsBatchErrorResponse: diff --git a/reference/settings.v3.yml b/reference/settings.v3.yml index 5d33257e9..225e6f42d 100644 --- a/reference/settings.v3.yml +++ b/reference/settings.v3.yml @@ -512,15 +512,15 @@ paths: - collapsed_by_default: false display_name: Brand display_product_count: true - id: Y123= + id: 235fc3dg67 is_enabled: true - items_to_show: 12 + items_to_show: 15 sort_by: alpha type: brand - collapsed_by_default: false display_name: Color display_product_count: true - id: Q123= + id: 25DtbA= is_enabled: true items_to_show: 10 sort_by: alpha @@ -528,7 +528,7 @@ paths: - collapsed_by_default: true display_name: Ships for Free display_product_count: false - id: Y456= + id: Ym329vbA== is_enabled: true show_free_shipping_filter: true show_in_stock_filter: true @@ -559,9 +559,9 @@ paths: - collapsed_by_default: false display_name: Size display_product_count: true - id: U123= + id: '124' is_enabled: true - items_to_show: 12 + items_to_show: 15 sort_by: alpha type: product - collapsed_by_default: false @@ -603,9 +603,9 @@ paths: - collapsed_by_default: false display_name: Size display_product_count: true - id: U123== + id: '126' is_enabled: true - items_to_show: 12 + items_to_show: 10 sort_by: alpha type: product - collapsed_by_default: false @@ -1475,6 +1475,8 @@ paths: $ref: '#/components/schemas/MeasurementUnitsSettings' meta: type: object + properties: {} + additionalProperties: true '422': description: The provided settings could not be applied. See detailed errors in the response. content: @@ -1513,6 +1515,8 @@ paths: $ref: '#/components/schemas/MeasurementUnitsSettings' meta: type: object + properties: {} + additionalProperties: true parameters: - $ref: '#/components/parameters/ChannelIdParam' tags: @@ -1541,24 +1545,6 @@ components: name: channel_id schema: type: integer - KeysToDelete: - description: A comma-separated list of strings representing which configuration keys should be cleared (un-overridden) for the channel. - in: query - name: keys - required: true - style: form - explode: false - schema: - type: array - items: - type: string - RequiredChannelIdParamForDelete: - description: 'Required channel ID. This delete operation will delete overridden settings for this channel, thus restoring them to the global defaults.' - in: query - name: channel_id - required: true - schema: - type: integer schemas: AddressTypeEnumValues: description: Only supports manipulation on a global level. @@ -1594,8 +1580,7 @@ components: $ref: '#/components/schemas/AnalyticsProvider' x-internal: false AvailableFilter: - type: object - oneOf: + anyOf: - $ref: '#/components/schemas/AvailableNormalFilter' - $ref: '#/components/schemas/AvailablePriceFilter' - $ref: '#/components/schemas/AvailableOtherFilter' @@ -1688,7 +1673,7 @@ components: x-tags: - Models ConfiguredFilter: - oneOf: + anyOf: - $ref: '#/components/schemas/EnabledProductFilter' - $ref: '#/components/schemas/EnabledPriceFilter' - $ref: '#/components/schemas/EnabledCategoryFilter' @@ -1740,6 +1725,7 @@ components: type: boolean id: type: string + description: The ID of the filter. is_enabled: type: boolean items_to_show: @@ -1771,6 +1757,7 @@ components: type: boolean id: type: string + description: The ID of the filter. is_enabled: type: boolean items_to_show: @@ -1785,34 +1772,8 @@ components: - category title: EnabledCategoryFilter x-internal: false - EnabledFilter: - oneOf: - - $ref: '#/components/schemas/EnabledProductFilter' - - $ref: '#/components/schemas/EnabledPriceFilter' - - $ref: '#/components/schemas/EnabledCategoryFilter' - - $ref: '#/components/schemas/EnabledBrandFilter' - - $ref: '#/components/schemas/EnabledRatingFilter' - - $ref: '#/components/schemas/EnabledMiscFilter' - title: EnabledFilter - x-internal: false - EnabledFilters: - type: array - items: - $ref: '#/components/schemas/EnabledFilter' - title: EnabledFilters - x-internal: false - EnabledFiltersOverride: - description: 'A new set of enabled Product Filtering filters which should display in a particular context, such as on a particular Channel, or while viewing a particular Category. Array order indicates the display order on the storefront.' - type: object - properties: - data: - $ref: '#/components/schemas/EnabledFilters' - scope: - $ref: '#/components/schemas/SearchFilterOverrideScopeIdentifier' - title: EnabledFiltersOverride - x-internal: false EnabledMiscFilter: - description: Miscellaneous Filters which appear as a group. + description: Miscellaneous filters which appear as a group. type: object properties: collapsed_by_default: @@ -1822,7 +1783,8 @@ components: display_product_count: type: boolean id: - type: integer + type: string + description: The ID of the filter. is_enabled: type: boolean show_free_shipping_filter: @@ -1840,7 +1802,7 @@ components: title: EnabledMiscFilter x-internal: false EnabledPriceFilter: - description: 'A filter based on the product’s price, shown as a price range on the storefront.' + description: A filter based on the product’s price, shown as a price range on the storefront. type: object properties: collapsed_by_default: @@ -1849,6 +1811,7 @@ components: type: string id: type: string + description: The ID of the filter. is_enabled: type: boolean type: @@ -1869,6 +1832,7 @@ components: type: boolean id: type: string + description: The ID of the filter. is_enabled: type: boolean items_to_show: @@ -1899,6 +1863,7 @@ components: type: string id: type: string + description: The ID of the filter. is_enabled: type: boolean type: @@ -2215,15 +2180,6 @@ components: type: integer title: ContextIdentifier x-internal: false - SearchFilterOverrideScopeIdentifier: - type: object - properties: - category_id: - type: integer - channel_id: - type: integer - title: ScopeIdentifier - x-internal: false StoreProfile: title: Store Profile description: The basic profile settings for a store, used to give the shopper information about the business from which they are purchasing. diff --git a/reference/shipping.v2.yml b/reference/shipping.v2.yml index 561e5b1bc..45277dc23 100644 --- a/reference/shipping.v2.yml +++ b/reference/shipping.v2.yml @@ -109,9 +109,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -120,8 +120,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -130,7 +131,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -248,9 +249,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -259,8 +260,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -269,7 +271,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -362,9 +364,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -373,8 +375,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -383,7 +386,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -456,9 +459,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -467,8 +470,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -477,7 +481,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -556,9 +560,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -567,8 +571,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -577,7 +582,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -646,9 +651,9 @@ paths: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -657,8 +662,9 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -667,7 +673,7 @@ paths: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -1420,25 +1426,28 @@ paths: settings: description: 'Depends on the shipping method type. See the [supported settings object](#supported-settings).' type: object + properties: {} + additionalProperties: true enabled: description: Whether or not this shipping zone method is enabled. example: true type: boolean handling_fees: - oneOf: - - title: fixed surcharge + anyOf: + - title: Fixed surcharge + type: object properties: fixed_surcharge: type: number description: Flat-rate handling fee applied to shipping cost. example: 0 - - title: percentage surcharge + - title: Percentage surcharge + type: object properties: percentage_surcharge: type: number description: Percentage handling fee applied to shipping cost. example: 0 - type: object is_fallback: description: Whether or not this shipping zone is the fallback if all others are not valid for the order. example: false @@ -2179,9 +2188,9 @@ components: type: boolean handling_fees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -2190,8 +2199,9 @@ components: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -2200,7 +2210,7 @@ components: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge + title: Percentage surcharge enabled: description: Whether this shipping zone is enabled. example: true @@ -2231,9 +2241,9 @@ components: x-internal: false HandlingFees: title: Shipping Zone Handling Fees - type: object - oneOf: - - properties: + anyOf: + - type: object + properties: fixed_surcharge: description: Flat-rate handling fee applied to shipping cost. example: '0' @@ -2242,8 +2252,9 @@ components: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: fixed surcharge - - properties: + title: Fixed surcharge + - type: object + properties: percentage_surcharge: description: Percentage handling fee applied to shipping cost. example: '5' @@ -2252,8 +2263,7 @@ components: description: Indicates whether store displays handling fee separately at checkout. example: true type: boolean - title: percentage surcharge - x-internal: false + title: Percentage surcharge shippingMethod_Full: title: shippingMethod_Full allOf: @@ -2308,20 +2318,21 @@ components: example: true type: boolean handling_fees: - oneOf: - - title: fixed surcharge + anyOf: + - title: Fixed surcharge + type: object properties: fixed_surcharge: type: number description: Flat-rate handling fee applied to shipping cost. example: 0 - - title: percentage surcharge + - title: Percentage surcharge + type: object properties: percentage_surcharge: type: number description: Percentage handling fee applied to shipping cost. example: 0 - type: object is_fallback: description: Whether or not this shipping zone is the fallback if all others are not valid for the order. example: false @@ -2339,6 +2350,8 @@ components: type: string connection: type: object + properties: {} + additionalProperties: true description: The `connection` object varies by carrier. x-internal: false metaCollection: diff --git a/reference/shipping.v3.yml b/reference/shipping.v3.yml index a750fe544..76a8d8e09 100644 --- a/reference/shipping.v3.yml +++ b/reference/shipping.v3.yml @@ -462,6 +462,8 @@ components: x-internal: false error_Full: title: Error - description: Meta data relating to pagination + description: '' type: object + properties: {} + additionalProperties: true x-internal: false diff --git a/reference/shipping_provider.yml b/reference/shipping_provider.yml index 2b2190c06..228c78a4b 100644 --- a/reference/shipping_provider.yml +++ b/reference/shipping_provider.yml @@ -706,11 +706,15 @@ components: x-internal: false ZoneOptionsInstance: type: object + properties: {} + additionalProperties: true description: Any zone-specific request options declared by the carrier and configured by the merchant to retrieve rates. Optional. title: Zone Options Instance x-internal: false ConnectionOptionsInstance: type: object + properties: {} + additionalProperties: true description: Any global request options declared by the carrier and configured by the merchant to retrieve rates. Optional. title: Connection Options Instance x-internal: false diff --git a/reference/sites.v3.yml b/reference/sites.v3.yml index 2357cc3ba..c1af90a68 100644 --- a/reference/sites.v3.yml +++ b/reference/sites.v3.yml @@ -719,6 +719,8 @@ components: x-internal: false _errors: type: object + properties: {} + additionalProperties: true description: The keys and values in an errors object will vary depending on the error received. title: _errors x-internal: false diff --git a/reference/store_content.v2.yml b/reference/store_content.v2.yml index c279bcf1b..d42a89877 100644 --- a/reference/store_content.v2.yml +++ b/reference/store_content.v2.yml @@ -223,6 +223,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true delete: tags: - Blog Posts @@ -350,6 +352,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true delete: tags: - Blog Posts @@ -530,6 +534,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true '/pages/{id}': parameters: - $ref: '#/components/parameters/Accept' @@ -638,6 +644,8 @@ paths: application/json: schema: type: object + properties: {} + additionalProperties: true delete: deprecated: true tags: @@ -1458,10 +1466,6 @@ components: type: string description: 'Not returned in any responses, but accepts up to two fields allowing you to set the customer’s password. If a password is not supplied, it is generated automatically. For further information about using this object, please see the Customers resource documentation.' x-internal: false - customer_Base: - title: customer_Base - type: object - x-internal: false page_Base: title: page_Base type: object diff --git a/reference/store_logs.v3.yml b/reference/store_logs.v3.yml index b3f0e7612..5d5483808 100644 --- a/reference/store_logs.v3.yml +++ b/reference/store_logs.v3.yml @@ -187,6 +187,7 @@ components: type: string DetailedErrors: type: object + properties: {} additionalProperties: type: string SystemLog: diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index 0267d302c..369d938ce 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -317,6 +317,7 @@ components: x-internal: false DetailedErrors: type: object + properties: {} additionalProperties: type: string x-internal: false diff --git a/reference/subscribers.v3.yml b/reference/subscribers.v3.yml index 3f83ce57b..0157d4ccd 100644 --- a/reference/subscribers.v3.yml +++ b/reference/subscribers.v3.yml @@ -373,8 +373,11 @@ components: format: date-time consents: type: array + items: + type: string description: Shows what active subscriptions a shopper may have. If the consents array is empty, the user has unsubscribed or didn’t enable the newsletter subscription checkbox during checkout. - example: [marketing_newsletter] + example: + - marketing_newsletter x-internal: false subscriber_Base: title: subscriber_Base diff --git a/reference/tax_properties.v3.yml b/reference/tax_properties.v3.yml index 1475145c2..7f3e34082 100644 --- a/reference/tax_properties.v3.yml +++ b/reference/tax_properties.v3.yml @@ -387,6 +387,8 @@ components: example: 157 tax_properties: type: object + properties: {} + additionalProperties: true description: A simple key-value pairing. The tax property must be defined to associate a value. These values will be sent to the active tax provider during Tax Provider API operations whenever the associated diff --git a/reference/tax_provider.yml b/reference/tax_provider.yml index 3dc9bdae3..73554c28a 100644 --- a/reference/tax_provider.yml +++ b/reference/tax_provider.yml @@ -966,7 +966,6 @@ components: origin_address: $ref: '#/components/schemas/Address' shipping: - type: object description: Shipping line item present in each document request. allOf: - $ref: '#/components/schemas/request-item' @@ -977,7 +976,6 @@ components: required: - type handling: - type: object description: Handling line item present in each document request. allOf: - $ref: '#/components/schemas/request-item' @@ -998,15 +996,14 @@ components: type: $ref: '#/components/schemas/item_type' wrapping: - type: object description: Optional gift wrapping for items in the consignment. - nullable: true allOf: - $ref: '#/components/schemas/request-item' - type: object properties: type: $ref: '#/components/schemas/wrapping_type' + nullable: true required: - type required: @@ -1172,21 +1169,19 @@ components: type: $ref: '#/components/schemas/item_type' wrapping: - type: object description: Optional gift wrapping for items in the consignment. - nullable: true allOf: - $ref: '#/components/schemas/response-item' - type: object properties: type: $ref: '#/components/schemas/wrapping_type' + nullable: true required: - type required: - type shipping: - type: object description: Shipping line item present in each document request. allOf: - $ref: '#/components/schemas/response-item' @@ -1197,7 +1192,6 @@ components: required: - type handling: - type: object description: Handling line item present in each document request. allOf: - $ref: '#/components/schemas/response-item' diff --git a/reference/themes.v3.yml b/reference/themes.v3.yml index 44b08a35f..63823d9e5 100644 --- a/reference/themes.v3.yml +++ b/reference/themes.v3.yml @@ -1140,6 +1140,7 @@ components: description: Request definition for activation endpoint. required: - variation_id + type: object properties: variation_id: description: The identifier for the variation to activate. @@ -1342,27 +1343,17 @@ components: description: Response for /GET Jobs by Id. x-internal: false WhichThemeToDownload: - description: 'An object specifying which theme to download. One of: `original`: the original Marketplace or uploaded custom theme; `last_activated`: the theme version most recently applied to the store; `last_created`: the theme version most recently created.' - allOf: - - description: |- - A BigCommerce object specifying which theme to download. - - `original`: the original Marketplace or uploaded custom theme. - - `last_activated`: the theme version most recently applied to the store. - - `last_created`: the theme version most recently created. - - If `which` is missing or invalid in the request, its value will default to `last_activated`. + description: |- + An object specifying which theme to download. One of: `original`: the original Marketplace or uploaded custom theme; `last_activated`: the theme version most recently applied to the store; `last_created`: the theme version most recently created. If `which` is missing or invalid in the request, its value will default to `last_activated`. + properties: + which: + description: Which revision to use. + type: string example: original - properties: - which: - description: Which revision to use. - type: string - enum: - - original - - last_activated - - last_created + enum: + - original + - last_activated + - last_created title: Which Theme To Download type: object x-internal: false @@ -1389,6 +1380,9 @@ components: description: The Variation to which the Configuration belongs. settings: type: object + format: json + properties: {} + additionalProperties: true description: 'The content of the configuration, which is a JSON object which will vary in structure from theme to theme.' date_created: type: string @@ -1406,6 +1400,9 @@ components: description: The Variation to which the Configuration belongs. settings: type: object + format: json + properties: {} + additionalProperties: true description: 'The content of the configuration, which is a JSON object which will vary in structure from theme to theme.' title: themeConfiguration_Write x-internal: false diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index 8a241cd95..56ea6c894 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -727,12 +727,12 @@ components: } } ``` - x-examples: {} title: store/cart/created allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -751,7 +751,6 @@ components: example: 09346904-4175-44fd-be53-f7e598531b6c x-tags: - created - type: object x-internal: false store_cart_updated: title: store/cart/updated @@ -779,11 +778,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -799,14 +798,12 @@ components: example: 09346904-4175-44fd-be53-f7e598531b6c x-tags: - created - type: object x-internal: false store_cart_deleted: title: store/cart/deleted description: |- Fires when a cart is deleted. Carts are deleted in two ways; when all items are removed from a cart, and when an API consumer explicitly removes the cart using a `DELETE` request. Cart deletion ends the cart lifecycle. The `store/cart/updated` webhook also fires when the last item is removed. - ```json filename="Example callback object" showLineNumbers { "created_at": 1561482670, @@ -820,11 +817,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -840,7 +837,6 @@ components: example: 09346904-4175-44fd-be53-f7e598531b6c x-tags: - deleted - type: object x-internal: false store_cart_couponApplied: title: store/cart/couponApplied @@ -861,11 +857,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -885,14 +881,12 @@ components: example: 1 x-tags: - created - type: object x-internal: false store_cart_abandoned: title: store/cart/abandoned description: |- This webhook fires after a cart is abandoned. BigCommerce considers a cart abandoned when it has no activity for at least one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. - ```json filename="Example callback object" showLineNumbers { "created_at": 1561482670, @@ -907,11 +901,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -929,14 +923,12 @@ components: type: string example: 1eed6d2d979776ff18e695ceeb10ea61 description: Use this token to obtain cart data. - type: object x-internal: false store_cart_converted: title: store/cart/converted description: |- Fires when a cart/checkout is converted into an order, which is typically after the checkout payment step on the storefront. At this point, the cart is automatically deleted and no longer accessible. This webhook returns both the cart/checkout ID and order ID for correlation purposes. - ```json filename="Example callback object" showLineNumbers { "created_at": 1561482670, @@ -951,11 +943,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -975,7 +967,6 @@ components: example: 252 x-tags: - created - type: object x-internal: false store_cart_lineItem_wildcard: title: store/cart/lineItem/* @@ -999,7 +990,8 @@ components: allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1016,7 +1008,6 @@ components: description: ID of the cart. x-tags: - created - type: object x-internal: false store_cart_lineItem_created: title: store/cart/lineItem/created @@ -1041,7 +1032,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1061,7 +1053,6 @@ components: example: b0386708-fef3-45de-9d8b-fbe3031450a4 x-tags: - created - type: object x-internal: false store_cart_lineItem_updated: title: store/cart/lineItem/updated @@ -1090,7 +1081,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1108,7 +1100,6 @@ components: type: string description: ID of the cart example: b0386708-fef3-45de-9d8b-fbe3031450a4 - type: object x-tags: - updated x-internal: false @@ -1131,11 +1122,11 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1153,7 +1144,6 @@ components: type: string description: ID of the cart. example: b0386708-fef3-45de-9d8b-fbe3031450a4 - type: object x-tags: - deleted x-internal: false @@ -1167,7 +1157,6 @@ components: x-internal: false store_category_created: title: store/category/created - type: object description: |- Fires when a category is created. @@ -1184,7 +1173,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' @@ -1231,7 +1219,8 @@ components: allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1247,7 +1236,6 @@ components: example: 42 x-tags: - updated - type: object x-internal: false store_category_deleted: title: store/category/deleted @@ -1270,7 +1258,8 @@ components: allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1287,7 +1276,6 @@ components: example: 42 x-tags: - deleted - type: object x-internal: false store_channel_wildcard: title: store/channel/* @@ -1317,7 +1305,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1335,7 +1324,6 @@ components: example: 173331 x-tags: - created - type: object x-internal: false store_channel_updated: title: store/channel/updated @@ -1368,7 +1356,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1386,7 +1375,6 @@ components: example: 173331 x-tags: - created - type: object x-internal: false store_customer_wildcard: title: store/customer/* @@ -1418,7 +1406,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1436,7 +1425,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_updated: title: store/customer/updated @@ -1461,7 +1449,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1479,7 +1468,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_deleted: title: store/customer/deleted @@ -1502,7 +1490,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1520,7 +1509,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_address_updated: title: store/customer/address/updated @@ -1547,7 +1535,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1570,7 +1559,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_address_created: title: store/customer/address/created @@ -1597,7 +1585,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1620,7 +1609,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_address_deleted: title: store/customer/address/deleted @@ -1647,7 +1635,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1670,7 +1659,6 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_customer_payment_instrument_default_updated: title: store/customer/payment/instrument/default/updated @@ -1693,7 +1681,8 @@ components: allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1711,12 +1700,10 @@ components: example: 32 x-tags: - created - type: object x-internal: false store_order_wildcard: title: store/order/* description: Fires for all `store/order` events. - type: object x-internal: false store_order_created: title: store/order/created @@ -1740,7 +1727,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1757,7 +1745,6 @@ components: example: 250 x-tags: - created - type: object x-internal: false store_order_updated: title: store/order/updated @@ -1801,7 +1788,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1818,7 +1806,6 @@ components: example: 250 x-tags: - created - type: object x-internal: false store_order_archived: title: store/order/archived @@ -1841,7 +1828,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1858,7 +1846,6 @@ components: example: 250 x-tags: - created - type: object x-internal: false store_order_statusUpdated: title: store/order/statusUpdated @@ -1886,7 +1873,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1913,7 +1901,6 @@ components: example: 11 x-tags: - created - type: object x-internal: false store_order_message_created: title: store/order/message/created @@ -1940,7 +1927,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -1963,7 +1951,6 @@ components: example: 3 x-tags: - created - type: object x-internal: false store_order_refund_created: title: store/order/refund/created @@ -1990,7 +1977,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2013,12 +2001,10 @@ components: example: 3 x-tags: - created - type: object x-internal: false store_product_wildcard: title: store/product/* description: Fires for all `store/product` events. - type: object x-internal: false store_product_deleted: title: store/product/deleted @@ -2042,7 +2028,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2059,7 +2046,6 @@ components: example: 205 x-tags: - created - type: object x-internal: false store_product_created: title: store/product/created @@ -2083,7 +2069,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2100,7 +2087,6 @@ components: example: 205 x-tags: - created - type: object x-internal: false store_product_updated: title: store/product/updated @@ -2176,7 +2162,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2193,7 +2180,6 @@ components: example: 205 x-tags: - created - type: object x-internal: false store_product_inventory_updated: title: store/product/inventory/updated @@ -2230,7 +2216,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2266,7 +2253,6 @@ components: example: 2 x-tags: - created - type: object x-internal: false store_product_inventory_order_updated: title: store/product/inventory/order/updated @@ -2298,7 +2284,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2334,12 +2321,10 @@ components: example: 2 x-tags: - created - type: object x-internal: false store_shipment_wildcard: title: store/shipment/* description: Fires for all `store/shipment` events. - type: object x-internal: false store_shipment_created: title: store/shipment/created @@ -2364,7 +2349,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2384,7 +2370,6 @@ components: example: 251 x-tags: - created - type: object x-internal: false store_shipment_updated: title: store/shipment/updated @@ -2412,7 +2397,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2432,7 +2418,6 @@ components: example: 251 x-tags: - created - type: object x-internal: false store_shipment_deleted: title: store/shipment/deleted @@ -2457,7 +2442,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2477,12 +2463,10 @@ components: example: 251 x-tags: - created - type: object x-internal: false store_sku_wildcard: title: store/sku/* description: Fires for all `store/sku` events. - type: object x-internal: false store_sku_created: title: store/sku/created @@ -2510,7 +2494,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2537,7 +2522,6 @@ components: example: 509 x-tags: - created - type: object x-internal: false store_sku_updated: title: store/sku/updated @@ -2565,7 +2549,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2592,7 +2577,6 @@ components: example: 509 x-tags: - created - type: object x-internal: false store_sku_deleted: title: store/sku/deleted @@ -2620,7 +2604,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2647,7 +2632,6 @@ components: example: 509 x-tags: - created - type: object x-internal: false store_sku_inventory_updated: title: store/sku/inventory/updated @@ -2677,7 +2661,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2717,7 +2702,6 @@ components: example: 509 x-tags: - created - type: object x-internal: false store_sku_inventory_order_updated: title: store/sku/inventory/order/updated @@ -2750,7 +2734,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2790,7 +2775,6 @@ components: example: 509 x-tags: - created - type: object x-internal: false store_app_uninstalled: title: store/app/uninstalled @@ -2813,7 +2797,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2825,7 +2810,6 @@ components: example: store x-tags: - created - type: object x-internal: false store_information_updated: title: store/information/updated @@ -2856,7 +2840,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2868,12 +2853,10 @@ components: example: store x-tags: - created - type: object x-internal: false store_subscriber_wildcard: title: store/subscriber/* description: Fires for all `store/subscriber` events. - type: object x-internal: false store_subscriber_created: title: store/subscriber/created @@ -2897,7 +2880,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2913,7 +2897,6 @@ components: example: 5 x-tags: - created - type: object x-internal: false store_subscriber_updated: title: store/subscriber/updated @@ -2937,7 +2920,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2953,7 +2937,6 @@ components: example: 5 x-tags: - created - type: object x-internal: false store_subscriber_deleted: title: store/subscriber/deleted @@ -2977,7 +2960,8 @@ components: x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. + - type: object + description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. properties: data: type: object @@ -2993,7 +2977,6 @@ components: example: 5 x-tags: - created - type: object x-internal: false error_Full: type: object @@ -3027,8 +3010,7 @@ components: description: Typically a link to BigCommerce API Status codes type: string errors: - type: object - x-internal: false + x-internal: false webhook_Put: type: object title: webhook_Put @@ -3093,6 +3075,7 @@ components: allOf: - $ref: '#/components/schemas/webhook_Base' - title: webhook_Full + type: object properties: id: type: integer @@ -3125,6 +3108,8 @@ components: description: A numerical identifier that is unique to each store. data: type: object + properties: {} + additionalProperties: true description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. hash: type: string @@ -3179,35 +3164,33 @@ components: scope: store/cart/created hash: 352e4afc6dd3fc85ea26bfdf3f91852604d57528 title: '' - allOf: - - properties: - created_at: - type: integer - example: 1561488106 - description: The time the webhook was created, represented in UNIX epoch time. - readOnly: true - store_id: - type: string - minLength: 1 - example: '1025646' - description: A numerical identifier that is unique to each store. - producer: - type: string - minLength: 1 - example: 'stores/{store_hash}' - description: Will always follow the pattern `stores/store_hash`. This is the store that created the webhook. - scope: - type: string - minLength: 1 - example: store/cart/created - description: The event registered when the webhook was created. - hash: - type: string - minLength: 1 - example: 352e4afc6dd3fc85ea26bfdf3f91852604d57528 - description: The payload data encoded in JSON format and then passed through SH1 encryption. type: object - x-internal: false + properties: + created_at: + type: integer + example: 1561488106 + description: The time the webhook was created, represented in UNIX epoch time. + readOnly: true + store_id: + type: string + minLength: 1 + example: '1025646' + description: A numerical identifier that is unique to each store. + producer: + type: string + minLength: 1 + example: 'stores/{store_hash}' + description: Will always follow the pattern `stores/store_hash`. This is the store that created the webhook. + scope: + type: string + minLength: 1 + example: store/cart/created + description: The event registered when the webhook was created. + hash: + type: string + minLength: 1 + example: 352e4afc6dd3fc85ea26bfdf3f91852604d57528 + description: The payload data encoded in JSON format and then passed through SH1 encryption. callback_category_data: title: callback_category_data type: object diff --git a/reference/widgets.v3.yml b/reference/widgets.v3.yml index d19c485d4..43753da09 100644 --- a/reference/widgets.v3.yml +++ b/reference/widgets.v3.yml @@ -663,6 +663,7 @@ components: data: type: array items: + type: object properties: uuid: type: string @@ -764,6 +765,7 @@ components: data: type: array items: + type: object properties: uuid: type: string @@ -1031,14 +1033,12 @@ components: content: application/json: schema: - allOf: - - type: object - properties: - data: - $ref: '#/components/schemas/widgetTemplate_Full' - - properties: - meta: - $ref: '#/components/schemas/Meta' + type: object + properties: + data: + $ref: '#/components/schemas/widgetTemplate_Full' + meta: + $ref: '#/components/schemas/Meta' examples: response: value: @@ -1236,9 +1236,12 @@ components: in: header schemas: WidgetTemplatePreview: + type: object properties: widget_configuration: type: object + properties: {} + additionalProperties: true description: The JSON data that populates the template. format: json x-tags: @@ -1247,6 +1250,7 @@ components: type: object properties: data: + type: object properties: html: type: string @@ -1370,6 +1374,8 @@ components: description: The user-friendly description. widget_configuration: type: object + properties: {} + additionalProperties: true description: The JSON data that populates the template. format: json widget_template_uuid: @@ -1538,6 +1544,7 @@ components: type: string errors: type: object + properties: {} x-internal: false title: error_Base BaseError: @@ -1567,6 +1574,7 @@ components: x-tags: - Models themeRegion: + type: object properties: name: type: string @@ -1630,6 +1638,8 @@ components: description: The user-friendly description. widget_configuration: type: object + properties: {} + additionalProperties: true format: json description: The JSON data that populates the template. x-internal: false diff --git a/reference/wishlists.v3.yml b/reference/wishlists.v3.yml index 7e6a6e492..9f53b16c9 100644 --- a/reference/wishlists.v3.yml +++ b/reference/wishlists.v3.yml @@ -297,6 +297,7 @@ paths: application/json: schema: type: object + properties: {} '500': description: Internal server error. content: @@ -382,6 +383,7 @@ paths: application/json: schema: type: object + properties: {} '500': description: Internal server error. content: From 62d37419aec4ecb3e42e98190883ee407cfa184f Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Wed, 8 May 2024 14:15:36 -0500 Subject: [PATCH 002/221] DEVDOCS-5904: [Update] fix issues in orders.v3.yml (#241) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5904] ## What changed? Fix incorrect information in order file ## Release notes draft Bug fix * ## Anything else? ping {names} [DEVDOCS-5904]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5904?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/orders.v3.yml | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index 5840918b0..d9a104277 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -579,19 +579,6 @@ paths: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' examples: {} - '404': - description: | - The resource was not found. - content: - application/json: - schema: - $ref: '#/components/schemas/NotFound' - examples: - example-1: - value: - status: 404 - title: There was no order found with ID 1010 - type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' post: summary: Create Metafields tags: @@ -608,7 +595,12 @@ paths: application/json: schema: $ref: '#/components/schemas/MetafieldBase_Post' - examples: {} + example: + permission_set: app_only + namespace: Sales Department + key: Staff Name + value: Sam + description: Name of staff member description: | A `Metafield` object. required: true @@ -662,7 +654,7 @@ paths: $ref: '#/components/schemas/MetafieldResponse' '404': description: | - The resource was not found. + A metafield was not found with this query. content: application/json: schema: @@ -696,7 +688,7 @@ paths: $ref: '#/components/schemas/MetafieldResponse' '404': description: | - The resource was not found. + A metafield was not found with this query. content: application/json: schema: @@ -878,8 +870,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -928,13 +918,11 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple Metafields tags: - Batch metafields - description: Create multiple metafields. + description: Update multiple metafields. operationId: updateOrdersMetafields requestBody: content: @@ -969,8 +957,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: summary: Delete All Metafields tags: @@ -1667,12 +1653,14 @@ components: 404 HTTP status code. type: integer title: - description: The error title describing the particular error. + description: The resource at that URL is not found. type: string type: type: string - instance: - type: string + errors: + type: array + items: {} + description: Empty for 200 responses. title: Not Found x-internal: false Transaction: From 66bbf56a2dd40f2ebad6ac722b8ea7d8d7f51875 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Thu, 9 May 2024 13:19:53 -0500 Subject: [PATCH 003/221] (no ticket): [update] API reference, remove empty x-examples (#259) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # (no ticket): [update] API reference, remove empty x-examples ## What changed? * remove empty x-examples ## Release notes draft * ## Anything else? ping {names} --- reference/customers.v2.yml | 1 - reference/customers.v3.yml | 1 - reference/form_fields.sf.yml | 1 - reference/orders.v2.oas2.yml | 1 - reference/orders.v3.yml | 6 ---- reference/pages.v3.yml | 1 - reference/store_content.v2.yml | 1 - reference/storefront_tokens.v3.yml | 1 - reference/tax_rates_zones.v3.yml | 2 -- reference/tax_zone_check.v3.yml | 1 - reference/webhooks.v3.yml | 45 ------------------------------ reference/widgets.v3.yml | 2 -- 12 files changed, 63 deletions(-) diff --git a/reference/customers.v2.yml b/reference/customers.v2.yml index 4346943fb..2ffb21141 100644 --- a/reference/customers.v2.yml +++ b/reference/customers.v2.yml @@ -1148,7 +1148,6 @@ components: readOnly: true - $ref: '#/components/schemas/customer_Base' x-internal: false - x-examples: {} categoryAccessLevel_Full: title: categoryAccessLevel_Full type: object diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 0e906de72..40b6cbc05 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -286,7 +286,6 @@ paths: - name: "test" value: "test" required: true - x-examples: {} description: '' responses: '200': diff --git a/reference/form_fields.sf.yml b/reference/form_fields.sf.yml index 5f71b8109..b2d3e4f71 100644 --- a/reference/form_fields.sf.yml +++ b/reference/form_fields.sf.yml @@ -63,7 +63,6 @@ components: type: object description: Group of form field groups x-internal: false - x-examples: {} properties: customerAccount: $ref: '#/components/schemas/FormFields' diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 118e609b6..73f698531 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -4792,7 +4792,6 @@ components: description: Pickup locationʼs phone number. maxLength: 125 example: +1 111-111-1111 - x-examples: {} orderProduct_Put: title: orderProduct_Put anyOf: diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index d9a104277..dae85f19f 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -2213,7 +2213,6 @@ components: title: RefundQuote_Post description: Request body for refund quotes. x-internal: false - x-examples: {} properties: items: type: array @@ -2324,7 +2323,6 @@ components: required: - items - payments - x-examples: {} RefundID_Get: type: object x-examples: @@ -2461,7 +2459,6 @@ components: items: $ref: '#/components/schemas/RefundRequest_Post' x-internal: false - x-examples: {} FailedQuoteError: type: object description: Failed quote response. @@ -2484,7 +2481,6 @@ components: - $ref: '#/components/schemas/AmountBoundItem' - $ref: '#/components/schemas/QuantityBoundItem' - $ref: '#/components/schemas/TaxExemptItem' - x-examples: {} PaymentRequest: type: object properties: @@ -2827,7 +2823,6 @@ components: description: | Response payload for the BigCommerce API. x-internal: false - x-examples: {} allOf: - type: object properties: @@ -2991,7 +2986,6 @@ components: example: asdfasdfasdfasdfasdfasdfasdf readOnly: true x-internal: false - x-examples: {} MetafieldPut: description: | The model for a PUT to update metafield. diff --git a/reference/pages.v3.yml b/reference/pages.v3.yml index 76b61001d..435b7e022 100644 --- a/reference/pages.v3.yml +++ b/reference/pages.v3.yml @@ -758,7 +758,6 @@ components: SinglePageResponse: description: | Response payload for a single content page. - x-examples: {} properties: data: anyOf: diff --git a/reference/store_content.v2.yml b/reference/store_content.v2.yml index d42a89877..0065d7c8b 100644 --- a/reference/store_content.v2.yml +++ b/reference/store_content.v2.yml @@ -1381,7 +1381,6 @@ components: title: blogPost_Base_Res type: object x-internal: false - x-examples: {} description: blog post base response properties: title: diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index 369d938ce..c1d87f8b5 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -241,7 +241,6 @@ components: TokenPostImpersonation: type: object x-internal: false - x-examples: {} properties: channel_id: type: integer diff --git a/reference/tax_rates_zones.v3.yml b/reference/tax_rates_zones.v3.yml index b8ac0ca8a..f0f0954f4 100644 --- a/reference/tax_rates_zones.v3.yml +++ b/reference/tax_rates_zones.v3.yml @@ -425,7 +425,6 @@ components: schemas: Tax_Zone: type: object - x-examples: {} properties: id: type: integer @@ -651,7 +650,6 @@ components: type: integer description: ID of an associated tax zone. You must associate a tax rate with a tax zone. example: 2 - x-examples: {} Tax_RatePUT: type: object properties: diff --git a/reference/tax_zone_check.v3.yml b/reference/tax_zone_check.v3.yml index 0c741922b..04f65d6c6 100644 --- a/reference/tax_zone_check.v3.yml +++ b/reference/tax_zone_check.v3.yml @@ -95,7 +95,6 @@ components: - country_code TaxZone: type: object - x-examples: { } properties: id: type: integer diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index 56ea6c894..4f0186bf2 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -703,7 +703,6 @@ components: See individual events for more information. title: store/cart/* - x-examples: {} x-internal: false store_cart_created: description: |- @@ -727,7 +726,6 @@ components: } } ``` - x-examples: {} title: store/cart/created allOf: - $ref: '#/components/schemas/webhook_callback_base' @@ -778,7 +776,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -817,7 +814,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -857,7 +853,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -901,7 +896,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -943,7 +937,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1029,7 +1022,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1078,7 +1070,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1122,7 +1113,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1151,7 +1141,6 @@ components: title: store/category/* description: | Fires for all `store/category` events. - x-examples: {} x-tags: - created x-internal: false @@ -1173,7 +1162,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - $ref: '#/components/schemas/callback_category_data' @@ -1302,7 +1290,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1353,7 +1340,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1380,7 +1366,6 @@ components: title: store/customer/* description: | Fires for all `store/customer` events. - x-examples: {} x-tags: - created x-internal: false @@ -1403,7 +1388,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1446,7 +1430,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1487,7 +1470,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1532,7 +1514,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1582,7 +1563,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1632,7 +1612,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1724,7 +1703,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1785,7 +1763,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1825,7 +1802,6 @@ components: } } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1870,7 +1846,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1924,7 +1899,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -1974,7 +1948,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2025,7 +1998,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2066,7 +2038,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2159,7 +2130,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2213,7 +2183,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2281,7 +2250,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2346,7 +2314,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2394,7 +2361,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2439,7 +2405,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2491,7 +2456,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2546,7 +2510,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2601,7 +2564,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2658,7 +2620,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2731,7 +2692,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2794,7 +2754,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2837,7 +2796,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2877,7 +2835,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2917,7 +2874,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object @@ -2957,7 +2913,6 @@ components: } ``` - x-examples: {} allOf: - $ref: '#/components/schemas/webhook_callback_base' - type: object diff --git a/reference/widgets.v3.yml b/reference/widgets.v3.yml index 43753da09..43ac85d65 100644 --- a/reference/widgets.v3.yml +++ b/reference/widgets.v3.yml @@ -1643,7 +1643,6 @@ components: format: json description: The JSON data that populates the template. x-internal: false - x-examples: {} new-model: type: array items: @@ -1765,7 +1764,6 @@ components: description: A single-object array containing a value from the `typeMeta`'s `selectOptions`. items: {} x-internal: false - x-examples: {} widgetSchemaTabSections: type: object title: widgetSchemaTabSections From 1097e27f3e1582a19c9d3ccc79d1afc99d7c6442 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Thu, 9 May 2024 13:51:16 -0500 Subject: [PATCH 004/221] [GH-ISSUE] - [ #173] Order Product API does not return `order_product_id` (#193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5847] ## What changed? * Add note indicating that the response `id` is required when creating order shipments ## Release notes draft * Added a note to /v2/orders/{order_id}/shipments letting merchants know that the 'id' response is needed when creating order shipments. ## Anything else? ping {names} [DEVDOCS-5847]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5847?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter Co-authored-by: Sarah Riehl --- reference/orders.v2.oas2.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 73f698531..c138f8623 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -472,7 +472,10 @@ paths: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/order_id_path' get: - description: Lists 50 order products on an order using `order_id`. By default, items sort from lowest to highest according to a newly created ID, separate from the `order_id` and the `product_id`. + description: |- + Lists 50 order products on an order using `order_id`. By default, items are sorted from lowest to highest according to a newly created ID, separate from the `order_id` and the `product_id`. + + **Note**: The response `id` is required when you [create order shipments](/docs/store-operations/orders#creating-order-shipments). summary: List Order Products parameters: - $ref: '#/components/parameters/ContentType' From 67169d2edc5b40a45e4e93283d0ad299a2b31602 Mon Sep 17 00:00:00 2001 From: Shawn Yap <85641361+bc-shawnyap@users.noreply.github.com> Date: Fri, 10 May 2024 12:12:13 -0500 Subject: [PATCH 005/221] [Fix] Checkout Consignments: Content is not wrapping properly (#262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [[SELFDEV-166](https://bigcommercecloud.atlassian.net/browse/SELFDEV-166)] This PR fixes the content in checkout consignment "Create a consignment" rendering incorrectly. ## What changed? * Removed some leading indents causing the render component to render as a code block instead of the intended behavior ## Release notes draft * n/a ## Anything else? ping @slsriehl [SELFDEV-166]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-166?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/checkouts.sf.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index c509c3760..db730ca6e 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -1126,19 +1126,20 @@ paths: Adds a new *Consignment* to *Checkout*. Perform the following two steps to define the fulfillment of the items in the cart. - ### For **shipping** consignments: - 1. Add a new Consignment to Checkout. - * Send a `POST` request to `/consignments` with each shipping address, line item IDs, and quantities. Each address can have its own line item IDs. - * Provide a full valid customer address before placing the order. If provided, the order placement will succeed. - * As part of the request URL make sure to add `include=consignments.availableShippingOptions` to return the available shipping options based on the items, the address, and the shipping location. This will return `availableShippingOptions` in the response. + ### For **shipping** consignments: + 1. Add a new Consignment to Checkout. + * Send a `POST` request to `/consignments` with each shipping address, line item IDs, and quantities. Each address can have its own line item IDs. + * Provide a full valid customer address before placing the order. If provided, the order placement will succeed. + * As part of the request URL make sure to add `include=consignments.availableShippingOptions` to return the available shipping options based on the items, the address, and the shipping location. This will return `availableShippingOptions` in the response. * Required Fields: * `shipping_address` (deprecated) or `address` * `lineItems` - 2. Update the Consignment with Shipping Options using the [REST Storefront API](/checkouts/checkout-consignments#update-a-consignment), the [REST Management API](/docs/rest-management/checkouts/checkout-consignments#update-checkout-consignment) or the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). - - ### For **pickup** consignments: - 1. Create a new consignment object. + + 2. Update the Consignment with Shipping Options using the [REST Storefront API](/checkouts/checkout-consignments#update-a-consignment), the [REST Management API](/docs/rest-management/checkouts/checkout-consignments#update-checkout-consignment) or the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). + + ### For **pickup** consignments: + 1. Create a new consignment object. - Send a `POST` request to `/consignments` with line item IDs and quantities. - Provide a `pickupMethodId`. This is the `id` of the Pickup Method provided in the response body of the Storefront Pickup Options API. - Required Fields: From 118c822c853d9e8bec43c27b56f0368d74850b46 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Fri, 10 May 2024 13:25:38 -0500 Subject: [PATCH 006/221] [DEVDOCS-5931]: [update] Ordersv2, Remove outdated shipper from create order shipment list (#264) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5931] ## What changed? * Remove UPSOnline from the list of shippers ## Release notes draft * Create an order shipment no longer supports UPSOnline as a shipper ## Anything else? ping {names} [DEVDOCS-5931]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5931?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/orders.v2.oas2.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index c138f8623..b6c4f2824 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -643,7 +643,6 @@ paths: - `royalmail` - `ups` - `upsready` - - `upsonline` - `shipperhq` - `carrier_{your_carrier_id}`, when the carrier is a [third-party Shipping Provider](/docs/integrations/shipping) From 68b320640e465d6e84c684a17b9ff0fb1c7c77b4 Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Fri, 10 May 2024 13:38:07 -0500 Subject: [PATCH 007/221] Update customizing-printable-packing-slips.mdx (#261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # NO TICKET ## What changed? Fixing file format ## Release notes draft * ## Anything else? ping {names} --- .../developing-further/customizing-printable-packing-slips.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx b/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx index 5a99bacc5..2fe93dea2 100644 --- a/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx +++ b/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx @@ -87,7 +87,7 @@ If you were to use `%%GLOBAL_ShippingPhone%%` somewhere, then it should be enclo The `packing_slip_print.html` page contains three snippets in separate template files. The three files are as follows: * LogoImage.html/LogoText.html -* PrintableInvoiceItemConfigurableField +* PrintableInvoiceItemConfigurableField.html * PrintablePackingSlipItem.html From 6042c6747c22b7c19cf8536993d2c2c095a3a92f Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Fri, 10 May 2024 15:09:49 -0500 Subject: [PATCH 008/221] (no ticket): Orders V3, add schemas for alt request body mime types (#265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # (no ticket): Orders V3, add schemas for alt request body mime types ## What changed? * add xml and multipart schemas where indicated ## Release notes draft * ## Anything else? ping {names} --- reference/orders.v3.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index dae85f19f..f5b1dfbc6 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -176,12 +176,10 @@ paths: $ref: '#/components/schemas/RefundQuote_Post' application/xml: schema: - type: object - properties: {} + $ref: '#/components/schemas/RefundQuote_Post' multipart/form-data: schema: - type: object - properties: {} + $ref: '#/components/schemas/RefundQuote_Post' required: true x-examples: Quantity: From 2864c3c21ea5d062e695bc377546fd311a454289 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Mon, 13 May 2024 11:38:55 -0500 Subject: [PATCH 009/221] ISSUE-202: [update] Category object, add empty properties (#267) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # ISSUE-202: [update] Category object, add empty properties ## What changed? * Add empty properties to objects that didn't have them, per #202 ## Release notes draft * ## Anything else? ping @bc-traciporter --- models/_root/category.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/_root/category.yml b/models/_root/category.yml index 54c2e0071..e17de8912 100644 --- a/models/_root/category.yml +++ b/models/_root/category.yml @@ -11,6 +11,7 @@ properties: type: array items: type: object + properties: {} description: type: string description: Merchant-defined description of the category. @@ -19,6 +20,7 @@ properties: description: 'Message displayed when a product is out of stock, and inventory settings are configured to redirect to a category: "Sorry, the product you tried to view is currently out of stock, here are some similar products we have available." (This phrasing is set by the BigCommerce App.)' items: type: object + properties: {} faceted_search_enabled: type: boolean description: Boolean that defines whether product-filtering search is enabled for the store. @@ -27,6 +29,7 @@ properties: description: Available search facets. items: type: object + properties: {} id: type: integer description: Unique ID for the category. @@ -36,6 +39,7 @@ properties: type: array items: type: object + properties: {} name: type: string description: Merchant-defined category name. @@ -48,6 +52,7 @@ properties: description: Selected search facets. items: type: object + properties: {} shop_by_price: type: array description: 'Exposes price- and currency-related properties in both raw numeric, and formatted string, formats. It will return empty for stores with faceted search enabled who are not explicitly requesting this information in their front matter.' @@ -87,6 +92,7 @@ properties: type: array items: type: object + properties: {} subcategories: type: array description: List of any child categories. From 24825d9c99fe2109744f59726e6e1dfce84e3692 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Tue, 14 May 2024 14:41:48 -0500 Subject: [PATCH 010/221] DEVDOCS-5931 - Fix typo (#269) Fix typo from previous merge. --- reference/orders.v2.oas2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index b6c4f2824..c1c066146 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -636,7 +636,7 @@ paths: Acceptable values for `shipping_provider` include the following, and this list may be updated at any time: - `""`, an empty string - `auspost` - - `canadapost + - `canadapost` - `endicia` - `usps` - `fedex` From 8739e57a8c940b868822203350eb53738dfa72ef Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Wed, 15 May 2024 15:01:10 -0500 Subject: [PATCH 011/221] ISSUE-268: [update] Support options, update to reflect current resources (#271) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # ISSUE-268: [update] Support options, update to reflect current resources * #268 ## What changed? * Update the support options available to developers ## Release notes draft * We've updated our list of dev support options to include the Resource Hub. ## Anything else? ping @madisontillery @bc-traciporter --- docs/api-docs/partner/support.mdx | 32 +++++++++++-------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/docs/api-docs/partner/support.mdx b/docs/api-docs/partner/support.mdx index 7e8542725..6253d3f90 100644 --- a/docs/api-docs/partner/support.mdx +++ b/docs/api-docs/partner/support.mdx @@ -1,37 +1,27 @@ # Support - - -As a BigCommerce partner, you have access to a wide variety of support resources. This article outlines the different types of resources available to you. +When you're developing with BigCommerce, you have access to a variety of support resources. ## Developer community -The [Developer community](/community) is a hub for web developers working with BigCommerce APIs, creating a custom theme, or building a custom app or integration. Find answers, browse topics, and talk to other developers in this group. - -## Developer blog - -The [Developer blog](https://medium.com/bigcommerce-developer-blog) provides product, industry, how-to, and community information regularly. Find news, tips, and stories for developing on BigCommerce. - -## Developer library - -The [Developer library](https://developer.bigcommerce.com/dev-library) provides samples, tools, and guides to help jump-start the perfect ecommerce experience. Find examples and starters to help you begin working on BigCommerce. +The [developer community](/community) is a great place to connect with other developers building BigCommerce storefronts, apps, and integrations. You can learn more about upcoming events with our Dev Rel team and get connected with our social communities. -## Developer Slack +## Resource Hub -BigCommerce has a dedicated Slack channel for Technology and Agency partners. It is a great place to connect, learn about new updates, and attend “Ask Me Anything” sessions with the BigCommerce Product team members. To join the BigCommerce developer Slack community, fill out this [form](https://docs.google.com/forms/d/e/1FAIpQLSeQApTpd4T9lEX7hPgUjTyoq0vb8UbiCiWseuurJjdMHGBaGQ/viewform). +The [Resource Hub](/resource-hub) has blog posts, developer tools, and more to help jump-start the perfect ecommerce experience. Find examples and starters to help you begin working on BigCommerce. -## Changelog +## Release notes -[Changelog](/release-notes) is a log of notable updates made to the BigCommerce platform. In chronological order, find significant changes, such as new features, latest releases, and bug fixes. If you have an Atom or RSS client app, you can stay up-to-date with the Changelog updates by subscribing to the RSS feeds. To subscribe to all the publications or dedicated feeds, click the RSS feeds link at the bottom of the [news](https://bcdevchangelog.noticeable.news/) page to access the list of [feed URLs](https://bcdevchangelog.noticeable.news/feeds). +Our [release notes](/release-notes) catalog notable updates made to the BigCommerce platform and to the documentation. You can find significant changes, such as new features, latest releases, and bug fixes. -## BigCommerce Status +## BigCommerce status -[BigCommerce Status](https://status.bigcommerce.com/) provides information on the health of BigCommerce-operated services. View [incident history](https://status.bigcommerce.com/history) or subscribe to receive status alerts. +The [BigCommerce status](https://status.bigcommerce.com/) page provides information on the health of BigCommerce-operated services. View the [incident history](https://status.bigcommerce.com/history) or subscribe to receive status alerts. ## Town Hall -[BigCommerce Town Hall](https://support.bigcommerce.com/s/article/BigCommerce-Town-Halls) is a monthly webinar program where merchants and partners receive product and company updates and engage in a live Q&A with BigCommerce executive leadership. Recordings of previous Town Halls are available. +[BigCommerce Town Halls](https://support.bigcommerce.com/s/article/BigCommerce-Town-Halls) are a live quarterly series of calls that include product and company updates. Recordings of previous Town Halls are available. -## Partner Support Team +## Partner support team -You can access the Partner Support Team through the [Partner Portal](https://partners.bigcommerce.com/English/). Once you log into your Partner Portal account, hover over the **Support** tab located in the top right corner. Select **Contact Support** and you will be taken to a new page where you can **Create a Support Case** or use our **Live Chat** feature. +If you are a BigCommerce partner, you can access the partner support team through the [Partner Portal](https://partners.bigcommerce.com/English/). Once you sign in to your Partner Portal account, hover over the **Support** tab located in the top right corner. Select **Contact Support** and you will be taken to a new page where you can **Create a Support Case** or use our **Live Chat** feature. From 36f453150f0778baff82c594ec7dffd59ba4a994 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 17 May 2024 10:31:27 -0500 Subject: [PATCH 012/221] DEVDOCS-5898: Product reviews (#272) --- .../graphql/graphql-product-reviews.mdx | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 docs/api-docs/storefront/graphql/graphql-product-reviews.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-product-reviews.mdx b/docs/api-docs/storefront/graphql/graphql-product-reviews.mdx new file mode 100644 index 000000000..2933e38e0 --- /dev/null +++ b/docs/api-docs/storefront/graphql/graphql-product-reviews.mdx @@ -0,0 +1,181 @@ +# Product Reviews with the GraphQL Storefront API + +BigCommerce's GraphQL Storefront API allows you to create and query [product reviews](https://support.bigcommerce.com/s/article/Managing-Reviews) through the built-in comment system. + +## Store settings + +There are a few store settings to consider when creating a product review: + +- [Overall enable product reviews](https://support.bigcommerce.com/s/article/Managing-Reviews?language=en_US#enable) +- [Only accept product reviews from past customers](https://support.bigcommerce.com/s/article/Managing-Reviews?language=en_US#enable) +- [Enable reCAPTCHA](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) + +**Overall enable product reviews** + +The merchant must enable this overall setting for the review submission process. Turning off this setting cancels any attempts to submit reviews. + +**Only accept product reviews from past customers** + +When the merchant enables the 'Only accept product reviews from past customers' setting, only logged-in customers (not guest shoppers) can submit a review, and they must have at least one previous order placed in the store. +This setting ensures the merchant has a genuine customer to contact if needed. You can use the [login mutation](/docs/storefront/graphql#customer-login) to log in a customer. +After a purchase, customers can review any item in the store. The order doesn't have to include the reviewed product. + +When the merchant turns off the setting, guest shoppers can also submit reviews but they must provide an email. Since guests do not log in, they must supply the email in the request as an input parameter. +Logged-in customers don't need to provide the email through the input parameter, as the system will use the email from the customer's account. +If the logged-in customer provides an email as input, BigCommerce will validate the email against the email associated with the shopper's account. If the email doesn't match, the submission will fail. + +In all cases, you can create only one review per product an email address. + +**Enable reCAPTCHA** + +If a merchant enables the [reCAPTCHA setting](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) on the storefront, you need to send a reCAPTCHA token with the request. + +## Mutation + +The following mutation creates a product review for a store. + + + + + +```graphql filename="Example request: Create a product review" showLineNumbers copy +mutation { + catalog { + addProductReview ( + reCaptchaV2: "12345" + input: { + productEntityId: 81 + review: { + title: "Great product" + text: "Would recommend" + author: "example author" + rating: 4 # integer value between 1 and 5 + email: "name@example.com" + } + } + ){ + errors { + ...on NotAuthorizedToAddProductReviewError { + message + } + ...on CustomerAlreadyReviewedProductError { + message + } + ...on ProductIdNotFoundError { + message + } + ...on InvalidInputFieldsError { + message fields + } + ...on Error{ + message + } + } + } + } +} +``` + + + + +```json filename="Example success response: Create a product review" showLineNumbers copy +{ + "data": { + "catalog": { + "addProductReview": { + "errors": [] + } + } + } +} +``` + + + + + +## Query + + +You can query the product review with the `products` GraphQL node. + + + + +```graphql filename="Example request: Query a product review" showLineNumbers copy +query { + site { + products (entityIds: [81]) { + edges { + node { + reviews { + edges { + node { + entityId + author { + name + } + title + text + rating + createdAt { + utc + } + } + } + } + } + } + } + } +} +``` + + + + +```json filename="Example response: Query a product review" showLineNumbers copy +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "reviews": { + "edges": [ + { + "node": { + "entityId": 3, + "author": { + "name": "example author" + }, + "title": "Great product", + "text": "Would recommend", + "rating": 4, + "createdAt": { + "utc": "2024-05-15T15:16:30Z" + } + } + } + ] + } + } + } + ] + } + } + } +} +``` + + + + +## Resources + +- [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-storefront/playground) +- [Product Reviews (Support Article)](https://support.bigcommerce.com/s/article/Managing-Reviews) +- [Enabling reCAPTCHA (Support Article)](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) +- [GraphQL Storefront API Overview - Login mutation](/docs/storefront/graphql#customer-login) \ No newline at end of file From 353b03d934fa8861c3b9de85d9e4e85f33679406 Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Fri, 17 May 2024 10:54:29 -0500 Subject: [PATCH 013/221] DEVDOCS-5922: [Update] removed 500 status error code from metafield docs (#257) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5922] ## What changed? Removed 500 status code from metafield docs Carts Channels Customer Catalog Orders ## Release notes draft n/a * ## Anything else? ping {names} [DEVDOCS-5922]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5922?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Kamil Skomro <136105824+kskomro@users.noreply.github.com> --- reference/carts.v3.yml | 209 +++++++++++++---- reference/catalog/brands_catalog.v3.yml | 170 +++++++++++--- reference/catalog/categories_catalog.v3.yml | 170 +++++++++++--- .../catalog/product-variants_catalog.v3.yml | 171 +++++++++++--- reference/catalog/products_catalog.v3.yml | 170 +++++++++++--- reference/channels.v3.yml | 218 +++++++++++++++++- reference/customers.v3.yml | 199 +++++++++++++++- reference/orders.v3.yml | 129 ++++++++++- 8 files changed, 1257 insertions(+), 179 deletions(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index 4f71d7c4f..c44b748bc 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -808,20 +808,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetafieldResponse' - '409': - description: | - The `Metafield` conflicts with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '422': - description: | - The `Metafield` is not valid. This is the result of missing required fields or of invalid data. See the response for more details. - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' post: summary: Create a Cart Metafield tags: @@ -867,19 +853,43 @@ paths: "date_created": 2023-11-15T15:16:35+00:00 "date_modified": 2023-11-15T15:16:35+00:00 meta: {} - '404': + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '409': description: | - The resource was not found. + The `Metafield` conflicts with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. content: application/json: schema: - $ref: '#/components/schemas/NotFound' - examples: - example-1: - value: - status: 404 - title: There was no order found with ID 1010 - type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + $ref: '#/components/schemas/ErrorResponse' + '422': + description: The `Metafield` was not valid. This is the result of missing required fields, or of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' '/carts/{cart_id}/metafields/{metafield_id}': get: summary: Get a Cart Metafield @@ -895,22 +905,19 @@ paths: application/json: schema: $ref: '#/components/schemas/MetafieldResponse' - '409': - description: | - The `Metafield` conflicts with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorResponse' - '422': + '404': description: | - The `Metafield` is not valid. This is the result of missing required fields or of invalid data. See the response for more details. + Not found (A metafield was not found with this query). content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' - '500': - description: Internal Server Error + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -938,15 +945,39 @@ paths: responses: '200': description: | - A metafield and metadata. + A `Metafield` and metadata. content: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' examples: {} + '400': + description: Bad Request. Metafield is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | - The resource was not found. + The `Metafield` was not found. content: application/json: schema: @@ -955,8 +986,15 @@ paths: example-1: value: status: 404 - title: There was no order found with ID 1010 + title: The resource at that URL was not found. type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + '422': + description: | + Response object for metafields creation with partial success. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' delete: summary: Delete a Metafield tags: @@ -967,7 +1005,20 @@ paths: responses: '204': description: | - An empty response. + An empty response. + '404': + description: | + Not found (A metafield was not found with this query) + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/cart_id' @@ -992,8 +1043,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_Batch' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -1035,6 +1084,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_Batch_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1042,8 +1115,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple Metafields tags: @@ -1076,6 +1147,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_Batch_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1083,10 +1178,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete multiple Metafields tags: - Batch metafields description: Delete all cart metafields. @@ -1107,6 +1200,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index fef12c3ef..74f792785 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -941,27 +941,6 @@ paths: total_pages: 1 links: current: '?page=1&limit=50' - '404': - description: | - The resource was not found. - content: - application/json: - schema: - title: Not Found - type: object - properties: - status: - type: integer - description: | - 404 HTTP status code. - title: - type: string - description: The error title describing the particular error. - type: - type: string - instance: - type: string - description: Error payload for the BigCommerce API. post: tags: - Metafields @@ -1038,6 +1017,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '409': description: | The `Metafield` was in conflict with another `Metafield`. This can be the result of duplicate unique key combination of the appʼs client id, namespace, key, resource_type, and resource_id. @@ -1191,6 +1194,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | The resource was not found. @@ -1223,6 +1250,27 @@ paths: '204': description: '' content: {} + '404': + description: | + The resource was not found. + content: + application/json: + schema: + title: Not Found + type: object + properties: + status: + type: integer + description: | + 404 HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + instance: + type: string + description: Error payload for the BigCommerce API. parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/BrandIdPath' @@ -1354,8 +1402,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageQuery' - $ref: '#/components/parameters/LimitQuery' @@ -1399,6 +1445,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1406,8 +1476,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple metafields tags: @@ -1442,6 +1510,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1449,10 +1541,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Batch metafields description: Delete all brand metafields. @@ -1473,6 +1563,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 4aee7c0c6..a1263890c 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -979,27 +979,6 @@ paths: total_pages: 1 links: current: '?page=1&limit=50' - '404': - description: | - The resource was not found. - content: - application/json: - schema: - title: Not Found - type: object - properties: - status: - type: integer - description: | - 404 HTTP status code. - title: - type: string - description: The error title describing the particular error. - type: - type: string - instance: - type: string - description: Error payload for the BigCommerce API. post: tags: - Metafields @@ -1052,6 +1031,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '409': description: | The `Metafield` was in conflict with another `Metafield`. This can be the result of duplicate, unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. @@ -1204,6 +1207,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | The resource was not found. @@ -1236,6 +1263,27 @@ paths: '204': description: '' content: {} + '404': + description: | + The resource was not found. + content: + application/json: + schema: + title: Not Found + type: object + properties: + status: + type: integer + description: | + 404 HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + instance: + type: string + description: Error payload for the BigCommerce API. parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/CategoryIdParam' @@ -1450,8 +1498,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -1495,6 +1541,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1502,8 +1572,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple Metafields tags: @@ -1538,6 +1606,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1545,10 +1637,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Batch metafields description: Delete all category metafields. @@ -1569,6 +1659,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 1161758da..6f2d8b79f 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -557,27 +557,6 @@ paths: $ref: '#/components/schemas/metafield_Full' meta: $ref: '#/components/schemas/categoriesTree_Resp' - '404': - description: | - The resource was not found. - content: - application/json: - schema: - title: Not Found - type: object - properties: - status: - type: integer - description: | - 404 HTTP status code. - title: - type: string - description: The error title describing the particular error. - type: - type: string - instance: - type: string - description: Error payload for the BigCommerce API. post: tags: - Metafields @@ -630,6 +609,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '409': description: | The `Metafield` was in conflict with another `Metafield`. This can be the result of duplicate unique-key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. @@ -784,6 +787,30 @@ paths: date_created: '2018-09-13T16:42:37+00:00' date_modified: '2018-09-13T16:42:37+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | The resource was not found. @@ -816,6 +843,27 @@ paths: '204': description: '' content: {} + '404': + description: | + The resource was not found. + content: + application/json: + schema: + title: Not Found + type: object + properties: + status: + type: integer + description: | + 404 HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + instance: + type: string + description: Error payload for the BigCommerce API. parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/ProductIdPathParam' @@ -1619,8 +1667,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -1664,6 +1710,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1671,8 +1741,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple Metafields tags: @@ -1707,7 +1775,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' - + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1715,10 +1806,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete all metafields + summary: Delete multiple Metafields tags: - Batch metafields description: Delete all variant metafields. @@ -1739,6 +1828,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index f31d6f633..1c1bdb418 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -4079,27 +4079,6 @@ paths: total_pages: 1 links: current: '?page=1&limit=50' - '404': - description: | - The resource was not found. - content: - application/json: - schema: - title: Not Found - type: object - properties: - status: - type: integer - description: | - 404 HTTP status code. - title: - type: string - description: The error title describing the particular error. - type: - type: string - instance: - type: string - description: Error payload for the BigCommerce API. post: tags: - Metafields @@ -4149,6 +4128,30 @@ paths: date_created: '2018-09-13T16:42:37+00:00' date_modified: '2018-09-13T16:42:37+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '409': description: | The `Metafield` was in conflict with another `Metafield`. This can be the result of duplicate unique key combinations of the appʼs client ID, namespace, key, resource_type, and resource_id. @@ -4301,6 +4304,30 @@ paths: date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' meta: {} + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | The resource was not found. @@ -4333,6 +4360,27 @@ paths: '204': description: '' content: {} + '404': + description: | + The resource was not found. + content: + application/json: + schema: + title: Not Found + type: object + properties: + status: + type: integer + description: | + 404 HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + instance: + type: string + description: Error payload for the BigCommerce API. parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/ProductIdParam' @@ -5179,8 +5227,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -5222,6 +5268,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -5229,8 +5299,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update multiple Metafields tags: @@ -5263,6 +5331,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -5270,10 +5362,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Batch metafields description: Delete all product metafields. @@ -5294,6 +5384,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 08c32a641..1624fc18c 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -702,6 +702,44 @@ paths: responses: '200': $ref: '#/components/responses/metafield_200' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '409': + description: | + The `Metafield` conflicts with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '422': + description: | + The `Metafield` was not valid. This is the result of missing required fields, or of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' requestBody: content: application/json: @@ -730,6 +768,19 @@ paths: responses: '200': $ref: '#/components/responses/metafield_200' + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' operationId: getChannelMetafield description: Returns a single channel metafield. put: @@ -740,6 +791,43 @@ paths: responses: '200': $ref: '#/components/responses/metafield_200' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' requestBody: content: application/json: @@ -758,6 +846,19 @@ paths: responses: '204': description: No Content + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' tags: - Metafields description: Deletes a single channel metafield. @@ -776,8 +877,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -809,15 +908,36 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': - description: | - Response object for metafields creation with partial success. + description: Unprocessable entity (The following fields are invalid.) content: application/json: schema: - $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error + $ref: '#/components/schemas/ErrorResponse' put: summary: Update multiple Metafields tags: @@ -840,6 +960,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -847,10 +991,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Batch metafields description: Delete all channel metafields. @@ -871,6 +1013,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. @@ -2584,6 +2750,21 @@ components: example: "1": "Unauthorized to delete" "2": "Metafield does not exist" + ErrorResponse: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + instance: + type: string + errors: + type: object + properties: {} + additionalProperties: true CollectionMeta: type: object description: Data about the response, including pagination and collection totals. @@ -2776,6 +2957,23 @@ components: required: - id x-internal: false + NotFound: + description: Error payload for the BigCommerce API. + type: object + properties: + status: + description: | + 404 HTTP status code. + type: integer + title: + description: The error title describing the particular error. + type: string + type: + type: string + instance: + type: string + title: Not Found + x-internal: false PutCheckoutUrl: type: object properties: diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 40b6cbc05..37bc8bc6b 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -1680,8 +1680,6 @@ paths: responses: '200': $ref: '#/components/responses/MetafieldCollectionResponse' - '500': - description: Internal Server Error post: summary: Create Customer Metafields tags: @@ -1703,6 +1701,43 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionPostPutResponses' + '400': + description: Bad Request. Inupt is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '409': + description: | + The `Metafield` conflicts with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '422': + description: The `Metafield` was not valid. This is the result of missing required fields, or of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' '/customers/{customerId}/metafields/{metafieldId}': get: summary: Get Customer Metafields List @@ -1733,6 +1768,19 @@ paths: responses: '200': $ref: '#/components/responses/MetafieldCollectionResponse' + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' put: summary: Update a Metafield tags: @@ -1772,6 +1820,43 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionPostPutResponses' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' delete: summary: Delete Customer Metafields tags: @@ -1794,6 +1879,19 @@ paths: '204': description: | Response object for customer metafields deletion with success. + '404': + description: | + Not found (A metafield was not found with this query). + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + examples: + example-1: + value: + status: 404 + title: The resource at that URL is not found. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' '/customers/metafields': get: summary: Get All Customer Metafields @@ -1809,8 +1907,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' - '500': - description: Internal Server Error parameters: - $ref: '#/components/parameters/PageParam' - $ref: '#/components/parameters/LimitParam' @@ -1851,6 +1947,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionPostPutResponses' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1858,8 +1978,6 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error put: summary: Update Multiple Metafields tags: @@ -1891,6 +2009,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionPostPutResponses' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -1898,10 +2040,8 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' - '500': - description: Internal Server Error delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Customer Batch Metafields description: Delete all customer metafields. @@ -1922,6 +2062,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. @@ -4899,6 +5063,23 @@ components: $ref: '#/components/schemas/pagination_Full' description: Data about the response, including pagination and collection totals. x-internal: false + NotFound: + description: Error payload for the BigCommerce API. + type: object + properties: + status: + description: | + 404 HTTP status code. + type: integer + title: + description: The error title describing the particular error. + type: string + type: + type: string + instance: + type: string + title: Not Found + x-internal: false pagination_Full: title: pagination_Full type: object diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index f5b1dfbc6..db144d275 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -610,6 +610,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetafieldResponse' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '409': description: | The metafield conflicts with another metafield. This can result from duplicate unique key combinations of the appʼs client ID, namespace, key, resource type, and resource ID. @@ -684,6 +708,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetafieldResponse' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '404': description: | A metafield was not found with this query. @@ -702,6 +750,13 @@ paths: '204': description: | An empty response. + '404': + description: | + The resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' '/orders/settings': get: summary: Get Global Order Settings @@ -909,6 +964,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -948,6 +1027,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields creation with partial success. @@ -956,7 +1059,7 @@ paths: schema: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' delete: - summary: Delete All Metafields + summary: Delete Multiple Metafields tags: - Batch metafields description: Delete all order metafields. @@ -977,6 +1080,30 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error '422': description: | Response object for metafields deletion with partial success. From ac21aa912ce7e5f0015d427468abe13b8c0ab85b Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Fri, 17 May 2024 11:00:34 -0500 Subject: [PATCH 014/221] DEVDOCS-5917: [update] added missing image_url object (#270) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5917] ## What changed? Added missing `image_url` in the response body for the Create a Product Variant endpoint. ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5917]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5917?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- reference/catalog/product-variants_catalog.v3.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 6f2d8b79f..8b936c476 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -262,6 +262,7 @@ paths: fixed_cost_shipping_price: 0 purchasing_disabled: true purchasing_disabled_message: string + image_url: string upc: string inventory_level: 0 inventory_warning_level: 0 @@ -1985,6 +1986,9 @@ components: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. nullable: true + image_url: + type: string + description: Publicly available image url inventory_level: type: integer description: |- From d61c27691e0b3d90fd111da19ffa367860a69a61 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 17 May 2024 15:06:57 -0500 Subject: [PATCH 015/221] DEVDOCS-5627 [update]: Remark linter (#250) --- .github/actions/retext-style-guide/action.yml | 6 ++++++ .github/actions/retext-style-guide/entrypoint.sh | 3 ++- .github/workflows/retext-style-guide.yml | 8 +++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/actions/retext-style-guide/action.yml b/.github/actions/retext-style-guide/action.yml index 492e8d735..c63cc91e8 100644 --- a/.github/actions/retext-style-guide/action.yml +++ b/.github/actions/retext-style-guide/action.yml @@ -28,6 +28,12 @@ inputs: reviewdog_flags: description: 'Additional reviewdog flags' default: '' + before_commit: + description: 'Commit SHA before you triggered the event' + default: '${{ github.event.before }}' + after_commit: + description: 'Commit SHA after you triggered the event' + default: '${{ github.sha }}' runs: using: 'docker' image: 'Dockerfile' diff --git a/.github/actions/retext-style-guide/entrypoint.sh b/.github/actions/retext-style-guide/entrypoint.sh index fba219ff7..a51af7a3a 100755 --- a/.github/actions/retext-style-guide/entrypoint.sh +++ b/.github/actions/retext-style-guide/entrypoint.sh @@ -17,4 +17,5 @@ find ${GITHUB_WORKSPACE} -type f -name '*.mdx' -exec quality-docs {} + \ -fail-on-error="${INPUT_FAIL_ON_ERROR}" \ -level="${INPUT_LEVEL}" \ ${INPUT_REVIEWDOG_FLAGS} \ - -tee \ No newline at end of file + -tee \ + -diff="git diff --unified=0 ${INPUT_BEFORE_COMMIT} ${INPUT_AFTER_COMMIT}" \ No newline at end of file diff --git a/.github/workflows/retext-style-guide.yml b/.github/workflows/retext-style-guide.yml index 6f79a2474..158616ac0 100644 --- a/.github/workflows/retext-style-guide.yml +++ b/.github/workflows/retext-style-guide.yml @@ -5,9 +5,15 @@ jobs: name: runner / retext-style-guide runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: ./.github/actions/retext-style-guide with: github_token: ${{ secrets.GITHUB_TOKEN }} reporter: github-pr-review filter_mode: added + before_commit: ${{ github.event.before }} + after_commit: ${{ github.sha }} \ No newline at end of file From 785fc74ba9255a6305fe427196624100a986f082 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Mon, 20 May 2024 15:29:53 +0100 Subject: [PATCH 016/221] DEVDOCS-5907: [update] Pricing, change name:like from csv array to string (#278) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5907] Update "name:like=" parameter from array to string (Pricing API) ## What changed? * The name:like parameter is documented to accept an array, however it can only accept a string for price lists. ## Release notes draft * Provide accurate documentation as to what data type the name:like parameter accepts for Price Lists. ## Anything else? Confirmed by pricing team here: https://bigcommerce.slack.com/archives/C05DH8JCESU/p1713971423881579 [DEVDOCS-5907]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5907?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/price_lists.v3.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index 2125f860e..aab46a633 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -125,12 +125,8 @@ paths: type: integer - name: 'name:like' in: query - style: form - explode: false schema: - type: array - items: - type: string + type: string - name: 'date_created:max' in: query schema: From 587ab58cacd875478e6bb1a5f2c78bd2f7a1c086 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Mon, 20 May 2024 15:16:33 -0500 Subject: [PATCH 017/221] [DEVDOCS-5945]: [update] Customers, Update API examples and add contextual info (#275) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5945] ## What changed? * Added examples of POST/PUT requests for subscribers * Added information around the importance of `consents` determining whether a subscriber has opted in or not ## Release notes draft Currently there is ambiguity around what it means to be a subscriber or not. When a shopper is created during checkout, regardless a subscriber will be created (however they may not be opted in, a record exists regardless). ## Anything else? Related: doc(customers): CUST-2597 Customers-Subscribers overview page (#273) ping @bc-tgomez @bigcommerce/team-customers @slsriehl ### Original: [CUST-2597]: https://bigcommercecloud.atlassian.net/browse/CUST-2597?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ # [DEVDOCS-] ## What changed? * ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5945]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5945?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [CUST-2597]: https://bigcommercecloud.atlassian.net/browse/CUST-2597?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Matt Hill Co-authored-by: Sarah Riehl Co-authored-by: Traci Porter --- .../customers-subscribers-overview.mdx | 158 ++++++++++++------ 1 file changed, 110 insertions(+), 48 deletions(-) diff --git a/docs/api-docs/customers/customers-subscribers-overview.mdx b/docs/api-docs/customers/customers-subscribers-overview.mdx index b8a74f9e5..2491d40c3 100644 --- a/docs/api-docs/customers/customers-subscribers-overview.mdx +++ b/docs/api-docs/customers/customers-subscribers-overview.mdx @@ -1,4 +1,4 @@ -# Customers and Subscribers +# Customers and subscribers The following overview covers the authentication patterns and API endpoints that BigCommerce offers for customer management. @@ -13,25 +13,36 @@ For more information on available authentication methods, see [Authentication](/ ## What is a customer? -A customer is anyone who makes a purchase on a store and creates an account. BigCommerce stores an email address, customer address, and name against the customer as a record. There are two APIs you can use to manipulate customer data. You can extend the data for customer records using the custom [account sign-up form fields](/docs/rest-management/customers/customer-form-field-values#get-customer-form-field-values) and [customer attributes](/docs/rest-management/customers/customer-attributes#get-all-customer-attributes) endpoints (V3). +A customer is anyone who purchases from a store and creates an account. BigCommerce stores an email address, customer address, and name in the customer object. + +You can extend the data for customer records using [customer metafields](/docs/rest-management/customers/customer-batch-metafields), [custom account sign-up form fields](/docs/rest-management/customers/customer-form-field-values#get-customer-form-field-values), and [customer attributes](/docs/rest-management/customers/customer-attributes#get-all-customer-attributes) endpoints. + +You can use the following APIs to work with customer data and authentication: + +* [GraphQL Storefront API](/docs/storefront/graphql/customers) +* [REST storefront customers API](/docs/rest-storefront/customers) +* [REST management API V3 customers](/docs/rest-management/customers/addresses) +* [REST management API V2 customers](/docs/rest-management/customers-v2) +* [Customer login API](/docs/start/authentication/customer-login) +* [Current customer API](/docs/start/authentication/current-customer) ### Customer groups -Customer groups allow you to organize your customers, give them discounts, and restrict access to specific products or categories. For more information, see [Customer Groups](https://support.bigcommerce.com/s/article/Customer-Groups). +Customer groups let you organize customers, give them discounts, and restrict access to specific products or categories. For more information, see [Customer Groups (Help Center)](https://support.bigcommerce.com/s/article/Customer-Groups). - #### Customer groups by plan - Customer groups are only available on specific plans. See [BigCommerce Pricing](https://support.bigcommerce.com/s/article/Pricing) to learn more. + Customer groups are only available on specific plans. See [Pricing](https://support.bigcommerce.com/s/article/Pricing) to learn more. ## What is a subscriber? -A subscriber is someone who has signed up for a store's newsletter. The location of the sign-up field is in the footer of most storefront themes. +A subscriber is someone who signs up for a store's newsletter or abandoned cart emails. The sign-up field is located in the footer of most storefront themes. -Subscribers can also be added by: +You can also add subscribers in the following ways: -- Signing up for the newsletter during checkout -- Sending a `POST` request to the [Subscribers API](/docs/rest-management/subscribers) +- Exposing a newsletter sign-up field during checkout + +- Sending a request to the [Create a subscriber](/docs/rest-management/subscribers#create-a-subscriber) endpoint in the REST Management API Where possible, the API indicates the origin of the subscriber. When customers sign up for the newsletter using One-Page Checkout, the Order ID becomes part of the subscriber's record. When customers use Optimized One-Page Checkout, the customer becomes a subscriber before checking out, resulting in a subscriber record without an Order ID. @@ -45,28 +56,41 @@ Where possible, the API indicates the origin of the subscriber. When customers s Store [settings](https://support.bigcommerce.com/s/article/Checkout-Settings#checkout-settings) can be configured to allow a shopper to complete checkout without creating an account. These shoppers are not captured as customers or stored on BigCommerce. If you want to capture guest data, using the [Storefront APIs](/docs/storefront/cart-checkout/guide/rest-management) can help. -## Customer Login API +## Customer login API + +The [Customer login API](/docs/start/authentication/customer-login) allows single sign-on. Once a customer has authenticated by logging in to a third-party system (CMS, portal, or app), you can use the Customer login API to seamlessly log the customer into their BigCommerce customer account. -The [Customer Login API](/docs/start/authentication/customer-login) allows for single sign-on. Once a customer has authenticated by logging in to a third-party system (CMS, portal, or app), you can use the Customer Login API to seamlessly log the customer into their BigCommerce customer account. -## Current Customer API +## Current customer API -The [Current Customer API](/docs/start/authentication/current-customer) allows your application to identify logged-in customers. This identification is useful when you need to show customer-specific information. +The [Current customer API](/docs/start/authentication/current-customer) allows your application to identify logged-in customers. This identification is useful when you need to show customer-specific information. ## Customers API -There are two Customers API endpoints available: +The following endpoints are available: + +**GraphQL API** +- Customers GraphQL API + +**REST API** +- V3 customers REST API +- V2 customers REST API + +### V3 customers API + +The [V3 customers API](/docs/rest-management/customers) consists of customers, customer address books, [customer attributes](/docs/rest-management/customers/attributes), customer addresses, customer form fields, and other endpoints that help manage the customer object. -- V3 Customers API -- V2 Customers API -### V3 Customers API +A customer can purchase from a store and create an account. The `customers` object comprises both customer details and a customer address book. -The [V3 Customers API](/docs/rest-management/customers) is comprised of customers, customer attributes, customer address, and customer form fields. +Customer details include data preferences, attribute fields, form fields, and authentication. The V3 customers API can accomplish the same tasks as the existing V2 customers API, with greater efficiency. -A customer makes a purchase on a store and creates an account. The customers object comprises a customer's address, attributes, form fields and authentication. The V3 Customers API can accomplish the same tasks as the existing V2 Customers API, with greater efficiency. -[Customer Attributes](/docs/rest-management/customers/customer-attributes) and [Customer Attribute Values](/docs/rest-management/customers/customer-attribute-values) let you store additional information against a customer. Customer Attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer Attribute Values endpoint lets you define the values for the attributes. +The customer address book stores a collection of addresses entered by the customer. Add an address to capture the customer address details where you can ship orders if selected. + + +[Customer attributes](/docs/rest-management/customers/customer-attributes) and [Customer attribute values](/docs/rest-management/customers/customer-attribute-values) let you store additional information against a customer. Customer attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer attribute values endpoint lets you define the values for the attributes. + #### Name-value pairs @@ -77,29 +101,32 @@ Customer attributes are created separately from the customer. After the name and [Customer addresses](/docs/rest-management/customers/customer-addresses) consist of a customers address and phone number. Customers can have multiple addresses stored against them. -[Customer form field values](/docs/rest-management/customers/customer-form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account Signup Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). +[Customer form field values](/docs/rest-management/customers/customer-form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account sign up Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). You can access and edit the values for the fields on customer and customer address records using the API. ### V2 Customers API -The V2 Customers API is comprised of customers, customer addresses, and customer groups. The customers object is comprised of basic customer information such as customer name and phone number. +The [V2 customers API](/docs/rest-management/customers-v2) consists of customers, customer addresses, and customer groups. The customer's object consists of basic customer information such as customer name and phone number. + [Customer addresses](/docs/rest-management/customers-v2/customer-addresses) consist of a customer's address and phone number. Customers can have multiple addresses stored against them. -[Customer groups](/docs/rest-management/customers-v2/customer-groups) allow you to organize your customers, give them discounts, and restrict access to specific products or categories. Customer groups are not yet available on the V3 Customers API. +[Customer groups](/docs/rest-management/customers-v2/customer-groups) let you organize your customers, give them discounts, and restrict access to specific products or categories. Customer groups are not yet available on the V3 customers API. -## Differences between V2 and V3 Customers APIs -When resources are available through both APIs, we recommend using the V3 Customers API as BigCommerce will eventually migrate all existing V2 resources to V3. +## Differences between V2 and V3 customers APIs -This section covers the important differences between V2 and V3 Customers APIs. +When resources are available through both APIs, we recommend using the V3 customers API as BigCommerce will eventually migrate all existing V2 resources to V3. + +This section covers the important differences between V2 and V3 customers APIs. ### Making requests -The V3 Customers API is easier to use. It reduces the number of API calls needed to accomplish a task. For example, to create a new customer with the V2 API, you have to make multiple API calls. With the V3 API, you can create customer attributes and address in one step, allowing you to batch create multiple customers and their subresources in a single API call. +The V3 customers API is easier to use. It reduces the number of API calls needed to accomplish a task. For example, to create a new customer with the V2 API, you have to make multiple API calls. With the V3 API, you can create customer attributes and their address in one step, allowing you to batch-create multiple customers and their subresources in a single API call. **Create a customer** + Single customer on V3: -`/customers` @@ -111,7 +138,7 @@ Single customer on V2: ### Queries -With the V3 Customers API, queries become a powerful tool. There is one `GET` endpoint per resource with filters to refine the request. The V2 API necessitates using a different endpoint to get customer subresources. +With the V3 customers API, queries become a powerful tool. There is one `GET` endpoint per resource with filters to refine the request. The V2 API necessitates using a different endpoint to get customer subresources. **Get customer addresses** Get customer address by name and company on V3: @@ -126,7 +153,7 @@ Get customer address by name and company on V2: V3 Customers `POST` and `PUT` requests require an array object. -```http filename="Example request: Update a customer V3" showLineNumbers +```http filename="Example request: Update a customer V3" showLineNumbers copy PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers X-Auth-Token: {{ACCESS_TOKEN}} Content-Type: application/json @@ -142,7 +169,7 @@ Accept: application/json ] ``` -```http filename="Example request: Update a Customer V2" showLineNumbers +```http filename="Example request: Update a customer V2" showLineNumbers copy PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/customer_groups/{{customer_group_id}} X-Auth-Token: {{ACCESS_TOKEN}} Content-Type: application/json @@ -157,49 +184,84 @@ Accept: application/json ### Upsert -You can use the V3 Customers API [Upsert Customer Attribute Values](/docs/rest-management/customers/customer-attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. +You can use the V3 customers API [Upsert customer attribute values](/docs/rest-management/customers/customer-attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. ### Authentication object -The V3 Customers API offers two ways to set a customer's password: +The V3 customers API offers two ways to set a customer's password: - You can set a new password under the `authentication > new_password` object in a `PUT` or `POST` request. - To prompt a customer to reset their password, set `force_password_reset` to `true` under `authentication > new_password` object in a `PUT` or `POST` request. -[Password confirmation](/docs/rest-management/subscribers#create-a-subscriber) and [validation](/docs/rest-management/customers-v2/customer-passwords#validate-a-password) are still available under the V2 Customers API. +[Password confirmation](/docs/rest-management/subscribers#create-a-subscriber) and [validation](/docs/rest-management/customers-v2/customer-passwords#validate-a-password) are still available under the V2 customers API. ## Subscribers API -The Subscribers API allows you to manage subscribers who have signed up for the store’s newsletter. +The subscribers API allows you to manage subscribers who have signed up for the store’s newsletter or have signed up for abandoned cart emails. +An important field to note is `consents` - this field determines whether the Subscriber signed up for marketing newsletter emails, abandoned cart emails, or both. This field can also be empty, meaning they have not subscribed to either (or may have opted out). -## FAQ -**Which API should I use?** +```http filename="Example request: Create a subscriber V3" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json -When possible, use the V3 Customers API as BigCommerce will eventually deprecate the existing V2 Customers API. +{ + "email": "string@test.com", + "first_name": "string", + "last_name": "string", + "channel_id": 1, + "consents": ["marketing_newsletter", "abandoned_cart"], + "source": "storefront" +} +``` -**How can I validate customer passwords?** +```js filename="Example request: Update a subscriber V3" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers/1 +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json -Password validation is only available on the V2 Customers API at this time. We recommend using the V3 Customers API to reset or input a new password as BigCommerce intends to deprecate the V2 Customers API. +{ + "email": "string@test.com", + "first_name": "string", + "last_name": "string", + "channel_id": 1, + "consents": [], + "source": "order" +} +``` ## Related resources ### Articles -* [Adding and Editing Fields in the Account Signup Form (Help Center)](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields) +* [Adding and Editing Fields in the Account sign up Form (Help Center)](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields) * [Checkout Settings (Help Center)](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout#checkout-settings) -### Endpoints +### API * [Customer Login API](/docs/start/authentication/customer-login) * [Current Customer API](/docs/start/authentication/current-customer) -* [Customers V3 API](/docs/rest-management/customers) -* [Customer Groups](/docs/rest-management/customers-v2/customer-groups#get-all-customer-groups) (Customers V2 API) -* [Password Validation](/docs/rest-management/customers-v2/customer-passwords#validate-a-password) (Customers V2 API) -* [Password Confirmation](/docs/rest-management/customers-v2#create-a-new-customer) (Customers V2 API) -* [Storefront Subscriptions](/docs/rest-storefront/subscriptions) -* [Subscribers API](/docs/rest-management/subscribers) + +#### REST storefront API + +* [Customers](/docs/rest-storefront/customers) +* [Cookie consents](/docs/rest-storefront/consent) +* [Subscriptions](/docs/rest-storefront/subscriptions) + +#### REST management API V3 + +* [Customers](/docs/rest-management/customers) +* [Subscribers](/docs/rest-management/subscribers) +* [Validate customer credentials](/docs/rest-management/customers/validate-credentials#validate-a-customer-credentials) +* [Customer segmentation](/beta/customer-segmentation/rest-management) + +#### REST management API V2 + +* [Customer groups](/docs/rest-management/customers-v2/customer-groups#get-all-customer-groups) ### Webhooks -* [Customer](/docs/integrations/webhooks/events#customer) +* [Customers](/docs/integrations/webhooks/events#customer) From 8e89b1da5ee521def45dc67d0527b2c98ee8b163 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Tue, 21 May 2024 10:58:42 -0500 Subject: [PATCH 018/221] ISSUE-280 + ISSUE-281: [update] Product variant metafields, reorder fields + populate response example (#282) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # ISSUE-280 + ISSUE-281: [update] Product variant metafields, reorder fields + populate response example * #280 * #281 ## What changed? * Reorder fields in the several product variant metafields responses * Populate response body by removing required and readOnly fields from response schema ## Release notes draft * ## Anything else? ping @atensoftware @bc-tgomez --- .../catalog/product-variants_catalog.v3.yml | 165 ++++++++---------- 1 file changed, 76 insertions(+), 89 deletions(-) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 8b936c476..616d23bcb 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1655,7 +1655,7 @@ paths: - $ref: '#/components/parameters/Accept' '/catalog/variants/metafields': get: - summary: Get All Product Variant Metafields + summary: Get all product variant metafields tags: - Batch metafields description: Get all variant metafields. @@ -2506,9 +2506,33 @@ components: Metafield: type: object description: | - Common Metafield properties. + Common metafield properties. x-internal: false properties: + id: + type: integer + description: The unique identifier for the metafield. + key: + type: string + description: | + The name of the field, for example: `location_id`, `color`. + minLength: 1 + maxLength: 64 + example: Staff Name + value: + type: string + description: | + The value of the field, for example: `1`, `blue`. + minLength: 1 + maxLength: 65535 + example: Ronaldo + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 permission_set: type: string description: | @@ -2526,34 +2550,6 @@ components: - write - read_and_sf_access - write_and_sf_access - namespace: - type: string - description: | - Namespace for the metafield, for organizational purposes. - example: Sales Department - minLength: 1 - maxLength: 64 - key: - type: string - description: | - The name of the field, for example: `location_id`, `color`. - minLength: 1 - maxLength: 64 - example: Staff Name - value: - type: string - description: | - The value of the field, for example: `1`, `blue`. - minLength: 1 - maxLength: 65535 - example: Ronaldo - description: - type: string - description: | - Description for the metafields. - example: order - minLength: 0 - maxLength: 255 resource_type: type: string description: | @@ -2574,10 +2570,13 @@ components: description: | The unique identifier for the resource with which the metafield is associated. example: 424242 - readOnly: true - id: - type: integer - description: The unique identifier for the metafield. + description: + type: string + description: | + Description for the metafields. + example: order + minLength: 0 + maxLength: 255 date_created: type: string format: date-time @@ -2592,18 +2591,6 @@ components: type: string description: Client ID for the metafieldʼs creator. example: asdfasdfasdfasdfasdfasdfasdf - readOnly: true - required: - - namespace - - key - - value - - permission_set - - resource_type - - resource_id - - description - - id - - date_created - - date_modified MetaFieldCollectionResponse: type: object description: | @@ -2837,9 +2824,30 @@ components: MetafieldBase_Post: type: object description: | - Common Metafield properties. + Common metafield properties. x-internal: false properties: + key: + type: string + description: | + The name of the field, for example: `location_id`, `color`. + minLength: 1 + maxLength: 64 + example: Staff Name + value: + type: string + description: | + The value of the field, for example: `1`, `blue`. + minLength: 1 + maxLength: 65535 + example: Ronaldo + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 permission_set: type: string description: | @@ -2857,13 +2865,24 @@ components: - write - read_and_sf_access - write_and_sf_access - namespace: + description: type: string description: | - Namespace for the metafield, for organizational purposes. - example: Sales Department - minLength: 1 - maxLength: 64 + Description for the metafields. + minLength: 0 + maxLength: 255 + example: Name of Staff Member + required: + - key + - value + - namespace + - permission_set + MetafieldBase_Put: + type: object + description: | + Common Metafield properties. + x-internal: false + properties: key: type: string description: | @@ -2878,24 +2897,13 @@ components: minLength: 1 maxLength: 65535 example: Ronaldo - description: + namespace: type: string description: | - Description for the metafields. - minLength: 0 - maxLength: 255 - example: Name of Staff Member - required: - - permission_set - - namespace - - key - - value - MetafieldBase_Put: - type: object - description: | - Common Metafield properties. - x-internal: false - properties: + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 permission_set: type: string description: | @@ -2913,27 +2921,6 @@ components: - write - read_and_sf_access - write_and_sf_access - namespace: - type: string - description: | - Namespace for the metafield, for organizational purposes. - example: Sales Department - minLength: 1 - maxLength: 64 - key: - type: string - description: | - The name of the field, for example: `location_id`, `color`. - minLength: 1 - maxLength: 64 - example: Staff Name - value: - type: string - description: | - The value of the field, for example: `1`, `blue`. - minLength: 1 - maxLength: 65535 - example: Ronaldo description: type: string description: | From 1fbbe189f1538a31414cf52fb80155539634012d Mon Sep 17 00:00:00 2001 From: Riccardo <147587711+smcc-riccardoc@users.noreply.github.com> Date: Tue, 21 May 2024 18:42:20 +0200 Subject: [PATCH 019/221] ISSUE-274: [fix] Remove duplicate parameters (#283) ## What changed? * remove duplicated parameters (as #274) * mark request body for `updateProducts` operation as required ## Release notes draft This PR actually fixes a little more than what is reported in #274. During development I noticed another problem (see commit 32bfcbb) which I decided to fix immediately instead of opening another issue. Feel free to discard this commit when merging the PR if that `required: false` is not an error. ping @slsriehl @bc-tgomez --------- Co-authored-by: Sarah Riehl --- reference/catalog/products_catalog.v3.yml | 1 - reference/customers.v3.yml | 6 ------ reference/orders.v2.oas2.yml | 5 ----- reference/themes.v3.yml | 14 -------------- reference/widgets.v3.yml | 7 ------- 5 files changed, 33 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 1c1bdb418..876b36594 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -262,7 +262,6 @@ paths: id: 0 product_id: 0 length: string - required: false responses: '200': description: '' diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 37bc8bc6b..383b724f4 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -1656,12 +1656,6 @@ paths: example: code: 403 message: Missing scope - parameters: - - schema: - type: string - name: customerId - in: path - required: true '/customers/{customerId}/metafields': get: summary: Get Customer Metafields diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index c1c066146..619be15c9 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -922,11 +922,6 @@ paths: operationId: getOrderShippingAddressShippingQuotes '/orders/{order_id}/consignments': parameters: - - schema: - type: string - name: order_id - in: path - required: true - name: include in: query description: |- diff --git a/reference/themes.v3.yml b/reference/themes.v3.yml index 63823d9e5..41e2b78a4 100644 --- a/reference/themes.v3.yml +++ b/reference/themes.v3.yml @@ -547,20 +547,6 @@ paths: description: Filter configurations by a variation_uuid schema: type: string - - name: page - description: | - Specifies the page number in a limited (paginated) list. - required: false - in: query - schema: - type: integer - - name: limit - description: | - Controls the number of items per page in a limited (paginated) list of products. - required: false - in: query - schema: - type: integer '/themes/{uuid}/configurations/validate': post: parameters: diff --git a/reference/widgets.v3.yml b/reference/widgets.v3.yml index 43ac85d65..7c5fead88 100644 --- a/reference/widgets.v3.yml +++ b/reference/widgets.v3.yml @@ -166,13 +166,6 @@ paths: description: Not Found '422': description: Unprocessable Entity - parameters: - - schema: - type: string - name: uuid - in: path - required: true - description: The identifier for a specific widget. '/content/widget-templates/{uuid}': get: tags: From 7ec6a6cfae9058462e546e1ec8fed50b138979fa Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 21 May 2024 11:47:42 -0500 Subject: [PATCH 020/221] DEVDOCS-5912 [new]: International Enhancements for MSF, add webhooks (#252) --- docs/api-docs/webhooks/webhook-events.mdx | 91 +++++++- models/webhooks/_all.yml | 234 ++++++++++++++------- models/webhooks/store_modifier_updated.yml | 42 ++++ models/webhooks/store_option_updated.yml | 41 ++++ models/webhooks/store_product_updated.yml | 19 +- 5 files changed, 346 insertions(+), 81 deletions(-) create mode 100644 models/webhooks/store_modifier_updated.yml create mode 100644 models/webhooks/store_option_updated.yml diff --git a/docs/api-docs/webhooks/webhook-events.mdx b/docs/api-docs/webhooks/webhook-events.mdx index 755da8990..1c14c2841 100644 --- a/docs/api-docs/webhooks/webhook-events.mdx +++ b/docs/api-docs/webhooks/webhook-events.mdx @@ -439,10 +439,65 @@ Payload objects with the following scopes take the form that follows: "producer": "stores/{store_hash}" } ``` + +## Modifiers + +| Name / Scope | Description | +|:-------------------------|:------------| +| store/modifier/updated | Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. | + +The payload object takes the form that follows: + +```json filename="Example modifier payload object" showLineNumbers copy +{ + "scope": "store/modifier/updated", + "store_id": "1025646", + "data": { + "type": "shared_modifier", + "id": 205, // ID of the modifier + "affected_product_ids": [1, 2], + "context": { + "channel_id": 2, + "locale": "fr" + } + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" +} +``` + ## Notifications Consult the [notifications section of the Channel Webhooks Guide](/docs/integrations/webhooks/events/channels#notifications). +## Options + +| Name / Scope | Description | +|:-------------------------|:------------| +| store/option/updated | Fires when you edit attributes for a local or shared variant option, including its display name and option values. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. | + +The payload object takes the form that follows: + +```json filename="Example option payload object" showLineNumbers copy +{ + "scope": "store/option/updated", + "store_id": "1025646", + "data": { + "type": "local_option", + "id": 205, // ID of the option + "affected_product_ids": [1, 2], + "context": { + "channel_id": 2, + "locale": "fr" + } + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" +} +``` + ## Orders @@ -749,7 +804,7 @@ Consult the [product assignment section of the Channel Webhooks Guide](/docs/int | store/product/* | Fires for all store/product events. | | store/product/deleted| Fires when a product is deleted.| | store/product/created | Fires when a new product is created. | -| store/product/updated | Fires when product details are edited. For a full list of product fields that trigger an updated event, consult the following section on [product updated events](#product-update-events). | +| store/product/updated | Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the [product updated events](#product-update-events) that follow. The `context` fields are present for only override updates. | | store/product/inventory/updated | Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory.

For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes.

Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. | | store/product/inventory/order/updated | Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel.

The webhook always fires for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _product_. | | store/product/metafield/* | Fires for all store/product/metafield events. | @@ -765,7 +820,6 @@ Payload objects with the following scopes take the form that follows: * `store/product/deleted` * `store/product/created` -* `store/product/updated` ```json filename="Example product payload object" showLineNumbers copy { @@ -773,13 +827,37 @@ Payload objects with the following scopes take the form that follows: "store_id": "1025646", "data": { "type": "product", // will always be product - "id": 205 // ID of the product + "id": 205, // ID of the product }, "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", "created_at": 1561479233, "producer": "stores/{store_hash}" } ``` + +Payload objects with the following scopes take the form that follows: + +* `store/product/updated` + +```json filename="Example product payload object" showLineNumbers copy +{ + "scope": "store/product/updated", + "store_id": "1025646", + "data": { + "type": "product", // will always be product + "id": 205, // ID of the product + "properties": ["warranty", "is_featured"], + "context": { + "channel_id": 2, + "locale": "fr" + } + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" +} +``` + ### Product update events A change to any of the following fields triggers a `store/product/updated` event: @@ -792,15 +870,21 @@ A change to any of the following fields triggers a `store/product/updated` event * Dimensions * Featured * Inventory +* Is Featured +* Meta Description * Modifier - deleted * Name * Number Sold +* Page Title +* Pre-order Message * Price * Product Type +* Search Keywords * Sort Order * Tax Price * Thumbnail - new images only* * Visibility +* Warranty Setting a thumbnail triggers an updated event only when that thumbnail is the first to be set. For example, setting an image as a thumbnail **after deleting all images** triggers an updated event. However, changing the current thumbnail, uploading an additional product image and setting it as the thumbnail, or even deleting all thumbnails, does not generate an update event. @@ -1078,6 +1162,7 @@ Payload objects with the following scopes take the form that follows: Consult the [themes section of the Channel Webhooks Guide](/docs/integrations/webhooks/events/channels#themes). + ## Resources ### Related articles diff --git a/models/webhooks/_all.yml b/models/webhooks/_all.yml index 9dc5c1f7e..c9bd51905 100644 --- a/models/webhooks/_all.yml +++ b/models/webhooks/_all.yml @@ -5,37 +5,44 @@ properties: store/app/uninstalled: description: Fires when a client store is cancelled and uninstalled from the platform. type: object - allOf: + properties: + allOf: - $ref: ./store_app_uninstalled.yml store/brand/metafield/created: description: Fires when a new brand metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_brand_metafield_created.yml store/brand/metafield/deleted: description: Fires when a brand metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_brand_metafield_deleted.yml store/brand/metafield/updated: description: Fires when a brand metafield is modified. type: object - allOf: + properties: + allOf: - $ref: ./store_brand_metafield_updated.yml store/cart/abandoned: description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_abandoned.yml store/cart/converted: description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_converted.yml store/cart/couponApplied: description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_couponApplied.yml store/cart/created: description: |- @@ -46,7 +53,8 @@ properties: The store/cart/updated webhook fires simultaneously with store/cart/created. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_created.yml store/cart/deleted: description: |- @@ -57,37 +65,44 @@ properties: The store/cart/updated webhook fires simultaneously with store/cart/deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_deleted.yml store/cart/lineItem/created: description: Fires when a new item is added to a cart. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_lineItem_created.yml store/cart/lineItem/deleted: description: Fires when an item is deleted from a cart. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_lineItem_deleted.yml store/cart/lineItem/updated: description: Fires when a line item’s quantity or product options change. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_lineItem_updated.yml store/cart/metafield/created: description: Fires when a new cart metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_metafield_created.yml store/cart/metafield/deleted: description: Fires when a cart metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_metafield_deleted.yml store/cart/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_metafield_updated.yml store/cart/updated: description: |- @@ -102,204 +117,250 @@ properties: The payload includes the ID of the cart being updated. type: object - allOf: + properties: + allOf: - $ref: ./store_cart_updated.yml store/category/created: description: Fires when a new category is created. type: object - allOf: + properties: + allOf: - $ref: ./store_category_created.yml store/category/deleted: description: Fires when a category is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_category_deleted.yml store/category/updated: description: Fires when a category is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_category_updated.yml store/category/metafield/created: description: Fires when a new cart metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_category_metafield_created.yml store/category/metafield/deleted: description: Fires when a cart metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_category_metafield_deleted.yml store/category/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object - allOf: + properties: + allOf: - $ref: ./store_category_metafield_updated.yml store/channel/metafield/created: description: Fires when a metafield is created per a specified channel. type: object - allOf: + properties: + allOf: - $ref: ./store_channel_metafield_created.yml store/channel/metafield/deleted: description: Fires when a metafield is deleted per a specified channel. type: object - allOf: + properties: + allOf: - $ref: ./store_channel_metafield_deleted.yml store/channel/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object - allOf: + properties: + allOf: - $ref: ./store_channel_metafield_updated.yml store/customer/address/created: description: Fires when a customer address is created. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_address_created.yml store/customer/address/deleted: description: Fires when a customer address is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_address_deleted.yml store/customer/address/updated: description: Fires when a customer address is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_address_updated.yml store/customer/created: description: Fires when a new customer is created. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_created.yml store/customer/deleted: description: Fires when a customer is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_deleted.yml store/customer/payment/instrument/default/updated: description: Fires when a customerʼs default payment instrument is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_payment_instrument_default_updated.yml store/customer/updated: description: Fires when a customer is updated. It does not currently track changes to the customer address.

Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. type: object - allOf: + properties: + allOf: - $ref: ./store_customer_updated.yml store/information/updated: description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. type: object - allOf: + properties: + allOf: - $ref: ./store_information_updated.yml store/inventory/location/created: description: Fires when a location is created. type: object - allOf: + properties: + allOf: - $ref: ./store_inventory_location_created.yml store/inventory/location/updated: description: Fires when a location is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_inventory_location_updated.yml store/inventory/location/metafield/created: description: Fires when a new inventory location metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_inventory_location_metafield_created.yml store/inventory/location/metafield/deleted: description: Fires when an inventory location metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_inventory_location_metafield_deleted.yml store/inventory/location/metafield/updated: description: Fires when an existing inventory location metafield is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_inventory_location_metafield_updated.yml store/metafield/created: description: Fires whenever a new metafield on any object is created. type: object - allOf: + properties: + allOf: - $ref: ./store_metafield_created.yml store/metafield/deleted: description: Fires whenever a metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_metafield_deleted.yml store/metafield/updated: description: Fires when an already created metafield is updated. Any changes to an existing metafield on any object (such as inventory, carts, brands, categories, channels, orders, ShipperHQ, etc.) will fire this webhook. type: object - allOf: + properties: + allOf: - $ref: ./store_metafield_updated.yml - store/option/updated.yml: + store/modifier/updated: + description: Fires when product modifier overrides are edited. + type: object + properties: + allOf: + - $ref: ./store_modifier_updated.yml + store/option/updated: description: Fires when product options overrides are edited. type: object - allOf: + properties: + allOf: - $ref: ./store_option_updated.yml store/order/archived: description: Fires when an order is archived. type: object - allOf: + properties: + allOf: - $ref: ./store_order_archived.yml store/order/created: description: Fires when an order is created either in the control panel or by API. type: object - allOf: + properties: + allOf: - $ref: ./store_order_created.yml store/order/message/created: description: Fires when an order message is created by a customer or using the control panel. type: object - allOf: + properties: + allOf: - $ref: ./store_order_message_created.yml store/order/metafield/created: description: Fires if an order metafield is created using the control panel, an app, or the API. type: object - allOf: + properties: + allOf: - $ref: ./store_order_metafield_created.yml store/order/metafield/deleted: description: Fires when an order metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_order_metafield_deleted.yml store/order/metafield/updated: description: Fires when an existing order metafield is updated. Any changes to an existing order metafield will fire this webhook. type: object - allOf: + properties: + allOf: - $ref: ./store_order_metafield_updated.yml store/order/refund/created: description: Fires when a refund is submitted against an order. type: object - allOf: + properties: + allOf: - $ref: ./store_order_refund_created.yml store/order/statusUpdated: description: Fires when the order status has changed, such as from Pending to Awaiting Payment. type: object - allOf: + properties: + allOf: - $ref: ./store_order_statusUpdated.yml store/order/transaction/created: description: Fires when an order transaction is created. type: object - allOf: + properties: + allOf: - $ref: ./store_order_transaction_created.yml store/order/transaction/updated: description: Fires when an order transaction is changed. type: object - allOf: + properties: + allOf: - $ref: ./store_order_transaction_updated.yml store/order/updated: description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. type: object - allOf: + properties: + allOf: - $ref: ./store_order_updated.yml store/product/created: description: Fires when new product is created. type: object - allOf: + properties: + allOf: - $ref: ./store_product_created.yml store/product/deleted: description: Fires when a product is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_product_deleted.yml store/product/inventory/order/updated: description: |- @@ -307,7 +368,8 @@ properties: The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. type: object - allOf: + properties: + allOf: - $ref: ./store_product_inventory_order_updated.yml store/product/inventory/updated: description: |- @@ -317,67 +379,80 @@ properties: Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. type: object - allOf: + properties: + allOf: - $ref: ./store_product_inventory_updated.yml store/product/metafield/created: description: Fires when a new product metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_product_metafield_created.yml store/product/metafield/deleted: description: Fires when a product metafield is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_product_metafield_deleted.yml store/product/metafield/updated: description: Fires when product metafield details are edited. type: object - allOf: + properties: + allOf: - $ref: ./store_product_metafield_updated.yml store/product/updated: description: Fires when product details are edited. `attributes` and `context` fields are present for only override updates. For a full list of product fields that trigger an updated event, see the product updated events that follow. type: object - allOf: + properties: + allOf: - $ref: ./store_product_updated.yml store/product/variant/metafield/created: description: Fires when a new product variant metafield is created. type: object - allOf: + properties: + allOf: - $ref: ./store_variant_metafield_created.yml store/product/variant/metafield/deleted: description: Fires when a product variant metafield is deleted.. type: object - allOf: + properties: + allOf: - $ref: ./store_variant_metafield_deleted.yml store/product/variant/metafield/updated: description: Fires when product variant metafield details are edited. type: object - allOf: + properties: + allOf: - $ref: ./store_variant_metafield_updated.yml store/shipment/created: description: Fires when a shipment is created. type: object - allOf: + properties: + allOf: - $ref: ./store_shipment_created.yml store/shipment/deleted: description: Fires when a shipment is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_shipment_deleted.yml store/shipment/updated: description: Fires when a shipment is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_shipment_updated.yml store/sku/created: description: Fires when a new SKU is created. type: object - allOf: + properties: + allOf: - $ref: ./store_sku_created.yml store/sku/deleted: description: Fires when a SKU is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_sku_deleted.yml store/sku/inventory/order/updated: description: |- @@ -385,7 +460,8 @@ properties: The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. type: object - allOf: + properties: + allOf: - $ref: ./store_sku_inventory_order_updated.yml store/sku/inventory/updated: description: |- @@ -395,26 +471,30 @@ properties: Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. type: object - allOf: + properties: + allOf: - $ref: ./store_sku_inventory_updated.yml store/sku/updated: description: Fires when a SKU is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_sku_updated.yml store/subscriber/created: description: Fires when a subscriber is created. type: object - allOf: + properties: + allOf: - $ref: ./store_subscriber_created.yml store/subscriber/deleted: description: Fires when a subscriber is deleted. type: object - allOf: + properties: + allOf: - $ref: ./store_subscriber_deleted.yml store/subscriber/updated: description: Fires when a subscriber is updated. type: object - allOf: + properties: + allOf: - $ref: ./store_subscriber_updated.yml - diff --git a/models/webhooks/store_modifier_updated.yml b/models/webhooks/store_modifier_updated.yml new file mode 100644 index 000000000..f7279bfaf --- /dev/null +++ b/models/webhooks/store_modifier_updated.yml @@ -0,0 +1,42 @@ +type: object +properties: + store/modifier/updated: + description: | + Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. + + For shared modifiers, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + enum: + - local_modifier + - shared_modifier + id: + type: integer + affected_product_ids: + type: array + items: + type: integer + description: 100 items limit + context: + type: object + properties: + channel_id: + type: integer + locale: + type: string + description: '`null` if the attribute that was overridden applies to the entire channel.' + hash: + type: string + created_at: + type: integer + producer: + type: string diff --git a/models/webhooks/store_option_updated.yml b/models/webhooks/store_option_updated.yml new file mode 100644 index 000000000..a52417d4f --- /dev/null +++ b/models/webhooks/store_option_updated.yml @@ -0,0 +1,41 @@ +type: object +properties: + store/option/updated: + description: | + Fires when you edit attributes for a local or shared variant option. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. + + For shared options, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + enum: + - local_option + - shared_option + id: + type: integer + affected_product_ids: + type: array + items: + type: integer + description: 100 `product_id` limit + context: + type: object + properties: + channel_id: + type: integer + locale: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string diff --git a/models/webhooks/store_product_updated.yml b/models/webhooks/store_product_updated.yml index 63b9a44e8..7588f5094 100644 --- a/models/webhooks/store_product_updated.yml +++ b/models/webhooks/store_product_updated.yml @@ -1,7 +1,10 @@ type: object properties: store/product/updated: - description: Fires when product details are edited. For a full list of product fields that trigger an updated event, see the product updated events that follow. + description: | + Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the product updated events that follow. + + The `context` fields are present for only override updates. type: object properties: scope: @@ -13,8 +16,22 @@ properties: properties: type: type: string + enum: product id: type: integer + properties: + type: array + description: Allowed values are `name`, `description`, `page_title`, `meta_description`, `warranty`, `availability_description`, `search_keywords`, `is_featured` and `preorder_message` + items: + type: string + context: + type: object + properties: + channel_id: + type: integer + locale: + type: string + description: '`null` if the attribute that was overridden applies to the entire channel.' hash: type: string created_at: From 67d020254c9317150c8e7075be040c9cdecbebb4 Mon Sep 17 00:00:00 2001 From: Brett Daniels Date: Wed, 22 May 2024 08:08:39 +1000 Subject: [PATCH 021/221] No ticket: Tax Provider API, add `fee` tax item type to `tax_item` types (#276) ## What changed? - Add `fee` to tax item types. ## Release notes draft No need for release notes, minor additive change that reflects an adjustment from some months ago. ## Anything else? Nope. Co-authored-by: Sarah Riehl --- reference/tax_provider.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/reference/tax_provider.yml b/reference/tax_provider.yml index 73554c28a..f5007d07c 100644 --- a/reference/tax_provider.yml +++ b/reference/tax_provider.yml @@ -1293,6 +1293,7 @@ components: enum: - item - refund + - fee shipping_type: type: string description: |- From a106f393ed2b11e40e07785b2f352f0fdec377f1 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Tue, 21 May 2024 18:43:22 -0500 Subject: [PATCH 022/221] (no ticket): [update] Process payments, remove faulty examples (#285) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # (no ticket): [update] Process payments, remove faulty examples ## What changed? * change x-examples to examples * remove duplicate example * remove ill-formatted examples * remove curl example with no request body ## Release notes draft * ## Anything else? ping {names} --- reference/payments/process_payments.yml | 54 ++++--------------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/reference/payments/process_payments.yml b/reference/payments/process_payments.yml index 193aa29f5..8bf58a6c6 100644 --- a/reference/payments/process_payments.yml +++ b/reference/payments/process_payments.yml @@ -97,15 +97,13 @@ paths: payment: instrument: type: card - cardholder_name: string - number: string - expiry_month: 1 - expiry_year: 0 - verification_value: stri - issue_month: 1 - issue_year: 0 - issue_number: 0 - payment_method_id: string + number: '4111111111111111' + cardholder_name: Jane Doe + expiry_month: 12 + expiry_year: 2020 + verification_value: '411' + payment_method_id: authorizenet.card + save_instrument: true Stored Card: value: payment: @@ -153,44 +151,6 @@ paths: expiration_month: 12 expiration_year: 2030 payment_method_id: bolt.card - required: true - x-examples: - application/json: - payment: - instrument: {} - payment_method_id: Lorem in - amount: 81505146 - currency_code: NYE - Payment Access Token: |- - curl -X POST \ - https://payments.bigcommerce.com/stores/{store_hash}/payments \ - -H 'Accept: application/vnd.bc.v1+json' \ - -H 'Authorization: PAT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NsdfasftIsIm5iZiI6MTU1MTM5MDU0MiwiaXNzIjoicGF5bWVudHMuYmlnY29tbWVyY2UuY29tIiwic3ViIjoianJhaDZnbW4iLCJqdGkiOiI3Nzg3ZmU1Zi01OWJmLTQ3ZWMtYTFmZC00ZDQ3ZTkwNjFlNWMiLCJpYXQiOjE1NTEzOTA1NDIsImRhdGEiOnsic3RvcmVfaWQiOjEwMjU2NDYsIm9yZGVyX2lkIjoyMTUsImFtb3VudCI6OTgwMCwiY3VycmVuY3kiOiJVU0QifX0.WbR90d8m4gn8wK7kPMDEoVq8B0hHC5Ul5H4Hpqq6Yvo' \ - -H 'Content-Type: application/json' \ - Vaulted Card: - payment: - instrument: - type: stored_card - token: vaulted instrument token - verification_value: '123' - payment_method_id: stripe.card - save_instrument: true - Credit Card: |- - { - "payment": { - "instrument": { - "type": "card", - "number": "4111111111111111", - "cardholder_name": "BP", - "expiry_month": 12, - "expiry_year": 2020, - "verification_value": "411" - }, - "payment_method_id": "authorizenet.card", - "save_instrument": true - } - } - description: '' responses: '202': description: Payment has been successfully processed From 2b3e3d503de9a6a577aadf56229e35e61d05f9c9 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Wed, 22 May 2024 10:12:31 -0500 Subject: [PATCH 023/221] [DEVDOCS-5955]: [update] OrdersV3, Support new query parameter transaction_id in GET Refunds API endpoints (#287) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What changed? * Support new query parameter `transaction_id` in GET Refunds API endpoints: e.g.: GET /v3/orders/{id}/payment_actions/refunds?transaction_id=13 GET /v3/orders/payment_actions/refunds?transaction_id=13 * Expose `transaction_id` field to refund.payment on the API: ![image](https://github.com/bigcommerce/docs/assets/63274600/e1059f15-a8ba-4d72-b215-677bddcf62b9) **Testing proof**: - The new query param is displayed correctly in the swagger editor: image - The new field is displayed correctly in the swagger editor: image ## Release notes draft * Orders V3 includes the 'transaction_id' parameter that filters results in the request. ping @bigcommerce/team-orders @slsriehl @bc-tgomez # [DEVDOCS-5955] - Pulled in PR from Orders team ## Anything else? # [ORDERS-6364 and ORDERS-6365] (#286) ping @donald-nguyen-bc [DEVDOCS-5955]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5955?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Donald Nguyen <63274600+donald-nguyen-bc@users.noreply.github.com> --- reference/orders.v3.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index db144d275..d2ab76430 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -358,6 +358,11 @@ paths: parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/OrderIdParam' + - in: query + name: 'transaction_id' + description: Filters by refund payment using the BigCommerce `transaction_id`. + schema: + type: string '/orders/payment_actions/refunds/{refund_id}': parameters: - $ref: '#/components/parameters/Accept' @@ -434,6 +439,11 @@ paths: schema: type: string format: date-time + - in: query + name: 'transaction_id' + description: Filters by refund payment using the BigCommerce `transaction_id`. + schema: + type: string - in: query name: page description: Specifies the page number in a limited (paginated) list of items. @@ -2847,6 +2857,10 @@ components: declined_message: type: string description: Message indicate why payment was declined. + transaction_id: + type: string + description: The BigCommerce `transaction_id`. + example: '1234' x-internal: false PaymentOption: type: object From 644190f643ab43aad9dff353c8f56cf88d2e1dd9 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 22 May 2024 13:45:36 -0500 Subject: [PATCH 024/221] DEVDOCS-5890 [new]: Stencil theme, add Japanese language (#284) --- docs/stencil-docs/localization/localizing-stores.mdx | 1 + docs/stencil-docs/localization/multi-language-checkout.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/stencil-docs/localization/localizing-stores.mdx b/docs/stencil-docs/localization/localizing-stores.mdx index 5a1ec2c32..f87288237 100644 --- a/docs/stencil-docs/localization/localizing-stores.mdx +++ b/docs/stencil-docs/localization/localizing-stores.mdx @@ -38,6 +38,7 @@ BigCommerce's Cornerstone Stencil theme supports these uneditable strings in the * French * German * Italian +* Japanese * Norwegian * Polish * Portuguese diff --git a/docs/stencil-docs/localization/multi-language-checkout.mdx b/docs/stencil-docs/localization/multi-language-checkout.mdx index 975dbe859..4fe05999c 100644 --- a/docs/stencil-docs/localization/multi-language-checkout.mdx +++ b/docs/stencil-docs/localization/multi-language-checkout.mdx @@ -70,6 +70,7 @@ You can provide values for all of the checkout's supported translation keys even | French | `fr.json` | | German | `de.json` | | Italian | `it.json` | +| Japanese | `ja.json` | | Norwegian| `no.json`| | Polish | `pl.json` | | Portuguese| `pt.json`| From 2d7d2a4980d68d569edff2b3e2750ff31b99ebc4 Mon Sep 17 00:00:00 2001 From: Sarah Riehl Date: Wed, 22 May 2024 18:29:17 -0500 Subject: [PATCH 025/221] DEVDOCS-5033: [new] B2B getting started + GraphQL Storefront API auth narrative (#288) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5033] ## What changed? * ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5033]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5033?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../checkout-customizability.mdx | 5 +- .../cart-and-checkout-overview.mdx | 39 +-- .../api-docs/customers/customer-login-api.mdx | 2 +- .../getting-started/about-our-api.mdx | 3 +- .../getting-started/api-status-codes.mdx | 4 +- .../getting-started/authentication.mdx | 2 +- .../getting-started/best-practices.mdx | 2 +- docs/api-docs/headless/customers.mdx | 49 ++-- .../graphql/graphql-api-examples.mdx | 6 +- .../graphql/graphql-api-overview.mdx | 250 ++++-------------- .../graphql/graphql-carts-and-checkout.mdx | 8 +- .../graphql-faceted-textual-search.mdx | 12 +- .../storefront/graphql/graphql-products.mdx | 24 +- .../graphql/graphql-site-content.mdx | 18 +- .../storefront/graphql/graphql-variants.mdx | 22 +- .../widgets/product-widget-tutorial.mdx | 43 ++- docs/api-docs/users/overview.mdx | 16 +- docs/b2b-edition/about/api-status-codes.mdx | 63 +++++ docs/b2b-edition/about/index.mdx | 51 ++++ .../authentication/headless-auth.mdx | 35 +++ .../authentication/hosted-auth.mdx | 79 ++++++ docs/b2b-edition/best-practices.mdx | 17 ++ .../stencil.mdx} | 0 docs/msf/msf-api-guide.mdx | 56 ++-- docs/msf/msf-overview.mdx | 28 +- .../authentication/graphql-storefront.mdx | 245 +++++++++++++++++ .../reference-docs/front-matter-reference.mdx | 2 +- reference/customers.v3.yml | 32 ++- reference/storefront_tokens.v3.yml | 94 +------ 29 files changed, 727 insertions(+), 480 deletions(-) create mode 100644 docs/b2b-edition/about/api-status-codes.mdx create mode 100644 docs/b2b-edition/about/index.mdx create mode 100644 docs/b2b-edition/authentication/headless-auth.mdx create mode 100644 docs/b2b-edition/authentication/hosted-auth.mdx create mode 100644 docs/b2b-edition/best-practices.mdx rename docs/{partner-apps/bundleb2b/b2b-edition.mdx => b2b-edition/stencil.mdx} (100%) create mode 100644 docs/start/authentication/graphql-storefront.mdx diff --git a/docs/api-docs/building-checkouts/checkout-customizability.mdx b/docs/api-docs/building-checkouts/checkout-customizability.mdx index 0bf0d70fc..15ed43ec3 100644 --- a/docs/api-docs/building-checkouts/checkout-customizability.mdx +++ b/docs/api-docs/building-checkouts/checkout-customizability.mdx @@ -19,8 +19,9 @@ Once a developer has chosen a path, they can choose the options they want to use |-|-|-|-| |**Open Checkout**| Open checkout is the open-source option of BigCommerce's Optimized One-Page Checkout.

A browser-based application that converts a cart to an order, allowing shoppers to complete checkout.

Our reference implementation of checkout built on top of the Checkout JS SDK. | This option allows developers to create a custom checkout from a fully functional foundation (as a starting point for their efforts or even contribute to it).

Add features or make moderate-sized changes to BigCommerce’s checkout (hosted on the BigCommerce storefront). | [Open Checkout Quick Start](/docs/storefront/cart-checkout/open-checkouts) | |**Checkout JS SDK**| A client-side vanilla JavaScript library that is a wrapper for the Storefront Checkout API.

The SDK handles all the API calls necessary to move shoppers through the checkout experience. From customer login, fetching shipping quotes, and payment methods through to paying an order.| This option allows developers to build a custom checkout from scratch by creating a presentation layer for checkout. Completely replacing the UI/UX without having to do the heavy lifting of dealing with Storefront API endpoints.

Significant front-end customizations and/or feature additions to checkout (hosted on the BigCommerce storefront).

**Limitations:**
  • SDK does not let you introduce new behavior. While you can filter based on shipping methods, you cannot create new shipping methods or payment methods.
  • Hosted forms do not work with Stencil localhost since forms are served over https and Stencil only supports http. Developers must test the order confirmation flow on Stencil using offline payment methods.
| [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) | -| **Storefront Checkout API** | GraphQL and REST APIs create and update a checkout and convert it to an order.

| This option allows developers to build a custom checkout experience (within the context of a BigCommerce storefront session) by accessing raw API request/response data.

These are the APIs you would typically access from your browser using JavaScript to retrieve checkout data not available through the SDK. | [GraphQL Storefront API: Carts and Checkout](/docs/storefront/cart-checkout/guide/graphql-storefront)

[Storefront GraphQL API Reference](/graphql-storefront/reference#definition-Checkout)

[Storefront Checkout API](/docs/rest-storefront/checkouts)

[Storefront Cart and Checkout](/docs/storefront/cart-checkout/guide/rest-management)| -| **Management Checkout API** | REST APIs create and update a checkout and convert it to an order. | This option allows developers to build a custom checkout (outside of a BigCommerce storefront session) and use the [Payments API](/docs/rest-payments/processing) to pay for an order.

When used with the [Management Cart API](/docs/rest-management/carts) it allows you to make modifications similar to those performed using the control panel option **Orders > Add**. These modifications include the ability to create custom products, modify prices, add custom discounts, set custom prices for shipping, etc.

These are the APIs that will power your headless checkout solutions on channels such as:
  • Content management systems
  • Native mobile apps (non-web view)
  • Internet of Things (IoT) devices
  • Recurring order and/or subscription apps (e.g. OrderGroove)

**Note:** Currently, this API currently does not support using store credit or gift certificates as payment methods. | [Management Checkout API](/docs/rest-storefront/checkouts) | +| **GraphQL Storefront API** | The GraphQL Storefront API can create and update a checkout and convert it to an order.

| This option allows developers to build a custom checkout experience inside or outside the context of a BigCommerce storefront session by accessing raw API request/response data.

This is the API that typically powers headless storefronts. | [GraphQL Storefront API: Carts and checkout](/docs/storefront/cart-checkout/guide/graphql-storefront)

[GraphQL Storefront API reference](/graphql-storefront/reference#definition-Checkout) | +| **REST Storefront API** | The REST Storefront API can get and update many aspects of a checkout.

| This option allows developers to build a custom checkout experience within the context of a BigCommerce storefront session by accessing raw API request/response data.

This is the API you would typically access from your browser using JavaScript to retrieve checkout data not available through the SDK. | [REST Storefront API checkout reference](/docs/rest-storefront/checkouts)

[REST Storefront API: Carts and checkout](/docs/storefront/cart-checkout/guide/rest-storefront) | +| **REST Management API checkout feature** | The REST Management API creates and updates a checkout and converts it to an order. | This option allows developers to build a custom checkout outside of a BigCommerce storefront session and use the [Payments API](/docs/rest-payments/processing) to pay for an order.

When used with the REST Management [carts feature](/docs/rest-management/carts), it lets you make modifications similar to those performed using the control panel option **Orders > Add**. These modifications include the ability to create custom products, modify prices, add custom discounts, set custom prices for shipping, etc.

These are the APIs that will power your headless checkout solutions on channels such as:
  • Content management systems
  • Native mobile apps (non-web view)
  • Internet of Things (IoT) devices
  • Recurring order and/or subscription apps (e.g. OrderGroove)

**Note:** Currently, this API currently does not support using store credit or gift certificates as payment methods. | [REST Management API checkout reference](/docs/rest-management/checkouts)

[REST APIs: Carts and checkout](/docs/storefront/cart-checkout/guide/rest-management) | ## Resources diff --git a/docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx b/docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx index f6ff1655c..f272db2a4 100644 --- a/docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx +++ b/docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx @@ -5,28 +5,28 @@ keywords: rest, carts, checkouts, draft order, cartId, incomplete, get products, # REST APIs: Cart and Checkout Overview -BigCommerce offers Storefront, REST Management, and GraphQL APIs for cart and checkout. This article discusses and gives examples of Storefront and REST Management APIs. For information on GraphQL Cart and Checkout APIs, see [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). +BigCommerce offers REST Storefront, REST Management, and GraphQL Storefront APIs to work with carts and checkouts. This article discusses and gives examples of using REST Storefront and REST Management APIs. For information on using GraphQL, see [GraphQL Storefront API: Cart and checkout](/docs/storefront/cart-checkout/guide/graphql-storefront). -## Storefront Cart and Checkout +## REST Storefront cart and checkout -The Storefront APIs manage the contents of a shopper's cart and checkout using JavaScript in the context of a storefront session. +The REST Storefront API manages the contents of a shopper's cart and checkout using JavaScript in the context of a storefront session. The REST Storefront API can only be used on BigCommerce-hosted storefronts. For headless applications, use the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). -### When to use the Storefront APIs +### When to use the REST Storefront API + * Analytics and Tracking * Retrieving cart data client-side * Quick Order Form * Upsell applications ### Using the Fetch API -The [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) is an alternative to [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) for making http requests in JavaScript. You can use the Fetch API to interact with the Storefront APIs and return a shopper's cart, checkout, or order. - -Most modern browsers, except Internet Explorer, support Fetch API. We recommend using a [Polyfill](https://github.com/github/fetch) for Internet Explorer 10+ and XMLHttpRequest for earlier versions. +The [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) is an alternative to [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) for making http requests in JavaScript. You can use the Fetch API to interact with the REST Storefront API and return a shopper's cart, checkout, or order. -To learn more about using the Fetch API with the Storefront see our [Working with the Storefront Cart and Checkout APIs](/docs/storefront/cart-checkout/guide/rest-storefront) tutorial. +Most modern browsers, except Internet Explorer, support Fetch API. We recommend using a [Polyfill](https://github.com/github/fetch) for Internet Explorer 10+ and XMLHttpRequest for earlier versions. +To learn more about using the Fetch API with the REST Storefront API, see our [Working with the REST Storefront API: Cart and checkout](/docs/storefront/cart-checkout/guide/rest-storefront) tutorial. You can run fetch requests from the browser console to test or use the [Scripts API](/docs/integrations/scripts) to inject JavaScript into your theme's footer. @@ -67,7 +67,7 @@ fetch('/api/storefront/carts', { }); ``` - #### Log order details + **Log order details** To log order details to the console, use the [Scripts API](/docs/integrations/scripts) to inject the script into your theme's footer or use the [Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager?language=en_US) to add the script directly to `order-confirmation.html`. @@ -124,18 +124,18 @@ The REST Management APIs manage the contents of a shopping cart and checkout rem ## Persistent Cart - [Persistent Cart](https://support.bigcommerce.com/s/article/Persistent-Cart) lets a logged-in shopper access the same cart across devices. Persistent Cart is available on [Plus, Pro, and Enterprise plans](https://www.bigcommerce.com/essentials/pricing/). -Persistent Cart works with our Storefront Cart and REST Management Cart. +Persistent Cart works with both the REST Storefront and REST Management APIs. To learn more on setup, see [Persistent Cart](https://support.bigcommerce.com/s/article/Persistent-Cart). ## Troubleshooting cart errors -We will go over common Storefront Cart and Checkout as well as REST Management Cart and Checkout errors. Each scenario will include the error message and how to fix the error. The most common errors are listed below. +We will go over common errors from REST Storefront and REST Management cart and checkout requests. Each scenario will include the error message and how to fix the error. The most common errors are listed below. ### Please create some text for the API option [422] + *Server to Server Cart API* ***Issue:*** When a cart contains a product with an incorrect or missing text modifier. @@ -279,8 +279,8 @@ Content-Type: application/json ``` ### This product has options; variant ID is required [422] -*REST Management Cart API* +*REST Management Cart API* ***Issue:*** When a product has options and variant ID is not supplied in either the create or update cart request. @@ -332,7 +332,7 @@ Content-Type: application/json } ``` -*Storefront Cart API* +*REST Storefront API carts* ***Issue:*** @@ -363,7 +363,7 @@ To add a product to the cart with a single modifier (text field), POST to the [C To add a product to the cart with one option (radio button) associated with it, use just the `variant_id` in the request. -```http filename="Create Storefront Cart variantID" showLineNumbers copy +```http filename="Create REST Storefront cart with variant" showLineNumbers copy { "lineItems": [ { @@ -399,6 +399,7 @@ To add a product that has both an option and a modifier associated with it, then ``` ### You can only purchase a maximum of :qty of the :product per order [409] + *Server to Server Cart API* ***Issue:*** @@ -420,7 +421,7 @@ Trying to edit a cart that does not exist. Carts are only valid 30 days past the `date_last_modified`. Check the [Get Carts](/docs/rest-storefront/carts#get-a-cart) endpoint for the currently available session cart. -*Storefront Cart API* +*REST Storefront API carts* ***Issue:*** When you add less than a product’s minimum required purchase or more than the maximum allowed purchase to a cart. Use the [Get Product](/docs/rest-catalog/products#get-a-product) endpoint to check for min/max purchase restrictions. @@ -431,10 +432,12 @@ Check the product for `order_quantity_minimum` and `order_quantity_maximum` for ## Related resources ### Articles -* [Working with the Storefront Cart and Checkout](/docs/storefront/cart-checkout/guide/rest-storefront) + +* [REST Storefront API: Cart and checkout](/docs/storefront/cart-checkout/guide/rest-storefront) ### Endpoints -* [Storefront Cart](/docs/rest-storefront/carts) + +* [REST Storefront API carts](/docs/rest-storefront/carts) * [Storefront Checkout](/docs/rest-management/checkouts) * [Rest Management Cart](/docs/rest-management/carts) * [Rest Management Checkout](/docs/rest-storefront/checkouts) diff --git a/docs/api-docs/customers/customer-login-api.mdx b/docs/api-docs/customers/customer-login-api.mdx index 62cef26a4..812e8c99e 100644 --- a/docs/api-docs/customers/customer-login-api.mdx +++ b/docs/api-docs/customers/customer-login-api.mdx @@ -10,7 +10,7 @@ keywords: login, log in, sign in, sign-in, headless, embedded, checkouts In this tutorial, you will learn how to enable single sign-on for storefront customers using the Customer Login API and JSON Web Tokens. -You can also use the [GraphQL Storefront API](/docs/storefront/graphql#customer-login) to authorize your application to work with customer-specific storefront data. +You can also use the [GraphQL Storefront API](/docs/start/authenication/graphql-storefront#customer-login) to authorize your application to work with customer-specific storefront data. ## Overview diff --git a/docs/api-docs/getting-started/about-our-api.mdx b/docs/api-docs/getting-started/about-our-api.mdx index 77f4ffc34..cb0e096f9 100644 --- a/docs/api-docs/getting-started/about-our-api.mdx +++ b/docs/api-docs/getting-started/about-our-api.mdx @@ -64,7 +64,7 @@ Make BigCommerce API requests in the context of the **storefront**, BigCommerce | [GraphQL Account API](/docs/start/authentication#access-tokens), including [Users](/docs/graphql-account/users-overview) | server | | [GraphQL Admin API](/docs/start/authentication#access-tokens) | server | | [GraphQL Storefront API](/docs/start/authentication#bigcommerce-generated-jwts) | storefront | -| [REST Store Management APIs](/docs/start/authentication#access-tokens) | server | +| [REST Management API](/docs/start/authentication#access-tokens) | server | | [REST Storefront API](/docs/start/authentication#same-origin-cors-authentication) | storefront | | [Customer Login API](/docs/start/authentication#user-generated-jwts) | storefront | | [Current Customer API](/docs/start/authentication#client-id) | storefront | @@ -104,7 +104,6 @@ Make BigCommerce API requests in the context of the **storefront**, BigCommerce | [Payments - Process Payments](/docs/rest-payments/processing) | Process payments using a [payment access token](/docs/rest-payments/tokens) and [accepted payment method](/docs/rest-payments/methods). | | [Shipping](/docs/rest-management/shipping-v2) | Create and manage shipping methods and zones. | [Store Content](/docs/rest-content/store-content/blog-posts) | Manage a store's blog posts and blog tags. | -| [Storefront GraphQL API](/docs/graphql-storefront) | Query storefront data headlessly or from within a Stencil theme. | | [Pages](/docs/rest-content/pages) | Manage a store's web pages. | | [Redirects](/docs/rest-management/redirects) | Manage a store's redirects. | | [Themes](/docs/rest-content/themes) | Manage store's themes. | diff --git a/docs/api-docs/getting-started/api-status-codes.mdx b/docs/api-docs/getting-started/api-status-codes.mdx index 77e1090eb..a15b7fb13 100644 --- a/docs/api-docs/getting-started/api-status-codes.mdx +++ b/docs/api-docs/getting-started/api-status-codes.mdx @@ -9,7 +9,7 @@ BigCommerce **REST APIs** and **GraphQL APIs** respond to each request with an H This article covers [REST](#rest-api-http-status-codes) and [GraphQL](#graphql-api-http-status-codes) status codes and error messages. -## REST API HTTP status codes +## REST HTTP status codes ### 2xx Success @@ -79,7 +79,7 @@ This article covers [REST](#rest-api-http-status-codes) and [GraphQL](#graphql-a |||Try reducing the number of objects being requested. You can request fewer objects in the v2 API, by using `?limit={count}`. In `v2` and `v3` API, fewer objects can be requested by excluding certain fields or only requesting certain fields.| ||| Check the BigCommerce [Status Page](https://status.bigcommerce.com/).| -## GraphQL API HTTP status codes +## GraphQL HTTP status codes All GraphQL errors return a 401 HTTP status code. diff --git a/docs/api-docs/getting-started/authentication.mdx b/docs/api-docs/getting-started/authentication.mdx index f89ed171b..7969dcb85 100644 --- a/docs/api-docs/getting-started/authentication.mdx +++ b/docs/api-docs/getting-started/authentication.mdx @@ -155,7 +155,7 @@ The following table lists the APIs that use the `Authorization` header, along wi | API description | Obtain a JWT | Endpoint reference | API account type | Authorization header value | |:----------------|:-------------|:-------------------|:-----------------|:---------------------------| -| [GraphQL Storefront API](/docs/storefront/graphql) | [Create a token](/docs/rest-authentication/tokens#create-a-token), Stencil context | [Create a Storefront query](/docs/graphql-storefront) | store | `Bearer {{TOKEN}}` | +| [GraphQL Storefront API](/docs/start/authentication/graphql-storefront) | [Create a token](/docs/rest-authentication/tokens#create-a-token), Stencil context | [Create a Storefront query](/docs/graphql-storefront) | store | `Bearer {{TOKEN}}` | | [Payment processing](/docs/store-operations/payments) endpoint | [Create a payment access token](/docs/rest-payments/tokens#create-payment-access-token), `completeCheckout` with the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront#handling-payments) | [Process a payment](/docs/rest-payments/processing#process-payment) | app or store | `PAT {{TOKEN}}` | To obtain a dynamic token, send a request to the REST endpoint listed in the **Obtain a JWT** column or consult the article listed in the **API Description** column. Use an API account with the appropriate [token creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) for the kind of tokens you wish to generate. diff --git a/docs/api-docs/getting-started/best-practices.mdx b/docs/api-docs/getting-started/best-practices.mdx index 979b0f5e7..a04dcf7d9 100644 --- a/docs/api-docs/getting-started/best-practices.mdx +++ b/docs/api-docs/getting-started/best-practices.mdx @@ -7,7 +7,7 @@ keywords: rate limits, best practices, ## Keep your integration up to date -BigCommerce frequently enhances its core product and is actively enhancing REST endpoints, as well as expanding the graphs accessible to our growing family of GraphQL APIs. Using the latest information lets you update your app to take advantage of the most current resources. You also position your app or implementation to provide a user experience consistent with what merchants see in their BigCommerce store control panel. To stay up to date, bookmark our [changelog](/release-notes). +BigCommerce frequently enhances its core product and is actively enhancing REST endpoints, as well as expanding the graphs accessible to our GraphQL APIs. Using the latest information lets you update your app to take advantage of the most current resources. You also position your app or implementation to provide a user experience consistent with what merchants see in their BigCommerce store control panel. To stay up to date, bookmark our [changelog](/release-notes). ## Anticipate changes to BigCommerce APIs diff --git a/docs/api-docs/headless/customers.mdx b/docs/api-docs/headless/customers.mdx index 44e04b054..930bce67e 100644 --- a/docs/api-docs/headless/customers.mdx +++ b/docs/api-docs/headless/customers.mdx @@ -1,47 +1,35 @@ --- -title: Managing Customers +title: Managing customers keywords: customers, currency, currencies, headless, graphql, storefronts, --- -# Managing Customers +# Managing customers -This section covers different ways to associate customers to headless carts. +This section covers different ways to associate customers with headless carts. -## Customer login using GraphQL +## GraphQL Storefront API -You can sign in a customer account using client-side or server-side code. +You can use the GraphQL Storefront API to sign in to a customer account using hosted client-side, headless client-side, or server-side code. -### Client-side GraphQL customer login +### Hosted client-side sign in -To sign in a customer account with an email address and a password in client-side code, use the following [GraphQL Storefront API](/docs/storefront/graphql) customer login mutation. +To sign in a customer account with an email address and a password in client-side code on a hosted storefront, use the [login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in). -**Customer login mutation** +When you sign in a customer using the login mutation, subsequent queries made to the GraphQL Storefront API will return customer-specific results, such as customer group pricing. -```graphql showLineNumbers copy -mutation Login($email: String!, $pass: String!) { - login(email: $email, password: $pass) { - result - } -} -``` - -When a customer is logged in using the customer login mutation, subsequent queries made to the GraphQL Storefront API will return customer-specific results (for example, customer group pricing) using the context of the logged in customer. +### Headless and server-side sign in -### Server-side GraphQL customer login +To make queries from the perspective of a particular customer in headless or server-side code, use [customer impersonation tokens](/docs/start/authentication/graphql-storefront#customer-impersonation-tokens) rather than storefront tokens. -To make queries from the perspective of a particular customer in headless or server-side code, use [customer impersonation tokens](/docs/storefront/graphql#customer-impersonation-tokens). +Depending on your implementation, you can use the login mutation or a combination of the [Current Customer API](/docs/start/authentication/current-customer), the [Customer Login API](/docs/start/authentication/customer-login), or the REST Management API's [customers feature](/docs/rest-management/customers) to authenticate the customer and get their customer ID. Pass the customer ID with your GraphQL Storefront requests using the `X-Bc-Customer-Id` header to interact with the store from the customer's perspective. The responses will reflect customer-specific pricing, product availability, account information, and more. -When you use customer impersonation tokens to authenticate requests made to the GraphQL Storefront API, the tokens receive store information from the perspective of the customer corresponding to the customer ID passed in the `X-Bc-Customer-Id` header of the `POST` request. Pricing, product availability, customer account, and customer details will be reflected. +## Customer single sign-on -## Customer Single Sign-on +When a customer signs in to your headless storefront and your application redirects them to a BigCommerce-hosted page, such as checkout, you can use the [Customer Login API](/docs/start/authentication/customer-login) to sign them in to the hosted session. -If a customer signs in to your headless storefront, and then is redirected to a BigCommerce-hosted page, you can use the [Customer Login API](/docs/start/authentication/customer-login) to create a single sign-on experience between your headless storefront and BigCommerce. Doing so will make the redirection from the headless storefront to BigCommerce a more seamless experience for the customer. +You can sign a customer in to an embedded checkout by setting `redirect_to` in the Customer Login JWT payload to the relative path of the `embedded_checkout_url` generated using the [REST Management API carts feature](/docs/rest-management/carts) or the GraphQL Storefront API [createCartRedirectUrls mutation](/graphql-storefront/reference#definition-CartMutations). -You can sign a customer in to an embedded checkout by setting `redirect_to` in the Customer Login JWT payload to the relative path of the `embedded_checkout_url` generated using the [Carts API](/docs/rest-management/carts). - -**JWT payload example** - -```http showLineNumbers copy +```js filename="Example JWT payload" showLineNumbers copy { "iss": {{CLIENT_ID}}, "iat": 1535393113, @@ -58,13 +46,14 @@ You can sign a customer in to an embedded checkout by setting `redirect_to` in t ## Identifying signed-in customers If a customer signs in to a BigCommerce-hosted cart or checkout, then navigates back to the headless storefront, you will need to confirm the customer's identity before revealing sensitive information. -To address this need, BigCommerce provides the [Current Customers API](/docs/start/authentication/current-customer) accessible via client-side JavaScript. The [Get Current Customer](/docs/rest-authentication/current-customer#get-current-customer) endpoint returns a `JWT` (signed with your OAuth client secret) that contains customer details. + +To address this need, BigCommerce provides the [Current Customer API](/docs/start/authentication/current-customer), which you can access using client-side JavaScript. The [Get current customer](/docs/rest-authentication/current-customer#get-current-customer) endpoint returns a BigCommerce-generated JWT signed with the client secret of the API account you used to make the request. To access customer details, such as customer ID, customer group number, and email, use a library to decode the JWT. ## Surfacing customer group pricing -When querying the GraphQL Storefront API, customer-specific pricing will be reflected in query results if the request is made using a [customer impersonation token](/docs/storefront/graphql#customer-impersonation-tokens). +When querying the GraphQL Storefront API, customer-specific pricing will be reflected in query results if the request is made using a [customer impersonation token](/docs/start/authentication/graphql-storefront#customer-impersonation-tokens). -For server-side REST implementations, you can use the [Pricing API](/docs/rest-management/pricing) to [get prices](/docs/rest-management/pricing/products#get-prices-batch) for a particular customer group. +For server-side REST implementations, you can use the [REST Management API pricing feature](/docs/rest-management/pricing) to [Get prices](/docs/rest-management/pricing/products#get-prices-batch) for a particular customer group. diff --git a/docs/api-docs/storefront/graphql/graphql-api-examples.mdx b/docs/api-docs/storefront/graphql/graphql-api-examples.mdx index 4b2c874e8..67408c04b 100644 --- a/docs/api-docs/storefront/graphql/graphql-api-examples.mdx +++ b/docs/api-docs/storefront/graphql/graphql-api-examples.mdx @@ -4,13 +4,13 @@ keywords: storefront, graphql --- # GraphQL Storefront API Example Queries -Below are example GraphQL queries for use with the BigCommerce GraphQL Storefront API. The purpose of these examples is to assist developers in getting familiar with the API. For a general overview of its usage and capabilities, see [GraphQL Storefront API Overview](/docs/storefront/graphql). +Below are example GraphQL queries for use with the BigCommerce GraphQL Storefront API. The purpose of these examples is to assist developers in getting familiar with the API. For a general overview of its usage and capabilities, see [GraphQL Storefront API overview](/docs/storefront/graphql). ## Configuring the request -To get started, you need a BigCommerce store and a Storefront API token. For more information, see the [Authentication section of the GraphQL Storefront API Overview](/docs/storefront/graphql#authentication) or the [Authentication article](/docs/start/authentication#bigcommerce-generated-jwts). +To get started, you need a BigCommerce store and a Storefront API token. For more information, see the [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront) or the [General authentication article](/docs/start/authentication#bigcommerce-generated-jwts). -For more information on formatting the request payload, see [the query example section of the GraphQL Storefront API Overview](/docs/storefront/graphql#querying-within-a-bigcommerce-storefront). +For more information on formatting the request payload, see [the query example section of the GraphQL Storefront API overview](/docs/start/authentication/graphql-storefront#querying-within-a-bigcommerce-storefront). To use this API from a coupled storefront, use the following HTTP configuration: diff --git a/docs/api-docs/storefront/graphql/graphql-api-overview.mdx b/docs/api-docs/storefront/graphql/graphql-api-overview.mdx index ada2edbad..fc08d65f5 100644 --- a/docs/api-docs/storefront/graphql/graphql-api-overview.mdx +++ b/docs/api-docs/storefront/graphql/graphql-api-overview.mdx @@ -1,9 +1,9 @@ --- -title: GraphQL Storefront API Overview +title: GraphQL Storefront API overview keywords: graphql, storefront, storefronts, cors, headless, --- -# GraphQL Storefront API Overview +# GraphQL Storefront API overview BigCommerce's GraphQL Storefront API makes it possible to power a headless storefront; see [Introduction to Headless Commerce](/docs/storefront/headless) for details. The GraphQL Storefront API also lets you query storefront data from within a [Stencil](/docs/storefront/stencil/start) theme. @@ -21,7 +21,7 @@ Additionally, by leveraging the power of [GraphQL](https://graphql.org/), data f This article is a general overview of BigCommerce's GraphQL Storefront API; it includes sections on authentication and how to access a store's GraphQL Playground. To see specific examples of how GraphQL can be used to query storefront data, see [GraphQL Storefront API Example Queries](/docs/storefront/graphql/examples). - Stores using BigCommerce's legacy Blueprint theme framework do not support the GraphQL API and Playground. + Stores using BigCommerce's legacy Blueprint theme framework do not support the GraphQL Storefront API or playground. ## See it in action @@ -31,23 +31,21 @@ To see a simple example of the GraphQL Storefront API in action, check out the [ Open the link and click submit with the sample data in the form. To see the example page with your store's data, [create a GraphQL Storefront API token](/docs/rest-authentication/tokens#create-a-token) against your store and paste the token into the example form. Be sure to create a token valid for this origin: `https://bigcommerce.github.io`. -## Accessing the GraphQL Playground - -To access the GraphQL Storefront API Playground and documentation, [sign in to your store](https://login.bigcommerce.com/deep-links/manage) and navigate to **Settings > API> Storefront API Playground**. +## Accessing the GraphQL Storefront playground +To access the GraphQL Storefront playground and documentation, [sign in to your store](https://login.bigcommerce.com/deep-links/manage) and navigate to **Settings > API > Storefront API Playground**. The GraphQL Storefront API Playground will open. ![GraphQL Storefront API Playground](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Main%20Image.png "GraphQL Storefront API Playground") - If the **Storefront API Playground** link is not visible, this may be because your store is not using a Stencil theme. Apply a Stencil theme to use the GraphQL Storefront API. + If the **Storefront API Playground** link is not visible, this may be because your store is not using a Stencil theme or any headless channels. -## Using the GraphQL Playground - -To use the request runner, input queries on the left side and then click the **Play** button. Query results will be displayed on the right side. +## Using the GraphQL playground +To use the playground, input queries on the left side and then click the **Play** button. Query results will be displayed on the right side. ![GraphQL Playground Query](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20First%20Query.png "GraphQL Playground Query") @@ -82,168 +80,11 @@ query MyFirstQuery { } ``` -To explore the storefront GraphQL schema, checkout the **Docs** and **Explorer** tabs on the right. - -![GraphQL Playground Docs](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Docs%20Explorer%20Tab.png "GraphQL Playground Docs") - -You may also explore the graph visually using our [GraphQL Explorer](https://developer.bigcommerce.com/graphql-explorer). +To explore the schema, you can use the [API reference](/graphql-storefront/reference), the [explorer](/graphql-storefront/explorer), or the [playground](/graphql-storefront/playground), which lets you make live requests to your store. ## Authentication -GraphQL Storefront API requests are authenticated with JWT bearer tokens sent using the HTTP `Authorization` header. - - -```shell filename="Example Authorization header using cURL" showLineNumbers copy -curl 'https://{bigcommerce_storefront_domain}.com/graphql'\ - # ... - -H 'authorization: Bearer {token}'\ - # ... -``` - -### Creating a token - -Use the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) REST endpoint to request JWT bearer tokens that authenticate requests to the GraphQL Storefront API. Add a [token creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. - -This type of token is the most appropriate for use directly within web browsers. If you're creating a token for an application that will make server-to-server requests to the GraphQL Storefront API, a [Customer Impersonation Token](#customer-impersonation-tokens) may be more appropriate for your use case. This special token is not necessary if you only wish to query information from an anonymous shopper's perspective. - -For security reasons, GraphQL Storefront API tokens are scoped to particular [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) origins, so you must supply the origin(s) on which you intend to use the token in order for requests from browsers to work correctly. If you do not supply any CORS origins for your token, the API will reject requests originating from web browsers, although you can still use it in other contexts. - - - - -```http filename="Example request: Create a GraphQL Storefront API token" showLineNumbers copy -POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/storefront/api-token -x-auth-token: {{access_token}} -accept: application/json -content-type: application/json - -{ - "channel_id": 1, // integer (must be a valid channel ID on the store) - "expires_at": 1602288000, // when the token will expire, as an integer unix timestamp (in seconds) - "allowed_cors_origins": [ // array of origins (up to 2 origins per token are allowed) - "https://example.com" - ] -} -``` - - - -```json filename="Example response: Create a GraphQL Storefront API token" showLineNumbers copy -{ - "token":"...eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9...", - "meta": { - // ... - } -} -``` - - - - - * The `allowed_cors_origins` array currently accepts up to two origins. You will need multiple tokens if you have more origins. - * The `channel_id` for the default Stencil storefront is `1`. To learn more about channels, see [the channels section of the Multi-Storefront Overview](/docs/storefront/multi-storefront#channels). For more about using the GraphQL Storefront API on custom channels, consult this article's [FAQ section on alternate channels](#i-want-to-run-requests-in-the-context-of-another-channel). - - - - * Generally speaking, this type of GraphQL Storefront API token is not considered sensitive, and it is safe to expose in web browsers, for example, in HTML documents. This token can only expose information that an individual shopper is already privy to when browsing a storefront or allow them to perform actions that shoppers can perform (e.g. creating a shopper cart). - * It is **possible** to create a long-lived token that does not expire, which is appropriate if you wish to create a token once and store it in an application environment. - * In the interest of a better security posture, it is **recommended** to create shorter-lived tokens and rotate them periodically by calling this API to generate a new one before the old one expires. - - -### Using auto-generated tokens in Stencil themes - -Client code in BigCommerce Stencil themes can be passed a token at render time with the `{{settings.storefront_api.token}}` Handlebars property, making it unnecessary to generate a token using the Admin API before using the Storefront API. - -This auto-generated token has an expiry period of 24-48 hours and will periodically rotate before expiration. - -### Customer impersonation tokens - -You can use Customer Impersonation Tokens to authenticate requests to the GraphQL Storefront API in server-to-server and headless interactions. Add the [Storefront API Customer Impersonation Tokens scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use when you [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token). - - - - -```http filename="Example request: Create a customer impersonation token" showLineNumbers copy -POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/storefront/api-token-customer-impersonation -x-auth-token: {{access_token}} -accept: application/json -content-type: application/json - -{ - "channel_id": 1, // integer (must be a valid channel ID on the store) - "expires_at": 1602288000 // when the token will expire, as an integer unix timestamp (in seconds) -} -``` - - - -```json filename="Example response: Create a customer impersonation token" showLineNumbers copy -{ - "data": - { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" - } - "meta": {} -} -``` - - - -Customer impersonation token-authenticated requests made to the GraphQL Storefront API may query store information from the perspective of ANY customer by specifying the customer ID using the `x-bc-customer-id` header sent with the GraphQL `POST` request. Customer-specific data such as product pricing & availability, customer account details, and other parameters will change to reflect the specified customer's data. - -Unlike typical GraphQL Storefront API tokens, Customer impersonation tokens _are_ sensitive and should, therefore **never** be exposed publicly, for example, to JavaScript or HTML. You should not use these tokens for front-end requests. They should be treated with the same care as other application secrets, just as you might treat an OAuth access token for BigCommerce's REST APIs. Requests using these tokens originating from a web browser will be rejected. - -It is not necessary to generate a new token for each customer ID. You may use a single token at any given time for your application, and specify the customer ID for each request via request headers. - -Consider this sample request using a Customer Impersonation token to run a request in the context of customer ID `123`. - -```shell filename="Example request: Query as customer 123" showLineNumbers copy -curl 'https://store.com/graphql' -H 'authorization: Bearer TOKEN_GOES_HERE' -H 'x-bc-customer-id: 123' --data-binary '{"query":"query CustomerInformation {\n customer {\n firstName\n lastName\n email\n }\n}"}' -``` - - - * If your token were to become compromised and you wish to sever the Storefront API connection for your token, you can use the [Revoke a token](/docs/rest-authentication/tokens#revoke-a-token) endpoint. Only use this in emergencies, and do not revoke tokens unnecessarily. Instead, use a shorter expiration and allow them to expire naturally. - - -### Customer login - -If you're using the GraphQL Storefront API from a browser, for example, on top of your Stencil storefront, you can use the Customer Login mutation to sign in to a customer account with an email address and a password. This will set a session cookie in the browser, which will authenticate the customer account on future requests. - - -A customer can only sign in to their account on one device. When running the customer login mutation for a session on a new device, a customer is automatically signed out. - - -```graphql filename="Example query: login mutation" showLineNumbers copy -mutation Login($email: String!, $pass: String!) { - login(email: $email, password: $pass) { - result - customer { - entityId - firstName - lastName - email - } - } -} -``` - -This mutation is also useful for server-to-server or headless storefront applications using a Customer Impersonation Token. For example, this interface can validate a customer's email address + password to power a login form. When the credentials are correct, and the mutation returns successfully, you can take the resulting customer ID and store it in a session to use in the `x-bc-customer-id` header in future requests for that shopper. - -As a security best practice, you should inject the email address & password using GraphQL query variables. This prevents the password from being exposed in the query itself. In the [GraphQL Playground](/graphql-playground), you can set the variables for the request. - -![GraphQL Playground Query Variables](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Login%20Mutation.png "GraphQL Playground Query Variables") - -You can use a logout mutation to sign out of a customer account: - -```graphql filename="Example query: logout mutation" showLineNumbers copy -mutation Logout { - logout { - result - } -} -``` - -This will clear the session cookie, which has the effect of logging out the shopper, and future GraphQL requests will be from the perspective of an anonymous shopper. +To learn more about authenticating requests to the GraphQL Storefront API, see [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront). ## Querying within a BigCommerce storefront @@ -255,39 +96,39 @@ The following example request uses the `{{settings.storefront_api.token}}` Handl The `fetch` request's `credentials` property must be set to `same-origin`.
-```handlebars filename="Example request: GraphQL query using Stencil auto-generated token" showLineNumbers copy +```html filename="Example request: GraphQL query using Stencil auto-generated token" showLineNumbers copy ``` @@ -297,7 +138,7 @@ Client libraries like [Apollo](https://www.apollographql.com/docs/react/) offer ## Pagination -The GraphQL Storefront API follows the [GraphQL Cursor Connections Specification](https://facebook.github.io/relay/graphql/connections.htm) for pagination. If this is your first time working with GraphQL pagination, see [Apollo's Blog Post "Explaining GraphQL Connections"](https://blog.apollographql.com/explaining-graphql-connections-c48b7c3d6976) for an accessible introduction. If you've worked with other GraphQL APIs, pagination on BigCommerce should look familiar. +The GraphQL Storefront API follows the [GraphQL cursor connections specification](https://facebook.github.io/relay/graphql/connections.htm) for pagination. If this is your first time working with GraphQL pagination, see [Apollo's blog post "Explaining GraphQL connections"](https://www.apollographql.com/blog/explaining-graphql-connections) for an accessible introduction. If you've worked with other GraphQL APIs, pagination on BigCommerce should look familiar. For example, consider the following query for a store's first three products (notice `first: 3` passed to `products`): @@ -322,7 +163,7 @@ query paginateProducts { } ``` -You can run this query against an example storefront using the [GraphQL Playground](/graphql-playground?tabs=firstThreeProducts). +You can run this query against an example storefront using the [GraphQL Storefront playground](/graphql-storefront/playground?tabs=firstThreeProducts). The results look something like the following: @@ -429,8 +270,7 @@ The results will look something like this (notice the last product `entityId: 82 } ``` - -This same approach can be used to *slice* any GraphQL connection and paginate through the *slices* using `startCursor` and `endCursor`. For example, the following query gets the first thirty brands: +You can use the same approach to *slice* any GraphQL connection and paginate through the *slices* using `startCursor` and `endCursor`. For example, the following query gets the first thirty brands: ```graphql filename="Example query using slices" showLineNumbers copy query brands { @@ -506,7 +346,7 @@ Complexity scores estimate the load that a single GraphQL request may generate. The API sets a complexity limit of 10,000 for each request to prevent excessive loads. Because all work is generated per request, the limit is fixed per request, regardless of the number of requests sent. -When you send a valid GraphQL request, the API returns the query complexity as an integer using the HTTP response header `X-Bc-Graphql-Complexity` . +When you send a valid request to the GraphQL Storefront API, the API returns the query complexity as an integer using the HTTP response header `X-Bc-Graphql-Complexity`. If a query's complexity score exceeds the complexity limit, an error response similar to the following appears: @@ -601,7 +441,7 @@ fragment ProductFields on Product { } ``` -You can easily reduce the complexity of this query by changing the number of products queried in each collection from `first:50` to `first:10`: +You can reduce the complexity of this query by changing the number of products queried in each collection from `first:50` to `first:10`: ```graphql filename="Example query with limited complexity" showLineNumbers copy query { @@ -633,9 +473,9 @@ query { } ``` -To reduce complexity, reduce the number of objects requested. For example, do the following: +To reduce complexity, reduce the number of objects requested. For example, you can do the following: * Limit collections to a smaller page size (for example, `first:10` instead of `first:50`). -* Reduce the number of items in nested collections, exponentially affecting complexity. +* Reduce the number of items in nested collections, which exponentially affects complexity. * Request fewer fields on objects, and don't request fields you don't need. Mutations have a higher complexity than queries; you can only send one mutation in a single request. [Pagination info](#pagination) also contributes to complexity. @@ -736,7 +576,7 @@ For example, if your store hash is `abc123` and your channel ID is `456`, the ch For a channel's permanent URL to respond to requests, you must first [create a site](/docs/rest-management/sites#create-a-site) for the channel. - When you create a GraphQL Storefront API token, include the channel ID of the channel on which you wish to use the token. Otherwise, the server will reject your requests. See this article's section on [Creating a token](#creating-a-token). + When you create a GraphQL Storefront API token, include the channel ID of the channel on which you wish to use the token. Otherwise, the server will reject your requests. See the section on [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in the GraphQL Storefront authentication article. ### I want to run requests from a front-end application or browser. I only show anonymous information, or I do not support signing in as a customer diff --git a/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx b/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx index 1bc65c5c2..0a2e998ff 100644 --- a/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx +++ b/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx @@ -5,7 +5,7 @@ keywords: graphql, carts, checkout, address, headless, currency, currencies, pay # GraphQL Storefront API: Carts and Checkout -BigCommerce's GraphQL Storefront API provides the same access to cart and checkout objects as the REST Storefront API. Having access to cart and checkout data in the graph alongside related data makes it easier to build headless storefront applications. +BigCommerce's [GraphQL Storefront API](/docs/storefront/graphql) provides the same access to cart and checkout objects as the REST Storefront API. Having access to cart and checkout data in the graph alongside related data makes it easier to build headless storefront applications. Developers can use frontend GraphQL to create an end-to-end shopper experience. Cart and checkout-related mutations and queries can do the following: * Create a cart @@ -33,9 +33,9 @@ To make requests, create a [store-level API account](/docs/start/authentication/ No additional scopes are required to use the GraphQL Storefront API. -To generate a bearer token your application can pass to authenticate calls to the GraphQL Storefront API, use either the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) or the [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) REST endpoint. On a Stencil storefront, you can also access a token at render time using a Handlebars property. Learn more about [Using Auto-Generated Tokens in Stencil Themes](/docs/storefront/graphql#using-auto-generated-tokens-in-stencil-themes). +To generate a bearer token to authenticate calls to the GraphQL Storefront API, use either the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) or the [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) REST endpoint. On a Stencil storefront, you can also access a token at render time using a Handlebars property. Learn more about [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront). -For more information, see [Creating a Token](/docs/storefront/graphql#creating-a-token) in the GraphQL Storefront API Overview and [Dynamic Tokens](/docs/start/authentication#bigcommerce-generated-jwts) in the Authentication and Example Requests article. +For more information, see [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in Authenticating requests to the GraphQL Storefront API and [dynamic tokens](/docs/start/authentication#bigcommerce-generated-jwts) in the Authentication and example requests article. ## Handling payments @@ -1129,7 +1129,7 @@ Join our [Developer Community](/community) to share your feedback with us in the ### Articles * [GraphQL Storefront API Overview](/docs/storefront/graphql) -* [GraphQL Storefront API Overview: Using auto-generated tokens in Stencil themes](/docs/storefront/graphql#using-auto-generated-tokens-in-stencil-themes) +* [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront) * [Payments API Overview](/docs/store-operations/payments) * [Guide to API Accounts: Store-level API accounts](/docs/start/authentication/api-accounts#store-level-api-accounts) * [Guide to API Accounts: OAuth token creation scopes](/docs/start/authentication/api-accounts#token-creation-scopes) diff --git a/docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx b/docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx index 8b40cbfb9..d543b5126 100644 --- a/docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx +++ b/docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx @@ -16,7 +16,7 @@ The GraphQL Storefront API's faceted and textual search lets you create the foll You can access these features by querying the `SearchProducts` field. Note that you can query facets, filter by rating, or filter by "in-stock" only if the merchant is on a Pro or Enterprise plan. A merchant must [enable product filtering](https://support.bigcommerce.com/s/article/Product-Filtering-Settings?language=en_US#setup) for facets to be returned. In addition, only facets that a merchant marks as visible in their Product Filtering settings will be returned. -This page walks you through how to filter and query products and facets to display on your storefront. See the [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-playground) for full schema documentation. +This page walks you through how to filter and query products and facets to display on your storefront. See the [GraphQL Storefront Playground](/graphql-storefront/playground) for full schema documentation. ## Filter products and facets @@ -50,12 +50,12 @@ To use faceted and textual search, specify a filter in the argument for `SearchP isInStock:true } ... -) { +) ... ``` These filters affect **both** the products and facets that are returned. For example, filtering by rating returns only products within the specified rating range and only facets that have products within the rating range. -See the [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-playground) for descriptions of each filter. +See the [GraphQL Storefront playground](/graphql-storefront/playground) for descriptions of each filter. ## Get products @@ -365,7 +365,7 @@ query { -For a complete list of facets, see the [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-playground). +For a complete list of facets, see the [GraphQL Storefront playground](/graphql-storefront/playground). ## Put it all together: get products and facets @@ -595,5 +595,5 @@ If a merchant has not enabled product filtering, you will receive an empty array ## Resources -- [GraphQL Storefront API Overview](/docs/storefront/graphql) -- [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-playground) +- [GraphQL Storefront API overview](/docs/storefront/graphql) +- [GraphQL Storefront playground](/graphql-storefront/playground) diff --git a/docs/api-docs/storefront/graphql/graphql-products.mdx b/docs/api-docs/storefront/graphql/graphql-products.mdx index 076487b32..9615181ef 100644 --- a/docs/api-docs/storefront/graphql/graphql-products.mdx +++ b/docs/api-docs/storefront/graphql/graphql-products.mdx @@ -858,19 +858,19 @@ Query reviews for products. You retrieve only reviews that a merchant has approv ## Resources ### GraphQL documentation -- [GraphQL Storefront API Overview](/docs/storefront/graphql) -- [Guide to Working with Product Variants](/docs/storefront/graphql/examples/variants) -- [GraphQL Storefront API Explorer](https://developer.bigcommerce.com/graphql-storefront/explorer) -- [GraphQL Storefront API Playground](https://developer.bigcommerce.com/graphql-storefront/playground) -- [GraphQL Language (graphql.org)](https://graphql.org/learn/queries) -- [GraphQL Schema and Types (graphql.org)](https://graphql.org/learn/schema) +- [GraphQL Storefront API overview](/docs/storefront/graphql) +- [Guide to working with product variants](/docs/storefront/graphql/examples/variants) +- [GraphQL Storefront API explorer](https://developer.bigcommerce.com/graphql-storefront/explorer) +- [GraphQL Storefront API playground](https://developer.bigcommerce.com/graphql-storefront/playground) +- [GraphQL language (graphql.org)](https://graphql.org/learn/queries) +- [GraphQL schema and types (graphql.org)](https://graphql.org/learn/schema) ### REST API reference -- [Catalog API- Products](/docs/rest-catalog/products) overview -- [Catalog API- Product Options](/docs/rest-catalog/product-variant-options) overview -- [Catalog API- Update a product metafield](/docs/rest-catalog/products/metafields#update-a-product-metafield) endpoint -- [Catalog API- Get product metafields](/docs/storefront/graphql/examples/products#get-product-metafields) endpoint -- [Catalog API- Get variant metafields](/docs/storefront/graphql/examples/variants#get-variant-metafields) endpoint +- [Catalog API - Products](/docs/rest-catalog/products) overview +- [Catalog API - Product options](/docs/rest-catalog/product-variant-options) overview +- [Catalog API - Update a product metafield](/docs/rest-catalog/products/metafields#update-a-product-metafield) endpoint +- [Catalog API - Get product metafields](/docs/storefront/graphql/examples/products#get-product-metafields) endpoint +- [Catalog API - Get variant metafields](/docs/storefront/graphql/examples/variants#get-variant-metafields) endpoint ### Support articles -- [Product Options (Help Center)](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US) +- [Product options (Help Center)](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US) diff --git a/docs/api-docs/storefront/graphql/graphql-site-content.mdx b/docs/api-docs/storefront/graphql/graphql-site-content.mdx index f19117819..0f02ddf2a 100644 --- a/docs/api-docs/storefront/graphql/graphql-site-content.mdx +++ b/docs/api-docs/storefront/graphql/graphql-site-content.mdx @@ -631,17 +631,19 @@ query { ## Resources -### API References -- [Pages V3 API- Page Types](/docs/rest-content/pages#page-types) -- [Widgets API](/docs/storefront/widgets) -- [Widget Tutorial- Widget Placement](/docs/storefront/widgets/guide#create-a-placement) +### Docs and reference + +- [Pages - page types](/docs/rest-content/pages#page-types) +- [Widgets overview](/docs/storefront/widgets) +- [Tutorial on widget placement](/docs/storefront/widgets/guide#create-a-placement) ### GraphQL Storefront API -- [GraphQL Storefront API Overview](/docs/storefront/graphql) -- [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-playground) -### Support articles +- [GraphQL Storefront API overview](/docs/storefront/graphql) +- [GraphQL Storefront playground](/graphql-storefront/playground) + +### Help Center articles -- [Web Pages](https://support.bigcommerce.com/s/article/Web-Pages?language=en_US) +- [Web pages](https://support.bigcommerce.com/s/article/Web-Pages?language=en_US) - [Banners](https://support.bigcommerce.com/s/article/Creating-Editing-Banners?language=en_US) - [Widgets](https://support.bigcommerce.com/s/article/Page-Builder?language=en_US#builder) diff --git a/docs/api-docs/storefront/graphql/graphql-variants.mdx b/docs/api-docs/storefront/graphql/graphql-variants.mdx index afd2bdebd..aff810109 100644 --- a/docs/api-docs/storefront/graphql/graphql-variants.mdx +++ b/docs/api-docs/storefront/graphql/graphql-variants.mdx @@ -784,18 +784,18 @@ The following query retrieves the first variant metafield for the specified vari ## Resources ### GraphQL documentation -- [GraphQL Storefront API Overview](/docs/storefront/graphql) -- [Guide to Working with Products](/docs/storefront/graphql/examples/products) -- [GraphQL Storefront API Explorer](https://developer.bigcommerce.com/graphql-storefront/explorer) -- [GraphQL Storefront API Playground](https://developer.bigcommerce.com/graphql-storefront/playground) -- [GraphQL Language (graphql.org)](https://graphql.org/learn/queries) -- [GraphQL Schema and Types (graphql.org)](https://graphql.org/learn/schema) +- [GraphQL Storefront API overview](/docs/storefront/graphql) +- [Guide to Working with products](/docs/storefront/graphql/examples/products) +- [GraphQL Storefront API explorer](https://developer.bigcommerce.com/graphql-storefront/explorer) +- [GraphQL Storefront API playground](https://developer.bigcommerce.com/graphql-storefront/playground) +- [GraphQL language (graphql.org)](https://graphql.org/learn/queries) +- [GraphQL schema and types (graphql.org)](https://graphql.org/learn/schema) ### REST API endpoints -- [Catalog API- Variants](/docs/rest-catalog/product-variants) overview -- [Catalog API- Update product variant metafields](/docs/rest-catalog/product-variants/metafields#update-product-variant-metafields) endpoint -- [Catalog API- Get variant metafields](/docs/storefront/graphql/examples/variants#get-variant-metafields) endpoint -- [Catalog API- Get product metafields](/docs/storefront/graphql/examples/products#get-product-metafields) endpoint +- [Catalog API - Variants](/docs/rest-catalog/product-variants) overview +- [Catalog API - Update product variant metafields](/docs/rest-catalog/product-variants/metafields#update-product-variant-metafields) endpoint +- [Catalog API - Get variant metafields](/docs/storefront/graphql/examples/variants#get-variant-metafields) endpoint +- [Catalog API - Get product metafields](/docs/storefront/graphql/examples/products#get-product-metafields) endpoint ### Support articles -- [Product Options (Help Center)](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US) +- [Product options (Help Center)](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US) diff --git a/docs/api-docs/storefront/widgets/product-widget-tutorial.mdx b/docs/api-docs/storefront/widgets/product-widget-tutorial.mdx index 33648e47e..88c9ad6cd 100644 --- a/docs/api-docs/storefront/widgets/product-widget-tutorial.mdx +++ b/docs/api-docs/storefront/widgets/product-widget-tutorial.mdx @@ -7,20 +7,20 @@ keywords: widgets, graphql, stencil, handlebars, currency, currencies, Widgets are configurable and reusable components of content that merchants can display on their storefront. Widgets consist of a combination of HTML/CSS, JavaScript, and Handlebars, and are rendered as part of the storefront’s HTML. -In this tutorial, we will walk you through the process of creating a product widget powered by BigCommerce's [Widgets API](/docs/storefront/widgets) and [GraphQL Storefront API](/docs/storefront/graphql). This setup allows widgets to dynamically update and display information such as product name, image, and price. By the end of this tutorial, you should have a functional widget that is configurable via the [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) UI in a store's control panel. +In this tutorial, we will walk you through the process of creating a product widget powered by BigCommerce's [widgets feature](/docs/storefront/widgets) and the [GraphQL Storefront API](/docs/storefront/graphql). This setup allows widgets to dynamically update and display information such as product name, image, and price. By the end of this tutorial, you should have a functional widget that is configurable using the [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) UI in a store's control panel. ## Prerequisites * [A BigCommerce store](https://support.bigcommerce.com/s/article/Starting-a-Bigcommerce-Trial). -* API OAuth [access token](/docs/start/authentication/api-accounts) with the OAuth **Content** scope set to **modify**. -* Understanding of [widgets](/docs/storefront/widgets#widgets) and the [Widgets API](/docs/storefront/widgets). +* A store-level or app-level [API account](/docs/start/authentication/api-accounts) with the OAuth **Content** scope set to **modify**. +* Understanding of [widgets](/docs/storefront/widgets#widgets) and the [REST Content API's widgets feature](/docs/rest-content/widgets). * Familiarity with [Page Builder](/docs/storefront/stencil/content/page-builder). -The steps in this tutorial assume that you are familiar with BigCommerce’s Widgets API, and have obtained the API `access_token` with the `content` `modify` scope. The API `access_token` is required to inject, remove, and list widgets into any page of the store. To learn more about the Widgets API, see [Widgets API Overview](/docs/storefront/widgets). For information on how to create an API account, see [Creating an API Account](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating). +The steps in this tutorial assume that you are familiar with BigCommerce’s widgets feature, and have created a store-level or app-level API account with the `content: modify` scope. The API account's `access_token` is required to inject, remove, or list widgets on any page of the store. To learn more about widgets, see the [Widgets overview](/docs/storefront/widgets). For information on how to create an API account, see the [Guide to API accounts](/docs/start/authentication/api-accounts). ## Create the widget template -To create a widget, you first need to create a template for it. To [create a widget template](/docs/rest-content/widgets/widget-template#create-a-widget-template), send a `POST` request to `/v3/content/widget-templates`. +To create a widget, you first need to create a template for it. Use the [Create a widget template](/docs/rest-content/widgets/widget-template#create-a-widget-template) endpoint. @@ -146,7 +146,7 @@ Accept: application/json |`name`|string|The name of the widget template.| |`schema`|object|The widget settings JSON [schema](/docs/storefront/widgets/input-reference/schema) for [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) UI.| |`template`|string|The [widget template](/docs/storefront/widgets#widget-templates) rendered as Handlebars HTML.| -|`storefront_api_query`|string|[GraphQL Storefront API](/docs/storefront/graphql) query that provides widget data; accessed in a template via `{{_.data}}`.| +|`storefront_api_query`|string|[GraphQL Storefront API](/docs/storefront/graphql) query that provides widget data; accessed in a template using `{{_.data}}`.| ### GraphQL queries @@ -173,9 +173,7 @@ Doing so creates a [widget](/docs/rest-content/widgets/widget#create-a-widget) a To view the widget's data, retrieve the widget's ID by accessing its `data-widget-id` attribute in the browser's developer tools, then pass it in a `GET` request to [`/v3/content/widgets/{uuid}`](/docs/rest-content/widgets/widget#get-a-widget). -Alternatively, you can send a `GET` request to [`/v3/content/widgets`](/docs/rest-content/widgets/widget#get-all-widgets), passing your `widget_template_uuid` as a query parameter. - -The [response](/docs/rest-content/widgets/widget#get-a-widget) should be similar to the following example: +Alternatively, you can send a request to the [Get all widgets](/docs/rest-content/widgets/widget#get-all-widgets) endpoint, passing your `widget_template_uuid` as a query parameter. The following code block shows an example response. ```json showLineNumbers copy @@ -263,7 +261,7 @@ The [response](/docs/rest-content/widgets/widget#get-a-widget) should be similar ## Place the widget using the API -It is also possible to place widgets programmatically using the API. First, [create a widget](/docs/rest-content/widgets/widget#create-a-widget) by sending a `POST` request to `/v3/content/widgets`. +It is also possible to place widgets programmatically using the API. First, send a request to the [Create a widget](/docs/rest-content/widgets/widget#create-a-widget) endpoint. ```http showLineNumbers copy POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/widgets @@ -277,10 +275,8 @@ Accept: application/json } ``` -Take note of the widget's `uuid` returned in the [response](/docs/rest-content/widgets/widget#create-a-widget). You will need the widget's `uuid` to [create a placement](/docs/rest-content/widgets/widget#create-a-widget) for your widget. - +Take note of the widget's `uuid` returned in the response. You will need the widget's `uuid` to [Create a placement](/docs/rest-content/widgets/placement#create-a-placement) for your widget. The following code block gives an example response -**Response:** ```json showLineNumbers copy { "data": { @@ -290,7 +286,7 @@ Take note of the widget's `uuid` returned in the [response](/docs/rest-content/w } ``` -To [create a placement](/docs/rest-content/widgets/placement#create-a-placement), send a `POST` request to `/v3/content/placements`. +To create a widget placement, use the [Create a placement](/docs/rest-content/widgets/placement#create-a-placement) endpoint. ```http showLineNumbers copy POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/placements @@ -306,10 +302,9 @@ Accept: application/json } ``` +For a list of accepted `template_file` values, see the [Create a placement](/docs/rest-content/widgets/widget#create-a-widget) reference. -For a list of accepted `template_file` values, see [create a placement](/docs/rest-content/widgets/widget#create-a-widget). - -To [get a list of theme regions](/docs/rest-content/widgets/regions#get-theme-regions) for the `region` property, send a `GET` request to `/v3/content/regions?template_file={{TEMPLATE_FILE}}`. +To determine the value of the `region` property, send a request to the [Get a list of theme regions](/docs/rest-content/widgets/regions#get-theme-regions) endpoint and pass the desired `template_file` value as a query parameter. ```http showLineNumbers copy GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/regions?template_file={{TEMPLATE_FILE}} @@ -320,10 +315,12 @@ Accept: application/json ## Related resources ### Articles -* [GraphQL Storefront API Overview](/docs/storefront/graphql) -* [Page Builder Overview](/docs/storefront/stencil/content/page-builder) -* [Widgets API Overview](/docs/storefront/widgets) -* [Widget UI Schema](/docs/storefront/widgets/input-reference/schema) -### Endpoints -* [Widgets API](/docs/rest-content/widgets) +* [GraphQL Storefront API overview](/docs/storefront/graphql) +* [Page Builder overview](/docs/storefront/stencil/content/page-builder) +* [Widgets overview](/docs/storefront/widgets) +* [Widget UI schema](/docs/storefront/widgets/input-reference/schema) + +### API reference + +* [REST Content API - Widgets](/docs/rest-content/widgets) diff --git a/docs/api-docs/users/overview.mdx b/docs/api-docs/users/overview.mdx index bc304b493..b4cb8000c 100644 --- a/docs/api-docs/users/overview.mdx +++ b/docs/api-docs/users/overview.mdx @@ -1,8 +1,8 @@ -# GraphQL Users API Overview +# GraphQL Account API: Users overview ## Introduction -The GraphQL Users API is an account-level GraphQL API that allows you to create, edit, and delete BigCommerce control panel users. This highly requested feature is primarily useful for Enterprise merchants who need to audit existing users or integrate with third-party user management systems. +The GraphQL Account API's users feature lets you create, edit, and delete BigCommerce control panel users. This highly requested feature is primarily useful for Enterprise merchants who need to audit existing users or integrate with third-party user management systems. ## What is a user @@ -10,7 +10,7 @@ A user is an account that can sign in to the BigCommerce control panel for an ac ## Prerequisites -Before getting started with the GraphQL Users API, make sure you have the following: +Before getting started with the GraphQL Account API's users feature, make sure you have the following: * BigCommerce store * A valid access token from an account-level API account that has sufficient permissions to make the desired requests. @@ -34,7 +34,7 @@ For more information on access token authentication, see [Authentication and Exa ## Getting started -The GraphQL Users API introduces a new way to manage control panel users. Using an OAuth-based API account, you can integrate our APIs with your current system to create a custom experience. +The GraphQL Account API's users feature introduces a new way to manage control panel users. Using an OAuth-based API account, you can integrate our platform with your current system to better serve the store or account's needs. Begin with the following steps to get started: @@ -47,9 +47,9 @@ Begin with the following steps to get started: ## Example requests -This section contains examples of GraphQL Users API queries and mutations that you can send with the following HTTP configuration: +This section contains examples of GraphQL Account API users queries and mutations that you can send with the following HTTP configuration: -```http filename="GraphQL Users API HTTP configuration" showLineNumbers copy +```http filename="GraphQL Account API HTTP configuration" showLineNumbers copy POST https://api.bigcommerce.com/accounts/{{account_uuid}}/graphql X-Auth-Token: {{access_token}} Accept: application/json @@ -1003,5 +1003,5 @@ The following mutation removes a user from a store: ### Articles -* [Authentication and Example Requests](/docs/start/authentication) -* [Guide to API Accounts](/docs/start/authentication/api-accounts) +* [Authentication and example requests](/docs/start/authentication) +* [Guide to API accounts](/docs/start/authentication/api-accounts) diff --git a/docs/b2b-edition/about/api-status-codes.mdx b/docs/b2b-edition/about/api-status-codes.mdx new file mode 100644 index 000000000..7342899d0 --- /dev/null +++ b/docs/b2b-edition/about/api-status-codes.mdx @@ -0,0 +1,63 @@ +# API Status Codes + +The BigCommerce B2B Edition APIs use standard HTTP response status codes. When there's an error, the response body also contains an error message to help resolve the problem. + +## 2XX Success + +2xx codes are returned for requests that the server understood and processed successfully. + +| Code | Text | Purpose | +|-|-|-| +| **200** | **OK** | For successful `GET` and `PUT` requests. | +| **201** | **Created** | For a successful `POST` request. | +| **202** | **Accepted** | For a request that created a scheduled task to perform the actual request. | +| **204** | **No Content** | For a successful request that produced no response, such as `DELETE` requests. | + +## 3xx Redirection + +3xx codes are returned for requests that require further action. + +| Code | Text | Purpose | +|-|-|-| +| **301** | **Moved Permanently** | When the API routes have changed, or the incoming request uses an insecure protocol such as `http`, the request will be redirected to the secure (`https`) version of the current API route. | +| **304** | **Not Modified** | This status code will be returned if the request included an `If-Modified-Since` header, but the resource has *not* been modified since the specified date.| + +## 4xx Client Error + +4xx codes are returned for requests that could not be processed because there were problems with the request or the data. + +| Code | Text | Purpose | +|-|-|-| +| **400** | **Bad Request** | Issued when a malformed request was sent. +| **401** | **Unauthorized** | This response is sent when your client failed to provide credentials or its credentials were invalid. | +| **403** | **Forbidden** | Returned when permissions do not allow the operation. +| **404** | **Not Found** | When a particular resource doesn’t exist or couldn’t be found. | +| **405** | **Method Not Allowed** | The resource was found, but doesn’t support the request method. Issued when either a specific method isn’t yet implemented on a resource, or the resource doesn’t support the method at all. For example, a `PUT` request to `/companies` is invalid, but a `PUT` request to `/companies/{companyId}` is valid. | +| **406** | **Not Acceptable** | When the client specifies a response content type in the `Accept` header that is not supported. | +| **409** | **Conflict** | A change requested by the client is being rejected because it did not meet a condition imposed by the server. The exact reasons for this response vary from one resource to another. For example, attempting to delete a category whose deletion would orphan products. Additional information about the conflict, and about how to resolve it, may be available in the response's `details` section. | +| **413** | **Request Entity Too Large** | When the client requests too many objects. For example, the `limit` parameter exceeded the maximum. | +| **415** | **Unsupported Media Type** | There are issues with the `Content-Type` header. +| **422** | **Missing or Invalid Data** | The request could not be processed, either because it omitted required fields or because it contained invalid data. See the response for more details. | +| **429** | **Too Many Requests** | When an OAuth client exceeds the [rate limit](/docs/start/best-practices#api-rate-limits) for API requests to a store. | + +## 5xx Server Error + +5xx codes are returned for requests that could not be processed because there was an internal error with the API or server. + +| Code | Text | Purpose | +|-|-|-| +| **500** | **Internal Server Error** | When an error has occurred within the API. | +| **501** | **Not Implemented** | When a request method is sent that is not supported by the API, such as `TRACE` or `PATCH`. | +| **503** | **Service Unavailable** | When the store is “Down for Maintenance”, being upgraded to a new version, or is suspended due to administrative action or a billing issue.| +| **507** | **Insufficient Storage** | When the store has reached a limitation for the resource. | + +## Troubleshooting + +| Code | Common Causes | Solutions | +|-|-|-| +|**204**, **301**, and **302**| Redirects | Try the `www` or non-`www` version of the URL. | +|**400**|Invalid syntax, required data missing, `Content-Type` header missing|Double-check request body for syntax errors and missing data; check the `Content-Type` header. | +|**401** |API credentials are missing or invalid.|Double-check the `authToken`. Send cURL request with the same credentials to rule out app or config issues. | +| **403** | API account lacks required OAuth scopes, the store owner account changed, the requests exceeded an internal platform limit, or the route is incorrect. | Double-check OAuth Scopes. Check the endpoint route. Are the URL and `authToken` correct? | +|**415**| Request headers specify an unsupported `Content-Type`, or the `Content-Type` header is missing altogether.| Double-check the `Content-Type` request header. | +|**500**| Expensive API calls or an internal server error.|Re-attempt the request three to five times, with increasing delays of at least a minute between attempts. | diff --git a/docs/b2b-edition/about/index.mdx b/docs/b2b-edition/about/index.mdx new file mode 100644 index 000000000..d45558c31 --- /dev/null +++ b/docs/b2b-edition/about/index.mdx @@ -0,0 +1,51 @@ +# About Our APIs + +## API environments + +Make BigCommerce B2B Edition API requests in the context of the storefront or server-to-server. + +| API | Base URL | +| -- | -- | +| GraphQL Storefront API | `https://api-b2b.bigcommerce.com/graphql` | +| REST Storefront API | See [endpoint reference](https://bundleb2b.stoplight.io/docs/openapi/rest-storefront/catalog) | +| REST Management V3 | `https://api-b2b.bigcommerce.com/api/v3/io/`| +| REST Management V2 | `https://api-b2b.bigcommerce.com/api/v2/io/`| + + + Note: some B2B Edition APIs rely on BigCommerce APIs, so there may be latency in data synchronization. + + +## Key resources + +| Resource | Description | +|--|--| +| [Company](https://bundleb2b.stoplight.io/docs/openapi/rest-management/company/operations/create-a-company#request-body) | Set client company info, administrator, and more. | +| [Address](https://bundleb2b.stoplight.io/docs/openapi/rest-management/address/operations/list-addresses#response-body) | Associate one or more addresses with a company. | +| [Order](https://bundleb2b.stoplight.io/docs/openapi/rest-management/orders/operations/get-a-order#response-body) | Extend the BigCommerce order object with B2B-specific information, such as purchase order number. | +| [Payment](https://bundleb2b.stoplight.io/docs/openapi/rest-management/payment/operations/list-company-payments#response-body) | Manage company payment methods. | +| [Sales staff](https://bundleb2b.stoplight.io/docs/openapi/rest-management/sales-staff/schemas/sales-staff) and [super admin](https://bundleb2b.stoplight.io/docs/openapi/rest-management/super-admin/operations/list-company-super-admins#response-body) | Manage sales staff and admin access privileges. | +| [Quote](https://bundleb2b.stoplight.io/docs/openapi/rest-management/quote) | Manage quotes. | +| [Proxy](https://bundleb2b.stoplight.io/docs/openapi/rest-management/v2/operations/create-a-proxy) | Create a third-party proxy. | + +## Request headers + +| Header | Expected value or type | Description | Example | +|:-------|:---------------|:------------|:--------| +| `authToken` | String | B2B Edition auth token | - | +| `Accept` | MIME types | The MIME type format that indicates which response type the request expects. For more information, see [HTTP Docs: Accept Header (MDN)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept). | `application/json` | +| `Content-Type` | MIME types | The MIME type of the request body. The API uses this value to validate and parse the request. For more information, see [HTTP Docs: Content-Type Header (MDN)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type). | `application/json` | +| `User-Agent` | String | We ask that you specify a user agent to identify your integration or client. | `PostmanRuntime/7.32.3` | + +## Pagination + +Use the `limit` and `offset` query parameters together to paginate responses. + +The `limit` value determines the number of records to return per page. The `offset` value is the number of results to skip before returning the first result. + +For example, passing the following query param string returns the 11th through 20th results: `offset=10&limit=10`. + +## Why do some API endpoints reference BundleB2B? + +BundleB2B was a purpose-built application that powered BigCommerce's original B2B Edition offering. + +In 2021, we acquired BundleB2B. Since that time, we've been integrating the BundleB2B API and features into our core product offerings. We continue to use the BundleB2B domain to prevent breaking changes for existing integrations. Our roadmap includes plans to use a new core BigCommerce domain to host our B2B Edition APIs. diff --git a/docs/b2b-edition/authentication/headless-auth.mdx b/docs/b2b-edition/authentication/headless-auth.mdx new file mode 100644 index 000000000..241456b0d --- /dev/null +++ b/docs/b2b-edition/authentication/headless-auth.mdx @@ -0,0 +1,35 @@ +# Authentication for headless storefronts + +To authenticate a headless storefront, use the following steps. + + + +### Get a customer-specific storefront authtoken + +Use the REST Management V3 API to [Get a storefront authtoken with credentials](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/create-a-auth-customer) endpoint. + +```http filename="Get a storefront authtoken" copy +POST https://api-b2b.bigcommerce.com/api/io/auth/customers +Accept: application/json +Content-Type: application/json + +{ + "storeHash": "theStoreHash", + "email": "bigCommerceCustomerEmail", + "password": "bigCommerceCustomerPassword", + "channelId": 1, + "name": "optionalTokenName" +} +``` + +### Pass the authtoken to the Buyer Portal JavaScript API + +```js +b2b.utils.user.loginWithB2BStorefrontToken(authTokenFromPreviousStep); +``` + +### Sign the customer in to BigCommerce + +The two preceding steps sign the customer in to B2B Edition. For the quote, cart, and checkout features to function, you must also sign the customer in to BigCommerce. You can do this using the [login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in), which is part of the GraphQL Storefront API. + + diff --git a/docs/b2b-edition/authentication/hosted-auth.mdx b/docs/b2b-edition/authentication/hosted-auth.mdx new file mode 100644 index 000000000..a1045c704 --- /dev/null +++ b/docs/b2b-edition/authentication/hosted-auth.mdx @@ -0,0 +1,79 @@ +# Authentication for hosted storefronts + +B2B Edition has four APIs that let you manage data, log in customers, make client-side queries for company information, and more. Each requires a different authentication method. + +## REST Management API + +B2B Edition's REST Management API require you to create and pass a token along with the request using the `authToken` header. + +For the REST Management V3 API, create an auth token using the [Create a server-to-server token](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/create-a-auth-backend) endpoint. + +For the REST Management V2 API, request an auth token by contacting support. + +## REST Storefront API + +To create a storefront auth token, use the following steps: + +First, make a request to the [BigCommerce Current Customer API](/docs/storefront-auth/current-customer), passing B2B Edition's client ID as the value of the `app_client_id` query parameter. Our client ID is `dl7c39mdpul6hyc489yk0vzxl6jesyx`. + +```http filename="Example request to BigCommerce Current Customer API" copy +https://{yourstore.example.com}/customer/current.jwt?app_client_id=dl7c39mdpul6hyc489yk0vzxl6jesyx +``` + +If your request is successful, BigCommerce returns a current customer [JSON web token (JWT)](https://jwt.io/). Retain the token. + +After you receive the current customer JWT, make a request to the B2B Edition [Get a storefront OpenAPI authtoken](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/get-a-auth-storefront) endpoint. Use the current customer JWT as the value of the `jwtToken` query parameter. + +A successful request to the [Get a storefront OpenAPI authtoken](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/get-a-auth-storefront) endpoint returns a B2B Edition REST Storefront API token, which you can pass as value of the `authToken` header in requests to the B2B Edition REST Storefront API. + +```curl filename="Example token request (CURL)" copy +curl https://api-b2b.bigcommerce.com/api/io/auth/storefront?jwtToken=bigCommerce.currentCustomerResponse.jwtString +``` + +```js filename="Example token request (Fetch)" copy +async function() { + try { + let authToken = await fetch({ + method: "get", + url: "https://api-b2b.bigcommerce.com/api/io/auth/storefront", + query:{ + jwtToken: "bigCommerce.currentCustomerResponse.jwtString" + } + }); + return authToken; + } catch(error) { + console.log(error); + throw error; + } +} +``` + +## REST Management V3 API + +To get a REST Management API auth token, use the [Get server to server OpenAPI tokens](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/create-a-auth-backend) endpoint. Send the store's `storeHash` and the email and password you use to sign in to the B2B Edition app in the store control panel. The response returns tokens you can use as the value of the authToken header in requests to the B2B Edition REST Management V3 API. + +For details, see the [Get server to server OpenAPI tokens](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/create-a-auth-backend) endpoint reference. + +```js http +async function() { + try { + let authToken = await fetch({ + method: "post", + url: "https://api-b2b.bigcommerce.com/api/io/auth/backend", + body:{ + storeHash: "theStoreHash", + email: "b2bEditionControlPanelUserLoginEmail", + password: "b2bEditionControlPanelUserPassword", + channelId: 1, + name: "optionalTokenName", + beginAt: 1000, + endAt: 17219304, + } + }); + return authToken; + } catch(error) { + console.log(error); + throw error; + } +} +``` diff --git a/docs/b2b-edition/best-practices.mdx b/docs/b2b-edition/best-practices.mdx new file mode 100644 index 000000000..a07b22891 --- /dev/null +++ b/docs/b2b-edition/best-practices.mdx @@ -0,0 +1,17 @@ +# Best Practices + +## Ensure your integration is up-to-date + +The B2B Edition team is actively developing both REST Management V3 API endpoints and the GraphQL Storefront API. We also integrate core BigCommerce updates as soon as possible. + +## API rate limits + +### Concurrent API call rate limits + +Certain API resources rate limit concurrent requests. This is to ensure the performance and reliability of the platform for all of our users. API calls are metered on a per-store, per-endpoint basis. + + + Do not exceed 10,000 requests per hour. This limitation is subject to change. + + +B2B Edition API requests that invoke additional API calls to BigCommerce's APIs are also subject to BigCommerce rate limits. diff --git a/docs/partner-apps/bundleb2b/b2b-edition.mdx b/docs/b2b-edition/stencil.mdx similarity index 100% rename from docs/partner-apps/bundleb2b/b2b-edition.mdx rename to docs/b2b-edition/stencil.mdx diff --git a/docs/msf/msf-api-guide.mdx b/docs/msf/msf-api-guide.mdx index 679a5c5d5..255e5bfc0 100644 --- a/docs/msf/msf-api-guide.mdx +++ b/docs/msf/msf-api-guide.mdx @@ -9,19 +9,19 @@ keywords: multistorefront, channels, multi-channel, multichannel, sort, graphql, When your integration creates a cart or checkout, make sure it specifies the `channel_id` for the storefront or other channel the shopper is using. -If the cart is associated with the shopper's channel and the relationship between a storefront's channel and site has been properly configured with the [Sites API](/docs/rest-management/sites#create-a-site), both [cart redirect URLs](/docs/rest-management/carts/redirects#create-cart-redirect-url) and [embedded checkout URLs](/docs/storefront/cart-checkout/embedded-checkout) will refer the shopper to the correct site. +If the cart is associated with the shopper's channel and the relationship between a storefront's channel and site has been properly configured using the [REST Management API's sites feature](/docs/rest-management/sites#create-a-site), both [cart redirect URLs](/docs/rest-management/carts/redirects#create-cart-redirect-url) and [embedded checkout URLs](/docs/storefront/cart-checkout/embedded-checkout) will refer the shopper to the correct site. -If your application interacts with shoppers, you can use the [GraphQL Storefront API: Carts and Checkout](/docs/storefront/cart-checkout/guide/graphql-storefront) to access cart and checkout data for shoppers in real time. +If your application interacts with shoppers, you can use the [GraphQL Storefront API's carts and checkout](/docs/storefront/cart-checkout/guide/graphql-storefront) features to access cart and checkout data for shoppers in real time. ## Categories -[Categories API reference documentation](/docs/rest-catalog/category-trees/categories#get-all-categories) +[Catalog API - Category trees and categories reference](/docs/rest-catalog/category-trees) Previously, a store had a collection of categories that were organized in a tree structure. This collection of categories has been abstracted from the store and converted into the store's first **category tree**. You can create multiple category trees, each of which you can assign to a storefront or other sales channel. ![categories-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/categories-diagram.webp) -To access the category structure used by a particular storefront, you must first identify which tree is tied to that storefront channel. You can do so by sending a request to the following endpoint. Include the `channel_id:in` query parameter, which accepts one or more channel IDs as a comma-separated list. +To access the category structure used by a particular storefront, you must first identify which tree is tied to that storefront channel. You can do so by sending a request to the [Get all category trees](/docs/rest-catalog/category-trees) endpoint. Include the `channel_id:in` query parameter, which accepts one or more channel IDs as a comma-separated list. ```http filename="Example request: Get category tree for channel 3" showLineNumbers copy GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/catalog/trees?channel_id:in=3 @@ -37,38 +37,39 @@ If your application interacts with shoppers, you may be able to use the [GraphQL ## Customers -[Customers API documentation](/docs/rest-management/customers) +[REST Management API - Customers reference](/docs/rest-management/customers) Each customer account has an `origin_channel_id` that references the channel on which it was created. Email addresses must be unique within each **channel**, rather than within the store. This means that a single email address can exist two (or more) times in one store: associated with two Customer IDs on two different channels. ## Orders -[Orders API reference documentation](/docs/rest-management/transactions) +[REST Management API - V2 orders reference](/docs/rest-management/orders) +[REST Management API - V3 orders transactions reference](/docs/rest-management/transactions) For applications that deal with order management, it is now crucial to include the `channel_id` as part of the order object. Among other benefits, linking each order to a channel will make it easier to sort, categorize, and filter orders by the storefront or other sales channel in which they were placed. You will also avoid accidentally having [an order associated with the default channel](/docs/storefront/multi-storefront#backwards-compatibility), which may confuse shoppers by exposing store configuration details that do not apply to their channel. -Similarly, if your application is shopper-facing and deals with orders, it's important to provide the appropriate channel-specific information to shoppers. For example, if your app sends order confirmation emails to customers, you'll need to ensure that any store information, URLs, and links in your email reflect the correct storefront or other sales channel. For more details, see the use case considerations at the end of [Managing Store Configuration](/docs/rest-management/settings#the-cumulative-effect-of-global-and-channel-specific-settings). +Similarly, if your application is shopper-facing and deals with orders, it's important to provide the appropriate channel-specific information to shoppers. For example, if your app sends order confirmation emails to customers, you'll need to ensure that any store information, URLs, and links in your email reflect the correct storefront or other sales channel. For more details, see the use case considerations at the end of [Managing store configuration](/docs/store-operations/settings/configuration#the-cumulative-effect-of-global-and-channel-specific-settings). ## Price lists -[Price List Assignments API documentation](/docs/rest-management/price-lists/price-lists-assignments#get-price-list-assignments) +[REST Management API - Price list assignments reference](/docs/rest-management/price-lists/price-lists-assignments) -Previously, price lists assignments were made with the V2 Customer Groups API. Price lists could only be assigned to customer groups. +Previously, price lists assignments were made with the REST Management API's V2 customer groups endpoints. Price lists could only be assigned to customer groups. -The V3 Price List Assignments API allows you to assign price lists to channels, customer groups, or the combination of a channel and customer group. Only one price list can apply at any given time, so BigCommerce determines which price list to apply using the following logic: +The REST Management API's V3 price list assignments endpoints let you assign price lists to channels, customer groups, or the combination of a channel and customer group. Only one price list can apply at any given time, so BigCommerce determines which price list to apply using the following logic: * If a price list assignment is found that matches both the shopper's active channel **AND** their current customer group, it will be used; otherwise, * If a price list assignment is found that both does not specify a channel **AND** matches the shopper's current customer group, it will be used; otherwise, * If a price list assignment is found that both matches the shopper's current channel **AND** does not specify a customer group, it will be used; otherwise, * The catalog default pricing will be used. -If your implementation uses price lists to manage pricing, we recommend that you start using the V3 Price List Assignments API so that your app fully understands and can reason about the pricing state for the customers, orders, and channels on the merchant's store. +If your implementation uses price lists to manage pricing, we recommend that you start using the [price list assignments](/docs/rest-management/price-lists/price-lists-assignments) endpoints so that your app fully understands and can reason about the pricing state for the customers, orders, and channels on the merchant's store. If your use case is primarily concerned with what the price will be for a given shopper, consider using the [GraphQL Storefront API](/docs/storefront/graphql) to fetch data about the shopper's view in real time. ## Products -[Channel Assignments API documentation]() +[Catalog API - Channel assignments reference](/docs/rest-catalog/products/channel-assignments) #### The cardinal rule of multi-channel sales @@ -79,19 +80,19 @@ It is important to understand the difference between assigning a product to a ca ![products-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/products-diagram.webp) -If your app provides merchants with a sales channel, such as an integration with a third-party marketplace, we recommend that you check the merchant's catalog to determine their existing channel assignments. This will help your app understand and communicate with the merchant about which products the integration's channel is currently permitted to offer for sale. For extended product information relevant to your channel, consult the [Channel Listings API](/docs/rest-management/channels/channel-listings#get-channel-listings). +If your app provides merchants with a sales channel, such as an integration with a third-party marketplace, we recommend that you check the merchant's catalog to determine their existing channel assignments. This will help your app understand and communicate with the merchant about which products the integration's channel is currently permitted to offer for sale. For extended product information relevant to your channel, use the [Get channel listings](/docs/rest-management/channels/channel-listings#get-channel-listings) endpoint. If your application interacts with shoppers, you can use the [GraphQL Storefront API](/docs/storefront/graphql) to get the correct product availability and data for a given shopper in real time. ### The nuances of channel assignments -Use the [Channel Assignments API](/docs/rest-catalog/products/channel-assignments#get-products-channel-assignments) to create and manage product assignments for [storefronts and other sales channels](/docs/storefront/multi-storefront#channels). +Use the [Catalog API's channel assignments feature](/docs/rest-catalog/products/channel-assignments#get-products-channel-assignments) to create and manage product assignments for [storefronts and other sales channels](/docs/storefront/multi-storefront#channels). A product assigned to a storefront channel can be sold on that channel, discovered in search, and accessed by direct link, unless that storefront's settings otherwise disable direct links. Removing a product from a channel will make that product unavailable on the given channel. The product will remain categorized, but it will not be available using category filters, search, or direct link. -Removing a product from a category does not remove it from the channel. Use the [Channel Assignments API](/docs/rest-catalog/products/channel-assignments#get-products-channel-assignments) to revoke channel assignments. +Removing a product from a category does not remove it from the channel. Use the [Delete product channel assignments](/docs/rest-catalog/products/channel-assignments#delete-products-channel-assignments) endpoint to revoke channel assignments. Removing a product from one or all of a channel's categories without revoking the channel assignment will remove the product from the category views and filters, but shoppers will still be able to access the product by search or direct link. This may be useful for sales campaigns that send shoppers a direct link to purchase a specific product. @@ -103,7 +104,7 @@ Scripts are associated with a particular site. Any scripts that were created pre ![scripts-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/scripts-diagram.webp) -[Scripts API reference documentation](/docs/rest-management/scripts) +[REST Management API - Scripts reference](/docs/rest-management/scripts) From a UX perspective, you may wish to make it clear to merchants who are setting up your app that they must explicitly select one or more storefront sites on which to install your app's storefront functionality. You should also provide ways to remove your scripts from each site and install your scripts on any new sites the merchant creates in the future. @@ -113,9 +114,9 @@ Pages are associated with a particular site. Any pages that were created previou ![pages-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/pages-diagram.webp) -[Pages API reference documentation](/docs/rest-content/pages#get-pages) +[REST Content API - Pages reference](/docs/rest-content/pages#get-pages) -The new V3 Pages API services multi-storefront use cases and provides several of the efficiency benefits that V3 APIs offer in comparison with their V2 equivalents. The V3 Pages API has `site_id` as a required parameter. +The REST Content pages endpoints service multi-storefront use cases and provide several of the efficiency benefits that V3 APIs offer versus their V2 equivalents. The REST Content API's pages endpoints have `site_id` as a required parameter. If your application reads pages-related data, be sure to filter by the appropriate `site_id` when dealing with a particular site. Similarly, when writing new pages, be sure to provide the correct `site_id`. @@ -123,17 +124,17 @@ If your application reads pages-related data, be sure to filter by the appropria Widget templates, widgets, and widget placements are all associated with a particular channel. Any previously existing widget-related objects are assigned to the default channel, which is the first channel that was created on the store. -Going forward, we recommend that you use the query parameters on each Widgets API endpoint to pass the `channel_id` of the storefront for which you are managing content. This will restrict the scope of your requests to the target channel. When you create new widget objects, be sure to include the correct `channel_id`. +Going forward, we recommend that you use the query parameters on each REST Content API widgets endpoint to pass the `channel_id` of the storefront for which you are managing content. This will restrict the scope of your requests to the target channel. When you create new widget objects, be sure to include the correct `channel_id`. ### 301 Redirects ![redirects-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/redirects-diagram.webp) -[Redirects API documentation](/docs/rest-management/redirects) +[REST Management API - Redirects reference](/docs/rest-management/redirects) Redirects are associated with a particular site. Any redirects that were created previously have been assigned to the default site, the ID of which is `1000` for each merchant store. -The new V3 Redirects API services multi-storefront use cases and provides several of the efficiency benefits that V3 APIs offer in comparison with their V2 equivalents. The V3 Redirects API has `site_id` as a required parameter. +The REST Management API's redirects feature services multi-storefront use cases and provides several of the efficiency benefits that V3 APIs offer versus their V2 equivalents. The redirects endpoints have `site_id` as a required parameter. If your application reads redirects-related data, be sure to filter by the appropriate `site_id` when dealing with a particular site. Similarly, when writing new redirects, be sure to provide the correct `site_id`. @@ -145,19 +146,20 @@ Because we now support installing different themes and/or theme configurations f #### Locating the configuration ID -The `configuration_id` is the same as a configuration's `uuid`, returned in the [Get Theme Configuration](/docs/rest-content/themes/theme-configurations#get-theme-configuration) response body. +The `configuration_id` is the same as a configuration's `uuid`, returned in the [Get theme configuration](/docs/rest-content/themes/theme-configurations#get-theme-configuration) response body. ![themes-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/themes-diagram.webp) -[Themes API documentation](/docs/rest-content/themes) + +[REST Content API - Themes reference](/docs/rest-content/themes) To understand which theme is active for a particular site, you can check the [Get active theme](/docs/rest-management/channels/channel-active-theme) endpoint. -Themes themselves remain "global" to the store, but each theme now exposes a list of configuration settings. Each theme has a default configuration, but you can use the store control panel's Page Builder feature in the BigCommerce control panel to apply a different configuration to a storefront. +Themes themselves remain "global" to the store, but each theme now exposes a list of configuration settings. Each theme has a default configuration, but you can use the store control panel's Page Builder feature to apply a different configuration to a particular storefront. -#### Themes API roadmap -Our Themes API roadmap includes the following: +#### Themes feature roadmap +Our Themes feature roadmap includes the following: * Exposing an endpoint to create a new theme configuration * Adding a `download_url` query parameter to the [Get all themes](/docs/rest-content/themes#get-all-themes) endpoint @@ -168,7 +170,7 @@ Because each theme can define its own configuration, the response from the [Get ### Subscribers -[Subscribers API documentation](/docs/rest-management/subscribers) +[REST Management API - Subscribers reference](/docs/rest-management/subscribers) Each subscriber now has an `origin_channel_id` property that identifies the channel on which the subscriber consented to receive a newsletter. When not supplied, the `origin_channel_id` will default to `1`. To comply with electronic consent and privacy regulations, we recommend that your implementation specify the `origin_channel_id` for every subscriber. diff --git a/docs/msf/msf-overview.mdx b/docs/msf/msf-overview.mdx index 6570a3e1b..4a334f633 100644 --- a/docs/msf/msf-overview.mdx +++ b/docs/msf/msf-overview.mdx @@ -6,13 +6,13 @@ Multi-storefront capabilities extend the reach of BigCommerce stores. Merchants We intend to provide these new features with no breaking changes to the platform so that existing single-storefront merchant stores continue to function as they did previously, and the existing APIs function as before for these stores. However, there are several additive changes to the platform. To provide the full multi-storefront, multi-channel support that merchants with complex stores expect and require, our partners must adapt. -This guide provides an overview of the core features that power multi-storefront, multi-channel stores. Our [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide) and [Multi-Storefront App Compatibility and Optimization](/docs/integrations/apps/multi-storefront) article provide guidance on how developers can modify and reimagine applications to support multi-storefront, multi-channel selling. +This guide provides an overview of the core features that power multi-storefront, multi-channel stores. Our [Multi-Storefront API guide](/docs/storefront/multi-storefront/guide) and [Multi-storefront app compatibility and optimization](/docs/integrations/apps/multi-storefront) article provide guidance on how developers can modify and reimagine applications to support multi-storefront, multi-channel selling. ![channels-sites-diagram.webp](https://storage.cloud.google.com/bigcommerce-production-dev-center/images/msf-beta-guide/channels-sites-diagram.webp) ## Channels -[Channels API reference documentation](/docs/rest-management/channels) +[REST Management API channels reference](/docs/rest-management/channels) A **channel** is a place where a merchant's store sells products. Storefront websites, marketplaces like Amazon and eBay, point-of-sale systems, and marketing feeds are all sales channels. A custom channel may not fit into any one of these types. A merchant creates a new channel to sell in a new context. Channels can help to organize a merchant's complex business by allowing them to sell to many customers in many places from a single catalog in one BigCommerce store. In a transactional context, channel objects link together a variety of other objects that describe a particular shopper's experience on a sales channel. @@ -29,20 +29,20 @@ A channel is defined by the following: * `custom` * A `platform`, which indicates the platform on which shoppers primarily use the channel -Consult the [Channels API documentation](/docs/rest-management/channels) for more information on valid combinations of `type` and `platform`. For example, a BigCommerce-hosted Stencil storefront has a type of `storefront` and a platform of `bigcommerce`. +Consult the [REST Management API channels reference](/docs/rest-management/channels) for more information on valid combinations of `type` and `platform`. For example, a BigCommerce-hosted Stencil storefront has a type of `storefront` and a platform of `bigcommerce`. Each BigCommerce store is provisioned with one channel out of the box, intended for its first Stencil storefront. The ID of this channel is `1` for all BigCommerce stores. This channel may also be referred to as the "default channel", and it cannot be deleted. -#### Backwards compatibility -In some cases when a more specific channel cannot be associated with an interaction, channel `1` may be used for backwards compatibility. For example, orders created using the V2 Orders API that do not specify a channel ID will be associated with channel `1`. +**Backwards compatibility** +In some cases when a more specific channel cannot be associated with an interaction, channel `1` may be used for backwards compatibility. For example, when an app creates an order using the V2 orders feature of the REST Management API, but does not specify a channel ID, the order will be associated with channel `1`. -To learn more about upgrading your application to support multi-channel sales, see [Multi-Storefront App Compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). +To learn more about upgrading your application to support multi-channel sales, see [Multi-storefront app compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). ## Sites -[Sites API documentation](/docs/rest-management/sites) +[REST Management API sites reference](/docs/rest-management/sites) A **site** is a website owned or controlled exclusively by the merchant, usually for hosting a storefront website. Every site will be tied to exactly one channel, but because not all sales channels are sites, channels are not required to have a site. Sites are mainly relevant to storefront-type channels, and they serve as containers for settings and objects that only apply to websites. @@ -55,20 +55,20 @@ Every Stencil storefront has a site, in addition to having a channel of type `st The first Stencil storefront of each merchant store has an ID of `1000` and is also known as the default site. It cannot be deleted. -To learn more about upgrading your application to support multi-storefront functionality, see [Multi-Storefront App Compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). +To learn more about upgrading your application to support multi-storefront functionality, see [Multi-storefront app compatibility](/docs/integrations/apps/multi-storefront#upgrading-existing-apps). ## Settings & Configuration -[Settings API Documentation](/docs/rest-management/settings) +[REST Management API settings reference](/docs/rest-management/settings) -The Settings APIs now allow your app to read and write many important elements of the store's configuration, both globally and on a per-channel basis. If your application manages settings, you can use these endpoints to enable merchants to configure different settings for different channels. You may also wish to read and respect any merchant-configured settings that control details of your application's behavior. +The REST Management API's settings feature lets your app read and write many important elements of the store's configuration, both globally and on a per-channel basis. If your application manages settings, you can use these endpoints to enable merchants to configure different settings for different channels. You may also wish to read and respect any merchant-configured settings that control details of your application's behavior. If your application interacts with shoppers, you may be able to use the [GraphQL Storefront API](/docs/storefront/graphql) instead to get the relevant settings for a given shopper in real time. -For a deep dive into this new class of APIs, see our [Settings API Overview](/docs/rest-management/settings). +For more about managing store settings in multi-storefront implementations, see [Managing store configuration](/docs/store-operations/settings/configuration). ## Resources -* [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide) -* [Multi-Storefront App Compatibility and Optimization](/docs/integrations/apps/multi-storefront) -* [Settings API Overview](/docs/rest-management/settings) +* [Multi-storefront API guide](/docs/storefront/multi-storefront/guide) +* [Multi-storefront app compatibility and optimization](/docs/integrations/apps/multi-storefront) +* [Managing store configuration](/docs/store-operations/settings/configuration) * [Multi-Storefront (Help Center)](https://support.bigcommerce.com/s/article/Multi-Storefront?language=en_US) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx new file mode 100644 index 000000000..902b6ccba --- /dev/null +++ b/docs/start/authentication/graphql-storefront.mdx @@ -0,0 +1,245 @@ +# Authenticating requests to the GraphQL Storefront API + +Authenticate GraphQL Storefront API requests using bearer tokens passed with the `Authorization` header. You can authenticate using two different kinds of tokens: [storefront tokens](#storefront-tokens) or [customer impersonation tokens](#customer-impersonation-tokens). + +```http filename="Example request configuration" showLineNumbers copy +POST https://your_store.example.com/graphql +Authorization: Bearer {token} +Accept: application/json +Content-Type: application/json + +{ + // request body +} +``` + +## Storefront tokens + +Storefront tokens are most appropriate to use directly from the web browser. If you're creating a token for an application that will make server-to-server or proxied requests to the GraphQL Storefront API, or you work with customer data, use a [customer impersonation token](#customer-impersonation-tokens). If you only wish to query information from an anonymous shopper's perspective, use a storefront token. + +### Storefront token security + +Generally speaking, vanilla storefront tokens are not considered sensitive, and it is safe to expose them in web browsers. Storefront tokens can only expose information and actions that shoppers can access when they browse a storefront. + +It is possible to create a long-lived token that does not expire. For greater security, we recommend creating shorter-lived tokens and rotating them periodically. + +For security reasons, GraphQL Storefront API tokens are scoped to particular [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) origins, so you must supply the origin or origins on which you intend to use the token. If you have more than two origins, you will need multiple tokens. If you do not supply any CORS origins, the API will reject requests originating from web browsers, although you can still use it in other contexts. + +### Create a storefront token + +You can create storefront tokens by API. On Stencil storefronts, you can also [access an autogenerated token](#using-auto-generated-tokens-on-stencil-storefronts) using in-page context. + +Use the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) REST endpoint to create storefront bearer tokens. Add the [storefront API tokens creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. + + + The channel ID for the default Stencil storefront is `1`. To learn more about channels, see [the channels section of the multi-storefront overview](/docs/storefront/multi-storefront#channels). For more about using the GraphQL Storefront API on custom channels, consult the GraphQL Storefront API overview's [FAQ section on alternate channels](/docs/storefront/graphql#i-want-to-run-requests-in-the-context-of-another-channel). + + + + + +```http filename="Example request: Create a storefront API token" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/storefront/api-token +x-auth-token: {{access_token}} +accept: application/json +content-type: application/json + +{ + "channel_id": 1, // integer (must be a valid channel ID on the store) + "expires_at": 1602288000, // when the token will expire, as an integer unix timestamp (in seconds) + "allowed_cors_origins": [ // array of origins (up to 2 origins per token) + "https://example.com" + ] +} +``` + + + +```json filename="Example response: Create a storefront API token" showLineNumbers copy +{ + "token": "...eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9...", + "meta": { + // ... + } +} +``` + + + +### Using auto-generated tokens on Stencil storefronts + +On Stencil storefronts, you can access a token at render time and pass the token to client-side code using the `{{settings.storefront_api.token}}` Handlebars property. This auto-generated token has an expiry period of 24-48 hours and will rotate before expiration. + +## Customer impersonation tokens + +You can use customer impersonation tokens to authenticate requests to the GraphQL Storefront API in server-to-server and headless interactions. The API will reject any customer impersonation token-authenticated requests that originate from a web browser and are not proxied. Use these tokens in NextJS applications; NextJS proxies requests by default. + +Customer impersonation token-authenticated requests can query store information for any customer by passing the customer ID using the `X-Bc-Customer-Id` header. Information that you request will be specific to the subject customer, including product pricing and availability, customer account details, and more. + +It is not necessary to generate a new token for each customer ID. You may use a single token at any given time for your application, and specify a distinct customer ID for each set of requests. + +Using a customer impersonation token does not automatically sign a customer in. For that, use the [customer login mutation](#signing-customers-in) or the [Customer Login API](/docs/rest-authentication/customer-login). + +### Create a customer impersonation token + +Add the [Storefront API customer impersonation tokens creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use when you [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token). + + + + +```http filename="Example request: Create a customer impersonation token" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/storefront/api-token-customer-impersonation +X-Auth-Token: {{access_token}} +Accept: application/json +Content-Type: application/json + +{ + "channel_id": 1, // integer (must be a valid channel ID on the store) + "expires_at": 1602288000 // when the token will expire, as an integer unix timestamp (in seconds) +} +``` + + + +```json filename="Example response: Create a customer impersonation token" showLineNumbers copy +{ + "data": + { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + }, + "meta": {} +} +``` + + + +### Customer impersonation token security + +Unlike storefront API tokens, customer impersonation tokens _are_ sensitive and should **never** be exposed publicly. Treat them with the same care as other application secrets, such as API account access tokens. + +If your token is compromised, you can use the [Revoke a token](/docs/rest-authentication/tokens#revoke-a-token) endpoint. Only use this in emergencies; do not revoke tokens unnecessarily. Instead, use a shorter expiration and allow them to expire naturally. + +## Signing customers in + + +A customer can only sign in on one device. When you run the customer login mutation for a session on a new device, the customer is automatically signed out of the previous session. + + +If you're using the GraphQL Storefront API from a browser, for example, on top of your Stencil storefront, you can use the login mutation to sign in to a customer account with an email address and a password. This will set a session cookie in the browser, which will authenticate the customer account on future requests. + +This mutation is also useful for server-to-server or headless storefront applications that use a customer impersonation token. For example, you can use a sign in form to validate a customer's email address and password. When the mutation returns successfully, you can take the resulting customer ID and store it in a session to pass with the `X-Bc-Customer-Id` header. + +As a security best practice, you should inject the email address and password using GraphQL query variables. This prevents the password from being exposed in the query itself. In the [GraphQL Storefront playground](/graphql-storefront/playground), you can set variables for requests. + +![GraphQL Storefront playground query variables](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Login%20Mutation.png "GraphQL Storefront playground query variables") + + + In the customer login mutation, the `result` field is deprecated. Instead, request customer object information. + + + + + + ```http filename="Login mutation request" copy + POST https://your_store.example.com/graphql + Accept: application/json + Content-Type: application/json + Authorization: Bearer {token} + ``` + + + + + ```graphql filename="Login mutation" showLineNumbers copy + mutation Login($email: String!, $pass: String!) { + login(email: $email, password: $pass) { + customer { + entityId + firstName + email + taxExemptCategory + storeCredit { + currencyCode + value + } + formFields { + entityId + name + } + } + } + } + ``` + + + + + ```json filename="Login mutation variables" showLineNumbers copy + { + "email": "jane.doe@example.com", + "pass": "xxxxxxxxxxxxxxxxx" + } + ``` + + + + + ```json filename="Login mutation response" showLineNumbers copy + { + "data": { + "login": { + "customer": { + "entityId": 378, + "firstName": "Jane", + "email": "jane.doe@example.com", + "customerGroupId": 7, + "taxExemptCategory": "", + "storeCredit": [ + { + "currencyCode": "USD", + "value": 0 + } + ], + "formFields": [ + { + "entityId": 26, + "name": "Birthday" + } + ] + } + } + } + } + ``` + + + + +## Signing customers out + +You can use the logout mutation to sign out of a customer account. If you're using a vanilla storefront token, future requests in that shopper's session will be from the perspective of an anonymous shopper. + +```graphql filename="Example query: logout mutation" showLineNumbers copy +mutation Logout { + logout { + result + } +} +``` + +## Further reading + +* [GraphQL Storefront API overview](/docs/storefront/graphql) +* [GraphQL Storefront API reference](/graphql-storefront/reference) +* [GraphQL Storefront playground](/graphql-storefront/playground) +* [Authentication and example requests: GraphQL Storefront API](/docs/start/authentication) +* [Guide to API accounts: OAuth scopes](/docs/start/authentication/api-accounts#token-creation-scopes) +* [Multi-storefront overview](/docs/storefront/multi-storefront) +* [CORS (Mozilla)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) + +### Endpoints + +* [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) +* [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token) +* [Revoke a token](/docs/rest-authentication/tokens#revoke-a-token) +* [Customer Login API](/docs/rest-authentication/customer-login) diff --git a/docs/stencil-docs/reference-docs/front-matter-reference.mdx b/docs/stencil-docs/reference-docs/front-matter-reference.mdx index bf66a1640..256d4cbef 100644 --- a/docs/stencil-docs/reference-docs/front-matter-reference.mdx +++ b/docs/stencil-docs/reference-docs/front-matter-reference.mdx @@ -266,7 +266,7 @@ gql: "query productById($productId: Int!) { Note: The `similar_by_views` property is not currently active. -We suggest testing GraphQL queries using the [storefront API playground](https://developer.bigcommerce.com/graphql-playground) to refine them before adding them to your template. If your query contains double quotes `"`, replace them with single quotes `'` or escape the double-quotes `\"`. You can launch the playground from your store by going to **Settings** > **API** > **Storefront API Playground** in your store control panel. +We suggest testing GraphQL Storefront API queries using the [playground](/graphql-storefront/playground) to refine them before adding them to your template. If your query contains double quotes `"`, replace them with single quotes `'` or escape the double-quotes `\"`. You can launch the playground from your store by going to **Settings** > **API** > **Storefront API Playground** in your store control panel. Once you have added a query to your template's front matter block, execution happens automatically when the page loads. The data returned by the query will be returned in the page's context and made available to the handlebars under the `gql` key. For example, you can retrieve the variant data from the above query in `product.html` like this: diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 383b724f4..2c8f286e4 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -22,21 +22,19 @@ servers: security: - X-Auth-Token: [] tags: - - name: Customers - - name: Consent - - name: Validate Credentials - - name: Metafields - - name: Customer Metafields - - name: Customer Batch Metafields - name: Addresses - name: Attributes - name: Attribute Values + - name: Consent - name: Form Fields - name: Form Field Values - - name: Stored Instruments - - name: Global Settings + - name: Metafields + - name: Metafields Batch - name: Channel Settings + - name: Global Settings + - name: Stored Instruments + - name: Validate Credentials paths: '/customers': get: @@ -1660,7 +1658,7 @@ paths: get: summary: Get Customer Metafields tags: - - Customer Metafields + - Metafields description: Gets customer metafields by passing the `customerId` in the query parameters. operationId: getCustomersMetafields parameters: @@ -1677,7 +1675,7 @@ paths: post: summary: Create Customer Metafields tags: - - Customer Metafields + - Metafields description: Creates Customer metafields by passing the `customerId` in the query parameters. operationId: createCustomerMetafields parameters: @@ -1739,7 +1737,7 @@ paths: Lists available metafields for a customer. To retrieve the list, use `customerId` and `metafieldId` in the query parameters. operationId: getMetafieldsCustomerId tags: - - Customer Metafields + - Metafields parameters: - name: customerId in: path @@ -1778,7 +1776,7 @@ paths: put: summary: Update a Metafield tags: - - Customer Metafields + - Metafields description: Updates customer metafields. To update the customer metafields, use 'customerId' and 'metafield' in the query parameters. operationId: updateCustomerMetafield parameters: @@ -1854,7 +1852,7 @@ paths: delete: summary: Delete Customer Metafields tags: - - Customer Metafields + - Metafields description: | Deletes customer metafields. To delete customer metafields, use 'customerId' and 'metafieldId' in the query parameters. parameters: @@ -1890,7 +1888,7 @@ paths: get: summary: Get All Customer Metafields tags: - - Customer Batch Metafields + - Metafields Batch description: Get all customer metafields. operationId: getAllCustomersMetafields responses: @@ -1913,7 +1911,7 @@ paths: post: summary: Create Multiple Metafields tags: - - Customer Batch Metafields + - Metafields Batch description: Create multiple metafields. operationId: createCustomersMetafields requestBody: @@ -1975,7 +1973,7 @@ paths: put: summary: Update Multiple Metafields tags: - - Customer Batch Metafields + - Metafields Batch description: Create multiple metafields. operationId: updateCustomersMetafields requestBody: @@ -2037,7 +2035,7 @@ paths: delete: summary: Delete Multiple Metafields tags: - - Customer Batch Metafields + - Metafields Batch description: Delete all customer metafields. operationId: deleteCustomersMetafields requestBody: diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index c1d87f8b5..aac5c0d6a 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -1,102 +1,28 @@ openapi: '3.0.1' info: - title: Storefront Token + title: GraphQL Storefront API tokens description: |- Get and manage tokens used to authenticate cross-origin requests to the [GraphQL Storefront API](/docs/storefront/graphql). - ## [API tokens](/docs/rest-authentication/tokens#create-a-token) + Add a [token creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. - Generate tokens (JWT) for authenticating cross-origin requests to the [GraphQL Storefront API](/docs/storefront/graphql). To [create a token](/docs/rest-authentication/tokens#create-a-token), send a `POST` request to `/stores/{{STORE_HASH}}/v3/storefront/api-token`. + ## Storefront tokens - ```http - POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/storefront/api-token - X-Auth-Token: {{ACCESS_TOKEN}} - Content-Type: application/json - Accept: application/json + This type of token is the most appropriate to use from a web browser when you're serving a static site that only supports anonymous shopping. If you're creating a token for backend implementation, you wish to support signing in customers, or you're developing a frontend app that proxies requests, such as a NextJS app, use a [customer impersonation token](#customer-impersonation-tokens). - { - "channel_id": 1, - "expires_at": 1602288000, - "allowed_cors_origins": - ["https://store.example.com"] - - } - ``` + ## Customer impersonation tokens - |Property|Type|Description| - |-|-|-| - |`channel_id`|int| Must be a valid channel ID on the store (required) | - |`expires_at`|int| Unix timestamp in seconds (required). Does not support milliseconds, microseconds, or nanoseconds. | - |`allowed_cors_origins`|array[str]| Allowed origins for cross origin requests (required) | - - [**Response:**](/docs/rest-authentication/tokens#create-a-token) - - ```json - { - "token":"...eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9...", - "meta": { - // ... - } - } - ``` - - - - ## [Customer impersonation tokens](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) - - Generate tokens that can make queries from the perspective of a particular customer in headless or server-side code using the [GraphQL Storefront API](/docs/storefront/graphql#customer-impersonation-tokens). To [create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token), send a `POST` request to `/v3/storefront/api-token-customer-impersonation`. - - ```http - POST https://api.bigcommerce.com/stores/{STORE_HASH}/v3/storefront/api-token-customer-impersonation - X-Auth-Token: {{ACCESS_TOKEN}} - Accept: application/json - Content-Type: application/json - ``` - - [**Response:**](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) - - ```json - { - "data": - { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" - } - "meta": {} - } - ``` - - Customer impersonation token authenticated requests made to the GraphQL API receive store information from the perspective of the customer with the ID specified in the `X-Bc-Customer-Id` header sent with the GraphQL `POST` request. Pricing, product availability, customer account, and customer details will be reflected. Consider this sample request using a [customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) to run a request in the context of customer ID `123`. - - ```http - POST https://store.example.com/graphql - Authorization: Bearer {{CUSTOMER_IMPERSONATION_TOKEN}} - X-Bc-Customer-Id: 123 - - { - "query": "query CustomerInformation {\n customer {\n firstName\n lastName\n email\n }\n}" - } - ``` + Customer impersonation token-authenticated requests receive store information from the perspective of the customer with the ID specified in the `X-Bc-Customer-Id` header. The customer will automatically see the correct pricing, product availability, order history, and account details. + This special token is not necessary if you only wish to query information from an anonymous shopper's perspective. > #### Warning - > * Customer impersonation tokens should **never** be exposed publicly, for example, to JavaScript or HTML. These tokens should **not** be used for frontend requests. - > * Unlike normal GraphQL API tokens, these tokens are sensitive and should be treated like secrets, just as you might treat an OAuth token. - > * Attempts to run requests using these tokens from a web browser will be rejected. - - - ## Revoking tokens - To [revoke a token](/docs/rest-authentication/tokens#revoke-a-token), send a `DELETE` request to `/v3/storefront/api-token`. - - ```http - DELETE /stores/{{STORE_HASH}}/v3/storefront/api-token-customer-impersonation - host: api.bigcommerce.com - x-Auth-Token: {{ACCESS_TOKEN}} - Sf-Api-Token: {{CUSTOMER_ID}} - ``` + > Unless your frontend client proxies requests, attempts to authenticate from the brower using customer impersonation tokens will be rejected. ## Additional information - * [GraphQL API Overview](/docs/storefront/graphql) + * [GraphQL Storefront API overview](/docs/storefront/graphql) + * [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront) termsOfService: 'https://www.bigcommerce.com/terms' contact: name: BigCommerce From 2fcfe3f742485513d91ae9d8555a9a9609873355 Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Thu, 23 May 2024 20:58:58 +0200 Subject: [PATCH 026/221] CATALOG-9785: [update] Catalog, update all Brands V3 endpoints (#266) # [CATALOG-9785] Categories: REST Contract ## What changed? * Updated v3 brands swagger scheme ## Release notes draft * updated description for endpoints * add responses code to endpoints * deleted params "Content-Type" and "Accept" base https://swagger.io/docs/specification/describing-parameters/ ping @bigcommerce/team-catalog [CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- reference/catalog/brands_catalog.v3.yml | 186 ++++++++++++++++++------ 1 file changed, 141 insertions(+), 45 deletions(-) diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index 74f792785..9d633be06 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -57,6 +57,10 @@ paths: - $ref: '#/components/parameters/IdQuery' - $ref: '#/components/parameters/IdInQuery' - $ref: '#/components/parameters/IdNotInQuery' + - $ref: '#/components/parameters/IdMinQuery' + - $ref: '#/components/parameters/IdMaxQuery' + - $ref: '#/components/parameters/IdGreaterQuery' + - $ref: '#/components/parameters/IdLessQuery' - $ref: '#/components/parameters/NameQuery' - $ref: '#/components/parameters/NameLikeQuery' - $ref: '#/components/parameters/PageTitleQuery' @@ -258,6 +262,10 @@ paths: total_pages: 1 links: current: '?page=1&limit=50' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' post: tags: - Brands @@ -268,9 +276,6 @@ paths: **Required Fields** - name - **Read-Only Fields** - - id - **Limits** - 30,000 brands per store limit operationId: createBrand @@ -335,7 +340,7 @@ paths: custom_url: title: Custom Url Brand type: object - description: The custom URL for the brand on the storefront. + description: The custom URL for the brand on the storefront. If not provided, the URL will be autogenerated from the brand name. properties: url: type: string @@ -456,7 +461,13 @@ paths: is_customized: false meta: {} '207': - $ref: '#/components/responses/General207Status' + $ref: '#/components/responses/MultiStatus' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' + '404': + $ref: '#/components/responses/NotFoundError' '409': description: Brand was in conflict with another brand. This is the result of duplicate unique fields such as name. content: @@ -470,8 +481,6 @@ paths: type: object properties: {} additionalProperties: true - instance: - type: string status: type: integer description: | @@ -495,8 +504,6 @@ paths: type: object properties: {} additionalProperties: true - instance: - type: string status: type: integer description: | @@ -507,7 +514,6 @@ paths: The error title describing the particular error. type: type: string - x-codegen-request-body-name: Brand delete: tags: - Brands @@ -523,6 +529,12 @@ paths: '204': description: '' content: {} + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' + '422': + $ref: '#/components/responses/Error' parameters: - $ref: '#/components/parameters/Accept' '/catalog/brands/{brand_id}': @@ -568,6 +580,12 @@ paths: url: /brands/Common-Good.html is_customized: false meta: {} + '207': + $ref: '#/components/responses/MultiStatus' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' '404': description: | The resource was not found. @@ -589,6 +607,10 @@ paths: instance: type: string description: Error payload for the BigCommerce API. + '409': + $ref: '#/components/responses/Conflict' + '422': + $ref: '#/components/responses/ErrorWithDetails' put: tags: - Brands @@ -786,7 +808,7 @@ paths: is_customized: false meta: {} '207': - $ref: '#/components/responses/General207Status' + $ref: '#/components/responses/MultiStatus' '404': description: | The resource was not found. @@ -805,8 +827,6 @@ paths: description: The error title describing the particular error. type: type: string - instance: - type: string description: Error payload for the BigCommerce API. '409': description: | @@ -822,8 +842,6 @@ paths: type: object properties: {} additionalProperties: true - instance: - type: string status: type: integer description: | @@ -848,8 +866,6 @@ paths: type: object properties: {} additionalProperties: true - instance: - type: string status: type: integer description: | @@ -860,7 +876,6 @@ paths: The error title describing the particular error. type: type: string - x-codegen-request-body-name: brand delete: tags: - Brands @@ -871,9 +886,15 @@ paths: '204': description: '' content: {} + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' + '404': + $ref: '#/components/responses/NotFoundError' parameters: - - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/BrandIdPath' + - $ref: '#/components/parameters/Accept' '/catalog/brands/{brand_id}/metafields': get: tags: @@ -1095,8 +1116,8 @@ paths: type: string x-codegen-request-body-name: Metafield parameters: - - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/BrandIdPath' + - $ref: '#/components/parameters/Accept' '/catalog/brands/{brand_id}/metafields/{metafield_id}': get: tags: @@ -1272,9 +1293,9 @@ paths: type: string description: Error payload for the BigCommerce API. parameters: - - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/BrandIdPath' - $ref: '#/components/parameters/MetafieldIdPath' + - $ref: '#/components/parameters/Accept' '/catalog/brands/{brand_id}/image': post: tags: @@ -1385,8 +1406,8 @@ paths: description: '' content: {} parameters: - - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/BrandIdPath' + - $ref: '#/components/parameters/Accept' '/catalog/brands/metafields': get: summary: Get All Brand Metafields @@ -1418,7 +1439,7 @@ paths: description: Create multiple metafields. operationId: createBrandsMetafields parameters: - - $ref: '#/components/parameters/ContentType' + - $ref: '#/components/parameters/ContentType' requestBody: content: application/json: @@ -1483,7 +1504,7 @@ paths: description: Create multiple metafields. operationId: updateBrandsMetafields parameters: - - $ref: '#/components/parameters/ContentType' + - $ref: '#/components/parameters/ContentType' requestBody: content: application/json: @@ -1823,8 +1844,6 @@ components: The error title describing the particular error. type: type: string - instance: - type: string description: | Error payload for the BigCommerce API. x-internal: false @@ -2319,6 +2338,38 @@ components: minLength: 0 maxLength: 255 example: Name of Staff Member + NotFoundError: + required: + - status + - title + - type + title: Error Response + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + Conflict: + title: Error response + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + errors: + title: Detailed Errors + type: object + properties: { } parameters: BrandIdPath: name: brand_id @@ -2336,22 +2387,6 @@ components: required: true schema: type: integer - Accept: - name: Accept - in: header - required: true - description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' - schema: - type: string - default: 'application/json' - ContentType: - name: Content-Type - in: header - required: true - description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' - schema: - type: string - default: 'application/json' MetafieldKeyParam: name: key in: query @@ -2550,14 +2585,75 @@ components: - owner_client_id - date_created - date_modified + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' responses: - General207Status: - description: Multi-status. Multiple operations have taken place and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occurred, such as when a `POST` or `PUT` request is successful, but saving the URL or inventory data has failed. - + Error: + description: '' content: application/json: schema: $ref: '#/components/schemas/error_Base' + ErrorWithDetails: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + NotFoundError: + description: Not Found + content: + 'application/json': + schema: + $ref: '#/components/schemas/NotFoundError' + UnauthorizedError: + description: Unauthorized + content: + plain/text: + schema: + type: string + BadRequestError: + description: Bad Request + content: + plain/text: + schema: + type: string + MultiStatus: + description: Multi-status. Multiple operations have taken place and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occurred, such as when a `POST` or `PUT` request is successful, but the URL or inventory data failed to save. + content: + application/json: + schema: + title: Multi_Status + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/brand_Full' + errors: + $ref: '#/components/schemas/Error' + meta: + $ref: '#/components/schemas/WriteCollectionSuccessMeta' + Conflict: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Conflict' securitySchemes: X-Auth-Token: name: X-Auth-Token From e87bc39b37d9901fb70c1259264c38d58fa9a97c Mon Sep 17 00:00:00 2001 From: Mark Murphy Date: Fri, 24 May 2024 13:25:14 -0400 Subject: [PATCH 027/221] SELFDEV-673 Trigger build on merge to main (#291) --- .github/workflows/deploy.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 23f81b59b..993c5d54d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,4 +1,4 @@ -name: Deploy +name: Rebuild Production Dev Center on: push: @@ -9,11 +9,16 @@ on: jobs: build: runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Trigger Vercel Deploy Hook + steps: + - name: Trigger CircleCI Build run: | - curl -X POST ${{ secrets.VERCEL_DEPLOY_HOOK_URL }}?buildCache=false + curl --location 'https://circleci.com/api/v2/project/gh/bigcommerce/developer-center/pipeline' \ + --header 'Circle-Token: ${{ secrets.CIRCLECI_TOKEN }}' \ + --header 'content-type: application/json' \ + --data '{ + "branch": "main", + "parameters": { + "build_environment": "production", + "github_triggering_actor": "${{ github.actor }}" + } + }' From 977fdbf21f214ea3756d92a9d58c170a7d728e41 Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Tue, 28 May 2024 11:56:24 -0500 Subject: [PATCH 028/221] DEVDOCS-5949: [update] added a note about option_values (#292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5949] ## What changed? Added a note about how to obtain the option values needed in the create a product variant request. ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5949]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5949?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/product-variants_catalog.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 616d23bcb..d5f2b97bf 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -223,7 +223,7 @@ paths: * 600 SKUs per product limit. * 255 characters SKU length limit. - Variants need to be created one at a time using this endpoint. To use a variant array, create products, and variants in the same call use the [Create Products](/docs/rest-catalog/products#create-a-product) endpoint during the initial product creation. + Variants need to be created one at a time using this endpoint. To use a variant array, create products, and variants in the same call use the [Create Products](/docs/rest-catalog/products#create-a-product) endpoint during the initial product creation. To obtain the `option_values` to include in this request, use the [Create a product variant option](/docs/rest-catalog/product-variant-options#create-a-product-variant-option) endpoint. operationId: createProductVariant parameters: - $ref: '#/components/parameters/ContentType' From efc39c9c9b863ac0bc0b3978dda36f57fe63ddd8 Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Wed, 29 May 2024 11:54:57 -0500 Subject: [PATCH 029/221] DEVDOCS-5896: [Update] add cart redirect URL (#289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5896] ## What changed? Add cart redirect URL ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5896]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5896?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- .../graphql/graphql-carts-and-checkout.mdx | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx b/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx index 0a2e998ff..78a7fd418 100644 --- a/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx +++ b/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx @@ -11,6 +11,7 @@ Developers can use frontend GraphQL to create an end-to-end shopper experience. * Create a cart * Add products to a cart * View or manage a cart +* Create cart redirect URLs * Create cart metafields * Fill out checkout details * Determine the cost of shipping and select a shipping method @@ -530,6 +531,49 @@ If using the getCart query with customer impersonation tokens, you must include +### Create a cart redirect URL + + + You can use a cart redirect URL for embedded checkouts or to redirect your + checkout. You need a `cartEntity` ID. To create a `cartEntity` ID, use the + [create a cart](#Create-a-cart-using-a-simple-product) mutation. + + + + + ```graphql filename="Example mutation: Create cart redirect URL" showLineNumbers copy + mutation{ + cart { + createCartRedirectUrls(input:{ + cartEntityId: "dc5e7b24-0047-4b3e-b16b-2cdc90943b86"}) { + redirectUrls{ + embeddedCheckoutUrl + redirectedCheckoutUrl + } + } + + } +} +``` + + + ```json filename="Example mutation: Create cart redirect URL" showLineNumbers copy + { + "data": { + "cart": { + "createCartRedirectUrls": { + "redirectUrls": { + "embeddedCheckoutUrl": "https://fivedot.mybigcommerce.com/cart.php?embedded=1&action=loadInCheckout&id=dc5e7b24-0047-4b3e-b16b-2cdc90943b86&token=1a605a1fe738c56cc16f0ea616eec9d053c07080626604a16ff8cef5bada4fa6", + "redirectedCheckoutUrl": "https://fivedot.mybigcommerce.com/cart.php?action=loadInCheckout&id=dc5e7b24-0047-4b3e-b16b-2cdc90943b86&token=1a605a1fe738c56cc16f0ea616eec9d053c07080626604a16ff8cef5bada4fa6" + } + } + } + } + } +``` + + + ### Create cart metafield The current platform limit is 250 metafields for a single cart. From 72d120246472a853bf3c6818af9a4ced820d8523 Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Thu, 30 May 2024 11:03:16 -0500 Subject: [PATCH 030/221] SELFDEV-650 : [update] example for create a product modifier (#295) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [SELFDEV-650] ## What changed? This should be a DEVDOCS tickets, not a SELFDEV. There specification file is fine. I just added a correct example. ## Release notes draft * ## Anything else? ping {names} [SELFDEV-650]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-650?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- .../catalog/product-modifiers_catalog.v3.yml | 764 ++++-------------- 1 file changed, 151 insertions(+), 613 deletions(-) diff --git a/reference/catalog/product-modifiers_catalog.v3.yml b/reference/catalog/product-modifiers_catalog.v3.yml index 0db02525e..04bb8f13f 100644 --- a/reference/catalog/product-modifiers_catalog.v3.yml +++ b/reference/catalog/product-modifiers_catalog.v3.yml @@ -148,619 +148,103 @@ paths: content: application/json: schema: - title: Modifier Post - description: The model for a POST to create a modifier on a product. - allOf: - - title: Modifier Base - required: - - required - - type - type: object - properties: - type: - type: string - description: | - BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. - enum: - - date - - checkbox - - file - - text - - multi_line_text - - numbers_only_text - - radio_buttons - - rectangles - - dropdown - - product_list - - product_list_with_images - - swatch - x-required: - - post - required: - type: boolean - description: | - Whether or not this modifier is required at checkout. Required in a /POST. - x-required: - - post - sort_order: - type: integer - description: The order the modifiers display on the product detail page. - config: - title: Option Config - type: object - properties: - default_value: - type: string - description: | - (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. - checked_by_default: - type: boolean - description: | - (checkbox) Flag for setting the checkbox to be checked by default. - checkbox_label: - type: string - description: | - (checkbox) Label displayed for the checkbox option. - date_limited: - type: boolean - description: | - (date) Flag to limit the dates allowed to be entered on a date option. - date_limit_mode: - type: string - description: | - (date) The type of limit that is allowed to be entered on a date option. - example: range - enum: - - earliest - - range - - latest - date_earliest_value: - type: string - description: | - (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date-time - example: '2018-08-31T00:00:00+00:00' - date_latest_value: - type: string - description: | - (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date-time - example: '2019-01-01T00:00:00+00:00' - file_types_mode: - type: string - description: | - (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. - example: specific - enum: - - specific - - all - file_types_supported: - type: array - description: | - (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: - `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). - `other` - Allows file types defined in the `file_types_other` array. - example: - - images - - documents - - other - items: - type: string - file_types_other: - type: array - description: | - (file) A list of other file types allowed with the file upload option. - example: - - pdf - - txt - items: - type: string - file_max_size: - type: integer - description: | - (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. - example: 5 - text_characters_limited: - type: boolean - description: | - (text, multi_line_text) Flag to validate the length of a text or multi-line text input. - text_min_length: - type: integer - description: | - (text, multi_line_text) The minimum length allowed for a text or multi-line text option. - example: 1 - text_max_length: - type: integer - description: | - (text, multi_line_text) The maximum length allowed for a text or multi line text option. - example: 55 - text_lines_limited: - type: boolean - description: | - (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. - example: true - text_max_lines: - type: integer - description: | - (multi_line_text) The maximum number of lines allowed on a multi-line text input. - example: 4 - number_limited: - type: boolean - description: | - (numbers_only_text) Flag to limit the value of a number option. - example: true - number_limit_mode: - type: string - description: | - (numbers_only_text) The type of limit on values entered for a number option. - example: lowest - enum: - - lowest - - highest - - range - number_lowest_value: - type: number - description: | - (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. - example: 100 - number_highest_value: - type: number - description: | - (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. - number_integers_only: - type: boolean - description: | - (numbers_only_text) Flag to limit the input on a number option to whole numbers only. - example: false - product_list_adjusts_inventory: - type: boolean - description: | - (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. - product_list_adjusts_pricing: - type: boolean - description: | - (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. - product_list_shipping_calc: - type: string - description: | - (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. - example: weight - enum: - - none - - weight - - package - description: The values for option config can vary based on the Modifier created. - option_values: - type: array - items: - title: Modifier Value - description: 'Part of Modifier Value Response ' - allOf: - - title: Modifier Value Base - allOf: - - title: Option Value Base - required: - - label - - sort_order - type: object - properties: - is_default: - type: boolean - description: | - The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. - example: false - label: - type: string - description: | - The text display identifying the value on the storefront. Required in a /POST. - example: Green - x-required: - - post - sort_order: - maximum: 2147483647 - minimum: -2147483648 - type: integer - description: | - The order in which the value will be displayed on the product page. Required in a /POST. - example: 0 - x-required: - - post - value_data: - type: object - properties: {} - description: | - Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexadecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. - description: Common Option Value properties. - - type: object - properties: - adjusters: - type: object - properties: - price: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - weight: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - image_url: - type: string - description: | - The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. - example: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' - purchasing_disabled: - type: object - properties: - status: - type: boolean - description: | - Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. - message: - type: string - description: | - The message displayed on the storefront when the purchasing disabled status is `true`. - - type: object - properties: - id: - type: integer - description: | - The unique numeric ID of the value; increments sequentially. - description: Common Modifier properties. - - required: - - display_name - type: object - properties: - display_name: - type: string - description: | - The name of the option shown on the storefront. - example: Donation - x-required: - - post - required: true - responses: - '200': - description: '' - content: - application/json: - schema: - title: Modifier Response - type: object - properties: - data: - title: Modifier - description: Product modifier - allOf: - - title: Modifier Base - required: - - required - - type - type: object - properties: - type: - type: string - description: | - BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. - enum: - - date - - checkbox - - file - - text - - multi_line_text - - numbers_only_text - - radio_buttons - - rectangles - - dropdown - - product_list - - product_list_with_images - - swatch - x-required: - - post - required: - type: boolean - description: | - Whether or not this modifier is required at checkout. Required in a /POST. - x-required: - - post - sort_order: - type: integer - description: The order the modifiers display on the product detail page. - config: - title: Option Config - type: object - properties: - default_value: - type: string - description: | - (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. - checked_by_default: - type: boolean - description: | - (checkbox) Flag for setting the checkbox to be checked by default. - checkbox_label: - type: string - description: | - (checkbox) Label displayed for the checkbox option. - date_limited: - type: boolean - description: | - (date) Flag to limit the dates allowed to be entered on a date option. - date_limit_mode: - type: string - description: | - (date) The type of limit that is allowed to be entered on a date option. - example: range - enum: - - earliest - - range - - latest - date_earliest_value: - type: string - description: | - (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date - date_latest_value: - type: string - description: | - (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date - file_types_mode: - type: string - description: | - (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. - example: specific - enum: - - specific - - all - file_types_supported: - type: array - description: | - (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: - `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). - `other` - Allows file types defined in the `file_types_other` array. - items: - type: string - example: 'images, documents, other' - file_types_other: - type: array - description: | - (file) A list of other file types allowed with the file upload option. - items: - type: string - example: pdf - file_max_size: - type: integer - description: | - (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. - example: 5 - text_characters_limited: - type: boolean - description: | - (text, multi_line_text) Flag to validate the length of a text or multi-line text input. - text_min_length: - type: integer - description: | - (text, multi_line_text) The minimum length allowed for a text or multi-line text option. - example: 1 - text_max_length: - type: integer - description: | - (text, multi_line_text) The maximum length allowed for a text or multi line text option. - example: 55 - text_lines_limited: - type: boolean - description: | - (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. - example: true - text_max_lines: - type: integer - description: | - (multi_line_text) The maximum number of lines allowed on a multi-line text input. - example: 4 - number_limited: - type: boolean - description: | - (numbers_only_text) Flag to limit the value of a number option. - example: true - number_limit_mode: - type: string - description: | - (numbers_only_text) The type of limit on values entered for a number option. - example: lowest - enum: - - lowest - - highest - - range - number_lowest_value: - type: number - description: | - (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. - example: 100 - number_highest_value: - type: number - description: | - (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. - number_integers_only: - type: boolean - description: | - (numbers_only_text) Flag to limit the input on a number option to whole numbers only. - example: false - product_list_adjusts_inventory: - type: boolean - description: | - (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. - product_list_adjusts_pricing: - type: boolean - description: | - (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. - product_list_shipping_calc: - type: string - description: | - (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. - example: weight - enum: - - none - - weight - - package - description: The values for option config can vary based on the Modifier created. - option_values: - type: array - items: - title: Modifier Value - description: 'Part of Modifier Value Response ' - allOf: - - title: Modifier Value Base - allOf: - - title: Option Value Base - required: - - label - - sort_order - type: object - properties: - is_default: - type: boolean - description: | - The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. - example: false - label: - type: string - description: | - The text display identifying the value on the storefront. Required in a /POST. - example: Green - x-required: - - post - sort_order: - maximum: 2147483647 - minimum: -2147483648 - type: integer - description: | - The order in which the value will be displayed on the product page. Required in a /POST. - example: 0 - x-required: - - post - value_data: - type: object - properties: {} - description: | - Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexadecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. - description: Common Option Value properties. - - type: object - properties: - adjusters: - type: object - properties: - price: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - weight: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - image_url: - type: string - description: | - The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. - example: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' - purchasing_disabled: - type: object - properties: - status: - type: boolean - description: | - Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. - message: - type: string - description: | - The message displayed on the storefront when the purchasing disabled status is `true`. - - type: object - properties: - id: - type: integer - description: | - The unique numeric ID of the value; increments sequentially. - description: Common Modifier properties. - - type: object - properties: - id: - type: integer - description: | - The unique numeric ID of the modifier; increments sequentially. - example: 12 - product_id: - type: integer - description: | - The unique numeric ID of the product to which the option belongs. - example: 77 - name: - type: string - description: | - The unique option name. Auto-generated from the display name, a timestamp, and the product ID. - example: Add-a-$5-Donation1535039590-191 - display_name: - type: string - description: | - The name of the option shown on the storefront. - example: Donation - meta: - $ref: '#/components/schemas/metaEmpty_Full' + $ref: '#/components/schemas/productModifier_Post' + example: + type: radio_buttons + required: true + sort_order: 0 + option_values: + - is_default: false + label: '+5' + sort_order: 0 + value_data: {} + adjusters: + price: + adjuster: relative + adjuster_value: 5 + weight: + adjuster: relative + adjuster_value: 5 + purchasing_disabled: + status: true + message: string + - is_default: false + label: '+10' + sort_order: 0 + value_data: {} + adjusters: + price: + adjuster: relative + adjuster_value: 10 + weight: + adjuster: relative + adjuster_value: 10 + purchasing_disabled: + status: true + message: string + display_name: Donation + responses: + '200': + description: '' + content: + application/json: + schema: + title: Modifier Response + type: object + properties: + data: + type: object + properties: + items: + $ref: '#/components/schemas/productModifier_Full' + meta: + $ref: '#/components/schemas/metaEmpty_Full' + example: + data: + id: 164 + product_id: 161 + name: Test-name1716906851-161 + display_name: Test name + type: radio_buttons + required: true + sort_order: 0 + config: [] + option_values: + - id: 199 + option_id: 164 + label: '+5' + sort_order: 0 + value_data: null + is_default: false + adjusters: + price: + adjuster: relative + adjuster_value: 5 + weight: + adjuster: relative + adjuster_value: 5 + image_url: '' + purchasing_disabled: + status: true + message: string + - id: 200 + option_id: 164 + label: '+10' + sort_order: 0 + value_data: null + is_default: false + adjusters: + price: + adjuster: relative + adjuster_value: 10 + weight: + adjuster: relative + adjuster_value: 10 + image_url: '' + purchasing_disabled: + status: true + message: string + meta: {} '409': description: | The `Modifier` was in conflict with another option. This is the result of duplicate unique fields, such as `name`. @@ -2311,6 +1795,60 @@ components: description: The name of the option shown on the storefront. description: Common Modifier properties. x-internal: false + productModifier_Post: + title: productModifier_Post + required: + - required + - display_name + - type + type: object + properties: + type: + type: string + description: | + BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. + enum: + - date + - checkbox + - file + - text + - multi_line_text + - numbers_only_text + - radio_buttons + - rectangles + - dropdown + - product_list + - product_list_with_images + - swatch + x-required: + - post + required: + type: boolean + description: | + Whether or not this modifier is required at checkout. Required in a /POST. + x-required: + - post + sort_order: + type: integer + description: The order the modifiers display on the product detail page. + config: + $ref: '#/components/schemas/config_Full' + option_values: + type: array + items: + title: Modifier Value + type: object + properties: + id: + type: integer + description: | + The unique numeric ID of the value; increments sequentially. + description: 'Part of Modifier Value Response ' + display_name: + type: string + description: The name of the option shown on the storefront. + description: Common Modifier properties. + x-internal: false productModifier_Full: title: productModifier_Full description: Product modifier From da1b75efef6f66432fbf1aaa773e5e3added603a Mon Sep 17 00:00:00 2001 From: Traci Porter Date: Thu, 30 May 2024 11:04:18 -0500 Subject: [PATCH 031/221] DEVDOCS-5851: [update] add Deprecated label (#279) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [DEVDOCS-5851] ## What changed? Add deprecation label on the name of endpoint to alleviate confusion ## Release notes draft * ## Anything else? ping {names} [DEVDOCS-5851]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5851?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Sarah Riehl Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- reference/store_content.v2.yml | 322 +++++++++++++++++---------------- 1 file changed, 167 insertions(+), 155 deletions(-) diff --git a/reference/store_content.v2.yml b/reference/store_content.v2.yml index 0065d7c8b..8af70adf2 100644 --- a/reference/store_content.v2.yml +++ b/reference/store_content.v2.yml @@ -218,7 +218,7 @@ paths: author: BigCommerce thumbnail_path: '' '207': - description: 'Multiple operations have taken place and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occured, such as when a `POST` or `PUT` request is successful, but saving the URL has failed.' + description: 'Multiple operations have taken place and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occurred, such as when a `POST` or `PUT` request is successful, but saving the URL has failed.' content: application/json: schema: @@ -389,7 +389,7 @@ paths: deprecated: true tags: - Pages - summary: Get All Pages + summary: Get All Pages (Deprecated) description: | Returns a list of *Pages*. Default sorting is by auto-generated ID from oldest to newest. @@ -422,33 +422,33 @@ paths: type: array items: $ref: '#/components/schemas/page_Full' - Example: example: - id: 6 + channel_id: 11 + name: Contact Form + meta_title: '' + email: janedoe@example.com + body: We are happy to answer questions or help you with... + is_visible: true parent_id: 5 + sort_order: 3 + meta_keywords: '' type: page contact_fields: 'fullname,companyname,phone,orderno,rma' - email: janedoes@example.com - name: Contact Form - url: /contact-us/ meta_description: '' - body: We are happy to answer questions or help you with... - mobile_body: '' - feed: '' - link: '' - has_mobile_version: false - is_visible: true is_homepage: false layout_file: page.html - sort_order: 3 - meta_title: '' + is_customers_only: false search_keywords: '' - meta_keywords: '' + has_mobile_version: false + mobile_body: '' + url: /contact-us/ + post: deprecated: true tags: - Pages - summary: Create a Page + summary: Create a Page (Deprecated) description: |- Creates a *Page*. The request payload limit is 1MB. @@ -464,7 +464,7 @@ paths: ## Content Type - The default value for `content_type` is `text/html`; however, if `page_type` is set to `raw`, `content_type` can be changed to `text/javascript` or `application/json`. Updating this field allows you to place a JavaScript or a JSON file in the root directory. + The default value for `content_type` is `text/html`; however, if `page_type` is set to `raw`, `content_type` can be changed to `text/javascript` or `application/json`. Updating this field lets you place a JavaScript or a JSON file in the root directory. > #### Warning > **Deprecated** @@ -479,26 +479,23 @@ paths: schema: $ref: '#/components/schemas/page_Base' example: - parent_id: 5 - type: page - contact_fields: 'fullname,companyname,phone,orderno,rma' - email: janedoes@example.com + channel_id: 1 name: Contact Form - url: /contact-us/ - meta_description: string + meta_title: string body: "

We're happy to answer questions or help you with returns.
Please fill out the form below if you need assistance.

" - mobile_body: '0' - has_mobile_version: false is_visible: true - is_homepage: false - meta_title: string - layout_file: page.html + parent_id: 5 sort_order: 3 - search_keywords: string meta_keywords: string - feed: string - link: string - content_type: text/html + type: page + contact_fields: 'fullname,companyname,phone,orderno,rma' + meta_description: string + is_homepage: false + is_customers_only: false + search_keywords: "string" + has_mobile_version: false + mobile_body: '0' + url: /contact-us/ required: true responses: '200': @@ -509,25 +506,23 @@ paths: $ref: '#/components/schemas/page_Full' example: id: 6 - parent_id: 5 - type: page - contact_fields: 'fullname,companyname,phone,orderno,rma' - email: janedoes@example.com + channel_id: 11 name: Contact Form - url: /contact-us/ - meta_description: '' + meta_title: '' body: "We're happy to answer questions or help you with returns.
Please fill out the form below if you need assistance." - mobile_body: '' - has_mobile_version: false - feed: '' - link: '' is_visible: true + parent_id: 5 + sort_order: 3 + meta_keywords: '' + type: page + meta_description: '' is_homepage: false layout_file: page.html - sort_order: 3 - meta_title: '' + is_customers_only: true search_keywords: '' - meta_keywords: '' + has_mobile_version: false + mobile_body: '' + url: /contact-us/ '207': description: 'Multiple operations have taken place and the status for each operation can be viewed in the body of the response. Typically indicates that a partial failure has occurred, such as when a `POST` or `PUT` request is successful, but saving the URL has failed.' content: @@ -551,7 +546,7 @@ paths: deprecated: true tags: - Pages - summary: Get A Page + summary: Get A Page (Deprecated) description: | Returns a *Page*. @@ -569,6 +564,7 @@ paths: $ref: '#/components/schemas/page_Full' example: id: 1 + channel_id: 11 name: RSS Syndication meta_title: '' body: '%%Syndicate%%' @@ -591,7 +587,7 @@ paths: deprecated: true tags: - Pages - summary: Update a Page + summary: Update a Page (Deprecated) description: |- Updates a *Page*. The request payload limit is 1MB. @@ -620,6 +616,7 @@ paths: $ref: '#/components/schemas/page_Full' example: id: 2 + channel_id: 11 name: Shipping & Returns meta_title: '' body: "To edit this page simply login to the control panel, click the Website Content tab and choose the View Web Pages option. Click Edit next to the Shipping & Returns page and you can change this text. A sample returns policy is shown below which you can edit as needed.

Returns Policy

You may return most new, unopened items within 30 days of delivery for a full refund. We'll also pay the return shipping costs if the return is a result of our error (you received an incorrect or defective item, etc.).

You should expect to receive your refund within four weeks of giving your package to the return shipper, however, in many cases you will receive a refund more quickly. This time period includes the transit time for us to receive your return from the shipper (5 to 10 business days), the time it takes us to process your return once we receive it (3 to 5 business days), and the time it takes your bank to process our refund request (5 to 10 business days).

If you need to return an item, please Contact Us with your order number and details about the product you would like to return. We will respond quickly with instructions for how to return items from your order.

Shipping

We can ship to virtually any address in the world. Note that there are restrictions on some products, and some products cannot be shipped to international destinations.

When you place an order, we will estimate shipping and delivery dates for you based on the availability of your items and the shipping options you choose. Depending on the shipping provider you choose, shipping date estimates may appear on the shipping quotes page.

Please also note that the shipping rates for many items we sell are weight-based. The weight of any such item can be found on its detail page. To reflect the policies of the shipping companies we use, all weights will be rounded up to the next full pound.
" @@ -650,7 +647,7 @@ paths: deprecated: true tags: - Pages - summary: Delete a Page + summary: Delete a Page (Deprecated) description: | Deletes a *Page*. @@ -954,26 +951,25 @@ components: example: 3 - $ref: '#/components/schemas/blogPost_Base_Res' x-internal: false - x-examples: - example-1: - id: 3 - title: Welcome to BigCommerce - url: /blog/welcome-bigcommerce/ - preview_url: /blog/welcome-bigcommerce/ - body: '

Customize your site, manage shipping and payments, and list your products on Amazon, eBay, and Facebook by Meta with the #1 ecommerce platform.

' - tags: - - string - summary:

We power ecommerce websites for successful retailers all over the world

- is_published: true - published_date: - timezone_type: 1 - date: '2018-05-18T08:26:42Z' - timezone: '+00:00' - published_date_iso8601: '5/18/2018 1:26:42 PM' - meta_description: Welcome Post - meta_keywords: 'BigCommerce, welcome, ecommerce' - author: BigCommerce - thumbnail_path: string + example: + id: 3 + title: Welcome to BigCommerce + url: /blog/welcome-bigcommerce/ + preview_url: /blog/welcome-bigcommerce/ + body: '

Customize your site, manage shipping and payments, and list your products on Amazon, eBay, and Facebook by Meta with the #1 ecommerce platform.

' + tags: + - string + summary:

We power ecommerce websites for successful retailers all over the world

+ is_published: true + published_date: + timezone_type: 1 + date: '2018-05-18T08:26:42Z' + timezone: '+00:00' + published_date_iso8601: '5/18/2018 1:26:42 PM' + meta_description: Welcome Post + meta_keywords: 'BigCommerce, welcome, ecommerce' + author: BigCommerce + thumbnail_path: string addresses: title: addresses type: object @@ -1246,7 +1242,7 @@ components: body: '

Customize your site, manage shipping and payments, and list your products on Amazon, eBay, and Facebook by Meta with the #1 ecommerce platform.

' tags: - string - summary:

We power ecommerce websites for successful retailers all over the world

+ summary: '

We power ecommerce websites for successful retailers all over the world

' is_published: true published_date: 'Thu, 18 May 2023 13:26:42 -0000' published_date_iso8601: '5/18/2023 1:26:42 PM' @@ -1470,10 +1466,36 @@ components: type: object x-internal: false properties: + channel_id: + type: number + description: channel ID + example: 11 + name: + type: string + description: 'Page name, as displayed on the storefront.' + example: Contact Form + meta_title: + type: string + description: Text specified for this page’s `` element. If empty, the value of the name property is used. + body: + type: string + description: 'HTML or variable that populates this page’s `<body>` element, in default/desktop view. Required in POST if page type is `raw`.' + example: "<p>We're happy to answer questions or help you with returns.<br />Please fill out the form below if you need assistance.</p>" + is_visible: + type: boolean + description: 'If true, this page appears in the storefront’s navigation menu.' + example: true parent_id: type: integer description: ID of any parent Web page. example: 5 + sort_order: + type: integer + description: Order in which this page should display on the storefront. (Lower integers specify earlier display.) + example: 3 + meta_keywords: + type: string + description: Comma-separated list of SEO-relevant keywords to include in the page’s `<meta/>` element. type: type: string description: | @@ -1487,6 +1509,28 @@ components: - contact_form - raw - link + meta_description: + type: string + description: Description contained within this page’s `<meta/>` element. + is_homepage: + type: boolean + description: 'If true, this page is the storefront’s home page.' + example: false + is_customers_only: + type: boolean + description: If true, this page is for customers only. + example: false + search_keywords: + type: string + description: Comma-separated list of keywords that shoppers can use to locate this page when searching the store. + has_mobile_version: + type: boolean + description: 'If true, this page has a mobile version. (For Blueprint themes only)' + example: false + mobile_body: + type: string + description: HTML to use for this page’s body when viewed in the mobile template (deprecated - Blueprint themes only). + example: '0' contact_fields: type: string description: 'Where the page’s type is a contact form: object whose members are the fields enabled (in the control panel) for storefront display. Possible members are:`fullname`: full name of the customer submitting the form; `phone`: customer’s phone number, as submitted on the form; `companyname`: customer’s submitted company name; `orderno`: customer’s submitted order number; `rma`: customer’s submitted RMA (Return Merchandise Authorization) number.' @@ -1495,54 +1539,14 @@ components: type: string description: Where the page’s type is a contact form, the email address that receives messages sent using the form. example: janedoes@example.com - name: - type: string - description: 'Page name, as displayed on the storefront.' - example: Contact Form url: type: string description: Relative URL on the storefront for this page. example: /contact-us/ - meta_description: - type: string - description: Description contained within this page’s `<meta/>` element. - body: - type: string - description: 'HTML or variable that populates this page’s `<body>` element, in default/desktop view. Required in POST if page type is `raw`.' - example: "<p>We're happy to answer questions or help you with returns.<br />Please fill out the form below if you need assistance.</p>" - mobile_body: - type: string - description: HTML to use for this page’s body when viewed in the mobile template (deprecated). - example: '0' - has_mobile_version: - type: boolean - description: 'If true, this page has a mobile version.' - example: false - is_visible: - type: boolean - description: 'If true, this page appears in the storefront’s navigation menu.' - example: true - is_homepage: - type: boolean - description: 'If true, this page is the storefront’s home page.' - example: false - meta_title: - type: string - description: Text specified for this page’s `<title>` element. If empty, the value of the name property is used. layout_file: type: string description: Layout template for this page. This field is writable only for stores with a Blueprint theme applied. example: page.html - sort_order: - type: integer - description: Order in which this page should display on the storefront. (Lower integers specify earlier display.) - example: 3 - search_keywords: - type: string - description: Comma-separated list of keywords that shoppers can use to locate this page when searching the store. - meta_keywords: - type: string - description: Comma-separated list of SEO-relevant keywords to include in the page’s `<meta/>` element. feed: type: string description: If page type is `rss_feed` then this field is visible. Required in POST required for `rss page` type. @@ -1563,12 +1567,41 @@ components: page_Base_Res: title: page_Base_Res type: object - x-internal: false properties: + channel_id: + type: number + description: channel ID + example: 11 + name: + type: string + description: 'Page name, as displayed on the storefront.' + example: Contact Form + meta_title: + type: string + description: Text specified for this page's `<title>` element. If empty, the value of the name property is used. + email: + type: string + description: Where the page’s type is a contact form, the email address that receives messages sent using the form. + example: janedoe@example.com + body: + type: string + description: 'HTML or variable that populates this page’s `<body>` element, in default/desktop view. Required in POST if page type is `raw`.' + example: "<p>We're happy to answer questions or help you with returns.<br />Please fill out the form below if you need assistance.</p>" + is_visible: + type: boolean + description: 'If true, this page appears in the storefront navigation menu.' + example: true parent_id: type: integer description: ID of any parent Web page. example: 5 + sort_order: + type: integer + description: Order in which this page should display on the storefront. (Lower integers specify earlier display.) + example: 3 + meta_keywords: + type: string + description: Comma-separated list of SEO-relevant keywords to include in the page's `<meta/>` element. type: type: string description: | @@ -1584,66 +1617,35 @@ components: - link contact_fields: type: string - description: 'Where the page’s type is a contact form: object whose members are the fields enabled (in the control panel) for storefront display. Possible members are:`fullname`: full name of the customer submitting the form; `phone`: customer’s phone number, as submitted on the form; `companyname`: customer’s submitted company name; `orderno`: customer’s submitted order number; `rma`: customer’s submitted RMA (Return Merchandise Authorization) number.' - example: 'fullname,companyname,phone,orderno,rma' - email: - type: string - description: Where the page’s type is a contact form, the email address that receives messages sent using the form. - example: janedoes@example.com - name: - type: string - description: 'Page name, as displayed on the storefront.' - example: Contact Form - url: - type: string - description: Relative URL on the storefront for this page. - example: /contact-us/ + description: Where the page’s type is a contact form - object whose members are the fields enabled (in the control panel) for storefront display. Possible members are:`fullname` - full name of the customer submitting the form; `phone` - customer’s phone number, as submitted on the form; `companyname`- customer’s submitted company name; `orderno`- customer’s submitted order number; `rma` - customer’s submitted RMA (Return Merchandise Authorization) number. + example: fullname,companyname,phone,orderno,rma meta_description: type: string - description: Description contained within this page’s `<meta/>` element. - body: - type: string - description: 'HTML or variable that populates this page’s `<body>` element, in default/desktop view. Required in POST if page type is `raw`.' - example: "<p>We're happy to answer questions or help you with returns.<br />Please fill out the form below if you need assistance.</p>" - mobile_body: - type: string - description: HTML to use for this page’s body when viewed in the mobile template (deprecated). + description: Description contained within this page’s `<meta/>` element. HTML to use for this page’s body when viewed in the mobile template. example: '0' - has_mobile_version: - type: boolean - description: 'If true, this page has a mobile version.' - example: false - is_visible: - type: boolean - description: 'If true, this page appears in the storefront’s navigation menu.' - example: true is_homepage: type: boolean description: If true, this page is the storefront’s home page. example: false - meta_title: - type: string - description: Text specified for this page’s `<title>` element. If empty, the value of the name property is used. layout_file: type: string description: Layout template for this page. This field is writable only for stores with a Blueprint theme applied. example: page.html - sort_order: - type: integer - description: Order in which this page should display on the storefront. (Lower integers specify earlier display.) - example: 3 + is_customers_only: + type: boolean + description: If true, this page is for customers only. + example: false search_keywords: type: string description: Comma-separated list of keywords that shoppers can use to locate this page when searching the store. - meta_keywords: - type: string - description: Comma-separated list of SEO-relevant keywords to include in the page’s `<meta/>` element. - feed: - type: string - description: If page type is `rss_feed` then this field is visible. - link: + has_mobile_version: + type: boolean + description: 'If true, this page has a mobile version. (For Blueprint themes only)' + example: false + mobile_body: type: string - description: If page type is `link` this field is returned. + description: HTML to use for this page’s body when viewed in the mobile template (deprecated - Blueprint only). + example: '0' content_type: type: string example: text/html @@ -1651,6 +1653,16 @@ components: - application/json - text/javascript - text/html + url: + type: string + description: Relative URL on the storefront for this page. + example: /contact-us/ + feed: + type: string + description: If page type is `rss_feed`, then this field is visible. + link: + type: string + description: If page type is `link`, this field is returned. securitySchemes: X-Auth-Token: name: X-Auth-Token From 9039f9aa6ca3a878323e26dd42cf7f2482a0aae8 Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Fri, 31 May 2024 09:37:09 -0400 Subject: [PATCH 032/221] DEVDOCS-5964 Fix missing schemas in theme objects (#302) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5964] ## What changed? This PR changes the relative links in the schemas to full URLs so that the ref parser can render the theme objects ## Release notes draft Previously missing object properties and missing schemas will now appear correctly <img width="1495" alt="Screenshot 2024-05-31 at 8 59 05 AM" src="https://github.com/bigcommerce/docs/assets/29524703/21deda2e-d38f-488c-830b-44c71ac7a56a"> Preview branch: https://developer-center-pycvjlr36-bigcommerce-dx.vercel.app/docs/storefront/stencil/themes/context/object-reference/schemas#customer [DEVDOCS-5964]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5964?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- models/_root/blog.yml | 4 ++-- models/_root/brand.yml | 4 ++-- models/_root/brands.yml | 2 +- models/_root/categories.yml | 4 ++-- models/_root/category.yml | 4 ++-- models/_root/customer.yml | 14 +++++++------- models/_root/forms.yml | 18 +++++++++--------- models/_root/order.yml | 2 +- models/_root/price.yml | 18 +++++++++--------- models/_root/product.yml | 10 +++++----- models/_root/products.yml | 6 +++--- models/_root/settings.yml | 2 +- models/_root/wishlist.yml | 4 ++-- 13 files changed, 46 insertions(+), 46 deletions(-) diff --git a/models/_root/blog.yml b/models/_root/blog.yml index 40d4d6727..47ae61c1c 100644 --- a/models/_root/blog.yml +++ b/models/_root/blog.yml @@ -18,7 +18,7 @@ oneOf: type: string description: Blog name. posts: - $ref: ../blog/posts.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/blog/posts.yml tag: type: 'null' description: The blogʼs tag. @@ -33,7 +33,7 @@ oneOf: type: string description: Blog name. recent_posts: - $ref: ../blog/posts.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/blog/posts.yml url: type: string description: URL to the blog page. diff --git a/models/_root/brand.yml b/models/_root/brand.yml index c9c4fc7ad..ea96754d9 100644 --- a/models/_root/brand.yml +++ b/models/_root/brand.yml @@ -19,7 +19,7 @@ properties: items: type: object image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml meta: type: array items: @@ -31,7 +31,7 @@ properties: type: array description: An array of product card models. items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml search_error: type: boolean selected: diff --git a/models/_root/brands.yml b/models/_root/brands.yml index 04bce7529..f499897f0 100644 --- a/models/_root/brands.yml +++ b/models/_root/brands.yml @@ -6,7 +6,7 @@ items: id: type: integer image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml name: type: string url: diff --git a/models/_root/categories.yml b/models/_root/categories.yml index 1956eff46..df580b13e 100644 --- a/models/_root/categories.yml +++ b/models/_root/categories.yml @@ -15,7 +15,7 @@ items: type: string description: ID of the top-level category listed. image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml name: type: string description: Name of the top-level category @@ -35,7 +35,7 @@ items: type: string description: ID of the top-level category listed. image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml name: type: string description: Name of the top-level category diff --git a/models/_root/category.yml b/models/_root/category.yml index e17de8912..c5ca62248 100644 --- a/models/_root/category.yml +++ b/models/_root/category.yml @@ -34,7 +34,7 @@ properties: type: integer description: Unique ID for the category. image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml meta: type: array items: @@ -46,7 +46,7 @@ properties: products: type: array items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml selected: type: array description: Selected search facets. diff --git a/models/_root/customer.yml b/models/_root/customer.yml index 5abb2faa0..7d5db028d 100644 --- a/models/_root/customer.yml +++ b/models/_root/customer.yml @@ -5,7 +5,7 @@ description: |- type: object properties: addresses: - $ref: ../customer/addresses.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/addresses.yml customer_group_id: type: number description: ID of this customerʼs group. @@ -30,18 +30,18 @@ properties: description: Number of wishlists for this customer. type: string orders: - $ref: ../customer/orders.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/orders.yml payment_methods: - $ref: ../customer/payment_methods.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/payment_methods.yml phone: description: Customerʼs phone number. type: string recently_viewed_products: type: array items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml returns: - $ref: ../customer/returns.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/returns.yml shipping_address: description: Shipping address used for the order. type: object @@ -95,7 +95,7 @@ properties: description: Customerʼs shipping postal code. type: string shipping_addresses: - $ref: ../customer/orders.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/orders.yml store_credit: description: Customerʼs store credit. type: object @@ -107,4 +107,4 @@ properties: value: type: number wishlists: - $ref: ../customer/wishlists.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/wishlists.yml diff --git a/models/_root/forms.yml b/models/_root/forms.yml index acac4a5de..8767d73ae 100644 --- a/models/_root/forms.yml +++ b/models/_root/forms.yml @@ -4,12 +4,12 @@ description: |- **Handlebars Expression**: `{{forms.edit_account}}` type: object anyOf: - - $ref: ../forms/address.yml - - $ref: ../forms/contact.yml - - $ref: ../forms/create_account.yml - - $ref: ../forms/edit_account.yml - - $ref: ../forms/gift_certificate.yml - - $ref: ../forms/login.yml - - $ref: ../forms/provider.yml - - $ref: ../forms/return.yml - - $ref: ../forms/wishlist.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/address.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/contact.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/create_account.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/edit_account.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/gift_certificate.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/login.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/provider.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/return.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/wishlist.yml diff --git a/models/_root/order.yml b/models/_root/order.yml index e457a5ea3..24a6b2f6f 100644 --- a/models/_root/order.yml +++ b/models/_root/order.yml @@ -222,7 +222,7 @@ properties: gift_wrapping_name: type: string image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml name: type: string description: Product Name diff --git a/models/_root/price.yml b/models/_root/price.yml index 211834872..828e5137e 100644 --- a/models/_root/price.yml +++ b/models/_root/price.yml @@ -4,20 +4,20 @@ allOf: description: 'product.price and products[*].price object available to various product templates and components.' properties: non_sale_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml map_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml map_price_with_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml price_range: type: object properties: - max: ../common/price.yml - min: ../common/price.yml + max: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + min: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml rrp_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml sale_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml saved: - $ref: ../common/amount.yml - - $ref: ../common/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml diff --git a/models/_root/product.yml b/models/_root/product.yml index a62ecb168..a019e1b99 100644 --- a/models/_root/product.yml +++ b/models/_root/product.yml @@ -121,7 +121,7 @@ properties: description: Number of reviews the product has type: integer options: - $ref: ../product/options.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/options.yml out_of_stock: type: boolean description: 'Boolean that indicates whether the product is out of stock. Out of stock only applies to the default selection on page load. For example, if Product A is out of the "Small" size, but "Small" is selected by default, `out_of_stock` will return true, even if the product is not out of stock as a whole.' @@ -132,14 +132,14 @@ properties: page_title: type: string price: - $ref: ../product/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/price.yml rating: description: Rating for the product type: integer related_products: - $ref: ../product/related_products.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/related_products.yml reviews: - $ref: ../product/reviews.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/reviews.yml shipping: type: object properties: @@ -185,7 +185,7 @@ properties: description: URL to the product detail page type: string videos: - $ref: ../product/videos.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/videos.yml warranty: description: Optional warranty text set by the merchant type: string diff --git a/models/_root/products.yml b/models/_root/products.yml index c197565a2..ee4ee0a96 100644 --- a/models/_root/products.yml +++ b/models/_root/products.yml @@ -4,14 +4,14 @@ properties: new: type: array items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml featured: type: array description: Renders a list of all the featured products for the BigCommerce storefront. items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml top_sellers: type: array description: Object to display a sidebar of top-selling products. items: - $ref: ../common/product.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml diff --git a/models/_root/settings.yml b/models/_root/settings.yml index f361b1a53..ff4f4849d 100644 --- a/models/_root/settings.yml +++ b/models/_root/settings.yml @@ -225,7 +225,7 @@ properties: type: string description: Title for the logo. Configure the text in the control panel under Storefront Design Design Options Logo. image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml store_name: type: string description: Name of the BigCommerce store. diff --git a/models/_root/wishlist.yml b/models/_root/wishlist.yml index 26b07648d..16ef73149 100644 --- a/models/_root/wishlist.yml +++ b/models/_root/wishlist.yml @@ -48,11 +48,11 @@ properties: id: type: number image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml images: type: array items: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml low_stock_level: type: object name: From 80c97361cc29c7e498663d9ac09ea3167aa140fe Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 09:53:46 -0500 Subject: [PATCH 033/221] DEVDOCS-5906: [Update]custom_url and url (#293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5906] ## What changed? Updating the descriptions for custom_url and url ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5906]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5906?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/brands_catalog.v3.yml | 4 ++++ reference/catalog/categories_catalog.v3.yml | 6 +++--- reference/catalog/category-trees_catalog.v3.yml | 4 +++- reference/catalog/products_catalog.v3.yml | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index 9d633be06..5a6eff1ba 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -347,6 +347,8 @@ paths: description: | Brand URL on the storefront. example: /shoes + minLength: 1 + maxLength: 255 x-url: true is_customized: type: boolean @@ -692,6 +694,8 @@ paths: description: | Brand URL on the storefront. example: /shoes + minLength: 1 + maxLength: 255 x-url: true is_customized: type: boolean diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index a1263890c..bdf3323ea 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -336,11 +336,11 @@ paths: custom_url: title: Custom Url Category type: object - description: The custom URL for the category on the storefront. + description: The custom URL for the category on the storefront. If not provided, the URL will be autogenerated from the category name. properties: url: maxLength: 255 - minLength: 0 + minLength: 1 type: string description: | Category URL on the storefront. @@ -657,7 +657,7 @@ paths: properties: url: maxLength: 255 - minLength: 0 + minLength: 1 type: string description: | Category URL on the storefront. diff --git a/reference/catalog/category-trees_catalog.v3.yml b/reference/catalog/category-trees_catalog.v3.yml index 298e9fa22..6138007d6 100644 --- a/reference/catalog/category-trees_catalog.v3.yml +++ b/reference/catalog/category-trees_catalog.v3.yml @@ -882,7 +882,9 @@ components: url: title: URL description: | - If not provided, the URL is autogenerated from the category name. + The custom URL for the category trees on the storefront. If not provided in a POST request body, the URL is autogenerated from the category name. + minLength: 1 + maxLength: 255 type: object properties: path: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 876b36594..d8d3c4411 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -6367,7 +6367,7 @@ components: properties: url: maxLength: 255 - minLength: 0 + minLength: 1 type: string description: | Product URL on the storefront. @@ -6386,7 +6386,7 @@ components: type: boolean description: | Optional field. This field automatically creates a dynamic 301 redirect when a product URL change occurs with a PUT request. Existing dynamic redirects will automatically update to a new URL to avoid a loop. - description: The custom URL for the product on the storefront. + description: The custom URL for the product on the storefront. If not provided in the POST request, the URL will be autogenerated from the product name. x-internal: false bulkPricingRule_Full: title: bulkPricingRule_Full From 0d5787b2124a10d1db191d783f5ce47c4676c637 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 09:54:56 -0500 Subject: [PATCH 034/221] DEVDOCS-5914: [Update] name definition (#298) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5914] ## What changed? Update category name description. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5914]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5914?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/categories_catalog.v3.yml | 6 ++---- reference/catalog/category-trees_catalog.v3.yml | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index bdf3323ea..8425e4379 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -255,8 +255,7 @@ paths: minLength: 1 type: string description: |- - The name displayed for the category. Name is unique with respect to the categoryʼs siblings. - Required in a POST. + The name displayed for the category. The name must be unique with respect to the category of siblings on the same level (you can duplicate the name for other siblings on another level). Required in a POST. example: Bath x-required: - post @@ -572,8 +571,7 @@ paths: minLength: 1 type: string description: |- - The name displayed for the category. Name is unique with respect to the categoryʼs siblings. - Required in a POST. + The name displayed for the category. The name must be unique with respect to the category of siblings on the same level (you can duplicate the name for other siblings on another level). Required in a POST. example: Bath x-required: - post diff --git a/reference/catalog/category-trees_catalog.v3.yml b/reference/catalog/category-trees_catalog.v3.yml index 6138007d6..a9f0261a1 100644 --- a/reference/catalog/category-trees_catalog.v3.yml +++ b/reference/catalog/category-trees_catalog.v3.yml @@ -926,8 +926,7 @@ components: minLength: 1 type: string description: |- - The name displayed for the category. Name is unique with respect to the categoryʼs siblings. - Required in a POST. + The name displayed for the category tree. The name must be unique with respect to the category tree of siblings on the same level (you can duplicate the name for other siblings on another level). Required in a POST. example: Bath parameters: Accept: From d4fff0b32c70600f91e06e0e19f0ffcfb0eafb11 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 12:36:50 -0500 Subject: [PATCH 035/221] DEVDOCS-5518: [Update] update page, urls, and comparisons theme objects (#305) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5518] ## What changed? Updated theme objects (page, urls, and comparisons) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- models/_root/comparisons.yml | 2 +- models/_root/page.yml | 5 +++++ models/_root/urls.yml | 21 ++++++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/models/_root/comparisons.yml b/models/_root/comparisons.yml index cb5a1bc94..2f468847c 100644 --- a/models/_root/comparisons.yml +++ b/models/_root/comparisons.yml @@ -25,7 +25,7 @@ items: category: type: array items: - type: object + type: string custom_fields: type: array description: Array of additional product details as name-value pairs. For example, size, color, bookʼs ISBN, DVDʼs release date, etc. diff --git a/models/_root/page.yml b/models/_root/page.yml index a04be9883..830fcc2ab 100644 --- a/models/_root/page.yml +++ b/models/_root/page.yml @@ -30,6 +30,11 @@ properties: description: Array of child pages items: type: object + properties: + title: + type: string + url: + type: string title: type: string description: Title of this child page diff --git a/models/_root/urls.yml b/models/_root/urls.yml index b53579e1a..e2670dad6 100644 --- a/models/_root/urls.yml +++ b/models/_root/urls.yml @@ -102,9 +102,24 @@ properties: type: object properties: products: - type: array - items: - type: object + type: object + properties: + new: + type: string + new_atom: + type: string + popular: + type: string + popular_atom: + type: string + featured: + type: string + featured_atom: + type: string + search: + type: string + search_atom: + type: string search: type: string sitemap: From 3d2627bc0232eb609be60e38d2fbed7459284c5c Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 13:03:47 -0500 Subject: [PATCH 036/221] DEVDOCS-5518: [Update]remote_api_scripts.yml (#306) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5518] ## What changed? Added "No properties available for this object" ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- models/_root/remote_api_scripts.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/models/_root/remote_api_scripts.yml b/models/_root/remote_api_scripts.yml index 487910ae3..d4b3a8811 100644 --- a/models/_root/remote_api_scripts.yml +++ b/models/_root/remote_api_scripts.yml @@ -1 +1,3 @@ -type: array \ No newline at end of file +type: array +items: [] +description: 'Empty array. No properties available for this object.' From 3883bd3b3c99f2fd59e0953d5ecfc7b67ef6023e Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 14:38:04 -0500 Subject: [PATCH 037/221] Update remote_api_scripts.yml per Mark (#308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5518] ## What changed? Fixed schema for remote_api_scripts ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Mark Murphy <mark@murphymark.me> --- models/_root/remote_api_scripts.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/models/_root/remote_api_scripts.yml b/models/_root/remote_api_scripts.yml index d4b3a8811..410eef4d7 100644 --- a/models/_root/remote_api_scripts.yml +++ b/models/_root/remote_api_scripts.yml @@ -1,3 +1,5 @@ -type: array -items: [] -description: 'Empty array. No properties available for this object.' +description: | + Empty array. No properties are available for this object. + *Handlebars Expression*: {{remote_api_scripts}} +type: object +items: {} From 048fa9f147593e33b8ba683a8ae63674c6b248b9 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 31 May 2024 15:11:30 -0500 Subject: [PATCH 038/221] Issue-300: [update] Update webhooks.v3.yml (#309) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [ISSUE-300] ## What changed? Added information regarding the replacement for this endpoint. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/webhooks.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index 4f0186bf2..5d32ab6b3 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -355,7 +355,7 @@ paths: '401': $ref: '#/components/responses/401_Unauthorized' description: | - Get a list of events that were sent but not successfully received. Events are stored for not less than one week. + Get a list of events that were sent but not successfully received. Events are stored for at least one week. This hook/event functionality is superseded by [Delivery exception hooks](/docs/integrations/webhooks/events#delivery-exception-hooks). components: parameters: WebhookId: From 2af5f2f50307fb1b45e26a57517da91c720c9015 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Fri, 31 May 2024 16:29:13 -0500 Subject: [PATCH 039/221] [DEVDOCS-5854]: [revise] Abandoned carts V3, Clean up schema layout to use as example API (#310) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5854] ## What changed? <!-- Provide a bulleted list in the present tense --> * Move parameters in to place * Fix format issues with schema ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * No real changes, just small tweaks to the schema layouts. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5854]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5854?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/abandoned_carts.v3.yml | 196 ++++++++++++++++--------------- 1 file changed, 104 insertions(+), 92 deletions(-) diff --git a/reference/abandoned_carts.v3.yml b/reference/abandoned_carts.v3.yml index 5bcab5296..b1e15e9aa 100644 --- a/reference/abandoned_carts.v3.yml +++ b/reference/abandoned_carts.v3.yml @@ -1,7 +1,7 @@ -openapi: '3.0.0' +openapi: "3.0.0" info: version: '' - title: Abandoned Carts + title: Abandoned carts description: |- Use `/abandoned-carts/{token}` on headless storefronts to retrieve the `cart_id` using the abandoned cart `token` passed to the storefront when a shopper clicks an abandoned cart email link. Once the cart ID has been retrieved, your application can use it to fetch and display information about the cart to the shopper using the REST Storefront API, the REST Management API, or the GraphQL Storefront API. termsOfService: 'https://www.bigcommerce.com/terms' @@ -19,89 +19,103 @@ servers: security: - X-Auth-Token: [] tags: - - name: Abandoned Carts - - name: Abandoned Cart Settings - - name: Abandoned Carts Settings + - name: Abandoned carts + - name: Abandoned cart settings + - name: Abandoned carts settings paths: - '/abandoned-carts/settings': + /abandoned-carts/settings: get: - summary: Get Global Abandoned Cart Settings - description: Returns the global abandoned cart settings of a store. + summary: Get global abandoned cart settings + description: Return the global abandoned cart settings of a store. operationId: getGlobalAbandonedCartSettings tags: - - Abandoned Cart Settings + - Abandoned cart settings + parameters: + - name: pagination + in: query + description: How many pages to return + required: false + schema: + type: integer + maximum: 100 + format: int32 responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/GlobalAbandonedCartSettingsResponse' + $ref: "#/components/schemas/GlobalAbandonedCartSettingsResponse" '401': description: Unauthorized content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' - parameters: [] + $ref: "#/components/schemas/ErrorResponse" put: - summary: Update Global Abandoned Cart Settings - description: Updates the global abandoned cart settings of a store. + summary: Update global abandoned cart settings + description: Update the global abandoned cart settings of a store. operationId: updateGlobalAbandonedCartSettings tags: - - Abandoned Carts Settings + - Abandoned carts settings + parameters: + - $ref: "#/components/parameters/ContentType" + - $ref: "#/components/parameters/Accept" requestBody: required: true content: application/json: schema: - $ref: '#/components/schemas/GlobalAbandonedCartSettingsRequest' + $ref: "#/components/schemas/GlobalAbandonedCartSettingsRequest" responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/GlobalAbandonedCartSettingsResponse' + $ref: "#/components/schemas/GlobalAbandonedCartSettingsResponse" '401': description: Unauthorized content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' + $ref: "#/components/schemas/ErrorResponse" '422': description: Unprocessable entity content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' - parameters: - - $ref: '#/components/parameters/ContentType' - parameters: - - - $ref: '#/components/parameters/Accept' - '/abandoned-carts/settings/channels/{channel_id}': + $ref: "#/components/schemas/ErrorResponse" + /abandoned-carts/settings/channels/{channel_id}: get: - summary: Get Channel Abandoned Cart Settings - description: Returns the per-channel overrides for the abandoned cart settings of a store. + summary: Get channel abandoned cart settings + description: Return the per-channel overrides for the abandoned cart settings of a store. operationId: getChannelAbandonedCartSettings tags: - - Abandoned Carts Settings + - Abandoned carts settings + parameters: + - name: channel_id + description: The channel ID of the settings overrides + in: path + required: true + schema: + type: integer + format: int32 responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/ChannelAbandonedCartSettingsResponse' + $ref: "#/components/schemas/ChannelAbandonedCartSettingsResponse" '401': description: Unauthorized content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' + $ref: "#/components/schemas/ErrorResponse" put: - summary: Update Channel Abandoned Cart Settings + summary: Update channel abandoned cart settings description: |- Updates the per-channel overrides for the abandoned cart settings of a store. @@ -111,71 +125,71 @@ paths: | Information & Settings | modify | `store_v2_information` | operationId: updateChannelAbandonedCartSettings tags: - - Abandoned Carts Settings + - Abandoned carts settings parameters: - - $ref: '#/components/parameters/ContentType' + - $ref: "#/components/parameters/ContentType" + - $ref: "#/components/parameters/Accept" + - name: channel_id + description: The channel ID of the settings overrides + in: path + required: true + schema: + type: integer + format: int32 requestBody: required: true content: application/json: schema: - $ref: '#/components/schemas/ChannelAbandonedCartSettingsRequest' + $ref: "#/components/schemas/ChannelAbandonedCartSettingsRequest" responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/ChannelAbandonedCartSettingsResponse' + $ref: "#/components/schemas/ChannelAbandonedCartSettingsResponse" '401': description: Unauthorized content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' + $ref: "#/components/schemas/ErrorResponse" '422': description: Unprocessable entity content: application/json: schema: - $ref: '#/components/schemas/ErrorResponse' + $ref: "#/components/schemas/ErrorResponse" security: [] - parameters: - - $ref: '#/components/parameters/Accept' - - name: channel_id - description: The channel ID of the settings overrides - in: path - required: true - schema: - type: integer - '/abandoned-carts/{token}': + /abandoned-carts/{token}: get: responses: '200': - $ref: '#/components/responses/abandonedCart_Resp' + $ref: "#/components/responses/abandonedCart_Resp" '400': - $ref: '#/components/responses/400_BadRequest' + $ref: "#/components/responses/400_BadRequest" '404': - $ref: '#/components/responses/404_NotFound' + $ref: "#/components/responses/404_NotFound" '422': - $ref: '#/components/responses/422_UnprocessableEntity' + $ref: "#/components/responses/422_UnprocessableEntity" '502': - $ref: '#/components/responses/502_GatewayError' + $ref: "#/components/responses/502_GatewayError" '503': - $ref: '#/components/responses/503_ServiceUnavailable' + $ref: "#/components/responses/503_ServiceUnavailable" '504': - $ref: '#/components/responses/504_GatewayTimeout' + $ref: "#/components/responses/504_GatewayTimeout" default: description: '' - summary: Get an Abandoned Cart + summary: Get an abandoned cart description: |- - Returns the `cart_id` corresponding to the abandoned cart `{token}` passed in. + Return the `cart_id` corresponding to the abandoned cart `{token}` passed in. **Usage Notes**: * `{token}` is the token in the query string of the abandoned cart link found in abandoned cart email notifications to shoppers operationId: getAbandonedCarts tags: - - Abandoned Carts + - Abandoned carts parameters: - name: token in: path @@ -186,6 +200,7 @@ paths: Unique cart `UUID` token that is generated for abandoned cart emails. schema: type: string + format: uuid - $ref: '#/components/parameters/Accept' components: parameters: @@ -193,10 +208,10 @@ components: name: Accept in: header required: true - description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + description: The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body. schema: type: string - default: 'application/json' + default: application/json ContentType: name: Content-Type in: header @@ -231,18 +246,6 @@ components: title: Gateway Timeout type: /api-docs/getting-started/api-status-codes errors: {} - 403_Unauthorized: - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/error_Full' - examples: - response: - value: - status: 403 - title: Unauthorized Access. You do not have permission to make this request. - type: /api-docs/getting-started/api-status-codes 400_BadRequest: description: |- Malformed request syntax. Typically need to fix the JSON @@ -339,18 +342,19 @@ components: type: object properties: {} additionalProperties: true - description: Response metadata. + description: Response metadata error_Full: type: object title: error_Full properties: status: description: | - The HTTP status code. + The HTTP status code type: integer + format: int32 title: description: | - The error title describing the particular error. + The error title describing the particular error type: string type: type: string @@ -372,7 +376,7 @@ components: properties: cart_id: type: string - description: The `cart_id` of the abandoned cart. Can be used to display the abandoned cart to the customer using storefront cart or server-to-server cart APIs. + description: The `cart_id` of the abandoned cart. Can be used to display the abandoned cart to the customer using storefront cart or server-to-server cart APIs x-internal: false AbandonedCartSettings: description: Represents all settings related to the abandoned cart functionality of a store @@ -387,7 +391,7 @@ components: description: Indicates whether or not a customer should continue to receive abandoned cart emails until their cart is recovered type: boolean marketing_emails_require_customer_consent: - description: Indicates whether or not a customer should receive abandoned cart emails based on their consent. By default customers will not receive emails. + description: Indicates whether or not a customer should receive abandoned cart emails based on their consent. By default customers will not receive emails type: boolean email_merchant_when_cart_is_converted: description: Indicates whether or not a merchant should receive a notification email when a cart is converted into an order @@ -400,7 +404,7 @@ components: type: string format: email merchant_abandoned_cart_email_frequency_type: - description: 'Indicates whether to send an email for every abandoned cart, or to send a digest email after X number of abandoned carts' + description: Indicates whether to send an email for every abandoned cart, or to send a digest email after X number of abandoned carts type: string enum: - digest @@ -408,6 +412,7 @@ components: merchant_abandoned_cart_digest_email_frequency: description: The number of abandoned carts to accumulate before a digest email is sent to a merchant type: integer + format: int32 minimum: 2 maximum: 1000 ChannelAbandonedCartSettings: @@ -417,46 +422,49 @@ components: - Models properties: enable_notification: - description: 'Indicates whether or not abandoned cart notification is on. If it is null, it means there is no override for the specified channel.' + description: Indicates whether or not abandoned cart notification is on. If it is null, it means there is no override for the specified channel. type: boolean nullable: true email_customer_until_cart_is_recovered: - description: 'Indicates whether or not a customer should continue to receive abandoned cart emails until their cart is recovered. If it is null, it means there is no override for the specified channel.' + description: Indicates whether or not a customer should continue to receive abandoned cart emails until their cart is recovered. If it is null, it means there is no override for the specified channel. type: boolean nullable: true marketing_emails_require_customer_consent: - description: 'Indicates whether or not a customer should receive abandoned cart emails based on their consent. If it is null, it means there is no override for the specified channel. By default customers will not receive emails.' + description: Indicates whether or not a customer should receive abandoned cart emails based on their consent. If it is null, it means there is no override for the specified channel. By default customers will not receive emails. type: boolean nullable: true email_merchant_when_cart_is_converted: - description: 'Indicates whether or not a merchant should receive a notification email when a cart is converted into an order. If it is null, it means there is no override for the specified channel.' + description: Indicates whether or not a merchant should receive a notification email when a cart is converted into an order. If it is null, it means there is no override for the specified channel. type: boolean nullable: true email_merchant_when_cart_is_abandoned: - description: 'Indicates whether or not a merchant should receive a notification email when a cart is abandoned. If it is null, it means there is no override for the specified channel.' + description: Indicates whether or not a merchant should receive a notification email when a cart is abandoned. If it is null, it means there is no override for the specified channel. type: boolean nullable: true merchant_email_address: - description: 'The email address for receiving merchant notifications. If it is null, it means there is no override for the specified channel.' + description: The email address for receiving merchant notifications. If it is null, it means there is no override for the specified channel. type: string + minLength: 0 + maxLength: 500 format: email nullable: true merchant_abandoned_cart_email_frequency_type: - description: 'Indicates whether to send an email for every abandoned cart or to send a digest email after X number of abandoned carts. If it is null, it means there is no override for the specified channel.' + description: Indicates whether to send an email for every abandoned cart or to send a digest email after X number of abandoned carts. If it is null, it means there is no override for the specified channel. type: string enum: - digest - individual nullable: true merchant_abandoned_cart_digest_email_frequency: - description: 'The number of abandoned carts to accumulate before a digest email is sent to a merchant. If it is null, it means there is no override for the specified channel.' + description: The number of abandoned carts to accumulate before a digest email is sent to a merchant. If it is null, it means there is no override for the specified channel. type: integer + format: int32 minimum: 2 maximum: 1000 nullable: true ChannelAbandonedCartSettingsRequest: allOf: - - $ref: '#/components/schemas/ChannelAbandonedCartSettings' + - $ref: "#/components/schemas/ChannelAbandonedCartSettings" - description: The request object for updating the abandoned cart settings overrides of a store for a channel x-tags: - Models @@ -465,14 +473,14 @@ components: type: object properties: data: - $ref: '#/components/schemas/ChannelAbandonedCartSettings' + $ref: "#/components/schemas/ChannelAbandonedCartSettings" meta: - $ref: '#/components/schemas/metaEmpty_Full' + $ref: "#/components/schemas/metaEmpty_Full" x-tags: - Models GlobalAbandonedCartSettingsRequest: allOf: - - $ref: '#/components/schemas/AbandonedCartSettings' + - $ref: "#/components/schemas/AbandonedCartSettings" - description: The request object for updating the abandoned cart settings of a store at the global level required: - enabled @@ -490,9 +498,9 @@ components: type: object properties: data: - $ref: '#/components/schemas/AbandonedCartSettings' + $ref: "#/components/schemas/AbandonedCartSettings" meta: - $ref: '#/components/schemas/metaEmpty_Full' + $ref: "#/components/schemas/metaEmpty_Full" x-tags: - Models ErrorResponse: @@ -501,10 +509,15 @@ components: properties: status: type: integer + format: int32 title: type: string + minLength: 0 + maxLength: 500 type: type: string + minLength: 0 + maxLength: 500 instance: type: string errors: @@ -512,5 +525,4 @@ components: properties: {} additionalProperties: true x-tags: - - Models - + - Models \ No newline at end of file From 025b433934ea4c75dd4f503072f8ecb87a7c6047 Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Fri, 31 May 2024 21:27:12 -0400 Subject: [PATCH 040/221] Update models so title appears when rendered (#304) ## What changed? This PR modifies the structure of the forms and pagination related models so that the titles appear in the anyOf or oneOf selectors ## Release notes draft anyOf or oneOf options now appear for `forms` and `pagination` theme object models. ## Anything else? Before: <img width="730" alt="image" src="https://github.com/bigcommerce/docs/assets/29524703/d040b7f1-8268-49ee-ba4e-dfa7721c41d8"> After: <img width="745" alt="image" src="https://github.com/bigcommerce/docs/assets/29524703/22b5caed-04b6-454c-8c60-b74015fd6c71"> --- models/_root/pagination.yml | 75 +++++++++++---------------- models/forms/address.yml | 30 ++++++----- models/forms/contact.yml | 26 ++++++---- models/forms/create_account.yml | 54 ++++++++++--------- models/forms/edit_account.yml | 40 +++++++------- models/forms/gift_certificate.yml | 86 ++++++++++++++++--------------- models/forms/login.yml | 38 ++++++++------ models/forms/provider.yml | 1 + models/forms/return.yml | 33 +++++++----- models/forms/wishlist.yml | 34 ++++++------ 10 files changed, 219 insertions(+), 198 deletions(-) diff --git a/models/_root/pagination.yml b/models/_root/pagination.yml index c4d599570..ab375e23b 100644 --- a/models/_root/pagination.yml +++ b/models/_root/pagination.yml @@ -1,50 +1,37 @@ -description: |- +type: object +description: | `{{pagination}}` object available to templates containing paginated lists, such as `templates/pages/category.html` and `templates/pages/brands.html`. **Handlebars Expression**: `{{pagination}}` -oneOf: - - properties: +anyOf: + - title: Category + type: object + properties: category: - type: object - properties: - current: - type: number - description: Number representing which page (in the current collection) the customer is viewing. - links: - type: array - description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' - items: - type: object - sort: - type: string - description: Field to sort by - - properties: + $ref: '#/definitions/PaginationObject' + - title: Brand + type: object + properties: brand: - type: object - properties: - current: - type: number - description: Number representing which page (in the current collection) the customer is viewing. - links: - type: array - description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' - items: - type: object - sort: - type: string - - properties: + $ref: '#/definitions/PaginationObject' + - title: Blog + type: object + properties: blog: - type: object - properties: - current: - type: number - description: Number representing which page (in the current collection) the customer is viewing. - links: - type: array - description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' - items: - type: object - sort: - type: string - description: Field to sort by -type: object + $ref: '#/definitions/PaginationObject' + +definitions: + PaginationObject: + type: object + properties: + current: + type: number + description: Number representing which page (in the current collection) the customer is viewing. + links: + type: array + description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' + items: + type: object + sort: + type: string + description: Field to sort by diff --git a/models/forms/address.yml b/models/forms/address.yml index 3b69cbf7a..e3c2ca9b2 100644 --- a/models/forms/address.yml +++ b/models/forms/address.yml @@ -1,16 +1,20 @@ description: "`{{forms.address}}` object available to `templates/pages/account/add-address.html`" type: object +title: Address properties: - address_id: - type: string - description: ID for this shipping address - shipping_fields: - type: array - description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo] (https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms)' - items: {} - action: - type: string - description: URL to the proper handler (Update Address versus Save New Address). - error: - type: string - description: Message to display when form entry fails (defined by the BigCommerce App). \ No newline at end of file + address: + type: object + properties: + address_id: + type: string + description: ID for this shipping address + shipping_fields: + type: array + description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo](https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms)' + items: {} + action: + type: string + description: URL to the proper handler (Update Address versus Save New Address). + error: + type: string + description: Message to display when form entry fails (defined by the BigCommerce App). diff --git a/models/forms/contact.yml b/models/forms/contact.yml index 7cd18c0ff..241989c1e 100644 --- a/models/forms/contact.yml +++ b/models/forms/contact.yml @@ -1,18 +1,22 @@ description: "`{{forms.contact}}` object available to `templates/pages/account/add-address.html`" type: object +title: Contact properties: - captcha_url: - type: string - page_id: - type: string - recaptcha: + contact: type: object properties: - enabled: - type: number - markup: + captcha_url: type: string - public_key: + page_id: type: string - text: - type: string \ No newline at end of file + recaptcha: + type: object + properties: + enabled: + type: number + markup: + type: string + public_key: + type: string + text: + type: string \ No newline at end of file diff --git a/models/forms/create_account.yml b/models/forms/create_account.yml index fd3935950..fc2a25d92 100644 --- a/models/forms/create_account.yml +++ b/models/forms/create_account.yml @@ -1,28 +1,32 @@ description: "`{{forms.create_account}}` object available to `templates/pages/auth/create-account.html`" type: object +title: Create Account properties: - recaptcha: - type: string - description: Objects for integrating the Google reCAPTCHA service to distinguish human visitors from ’bots (automated agents). - enabled: - type: boolean - description: Boolean indicating whether reCAPTCHA is enabled for this store. - public_key: - type: string - description: Public key (site key) that reCAPTCHA returns upon merchant’s enabling CAPTCHA security in Store Settings > Display Settings. - address_fields: - type: array - description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo] (https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms):' - items: {} - class_name: - type: string - description: 'Specifies a CSS class to apply to a field within the array; for corresponding control-panel steps, [see](https://support.bigcommerce.com/articles/Public/Editing-Form-Fields#advanced-settings):' - account_fields: - type: string - description: 'Object of form fields; for details, see this repo: https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms' - error: - type: string - description: BCApp generated message to display when customer’s account creation fails. - checking_out: - type: boolean - description: Boolean indicating whether customer created the account during a purchase checkout. \ No newline at end of file + create_account: + type: object + properties: + recaptcha: + type: string + description: Objects for integrating the Google reCAPTCHA service to distinguish human visitors from ’bots (automated agents). + enabled: + type: boolean + description: Boolean indicating whether reCAPTCHA is enabled for this store. + public_key: + type: string + description: Public key (site key) that reCAPTCHA returns upon merchant’s enabling CAPTCHA security in Store Settings > Display Settings. + address_fields: + type: array + description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo] (https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms):' + items: {} + class_name: + type: string + description: 'Specifies a CSS class to apply to a field within the array; for corresponding control-panel steps, [see](https: //support.bigcommerce.com/articles/Public/Editing-Form-Fields#advanced-settings):' + account_fields: + type: string + description: 'Object of form fields; for details, see this repo: https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms' + error: + type: string + description: BCApp generated message to display when customer’s account creation fails. + checking_out: + type: boolean + description: Boolean indicating whether customer created the account during a purchase checkout. \ No newline at end of file diff --git a/models/forms/edit_account.yml b/models/forms/edit_account.yml index 44987b8ab..0c750f31b 100644 --- a/models/forms/edit_account.yml +++ b/models/forms/edit_account.yml @@ -1,21 +1,25 @@ description: "`{{forms.edit_account}}` object available to `templates/pages/account/edit.html`" type: object +title: Edit Account properties: - first_name: - type: string - description: First name of the customer being edited - last_name: - type: string - description: Last name of the customer being edited - company_name: - type: string - description: Company of the customer being edited. - phone: - type: string - description: Phone number of the customer being edited - error: - type: string - description: Message to display (generated by the BigCommerce App) when customer’s account edit fails. - success: - type: string - description: Message to display (generated by the BigCommerce App) when customer’s account edit succeeds \ No newline at end of file + edit_account: + type: object + properties: + first_name: + type: string + description: First name of the customer being edited + last_name: + type: string + description: Last name of the customer being edited + company_name: + type: string + description: Company of the customer being edited. + phone: + type: string + description: Phone number of the customer being edited + error: + type: string + description: Message to display (generated by the BigCommerce App) when customer’s account edit fails. + success: + type: string + description: Message to display (generated by the BigCommerce App) when customer’s account edit succeeds \ No newline at end of file diff --git a/models/forms/gift_certificate.yml b/models/forms/gift_certificate.yml index 37f0e4983..5352a0c68 100644 --- a/models/forms/gift_certificate.yml +++ b/models/forms/gift_certificate.yml @@ -1,48 +1,52 @@ description: "`{{forms.gift_certicate}}` object available to `templates/pages/gift-certificate/purchase.html`" type: object +title: Gift Certificate properties: - action: - type: string - amount_options: - type: array - items: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - can_use_custom_amount: - type: boolean - editing: - type: boolean - expires_in_days: - type: boolean - preview: - type: string - themes: - type: array - items: - type: object - properties: - display: - type: string - value: - type: string - values: + gift_certificate: type: object properties: - amount: + action: type: string - from_email: + amount_options: + type: array + items: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + can_use_custom_amount: + type: boolean + editing: + type: boolean + expires_in_days: + type: boolean + preview: type: string - from_name: - type: string - message: - type: string - to_email: - type: string - to_name: - type: string \ No newline at end of file + themes: + type: array + items: + type: object + properties: + display: + type: string + value: + type: string + values: + type: object + properties: + amount: + type: string + from_email: + type: string + from_name: + type: string + message: + type: string + to_email: + type: string + to_name: + type: string \ No newline at end of file diff --git a/models/forms/login.yml b/models/forms/login.yml index bdaa09782..7ddd4fc84 100644 --- a/models/forms/login.yml +++ b/models/forms/login.yml @@ -1,20 +1,24 @@ description: "`{{forms.login}}` object available to `templates/pages/create-login.html`" type: object +title: Login properties: - error: - type: string - description: BigCommerce defined message to display when customer’s login action fails. - success: - type: string - description: BigCommerce defined message to display when customer’s login action succeeds. - reCAPTCHA: - type: string - enabled: - type: string - description: Returns 1 when reCAPTCHA is enabled and 0 when itʼs disabled within the BigCommerce control panel. - public_key: - type: string - description: Optional key used for all reCAPTCHA in your store if specified in the BigCommerce control panel. - markup: - type: string - description: HTML that adds reCAPTCHA V2. + login: + type: object + properties: + error: + type: string + description: BigCommerce defined message to display when customer’s login action fails. + success: + type: string + description: BigCommerce defined message to display when customer’s login action succeeds. + reCAPTCHA: + type: string + enabled: + type: string + description: Returns 1 when reCAPTCHA is enabled and 0 when itʼs disabled within the BigCommerce control panel. + public_key: + type: string + description: Optional key used for all reCAPTCHA in your store if specified in the BigCommerce control panel. + markup: + type: string + description: HTML that adds reCAPTCHA V2. \ No newline at end of file diff --git a/models/forms/provider.yml b/models/forms/provider.yml index 7ae135ea9..fde82236b 100644 --- a/models/forms/provider.yml +++ b/models/forms/provider.yml @@ -1,5 +1,6 @@ description: "`{{forms.provider}}` object available to `templates/pages/account/payment-methods.html`" type: object +title: Provider properties: provider: type: string diff --git a/models/forms/return.yml b/models/forms/return.yml index ca33afd73..b8abce2e9 100644 --- a/models/forms/return.yml +++ b/models/forms/return.yml @@ -1,16 +1,21 @@ description: "`{{forms.return}}` object available to `templates/pages/account/add-return.html`" +type: object +title: Return properties: - actions: - type: array - items: - type: string - order_id: - type: string - order_products: - type: array - items: - type: object - reasons: - type: array - items: - type: string \ No newline at end of file + return: + type: object + properties: + actions: + type: array + items: + type: string + order_id: + type: string + order_products: + type: array + items: + type: object + reasons: + type: array + items: + type: string \ No newline at end of file diff --git a/models/forms/wishlist.yml b/models/forms/wishlist.yml index 3059ad7be..8f2d1d696 100644 --- a/models/forms/wishlist.yml +++ b/models/forms/wishlist.yml @@ -1,18 +1,22 @@ description: "`{{forms.wishlist}}` object available to `templates/pages/account/add-wishlist.html`" type: object +title: Wishlist properties: - name: - type: string - description: Displayed name for this wishlist - id: - type: string - description: ID for this wishlist. - is_public: - type: boolean - description: Boolean indicating whether this wishlist is displayed to other store visitors. - errors: - type: string - description: Message to display when form entry fails (generated by the BigCommerce App). - actions: - type: string - description: URL to the proper handler (Update Wish List versus Save New Wish List). \ No newline at end of file + wishlist: + type: object + properties: + name: + type: string + description: "Displayed name for this wishlist" + id: + type: string + description: "ID for this wishlist." + is_public: + type: boolean + description: "Boolean indicating whether this wishlist is displayed to other store visitors." + errors: + type: string + description: "Message to display when form entry fails (generated by the BigCommerce App)." + actions: + type: string + description: "URL to the proper handler (Update Wish List versus Save New Wish List)." \ No newline at end of file From 398a51d01b2f75601dfef7ab9dd49a67f66b952f Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:02:45 -0500 Subject: [PATCH 041/221] DEVDOCS-5911 [new]: MSF / Stencil, add channels object to themes (#301) --- models/_root/settings.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/models/_root/settings.yml b/models/_root/settings.yml index ff4f4849d..5c320f49f 100644 --- a/models/_root/settings.yml +++ b/models/_root/settings.yml @@ -40,6 +40,27 @@ properties: description: Boolean that return true if bulk discount is enabled on products. cdn_url: type: string + channels: + type: array + description: Array of objects that contain storefront channel information. + items: + type: object + properties: + id: + type: integer + description: Channel ID. + name: + type: string + description: The label for the storefront channel that appears on the storefront. + code: + type: string + description: A unique alphanumeric code used to identify the storefront channel. + is_active: + type: boolean + description: Indicates whether the status of the storefront channel is active. + switch_url: + type: string + description: Site URL for the storefront channel. client_ip_address: type: string description: IP address of the customer browsing the storefront. From 17bf38b9fe8a70b8e3f96ec43329aef6c9e7f8e1 Mon Sep 17 00:00:00 2001 From: Ivan Shcherbak <funivan@users.noreply.github.com> Date: Mon, 3 Jun 2024 20:46:00 +0300 Subject: [PATCH 042/221] Fix response code for createShippingZones operation (#296) ## What changed? Change response code ![image](https://github.com/bigcommerce/docs/assets/425208/d4b71d0d-2453-4494-b52c-2683d2fb79e5) ## Release notes draft Fixed a bug in the /v2/shipping/zones. Now the response code is 201 instead of 200. ## Anything else? - --- reference/shipping.v2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/shipping.v2.yml b/reference/shipping.v2.yml index 45277dc23..5e7c2eeff 100644 --- a/reference/shipping.v2.yml +++ b/reference/shipping.v2.yml @@ -305,7 +305,7 @@ paths: name: Global type: global responses: - '200': + '201': description: '' content: application/json: From 82a5e0a6910d406c918ab739be630984d1921b4f Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Tue, 4 Jun 2024 15:49:45 +0200 Subject: [PATCH 043/221] CATALOG-9785: [update] Catalog, Category, Category Trees (#303) # [CATALOG-9785] ## What changed? * Update swagger file for Categories, Category Trees ## Release notes draft * Update swagger file for Categories, Category Trees ping @NataliiaNefodova [CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/categories_catalog.v3.yml | 15 -- .../catalog/category-trees_catalog.v3.yml | 172 ++++++++++++++---- 2 files changed, 135 insertions(+), 52 deletions(-) diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 8425e4379..4eafe42e4 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -2439,21 +2439,6 @@ components: example: 0 title: Collection Meta x-internal: false - Total: - type: integer - description: | - Total number of items in the result set. - example: 3 - Success: - type: integer - description: | - Total number of items that were successfully deleted. - example: 1 - Failed: - type: integer - description: | - Total number of items that failed to be deleted. - example: 2 Error: type: object description: | diff --git a/reference/catalog/category-trees_catalog.v3.yml b/reference/catalog/category-trees_catalog.v3.yml index a9f0261a1..5163e70ff 100644 --- a/reference/catalog/category-trees_catalog.v3.yml +++ b/reference/catalog/category-trees_catalog.v3.yml @@ -55,12 +55,12 @@ paths: - Categories parameters: - $ref: '#/components/parameters/CategoryUuidInParam' - - $ref: '#/components/parameters/CategoryIdInParam' - - $ref: '#/components/parameters/TreeIdInParam' - - $ref: '#/components/parameters/ParentIdInParam' - $ref: '#/components/parameters/CategoryUuidNotInParam' + - $ref: '#/components/parameters/CategoryIdInParam' - $ref: '#/components/parameters/CategoryIdNotInParam' + - $ref: '#/components/parameters/TreeIdInParam' - $ref: '#/components/parameters/TreeIdNotInParam' + - $ref: '#/components/parameters/ParentIdInParam' - $ref: '#/components/parameters/ParentIdNotInParam' - $ref: '#/components/parameters/PageTitleParam' - $ref: '#/components/parameters/PageTitleLikeParam' @@ -115,17 +115,13 @@ paths: current: '?limit=5&page=2' next: '?limit=5&page=3' '400': - description: Bad Request - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRequest' - '500': - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRequest' + $ref: '#/components/responses/BadRequestError' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' + '422': + $ref: '#/components/responses/GeneralErrorWithErrors' operationId: getAllCategories post: summary: Create Categories @@ -194,18 +190,16 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorRequest' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' '422': description: 'The Category was not valid. This is the result of missing required fields, or of invalid data. See the response for more details.' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' - '500': - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRequest' operationId: createCategories put: summary: Update Categories @@ -242,18 +236,16 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorRequest' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' '422': description: 'The Category was not valid. This is the result of missing required fields, or of invalid data. See the response for more details.' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' - '500': - description: Internal Server Error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRequest' operationId: updateCategories delete: summary: Delete categories @@ -269,7 +261,7 @@ paths: - $ref: '#/components/parameters/TreeIdInParam' - $ref: '#/components/parameters/ParentIdInParam' responses: - '204': + '202': description: Categories are deleted content: application/json: @@ -281,12 +273,12 @@ paths: application/json: schema: $ref: '#/components/schemas/ErrorRequest' - '500': - description: Server error - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRequest' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' + '422': + $ref: '#/components/responses/GeneralErrorWithErrors' operationId: deleteTreeCategories parameters: - $ref: '#/components/parameters/Accept' @@ -321,6 +313,12 @@ paths: links: next: '?limit=5&page=2' current: '?limit=5&page=1' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' + '422': + $ref: '#/components/responses/GeneralErrorWithErrors' tags: - Category trees put: @@ -355,6 +353,10 @@ paths: channels: - 0 meta: {} + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' '422': description: The Channel was not valid. See the response for more details. content: @@ -381,6 +383,12 @@ paths: responses: '204': description: Deleted + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' + '422': + $ref: '#/components/responses/GeneralErrorWithErrors' tags: - Category trees parameters: @@ -418,6 +426,10 @@ paths: type: object properties: {} description: Empty meta object; reserved for use later. + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/GeneralError' '404': description: The tree was not found. content: @@ -882,9 +894,7 @@ components: url: title: URL description: | - The custom URL for the category trees on the storefront. If not provided in a POST request body, the URL is autogenerated from the category name. - minLength: 1 - maxLength: 255 + If not provided in POST request, the URL is autogenerated from the category name. type: object properties: path: @@ -926,8 +936,96 @@ components: minLength: 1 type: string description: |- - The name displayed for the category tree. The name must be unique with respect to the category tree of siblings on the same level (you can duplicate the name for other siblings on another level). Required in a POST. + The name displayed for the category. Name is unique with respect to the categoryʼs siblings. + Required in a POST. example: Bath + NotFoundError: + required: + - status + - title + - type + title: Not Found + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + GeneralError: + required: + - status + - title + - type + title: '' + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describes the particular error. + type: + type: string + code: + type: integer + description: The custom code of the error. + GeneralErrorWithErrors: + required: + - status + - title + - type + - errors + title: '' + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + errors: + title: Detailed Errors + type: object + properties: { } + additionalProperties: true + responses: + UnauthorizedError: + description: Unauthorized + content: + plain/text: + schema: + type: string + BadRequestError: + description: Bad Request + content: + plain/text: + schema: + type: string + GeneralError: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + GeneralErrorWithErrors: + description: '' + content: + application/json: + schema: + type: object + properties: + errors: + $ref: '#/components/schemas/GeneralErrorWithErrors' + meta: + $ref: '#/components/schemas/MetaData' parameters: Accept: name: Accept From bb114961352d5b8941870224211737e84df7d9d2 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 4 Jun 2024 10:40:01 -0500 Subject: [PATCH 044/221] Devdocs-5642 [update] Pages V3 (#307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5642] ## What changed? Updated the order and added titles for schemas ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5642]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5642?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/pages.v3.yml | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/reference/pages.v3.yml b/reference/pages.v3.yml index 435b7e022..2c73e3da3 100644 --- a/reference/pages.v3.yml +++ b/reference/pages.v3.yml @@ -87,14 +87,16 @@ paths: application/json: schema: oneOf: - - anyOf: + - title: "Create single page using object" + anyOf: - $ref: '#/components/schemas/typePage' - $ref: '#/components/schemas/typeBlog' - $ref: '#/components/schemas/typeContactForm' - $ref: '#/components/schemas/typeFeed' - $ref: '#/components/schemas/typeRaw' - $ref: '#/components/schemas/typeLink' - - type: array + - title: "Create multiple pages using array" + type: array items: anyOf: - $ref: '#/components/schemas/typePage' @@ -227,7 +229,7 @@ paths: schema: $ref: '#/components/schemas/ResponseErrorBrief' examples: - example-1: + Not Found: value: status: 0 title: string @@ -741,7 +743,7 @@ components: description: | Response payload for the BigCommerce API. type: object - title: '' + title: 'Body' properties: data: type: array @@ -775,6 +777,12 @@ components: type: object description: Properties of the page modification request body. properties: + channel_id: + type: integer + description: | + The ID of the channel where this page should be shown. + example: 12 + default: 1 name: type: string description: | @@ -812,6 +820,12 @@ components: - feed - link - blog + body: + type: string + description: | + HTML or variable that populates the element of this page, in default/desktop view. Required in a `POST` request if the page type is `raw`. + example: <div>Hello World!</div> + nullable: true is_homepage: type: boolean description: | @@ -827,12 +841,6 @@ components: meta_title: type: string nullable: true - body: - type: string - description: | - HTML or variable that populates the element of this page, in default/desktop view. Required in a `POST` request if the page type is `raw`. - example: <div>Hello World!</div> - nullable: true feed: type: string description: | @@ -876,12 +884,6 @@ components: description: | Relative URL on the storefront for this page. example: /my-store-page - channel_id: - type: integer - description: | - The ID of the channel where this page should be shown. - example: 12 - default: 1 PagePutBulk: allOf: - type: object @@ -959,6 +961,7 @@ components: typePage: description: | `type: page`. A user-defined plain-text page. + title: page allOf: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' @@ -966,6 +969,7 @@ components: typeBlog: description: |- A page that contains blog posts. Use caution; `blog`-type pages can only be created in the store control panel, but you may be able to change the type of a blog page to something else with this API. Use the [blog feature of the REST Content API](/docs/rest-content/store-content/blog-posts#create-a-blog-post) to work with blog posts and tags. + title: blog allOf: - readOnly: true - $ref: '#/components/schemas/anyTypePage' @@ -981,6 +985,7 @@ components: typeContactForm: description: |- `type: contact_form`. A user-customizable page that contains a contact form. Body content returns HTML. + title: contact form allOf: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' @@ -1007,6 +1012,7 @@ components: typeFeed: description: |- `type: feed`. Makes RSS-syndicated content feeds available in the menu of other pages that contain markup. No page body. + title: feed allOf: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/pageMeta' @@ -1022,6 +1028,7 @@ components: typeRaw: description: |- `type: raw`. A user-defined page with a body that contains HTML markup or other stringified code. + title: raw allOf: - $ref: '#/components/schemas/anyTypePage' - $ref: '#/components/schemas/searchKeywords' @@ -1042,6 +1049,7 @@ components: typeLink: description: |- `type: link`. A link to an external absolute URL. Displays in the menu of other pages that contain markup. Does not contain a body. + title: link allOf: - $ref: '#/components/schemas/anyTypePage' - type: object From 64a68e026af908687df5343240d7d6a9097857b7 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 5 Jun 2024 10:25:22 -0500 Subject: [PATCH 045/221] Revert "DEVDOCS-5911 [new]: MSF / Stencil, add channels object to themes" (#317) Reverts bigcommerce/docs#301 --- models/_root/settings.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/models/_root/settings.yml b/models/_root/settings.yml index 5c320f49f..ff4f4849d 100644 --- a/models/_root/settings.yml +++ b/models/_root/settings.yml @@ -40,27 +40,6 @@ properties: description: Boolean that return true if bulk discount is enabled on products. cdn_url: type: string - channels: - type: array - description: Array of objects that contain storefront channel information. - items: - type: object - properties: - id: - type: integer - description: Channel ID. - name: - type: string - description: The label for the storefront channel that appears on the storefront. - code: - type: string - description: A unique alphanumeric code used to identify the storefront channel. - is_active: - type: boolean - description: Indicates whether the status of the storefront channel is active. - switch_url: - type: string - description: Site URL for the storefront channel. client_ip_address: type: string description: IP address of the customer browsing the storefront. From ed92e74350d1dc1e80b4b520505e109f221fb9a3 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 5 Jun 2024 13:57:39 -0500 Subject: [PATCH 046/221] DEVDOCS-5818: update refs (#316) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5818] ## What changed? Add in refs for the price object ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5818]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5818?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Sarah Riehl <sarah.riehl@bigcommerce.com> --- models/_root/price.yml | 6 +- models/blog/posts.yml | 2 +- models/cart/cartItems.yml | 4 +- models/common/price.yml | 2 +- models/common/product.yml | 6 +- models/customer/orders.yml | 5 +- models/product/price.yml | 20 +- models/product/related_products.yml | 2 +- models/theme_objects/_all.yml | 338 ++++++++-------------------- models/webhooks/_all.yml | 152 ++++++------- 10 files changed, 200 insertions(+), 337 deletions(-) diff --git a/models/_root/price.yml b/models/_root/price.yml index 828e5137e..32ec63e6e 100644 --- a/models/_root/price.yml +++ b/models/_root/price.yml @@ -12,8 +12,10 @@ allOf: price_range: type: object properties: - max: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml - min: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + max: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + min: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml rrp_without_tax: $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml sale_price_without_tax: diff --git a/models/blog/posts.yml b/models/blog/posts.yml index ea426d250..e93b3efd7 100644 --- a/models/blog/posts.yml +++ b/models/blog/posts.yml @@ -29,7 +29,7 @@ items: type: string description: URL for the tag. thumbnail: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml title: type: string description: Title of the blog post. diff --git a/models/cart/cartItems.yml b/models/cart/cartItems.yml index 1f416ff06..1e347b800 100644 --- a/models/cart/cartItems.yml +++ b/models/cart/cartItems.yml @@ -15,6 +15,7 @@ items: type: array items: type: object + properties: {} custom_fields: type: array items: @@ -29,7 +30,7 @@ items: id: type: string image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml max_purchase_quantity: type: 'null' min_purchase_quantity: @@ -40,6 +41,7 @@ items: type: array items: type: object + properties: {} price: type: object properties: diff --git a/models/common/price.yml b/models/common/price.yml index 4f71f03d5..30b0e9c82 100644 --- a/models/common/price.yml +++ b/models/common/price.yml @@ -5,4 +5,4 @@ properties: type: string description: Tax label (VAT, sales tax, etc.) displayed to customers. without_tax: - $ref: ./amount.yml \ No newline at end of file + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml diff --git a/models/common/product.yml b/models/common/product.yml index 0e25909fe..194a83de6 100644 --- a/models/common/product.yml +++ b/models/common/product.yml @@ -31,11 +31,11 @@ properties: id: type: integer image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml images: type: array items: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml low_stock_level: type: 'null' description: |- @@ -47,7 +47,7 @@ properties: pre_order: type: boolean price: - $ref: ./price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml qty_in_cart: type: integer rating: diff --git a/models/customer/orders.yml b/models/customer/orders.yml index 9cfdd981d..7df9ea900 100644 --- a/models/customer/orders.yml +++ b/models/customer/orders.yml @@ -9,7 +9,7 @@ items: id: type: string image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml items: type: array items: @@ -18,13 +18,14 @@ items: expected_release_date: type: string image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml name: type: string options: type: array items: type: object + properties: {} quantity: type: string refunded: diff --git a/models/product/price.yml b/models/product/price.yml index c3df15fb0..bfc5573ee 100644 --- a/models/product/price.yml +++ b/models/product/price.yml @@ -4,20 +4,22 @@ allOf: description: 'product.price and products[*].price object available to various product templates and components.' properties: non_sale_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml map_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml map_price_with_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml price_range: type: object properties: - max: ../common/price.yml - min: ../common/price.yml + max: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + min: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml rrp_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml sale_price_without_tax: - $ref: ../common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml saved: - $ref: ../common/amount.yml - - $ref: ../common/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml diff --git a/models/product/related_products.yml b/models/product/related_products.yml index 5ffd7f74d..212ba1c5f 100644 --- a/models/product/related_products.yml +++ b/models/product/related_products.yml @@ -33,7 +33,7 @@ items: id: type: integer image: - $ref: ../common/image.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml images: type: array items: diff --git a/models/theme_objects/_all.yml b/models/theme_objects/_all.yml index 948be190b..1695f0b70 100644 --- a/models/theme_objects/_all.yml +++ b/models/theme_objects/_all.yml @@ -1,242 +1,98 @@ title: _all.yml -type: Theme Objects -properties: - banners: - description: - allOf: - -$ref: ./banners.yml - type: object - blog: - description: - allOf: - -$ref: ./blog.yml - type: object - brand_results: - description: - allOf: - -$ref: ./brand_results.yaml - type: object - brand: - description: - allOf: - -$ref: ./brand.yml - type: object - brands: - description: - allOf: - -$ref: ./brands.yml - type: object - breadcrumbs: - description: - allOf: - -$ref: ./breadcrumbs.yml - type: object - carousel: - description: - allOf: - -$ref: ./carousel.yml - type: object - cart_id: - description: - allOf: - -$ref: ./cart_id.yml - type: object - cart: - description: - allOf: - -$ref: ./cart.yml - type: object - categories: - description: - allOf: - -$ref: ./categories.yml - type: object - category_results: - description: - allOf: - -$ref: ./category_results.yml - type: object - category: - description: - allOf: - -$ref: ./category.yml - type: object - checkout: - description: - allOf: - -$ref: ./checkout.yml - type: object - comparisons: - description: - allOf: - -$ref: ./comparisons.yml - type: object - content_results: - description: - allOf: - -$ref: ./content_results.yaml - type: object - countries: - description: - allOf: - -$ref: ./countries.yml - type: object - create_account: - description: - allOf: - -$ref: ./create_account.yml - type: object - currency_selector: - description: - allOf: - -$ref: ./currency_selector.yml - type: object - customer_group_id: - description: - allOf: - -$ref: ./customer_group_id.yml - type: object - customer_group_name: - description: - allOf: - -$ref: ./customer_group_name.yml - type: object - customer: - description: - allOf: - -$ref: ./customer.yml - type: object - downloads: - description: - allOf: - -$ref: ./downloads.yml - type: object - faceted_search: - description: - allOf: - -$ref: ./faceted_search.yml - type: object - footer: - description: - allOf: - -$ref: ./footer.yml - type: object - forms_contact: - description: - allOf: - -$ref: ./forms_contaact.yaml - type: object - forms: - description: - allOf: - -$ref: ./forms.yml - type: object - head: - description: - allOf: - -$ref: ./head.yml - type: object - is_ajax: - description: - allOf: - -$ref: ./is_ajax.yml - type: object - order: - description: - allOf: - -$ref: ./order.yml - type: object - page_type: - description: - allOf: - -$ref: ./page_type.yml - type: object - page: - description: - allOf: - -$ref: ./page.yml - type: object - pages: - description: - allOf: - -$ref: ./pages.yml - type: object - pagination: - description: - allOf: - -$ref: ./pagination.yml - type: object - price: - description: - allOf: - -$ref: ./price.yml - product_results: - description: - allOf: - -$ref: ./product_results.yaml - type: object - product: - description: - allOf: - -$ref: ./product.yml - type: object - products: - description: - allOf: - -$ref: ./products.yml - type: object - settings: - description: - allOf: - -$ref: ./settings.yml - type: object - shipments: - description: - allOf: - -$ref: ./shipments.yml - type: object - shipping_messages: - description: - allOf: - -$ref: ./shipping_messages.yml - type: object - shop_by_brand: - description: - allOf: - -$ref: ./shop_by_brand.yml - type: object - sitemap: - description: - allOf: - -$ref: ./sitemap.yml - type: object - social_media: - description: - allOf: - -$ref: ./social_media.yml - type: object - template_file: - description: - allOf: - -$ref: ./template_file.yml - type: object - template_settings: - description: - allOf: - -$ref: ./template_settings.yml - type: object - urls: - description: - allOf: - -$ref: ./urls.yml - type: object - vault: - description: - allOf: - -$ref: ./vault.yml - type: object - wishlist: - description: - allOf: - -$ref: ./wishlist.yml - type: object +description: Theme objects +banners: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/banners.yml +blog: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/blog.yml +brand_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brand_results.yaml +brand: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brand.yml +brands: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brands.yml +breadcrumbs: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/breadcrumbs.yml +carousel: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/carousel.yml +cart_id: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/cart_id.yml +cart: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/cart.yml +categories: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/categories.yml +category_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/category_results.yaml +category: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/category.yml +checkout: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/checkout.yml +comparisons: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/comparisons.yml +content_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/content_results.yaml +countries: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/countries.yml +create_account: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/create_account.yml +currency_selector: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/currency_selector.yml +customer_group_id: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer_group_id.yml +customer_group_name: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer_group_name.yml +customer: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer.yml +downloads: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/downloads.yml +faceted_search: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/faceted_search.yml +footer: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/footer.yml +forms_contact: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/forms_contact.yaml +forms: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/forms.yml +head: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/head.yml +is_ajax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/is_ajax.yml +order: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/order.yml +page_type: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/page_type.yml +page: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/page.yml +pages: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/pages.yml +pagination: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/pagination.yml +price: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/price.yml +product_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/product_results.yaml +product: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/product.yml +products: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/products.yml +settings: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/settings.yml +shipments: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shipments.yml +shipping_messages: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shipping_messages.yml +shop_by_brand: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shop_by_brand.yml +sitemap: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/sitemap.yml +social_media: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/social_media.yml +template_file: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/template_file.yml +template_settings: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/theme_settings.yml +urls: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/urls.yml +vault: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/vault.yml +wishlist: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/wishlist.yml diff --git a/models/webhooks/_all.yml b/models/webhooks/_all.yml index c9bd51905..480de3df7 100644 --- a/models/webhooks/_all.yml +++ b/models/webhooks/_all.yml @@ -7,43 +7,43 @@ properties: type: object properties: allOf: - - $ref: ./store_app_uninstalled.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_app_uninstalled.yml store/brand/metafield/created: description: Fires when a new brand metafield is created. type: object properties: allOf: - - $ref: ./store_brand_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_created.yml store/brand/metafield/deleted: description: Fires when a brand metafield is deleted. type: object properties: allOf: - - $ref: ./store_brand_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_deleted.yml store/brand/metafield/updated: description: Fires when a brand metafield is modified. type: object properties: allOf: - - $ref: ./store_brand_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_updated.yml store/cart/abandoned: description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. type: object properties: allOf: - - $ref: ./store_cart_abandoned.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_abandoned.yml store/cart/converted: description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. type: object properties: allOf: - - $ref: ./store_cart_converted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_converted.yml store/cart/couponApplied: description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. type: object properties: allOf: - - $ref: ./store_cart_couponApplied.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_couponApplied.yml store/cart/created: description: |- Fires when a new cart is created, which happens with the following two events: @@ -55,7 +55,7 @@ properties: type: object properties: allOf: - - $ref: ./store_cart_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_created.yml store/cart/deleted: description: |- Fires when a cart is deleted. This ends the lifecycle of the cart. Events include the following: @@ -67,43 +67,43 @@ properties: type: object properties: allOf: - - $ref: ./store_cart_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_deleted.yml store/cart/lineItem/created: description: Fires when a new item is added to a cart. type: object properties: allOf: - - $ref: ./store_cart_lineItem_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_created.yml store/cart/lineItem/deleted: description: Fires when an item is deleted from a cart. type: object properties: allOf: - - $ref: ./store_cart_lineItem_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_deleted.yml store/cart/lineItem/updated: description: Fires when a line item’s quantity or product options change. type: object properties: allOf: - - $ref: ./store_cart_lineItem_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_updated.yml store/cart/metafield/created: description: Fires when a new cart metafield is created. type: object properties: allOf: - - $ref: ./store_cart_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_created.yml store/cart/metafield/deleted: description: Fires when a cart metafield is deleted. type: object properties: allOf: - - $ref: ./store_cart_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_deleted.yml store/cart/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object properties: allOf: - - $ref: ./store_cart_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_updated.yml store/cart/updated: description: |- Fires when a cart is modified, including in the following cases: @@ -119,249 +119,249 @@ properties: type: object properties: allOf: - - $ref: ./store_cart_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_updated.yml store/category/created: description: Fires when a new category is created. type: object properties: allOf: - - $ref: ./store_category_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_created.yml store/category/deleted: description: Fires when a category is deleted. type: object properties: allOf: - - $ref: ./store_category_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_deleted.yml store/category/updated: description: Fires when a category is updated. type: object properties: allOf: - - $ref: ./store_category_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_updated.yml store/category/metafield/created: description: Fires when a new cart metafield is created. type: object properties: allOf: - - $ref: ./store_category_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_created.yml store/category/metafield/deleted: description: Fires when a cart metafield is deleted. type: object properties: allOf: - - $ref: ./store_category_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_deleted.yml store/category/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object properties: allOf: - - $ref: ./store_category_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_updated.yml store/channel/metafield/created: description: Fires when a metafield is created per a specified channel. type: object properties: allOf: - - $ref: ./store_channel_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_created.yml store/channel/metafield/deleted: description: Fires when a metafield is deleted per a specified channel. type: object properties: allOf: - - $ref: ./store_channel_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_deleted.yml store/channel/metafield/updated: description: Fires when a cart metafield is modified through the changes in its line items. type: object properties: allOf: - - $ref: ./store_channel_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_updated.yml store/customer/address/created: description: Fires when a customer address is created. type: object properties: allOf: - - $ref: ./store_customer_address_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_created.yml store/customer/address/deleted: description: Fires when a customer address is deleted. type: object properties: allOf: - - $ref: ./store_customer_address_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_deleted.yml store/customer/address/updated: description: Fires when a customer address is updated. type: object properties: allOf: - - $ref: ./store_customer_address_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_updated.yml store/customer/created: description: Fires when a new customer is created. type: object properties: allOf: - - $ref: ./store_customer_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_created.yml store/customer/deleted: description: Fires when a customer is deleted. type: object properties: allOf: - - $ref: ./store_customer_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_deleted.yml store/customer/payment/instrument/default/updated: description: Fires when a customerʼs default payment instrument is updated. type: object properties: allOf: - - $ref: ./store_customer_payment_instrument_default_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_payment_instrument_default_updated.yml store/customer/updated: description: Fires when a customer is updated. It does not currently track changes to the customer address. <br /><br />Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. type: object properties: allOf: - - $ref: ./store_customer_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_updated.yml store/information/updated: description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. type: object properties: allOf: - - $ref: ./store_information_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_information_updated.yml store/inventory/location/created: description: Fires when a location is created. type: object properties: allOf: - - $ref: ./store_inventory_location_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_created.yml store/inventory/location/updated: description: Fires when a location is updated. type: object properties: allOf: - - $ref: ./store_inventory_location_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_updated.yml store/inventory/location/metafield/created: description: Fires when a new inventory location metafield is created. type: object properties: allOf: - - $ref: ./store_inventory_location_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_created.yml store/inventory/location/metafield/deleted: description: Fires when an inventory location metafield is deleted. type: object properties: allOf: - - $ref: ./store_inventory_location_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_deleted.yml store/inventory/location/metafield/updated: description: Fires when an existing inventory location metafield is updated. type: object properties: allOf: - - $ref: ./store_inventory_location_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_updated.yml store/metafield/created: description: Fires whenever a new metafield on any object is created. type: object properties: allOf: - - $ref: ./store_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_created.yml store/metafield/deleted: description: Fires whenever a metafield is deleted. type: object properties: allOf: - - $ref: ./store_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_deleted.yml store/metafield/updated: description: Fires when an already created metafield is updated. Any changes to an existing metafield on any object (such as inventory, carts, brands, categories, channels, orders, ShipperHQ, etc.) will fire this webhook. type: object properties: allOf: - - $ref: ./store_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_updated.yml store/modifier/updated: description: Fires when product modifier overrides are edited. type: object properties: allOf: - - $ref: ./store_modifier_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_modifier_updated.yml store/option/updated: description: Fires when product options overrides are edited. type: object properties: allOf: - - $ref: ./store_option_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_option_updated.yml store/order/archived: description: Fires when an order is archived. type: object properties: allOf: - - $ref: ./store_order_archived.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_archived.yml store/order/created: description: Fires when an order is created either in the control panel or by API. type: object properties: allOf: - - $ref: ./store_order_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_created.yml store/order/message/created: description: Fires when an order message is created by a customer or using the control panel. type: object properties: allOf: - - $ref: ./store_order_message_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_message_created.yml store/order/metafield/created: description: Fires if an order metafield is created using the control panel, an app, or the API. type: object properties: allOf: - - $ref: ./store_order_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_created.yml store/order/metafield/deleted: description: Fires when an order metafield is deleted. type: object properties: allOf: - - $ref: ./store_order_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_deleted.yml store/order/metafield/updated: description: Fires when an existing order metafield is updated. Any changes to an existing order metafield will fire this webhook. type: object properties: allOf: - - $ref: ./store_order_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_updated.yml store/order/refund/created: description: Fires when a refund is submitted against an order. type: object properties: allOf: - - $ref: ./store_order_refund_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_refund_created.yml store/order/statusUpdated: description: Fires when the order status has changed, such as from Pending to Awaiting Payment. type: object properties: allOf: - - $ref: ./store_order_statusUpdated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_statusUpdated.yml store/order/transaction/created: description: Fires when an order transaction is created. type: object properties: allOf: - - $ref: ./store_order_transaction_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_transaction_created.yml store/order/transaction/updated: description: Fires when an order transaction is changed. type: object properties: allOf: - - $ref: ./store_order_transaction_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_transaction_updated.yml store/order/updated: description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. type: object properties: allOf: - - $ref: ./store_order_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_updated.yml store/product/created: description: Fires when new product is created. type: object properties: allOf: - - $ref: ./store_product_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_created.yml store/product/deleted: description: Fires when a product is deleted. type: object properties: allOf: - - $ref: ./store_product_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_deleted.yml store/product/inventory/order/updated: description: |- Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. @@ -370,7 +370,7 @@ properties: type: object properties: allOf: - - $ref: ./store_product_inventory_order_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_inventory_order_updated.yml store/product/inventory/updated: description: |- Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. @@ -381,79 +381,79 @@ properties: type: object properties: allOf: - - $ref: ./store_product_inventory_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_inventory_updated.yml store/product/metafield/created: description: Fires when a new product metafield is created. type: object properties: allOf: - - $ref: ./store_product_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_created.yml store/product/metafield/deleted: description: Fires when a product metafield is deleted. type: object properties: allOf: - - $ref: ./store_product_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_deleted.yml store/product/metafield/updated: description: Fires when product metafield details are edited. type: object properties: allOf: - - $ref: ./store_product_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_updated.yml store/product/updated: description: Fires when product details are edited. `attributes` and `context` fields are present for only override updates. For a full list of product fields that trigger an updated event, see the product updated events that follow. type: object properties: allOf: - - $ref: ./store_product_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_updated.yml store/product/variant/metafield/created: description: Fires when a new product variant metafield is created. type: object properties: allOf: - - $ref: ./store_variant_metafield_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_created.yml store/product/variant/metafield/deleted: description: Fires when a product variant metafield is deleted.. type: object properties: allOf: - - $ref: ./store_variant_metafield_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_deleted.yml store/product/variant/metafield/updated: description: Fires when product variant metafield details are edited. type: object properties: allOf: - - $ref: ./store_variant_metafield_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_updated.yml store/shipment/created: description: Fires when a shipment is created. type: object properties: allOf: - - $ref: ./store_shipment_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_created.yml store/shipment/deleted: description: Fires when a shipment is deleted. type: object properties: allOf: - - $ref: ./store_shipment_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_deleted.yml store/shipment/updated: description: Fires when a shipment is updated. type: object properties: allOf: - - $ref: ./store_shipment_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_updated.yml store/sku/created: description: Fires when a new SKU is created. type: object properties: allOf: - - $ref: ./store_sku_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_created.yml store/sku/deleted: description: Fires when a SKU is deleted. type: object properties: allOf: - - $ref: ./store_sku_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_deleted.yml store/sku/inventory/order/updated: description: |- Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. @@ -462,7 +462,7 @@ properties: type: object properties: allOf: - - $ref: ./store_sku_inventory_order_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_inventory_order_updated.yml store/sku/inventory/updated: description: |- Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. @@ -473,28 +473,28 @@ properties: type: object properties: allOf: - - $ref: ./store_sku_inventory_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_inventory_updated.yml store/sku/updated: description: Fires when a SKU is updated. type: object properties: allOf: - - $ref: ./store_sku_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_updated.yml store/subscriber/created: description: Fires when a subscriber is created. type: object properties: allOf: - - $ref: ./store_subscriber_created.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_created.yml store/subscriber/deleted: description: Fires when a subscriber is deleted. type: object properties: allOf: - - $ref: ./store_subscriber_deleted.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_deleted.yml store/subscriber/updated: description: Fires when a subscriber is updated. type: object properties: allOf: - - $ref: ./store_subscriber_updated.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_updated.yml From 1720e79224a1599dcfaa5c3ee6b8e04b9bc84274 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Wed, 5 Jun 2024 15:21:38 -0700 Subject: [PATCH 047/221] (no ticket): [links] Users, update links (#319) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # (no ticket): [links] Users, update links ## What changed? <!-- Provide a bulleted list in the present tense --> * update the links to the users overview ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * no release notes for a minor link change ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> * depends on [DC PR](https://github.com/bigcommerce/developer-center/pull/917) ping {names} --- docs/api-docs/channels/channel-webhooks.mdx | 2 +- .../customers/channel-specific-customers.mdx | 10 ++++----- .../api-docs/customers/customer-login-api.mdx | 2 +- .../customers-subscribers-overview.mdx | 10 ++++----- .../getting-started/about-our-api.mdx | 2 +- .../rest-api-authentication.mdx | 22 +++++++++---------- .../product-filtering-toolkit.mdx | 3 ++- .../transitioning-to-stencil.mdx | 2 +- .../theme-accessibility.mdx | 4 ++-- reference/checkouts.sf.yml | 2 +- reference/tax_classes.v2.yml | 2 +- 11 files changed, 31 insertions(+), 30 deletions(-) diff --git a/docs/api-docs/channels/channel-webhooks.mdx b/docs/api-docs/channels/channel-webhooks.mdx index cdc585b95..8d51ba458 100644 --- a/docs/api-docs/channels/channel-webhooks.mdx +++ b/docs/api-docs/channels/channel-webhooks.mdx @@ -469,7 +469,7 @@ The following settings webhook events fire in response to actions that affect a | `store/channel/{channel_id}/settings/security/updated` | Fires when security settings that affect the specified channel are updated. | [Update storefront security settings](/docs/rest-management/settings/storefront-security#update-storefront-security-settings) | | `store/channel/{channel_id}/settings/searchContextFilters/updated` | Fires when search context filters that affect the specified channel are updated. | [Upsert Contextual Filters](/docs/rest-management/settings/search-filters#upsert-contextual-filters) | | `store/channel/{channel_id}/settings/defaultCustomerGroup/updated` | Fires when the default customer group associated with the specified channel is updated. | [Update a customer group](/docs/rest-management/customers-v2/customer-groups#update-a-customer-group) | -| `store/channel/{channel_id}/settings/customerPrivacy/updated` | Fires when customer privacy settings that affect the specified channel are updated. | [Update customer settings per channel](/docs/rest-management/customers/customer-settings-channel#update-customer-settings-per-channel) | +| `store/channel/{channel_id}/settings/customerPrivacy/updated` | Fires when customer privacy settings that affect the specified channel are updated. | [Update customer settings per channel](/docs/rest-management/customers/channel-settings#update-customer-settings-per-channel) | Settings payload objects take the form that follows: diff --git a/docs/api-docs/customers/channel-specific-customers.mdx b/docs/api-docs/customers/channel-specific-customers.mdx index ca72d7fa2..a61406c8f 100644 --- a/docs/api-docs/customers/channel-specific-customers.mdx +++ b/docs/api-docs/customers/channel-specific-customers.mdx @@ -88,18 +88,18 @@ Now that you know how to check whether one of your channels allows for global lo Taking the `channel_id` of the channel you would like to update, send a `PUT` request to `/v3/customer/settings/channels/{channel_id}` and update the value of `allow_global_logins` to either `true` or `false`. The following is an example request: -```json showLineNumbers copy +```http showLineNumbers copy PUT https://api.bigcommerce.com/stores/{store-hash}/v3/customers/settings/channels/{channel_id} Content-Type: application/json +Accept: application/json X-Auth-Token: {{X-Auth-Token}} -Body: - { +{ "allow_global_logins": false - } +} ``` -For more information on this step, see [Update the customer settings per channel](/docs/rest-management/customers/customer-settings-channel#update-customer-settings-per-channel). +For more information on this step, see [Update the customer settings per channel](/docs/rest-management/customers/channel-settings#update-customer-settings-per-channel). ### Customers access guide diff --git a/docs/api-docs/customers/customer-login-api.mdx b/docs/api-docs/customers/customer-login-api.mdx index 812e8c99e..061f1d02f 100644 --- a/docs/api-docs/customers/customer-login-api.mdx +++ b/docs/api-docs/customers/customer-login-api.mdx @@ -10,7 +10,7 @@ keywords: login, log in, sign in, sign-in, headless, embedded, checkouts In this tutorial, you will learn how to enable single sign-on for storefront customers using the Customer Login API and JSON Web Tokens. <Callout type="info"> -You can also use the [GraphQL Storefront API](/docs/start/authenication/graphql-storefront#customer-login) to authorize your application to work with customer-specific storefront data. +You can also use the [GraphQL Storefront API](/docs/start/authentication/graphql-storefront#customer-login) to authorize your application to work with customer-specific storefront data. </Callout> ## Overview diff --git a/docs/api-docs/customers/customers-subscribers-overview.mdx b/docs/api-docs/customers/customers-subscribers-overview.mdx index 2491d40c3..8ed2d9800 100644 --- a/docs/api-docs/customers/customers-subscribers-overview.mdx +++ b/docs/api-docs/customers/customers-subscribers-overview.mdx @@ -15,7 +15,7 @@ For more information on available authentication methods, see [Authentication](/ A customer is anyone who purchases from a store and creates an account. BigCommerce stores an email address, customer address, and name in the customer object. -You can extend the data for customer records using [customer metafields](/docs/rest-management/customers/customer-batch-metafields), [custom account sign-up form fields](/docs/rest-management/customers/customer-form-field-values#get-customer-form-field-values), and [customer attributes](/docs/rest-management/customers/customer-attributes#get-all-customer-attributes) endpoints. +You can extend the data for customer records using [customer metafields](/docs/rest-management/customers/metafields-batch), [custom account sign-up form fields](/docs/rest-management/customers/form-field-values#get-customer-form-field-values), and [customer attributes](/docs/rest-management/customers/attributes#get-all-customer-attributes) endpoints. You can use the following APIs to work with customer data and authentication: @@ -89,7 +89,7 @@ Customer details include data preferences, attribute fields, form fields, and au The customer address book stores a collection of addresses entered by the customer. Add an address to capture the customer address details where you can ship orders if selected. -[Customer attributes](/docs/rest-management/customers/customer-attributes) and [Customer attribute values](/docs/rest-management/customers/customer-attribute-values) let you store additional information against a customer. Customer attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer attribute values endpoint lets you define the values for the attributes. +[Customer attributes](/docs/rest-management/customers/attributes) and [Customer attribute values](/docs/rest-management/customers/attribute-values) let you store additional information against a customer. Customer attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer attribute values endpoint lets you define the values for the attributes. <Callout type="info"> @@ -99,9 +99,9 @@ Each customer can have up to 50 name-value pairs stored. Customer attributes are created separately from the customer. After the name and type are created, then the attributes can be added to the customer using the name-value pair. -[Customer addresses](/docs/rest-management/customers/customer-addresses) consist of a customers address and phone number. Customers can have multiple addresses stored against them. +[Customer addresses](/docs/rest-management/customers/addresses) consist of a customers address and phone number. Customers can have multiple addresses stored against them. -[Customer form field values](/docs/rest-management/customers/customer-form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account sign up Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). +[Customer form field values](/docs/rest-management/customers/form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account sign up Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). You can access and edit the values for the fields on customer and customer address records using the API. @@ -184,7 +184,7 @@ Accept: application/json ### Upsert -You can use the V3 customers API [Upsert customer attribute values](/docs/rest-management/customers/customer-attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. +You can use the V3 customers API [Upsert customer attribute values](/docs/rest-management/customers/attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. ### Authentication object diff --git a/docs/api-docs/getting-started/about-our-api.mdx b/docs/api-docs/getting-started/about-our-api.mdx index cb0e096f9..71c13b0a9 100644 --- a/docs/api-docs/getting-started/about-our-api.mdx +++ b/docs/api-docs/getting-started/about-our-api.mdx @@ -61,7 +61,7 @@ Make BigCommerce API requests in the context of the **storefront**, BigCommerce | API or Use Case | Context | |:----------------|:--------| -| [GraphQL Account API](/docs/start/authentication#access-tokens), including [Users](/docs/graphql-account/users-overview) | server | +| [GraphQL Account API](/docs/start/authentication#access-tokens), including [Users](/docs/graphql-account/users) | server | | [GraphQL Admin API](/docs/start/authentication#access-tokens) | server | | [GraphQL Storefront API](/docs/start/authentication#bigcommerce-generated-jwts) | storefront | | [REST Management API](/docs/start/authentication#access-tokens) | server | diff --git a/docs/api-docs/getting-started/rest-api-authentication.mdx b/docs/api-docs/getting-started/rest-api-authentication.mdx index 1bee5487c..20c077399 100644 --- a/docs/api-docs/getting-started/rest-api-authentication.mdx +++ b/docs/api-docs/getting-started/rest-api-authentication.mdx @@ -93,7 +93,7 @@ To delete an app-level API account, consult our article on [Managing Apps in the ## Account-level API accounts -Account-level API accounts are designed to work with the GraphQL Account API, which manages resources beyond the scope of a single store. For example, [managing control panel users](/docs/graphql-account/users-overview) in the BigCommerce ecosystem. Current and future features available using the GraphQL Account API toolset allow developers to build custom integrations and solutions that require high-level access to store and platform resources. Using this API, you can integrate with third-party applications, streamline and automate business processes, and manage multiple merchant stores per account. +Account-level API accounts are designed to work with the GraphQL Account API, which manages resources beyond the scope of a single store. For example, [managing control panel users](/docs/graphql-account/users) in the BigCommerce ecosystem. Current and future features available using the GraphQL Account API toolset allow developers to build custom integrations and solutions that require high-level access to store and platform resources. Using this API, you can integrate with third-party applications, streamline and automate business processes, and manage multiple merchant stores per account. ### Creating account-level credentials @@ -122,7 +122,7 @@ Where both types of API account are supported, review the preceding sections to | API or Use Case | Store-level API account | App-level API account | Account-level API account | |:----------------|:-----------------------:|:---------------------:|:-------------------------:| -| [GraphQL Account API](/docs/start/authentication#access-tokens), including [Users](/docs/graphql-account/users-overview) | | | × | +| [GraphQL Account API](/docs/start/authentication#access-tokens), including [Users](/docs/graphql-account/users) | | | × | | [GraphQL Admin API](/docs/start/authentication#access-tokens) | × | × | | | [GraphQL Storefront API](/docs/start/authentication#bigcommerce-generated-jwts) | × | | | | [REST Store Management APIs](/docs/start/authentication#access-tokens) | × | × | | @@ -215,9 +215,9 @@ All OAuth scopes except `default` provide `read-only` permissions scopes so that | Information & Settings | read-only | `store_v2_information_read_only` | View general store information and settings | [Store Information V2](/docs/rest-management/store-information#get-store-information) <br />[Time V2](/docs/rest-management/store-information#get-system-timestamp) <br />[Settings V3](/docs/rest-management/settings)| | Marketing | modify | `store_v2_marketing` | View and modify marketing information | [Coupons V2](/docs/rest-content/marketing/coupons#get-all-coupons) <br />[Gift Certificates V2](/docs/rest-content/marketing/gift-certificates#get-all-gift-certificates) <br />[Banners V2](/docs/rest-content/marketing/banners#get-all-banners) <br />[Promotions V3](/beta/promotions/rest-management/coupon-codes-bulk)| | Marketing | read-only | `store_v2_marketing_read_only` | View marketing information | [Coupons V2](/docs/rest-content/marketing/coupons#get-all-coupons) <br />[Gift Certificates V2](/docs/rest-content/marketing/gift-certificates#get-all-gift-certificates) <br />[Banners V2](/docs/rest-content/marketing/banners#get-all-banners) | -| Metafield Ownership | manage | `store_metafield_change_owner` | Manage which API accounts own metafields. | [GraphQL Admin API](/docs/graphql-admin/reference) | -| Metafields Access | standard | `store_metafield_write` | Default. Create and manage metafields belonging to the API account making the request. | All endpoints and APIs that manage metafields, including the [GraphQL Admin API](/docs/graphql-admin/reference). | -| Metafields Access | full | `store_metafield_write_all` | Manage all metafields for the store, regardless of the API account that created them. Includes metafields that have `app_only` permissions. | All endpoints and APIs that manage metafields, including the [GraphQL Admin API](/docs/graphql-admin/reference). | +| Metafield Ownership | manage | `store_metafield_change_owner` | Manage which API accounts own metafields. | [GraphQL Admin API](/graphql-admin/reference) | +| Metafields Access | standard | `store_metafield_write` | Default. Create and manage metafields belonging to the API account making the request. | All endpoints and APIs that manage metafields, including the [GraphQL Admin API](/graphql-admin/reference). | +| Metafields Access | full | `store_metafield_write_all` | Manage all metafields for the store, regardless of the API account that created them. Includes metafields that have `app_only` permissions. | All endpoints and APIs that manage metafields, including the [GraphQL Admin API](/graphql-admin/reference). | | Orders | modify | `store_v2_orders` | View and modify orders | [Orders V2](/docs/rest-management/orders) <br />[Order Status V2](/docs/rest-management/orders/order-status#get-all-order-statuses) | | Orders | read-only | `store_v2_orders_read_only` | View orders | [Orders V2](/docs/rest-management/orders) <br />[Order Status V2](/docs/rest-management/orders/order-status#get-all-order-statuses) | | Order Fulfillment | modify | `store_order_fulfillment_manage` | View and modify order fulfillments | [Pickup V3](/docs/rest-management/pickup) | @@ -242,12 +242,12 @@ All OAuth scopes except `default` provide `read-only` permissions scopes so that | UI Name | Permission | Parameter | Description | Resources | |:--------|:-----------|:----------|:------------|:----------| -| Account | read-only | `account_read` | View account details | [GraphQL Account API](/docs/graphql-account/users-overview) | -| Account Apps | read-only | `account_apps_read` | View the apps associated with an account | [GraphQL Account API](/docs/graphql-account/users-overview) | -| Account Stores | read-only | `account_stores_read` | View the stores associated with an account | [GraphQL Account API](/docs/graphql-account/users-overview) | -| Account Users | read-only | `account_users_read` | View the users associated with an account | [GraphQL Account API](/docs/graphql-account/users-overview) | -| Account Users | write | `account_users_write` | Add and update users | [GraphQL Account API](/docs/graphql-account/users-overview) | -| Account Users | delete | `account_users_delete` | Remove a user from an account | [GraphQL Account API](/docs/graphql-account/users-overview) | +| Account | read-only | `account_read` | View account details | [GraphQL Account API](/docs/graphql-account/users) | +| Account Apps | read-only | `account_apps_read` | View the apps associated with an account | [GraphQL Account API](/docs/graphql-account/users) | +| Account Stores | read-only | `account_stores_read` | View the stores associated with an account | [GraphQL Account API](/docs/graphql-account/users) | +| Account Users | read-only | `account_users_read` | View the users associated with an account | [GraphQL Account API](/docs/graphql-account/users) | +| Account Users | write | `account_users_write` | Add and update users | [GraphQL Account API](/docs/graphql-account/users) | +| Account Users | delete | `account_users_delete` | Remove a user from an account | [GraphQL Account API](/docs/graphql-account/users) | ## Resources diff --git a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx b/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx index b5922752a..8bd29f46c 100644 --- a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx +++ b/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx @@ -1,6 +1,7 @@ # Product Filtering Toolkit -Product filtering (also known as faceted search) enables shoppers to refine product searches based on multiple attributes like price, size, ratings, etc. For a store owner's view of administering this feature, please see <a href="https://forum.bigcommerce.com/s/article/Product-Filtering-Settings" target="_blank">this KB article</a>. +Product filtering (also known as faceted search) enables shoppers to refine product searches based on multiple attributes like price, size, ratings, etc. For a store owner's view of administering this feature, please see [product filtering settings (Help Center)](https://support.bigcommerce.com/s/article/Product-Filtering-Settings). + <Callout type="warning"> #### Requirements/Restrictions diff --git a/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx b/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx index 8549468a1..b20b40d1b 100644 --- a/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx +++ b/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx @@ -48,7 +48,7 @@ Handlebars keeps your HTML page clean by separating the logic-less templates fro For more information about Handlebars, refer to these external resources: - [A Beginner’s Guide to Handlebars](https://www.sitepoint.com/a-beginners-guide-to-handlebars/) -- [Getting Started with Handlebars.js](http://blog.teamtreehouse.com/getting-started-with-handlebars-js) +- [Getting Started with Handlebars.js](https://handlebarsjs.com/guide) - [Handlebars interactive tutorial](http://tryhandlebarsjs.com/) For details on using Handlebars to surface objects in Stencil, see [Stencil Technology Stack](/docs/storefront/stencil/start/tech-stack). diff --git a/docs/stencil-docs/storefront-customization/theme-accessibility.mdx b/docs/stencil-docs/storefront-customization/theme-accessibility.mdx index 09c6b9c5d..5c5c38917 100644 --- a/docs/stencil-docs/storefront-customization/theme-accessibility.mdx +++ b/docs/stencil-docs/storefront-customization/theme-accessibility.mdx @@ -74,11 +74,11 @@ Text accessibility involves making content readable and understandable. You can Color contrast is an essential factor in visual accessibility. <Callout type="info"> - According to [WCAG 2.1](https://www.w3.org/TR/WCAG21/), your ecommerce website must have minimum color contrast ratios of 4.5.1 for standard text and 3:1 for large text. To ensure you meet WCAG 2.1 guidelines, we recommend presetting these guidelines, using [Lighthouse](https://developers.google.com/web/tools/lighthouse) or Chrome's [Accessibility Developer Tools](https://chrome.google.com/webstore/detail/accessibility-developer-t/fpkknkljclfencbdbgkenhalefipecmb/reviews?hl=en). + According to [WCAG 2.1](https://www.w3.org/TR/WCAG21/), your ecommerce website must have minimum color contrast ratios of 4.5.1 for standard text and 3:1 for large text. To ensure you meet WCAG 2.1 guidelines, we recommend presetting these guidelines, using [Lighthouse](https://developers.google.com/web/tools/lighthouse) or Chrome's [Accessibility Developer Tools](https://chromewebstore.google.com/category/extensions/make_chrome_yours/accessibility). </Callout> -It is essential to avoid using dark colors for both the background and text color. Instead, use contrasting colors to achieve better visibility. For example, avoid green and black, green and gray, and green and red background and text colors. Alternatively, it is good practice to use light text on dark backgrounds or dark text on light backgrounds. The example below shows poor color contrasting because the black text is on a green background. The color contrast ratio is 3.8.1. It would have been better to use white text on a dark green background. +It is essential to avoid using dark colors for both the background and text color. Instead, use contrasting colors to achieve better visibility. For example, avoid green and black, green and gray, and green and red background and text colors. Alternatively, it is good practice to use light text on dark backgrounds or dark text on light backgrounds. The example below shows poor color contrasting because the black text is on a green background. The color contrast ratio is 3.8.1. It would have been better to use white text on a dark green background. **Poor contrast ratio** diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index db730ca6e..bab1558b4 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -1136,7 +1136,7 @@ paths: * `shipping_address` (deprecated) or `address` * `lineItems` - 2. Update the Consignment with Shipping Options using the [REST Storefront API](/checkouts/checkout-consignments#update-a-consignment), the [REST Management API](/docs/rest-management/checkouts/checkout-consignments#update-checkout-consignment) or the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). + 2. Update the Consignment with Shipping Options using the [REST Storefront API](/docs/rest-storefront/checkouts/checkout-consignments#update-a-consignment), the [REST Management API](/docs/rest-management/checkouts/checkout-consignments#update-checkout-consignment) or the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront). ### For **pickup** consignments: 1. Create a new consignment object. diff --git a/reference/tax_classes.v2.yml b/reference/tax_classes.v2.yml index 403229043..a89c0458b 100644 --- a/reference/tax_classes.v2.yml +++ b/reference/tax_classes.v2.yml @@ -3,7 +3,7 @@ info: title: Tax Classes description: Manage tax calculations applied to sales. Tax classes are used to apply different tax rates for specific types of products and orders. This API is read - only. Classes must be set using the [Control Panel](https://forum.bigcommerce.com/s/article/Taxes-Video#). + only. Classes must be set using the [Control Panel](https://support.bigcommerce.com/s/article/Taxes-Video). termsOfService: 'https://www.bigcommerce.com/terms' contact: name: BigCommerce From 91fe1966c71a8714500a09d902e87ae13af0c2cd Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Thu, 6 Jun 2024 16:28:05 -0700 Subject: [PATCH 048/221] SELFDEV-687: [update] Remove and update broken links (#321) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [SELFDEV-687] ## What changed? <!-- Provide a bulleted list in the present tense --> * Remove and/or update broken links ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [SELFDEV-687]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-687?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/api-docs/apps/guide/apps-01-introduction.mdx | 1 - docs/api-docs/apps/guide/apps-02-types.mdx | 1 - docs/api-docs/apps/guide/apps-03-developing.mdx | 1 - docs/api-docs/apps/guide/apps-05-oauth.mdx | 1 - docs/api-docs/apps/guide/apps-06-callbacks.mdx | 1 - docs/api-docs/apps/guide/apps-07-users.mdx | 1 - docs/api-docs/apps/guide/apps-08-events.mdx | 1 - docs/api-docs/apps/guide/apps-10-buttons.mdx | 1 - docs/api-docs/apps/guide/apps-11-best-practices.mdx | 1 - docs/api-docs/apps/guide/apps-12-requirements.mdx | 1 - docs/api-docs/apps/guide/apps-13-publishing.mdx | 1 - docs/api-docs/partner/dev-portal-overview.mdx | 1 - docs/legacy/blueprint-themes/lng-variables.mdx | 2 +- docs/legacy/blueprint-themes/product-filtering-toolkit.mdx | 2 +- 14 files changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/api-docs/apps/guide/apps-01-introduction.mdx b/docs/api-docs/apps/guide/apps-01-introduction.mdx index 0f1cb309a..82ecdb96a 100644 --- a/docs/api-docs/apps/guide/apps-01-introduction.mdx +++ b/docs/api-docs/apps/guide/apps-01-introduction.mdx @@ -90,7 +90,6 @@ Here's how to get started with BigCommerce development: * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) (BigCommerce Developer Blog) diff --git a/docs/api-docs/apps/guide/apps-02-types.mdx b/docs/api-docs/apps/guide/apps-02-types.mdx index 6318b73ae..be2a5afd7 100644 --- a/docs/api-docs/apps/guide/apps-02-types.mdx +++ b/docs/api-docs/apps/guide/apps-02-types.mdx @@ -65,7 +65,6 @@ There are three visibility options for apps: **Draft**, **Unlisted**, and **Publ * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-03-developing.mdx b/docs/api-docs/apps/guide/apps-03-developing.mdx index 6ccb87f40..b9d90fdcc 100644 --- a/docs/api-docs/apps/guide/apps-03-developing.mdx +++ b/docs/api-docs/apps/guide/apps-03-developing.mdx @@ -87,7 +87,6 @@ Any store registered to the same email as your [Developer Portal](https://devtoo * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-05-oauth.mdx b/docs/api-docs/apps/guide/apps-05-oauth.mdx index 2ff02fcd8..5403ff4f6 100644 --- a/docs/api-docs/apps/guide/apps-05-oauth.mdx +++ b/docs/api-docs/apps/guide/apps-05-oauth.mdx @@ -204,7 +204,6 @@ The following BigCommerce API clients expose helper methods for BigCommerce's co * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-06-callbacks.mdx b/docs/api-docs/apps/guide/apps-06-callbacks.mdx index a98edc717..b995175c1 100644 --- a/docs/api-docs/apps/guide/apps-06-callbacks.mdx +++ b/docs/api-docs/apps/guide/apps-06-callbacks.mdx @@ -152,7 +152,6 @@ The following BigCommerce API clients expose helper methods for verifying the `s * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-07-users.mdx b/docs/api-docs/apps/guide/apps-07-users.mdx index 45ed218e6..ed8481961 100644 --- a/docs/api-docs/apps/guide/apps-07-users.mdx +++ b/docs/api-docs/apps/guide/apps-07-users.mdx @@ -55,7 +55,6 @@ For details about remove user and load requests, see [Single-click App Callbacks * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-08-events.mdx b/docs/api-docs/apps/guide/apps-08-events.mdx index 77579f5a7..ba86c78ae 100644 --- a/docs/api-docs/apps/guide/apps-08-events.mdx +++ b/docs/api-docs/apps/guide/apps-08-events.mdx @@ -73,7 +73,6 @@ Accept: application/json * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-10-buttons.mdx b/docs/api-docs/apps/guide/apps-10-buttons.mdx index a5e2f769d..213a04a34 100644 --- a/docs/api-docs/apps/guide/apps-10-buttons.mdx +++ b/docs/api-docs/apps/guide/apps-10-buttons.mdx @@ -88,7 +88,6 @@ end * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-11-best-practices.mdx b/docs/api-docs/apps/guide/apps-11-best-practices.mdx index 78033684e..35f7f86f3 100644 --- a/docs/api-docs/apps/guide/apps-11-best-practices.mdx +++ b/docs/api-docs/apps/guide/apps-11-best-practices.mdx @@ -100,7 +100,6 @@ BigCommerce hosts [Google Cloud Platform](https://cloud.google.com/) in the [us- * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/apps/guide/apps-12-requirements.mdx b/docs/api-docs/apps/guide/apps-12-requirements.mdx index ab0230ede..8e531af9c 100644 --- a/docs/api-docs/apps/guide/apps-12-requirements.mdx +++ b/docs/api-docs/apps/guide/apps-12-requirements.mdx @@ -77,7 +77,6 @@ For App Marketplace approval, you'll need to fill out all fields on your listing * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts diff --git a/docs/api-docs/apps/guide/apps-13-publishing.mdx b/docs/api-docs/apps/guide/apps-13-publishing.mdx index c7fadbf8e..ad934b04f 100644 --- a/docs/api-docs/apps/guide/apps-13-publishing.mdx +++ b/docs/api-docs/apps/guide/apps-13-publishing.mdx @@ -140,7 +140,6 @@ can take up to 24 hours to appear on the App Marketplace. Feel free to use this * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) * [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) diff --git a/docs/api-docs/partner/dev-portal-overview.mdx b/docs/api-docs/partner/dev-portal-overview.mdx index 41b2c77e2..b7e5b8c91 100644 --- a/docs/api-docs/partner/dev-portal-overview.mdx +++ b/docs/api-docs/partner/dev-portal-overview.mdx @@ -23,7 +23,6 @@ For instructions on how to use the Developer Portal to create an app, see [Manag ### Tools * [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) -* [Adobe Illustrator UI Kit](https://design.bigcommerce.com/bigdesign-ui-kit) ### Blog Posts diff --git a/docs/legacy/blueprint-themes/lng-variables.mdx b/docs/legacy/blueprint-themes/lng-variables.mdx index b8bf6c673..a55d491ae 100644 --- a/docs/legacy/blueprint-themes/lng-variables.mdx +++ b/docs/legacy/blueprint-themes/lng-variables.mdx @@ -808,7 +808,7 @@ To make it easier for store owners who might wish to translate, or otherwise mod | `%%LNG_SyndicateFeaturedProductsAtom%%` | "Latest %s Featured Products (Atom)" | | `%%LNG_SyndicateFeaturedProductsIntro%%` | "The featured products feed contains the latest %s featured products." | | `%%LNG_SyndicateFeaturedProductsRSS%%` | "Latest %s Featured Products (RSS)" | -| `%%LNG_SyndicateIntro%%` | "RSS feeds are used for syndicating regularly changing content on a web site, including this one. You can open an RSS feed using an <a href='http://en.wikipedia.org/wiki/Aggregator'>RSS reader</a> and use it to see if there is any new content on this site or you can set up a server-side script to parse the feed and display it on your web site." | +| `%%LNG_SyndicateIntro%%` | "RSS feeds are used for syndicating regularly changing content on a web site, including this one. You can open an RSS feed using an [RSS reader](https://en.wikipedia.org/wiki/RSS) and use it to see if there is any new content on this site or you can set up a server-side script to parse the feed and display it on your web site." | | `%%LNG_SyndicateNewProducts%%` | "New Products" | | `%%LNG_SyndicateNewProductsAtom%%` | "Latest %s New Products (Atom)" | | `%%LNG_SyndicateNewProductsIntro%%` | "The latest products feed contains the latest %s products added to %s." | diff --git a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx b/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx index 8bd29f46c..17ea9513f 100644 --- a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx +++ b/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx @@ -21,7 +21,7 @@ Product filtering is fully functional in the Blueprint base theme. Once you’ve As of that date, stores are being offered themes only from BigCommerce's new <a href="https://support.bigcommerce.com/articles/Public/The-Stencil-Theme-Platform" target="_blank">Stencil</a> theme platform. Within a store's control panel, the **Themes Marketplace** and **My Themes** pages will show only those Blueprint themes that have been applied to the store and/or purchased before November 2016. -For information about developing on the current Stencil platform, please see <a href="https://stencil.bigcommerce.com/docs/" target="_blank">this developer documentation</a>. +For information about developing on the current Stencil platform, please see <a href="https://developer.bigcommerce.com/docs/storefront/stencil" target="_blank">this developer documentation</a>. ## Enabling Product Filtering for Your Customized Theme From 2db07bebe458a34a72268f1a905d40668df113b9 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Mon, 10 Jun 2024 11:13:35 -0500 Subject: [PATCH 049/221] [DEVDOCS-5715]: [revise] Customers V3, Add origin_channel_id to the list of read only fields (#315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5715] ## What changed? <!-- Provide a bulleted list in the present tense --> * Add `origin_channel_ids` to the list of read only fields ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Added origin_channel_id to the list of read-only fields in the Customers V3 API. This field is set upon customer creation and cannot be updated afterward. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @ [DEVDOCS-5715]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5715?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Akshat Kaushik <87798139+bc-akshatkaushik@users.noreply.github.com> --- reference/customers.v3.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 2c8f286e4..90b0a4093 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -316,12 +316,14 @@ paths: * registration_ip_address * date_created * date_modified + * origin_channel_id **Notes** * Attributes Values can not be updated using Update a Customer. Use the [Update customer attribute values](/docs/rest-management/customers/customer-attribute-values#upsert-customer-attribute-values) endpoint. * channel_ids -- Updating the list of channels a customer can access may create some side effects in a multi-storefront situation. This list determines which customer account we will use to authenticate a shopper given a channel. + * origin_channel_id -- This is an immutable value set as a reference to the channel of origin when a customer is created. summary: Update Customers tags: - Customers From 53875763bd38eb00c7ce792326a19dbbf465fa4f Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 10 Jun 2024 13:08:21 -0500 Subject: [PATCH 050/221] DEVDOCS-5963: [update] create redirect URL request body (#323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5963] ## What changed? Correct request body for cart redirect URL. Screenshot image of the payload is in the ticket. ## Release notes draft Bug Fix <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5963]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5963?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/carts.v3.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index c44b748bc..cb0b8e349 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -365,6 +365,10 @@ paths: application/json: schema: $ref: '#/components/schemas/Redirect_urls_Post' + example: + query_params: + key_1: value_1 + key_2: value_2 responses: '201': $ref: '#/components/responses/CartRedirectResponse' @@ -2862,10 +2866,8 @@ components: title: Redirect_urls_Post properties: query_params: - type: array - items: - type: object - properties: + type: object + properties: key: type: string value: From 54ac42ee071f804cac2557e53498d123a794dadb Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:13:54 -0500 Subject: [PATCH 051/221] DEVDOCS-5929 [new]: Tax Settings API, add document submission strategy field (#318) --- docs/api-docs/tax/tax-settings.mdx | 6 ++++-- reference/tax_settings.v3.yml | 7 +++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/api-docs/tax/tax-settings.mdx b/docs/api-docs/tax/tax-settings.mdx index 6df15db09..509a823be 100644 --- a/docs/api-docs/tax/tax-settings.mdx +++ b/docs/api-docs/tax/tax-settings.mdx @@ -36,7 +36,8 @@ To get tax settings, send a request to the [Get tax settings](/docs/rest-managem "should_subtract_store_tax": false, "should_use_geolocation_to_determine_guest_shopper_tax_zone": true, "guest_shopper_tax_zone_id": 1, - "store_tax_zone_id": 1 + "store_tax_zone_id": 1, + "document_submission_strategy": "ON_ORDER_CREATION" }, "meta": {} } @@ -83,7 +84,8 @@ Accept: application/json "should_subtract_store_tax": false, "should_use_geolocation_to_determine_guest_shopper_tax_zone": true, "guest_shopper_tax_zone_id": 1, - "store_tax_zone_id": 1 + "store_tax_zone_id": 1, + "document_submission_strategy": "ON_ORDER_CREATION" }, "meta": {} } diff --git a/reference/tax_settings.v3.yml b/reference/tax_settings.v3.yml index 87acb8982..bba8a5782 100644 --- a/reference/tax_settings.v3.yml +++ b/reference/tax_settings.v3.yml @@ -159,6 +159,13 @@ components: default: 1 type: integer description: ID for the tax zone a store uses when subtracting store tax. This setting applies only if a merchant enters tax-inclusive prices and subtracts store tax before tax calculation. + document_submission_strategy: + default: ON_PAYMENT_CAPTURE + type: string + description: This setting determines whether BigCommerce submits tax documents to third-party tax providers when orders are created or when payments are captured online. + enum: + - ON_PAYMENT_CAPTURE + - ON_ORDER_CREATION MetaOpen: title: Response meta type: object From 07c2fea4e2cc716146d066cd62647f5e0e7a6cff Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:27:25 -0500 Subject: [PATCH 052/221] DEVDOCS-5939 [update]: Channel listings, add usage note (#312) --- reference/channels.v3.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 1624fc18c..256d1af7b 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -369,7 +369,7 @@ paths: - Listings summary: Get Channel Listings operationId: getChannelListings - description: 'Returns a list of all *Channel Listings* for a specific channel. Note that if the *Channel* is not found or there is no listing associated to the *Channel*, it will return a 200 response with empty data.' + description: 'Returns a list of all *Channel Listings* for a specific channel. We recommend using this endpoint for non-storefront channels like marketplaces, marketing channels, and point of sale (POS) channels. Note that if the *Channel* is not found or there is no listing associated with the *Channel*, it will return a 200 response with empty data.' parameters: - $ref: '#/components/parameters/limit' - $ref: '#/components/parameters/after' @@ -394,7 +394,7 @@ paths: parameters: - $ref: '#/components/parameters/ContentType' operationId: createChannelListings - description: Creates one or more *Channel Listings* for a specific channel. + description: Creates one or more *Channel Listings* for a specific channel. We recommend using this endpoint for non-storefront channels like marketplaces, marketing channels, and point of sale (POS) channels. requestBody: content: application/json: @@ -419,7 +419,7 @@ paths: - $ref: '#/components/parameters/ContentType' operationId: updateChannelListings description: |- - Updates one or more *Channel Listings* for a specific channel. + Updates one or more *Channel Listings* for a specific channel. We recommend using this endpoint for non-storefront channels like marketplaces, marketing channels, and point of sale (POS) channels. > #### Note > * Partial updates are supported. In most cases, if a field that *cannot* be updated is passed in, the API **will not** respond with an error. It returns a 200 response with the object, in which you will see the field(s) were not updated. @@ -454,7 +454,7 @@ paths: - Listings summary: Get a Channel Listing operationId: getChannelListing - description: Returns a *Channel Listing* for a specific channel. + description: Returns a *Channel Listing* for a specific channel. We recommend using this endpoint for non-storefront channels like marketplaces, marketing channels, and point of sale (POS) channels. responses: '200': $ref: '#/components/responses/single_listing_resp' From 1ce1f2e4007798617b309b4a2f42feffa9d6ab73 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:20:20 -0500 Subject: [PATCH 053/221] DEVDOCS-5969 [update]: Orders V3 API, remove batch refund quotes endpoint (#328) --- reference/orders.v3.yml | 102 ---------------------------------------- 1 file changed, 102 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index d2ab76430..ffdb7d923 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -457,108 +457,6 @@ paths: responses: '200': $ref: '#/components/responses/RefundCollection_Resp' - '/orders/payment_actions/refund_quotes': - post: - summary: Create Refund Quotes - BATCH - description: |- - Calculate the tax amount, total refund amount and get available payment options for an order refund by providing items and costs or quantities to refund. - - This endpoint will accept a batch of one or more. - - Requires at least one of the following scopes: - * `store_v2_orders` - * `store_v2_transactions` - operationId: createOrdersRefundQuotes - parameters: - - $ref: '#/components/parameters/Accept' - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PostRefundQuotesRequest' - required: true - x-examples: - application/json: - - item_id: 76 - item_type: PRODUCT - quantity: 1 - tax_adjustment_amount: 0 - responses: - '201': - $ref: '#/components/responses/RefundQuotesBATCH_Resp' - '422': - description: Partial success/failure response. Status to roll up to the most severe individual failure to the whole request. - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/RefundQuote_Full' - errors: - type: array - items: - $ref: '#/components/schemas/FailedQuoteError' - meta: - $ref: '#/components/schemas/Meta' - Example 1: - examples: - response: - value: - data: - - order_id: 1 - total_refund_amount: 1.99 - total_refund_tax_amount: 1.95 - rounding: 1 - adjustment: 0.05 - tax_inclusive: true - refund_methods: - - "" - errors: - - order_id: 1 - status: 422 - error: "Refund amount is greater than remaining amount" - meta: - failure: 1 - success: 1 - total: 2 - '503': - description: Every request in the batch failed. The error object describes the failure for each component request. - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/RefundQuote_Full' - errors: - type: array - items: - $ref: '#/components/schemas/FailedQuoteError' - meta: - $ref: '#/components/schemas/Meta' - examples: - response: - value: - data: [] - errors: - - order_id: 1 - status: 503 - error: Tax service could not be contacted - - order_id: 100 - status: 422 - error: Refund amount exceeds remaining amount - meta: - failure: 2 - success: 0 - total: 2 - tags: - - Payment Actions - x-private: true '/orders/{order_id}/metafields': parameters: - $ref: '#/components/parameters/Accept' From c551355340646c02032ba53ab9178441f0a75466 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:37:17 -0500 Subject: [PATCH 054/221] DEVDOCS-5911 [new]: MSF/Stencil, add storefront selector guide (#326) --- .../localization/msf-storefront-selector.mdx | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 docs/stencil-docs/localization/msf-storefront-selector.mdx diff --git a/docs/stencil-docs/localization/msf-storefront-selector.mdx b/docs/stencil-docs/localization/msf-storefront-selector.mdx new file mode 100644 index 000000000..7eb343daf --- /dev/null +++ b/docs/stencil-docs/localization/msf-storefront-selector.mdx @@ -0,0 +1,134 @@ +# Storefront Selector for Multi-Storefronts + +To localize shopping experiences, you can have [multiple storefronts](/docs/storefront/multi-storefront) that target specific shopper segments, regions, or brands. You can add a selector to a theme so shoppers can select the storefront they want to browse from a list of options. + +You can do the following with the storefront selectors that you create and inject into a theme: + +- Customize the style of the switcher and its options. +- Choose which pages you want the selector to appear. +- Select the storefronts that you include in the selector. + +This guide walks you through how to add data for the storefront selector into your Cornerstone theme. + +## Steps to add storefront selector data + +Currently, there is no Stencil object for the storefront selector. Instead, you can add data for the storefront selector in the `config.json` file, which allows the selector to appear in the `theme_settings` Stencil object. + +To change the data for the selector, perform the following steps: +- Step 1: Clone the [Cornerstone repository](https://github.com/bigcommerce/cornerstone). +- Step 2: Install the Stencil CLI and necessary project dependencies. +- Step 3: Install theme modules, initialize the project, and run the project locally. +- Step 4: Change the data for the selector. +- Step 5: Create a bundle with new changes. +- Step 6: Upload the bundle to the control panel. + +<Callout type="info"> +- You cannot change the data for the selector in the `config.json` directly in the control panel because this file is read-only. For more information, see the [Stencil Themes](https://support.bigcommerce.com/s/article/Stencil-Themes) support article. +- You cannot manually change the bundle because the bundle must have a specific Stencil format created only during the automatic build. For more information, see the [Theme Uploads - Restrictions](/docs/storefront/stencil/deployment/upload-errors#restrictions) article. +</Callout> + +## Step 1: Clone the GitHub repository + +To clone the Cornerstone repository, run the command below in the terminal of your operating system: + +```bash +git clone https://github.com/bigcommerce/cornerstone.git +``` + +## Step 2: Install Stencil CLI + +Open the cloned repository in any code editor (IDE). Open your IDE-terminal, which is where you can run the rest of the steps. Depending on the operating system, [install the Stencil CLI](/docs/storefront/stencil/cli/install) supported by the appropriate version of Node.js. + +To verify the success of the Stencil CLI installation, run the command below in the terminal: + +```bash +stencil -V +``` + +If you did everything correctly, you will see the Stencil CLI version in the terminal. + +## Step 3: Install theme modules, initialize the project, and run the project locally + +To install the modules, run the following command in the terminal: + +```bash +npm install +``` + +After successfully installing modules, the `node_modules` folder will appear in the root of the project. + +Run the following commands to initialize and run the project: + +```bash +stencil init +``` + +To execute this command, you will need a link to your store, a [Stencil Access Token](/docs/storefront/stencil/cli/development-server#creating-stencil-api-credentials), and a port on which your local project will run. After successful initialization, a `secrets.stencil.json` file containing the token will appear in the root of the project. + +Run the following command to start the project locally: + +```bash +stencil start +``` + +Go to the local link in the terminal to open your project in the browser. + + +## Step 4: Change the data for the storefront selector + +Open the `config.json` file and edit the necessary storefront selector data. To display the selector in the browser, change the `show_channels` key to true and save the changes. By default, this key is false. You can also configure this key in Page Builder. Refresh the browser page to reflect the changes. + +```json filename="Example storefront selector data" copy +"settings": { + "channels": [ + { + "id": 1, + "name": "Example storefront 1", + "code": "example-storefront-1", + "is_active": true, + "switch_url": "https://example-storefront-1.mybigcommerce.com" + }, + { + "id": 2, + "name": "Example storefront 2", + "code": "example-storefront-2", + "is_active": false, + "switch_url": "https://example-storefront-2.mybigcommerce.com" + }, + { + "id": 3, + "name": "Example storefront 3", + "code": "example-storefront-3", + "is_active": false, + "switch_url": "https://example-storefront-3.mybigcommerce.com" + } + ], + "show_channels": true +} +``` + +## Step 5: Create a bundle with new changes + +After making changes in the selector, make sure that everything is displayed correctly in the browser. Then run the command below to build the project bundle with the new changes: + +```bash +stencil bundle +``` + +After a successful build, a zip file will appear in the project root with the theme name and version, for example `Cornerstone-6.14.0.zip`. + + +## Step 6: Upload the bundle to the control panel + +To [upload the bundle](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US#download-upload) with the updated selector, go to Themes in the control panel and click the **Upload Theme** button. Select the bundle created in the previous step and upload it. + +Apply the bundle and open your store. If the selector is not displayed, go to [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) and navigate to **Theme Styles** > **Header and Footer** > **Utility navigation** > **Show storefront selector** and check this checkbox. Save the changes and refresh the store. + +## Resources + +- [Cornerstone repository](https://github.com/bigcommerce/cornerstone) +- [Stencil Access Token](/docs/storefront/stencil/cli/development-server#creating-stencil-api-credentials) +- [Installing Stencil CLI](/docs/storefront/stencil/cli/install) +- [Theme Uploads - Restrictions](/docs/storefront/stencil/deployment/upload-errors#restrictions) +- [Stencil Themes](https://support.bigcommerce.com/s/article/Stencil-Themes) (support article) +- [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) (support article) \ No newline at end of file From 115e238dc6fe253a38f91d335b7361cbe002b8ae Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Wed, 12 Jun 2024 15:47:53 -0400 Subject: [PATCH 055/221] Update amount.yml to fix data type (#327) <!-- Ticket number or summary of work --> Updated the type of the amount model to number and fixed description. This is likely the reason that the Price theme object isn't rendering. --- models/common/amount.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/models/common/amount.yml b/models/common/amount.yml index 4cac7d4af..a0e5ae9d2 100644 --- a/models/common/amount.yml +++ b/models/common/amount.yml @@ -8,4 +8,5 @@ properties: type: string description: string representation of the price, including currency formatting value: - type: raw numeric value of the above price \ No newline at end of file + type: number + description: numeric value of the price From 66dbab0050b4400ad0c846323d7093814726849d Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Wed, 12 Jun 2024 16:15:23 -0500 Subject: [PATCH 056/221] SELFDEV-576 + DEVDOCS-5863: [organize] Make docs structure match IA, move newer public docs to public repo (#324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [SELFDEV-576] + [DEVDOCS-5863] ## What changed? <!-- Provide a bulleted list in the present tense --> * Make docs structure match IA * BOPIS and promotions docs into public repo * Other than adding the spec files from bopis and promotions to the dev center, i did not reorganize the API reference because that requires comms and advance notice to everyone who maintains an API client or SDK. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * The bigcommerce/docs repo now contains the OAS for promotions, inventory, locations, and other newer API features! * It's now easier than ever to contribute to the docs. The source file structure in the repo now matches the Dev Center URLs. Finding the doc you want to modify never had less friction :) * This only applies to the narrative docs. API reference source file restructure is in the works as soon as we can give enough notice for all you API client maintainers to reset your references. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bc-tgomez @bc-traciporter [SELFDEV-576]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-576?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [DEVDOCS-5863]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5863?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../installing-legacy-theme-modules.mdx | 134 +- .../start}/making-requests.mdx | 0 .../start/partner/developer-portal.mdx | 0 .../start/partner/developer-resources.mdx | 0 .../start}/partner/staying-current.mdx | 0 .../v2-catalog-products/v2-brands.mdx | 0 .../v2-catalog-products/v2-bulk-pricing.mdx | 0 .../v2-catalog-products/v2-categories.mdx | 0 .../v2-catalog-products/v2-custom-fields.mdx | 0 .../v2-option-set-options.mdx | 0 .../v2-catalog-products/v2-option-sets.mdx | 0 .../v2-catalog-products/v2-option-values.mdx | 0 .../v2-catalog-products/v2-options.mdx | 0 .../v2-catalog-products/v2-product-images.mdx | 0 .../v2-product-options.mdx | 0 .../v2-product-reviews.mdx | 2 +- .../v2-catalog-products/v2-product-rules.mdx | 0 .../v2-catalog-products/v2-product-sku.mdx | 0 .../v2-catalog-products/v2-product-videos.mdx | 0 .../v2-catalog-products/v2-products.mdx | 0 .../v2-products/v2-versus-v3.mdx | 2 +- .../blueprint/reference/layouts.mdx | 0 .../storefront/blueprint/reference/panels.mdx | 0 .../blueprint/reference/snippets.mdx | 0 .../blueprint/themes}/anatomy-of-a-theme.mdx | 0 .../themes}/blueprint-and-developer-mode.mdx | 0 .../blueprint/themes}/checkout-styling.mdx | 550 +- .../blueprint/themes/email-templates.mdx | 236 +- .../blueprint/themes}/global-variables.mdx | 2538 ++++----- .../blueprint/themes}/lng-variables.mdx | 1788 +++---- .../themes}/product-filtering-toolkit.mdx | 202 +- .../blueprint/themes/recaptcha-v2.mdx | 188 +- .../themes}/store-wide-global-panels.mdx | 44 +- .../themes}/store-wide-global-variables.mdx | 94 +- .../blueprint/themes}/style-editor.mdx | 268 +- .../blueprint/themes/template-syntax.mdx | 278 +- .../blueprint/themes/theme-update-process.mdx | 96 +- .../storefront/nextjs-commerce.mdx | 0 .../google-analytics-enhanced-ecommerce.mdx | 368 +- .../stored-credit-card-management.mdx | 248 +- .../storefront/stencil/transitioning.mdx | 162 +- .../draft}/Account-level-API-accounts.mdx | 0 .../users.mdx} | 0 .../apps/app-extensions/glossary.mdx | 105 + .../apps/app-extensions/guide.mdx | 591 ++ .../apps/app-extensions/index.mdx | 262 + .../apps/app-extensions/postman.mdx | 193 + .../apps/guide/auth.mdx} | 0 .../apps/guide/best-practices.mdx} | 0 .../apps/guide/buttons.mdx} | 0 .../apps/guide/callbacks.mdx} | 0 .../apps/guide/developer-portal.mdx} | 4 +- .../apps/guide/events.mdx} | 0 .../apps/guide/id.mdx} | 0 .../apps/guide/index.mdx} | 0 .../apps/guide/publishing.mdx} | 0 .../apps/guide/requirements.mdx} | 0 .../apps/guide/types.mdx} | 0 .../apps/guide/ui.mdx} | 0 .../apps/guide/users.mdx} | 0 .../apps/index.mdx} | 0 .../apps/multi-storefront.mdx} | 0 .../apps/quick-start.mdx} | 0 .../apps/tutorial/index.mdx} | 0 .../apps/tutorial/nextjs-connect.mdx} | 0 .../apps/tutorial/nextjs-enhance.mdx } | 0 .../apps/tutorial/nextjs-integrate.mdx} | 0 .../apps/tutorial/nextjs-quick-start.mdx} | 0 .../apps/tutorial/nextjs-setup.mdx} | 0 .../buy-online-pick-up-in-store/api-guide.mdx | 1855 +++++++ .../draft/catalog.mdx | 11 + .../draft/get-locations.mdx | 712 +++ .../draft/inventory-by-location.mdx | 702 +++ .../partner-integration-guide/add-to-cart.mdx | 88 + .../end-to-end-guide/checkout.mdx | 496 ++ .../end-to-end-guide/configuration.mdx | 916 ++++ .../end-to-end-guide/fulfillment.mdx | 87 + .../end-to-end-guide/orders.mdx | 157 + .../end-to-end-guide/overview.mdx | 40 + .../end-to-end-guide/retirement.mdx | 131 + .../end-to-end-guide/shopping.mdx | 120 + .../frequently-asked-questions.mdx | 28 + .../buy-online-pick-up-in-store/glossary.mdx | 49 + .../guide/add-to-cart.mdx | 79 + .../guide/checkout.mdx | 21 + .../guide/orders.mdx | 15 + .../guide/storefront.mdx | 79 + .../buy-online-pick-up-in-store/index.mdx | 161 + .../channels/draft}/channels-pos-tutorial.mdx | 2 +- .../channels/guide/best-practices.mdx} | 0 .../guide/extending-existing-apps.mdx} | 0 .../channels/guide/index.mdx} | 0 .../channels/guide/requirements.mdx} | 0 .../channels/guide/storefronts.mdx} | 0 .../channels/index.mdx} | 0 .../channels/quick-start.mdx} | 0 .../channels/toolkit-reference.mdx} | 10 +- .../hosted-analytics.mdx} | 38 +- .../point-of-sale.mdx} | 0 .../scripts.mdx} | 0 .../shipping.mdx} | 0 .../staging-pro.mdx} | 0 .../subscriptions.mdx} | 0 .../tax/overview.mdx => integrations/tax.mdx} | 0 .../webhooks/events/channels.mdx} | 0 .../webhooks/events/index.mdx} | 0 .../webhooks/events/inventory-location.mdx | 111 + .../webhooks/overview.mdx} | 0 .../webhooks/tutorial.mdx} | 0 .../about/common-query-params.mdx} | 0 .../about/index.mdx} | 0 .../about/sandboxes.mdx} | 0 .../about/status-codes.mdx} | 0 .../partner => start/about}/support.mdx | 0 .../authentication/api-accounts.mdx} | 0 .../authentication/current-customer.mdx} | 158 +- .../authentication/customer-login.mdx} | 2 +- .../authentication/index.mdx} | 0 .../authentication}/passwordless-login.mdx | 2 +- .../best-practices/index.mdx} | 2 +- .../best-practices}/integration-design.mdx | 2 +- .../best-practices/sunsets.mdx} | 0 .../draft}/marketing-api-overview.mdx | 0 ...gcommerce.mdx => intro-to-bigcommerce.mdx} | 0 .../partner.mdx} | 0 .../catalog}/contextual-filters.mdx | 0 .../graphql-admin/product-attributes.mdx | 768 +++ .../graphql-admin/product-basic-info.mdx | 317 ++ .../product-modifier-options.mdx | 1444 +++++ .../graphql-admin/product-seo-info.mdx | 291 + .../catalog/graphql-admin/product-url.mdx | 269 + .../graphql-admin/product-variant-options.mdx | 875 +++ .../catalog/index.mdx} | 0 .../catalog/inventory-adjustments.mdx | 407 ++ .../catalog/inventory-locations.mdx | 101 + .../catalog/migration/guide.mdx} | 0 .../catalog/migration/index.mdx} | 0 .../msf-international-enhancements.mdx | 81 + .../currencies/guide.mdx} | 0 .../currencies/index.mdx} | 2 +- .../customers/channel-specific-customers.mdx | 0 .../customers/index.mdx} | 534 +- .../draft}/capture/capture.mdx | 0 .../draft}/void/void.mdx | 0 .../emails/examples.mdx} | 0 .../emails/index.mdx} | 0 .../emails/object-reference}/README.md | 0 .../abandoned-cart-deprecated.yml | 0 .../object-reference/abandoned-cart.yml | 0 .../account-details-changed.yml | 0 .../account-reset-password.yml | 0 .../combined-order-status.yml | 0 .../object-reference/create-account.yml | 0 .../object-reference/create-guest-account.yml | 0 .../data/abandoned_cart_email.json | 76 +- .../data/account_details_changed_email.json | 0 .../data/account_reset_password_email.json | 0 .../data/combined_order_status_email.json | 0 .../data/create_account_email.json | 86 +- .../data/create_guest_account_email.json | 84 +- .../data/gift_certificate_email.json | 108 +- .../emails/object-reference}/data/global.json | 58 +- .../object-reference}/data/invoice_email.json | 358 +- .../data/order_message_notification.json | 84 +- .../data/passwordless_login_email.json | 84 +- .../data/product_review_email.json | 100 +- .../data/return_confirmation_email.json | 110 +- .../data/return_status_change_email.json | 140 +- .../emails/object-reference/draft}/README.md | 62 +- .../emails/object-reference/draft}/_all.yml | 4736 ++++++++--------- .../draft}/abandoned_cart_email.yml | 0 .../draft}/account_details_changed_email.yml | 0 .../draft}/account_reset_password_email.yml | 0 .../draft}/combined_order_status_email.yml | 0 .../draft}/create_account_email.yml | 0 .../draft}/create_guest_account_email.yml | 0 .../draft}/gift_certificate_email.yml | 0 .../emails/object-reference/draft}/global.yml | 0 .../object-reference/draft}/invoice_email.yml | 0 .../draft}/order_message_notification.yml | 0 .../draft}/passwordless_login_email.yml | 0 .../draft}/product_review_email.yml | 0 .../draft}/return_confirmation_email.yml | 0 .../draft}/return_status_change_email.yml | 0 .../object-reference/gift-certificate.yml | 0 .../object-reference/global-email-object.yml | 0 .../emails/object-reference/invoice.yml | 0 .../order-message-notification.yml | 0 .../object-reference/passwordless-login.yml | 0 .../object-reference/product-review.yml | 0 .../object-reference/return-confirmation.yml | 0 .../object-reference/return-status-change.yml | 0 .../orders/index.mdx} | 0 .../orders/invoice-templates.mdx} | 158 +- .../orders/refunds.mdx} | 0 .../payments/index.mdx} | 4 +- .../pricing/calculations.mdx} | 76 +- .../pricing/price-lists.mdx} | 216 +- .../promotions/api-ui-features.mdx | 14 + .../currency-specific-promotions.mdx | 34 + .../promotions/examples/brand.mdx | 884 +++ .../promotions/examples/category.mdx | 833 +++ .../promotions/examples/customer.mdx | 679 +++ .../promotions/examples/logical-operators.mdx | 531 ++ .../promotions/examples/multiple-rules.mdx | 730 +++ .../promotions/examples/order.mdx | 524 ++ .../promotions/examples/product.mdx | 1381 +++++ .../promotions/examples/shipping.mdx | 421 ++ .../promotions/examples/storewide.mdx | 96 + docs/store-operations/promotions/index.mdx | 940 ++++ .../promotions/multi-currency.mdx | 43 + .../settings/configuration.mdx} | 0 .../settings/data.mdx} | 2 +- .../settings/logs.mdx} | 0 .../shipping/index.mdx} | 0 .../shipping/packing-slips.mdx} | 208 +- .../shipping/shipper-hq.mdx | 0 .../tax/index.mdx} | 0 .../tax/tax-properties.mdx | 0 .../tax/tax-rates-zones.mdx | 0 .../cart-checkout/checkout-sdk/index.mdx} | 362 +- .../cart-checkout/checkout-sdk/tutorial.mdx} | 0 .../draft}/channels-sites-routes.mdx | 0 .../cart-checkout/draft}/checkout-sdk.mdx | 0 .../embedded-checkout/index.mdx} | 0 .../embedded-checkout/tutorial.mdx} | 2 +- .../cart-checkout/guide}/add-to-cart-url.mdx | 2 +- .../cart-checkout/guide/consignments.mdx} | 0 .../guide/graphql-storefront.mdx} | 0 .../cart-checkout/guide/rest-management.mdx} | 0 .../cart-checkout/guide/rest-storefront.mdx} | 0 .../cart-checkout/index.mdx} | 0 .../cart-checkout/localization.mdx} | 2 +- .../cart-checkout/open-checkouts/guide.mdx} | 0 .../cart-checkout/open-checkouts/index.mdx} | 0 .../optimized-one-page-checkout.mdx | 160 +- docs/storefront/graphql/customers.mdx | 601 +++ .../graphql/examples/index.mdx} | 0 .../graphql/examples/products.mdx} | 0 .../graphql/examples/variants.mdx} | 0 .../graphql/index.mdx} | 2 +- docs/storefront/graphql/inventory/queries.mdx | 728 +++ .../storefront/graphql/inventory/settings.mdx | 47 + docs/storefront/graphql/locations/queries.mdx | 706 +++ .../storefront/graphql/locations/settings.mdx | 50 + .../graphql/product-reviews.mdx} | 0 .../cart-checkout}/abandoned-carts.mdx | 0 .../headless/cart-checkout}/carts.mdx | 0 .../headless/cart-checkout}/checkout.mdx | 0 .../headless/channels.mdx | 0 .../headless/customers.mdx | 0 .../end-to-end-guides/graphql-storefront.mdx | 0 .../end-to-end-guides/rest-management.mdx | 2 +- .../headless/index.mdx} | 0 .../headless/orders.mdx | 0 .../headless/pci-compliance.mdx | 0 .../products/faceted-textual-search.mdx} | 0 .../headless/products/index.mdx} | 0 .../headless/site-content.mdx} | 0 .../multi-storefront/guide.mdx} | 0 .../multi-storefront/index.mdx} | 0 .../next-commerce.mdx} | 0 .../stencil/cli/development-server.mdx} | 288 +- .../stencil/cli}/incompatible-directives.mdx | 0 .../stencil/cli/install.mdx} | 328 +- .../stencil/cli}/node-sass.mdx | 0 .../stencil/cli/options-and-commands.mdx} | 0 .../stencil/cli/unexpected-behavior.mdx} | 0 .../stencil/content/page-builder.mdx} | 0 .../stencil/content/recaptcha.mdx} | 50 +- .../stencil/content/widgets.mdx} | 0 .../stencil/deployment}/early-hints.mdx | 0 .../deployment/performance-optimization.mdx} | 2 +- .../stencil/deployment/theme-images.mdx} | 202 +- .../stencil/deployment/theme-size.mdx} | 190 +- .../updates-and-version-control.mdx} | 64 +- .../stencil/deployment/upload-errors.mdx} | 0 .../stencil/deployment/upload.mdx} | 320 +- .../stencil/draft}/customizing-emails.mdx | 0 .../stencil/draft}/defining-ui-options.mdx | 0 .../draft}/dynamic-content-rendering.mdx | 0 .../draft}/reference-docs/common-objects.mdx | 0 .../global-objects-and-properties.mdx | 1404 ++--- .../other-objects-and-properties-overview.mdx | 0 .../reference-docs/styles-and-properties.mdx | 0 .../draft}/reference-docs/theme-objects.mdx | 0 .../stencil/draft}/store-design-overview.mdx | 2 +- .../stencil/start/index.mdx} | 166 +- .../stencil/start/tech-stack.mdx} | 178 +- .../implementing-wcag-guidelines.mdx} | 0 .../stencil/themes/accessibility/index.mdx} | 0 .../accessibility/wcag-compliance-levels.mdx} | 0 .../paypal-smart-buttons.mdx | 386 +- .../stored-payment-methods.mdx} | 456 +- .../checkout-enhancements}/wallet-buttons.mdx | 0 .../themes/context}/catalog-price-object.mdx | 610 +-- .../themes/context/frontmatter-reference.mdx} | 0 .../stencil/themes/context/frontmatter.mdx} | 0 .../themes/context/handlebars-reference.mdx} | 3554 ++++++------- .../context/object-reference}/config.yml | 0 .../object-reference/elements}/checkbox.mdx | 0 .../object-reference/elements}/color.mdx | 0 .../object-reference/elements}/font.mdx | 0 .../object-reference/elements}/heading.mdx | 0 .../elements}/imageDimension.mdx | 0 .../elements}/optimizedCheckout-image.mdx | 0 .../object-reference/elements}/reference.mdx | 0 .../object-reference/elements}/select.mdx | 0 .../object-reference/elements}/text.mdx | 0 .../object-reference/helpers}/blog/posts.yml | 74 +- .../helpers}/cart/cartItems.yml | 180 +- .../helpers}/cart/cartStatusMessage.yml | 16 +- .../helpers}/category/shop_by_price.yml | 62 +- .../helpers}/common/amount.yml | 24 +- .../helpers}/common/image.yml | 18 +- .../helpers}/common/price.yml | 16 +- .../helpers}/common/product.yml | 146 +- .../helpers}/customer/addresses.yml | 92 +- .../helpers}/customer/orders.yml | 106 +- .../helpers}/customer/payment_methods.yml | 238 +- .../helpers}/customer/returns.yml | 62 +- .../helpers}/customer/shipping_addresses.yml | 104 +- .../helpers}/customer/wishlists.yml | 50 +- .../helpers}/forms/address.yml | 40 +- .../helpers}/forms/contact.yml | 42 +- .../helpers}/forms/create_account.yml | 62 +- .../helpers}/forms/edit_account.yml | 48 +- .../helpers}/forms/gift_certificate.yml | 102 +- .../object-reference/helpers}/forms/login.yml | 46 +- .../helpers}/forms/provider.yml | 12 +- .../helpers}/forms/return.yml | 40 +- .../helpers}/forms/wishlist.yml | 42 +- .../helpers}/product/custom_fields.yml | 0 .../helpers}/product/options.yml | 0 .../helpers}/product/price.yml | 50 +- .../helpers}/product/related_products.yml | 196 +- .../helpers}/product/reviews.yml | 40 +- .../helpers}/product/similar_by_views.yml | 0 .../helpers}/product/videos.yml | 68 +- .../helpers/theme_objects/_all.yml | 98 + .../object-reference/schemas}/banners.yml | 56 +- .../object-reference/schemas}/blog.yml | 78 +- .../schemas/brand-results.yaml | 0 .../object-reference/schemas}/brand.yml | 112 +- .../object-reference/schemas}/brands.yml | 28 +- .../object-reference/schemas}/breadcrumbs.yml | 32 +- .../object-reference/schemas}/carousel.yml | 118 +- .../object-reference/schemas/cart-id.yml | 16 +- .../object-reference/schemas}/cart.yml | 690 +-- .../object-reference/schemas}/categories.yml | 100 +- .../schemas/category-results.yaml | 0 .../object-reference/schemas}/category.yml | 248 +- .../object-reference/schemas/checkout.yml | 33 + .../object-reference/schemas}/comparisons.yml | 266 +- .../schemas/content-results.yaml | 0 .../object-reference/schemas}/countries.yml | 90 +- .../schemas/create-account.yml | 16 +- .../schemas/currency-selector.yml | 82 +- .../schemas/customer-group-id.yml | 4 +- .../schemas/customer-group-name.yml | 4 +- .../object-reference/schemas}/customer.yml | 220 +- .../object-reference/schemas}/downloads.yml | 56 +- .../schemas/faceted-search.yml | 42 +- .../object-reference/schemas}/footer.yml | 30 +- .../schemas/forms-contact.yaml | 0 .../object-reference/schemas/forms.yml | 15 + .../object-reference/schemas}/head.yml | 42 +- .../object-reference/schemas/is-ajax.yml | 14 +- .../object-reference/schemas}/order.yml | 858 +-- .../object-reference/schemas/page-type.yml | 114 +- .../object-reference/schemas}/page.yml | 80 +- .../object-reference/schemas}/pages.yml | 48 +- .../object-reference/schemas}/pagination.yml | 74 +- .../object-reference/schemas}/price.yml | 18 +- .../schemas/product-results.yaml | 0 .../object-reference/schemas}/product.yml | 416 +- .../object-reference/schemas}/products.yml | 34 +- .../schemas/remote-api-scripts.yml | 0 .../object-reference/schemas}/settings.yml | 496 +- .../object-reference/schemas}/shipments.yml | 54 +- .../schemas/shipping-messages.yml | 8 +- .../schemas/shop-by-brand.yml | 46 +- .../object-reference/schemas}/sitemap.yml | 64 +- .../object-reference/schemas/social-media.yml | 40 +- .../schemas/template-file.yml | 4 +- .../schemas/theme-settings.yml | 1090 ++-- .../object-reference/schemas}/urls.yml | 262 +- .../object-reference/schemas}/vault.yml | 28 +- .../object-reference/schemas}/wishlist.yml | 260 +- .../themes/foundations/customizability.mdx} | 0 .../foundations}/directory-structure.mdx | 0 .../themes/foundations/global-styles.mdx} | 516 +- .../stencil/themes/foundations/react.mdx} | 0 .../themes/foundations/variations.mdx} | 246 +- .../stencil/themes/javascript/extend.mdx} | 2 +- .../stencil/themes/javascript/index.mdx} | 310 +- .../themes/localization/page-regions.mdx} | 0 .../localization/storefront-selector.mdx} | 2 +- .../stencil/themes/localization/stores.mdx} | 266 +- .../themes}/localization/translation-keys.mdx | 0 .../themes/localization/translations.mdx} | 0 .../stencil/themes/localization/tutorial.mdx} | 0 .../stencil/themes/style/assets.mdx} | 2 +- .../themes/style/composition-and-styling.mdx} | 0 .../stencil/themes/style/fonts-and-icons.mdx} | 0 .../stencil/themes/style/sass.mdx} | 0 .../templates/checkout-confirmation.mdx} | 496 +- .../stencil/themes/templates/disqus.mdx} | 0 .../themes/templates/dynamic-rendering.mdx} | 86 +- .../stencil/themes/templates/index.mdx} | 2 +- .../stencil/themes/templates/login.mdx} | 0 .../themes/templates/order-confirmation.mdx} | 0 .../stencil/utils/events.mdx} | 226 +- .../stencil/utils/queries.mdx} | 156 +- .../stencil/utils/reference.mdx} | 0 .../widgets/draft}/rendering-widgets.mdx | 0 .../widgets/examples.mdx} | 0 .../widgets/guide/global-regions.mdx} | 0 .../widgets/guide/graphql-templates.mdx} | 0 .../widgets/guide/index.mdx} | 0 .../widgets/guide/versioning.mdx} | 0 .../widgets/index.mdx} | 0 .../widgets/input-reference}/schema.json | 44 +- .../widgets/input-reference/schema.mdx} | 0 .../input-reference/settings/alignment.yaml} | 0 .../input-reference/settings/boolean.yaml} | 0 .../input-reference/settings/box-model.yaml} | 0 .../input-reference/settings/code.yaml} | 0 .../input-reference/settings/color.yaml} | 0 .../settings/element-settings.yaml} | 0 .../settings/image-manager.yaml} | 0 .../input-reference/settings/input.yaml} | 0 .../input-reference/settings/number.yaml} | 0 .../input-reference/settings/product-id.yaml} | 0 .../settings/product-image.yaml} | 0 .../input-reference/settings/range.yaml} | 0 .../settings/regex-input.yaml} | 0 .../input-reference/settings/select.yaml} | 0 .../input-reference/settings/text.yaml} | 0 .../input-reference/settings/typography.yaml} | 0 .../input-reference/settings/visibility.yaml} | 0 .../widgets/localization.mdx} | 0 .../storefront/widgets/widget-builder.mdx | 0 .../wordpress/content/gutenberg.mdx} | 56 +- .../wordpress/content}/shortcodes.mdx | 2 +- .../creating-reliable-cron-jobs.mdx} | 0 .../wordpress/deployment/index.mdx} | 0 .../wordpress/draft}/customization-guide.html | 0 .../wordpress/draft}/plugin-changelog.mdx | 0 .../wordpress/index.mdx} | 98 +- .../app-compatibility.mdx | 54 +- .../wordpress/platform-integration/code.mdx} | 20 +- .../platform-integration/enabling-amp.mdx} | 0 .../platform-integration/features.mdx} | 110 +- .../platform-integration/multi-channel.mdx} | 2 +- .../platform-integration}/product-import.mdx | 0 .../platform-integration/rest-proxy.mdx} | 56 +- .../unexpected-behavior.mdx} | 0 .../wordpress/start/index.mdx} | 0 .../wordpress/start}/multi-site.mdx | 0 .../wordpress/start}/plugin-settings.mdx | 0 .../wordpress/themes/index.mdx} | 0 .../webhooks/callbacks}/README.md | 62 +- .../webhooks/callbacks}/_all.yml | 1000 ++-- .../webhooks/callbacks}/data/list.txt | 84 +- .../data/store_app_uninstalled.json | 0 .../callbacks}/data/store_cart_abandoned.json | 24 +- .../callbacks}/data/store_cart_converted.json | 22 +- .../data/store_cart_couponApplied.json | 22 +- .../callbacks}/data/store_cart_created.json | 20 +- .../callbacks}/data/store_cart_deleted.json | 20 +- .../data/store_cart_lineItem_created.json | 22 +- .../data/store_cart_lineItem_deleted.json | 22 +- .../data/store_cart_lineItem_updated.json | 22 +- .../callbacks}/data/store_cart_updated.json | 20 +- .../data/store_category_created.json | 20 +- .../data/store_category_deleted.json | 20 +- .../data/store_category_updated.json | 20 +- .../data/store_customer_address_created.json | 26 +- .../data/store_customer_address_deleted.json | 26 +- .../data/store_customer_address_updated.json | 26 +- .../data/store_customer_created.json | 20 +- .../data/store_customer_deleted.json | 20 +- ...er_payment_instrument_default_updated.json | 20 +- .../data/store_customer_updated.json | 20 +- .../data/store_information_updated.json | 18 +- .../data/store_metafield_created.json | 0 .../callbacks}/data/store_order_archived.json | 20 +- .../callbacks}/data/store_order_created.json | 20 +- .../data/store_order_message_created.json | 26 +- .../data/store_order_refund_created.json | 26 +- .../data/store_order_statusUpdated.json | 28 +- .../callbacks}/data/store_order_updated.json | 20 +- .../data/store_product_created.json | 20 +- .../data/store_product_deleted.json | 20 +- ...store_product_inventory_order_updated.json | 30 +- .../data/store_product_inventory_updated.json | 30 +- .../data/store_product_updated.json | 20 +- .../data/store_shipment_created.json | 22 +- .../data/store_shipment_deleted.json | 22 +- .../data/store_shipment_updated.json | 22 +- .../callbacks}/data/store_sku_created.json | 28 +- .../callbacks}/data/store_sku_deleted.json | 28 +- .../store_sku_inventory_order_updated.json | 32 +- .../data/store_sku_inventory_updated.json | 32 +- .../callbacks}/data/store_sku_updated.json | 28 +- .../data/store_subscriber_created.json | 20 +- .../data/store_subscriber_deleted.json | 20 +- .../data/store_subscriber_updated.json | 20 +- .../callbacks}/store_app_uninstalled.yml | 46 +- .../store_brand_metafield_created.yml | 0 .../store_brand_metafield_deleted.yml | 0 .../store_brand_metafield_updated.yml | 0 .../callbacks}/store_cart_abandoned.yml | 52 +- .../callbacks}/store_cart_converted.yml | 52 +- .../callbacks}/store_cart_couponApplied.yml | 52 +- .../callbacks}/store_cart_created.yml | 60 +- .../callbacks}/store_cart_deleted.yml | 60 +- .../store_cart_lineItem_created.yml | 52 +- .../store_cart_lineItem_deleted.yml | 52 +- .../store_cart_lineItem_updated.yml | 52 +- .../store_cart_metafield_created.yml | 0 .../store_cart_metafield_deleted.yml | 0 .../store_cart_metafield_updated.yml | 0 .../callbacks}/store_cart_updated.yml | 68 +- .../callbacks}/store_category_created.yml | 48 +- .../callbacks}/store_category_deleted.yml | 48 +- .../store_category_metafield_created.yml | 0 .../store_category_metafield_deleted.yml | 0 .../store_category_metafield_updated.yml | 0 .../callbacks}/store_category_updated.yml | 48 +- .../store_channel_metafield_created.yml | 0 .../store_channel_metafield_deleted.yml | 0 .../store_channel_metafield_updated.yml | 0 .../store_customer_address_created.yml | 58 +- .../store_customer_address_deleted.yml | 58 +- .../store_customer_address_updated.yml | 58 +- .../callbacks}/store_customer_created.yml | 48 +- .../callbacks}/store_customer_deleted.yml | 48 +- ...mer_payment_instrument_default_updated.yml | 48 +- .../callbacks}/store_customer_updated.yml | 58 +- .../callbacks}/store_information_updated.yml | 44 +- .../store_inventory_location_created.yml | 0 ...e_inventory_location_metafield_created.yml | 0 ...e_inventory_location_metafield_deleted.yml | 0 ...e_inventory_location_metafield_updated.yml | 0 .../store_inventory_location_updated.yml | 0 .../callbacks}/store_metafield_created.yml | 0 .../callbacks}/store_metafield_deleted.yml | 0 .../callbacks}/store_metafield_updated.yml | 0 .../callbacks}/store_modifier_updated.yml | 0 .../callbacks}/store_option_updated.yml | 0 .../callbacks}/store_order_archived.yml | 48 +- .../callbacks}/store_order_created.yml | 48 +- .../store_order_message_created.yml | 58 +- .../store_order_metafield_created.yml | 0 .../store_order_metafield_deleted.yml | 0 .../store_order_metafield_updated.yml | 0 .../callbacks}/store_order_refund_created.yml | 58 +- .../callbacks}/store_order_statusUpdated.yml | 62 +- .../store_order_transaction_created.yml | 0 .../store_order_transaction_updated.yml | 0 .../callbacks}/store_order_updated.yml | 48 +- .../callbacks}/store_product_created.yml | 48 +- .../callbacks}/store_product_deleted.yml | 48 +- .../store_product_inventory_order_updated.yml | 72 +- .../store_product_inventory_updated.yml | 76 +- .../store_product_metafield_created.yml | 0 .../store_product_metafield_deleted.yml | 0 .../store_product_metafield_updated.yml | 0 .../callbacks}/store_product_updated.yml | 82 +- .../callbacks}/store_shipment_created.yml | 52 +- .../callbacks}/store_shipment_deleted.yml | 52 +- .../callbacks}/store_shipment_updated.yml | 52 +- .../webhooks/callbacks}/store_sku_created.yml | 62 +- .../webhooks/callbacks}/store_sku_deleted.yml | 62 +- .../store_sku_inventory_order_updated.yml | 76 +- .../store_sku_inventory_updated.yml | 80 +- .../webhooks/callbacks}/store_sku_updated.yml | 62 +- .../callbacks}/store_subscriber_created.yml | 48 +- .../callbacks}/store_subscriber_deleted.yml | 48 +- .../callbacks}/store_subscriber_updated.yml | 48 +- .../store_variant_metafield_created.yml | 0 .../store_variant_metafield_deleted.yml | 0 .../store_variant_metafield_updated.yml | 0 models/_root/forms.yml | 15 - models/theme_objects/_all.yml | 98 - package.json | 2 +- reference/carts.sf.yml | 2 +- reference/carts.v3.yml | 2 +- reference/channels.v3.yml | 6 +- reference/checkouts.sf.yml | 4 +- reference/checkouts.v3.yml | 2 +- reference/inventory.v3.yml | 743 +++ reference/locations.v3.yml | 1900 +++++++ reference/orders.sf.yml | 2 +- reference/orders.v2.oas2.yml | 2 +- reference/pickup.v3.yml | 405 ++ reference/pickup_methods.v3.yml | 402 ++ reference/pickup_options.sf.yml | 175 + reference/pickup_options.v3.yml | 213 + reference/promotions.v3.yml | 1678 ++++++ 602 files changed, 45983 insertions(+), 19630 deletions(-) rename {docs/legacy/stencil-themes => archive/draft}/installing-legacy-theme-modules.mdx (97%) rename {docs/api-docs/getting-started => archive/start}/making-requests.mdx (100%) rename docs/api-docs/partner/dev-portal-overview.mdx => archive/start/partner/developer-portal.mdx (100%) rename docs/api-docs/partner/resources.mdx => archive/start/partner/developer-resources.mdx (100%) rename {docs/api-docs => archive/start}/partner/staying-current.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-brands.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-bulk-pricing.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-categories.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-custom-fields.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-option-set-options.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-option-sets.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-option-values.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-options.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-images.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-options.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-reviews.mdx (98%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-rules.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-sku.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-product-videos.mdx (100%) rename {docs/legacy => archive/store-operations}/v2-catalog-products/v2-products.mdx (100%) rename docs/legacy/v2-products/v2-v3.mdx => archive/store-operations/v2-products/v2-versus-v3.mdx (99%) rename docs/legacy/blueprint-reference/blueprint-layouts.mdx => archive/storefront/blueprint/reference/layouts.mdx (100%) rename docs/legacy/blueprint-reference/blueprint-panels.mdx => archive/storefront/blueprint/reference/panels.mdx (100%) rename docs/legacy/blueprint-reference/blueprint-snippets.mdx => archive/storefront/blueprint/reference/snippets.mdx (100%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/anatomy-of-a-theme.mdx (100%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/blueprint-and-developer-mode.mdx (100%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/checkout-styling.mdx (97%) rename docs/legacy/blueprint-themes/blueprint-email-templates.mdx => archive/storefront/blueprint/themes/email-templates.mdx (98%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/global-variables.mdx (97%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/lng-variables.mdx (98%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/product-filtering-toolkit.mdx (98%) rename docs/legacy/blueprint-themes/recaptcha-two.mdx => archive/storefront/blueprint/themes/recaptcha-v2.mdx (97%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/store-wide-global-panels.mdx (98%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/store-wide-global-variables.mdx (98%) rename {docs/legacy/blueprint-themes => archive/storefront/blueprint/themes}/style-editor.mdx (98%) rename docs/legacy/blueprint-themes/blueprint-template-syntax.mdx => archive/storefront/blueprint/themes/template-syntax.mdx (97%) rename docs/legacy/blueprint-themes/blueprint-theme-update-process.mdx => archive/storefront/blueprint/themes/theme-update-process.mdx (97%) rename docs/legacy/storefronts/nextjs-commerce-guide.mdx => archive/storefront/nextjs-commerce.mdx (100%) rename {docs/stencil-docs/developing-further => archive/storefront/stencil}/google-analytics-enhanced-ecommerce.mdx (98%) rename {docs/legacy/stencil-themes => archive/storefront/stencil}/stored-credit-card-management.mdx (98%) rename docs/stencil-docs/getting-started/transitioning-to-stencil.mdx => archive/storefront/stencil/transitioning.mdx (98%) rename docs/{api-docs/users => graphql-account/draft}/Account-level-API-accounts.mdx (100%) rename docs/{api-docs/users/overview.mdx => graphql-account/users.mdx} (100%) create mode 100644 docs/integrations/apps/app-extensions/glossary.mdx create mode 100644 docs/integrations/apps/app-extensions/guide.mdx create mode 100644 docs/integrations/apps/app-extensions/index.mdx create mode 100644 docs/integrations/apps/app-extensions/postman.mdx rename docs/{api-docs/apps/guide/apps-05-oauth.mdx => integrations/apps/guide/auth.mdx} (100%) rename docs/{api-docs/apps/guide/apps-11-best-practices.mdx => integrations/apps/guide/best-practices.mdx} (100%) rename docs/{api-docs/apps/guide/apps-10-buttons.mdx => integrations/apps/guide/buttons.mdx} (100%) rename docs/{api-docs/apps/guide/apps-06-callbacks.mdx => integrations/apps/guide/callbacks.mdx} (100%) rename docs/{api-docs/apps/guide/apps-04-devloper-portal.mdx => integrations/apps/guide/developer-portal.mdx} (96%) rename docs/{api-docs/apps/guide/apps-08-events.mdx => integrations/apps/guide/events.mdx} (100%) rename docs/{api-docs/apps/apps-id.mdx => integrations/apps/guide/id.mdx} (100%) rename docs/{api-docs/apps/guide/apps-03-developing.mdx => integrations/apps/guide/index.mdx} (100%) rename docs/{api-docs/apps/guide/apps-13-publishing.mdx => integrations/apps/guide/publishing.mdx} (100%) rename docs/{api-docs/apps/guide/apps-12-requirements.mdx => integrations/apps/guide/requirements.mdx} (100%) rename docs/{api-docs/apps/guide/apps-02-types.mdx => integrations/apps/guide/types.mdx} (100%) rename docs/{api-docs/apps/guide/apps-09-ui.mdx => integrations/apps/guide/ui.mdx} (100%) rename docs/{api-docs/apps/guide/apps-07-users.mdx => integrations/apps/guide/users.mdx} (100%) rename docs/{api-docs/apps/guide/apps-01-introduction.mdx => integrations/apps/index.mdx} (100%) rename docs/{msf/msf-app-compatibility.mdx => integrations/apps/multi-storefront.mdx} (100%) rename docs/{api-docs/apps/apps-quick-start.mdx => integrations/apps/quick-start.mdx} (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/introduction.mdx => integrations/apps/tutorial/index.mdx} (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx => integrations/apps/tutorial/nextjs-connect.mdx} (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx => integrations/apps/tutorial/nextjs-enhance.mdx } (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx => integrations/apps/tutorial/nextjs-integrate.mdx} (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx => integrations/apps/tutorial/nextjs-quick-start.mdx} (100%) rename docs/{api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx => integrations/apps/tutorial/nextjs-setup.mdx} (100%) create mode 100644 docs/integrations/buy-online-pick-up-in-store/api-guide.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/draft/catalog.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/draft/get-locations.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/draft/inventory-by-location.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/draft/partner-integration-guide/add-to-cart.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/fulfillment.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/orders.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/overview.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/retirement.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/shopping.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/glossary.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/guide/add-to-cart.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/guide/checkout.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/guide/orders.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/guide/storefront.mdx create mode 100644 docs/integrations/buy-online-pick-up-in-store/index.mdx rename docs/{api-docs/partner/pos => integrations/channels/draft}/channels-pos-tutorial.mdx (99%) rename docs/{api-docs/channels/channel-app-best-practices.mdx => integrations/channels/guide/best-practices.mdx} (100%) rename docs/{api-docs/channels/channels-extending-existing.mdx => integrations/channels/guide/extending-existing-apps.mdx} (100%) rename docs/{api-docs/channels/building-channel-apps.mdx => integrations/channels/guide/index.mdx} (100%) rename docs/{api-docs/channels/channel-app-requirements.mdx => integrations/channels/guide/requirements.mdx} (100%) rename docs/{api-docs/channels/channels-storefront-tutorial.mdx => integrations/channels/guide/storefronts.mdx} (100%) rename docs/{api-docs/channels/channels-overview.mdx => integrations/channels/index.mdx} (100%) rename docs/{api-docs/channels/channels-quick-start.mdx => integrations/channels/quick-start.mdx} (100%) rename docs/{api-docs/channels/channels-toolkit-reference.mdx => integrations/channels/toolkit-reference.mdx} (91%) rename docs/{api-docs/analytics/bodl-for-storefronts.mdx => integrations/hosted-analytics.mdx} (91%) rename docs/{api-docs/partner/pos/foundation-guide.mdx => integrations/point-of-sale.mdx} (100%) rename docs/{api-docs/storefront/scripts-overview.mdx => integrations/scripts.mdx} (100%) rename docs/{api-docs/store-management/shipping/shipping-provider-api.mdx => integrations/shipping.mdx} (100%) rename docs/{api-docs/staging/staging-pro-overview.mdx => integrations/staging-pro.mdx} (100%) rename docs/{api-docs/partner/subscriptions/foundation-guide.mdx => integrations/subscriptions.mdx} (100%) rename docs/{api-docs/provider-apis/tax/overview.mdx => integrations/tax.mdx} (100%) rename docs/{api-docs/channels/channel-webhooks.mdx => integrations/webhooks/events/channels.mdx} (100%) rename docs/{api-docs/webhooks/webhook-events.mdx => integrations/webhooks/events/index.mdx} (100%) create mode 100644 docs/integrations/webhooks/events/inventory-location.mdx rename docs/{api-docs/webhooks/about-webhooks.mdx => integrations/webhooks/overview.mdx} (100%) rename docs/{api-docs/webhooks/setting-up-webhooks.mdx => integrations/webhooks/tutorial.mdx} (100%) rename docs/{api-docs/getting-started/filtering.mdx => start/about/common-query-params.mdx} (100%) rename docs/{api-docs/getting-started/about-our-api.mdx => start/about/index.mdx} (100%) rename docs/{api-docs/partner/create-a-sandbox.mdx => start/about/sandboxes.mdx} (100%) rename docs/{api-docs/getting-started/api-status-codes.mdx => start/about/status-codes.mdx} (100%) rename docs/{api-docs/partner => start/about}/support.mdx (100%) rename docs/{api-docs/getting-started/rest-api-authentication.mdx => start/authentication/api-accounts.mdx} (100%) rename docs/{api-docs/customers/current-customer-api.mdx => start/authentication/current-customer.mdx} (98%) rename docs/{api-docs/customers/customer-login-api.mdx => start/authentication/customer-login.mdx} (97%) rename docs/{api-docs/getting-started/authentication.mdx => start/authentication/index.mdx} (100%) rename docs/{api-docs/customers => start/authentication}/passwordless-login.mdx (97%) rename docs/{api-docs/getting-started/best-practices.mdx => start/best-practices/index.mdx} (98%) rename docs/{api-docs/getting-started => start/best-practices}/integration-design.mdx (99%) rename docs/{api-docs/getting-started/deprecations-and-sunsets.mdx => start/best-practices/sunsets.mdx} (100%) rename docs/{api-docs/partner => start/draft}/marketing-api-overview.mdx (100%) rename docs/start/{introduction-to-bigcommerce.mdx => intro-to-bigcommerce.mdx} (100%) rename docs/{api-docs/partner/becoming-a-partner.mdx => start/partner.mdx} (100%) rename docs/{api-docs/management-apis => store-operations/catalog}/contextual-filters.mdx (100%) create mode 100644 docs/store-operations/catalog/graphql-admin/product-attributes.mdx create mode 100644 docs/store-operations/catalog/graphql-admin/product-basic-info.mdx create mode 100644 docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx create mode 100644 docs/store-operations/catalog/graphql-admin/product-seo-info.mdx create mode 100644 docs/store-operations/catalog/graphql-admin/product-url.mdx create mode 100644 docs/store-operations/catalog/graphql-admin/product-variant-options.mdx rename docs/{api-docs/catalog/products-overview.mdx => store-operations/catalog/index.mdx} (100%) create mode 100644 docs/store-operations/catalog/inventory-adjustments.mdx create mode 100644 docs/store-operations/catalog/inventory-locations.mdx rename docs/{api-docs/catalog/v2-v3-examples.mdx => store-operations/catalog/migration/guide.mdx} (100%) rename docs/{api-docs/catalog/v2-vs-v3.mdx => store-operations/catalog/migration/index.mdx} (100%) create mode 100644 docs/store-operations/catalog/msf-international-enhancements.mdx rename docs/{api-docs/catalog/currencies/how-currencies-work.mdx => store-operations/currencies/guide.mdx} (100%) rename docs/{api-docs/catalog/currencies/currencies-overview.mdx => store-operations/currencies/index.mdx} (98%) rename docs/{api-docs => store-operations}/customers/channel-specific-customers.mdx (100%) rename docs/{api-docs/customers/customers-subscribers-overview.mdx => store-operations/customers/index.mdx} (97%) rename docs/{api-docs => store-operations/draft}/capture/capture.mdx (100%) rename docs/{api-docs => store-operations/draft}/void/void.mdx (100%) rename docs/{api-docs/management-apis/email-templates/email-template-examples.mdx => store-operations/emails/examples.mdx} (100%) rename docs/{api-docs/management-apis/email-templates/overview.mdx => store-operations/emails/index.mdx} (100%) rename {models/email_templates/combined => docs/store-operations/emails/object-reference}/README.md (100%) rename models/email_templates/combined/abandoned_cart_email_deprecated.yml => docs/store-operations/emails/object-reference/abandoned-cart-deprecated.yml (100%) rename models/email_templates/combined/abandoned_cart_email.yml => docs/store-operations/emails/object-reference/abandoned-cart.yml (100%) rename models/email_templates/combined/account_details_changed_email.yml => docs/store-operations/emails/object-reference/account-details-changed.yml (100%) rename models/email_templates/combined/account_reset_password_email.yml => docs/store-operations/emails/object-reference/account-reset-password.yml (100%) rename models/email_templates/combined/combined_order_status_email.yml => docs/store-operations/emails/object-reference/combined-order-status.yml (100%) rename models/email_templates/combined/create_account_email.yml => docs/store-operations/emails/object-reference/create-account.yml (100%) rename models/email_templates/combined/create_guest_account_email.yml => docs/store-operations/emails/object-reference/create-guest-account.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/abandoned_cart_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/account_details_changed_email.json (100%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/account_reset_password_email.json (100%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/combined_order_status_email.json (100%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/create_account_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/create_guest_account_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/gift_certificate_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/global.json (95%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/invoice_email.json (96%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/order_message_notification.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/passwordless_login_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/product_review_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/return_confirmation_email.json (96%) rename {models/email_templates => docs/store-operations/emails/object-reference}/data/return_status_change_email.json (97%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/README.md (97%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/_all.yml (96%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/abandoned_cart_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/account_details_changed_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/account_reset_password_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/combined_order_status_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/create_account_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/create_guest_account_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/gift_certificate_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/global.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/invoice_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/order_message_notification.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/passwordless_login_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/product_review_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/return_confirmation_email.yml (100%) rename {models/email_templates => docs/store-operations/emails/object-reference/draft}/return_status_change_email.yml (100%) rename models/email_templates/combined/gift_certificate_email.yml => docs/store-operations/emails/object-reference/gift-certificate.yml (100%) rename models/email_templates/combined/global.yml => docs/store-operations/emails/object-reference/global-email-object.yml (100%) rename models/email_templates/combined/invoice_email.yml => docs/store-operations/emails/object-reference/invoice.yml (100%) rename models/email_templates/combined/order_message_notification.yml => docs/store-operations/emails/object-reference/order-message-notification.yml (100%) rename models/email_templates/combined/passwordless_login_email.yml => docs/store-operations/emails/object-reference/passwordless-login.yml (100%) rename models/email_templates/combined/product_review_email.yml => docs/store-operations/emails/object-reference/product-review.yml (100%) rename models/email_templates/combined/return_confirmation_email.yml => docs/store-operations/emails/object-reference/return-confirmation.yml (100%) rename models/email_templates/combined/return_status_change_email.yml => docs/store-operations/emails/object-reference/return-status-change.yml (100%) rename docs/{api-docs/orders/orders-api-overview.mdx => store-operations/orders/index.mdx} (100%) rename docs/{stencil-docs/developing-further/customizing-invoices.mdx => store-operations/orders/invoice-templates.mdx} (98%) rename docs/{api-docs/orders/order-refunds.mdx => store-operations/orders/refunds.mdx} (100%) rename docs/{api-docs/payments/payments-api-overview.mdx => store-operations/payments/index.mdx} (99%) rename docs/{api-docs/catalog/pricing-order-operation.mdx => store-operations/pricing/calculations.mdx} (98%) rename docs/{api-docs/catalog/price-list-overview.mdx => store-operations/pricing/price-lists.mdx} (98%) create mode 100644 docs/store-operations/promotions/api-ui-features.mdx create mode 100644 docs/store-operations/promotions/currency-specific-promotions.mdx create mode 100644 docs/store-operations/promotions/examples/brand.mdx create mode 100644 docs/store-operations/promotions/examples/category.mdx create mode 100644 docs/store-operations/promotions/examples/customer.mdx create mode 100644 docs/store-operations/promotions/examples/logical-operators.mdx create mode 100644 docs/store-operations/promotions/examples/multiple-rules.mdx create mode 100644 docs/store-operations/promotions/examples/order.mdx create mode 100644 docs/store-operations/promotions/examples/product.mdx create mode 100644 docs/store-operations/promotions/examples/shipping.mdx create mode 100644 docs/store-operations/promotions/examples/storewide.mdx create mode 100644 docs/store-operations/promotions/index.mdx create mode 100644 docs/store-operations/promotions/multi-currency.mdx rename docs/{msf/managing-store-configuration.mdx => store-operations/settings/configuration.mdx} (100%) rename docs/{api-docs/analytics/data-layer-api.mdx => store-operations/settings/data.mdx} (98%) rename docs/{api-docs/store-logs/store-logs.mdx => store-operations/settings/logs.mdx} (100%) rename docs/{api-docs/store-management/shipping/shipping-overview.mdx => store-operations/shipping/index.mdx} (100%) rename docs/{stencil-docs/developing-further/customizing-printable-packing-slips.mdx => store-operations/shipping/packing-slips.mdx} (98%) rename docs/{api-docs/store-management => store-operations}/shipping/shipper-hq.mdx (100%) rename docs/{api-docs/tax/tax-settings.mdx => store-operations/tax/index.mdx} (100%) rename docs/{api-docs => store-operations}/tax/tax-properties.mdx (100%) rename docs/{api-docs => store-operations}/tax/tax-rates-zones.mdx (100%) rename docs/{stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx => storefront/cart-checkout/checkout-sdk/index.mdx} (94%) rename docs/{stencil-docs/customizing-checkout/checkout-sdk-example.mdx => storefront/cart-checkout/checkout-sdk/tutorial.mdx} (100%) rename docs/{api-docs/cart-and-checkout => storefront/cart-checkout/draft}/channels-sites-routes.mdx (100%) rename docs/{api-docs/cart-and-checkout => storefront/cart-checkout/draft}/checkout-sdk.mdx (100%) rename docs/{api-docs/cart-and-checkout/embedded-checkout-overview.mdx => storefront/cart-checkout/embedded-checkout/index.mdx} (100%) rename docs/{api-docs/cart-and-checkout/embedded-checkout-tutorial.mdx => storefront/cart-checkout/embedded-checkout/tutorial.mdx} (99%) rename docs/{api-docs/cart-and-checkout => storefront/cart-checkout/guide}/add-to-cart-url.mdx (98%) rename docs/{api-docs/building-checkouts/checkout-consignment.mdx => storefront/cart-checkout/guide/consignments.mdx} (100%) rename docs/{api-docs/storefront/graphql/graphql-carts-and-checkout.mdx => storefront/cart-checkout/guide/graphql-storefront.mdx} (100%) rename docs/{api-docs/cart-and-checkout/cart-and-checkout-overview.mdx => storefront/cart-checkout/guide/rest-management.mdx} (100%) rename docs/{api-docs/cart-and-checkout/working-sf-apis.mdx => storefront/cart-checkout/guide/rest-storefront.mdx} (100%) rename docs/{api-docs/building-checkouts/checkout-customizability.mdx => storefront/cart-checkout/index.mdx} (100%) rename docs/{stencil-docs/localization/multi-language-checkout.mdx => storefront/cart-checkout/localization.mdx} (98%) rename docs/{stencil-docs/customizing-checkout/open-source-checkout.mdx => storefront/cart-checkout/open-checkouts/guide.mdx} (100%) rename docs/{stencil-docs/customizing-checkout/open-checkout-quick-start.mdx => storefront/cart-checkout/open-checkouts/index.mdx} (100%) rename docs/{stencil-docs/customizing-checkout => storefront/cart-checkout}/optimized-one-page-checkout.mdx (98%) create mode 100644 docs/storefront/graphql/customers.mdx rename docs/{api-docs/storefront/graphql/graphql-api-examples.mdx => storefront/graphql/examples/index.mdx} (100%) rename docs/{api-docs/storefront/graphql/graphql-products.mdx => storefront/graphql/examples/products.mdx} (100%) rename docs/{api-docs/storefront/graphql/graphql-variants.mdx => storefront/graphql/examples/variants.mdx} (100%) rename docs/{api-docs/storefront/graphql/graphql-api-overview.mdx => storefront/graphql/index.mdx} (99%) create mode 100644 docs/storefront/graphql/inventory/queries.mdx create mode 100644 docs/storefront/graphql/inventory/settings.mdx create mode 100644 docs/storefront/graphql/locations/queries.mdx create mode 100644 docs/storefront/graphql/locations/settings.mdx rename docs/{api-docs/storefront/graphql/graphql-product-reviews.mdx => storefront/graphql/product-reviews.mdx} (100%) rename docs/{api-docs/building-storefronts => storefront/headless/cart-checkout}/abandoned-carts.mdx (100%) rename docs/{api-docs/headless => storefront/headless/cart-checkout}/carts.mdx (100%) rename docs/{api-docs/headless => storefront/headless/cart-checkout}/checkout.mdx (100%) rename docs/{api-docs => storefront}/headless/channels.mdx (100%) rename docs/{api-docs => storefront}/headless/customers.mdx (100%) rename docs/{api-docs => storefront}/headless/end-to-end-guides/graphql-storefront.mdx (100%) rename docs/{api-docs => storefront}/headless/end-to-end-guides/rest-management.mdx (99%) rename docs/{api-docs/headless/overview.mdx => storefront/headless/index.mdx} (100%) rename docs/{api-docs => storefront}/headless/orders.mdx (100%) rename docs/{api-docs => storefront}/headless/pci-compliance.mdx (100%) rename docs/{api-docs/storefront/graphql/graphql-faceted-textual-search.mdx => storefront/headless/products/faceted-textual-search.mdx} (100%) rename docs/{api-docs/headless/products.mdx => storefront/headless/products/index.mdx} (100%) rename docs/{api-docs/storefront/graphql/graphql-site-content.mdx => storefront/headless/site-content.mdx} (100%) rename docs/{msf/msf-api-guide.mdx => storefront/multi-storefront/guide.mdx} (100%) rename docs/{msf/msf-overview.mdx => storefront/multi-storefront/index.mdx} (100%) rename docs/{api-docs/building-storefronts/nextjs-bigcommerce.mdx => storefront/next-commerce.mdx} (100%) rename docs/{stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx => storefront/stencil/cli/development-server.mdx} (98%) rename docs/{stencil-docs/installing-stencil-cli => storefront/stencil/cli}/incompatible-directives.mdx (100%) rename docs/{stencil-docs/installing-stencil-cli/installing-stencil.mdx => storefront/stencil/cli/install.mdx} (97%) rename docs/{stencil-docs/installing-stencil-cli => storefront/stencil/cli}/node-sass.mdx (100%) rename docs/{stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx => storefront/stencil/cli/options-and-commands.mdx} (100%) rename docs/{stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx => storefront/stencil/cli/unexpected-behavior.mdx} (100%) rename docs/{stencil-docs/page-builder/page-builder-overview.mdx => storefront/stencil/content/page-builder.mdx} (100%) rename docs/{stencil-docs/developing-further/add-recaptcha-v2.mdx => storefront/stencil/content/recaptcha.mdx} (98%) rename docs/{stencil-docs/page-builder/third-party-widgets.mdx => storefront/stencil/content/widgets.mdx} (100%) rename docs/{stencil-docs/storefront-customization => storefront/stencil/deployment}/early-hints.mdx (100%) rename docs/{stencil-docs/deploying-a-theme/theme-best-practices.mdx => storefront/stencil/deployment/performance-optimization.mdx} (97%) rename docs/{stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx => storefront/stencil/deployment/theme-images.mdx} (97%) rename docs/{stencil-docs/deploying-a-theme/checking-a-themes-size.mdx => storefront/stencil/deployment/theme-size.mdx} (98%) rename docs/{stencil-docs/developing-further/theme-updates-and-version-control.mdx => storefront/stencil/deployment/updates-and-version-control.mdx} (98%) rename docs/{stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx => storefront/stencil/deployment/upload-errors.mdx} (100%) rename docs/{stencil-docs/deploying-a-theme/bundling-and-pushing.mdx => storefront/stencil/deployment/upload.mdx} (98%) rename docs/{stencil-docs/developing-further => storefront/stencil/draft}/customizing-emails.mdx (100%) rename docs/{stencil-docs/configure-store-design-ui => storefront/stencil/draft}/defining-ui-options.mdx (100%) rename docs/{stencil-docs/javascript-and-event-hooks => storefront/stencil/draft}/dynamic-content-rendering.mdx (100%) rename docs/{stencil-docs => storefront/stencil/draft}/reference-docs/common-objects.mdx (100%) rename docs/{stencil-docs => storefront/stencil/draft}/reference-docs/global-objects-and-properties.mdx (98%) rename docs/{stencil-docs => storefront/stencil/draft}/reference-docs/other-objects-and-properties-overview.mdx (100%) rename docs/{stencil-docs => storefront/stencil/draft}/reference-docs/styles-and-properties.mdx (100%) rename docs/{stencil-docs => storefront/stencil/draft}/reference-docs/theme-objects.mdx (100%) rename docs/{stencil-docs/configure-store-design-ui => storefront/stencil/draft}/store-design-overview.mdx (94%) rename docs/{stencil-docs/getting-started/about-stencil.mdx => storefront/stencil/start/index.mdx} (98%) rename docs/{stencil-docs/getting-started/stencil-technology-stack.mdx => storefront/stencil/start/tech-stack.mdx} (98%) rename docs/{stencil-docs/storefront-customization/implementing-WCAG-guidelines.mdx => storefront/stencil/themes/accessibility/implementing-wcag-guidelines.mdx} (100%) rename docs/{stencil-docs/storefront-customization/theme-accessibility.mdx => storefront/stencil/themes/accessibility/index.mdx} (100%) rename docs/{stencil-docs/storefront-customization/WCAG-compliance-levels.mdx => storefront/stencil/themes/accessibility/wcag-compliance-levels.mdx} (100%) rename docs/{stencil-docs/customizing-checkout => storefront/stencil/themes/checkout-enhancements}/paypal-smart-buttons.mdx (97%) rename docs/{stencil-docs/developing-further/stored-credit-card-management.mdx => storefront/stencil/themes/checkout-enhancements/stored-payment-methods.mdx} (97%) rename docs/{stencil-docs/page-builder => storefront/stencil/themes/checkout-enhancements}/wallet-buttons.mdx (100%) rename docs/{stencil-docs/developing-further => storefront/stencil/themes/context}/catalog-price-object.mdx (97%) rename docs/{stencil-docs/reference-docs/front-matter-reference.mdx => storefront/stencil/themes/context/frontmatter-reference.mdx} (100%) rename docs/{stencil-docs/storefront-customization/using-front-matter.mdx => storefront/stencil/themes/context/frontmatter.mdx} (100%) rename docs/{stencil-docs/reference-docs/handlebars-helpers-reference.mdx => storefront/stencil/themes/context/handlebars-reference.mdx} (97%) rename {configuration => docs/storefront/stencil/themes/context/object-reference}/config.yml (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/checkbox.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/color.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/font.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/heading.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/imageDimension.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/optimizedCheckout-image.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/reference.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/select.mdx (100%) rename {theme-styles/_root => docs/storefront/stencil/themes/context/object-reference/elements}/text.mdx (100%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/blog/posts.yml (89%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/cart/cartItems.yml (94%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/cart/cartStatusMessage.yml (94%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/category/shop_by_price.yml (96%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/common/amount.yml (96%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/common/image.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/common/price.yml (77%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/common/product.yml (87%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/addresses.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/orders.yml (84%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/payment_methods.yml (96%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/returns.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/shipping_addresses.yml (96%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/customer/wishlists.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/address.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/contact.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/create_account.yml (98%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/edit_account.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/gift_certificate.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/login.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/provider.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/return.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/forms/wishlist.yml (97%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/custom_fields.yml (100%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/options.yml (100%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/price.yml (55%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/related_products.yml (95%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/reviews.yml (94%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/similar_by_views.yml (100%) rename {models => docs/storefront/stencil/themes/context/object-reference/helpers}/product/videos.yml (95%) create mode 100644 docs/storefront/stencil/themes/context/object-reference/helpers/theme_objects/_all.yml rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/banners.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/blog.yml (87%) rename models/_root/brand_results.yaml => docs/storefront/stencil/themes/context/object-reference/schemas/brand-results.yaml (100%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/brand.yml (89%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/brands.yml (77%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/breadcrumbs.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/carousel.yml (96%) rename models/_root/cart_id.yml => docs/storefront/stencil/themes/context/object-reference/schemas/cart-id.yml (97%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/cart.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/categories.yml (90%) rename models/_root/category_results.yaml => docs/storefront/stencil/themes/context/object-reference/schemas/category-results.yaml (100%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/category.yml (95%) create mode 100644 docs/storefront/stencil/themes/context/object-reference/schemas/checkout.yml rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/comparisons.yml (95%) rename models/_root/content_results.yaml => docs/storefront/stencil/themes/context/object-reference/schemas/content-results.yaml (100%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/countries.yml (96%) rename models/_root/create_account.yml => docs/storefront/stencil/themes/context/object-reference/schemas/create-account.yml (97%) rename models/_root/currency_selector.yml => docs/storefront/stencil/themes/context/object-reference/schemas/currency-selector.yml (96%) rename models/_root/customer_group_id.yml => docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-id.yml (97%) rename models/_root/customer_group_name.yml => docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-name.yml (97%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/customer.yml (84%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/downloads.yml (96%) rename models/_root/faceted_search.yml => docs/storefront/stencil/themes/context/object-reference/schemas/faceted-search.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/footer.yml (96%) rename models/_root/forms_contact.yaml => docs/storefront/stencil/themes/context/object-reference/schemas/forms-contact.yaml (100%) create mode 100644 docs/storefront/stencil/themes/context/object-reference/schemas/forms.yml rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/head.yml (96%) rename models/_root/is_ajax.yml => docs/storefront/stencil/themes/context/object-reference/schemas/is-ajax.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/order.yml (95%) rename models/_root/page_type.yml => docs/storefront/stencil/themes/context/object-reference/schemas/page-type.yml (95%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/page.yml (95%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/pages.yml (95%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/pagination.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/price.yml (55%) rename models/_root/product_results.yaml => docs/storefront/stencil/themes/context/object-reference/schemas/product-results.yaml (100%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/product.yml (93%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/products.yml (71%) rename models/_root/remote_api_scripts.yml => docs/storefront/stencil/themes/context/object-reference/schemas/remote-api-scripts.yml (100%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/settings.yml (97%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/shipments.yml (96%) rename models/_root/shipping_messages.yml => docs/storefront/stencil/themes/context/object-reference/schemas/shipping-messages.yml (97%) rename models/_root/shop_by_brand.yml => docs/storefront/stencil/themes/context/object-reference/schemas/shop-by-brand.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/sitemap.yml (96%) rename models/_root/social_media.yml => docs/storefront/stencil/themes/context/object-reference/schemas/social-media.yml (97%) rename models/_root/template_file.yml => docs/storefront/stencil/themes/context/object-reference/schemas/template-file.yml (97%) rename models/_root/theme_settings.yml => docs/storefront/stencil/themes/context/object-reference/schemas/theme-settings.yml (95%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/urls.yml (95%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/vault.yml (96%) rename {models/_root => docs/storefront/stencil/themes/context/object-reference/schemas}/wishlist.yml (94%) rename docs/{stencil-docs/page-builder/configuration.mdx => storefront/stencil/themes/foundations/customizability.mdx} (100%) rename docs/{stencil-docs/storefront-customization => storefront/stencil/themes/foundations}/directory-structure.mdx (100%) rename docs/{stencil-docs/configure-store-design-ui/defining-global-styles.mdx => storefront/stencil/themes/foundations/global-styles.mdx} (97%) rename docs/{stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx => storefront/stencil/themes/foundations/react.mdx} (100%) rename docs/{stencil-docs/deploying-a-theme/naming-your-theme.mdx => storefront/stencil/themes/foundations/variations.mdx} (97%) rename docs/{stencil-docs/javascript-and-event-hooks/adding-javascript.mdx => storefront/stencil/themes/javascript/extend.mdx} (99%) rename docs/{stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx => storefront/stencil/themes/javascript/index.mdx} (97%) rename docs/{stencil-docs/localization/translating-regions.mdx => storefront/stencil/themes/localization/page-regions.mdx} (100%) rename docs/{stencil-docs/localization/msf-storefront-selector.mdx => storefront/stencil/themes/localization/storefront-selector.mdx} (99%) rename docs/{stencil-docs/localization/localizing-stores.mdx => storefront/stencil/themes/localization/stores.mdx} (97%) rename docs/{stencil-docs => storefront/stencil/themes}/localization/translation-keys.mdx (100%) rename docs/{stencil-docs/storefront-customization/localizing-variation-descriptions.mdx => storefront/stencil/themes/localization/translations.mdx} (100%) rename docs/{stencil-docs/localization/localization-tutorial.mdx => storefront/stencil/themes/localization/tutorial.mdx} (100%) rename docs/{stencil-docs/storefront-customization/theme-assets.mdx => storefront/stencil/themes/style/assets.mdx} (99%) rename docs/{stencil-docs/storefront-customization/page-composition-and-styling.mdx => storefront/stencil/themes/style/composition-and-styling.mdx} (100%) rename docs/{stencil-docs/storefront-customization/using-custom-fonts-and-icons.mdx => storefront/stencil/themes/style/fonts-and-icons.mdx} (100%) rename docs/{stencil-docs/storefront-customization/custom-sass-functions.mdx => storefront/stencil/themes/style/sass.mdx} (100%) rename docs/{stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx => storefront/stencil/themes/templates/checkout-confirmation.mdx} (96%) rename docs/{stencil-docs/storefront-customization/using-disqus.mdx => storefront/stencil/themes/templates/disqus.mdx} (100%) rename docs/{stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx => storefront/stencil/themes/templates/dynamic-rendering.mdx} (97%) rename docs/{stencil-docs/storefront-customization/custom-templates.mdx => storefront/stencil/themes/templates/index.mdx} (98%) rename docs/{stencil-docs/developing-further/modifying-forms.mdx => storefront/stencil/themes/templates/login.mdx} (100%) rename docs/{stencil-docs/customizing-checkout/custom-order-confirmation.mdx => storefront/stencil/themes/templates/order-confirmation.mdx} (100%) rename docs/{stencil-docs/javascript-and-event-hooks/event-hooks.mdx => storefront/stencil/utils/events.mdx} (97%) rename docs/{stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx => storefront/stencil/utils/queries.mdx} (97%) rename docs/{stencil-docs/reference-docs/stencil-utils-api-reference.mdx => storefront/stencil/utils/reference.mdx} (100%) rename docs/{api-docs/storefront/graphql => storefront/widgets/draft}/rendering-widgets.mdx (100%) rename docs/{api-docs/storefront/widgets/widgets-code-samples.mdx => storefront/widgets/examples.mdx} (100%) rename docs/{api-docs/storefront/widgets/global-regions-tutorial.mdx => storefront/widgets/guide/global-regions.mdx} (100%) rename docs/{api-docs/storefront/widgets/product-widget-tutorial.mdx => storefront/widgets/guide/graphql-templates.mdx} (100%) rename docs/{api-docs/storefront/widgets/widgets-tutorial.mdx => storefront/widgets/guide/index.mdx} (100%) rename docs/{api-docs/storefront/widgets/widget-versioning-tutorial.mdx => storefront/widgets/guide/versioning.mdx} (100%) rename docs/{api-docs/storefront/widgets/widgets-overview.mdx => storefront/widgets/index.mdx} (100%) rename docs/{api-docs/storefront/widgets => storefront/widgets/input-reference}/schema.json (96%) rename docs/{stencil-docs/page-builder/widget-ui-schema.mdx => storefront/widgets/input-reference/schema.mdx} (100%) rename docs/{stencil-docs/page-builder/widget_alignment.yaml => storefront/widgets/input-reference/settings/alignment.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_boolean.yaml => storefront/widgets/input-reference/settings/boolean.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_box_model.yaml => storefront/widgets/input-reference/settings/box-model.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_code.yaml => storefront/widgets/input-reference/settings/code.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_color.yaml => storefront/widgets/input-reference/settings/color.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_element_settings.yaml => storefront/widgets/input-reference/settings/element-settings.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_image_manager.yaml => storefront/widgets/input-reference/settings/image-manager.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_input.yaml => storefront/widgets/input-reference/settings/input.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_number.yaml => storefront/widgets/input-reference/settings/number.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_product_ID.yaml => storefront/widgets/input-reference/settings/product-id.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_product_image.yaml => storefront/widgets/input-reference/settings/product-image.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_range.yaml => storefront/widgets/input-reference/settings/range.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_regex_input.yaml => storefront/widgets/input-reference/settings/regex-input.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_select.yaml => storefront/widgets/input-reference/settings/select.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_text.yaml => storefront/widgets/input-reference/settings/text.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_typography.yaml => storefront/widgets/input-reference/settings/typography.yaml} (100%) rename docs/{stencil-docs/page-builder/widget_visibility.yaml => storefront/widgets/input-reference/settings/visibility.yaml} (100%) rename docs/{api-docs/storefront/widgets/widgets-localizing-settings.mdx => storefront/widgets/localization.mdx} (100%) rename docs/{api-docs => }/storefront/widgets/widget-builder.mdx (100%) rename docs/{bigcommerce-for-wordpress/getting-started/gutenberg-support.mdx => storefront/wordpress/content/gutenberg.mdx} (96%) rename docs/{bigcommerce-for-wordpress/setup => storefront/wordpress/content}/shortcodes.mdx (98%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/bigcommerce-for-wordpress-cron.mdx => storefront/wordpress/deployment/creating-reliable-cron-jobs.mdx} (100%) rename docs/{bigcommerce-for-wordpress/getting-started/site-launch-checklist.mdx => storefront/wordpress/deployment/index.mdx} (100%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin => storefront/wordpress/draft}/customization-guide.html (100%) rename docs/{bigcommerce-for-wordpress/changelog => storefront/wordpress/draft}/plugin-changelog.mdx (100%) rename docs/{bigcommerce-for-wordpress/getting-started/introduction.mdx => storefront/wordpress/index.mdx} (98%) rename docs/{bigcommerce-for-wordpress/getting-started => storefront/wordpress/platform-integration}/app-compatibility.mdx (98%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/code-reference.mdx => storefront/wordpress/platform-integration/code.mdx} (98%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/amp-for-the-plugin.mdx => storefront/wordpress/platform-integration/enabling-amp.mdx} (100%) rename docs/{bigcommerce-for-wordpress/getting-started/supported-features.mdx => storefront/wordpress/platform-integration/features.mdx} (97%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/multi-channel-capabilities.mdx => storefront/wordpress/platform-integration/multi-channel.mdx} (98%) rename docs/{bigcommerce-for-wordpress/setup => storefront/wordpress/platform-integration}/product-import.mdx (100%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/proxy-rest-api-endpoints.mdx => storefront/wordpress/platform-integration/rest-proxy.mdx} (99%) rename docs/{bigcommerce-for-wordpress/setup/troubleshooting.mdx => storefront/wordpress/platform-integration/unexpected-behavior.mdx} (100%) rename docs/{bigcommerce-for-wordpress/getting-started/install.mdx => storefront/wordpress/start/index.mdx} (100%) rename docs/{bigcommerce-for-wordpress/setup => storefront/wordpress/start}/multi-site.mdx (100%) rename docs/{bigcommerce-for-wordpress/setup => storefront/wordpress/start}/plugin-settings.mdx (100%) rename docs/{bigcommerce-for-wordpress/extending-the-plugin/customization-guide.mdx => storefront/wordpress/themes/index.mdx} (100%) rename {models/webhooks => docs/webhooks/callbacks}/README.md (96%) rename {models/webhooks => docs/webhooks/callbacks}/_all.yml (81%) rename {models/webhooks => docs/webhooks/callbacks}/data/list.txt (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_app_uninstalled.json (100%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_abandoned.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_converted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_couponApplied.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_lineItem_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_lineItem_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_lineItem_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_cart_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_category_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_category_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_category_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_address_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_address_deleted.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_address_updated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_payment_instrument_default_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_customer_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_information_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_metafield_created.json (100%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_archived.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_message_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_refund_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_statusUpdated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_order_updated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_product_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_product_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_product_inventory_order_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_product_inventory_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_product_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_shipment_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_shipment_deleted.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_shipment_updated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_sku_created.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_sku_deleted.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_sku_inventory_order_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_sku_inventory_updated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_sku_updated.json (95%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_subscriber_created.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_subscriber_deleted.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/data/store_subscriber_updated.json (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_app_uninstalled.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_brand_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_brand_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_brand_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_abandoned.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_converted.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_couponApplied.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_created.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_deleted.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_lineItem_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_lineItem_deleted.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_lineItem_updated.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_cart_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_created.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_deleted.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_category_updated.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_channel_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_channel_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_channel_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_address_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_address_deleted.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_address_updated.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_created.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_deleted.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_payment_instrument_default_updated.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_customer_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_information_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_inventory_location_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_inventory_location_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_inventory_location_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_inventory_location_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_inventory_location_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_modifier_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_option_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_archived.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_message_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_refund_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_statusUpdated.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_transaction_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_transaction_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_order_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_created.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_deleted.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_inventory_order_updated.yml (97%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_inventory_updated.yml (97%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_metafield_updated.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_product_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_shipment_created.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_shipment_deleted.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_shipment_updated.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_sku_created.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_sku_deleted.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_sku_inventory_order_updated.yml (97%) rename {models/webhooks => docs/webhooks/callbacks}/store_sku_inventory_updated.yml (96%) rename {models/webhooks => docs/webhooks/callbacks}/store_sku_updated.yml (95%) rename {models/webhooks => docs/webhooks/callbacks}/store_subscriber_created.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_subscriber_deleted.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_subscriber_updated.yml (94%) rename {models/webhooks => docs/webhooks/callbacks}/store_variant_metafield_created.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_variant_metafield_deleted.yml (100%) rename {models/webhooks => docs/webhooks/callbacks}/store_variant_metafield_updated.yml (100%) delete mode 100644 models/_root/forms.yml delete mode 100644 models/theme_objects/_all.yml create mode 100644 reference/inventory.v3.yml create mode 100644 reference/locations.v3.yml create mode 100644 reference/pickup.v3.yml create mode 100644 reference/pickup_methods.v3.yml create mode 100644 reference/pickup_options.sf.yml create mode 100644 reference/pickup_options.v3.yml create mode 100644 reference/promotions.v3.yml diff --git a/docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx b/archive/draft/installing-legacy-theme-modules.mdx similarity index 97% rename from docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx rename to archive/draft/installing-legacy-theme-modules.mdx index 9b31efd10..5f1dfdeed 100644 --- a/docs/legacy/stencil-themes/installing-legacy-theme-modules.mdx +++ b/archive/draft/installing-legacy-theme-modules.mdx @@ -1,67 +1,67 @@ -# Installing Legacy Theme Modules - - - -If a theme’s version number is lower than `1.10.0`, the theme uses `jspm` as its JavaScript build system. Follow the steps outlined on this article to install theme modules via `jspm`. - - - -## Step 1: Install `jspm` - -```shell copy -npm install -g jspm@0.16.30 -``` - -Or, for Windows: - -```shell copy -npm install -g jspm@0.16.31 -``` - -## Step 2: Register `jspm` Instance - -Next, register your jspm instance with GitHub. To do so: -* Navigate to your [GitHub Personal Access Tokens page](https://github.com/settings/tokens). -* Generate a new personal access token with the name `Stencil` and scope `repo` (GitHub provides specific instructions). -* Verify the token includes the following scopes: `repo:status`, `repo_deployment`, and `public_repo`. -* Run the following command in a terminal to associate the `jspm` module and GitHub account: `jspm registry config github` -* When prompted with `Set up GitHub credentials?`, copy and paste the access token created above. - -## Step 3: Install `jspm-git` - -For the next step, you will need the [jspm-git registry plug-in](https://www.npmjs.com/package/jspm-git). - -To install it, enter the following in a terminal: - -```shell copy showLineNumbers -# Install jspm-git registry plug-in -npm install -g jspm-git -``` - -If you already have an earlier version of `jspm-git` installed, you might need to update it to handle git projects with two-digit version numbers: - -```shell copy showLineNumbers -npm upgrade jspm-git@latest -``` - -## Step 4: Add BitBucket as a `jspm` Registry - -Working with downloaded Marketplace themes requires adding a BitBucket registry for `jspm`. To do so, you'll need a [BitBucket account](https://bitbucket.org/product). Once you have an account, enter the following in a terminal to add BitBucket as a `jspm` registry: - -```shell copy showLineNumbers -jspm registry create bitbucket jspm-git - -# When prompted for a base URL, Enter: ssh://git@bitbucket.org -``` - -## Step 5: Install the Modules - -Finally, install the `npm` and `jspm` modules required to access Stencil JavaScript events: - -```shell copy showLineNumbers -# move into the theme's directory -cd ~/path/to/theme - -# install the modules with jspm -jspm install -``` +# Installing Legacy Theme Modules + + + +If a theme’s version number is lower than `1.10.0`, the theme uses `jspm` as its JavaScript build system. Follow the steps outlined on this article to install theme modules via `jspm`. + + + +## Step 1: Install `jspm` + +```shell copy +npm install -g jspm@0.16.30 +``` + +Or, for Windows: + +```shell copy +npm install -g jspm@0.16.31 +``` + +## Step 2: Register `jspm` Instance + +Next, register your jspm instance with GitHub. To do so: +* Navigate to your [GitHub Personal Access Tokens page](https://github.com/settings/tokens). +* Generate a new personal access token with the name `Stencil` and scope `repo` (GitHub provides specific instructions). +* Verify the token includes the following scopes: `repo:status`, `repo_deployment`, and `public_repo`. +* Run the following command in a terminal to associate the `jspm` module and GitHub account: `jspm registry config github` +* When prompted with `Set up GitHub credentials?`, copy and paste the access token created above. + +## Step 3: Install `jspm-git` + +For the next step, you will need the [jspm-git registry plug-in](https://www.npmjs.com/package/jspm-git). + +To install it, enter the following in a terminal: + +```shell copy showLineNumbers +# Install jspm-git registry plug-in +npm install -g jspm-git +``` + +If you already have an earlier version of `jspm-git` installed, you might need to update it to handle git projects with two-digit version numbers: + +```shell copy showLineNumbers +npm upgrade jspm-git@latest +``` + +## Step 4: Add BitBucket as a `jspm` Registry + +Working with downloaded Marketplace themes requires adding a BitBucket registry for `jspm`. To do so, you'll need a [BitBucket account](https://bitbucket.org/product). Once you have an account, enter the following in a terminal to add BitBucket as a `jspm` registry: + +```shell copy showLineNumbers +jspm registry create bitbucket jspm-git + +# When prompted for a base URL, Enter: ssh://git@bitbucket.org +``` + +## Step 5: Install the Modules + +Finally, install the `npm` and `jspm` modules required to access Stencil JavaScript events: + +```shell copy showLineNumbers +# move into the theme's directory +cd ~/path/to/theme + +# install the modules with jspm +jspm install +``` diff --git a/docs/api-docs/getting-started/making-requests.mdx b/archive/start/making-requests.mdx similarity index 100% rename from docs/api-docs/getting-started/making-requests.mdx rename to archive/start/making-requests.mdx diff --git a/docs/api-docs/partner/dev-portal-overview.mdx b/archive/start/partner/developer-portal.mdx similarity index 100% rename from docs/api-docs/partner/dev-portal-overview.mdx rename to archive/start/partner/developer-portal.mdx diff --git a/docs/api-docs/partner/resources.mdx b/archive/start/partner/developer-resources.mdx similarity index 100% rename from docs/api-docs/partner/resources.mdx rename to archive/start/partner/developer-resources.mdx diff --git a/docs/api-docs/partner/staying-current.mdx b/archive/start/partner/staying-current.mdx similarity index 100% rename from docs/api-docs/partner/staying-current.mdx rename to archive/start/partner/staying-current.mdx diff --git a/docs/legacy/v2-catalog-products/v2-brands.mdx b/archive/store-operations/v2-catalog-products/v2-brands.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-brands.mdx rename to archive/store-operations/v2-catalog-products/v2-brands.mdx diff --git a/docs/legacy/v2-catalog-products/v2-bulk-pricing.mdx b/archive/store-operations/v2-catalog-products/v2-bulk-pricing.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-bulk-pricing.mdx rename to archive/store-operations/v2-catalog-products/v2-bulk-pricing.mdx diff --git a/docs/legacy/v2-catalog-products/v2-categories.mdx b/archive/store-operations/v2-catalog-products/v2-categories.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-categories.mdx rename to archive/store-operations/v2-catalog-products/v2-categories.mdx diff --git a/docs/legacy/v2-catalog-products/v2-custom-fields.mdx b/archive/store-operations/v2-catalog-products/v2-custom-fields.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-custom-fields.mdx rename to archive/store-operations/v2-catalog-products/v2-custom-fields.mdx diff --git a/docs/legacy/v2-catalog-products/v2-option-set-options.mdx b/archive/store-operations/v2-catalog-products/v2-option-set-options.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-option-set-options.mdx rename to archive/store-operations/v2-catalog-products/v2-option-set-options.mdx diff --git a/docs/legacy/v2-catalog-products/v2-option-sets.mdx b/archive/store-operations/v2-catalog-products/v2-option-sets.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-option-sets.mdx rename to archive/store-operations/v2-catalog-products/v2-option-sets.mdx diff --git a/docs/legacy/v2-catalog-products/v2-option-values.mdx b/archive/store-operations/v2-catalog-products/v2-option-values.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-option-values.mdx rename to archive/store-operations/v2-catalog-products/v2-option-values.mdx diff --git a/docs/legacy/v2-catalog-products/v2-options.mdx b/archive/store-operations/v2-catalog-products/v2-options.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-options.mdx rename to archive/store-operations/v2-catalog-products/v2-options.mdx diff --git a/docs/legacy/v2-catalog-products/v2-product-images.mdx b/archive/store-operations/v2-catalog-products/v2-product-images.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-product-images.mdx rename to archive/store-operations/v2-catalog-products/v2-product-images.mdx diff --git a/docs/legacy/v2-catalog-products/v2-product-options.mdx b/archive/store-operations/v2-catalog-products/v2-product-options.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-product-options.mdx rename to archive/store-operations/v2-catalog-products/v2-product-options.mdx diff --git a/docs/legacy/v2-catalog-products/v2-product-reviews.mdx b/archive/store-operations/v2-catalog-products/v2-product-reviews.mdx similarity index 98% rename from docs/legacy/v2-catalog-products/v2-product-reviews.mdx rename to archive/store-operations/v2-catalog-products/v2-product-reviews.mdx index 14410ec98..51348a343 100644 --- a/docs/legacy/v2-catalog-products/v2-product-reviews.mdx +++ b/archive/store-operations/v2-catalog-products/v2-product-reviews.mdx @@ -154,7 +154,7 @@ Example JSON returned in the response: ## Update a Product Review -Updates an existing product review. Your request may update any of the properties that are writeable for the Create (POST) operation. +Updates an existing product review. Your request may update any of the properties that are writable for the Create (POST) operation. `PUT /stores/{store_hash}/v2/products/{product_id}/reviews/{id}` diff --git a/docs/legacy/v2-catalog-products/v2-product-rules.mdx b/archive/store-operations/v2-catalog-products/v2-product-rules.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-product-rules.mdx rename to archive/store-operations/v2-catalog-products/v2-product-rules.mdx diff --git a/docs/legacy/v2-catalog-products/v2-product-sku.mdx b/archive/store-operations/v2-catalog-products/v2-product-sku.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-product-sku.mdx rename to archive/store-operations/v2-catalog-products/v2-product-sku.mdx diff --git a/docs/legacy/v2-catalog-products/v2-product-videos.mdx b/archive/store-operations/v2-catalog-products/v2-product-videos.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-product-videos.mdx rename to archive/store-operations/v2-catalog-products/v2-product-videos.mdx diff --git a/docs/legacy/v2-catalog-products/v2-products.mdx b/archive/store-operations/v2-catalog-products/v2-products.mdx similarity index 100% rename from docs/legacy/v2-catalog-products/v2-products.mdx rename to archive/store-operations/v2-catalog-products/v2-products.mdx diff --git a/docs/legacy/v2-products/v2-v3.mdx b/archive/store-operations/v2-products/v2-versus-v3.mdx similarity index 99% rename from docs/legacy/v2-products/v2-v3.mdx rename to archive/store-operations/v2-products/v2-versus-v3.mdx index d1cb34cad..f98d89937 100644 --- a/docs/legacy/v2-products/v2-v3.mdx +++ b/archive/store-operations/v2-products/v2-versus-v3.mdx @@ -49,7 +49,7 @@ Creating Products and Variants on V3: Variants can be included with a GET request to lower the number of API calls being made using `?include=variants`. -V3 includes endpoints for working with catalog trees. Stores that have multi-storefront enabled can have more than one tree. See the catagories section of the [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide#categories). Stores that are not MSF-enabled can use the same endponts. +V3 includes endpoints for working with catalog trees. Stores that have multi-storefront enabled can have more than one tree. See the categories section of the [Multi-Storefront API Guide](/docs/storefront/multi-storefront/guide#categories). Stores that are not MSF-enabled can use the same endponts. ## Interoperability between V2 and V3 diff --git a/docs/legacy/blueprint-reference/blueprint-layouts.mdx b/archive/storefront/blueprint/reference/layouts.mdx similarity index 100% rename from docs/legacy/blueprint-reference/blueprint-layouts.mdx rename to archive/storefront/blueprint/reference/layouts.mdx diff --git a/docs/legacy/blueprint-reference/blueprint-panels.mdx b/archive/storefront/blueprint/reference/panels.mdx similarity index 100% rename from docs/legacy/blueprint-reference/blueprint-panels.mdx rename to archive/storefront/blueprint/reference/panels.mdx diff --git a/docs/legacy/blueprint-reference/blueprint-snippets.mdx b/archive/storefront/blueprint/reference/snippets.mdx similarity index 100% rename from docs/legacy/blueprint-reference/blueprint-snippets.mdx rename to archive/storefront/blueprint/reference/snippets.mdx diff --git a/docs/legacy/blueprint-themes/anatomy-of-a-theme.mdx b/archive/storefront/blueprint/themes/anatomy-of-a-theme.mdx similarity index 100% rename from docs/legacy/blueprint-themes/anatomy-of-a-theme.mdx rename to archive/storefront/blueprint/themes/anatomy-of-a-theme.mdx diff --git a/docs/legacy/blueprint-themes/blueprint-and-developer-mode.mdx b/archive/storefront/blueprint/themes/blueprint-and-developer-mode.mdx similarity index 100% rename from docs/legacy/blueprint-themes/blueprint-and-developer-mode.mdx rename to archive/storefront/blueprint/themes/blueprint-and-developer-mode.mdx diff --git a/docs/legacy/blueprint-themes/checkout-styling.mdx b/archive/storefront/blueprint/themes/checkout-styling.mdx similarity index 97% rename from docs/legacy/blueprint-themes/checkout-styling.mdx rename to archive/storefront/blueprint/themes/checkout-styling.mdx index 93cf9c5cb..218bb8d50 100644 --- a/docs/legacy/blueprint-themes/checkout-styling.mdx +++ b/archive/storefront/blueprint/themes/checkout-styling.mdx @@ -1,275 +1,275 @@ -# Checkout Styling - - - -To support stores that enable BigCommerce's Optimized One-Page Checkout feature, you can customize the Optimized Checkout page's styling within your theme. You do this by adding custom CSS to the `optimized-checkout-webdav.css` template file that we provide. You can copy the CSS [below](#css-skeleton). - -<Callout type="info"> - #### Function Names - Although you will see references to "Stencil" functions throughout this template file's CSS, this version of the CSS is designed to be fully compatible with Blueprint themes. -</Callout> - - -## Customization Options/Restrictions - -As a theme developer, you are free to change classes' contents – but do not nest elements, nor change any class names. - -The structure and class naming are reserved because each class here maps to multiple Optimized Checkout elements. So renaming would break updates available in future Optimized Checkout enhancements. - -## Configuring the Desktop Viewport - -Within the CSS file, to set up Optimized Checkout's responsive features, you should configure the following breakpoint to define your preferred desktop viewport size: - - -```css filename="Configure media query to be 'desktop' breakpoint size" showLineNumbers copy -@media (min-width: 801px) { - text-align: stencilString("optimizedCheckout-logo-position"); -} -``` - -For other customization options, please see the class descriptions [below](#classes-provided). - -## Deploying Custom CSS - -To deploy your custom CSS to a BigCommerce store, you will need to upload your `optimized-checkout-webdav.css` file (once customized) via WebDAV. - -For a general overview of the process, please see [this support article](https://support.bigcommerce.com/s/article/Stencil-Themes#custom-template). Place your customized `optimized-checkout-webdav.css` file directly within WebDAV's `/content/` folder. - -For details on interacting with WebDAV, please see [this article](https://support.bigcommerce.com/articles/Public/Connecting-to-WebDav). - -## Classes Provided - -Below is a summary of the classes provided in the template CSS, with corresponding page elements that they style. (These class names and mappings are subject to change, so please see the inline comments embedded in the file itself.) - -| Class | Styles This Optimized One-Page Checkout Element: | -|-|-| -| .optimizedCheckout-header | Page header. | -| .optimizedCheckout-headingPrimary | Top-level headings. | -| .optimizedCheckout-headingSecondary | Certain lower-level elements, such as descriptions of cart items. | -| .optimizedCheckout-overlay | Shipping Method box. | -| .optimizedCheckout-contentPrimary | Body text in the desktop `Order Summary`/`Order Confirmation` (cart contents); drop-down-list items; and text that summarizes completed steps. | -| .optimizedCheckout-contentSecondary | Text labels on check boxes, and lower-level text in the desktop Order Summary. | -| .optimizedCheckout-button--primary | `CONTINUE` button and final `PAY` button. | -| .optimizedCheckout-button--secondary | `Edit` buttons. -| .optimizedCheckout-orderSummary | Colors in the `Order Summary` mobile drawer/modal. -| .optimizedCheckout-step | Large step-number indicators on the page's left side. | -| .optimizedCheckout-form-label | Styles form fields like `Email Address` – the field's text-label color. | -| .optimizedCheckout-form-input | Styles form fields like `Email Address` – the entry box's background and border colors. | - -## CSS Skeleton - -You can copy and modify the template `optimized-checkout-webdav.css` file's current contents directly from this documentation, below: - -```css filename="optimized-checkout-webdav.css" showLineNumbers copy -/* -// ============================================================================= -// Stencil Checkout - Customize the Optimized Single-Page Checkout experience -// ============================================================================= -*/ - -/* -// ============================================================================= -// -// IMPORTANT DISCLAIMER -// Please do not nest elements within class selectors, and do not use class selectors other than those given below. -// Future support is guaranteed only if class selectors' structure and naming are left unchanged. -// -// ============================================================================= -*/ - -/* -// Header Section -// Background, Logo Position -// -- -*/ - -.optimizedCheckout-header { - background-color: stencilColor("optimizedCheckout-header-backgroundColor"); - background-image: url(stencilImage('optimizedCheckout-backgroundImage', 'optimizedCheckout-backgroundImage-size')); - background-size: cover; -} - -/* -// TODO: -// Configure media query to be 'desktop' breakpoint size -// -- -*/ - -@media (min-width: 801px) { - .optimizedCheckout-header { - text-align: stencilString("optimizedCheckout-logo-position"); - } -} - -/* -// Primary and Secondary Headings -// Text Color & Typography -// -// .optimizedCheckout-headingPrimary styles top-level headings. -// -// .optimizedCheckout-headingSecondary styles certain lower-level elements, such as descriptions of cart items. -// -- -*/ - -.optimizedCheckout-headingPrimary { - color: stencilColor("optimizedCheckout-headingPrimary-color"); - font-family: stencilFontFamily("optimizedCheckout-headingPrimary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-headingPrimary-font"); -} - -.optimizedCheckout-headingSecondary { - color: stencilColor("optimizedCheckout-headingSecondary-color"); - font-family: stencilFontFamily("optimizedCheckout-headingSecondary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-headingSecondary-font"); -} - -/* -// Body -// Background & Shipping Method Overlay -// -- -*/ - -body { - background-color: stencilColor("optimizedCheckout-body-backgroundColor"); -} - -.optimizedCheckout-overlay { - background-color: stencilColor("optimizedCheckout-body-backgroundColor"); -} - -/* -// Primary & Secondary Content -// Text Color & Typography -// -// .optimizedCheckout-contentPrimary styles body text in the Order Summary/Order Confirmation; -// drop-down-list items; and text summarizing completed steps. -// -// .optimizedCheckout-contentSecondary styles check boxes' text labels, -// and lower-level text in the Order Summary. -// -- -*/ - -.optimizedCheckout-contentPrimary { - color: stencilColor("optimizedCheckout-contentPrimary-color"); - font-family: stencilFontFamily("optimizedCheckout-contentPrimary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-contentPrimary-font"); -} - -.optimizedCheckout-contentSecondary { - color: stencilColor("optimizedCheckout-contentSecondary-color"); - font-family: stencilFontFamily("optimizedCheckout-contentSecondary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-contentSecondary-font"); -} - -/* -// Primary Button -// Background & Border & Text Color & Typography -// -// Styles the CONTINUE button for each step, & the final confirmation button. -// -- -*/ - -.optimizedCheckout-buttonPrimary { - background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColor"); - border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColor"); - color: stencilColor("optimizedCheckout-buttonPrimary-color"); - font-family: stencilFontFamily("optimizedCheckout-buttonPrimary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-buttonPrimary-font"); -} - -.optimizedCheckout-buttonPrimary:focus, -.optimizedCheckout-buttonPrimary:hover { - background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColorHover"); - border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColorHover"); - color: stencilColor("optimizedCheckout-buttonPrimary-colorHover"); -} - -.optimizedCheckout-buttonPrimary:active { - background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColorActive"); - border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColorActive"); - color: stencilColor("optimizedCheckout-buttonPrimary-colorActive"); -} - -/* -// Secondary Button -// Background & Border & Text Color & Typography -// -// Styles the EDIT button for each step. -// -- -*/ - -.optimizedCheckout-buttonSecondary { - background-color: stencilColor("optimizedCheckout-buttonSecondary-backgroundColor"); - border-color: stencilColor("optimizedCheckout-buttonSecondary-borderColor"); - color: stencilColor("optimizedCheckout-buttonSecondary-color"); - font-family: stencilFontFamily("optimizedCheckout-buttonSecondary-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-buttonSecondary-font"); -} - -/* -// Links -// Text Color & Typography -// -- -*/ - -a { - color: stencilColor("optimizedCheckout-link-color"); - font-family: stencilFontFamily("optimizedCheckout-link-font"), Arial, Helvetica, sans-serif; - font-weight: stencilFontWeight("optimizedCheckout-link-font"); -} - -/* -// Order Summary (Mobile Drawer & Modal) -// Background -// -- -*/ - -.optimizedCheckout-orderSummary { - background-color: stencilColor("optimizedCheckout-orderSummary-backgroundColor"); -} - -/* -// Checkout Steps -// Background & Text Color -// -// Styles the large step-number indicators on the page's left side. -// -- -*/ - -.optimizedCheckout-step { - background-color: stencilColor("optimizedCheckout-step-backgroundColor"); -} - -.optimizedCheckout-step::before { - color: stencilColor("optimizedCheckout-step-text"); -} - -.optimizedCheckout-step svg { - fill: stencilColor("optimizedCheckout-step-text"); -} - -/* -// Form Labels -// Text Color -// -// Styles text labels on form fields. -// -- -*/ - -.optimizedCheckout-form-label { - color: stencilColor("optimizedCheckout-form-text"); -} - -/* -// Form Input -// Background & Border Color -// -// Styles form fields. -// -- -*/ - -.optimizedCheckout-form-input { - background-color: stencilString("optimizedCheckout-formField-backgroundColor"); - border-color: stencilColor("optimizedCheckout-formField-borderColor"); -} -``` +# Checkout Styling + + + +To support stores that enable BigCommerce's Optimized One-Page Checkout feature, you can customize the Optimized Checkout page's styling within your theme. You do this by adding custom CSS to the `optimized-checkout-webdav.css` template file that we provide. You can copy the CSS [below](#css-skeleton). + +<Callout type="info"> + #### Function Names + Although you will see references to "Stencil" functions throughout this template file's CSS, this version of the CSS is designed to be fully compatible with Blueprint themes. +</Callout> + + +## Customization Options/Restrictions + +As a theme developer, you are free to change classes' contents – but do not nest elements, nor change any class names. + +The structure and class naming are reserved because each class here maps to multiple Optimized Checkout elements. So renaming would break updates available in future Optimized Checkout enhancements. + +## Configuring the Desktop Viewport + +Within the CSS file, to set up Optimized Checkout's responsive features, you should configure the following breakpoint to define your preferred desktop viewport size: + + +```css filename="Configure media query to be 'desktop' breakpoint size" showLineNumbers copy +@media (min-width: 801px) { + text-align: stencilString("optimizedCheckout-logo-position"); +} +``` + +For other customization options, please see the class descriptions [below](#classes-provided). + +## Deploying Custom CSS + +To deploy your custom CSS to a BigCommerce store, you will need to upload your `optimized-checkout-webdav.css` file (once customized) via WebDAV. + +For a general overview of the process, please see [this support article](https://support.bigcommerce.com/s/article/Stencil-Themes#custom-template). Place your customized `optimized-checkout-webdav.css` file directly within WebDAV's `/content/` folder. + +For details on interacting with WebDAV, please see [this article](https://support.bigcommerce.com/articles/Public/Connecting-to-WebDav). + +## Classes Provided + +Below is a summary of the classes provided in the template CSS, with corresponding page elements that they style. (These class names and mappings are subject to change, so please see the inline comments embedded in the file itself.) + +| Class | Styles This Optimized One-Page Checkout Element: | +|-|-| +| .optimizedCheckout-header | Page header. | +| .optimizedCheckout-headingPrimary | Top-level headings. | +| .optimizedCheckout-headingSecondary | Certain lower-level elements, such as descriptions of cart items. | +| .optimizedCheckout-overlay | Shipping Method box. | +| .optimizedCheckout-contentPrimary | Body text in the desktop `Order Summary`/`Order Confirmation` (cart contents); drop-down-list items; and text that summarizes completed steps. | +| .optimizedCheckout-contentSecondary | Text labels on check boxes, and lower-level text in the desktop Order Summary. | +| .optimizedCheckout-button--primary | `CONTINUE` button and final `PAY` button. | +| .optimizedCheckout-button--secondary | `Edit` buttons. +| .optimizedCheckout-orderSummary | Colors in the `Order Summary` mobile drawer/modal. +| .optimizedCheckout-step | Large step-number indicators on the page's left side. | +| .optimizedCheckout-form-label | Styles form fields like `Email Address` – the field's text-label color. | +| .optimizedCheckout-form-input | Styles form fields like `Email Address` – the entry box's background and border colors. | + +## CSS Skeleton + +You can copy and modify the template `optimized-checkout-webdav.css` file's current contents directly from this documentation, below: + +```css filename="optimized-checkout-webdav.css" showLineNumbers copy +/* +// ============================================================================= +// Stencil Checkout - Customize the Optimized Single-Page Checkout experience +// ============================================================================= +*/ + +/* +// ============================================================================= +// +// IMPORTANT DISCLAIMER +// Please do not nest elements within class selectors, and do not use class selectors other than those given below. +// Future support is guaranteed only if class selectors' structure and naming are left unchanged. +// +// ============================================================================= +*/ + +/* +// Header Section +// Background, Logo Position +// -- +*/ + +.optimizedCheckout-header { + background-color: stencilColor("optimizedCheckout-header-backgroundColor"); + background-image: url(stencilImage('optimizedCheckout-backgroundImage', 'optimizedCheckout-backgroundImage-size')); + background-size: cover; +} + +/* +// TODO: +// Configure media query to be 'desktop' breakpoint size +// -- +*/ + +@media (min-width: 801px) { + .optimizedCheckout-header { + text-align: stencilString("optimizedCheckout-logo-position"); + } +} + +/* +// Primary and Secondary Headings +// Text Color & Typography +// +// .optimizedCheckout-headingPrimary styles top-level headings. +// +// .optimizedCheckout-headingSecondary styles certain lower-level elements, such as descriptions of cart items. +// -- +*/ + +.optimizedCheckout-headingPrimary { + color: stencilColor("optimizedCheckout-headingPrimary-color"); + font-family: stencilFontFamily("optimizedCheckout-headingPrimary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-headingPrimary-font"); +} + +.optimizedCheckout-headingSecondary { + color: stencilColor("optimizedCheckout-headingSecondary-color"); + font-family: stencilFontFamily("optimizedCheckout-headingSecondary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-headingSecondary-font"); +} + +/* +// Body +// Background & Shipping Method Overlay +// -- +*/ + +body { + background-color: stencilColor("optimizedCheckout-body-backgroundColor"); +} + +.optimizedCheckout-overlay { + background-color: stencilColor("optimizedCheckout-body-backgroundColor"); +} + +/* +// Primary & Secondary Content +// Text Color & Typography +// +// .optimizedCheckout-contentPrimary styles body text in the Order Summary/Order Confirmation; +// drop-down-list items; and text summarizing completed steps. +// +// .optimizedCheckout-contentSecondary styles check boxes' text labels, +// and lower-level text in the Order Summary. +// -- +*/ + +.optimizedCheckout-contentPrimary { + color: stencilColor("optimizedCheckout-contentPrimary-color"); + font-family: stencilFontFamily("optimizedCheckout-contentPrimary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-contentPrimary-font"); +} + +.optimizedCheckout-contentSecondary { + color: stencilColor("optimizedCheckout-contentSecondary-color"); + font-family: stencilFontFamily("optimizedCheckout-contentSecondary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-contentSecondary-font"); +} + +/* +// Primary Button +// Background & Border & Text Color & Typography +// +// Styles the CONTINUE button for each step, & the final confirmation button. +// -- +*/ + +.optimizedCheckout-buttonPrimary { + background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColor"); + border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColor"); + color: stencilColor("optimizedCheckout-buttonPrimary-color"); + font-family: stencilFontFamily("optimizedCheckout-buttonPrimary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-buttonPrimary-font"); +} + +.optimizedCheckout-buttonPrimary:focus, +.optimizedCheckout-buttonPrimary:hover { + background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColorHover"); + border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColorHover"); + color: stencilColor("optimizedCheckout-buttonPrimary-colorHover"); +} + +.optimizedCheckout-buttonPrimary:active { + background-color: stencilColor("optimizedCheckout-buttonPrimary-backgroundColorActive"); + border-color: stencilColor("optimizedCheckout-buttonPrimary-borderColorActive"); + color: stencilColor("optimizedCheckout-buttonPrimary-colorActive"); +} + +/* +// Secondary Button +// Background & Border & Text Color & Typography +// +// Styles the EDIT button for each step. +// -- +*/ + +.optimizedCheckout-buttonSecondary { + background-color: stencilColor("optimizedCheckout-buttonSecondary-backgroundColor"); + border-color: stencilColor("optimizedCheckout-buttonSecondary-borderColor"); + color: stencilColor("optimizedCheckout-buttonSecondary-color"); + font-family: stencilFontFamily("optimizedCheckout-buttonSecondary-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-buttonSecondary-font"); +} + +/* +// Links +// Text Color & Typography +// -- +*/ + +a { + color: stencilColor("optimizedCheckout-link-color"); + font-family: stencilFontFamily("optimizedCheckout-link-font"), Arial, Helvetica, sans-serif; + font-weight: stencilFontWeight("optimizedCheckout-link-font"); +} + +/* +// Order Summary (Mobile Drawer & Modal) +// Background +// -- +*/ + +.optimizedCheckout-orderSummary { + background-color: stencilColor("optimizedCheckout-orderSummary-backgroundColor"); +} + +/* +// Checkout Steps +// Background & Text Color +// +// Styles the large step-number indicators on the page's left side. +// -- +*/ + +.optimizedCheckout-step { + background-color: stencilColor("optimizedCheckout-step-backgroundColor"); +} + +.optimizedCheckout-step::before { + color: stencilColor("optimizedCheckout-step-text"); +} + +.optimizedCheckout-step svg { + fill: stencilColor("optimizedCheckout-step-text"); +} + +/* +// Form Labels +// Text Color +// +// Styles text labels on form fields. +// -- +*/ + +.optimizedCheckout-form-label { + color: stencilColor("optimizedCheckout-form-text"); +} + +/* +// Form Input +// Background & Border Color +// +// Styles form fields. +// -- +*/ + +.optimizedCheckout-form-input { + background-color: stencilString("optimizedCheckout-formField-backgroundColor"); + border-color: stencilColor("optimizedCheckout-formField-borderColor"); +} +``` diff --git a/docs/legacy/blueprint-themes/blueprint-email-templates.mdx b/archive/storefront/blueprint/themes/email-templates.mdx similarity index 98% rename from docs/legacy/blueprint-themes/blueprint-email-templates.mdx rename to archive/storefront/blueprint/themes/email-templates.mdx index 117fb696b..1ff98a1ab 100644 --- a/docs/legacy/blueprint-themes/blueprint-email-templates.mdx +++ b/archive/storefront/blueprint/themes/email-templates.mdx @@ -1,118 +1,118 @@ -# Email Templates - - - -The following variables are available within individual BigCommerce email template: - -## Gift Certificate Email Template - -Sent to the recipient of a gift certificate. - -### Available Variables -| Variable | Description | -|:---------|:------------| -| `%%LNG_GiftCertificateEmailYouHaveReceived%%` | "You have received a Gift Certificate for" | -| `%%GLOBAL_StoreName%%` | The name of the store. | -| `%%LNG_Dear%%` | "Dear" | -| `%%GLOBAL_ToName%%` | The name of the gift certificate recipient. | -| `%%GLOBAL_Intro%%` | "%s has sent you a %s gift certificate for %s." | -| `%%GLOBAL_ExpiryInfo%%` | "You have until %s to use this gift certificate before it expires." | -| `%%LNG_GiftCertificateEmailInstructions%%` | "For instructions on how to redeem your gift certificate please <a href='%s/giftcertificates.php?action=redeem'>click here</a>." | -| `%%LNG_GiftCertificateEmailAttached%%` | "Your gift certificate is attached to this email." | -| `%%LNG_GiftCertificateEmailWarning%%` | "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable." | -| `%%GLOBAL_EmailFooter%%` | "<b>%s</b><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | - -## Abandoned Cart Email Template - -Sent when a customer abandons a shopping cart. - -### Available Variables -| Variable | Description | -|:---------|:------------| -| `%%GLOBAL_AC_EmailBody%%` | "Hi %s,<br>You recently visited our online store and we noticed that you didn't complete your order for the following items:" | -| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | -| `%%GLOBAL_AC_UnsubscribeLink%%` | Link to unsubscribe page associated with the store. | -| `%%LNG_AC_EmailUnsubscribe%%` | "Unsubscribe" | -| `%%LNG_AC_EmailUnsubscribeSuffix%%` | " from future emails like this" | - -## Invoice Email Template - -Sent when a customer places an order. - -### Available Variables -| Variable | Description | -|-|-| -| `%%GLOBAL_NoPaymentTaken%%` | . | -| `%%LNG_ThanksForYourOrder%%` | "Thanks for Your Order" | -| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site’s image files reside. | -| `%%LNG_YourOrderIDIs%%` | "Your order ID is" | -| `%%GLOBAL_OrderNumber%%` | "Order Number" | -| `%%GLOBAL_ViewOrderStatusMsg%%` | "To view the status of your order <a href="%s.mybigcommerce.com/orderstatus.php">click here</a>." | -| `%%GLOBAL_PendingPaymentNotice%%` | . | -| `%%LNG_ShippingAddress%%` | "Shipping Address" | -| `%%GLOBAL_ShippingAddress%%` | The customer's shipping address. | -| `%%GLOBAL_HideShippingEmail%%` | . | -| `%%LNG_Email%%` | "Email" | -| `%%GLOBAL_ShippingEmail%%` | . | -| `%%LNG_BillingAddress%%` | "Billing Address" | -| `%%GLOBAL_BillingAddress%%` | The customer's billing address. | -| `%%GLOBAL_HideBillingEmail%%` | . | -| `%%LNG_Email%%` | "Email" | -| `%%GLOBAL_BillingEmail%%` | . | -| `%%GLOBAL_PendingPaymentDetails%%` | . | -| `%%GLOBAL_OrderCommentBlock%%` | The text a customer entered in the order comment box. | -| `%%LNG_YourOrderContainsTheFollowingItems%%` | "Your Order Contains..." | -| `%%GLOBAL_CartItemColumns%%` | Column for cart items. | -| `%%SNIPPET_CartItems%%` | Names of the items the customer ordered. | -| `%%SNIPPET_TotalRows%%` | Subtotal and grand total. | -| `%%SNIPPET_PaymentMethod%%` | The customer's method of payment. | -| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | -| `%%GLOBAL_ProductThumbImageURL%%` | Product image URL. | - -## Order Status Email Template - -Sent when an order's status is changed. - -### Available Variables -| Variable | Description | -|:---------|:------------| -| `%%LNG_OrderStatusChanged%%` | "Order Status Changed" | -| `%%GLOBAL_OrderStatusChangedHi%%` | "Hi %s" | -| `%%LNG_OrderStatusChangedIntro%%` | "An order you recently placed on our website has had its status changed." | -| `%%GLOBAL_OrderNumberStatusChangedTo%%` | "The status of order #%s is now <strong>%s</strong>" | -| `%%LNG_OrderDetails%%` | "Order Details" | -| `%%LNG_OrderStatusChangedOrderTotal%%` | "Order Total" | -| `%%GLOBAL_OrderTotal%%` | The customer's order total. | -| `%%LNG_OrderStatusChangedDatePlaced%%` | "Date Placed" | -| `%%GLOBAL_DatePlaced%%` | The date the order was placed. | -| `%%LNG_OrderStatusChangedPaymentMethod%%` | "Payment Method" | -| `%%GLOBAL_PaymentMethod%%` | The customer's payment method. | -| `%%LNG_ShipmentTrackingNumbersLinks%%` | "Shipment Tracking Numbers / Links" | -| `%%GLOBAL_ViewOrderStatusLink%%` | . | -| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | - -## Return Confirmation Email Template - -Sent when a customer submits a return request. - -### Available Variables -| Variable | Description | -|:---------|:------------| -| `%%LNG_NotificationConfirmationForReturn%%` | "Confirmation for Return Request for Order ID" | -| `%%GLOBAL_OrderId%%` | Order ID number | -| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site’s image files reside. | -| `%%LNG_NotificationAReturnSummaryIsShownBelow%%` | "A summary of your return is shown below. To view the status of this return" | -| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL based page, this will be the HTTPS version of the store path. | -| `%%LNG_ClickHere%%` | "click here" | -| `%%LNG_ReturnReason%%` | "Return Reason" | -| `%%GLOBAL_ReturnReason%%` | The customer's selected return reason. | -| `%%GLOBAL_HideReturnAction%%` | . | -| `%%LNG_ReturnAction%%` | "Return Action" | -| `%%GLOBAL_ReturnAction%%` | The customer's selected return action. | -| `%%LNG_YourComments%%` | "Your Comments" | -| `%%GLOBAL_ReturnComments%%` | The customer's return comments. | -| `%%LNG_NotificationYourReturnContainsTheFollowingItems%%` | "Your Return Request Contains the Following Items..." | -| `%%LNG_ReturnItems%%` | "Return Items" | -| `%%LNG_Qty%%` | "Qty" | -| `%%SNIPPET_ReturnItems%%` | . | -| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | +# Email Templates + + + +The following variables are available within individual BigCommerce email template: + +## Gift Certificate Email Template + +Sent to the recipient of a gift certificate. + +### Available Variables +| Variable | Description | +|:---------|:------------| +| `%%LNG_GiftCertificateEmailYouHaveReceived%%` | "You have received a Gift Certificate for" | +| `%%GLOBAL_StoreName%%` | The name of the store. | +| `%%LNG_Dear%%` | "Dear" | +| `%%GLOBAL_ToName%%` | The name of the gift certificate recipient. | +| `%%GLOBAL_Intro%%` | "%s has sent you a %s gift certificate for %s." | +| `%%GLOBAL_ExpiryInfo%%` | "You have until %s to use this gift certificate before it expires." | +| `%%LNG_GiftCertificateEmailInstructions%%` | "For instructions on how to redeem your gift certificate please <a href='%s/giftcertificates.php?action=redeem'>click here</a>." | +| `%%LNG_GiftCertificateEmailAttached%%` | "Your gift certificate is attached to this email." | +| `%%LNG_GiftCertificateEmailWarning%%` | "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable." | +| `%%GLOBAL_EmailFooter%%` | "<b>%s</b><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | + +## Abandoned Cart Email Template + +Sent when a customer abandons a shopping cart. + +### Available Variables +| Variable | Description | +|:---------|:------------| +| `%%GLOBAL_AC_EmailBody%%` | "Hi %s,<br>You recently visited our online store and we noticed that you didn't complete your order for the following items:" | +| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | +| `%%GLOBAL_AC_UnsubscribeLink%%` | Link to unsubscribe page associated with the store. | +| `%%LNG_AC_EmailUnsubscribe%%` | "Unsubscribe" | +| `%%LNG_AC_EmailUnsubscribeSuffix%%` | " from future emails like this" | + +## Invoice Email Template + +Sent when a customer places an order. + +### Available Variables +| Variable | Description | +|-|-| +| `%%GLOBAL_NoPaymentTaken%%` | . | +| `%%LNG_ThanksForYourOrder%%` | "Thanks for Your Order" | +| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site’s image files reside. | +| `%%LNG_YourOrderIDIs%%` | "Your order ID is" | +| `%%GLOBAL_OrderNumber%%` | "Order Number" | +| `%%GLOBAL_ViewOrderStatusMsg%%` | "To view the status of your order <a href="%s.mybigcommerce.com/orderstatus.php">click here</a>." | +| `%%GLOBAL_PendingPaymentNotice%%` | . | +| `%%LNG_ShippingAddress%%` | "Shipping Address" | +| `%%GLOBAL_ShippingAddress%%` | The customer's shipping address. | +| `%%GLOBAL_HideShippingEmail%%` | . | +| `%%LNG_Email%%` | "Email" | +| `%%GLOBAL_ShippingEmail%%` | . | +| `%%LNG_BillingAddress%%` | "Billing Address" | +| `%%GLOBAL_BillingAddress%%` | The customer's billing address. | +| `%%GLOBAL_HideBillingEmail%%` | . | +| `%%LNG_Email%%` | "Email" | +| `%%GLOBAL_BillingEmail%%` | . | +| `%%GLOBAL_PendingPaymentDetails%%` | . | +| `%%GLOBAL_OrderCommentBlock%%` | The text a customer entered in the order comment box. | +| `%%LNG_YourOrderContainsTheFollowingItems%%` | "Your Order Contains..." | +| `%%GLOBAL_CartItemColumns%%` | Column for cart items. | +| `%%SNIPPET_CartItems%%` | Names of the items the customer ordered. | +| `%%SNIPPET_TotalRows%%` | Subtotal and grand total. | +| `%%SNIPPET_PaymentMethod%%` | The customer's method of payment. | +| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | +| `%%GLOBAL_ProductThumbImageURL%%` | Product image URL. | + +## Order Status Email Template + +Sent when an order's status is changed. + +### Available Variables +| Variable | Description | +|:---------|:------------| +| `%%LNG_OrderStatusChanged%%` | "Order Status Changed" | +| `%%GLOBAL_OrderStatusChangedHi%%` | "Hi %s" | +| `%%LNG_OrderStatusChangedIntro%%` | "An order you recently placed on our website has had its status changed." | +| `%%GLOBAL_OrderNumberStatusChangedTo%%` | "The status of order #%s is now <strong>%s</strong>" | +| `%%LNG_OrderDetails%%` | "Order Details" | +| `%%LNG_OrderStatusChangedOrderTotal%%` | "Order Total" | +| `%%GLOBAL_OrderTotal%%` | The customer's order total. | +| `%%LNG_OrderStatusChangedDatePlaced%%` | "Date Placed" | +| `%%GLOBAL_DatePlaced%%` | The date the order was placed. | +| `%%LNG_OrderStatusChangedPaymentMethod%%` | "Payment Method" | +| `%%GLOBAL_PaymentMethod%%` | The customer's payment method. | +| `%%LNG_ShipmentTrackingNumbersLinks%%` | "Shipment Tracking Numbers / Links" | +| `%%GLOBAL_ViewOrderStatusLink%%` | . | +| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | + +## Return Confirmation Email Template + +Sent when a customer submits a return request. + +### Available Variables +| Variable | Description | +|:---------|:------------| +| `%%LNG_NotificationConfirmationForReturn%%` | "Confirmation for Return Request for Order ID" | +| `%%GLOBAL_OrderId%%` | Order ID number | +| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site’s image files reside. | +| `%%LNG_NotificationAReturnSummaryIsShownBelow%%` | "A summary of your return is shown below. To view the status of this return" | +| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL based page, this will be the HTTPS version of the store path. | +| `%%LNG_ClickHere%%` | "click here" | +| `%%LNG_ReturnReason%%` | "Return Reason" | +| `%%GLOBAL_ReturnReason%%` | The customer's selected return reason. | +| `%%GLOBAL_HideReturnAction%%` | . | +| `%%LNG_ReturnAction%%` | "Return Action" | +| `%%GLOBAL_ReturnAction%%` | The customer's selected return action. | +| `%%LNG_YourComments%%` | "Your Comments" | +| `%%GLOBAL_ReturnComments%%` | The customer's return comments. | +| `%%LNG_NotificationYourReturnContainsTheFollowingItems%%` | "Your Return Request Contains the Following Items..." | +| `%%LNG_ReturnItems%%` | "Return Items" | +| `%%LNG_Qty%%` | "Qty" | +| `%%SNIPPET_ReturnItems%%` | . | +| `%%GLOBAL_EmailFooter%%` | "<%s><br><a href="%s.mybigcommerce.com/">http://%s.mybigcommerce.com/</a><br>%s is powered by BigCommerce. <a href="bigcommerce.com">Launch your own store for free</a> with BigCommerce." | diff --git a/docs/legacy/blueprint-themes/global-variables.mdx b/archive/storefront/blueprint/themes/global-variables.mdx similarity index 97% rename from docs/legacy/blueprint-themes/global-variables.mdx rename to archive/storefront/blueprint/themes/global-variables.mdx index 9f7e6d1ce..893f6a17a 100644 --- a/docs/legacy/blueprint-themes/global-variables.mdx +++ b/archive/storefront/blueprint/themes/global-variables.mdx @@ -1,1269 +1,1269 @@ -# Global Variables - -Blueprint themes use the following GLOBAL variables to pull data from the store's database. - -While these variables are prefixed with the word GLOBAL, the data's availability actually varies per session, layout, panel, and snippet. For the list of variables available from anywhere in the store, regardless of session status, see [Store-Wide Variables](/archive/storefront/blueprint/themes/store-wide-global-variables). - -The list below is sorted by the number of times that the Blueprint base theme references the variable – with the most frequently referenced variables at the top: - -| Variable | Description | -|:---------|:------------| -| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL based page, this will be the HTTPS version of the store path. | -| `%%GLOBAL_IMG_PATH%%` | . | -| `%%GLOBAL_ProductName%%` | . | -| `%%GLOBAL_ProductId%%` | . | -| `%%GLOBAL_ShopPathNormal%%` | The normal (non SSL) version of the store URL. | -| `%%GLOBAL_JSCacheToken%%` | . | -| `%%GLOBAL_ProductRating%%` | . | -| `%%GLOBAL_CdnAppPath%%` | . | -| `%%GLOBAL_ProductPrice%%` | . | -| `%%GLOBAL_ProductAddText%%` | . | -| `%%GLOBAL_ProductFieldId%%` | . | -| `%%GLOBAL_EmailFooter%%` | . | -| `%%GLOBAL_ProductLink%%` | . | -| `%%GLOBAL_ShopPathSSL%%` | The SSL version of the store URL. | -| `%%GLOBAL_OrderId%%` | . | -| `%%GLOBAL_ProductThumb%%` | . | -| `%%GLOBAL_HideProductRating%%` | . | -| `%%GLOBAL_ProductURL%%` | . | -| `%%GLOBAL_TPL_PATH%%` | . | -| `%%GLOBAL_HideActionAdd%%` | . | -| `%%GLOBAL_StoreName%%` | The name of the store. | -| `%%GLOBAL_ProductQuantity%%` | . | -| `%%GLOBAL_AlternateClass%%` | . | -| `%%GLOBAL_CartItemId%%` | . | -| `%%GLOBAL_CompareLink%%` | . | -| `%%GLOBAL_HideCompareItems%%` | . | -| `%%GLOBAL_ProductOptions%%` | . | -| `%%GLOBAL_UpperAddressType%%` | . | -| `%%GLOBAL_ErrorMessage%%` | . | -| `%%GLOBAL_ProductNumber%%` | . | -| `%%GLOBAL_HeaderLogo%%` | . | -| `%%GLOBAL_GiftCertificateCode%%` | . | -| `%%GLOBAL_WishListMessage%%` | . | -| `%%GLOBAL_ProductFieldRequired%%` | . | -| `%%GLOBAL_FieldRequiredClass%%` | . | -| `%%GLOBAL_EmailHeader%%` | . | -| `%%GLOBAL_OrderAmount%%` | . | -| `%%GLOBAL_GiftCertificateTo%%` | . | -| `%%GLOBAL_ShipToBillingName%%` | . | -| `%%GLOBAL_SiteColor%%` | The current template’s active color scheme. | -| `%%GLOBAL_ProductFieldName%%` | . | -| `%%GLOBAL_AddressId%%` | . | -| `%%GLOBAL_PageTitle%%` | . | -| `%%GLOBAL_CharacterSet%%` | . | -| `%%GLOBAL_SearchTrackClass%%` | . | -| `%%GLOBAL_ItemId%%` | . | -| `%%GLOBAL_ProductTotal%%` | . | -| `%%GLOBAL_ProductFieldInputSize%%` | . | -| `%%GLOBAL_ProductFieldValue%%` | . | -| `%%GLOBAL_AddressType%%` | . | -| `%%GLOBAL_HideWishlist%%` | . | -| `%%GLOBAL_VideoId%%` | . | -| `%%GLOBAL_SHARED_GIFT_THEME_PATH%%` | . | -| `%%GLOBAL_GiftCertificateAmount%%` | . | -| `%%GLOBAL_GiftCertificateFrom%%` | . | -| `%%GLOBAL_GiftCertificateMessage%%` | . | -| `%%GLOBAL_GiftCertificateExpiryInfo%%` | . | -| `%%GLOBAL_HideShippingOptions%%` | . | -| `%%GLOBAL_HideLimitedCreditWarning%%` | . | -| `%%GLOBAL_ProductAttributes%%` | . | -| `%%GLOBAL_ImageDescription%%` | . | -| `%%GLOBAL_HideErrorMessage%%` | . | -| `%%GLOBAL_ExtraCategoryClass%%` | . | -| `%%GLOBAL_BillingAddress%%` | . | -| `%%GLOBAL_ShippingAddress%%` | . | -| `%%GLOBAL_OrderDate%%` | . | -| `%%GLOBAL_HideReviewCaptcha%%` | . | -| `%%GLOBAL_HideReturnAction%%` | . | -| `%%GLOBAL_OrderTotal%%` | . | -| `%%GLOBAL_NewsTitle%%` | . | -| `%%GLOBAL_BrandName%%` | . | -| `%%GLOBAL_VideoTitleLong%%` | . | -| `%%GLOBAL_ItemClass%%` | . | -| `%%GLOBAL_EventDate%%` | . | -| `%%GLOBAL_GiftWrappingName%%` | . | -| `%%GLOBAL_WishListID%%` | . | -| `%%GLOBAL_FormFieldRequiredJS%%` | . | -| `%%GLOBAL_HideCreditCardError%%` | . | -| `%%GLOBAL_CustomerName%%` | . | -| `%%GLOBAL_CustomerEmail%%` | . | -| `%%GLOBAL_CustomerGroupId%%` | Contains the group ID for a logged-in customer who is part of a group. Also contains the group ID for a guest where a default group is set for guests. Blank for a logged-in customer who belongs to no group. Also blank for a guest where no default group is set for guests. Globally available across panels and snippets. | -| `%%GLOBAL_ReCaptchaAPIKeyPublic%%` | . | -| `%%GLOBAL_SearchId%%` | . | -| `%%GLOBAL_OrderComments%%` | . | -| `%%GLOBAL_AllBrandsLink%%` | . | -| `%%GLOBAL_CheckoutLink%%` | . | -| `%%GLOBAL_AdditionalCheckoutButtons%%` | . | -| `%%GLOBAL_CheckoutShippingTitle%%` | . | -| `%%GLOBAL_HideUseStoreCredit%%` | . | -| `%%GLOBAL_HideMailingListInvite%%` | . | -| `%%GLOBAL_AllPricesAreInCurrency%%` | . | -| `%%GLOBAL_HidePurchasingOptions%%` | . | -| `%%GLOBAL_jQueryUIPath%%` | . | -| `%%GLOBAL_ProductMaxTinyWidth%%` | . | -| `%%GLOBAL_ProductMaxTinyHeight%%` | . | -| `%%GLOBAL_BrandLink%%` | . | -| `%%GLOBAL_OrderProductId%%` | . | -| `%%GLOBAL_HideExpectedReleaseDate%%` | . | -| `%%GLOBAL_ExpectedReleaseDate%%` | . | -| `%%GLOBAL_label%%` | . | -| `%%GLOBAL_value%%` | . | -| `%%GLOBAL_ShipSuburb%%` | . | -| `%%GLOBAL_ShipState%%` | . | -| `%%GLOBAL_ShipZip%%` | . | -| `%%GLOBAL_ShipCountry%%` | . | -| `%%GLOBAL_ProductAvailability%%` | . | -| `%%GLOBAL_ProductFieldType%%` | . | -| `%%GLOBAL_FileTypes%%` | . | -| `%%GLOBAL_TransitTime%%` | . | -| `%%GLOBAL_ShippingPrice%%` | . | -| `%%GLOBAL_HideGiftWrapping%%` | . | -| `%%GLOBAL_ProviderId%%` | . | -| `%%GLOBAL_ShippingAddressId%%` | . | -| `%%GLOBAL_BaseCompareLink%%` | . | -| `%%GLOBAL_GiftWrappingId%%` | . | -| `%%GLOBAL_HideSectionPaging%%` | . | -| `%%GLOBAL_SectionPagingPrevious%%` | . | -| `%%GLOBAL_SectionPagingNext%%` | . | -| `%%GLOBAL_SectionPaging%%` | . | -| `%%GLOBAL_TrailBrandName%%` | . | -| `%%GLOBAL_LoginMessage%%` | . | -| `%%GLOBAL_ShippingMethod%%` | . | -| `%%GLOBAL_HideCaptcha%%` | . | -| `%%GLOBAL_HideOrderComments%%` | . | -| `%%GLOBAL_DisableReturnButton%%` | . | -| `%%GLOBAL_ShippingProvider%%` | . | -| `%%GLOBAL_HideCheckoutButton%%` | . | -| `%%GLOBAL_ShippingFormAction%%` | . | -| `%%GLOBAL_ShipCustomFields%%` | . | -| `%%GLOBAL_ShipToAddressChecked%%` | . | -| `%%GLOBAL_ShipAddressButtonText%%` | . | -| `%%GLOBAL_ShippingQuotes%%` | . | -| `%%GLOBAL_DeliveryDisclaimer%%` | . | -| `%%GLOBAL_totals%%` | . | -| `%%GLOBAL_HideCartOptions%%` | . | -| `%%GLOBAL_CommentsHTML%%` | . | -| `%%GLOBAL_AddThisLink%%` | . | -| `%%GLOBAL_TinyImageClickJavascript%%` | . | -| `%%GLOBAL_FeaturedVideo%%` | . | -| `%%GLOBAL_QuickViewProductURL%%` | . | -| `%%GLOBAL_ThumbImageURL%%` | . | -| `%%GLOBAL_ProductAttributeList%%` | . | -| `%%GLOBAL_DisplayAdd%%` | . | -| `%%GLOBAL_DisplayAddQty%%` | . | -| `%%GLOBAL_HideNormalMessage%%` | . | -| `%%GLOBAL_HideSuccessMessage%%` | . | -| `%%GLOBAL_WishListName%%` | . | -| `%%GLOBAL_DownloadsLink%%` | . | -| `%%GLOBAL_HideWrappingOptions%%` | . | -| `%%GLOBAL_ReturnId%%` | . | -| `%%GLOBAL_ReturnReason%%` | . | -| `%%GLOBAL_ReturnAction%%` | . | -| `%%GLOBAL_ReturnComments%%` | . | -| `%%GLOBAL_ShipFullName%%` | . | -| `%%GLOBAL_ShipCompany%%` | . | -| `%%GLOBAL_ShipPhone%%` | . | -| `%%GLOBAL_RecentPostUrl%%` | . | -| `%%GLOBAL_CatTrailName%%` | . | -| `%%GLOBAL_HideThumbColumn%%` | . | -| `%%GLOBAL_HideGiftMessagePreview%%` | . | -| `%%GLOBAL_GiftMessagePreview%%` | . | -| `%%GLOBAL_CustomFieldName%%` | . | -| `%%GLOBAL_CustomFieldValue%%` | . | -| `%%GLOBAL_ShippingQuoteId%%` | . | -| `%%GLOBAL_PageLink%%` | . | -| `%%GLOBAL_CartProductFields%%` | . | -| `%%GLOBAL_PaymentFieldPrefix%%` | . | -| `%%GLOBAL_FromURL%%` | . | -| `%%GLOBAL_AddressLine%%` | . | -| `%%GLOBAL_FeaturedCategoryName%%` | . | -| `%%GLOBAL_HideGiftWrapMessage%%` | . | -| `%%GLOBAL_PaymentMessage%%` | . | -| `%%GLOBAL_TagName%%` | . | -| `%%GLOBAL_PaymentMethod%%` | . | -| `%%GLOBAL_ProductSku%%` | . | -| `%%GLOBAL_ZoomImageMaxWidth%%` | . | -| `%%GLOBAL_ZoomImageMaxHeight%%` | . | -| `%%GLOBAL_SectionType%%` | . | -| `%%GLOBAL_SharingName%%` | . | -| `%%GLOBAL_SubBrandLink%%` | . | -| `%%GLOBAL_SubCatLink%%` | . | -| `%%GLOBAL_Amount%%` | . | -| `%%GLOBAL_TransactionType%%` | . | -| `%%GLOBAL_DateTime%%` | . | -| `%%GLOBAL_AuthorisationCode%%` | . | -| `%%GLOBAL_ResponseCode%%` | . | -| `%%GLOBAL_ResponseMessage%%` | . | -| `%%GLOBAL_MerchantURL%%` | . | -| `%%GLOBAL_CardholderName%%` | . | -| `%%GLOBAL_ReferenceNumber%%` | . | -| `%%GLOBAL_InvoiceNumber%%` | . | -| `%%GLOBAL_HideMessagesMenu%%` | . | -| `%%GLOBAL_HideReturnRequestsMenu%%` | . | -| `%%GLOBAL_ReturnInstructions%%` | . | -| `%%GLOBAL_AuthorizeNetHideCVV2%%` | . | -| `%%GLOBAL_BlogPageTitle%%` | . | -| `%%GLOBAL_CCTypes%%` | . | -| `%%GLOBAL_HideLoginMessage%%` | . | -| `%%GLOBAL_MessageClass%%` | . | -| `%%GLOBAL_EWayHideCardCode%%` | . | -| `%%GLOBAL_CreditCardErrorMessage%%` | . | -| `%%GLOBAL_CreditCardNum%%` | . | -| `%%GLOBAL_CreditCardHideCardCode%%` | . | -| `%%GLOBAL_MessageText%%` | . | -| `%%GLOBAL_NMIHideCVV2%%` | . | -| `%%GLOBAL_STYLE_PATH%%` | . | -| `%%GLOBAL_StoreAddressFormatted%%` | The address of the store (as configured on the store settings page) | -| `%%GLOBAL_BillingPhone%%` | . | -| `%%GLOBAL_ShippingPhone%%` | . | -| `%%GLOBAL_HideShippingMethod%%` | . | -| `%%GLOBAL_DateShipped%%` | . | -| `%%GLOBAL_ProductsTable%%` | . | -| `%%GLOBAL_HideComments%%` | . | -| `%%GLOBAL_Comments%%` | . | -| `%%GLOBAL_PageContent%%` | . | -| `%%GLOBAL_HideFullName%%` | . | -| `%%GLOBAL_HideCompanyName%%` | . | -| `%%GLOBAL_HidePhone%%` | . | -| `%%GLOBAL_HideOrderNo%%` | . | -| `%%GLOBAL_HideRMANo%%` | . | -| `%%GLOBAL_PayflowProHideCVV2%%` | . | -| `%%GLOBAL_HideReviewEmail%%` | . | -| `%%GLOBAL_ProductReviewPaging%%` | . | -| `%%GLOBAL_ProdImageJavascript%%` | . | -| `%%GLOBAL_SearchTitle%%` | . | -| `%%GLOBAL_HideRelatedSearches%%` | . | -| `%%GLOBAL_ShowSearchSuggestion%%` | . | -| `%%GLOBAL_SuggestQueryEscaped%%` | . | -| `%%GLOBAL_SuggestQuery%%` | . | -| `%%GLOBAL_ShippingAddressFormTitle%%` | . | -| `%%GLOBAL_HideReturnForm%%` | . | -| `%%GLOBAL_OrderStatus%%` | . | -| `%%GLOBAL_AKBPath%%` | . | -| `%%GLOBAL_AddressFormFieldID%%` | . | -| `%%GLOBAL_HideShopByBrandPanel%%` | . | -| `%%GLOBAL_ListJS%%` | . | -| `%%GLOBAL_CompareOnSubmit%%` | . | -| `%%GLOBAL_CategoryProductListing%%` | . | -| `%%GLOBAL_HideErrors%%` | . | -| `%%GLOBAL_ShipAddressButtonText_JS%%` | . | -| `%%GLOBAL_CheckoutShippingIntro%%` | . | -| `%%GLOBAL_ItemList%%` | . | -| `%%GLOBAL_HideCheckoutError%%` | . | -| `%%GLOBAL_CheckoutErrorMsg%%` | . | -| `%%GLOBAL_HideCheckoutSuccess%%` | . | -| `%%GLOBAL_CheckoutSuccessMsg%%` | . | -| `%%GLOBAL_HideUseCoupon%%` | . | -| `%%GLOBAL_HidePaymentOptions%%` | . | -| `%%GLOBAL_CheckoutStoreCreditWarning%%` | . | -| `%%GLOBAL_StoreCredit%%` | . | -| `%%GLOBAL_Remaining%%` | . | -| `%%GLOBAL_HideRemainingStoreCredit%%` | . | -| `%%GLOBAL_RemainingCredit%%` | . | -| `%%GLOBAL_HideLimitedCreditPaymentOption%%` | . | -| `%%GLOBAL_StoreCreditPaymentProviders%%` | . | -| `%%GLOBAL_CheckoutWith%%` | . | -| `%%GLOBAL_HideCreditAltOptionList%%` | . | -| `%%GLOBAL_CreditAlt%%` | . | -| `%%GLOBAL_HidePaymentProviderList%%` | . | -| `%%GLOBAL_PaymentProviders%%` | . | -| `%%GLOBAL_HideOrderTermsAndConditions%%` | . | -| `%%GLOBAL_HideTermsAndConditionsTextarea%%` | . | -| `%%GLOBAL_OrderTermsAndConditions%%` | . | -| `%%GLOBAL_AgreeTermsAndConditions%%` | . | -| `%%GLOBAL_TermsAndConditionsLink%%` | . | -| `%%GLOBAL_NewsletterBoxIsTicked%%` | . | -| `%%GLOBAL_HideOrderCheckBox%%` | . | -| `%%GLOBAL_OrderBoxIsTicked%%` | . | -| `%%GLOBAL_PaymentButtonSwitch%%` | . | -| `%%GLOBAL_CreateAccountAccountFormFieldID%%` | . | -| `%%GLOBAL_StatusMessage%%` | . | -| `%%GLOBAL_QuickViewButtonText%%` | . | -| `%%GLOBAL_QuickViewButtonColor%%` | . | -| `%%GLOBAL_QuickViewGradientColor%%` | . | -| `%%GLOBAL_QuickViewTextColor%%` | . | -| `%%GLOBAL_FacetedSearchScriptPath%%` | . | -| `%%GLOBAL_DebugDetails%%` | . | -| `%%GLOBAL_DesignModeHTML%%` | . | -| `%%GLOBAL_QueryList%%` | . | -| `%%GLOBAL_DesignModeScriptTag%%` | . | -| `%%GLOBAL_LiveChatFooterCode%%` | . | -| `%%GLOBAL_FooterScripts%%` | . | -| `%%GLOBAL_HideForgotPasswordError%%` | . | -| `%%GLOBAL_MaintenanceNotice%%` | . | -| `%%GLOBAL_CartItems%%` | A textual string representing the number of items in the cart (1 item, 2 items, etc.). | -| `%%GLOBAL_HideSectionSeparator%%` | . | -| `%%GLOBAL_ProductThumbWidth%%` | . | -| `%%GLOBAL_ProductThumbHeight%%` | . | -| `%%GLOBAL_HideBrandLink%%` | . | -| `%%GLOBAL_HideRating%%` | . | -| `%%GLOBAL_Rating%%` | . | -| `%%GLOBAL_HidePrice%%` | . | -| `%%GLOBAL_RetailPrice%%` | . | -| `%%GLOBAL_IncludingExcludingTax%%` | . | -| `%%GLOBAL_YouSave%%` | . | -| `%%GLOBAL_VideoLength%%` | . | -| `%%GLOBAL_VideoDescriptionLong%%` | . | -| `%%GLOBAL_CartLink%%` | . | -| `%%GLOBAL_ProductOptionRequired%%` | . | -| `%%GLOBAL_FastCartButtonJs%%` | . | -| `%%GLOBAL_HideProductAttributeList%%` | . | -| `%%GLOBAL_AddToCartQty%%` | . | -| `%%GLOBAL_HideBulkDiscountLink%%` | . | -| `%%GLOBAL_BulkDiscountThickBoxRates%%` | . | -| `%%GLOBAL_ItemSoldOut%%` | . | -| `%%GLOBAL_OptionMessage%%` | . | -| `%%GLOBAL_ShowAddToCartQtyBox%%` | . | -| `%%GLOBAL_ProductMinMaxQtyJavascript%%` | . | -| `%%GLOBAL_EventDateJavascript%%` | . | -| `%%GLOBAL_AgreeChecked%%` | . | -| `%%GLOBAL_HideThemeSelect%%` | . | -| `%%GLOBAL_GiftCertificateMinimum%%` | . | -| `%%GLOBAL_GiftCertificateMaximum%%` | . | -| `%%GLOBAL_HideSearchPage%%` | . | -| `%%GLOBAL_ProductTabActive%%` | . | -| `%%GLOBAL_ProductTabUrl%%` | . | -| `%%GLOBAL_ContentTabActive%%` | . | -| `%%GLOBAL_ContentTabUrl%%` | . | -| `%%GLOBAL_ProductContainerDisplay%%` | . | -| `%%GLOBAL_ContentContainerDisplay%%` | . | -| `%%GLOBAL_SelectedSearchTab%%` | . | -| `%%GLOBAL_HideProductSearchOptions%%` | . | -| `%%GLOBAL_HideSearchResultsNoResult%%` | . | -| `%%GLOBAL_OriginalSearchQuery%%` | . | -| `%%GLOBAL_HideSideProductRecentlyViewedCompare%%` | . | -| `%%GLOBAL_HideIfNoSubsection%%` | . | -| `%%GLOBAL_HideSuggestiveCartContent%%` | . | -| `%%GLOBAL_SuggestedProductListing%%` | . | -| `%%GLOBAL_HideAccountOptions%%` | . | -| `%%GLOBAL_DownloadLink%%` | . | -| `%%GLOBAL_ExpiryInfo%%` | . | -| `%%GLOBAL_AccountOrderItemList%%` | . | -| `%%GLOBAL_StrikeStart%%` | . | -| `%%GLOBAL_StrikeEnd%%` | . | -| `%%GLOBAL_Refunded%%` | . | -| `%%GLOBAL_HidePaymentInstructions%%` | . | -| `%%GLOBAL_ReturnStatus%%` | . | -| `%%GLOBAL_ShipAddressLines%%` | . | -| `%%GLOBAL_RecentPostTitle%%` | . | -| `%%GLOBAL_CatTrailLink%%` | . | -| `%%GLOBAL_CouponCode%%` | . | -| `%%GLOBAL_CouponDiscount%%` | . | -| `%%GLOBAL_GiftCertificateRemaining%%` | . | -| `%%GLOBAL_CertificateAmountUsed%%` | . | -| `%%GLOBAL_ProductImage%%` | . | -| `%%GLOBAL_ProductNameSpan%%` | . | -| `%%GLOBAL_ProductExpectedReleaseDate%%` | . | -| `%%GLOBAL_GiftCertificateName%%` | . | -| `%%GLOBAL_HideCartFileName%%` | . | -| `%%GLOBAL_ProductFieldFileValue%%` | . | -| `%%GLOBAL_HideDeleteFileLink%%` | . | -| `%%GLOBAL_HideFileHelp%%` | . | -| `%%GLOBAL_FileSize%%` | . | -| `%%GLOBAL_CurrentProductFile%%` | . | -| `%%GLOBAL_SelectOptions%%` | . | -| `%%GLOBAL_ShipperName%%` | . | -| `%%GLOBAL_TaxName%%` | . | -| `%%GLOBAL_TaxCost%%` | . | -| `%%GLOBAL_PageNumber%%` | . | -| `%%GLOBAL_ProductDescription%%` | . | -| `%%GLOBAL_AccountEmail%%` | . | -| `%%GLOBAL_ShipAddressLine1%%` | . | -| `%%GLOBAL_ShipAddressLine2%%` | . | -| `%%GLOBAL_HideChooseAddress%%` | . | -| `%%GLOBAL_UseAddressTitle%%` | . | -| `%%GLOBAL_FlyoutAttributes%%` | . | -| `%%GLOBAL_FlyoutChildHtml%%` | . | -| `%%GLOBAL_CurrencyName%%` | . | -| `%%GLOBAL_AddressFieldId%%` | . | -| `%%GLOBAL_PageName%%` | . | -| `%%GLOBAL_CurrentProductLink%%` | . | -| `%%GLOBAL_InitialZoomImage%%` | . | -| `%%GLOBAL_HideBillingEmail%%` | . | -| `%%GLOBAL_BillingEmail%%` | . | -| `%%GLOBAL_hideInvoiceShippingDetails%%` | . | -| `%%GLOBAL_HideShippingEmail%%` | . | -| `%%GLOBAL_ShippingEmail%%` | . | -| `%%GLOBAL_hideAddressColumn%%` | . | -| `%%GLOBAL_HideAttributes%%` | . | -| `%%GLOBAL_HideVariationOptions%%` | . | -| `%%GLOBAL_HideConfigurableFields%%` | . | -| `%%GLOBAL_ProductConfigurableFields%%` | . | -| `%%GLOBAL_ProductGiftWrapping%%` | . | -| `%%GLOBAL_HideEventDate%%` | . | -| `%%GLOBAL_ProductEventDate%%` | . | -| `%%GLOBAL_OptionChooseText%%` | . | -| `%%GLOBAL_ReviewStart%%` | . | -| `%%GLOBAL_ReviewLink%%` | . | -| `%%GLOBAL_FontSize%%` | . | -| `%%GLOBAL_TagLink%%` | . | -| `%%GLOBAL_TagProductCount%%` | . | -| `%%GLOBAL_ProductThumbIndex%%` | . | -| `%%GLOBAL_VariationName%%` | . | -| `%%GLOBAL_VariationNumber%%` | . | -| `%%GLOBAL_OptionId%%` | . | -| `%%GLOBAL_OptionValue%%` | . | -| `%%GLOBAL_NewsURL%%` | . | -| `%%GLOBAL_PageURL%%` | . | -| `%%GLOBAL_PageSmallContent%%` | . | -| `%%GLOBAL_SectionSearchResults%%` | . | -| `%%GLOBAL_RSSURL%%` | . | -| `%%GLOBAL_HideSplitWrappingOptions%%` | . | -| `%%GLOBAL_ShipperId%%` | . | -| `%%GLOBAL_CatId%%` | . | -| `%%GLOBAL_SocialMedia_Service_Name%%` | . | -| `%%GLOBAL_SubBrandName%%` | . | -| `%%GLOBAL_SubCatName%%` | . | -| `%%GLOBAL_ISOCode%%` | . | -| `%%GLOBAL_IssuerName%%` | . | -| `%%GLOBAL_IssuerConfirmation%%` | . | -| `%%GLOBAL_FirstName%%` | . | -| `%%GLOBAL_NewGuestAccountResetLink%%` | . | -| `%%GLOBAL_OrderStatusChangedHi%%` | . | -| `%%GLOBAL_OrderNumberStatusChangedTo%%` | . | -| `%%GLOBAL_DatePlaced%%` | . | -| `%%GLOBAL_AC_EmailFooterNote%%` | . | -| `%%GLOBAL_ProductUrl%%` | . | -| `%%GLOBAL_Contact%%` | . | -| `%%GLOBAL_DownloadTitle%%` | . | -| `%%GLOBAL_HideReturnInstructions%%` | . | -| `%%GLOBAL_HideAuthorizeNetError%%` | . | -| `%%GLOBAL_AuthorizeNetErrorMessage%%` | . | -| `%%GLOBAL_AuthorizeNetName%%` | . | -| `%%GLOBAL_AuthorizeNetNum%%` | . | -| `%%GLOBAL_AuthorizeNetMonths%%` | . | -| `%%GLOBAL_AuthorizeNetYears%%` | . | -| `%%GLOBAL_AuthorizeNetCCV2%%` | . | -| `%%GLOBAL_HideCCManualError%%` | . | -| `%%GLOBAL_CCErrorMessage%%` | . | -| `%%GLOBAL_CCName%%` | . | -| `%%GLOBAL_CCNum%%` | . | -| `%%GLOBAL_CCCVV2%%` | . | -| `%%GLOBAL_CCIssueNo%%` | . | -| `%%GLOBAL_CCMonths%%` | . | -| `%%GLOBAL_CCYears%%` | . | -| `%%GLOBAL_CCIssueDateMonths%%` | . | -| `%%GLOBAL_CCIssueDateYears%%` | . | -| `%%GLOBAL_HideCheckoutGuest%%` | . | -| `%%GLOBAL_HideCheckoutRegistrationRequired%%` | . | -| `%%GLOBAL_CustomCheckoutFormNewAccount%%` | . | -| `%%GLOBAL_CustomCheckoutFormBillingAddress%%` | . | -| `%%GLOBAL_CustomCheckoutFormShippingAddress%%` | . | -| `%%GLOBAL_ExpressCheckoutSignedIn%%` | . | -| `%%GLOBAL_ExpressCheckoutDigitalOrder%%` | . | -| `%%GLOBAL_GoToStep%%` | . | -| `%%GLOBAL_CollapsedStepClassAccountDetails%%` | . | -| `%%GLOBAL_ExpressCheckoutHideAccountDetails%%` | . | -| `%%GLOBAL_ExpressCheckoutStepAccountDetails%%` | . | -| `%%GLOBAL_HideGuestCheckoutOptions%%` | . | -| `%%GLOBAL_HideRegisteredCheckoutOptions%%` | . | -| `%%GLOBAL_CollapsedStepClassBillingAddress%%` | . | -| `%%GLOBAL_ExpressCheckoutStepBillingAddress%%` | . | -| `%%GLOBAL_CollapsedStepClassShippingAddress%%` | . | -| `%%GLOBAL_ExpressCheckoutHideShippingAddress%%` | . | -| `%%GLOBAL_ExpressCheckoutStepShippingAddress%%` | . | -| `%%GLOBAL_CollapsedStepClassShippingProvider%%` | . | -| `%%GLOBAL_ExpressCheckoutHideShippingProviders%%` | . | -| `%%GLOBAL_ExpressCheckoutStepShippingProvider%%` | . | -| `%%GLOBAL_CollapsedStepClassConfirmation%%` | . | -| `%%GLOBAL_ExpressCheckoutStepConfirmation%%` | . | -| `%%GLOBAL_CollapsedStepClassPaymentDetails%%` | . | -| `%%GLOBAL_ExpressCheckoutHidePaymentDetails%%` | . | -| `%%GLOBAL_ExpressCheckoutStepPaymentDetails%%` | . | -| `%%GLOBAL_PaymentFormContent%%` | . | -| `%%GLOBAL_ContinueLink%%` | . | -| `%%GLOBAL_Continue%%` | . | -| `%%GLOBAL_BlogName%%` | . | -| `%%GLOBAL_ErrorDetails%%` | . | -| `%%GLOBAL_HideeSelectPlusDPError%%` | . | -| `%%GLOBAL_eSelectPlusDPErrorMessage%%` | . | -| `%%GLOBAL_eSelectPlusDPNum%%` | . | -| `%%GLOBAL_eSelectPlusDPMonths%%` | . | -| `%%GLOBAL_eSelectPlusDPYears%%` | . | -| `%%GLOBAL_eSelectPlusDPCCV2%%` | . | -| `%%GLOBAL_eSelectPlusDPCardHolderName%%` | . | -| `%%GLOBAL_eSelectPlusDPBillStNum%%` | . | -| `%%GLOBAL_eSelectPlusDPBillStName%%` | . | -| `%%GLOBAL_eSelectPlusDPBillZip%%` | . | -| `%%GLOBAL_HideEWayError%%` | . | -| `%%GLOBAL_EWayErrorMessage%%` | . | -| `%%GLOBAL_EWayName%%` | . | -| `%%GLOBAL_EWayMonths%%` | . | -| `%%GLOBAL_EWayYears%%` | . | -| `%%GLOBAL_EWayCardCode%%` | . | -| `%%GLOBAL_CreditCardName%%` | . | -| `%%GLOBAL_CreditCardIssueNo%%` | . | -| `%%GLOBAL_CreditCardIssueDateMonths%%` | . | -| `%%GLOBAL_CreditCardIssueDateYears%%` | . | -| `%%GLOBAL_CreditCardMonths%%` | . | -| `%%GLOBAL_CreditCardYears%%` | . | -| `%%GLOBAL_CreditCardCardCode%%` | . | -| `%%GLOBAL_AdditionalPaymentPageContents%%` | . | -| `%%GLOBAL_HideIdealError%%` | . | -| `%%GLOBAL_IdealErrorMessage%%` | . | -| `%%GLOBAL_IdealPaymentForm%%` | . | -| `%%GLOBAL_PrintInvoiceStylesheetPath%%` | . | -| `%%GLOBAL_PrintableInvoiceList%%` | . | -| `%%GLOBAL_PrintableInvoiceScript%%` | . | -| `%%GLOBAL_MaintenanceLogo%%` | . | -| `%%GLOBAL_MessageTitle%%` | . | -| `%%GLOBAL_HideNMIError%%` | . | -| `%%GLOBAL_NMIErrorMessage%%` | . | -| `%%GLOBAL_NMIName%%` | . | -| `%%GLOBAL_NMINum%%` | . | -| `%%GLOBAL_NMIMonths%%` | . | -| `%%GLOBAL_NMIYears%%` | . | -| `%%GLOBAL_NMICCV2%%` | . | -| `%%GLOBAL_HideError%%` | . | -| `%%GLOBAL_HidePaidOrderConfirmation%%` | . | -| `%%GLOBAL_HidePhysicalOrderConfirmation%%` | . | -| `%%GLOBAL_PhysicalOrderConfirmation%%` | . | -| `%%GLOBAL_HideDigitalOrderConfirmation%%` | . | -| `%%GLOBAL_DigitalOrderConfirmation%%` | . | -| `%%GLOBAL_HideDigitalOrderDownloadLink%%` | . | -| `%%GLOBAL_ViewFullOrderPath%%` | . | -| `%%GLOBAL_HideAwaitingPayment%%` | . | -| `%%GLOBAL_HideSuccess%%` | . | -| `%%GLOBAL_OrderConfirmationDetails%%` | . | -| `%%GLOBAL_ContinueShoppingOnStoreName%%` | . | -| `%%GLOBAL_ConversionCode%%` | . | -| `%%GLOBAL_PackingSlipTitle%%` | . | -| `%%GLOBAL_HideBillingPhone%%` | . | -| `%%GLOBAL_HideShippingPhone%%` | . | -| `%%GLOBAL_HideShippingDate%%` | . | -| `%%GLOBAL_HideTrackingNo%%` | . | -| `%%GLOBAL_TrackingNo%%` | . | -| `%%GLOBAL_HideFormError%%` | . | -| `%%GLOBAL_PageId%%` | . | -| `%%GLOBAL_ContactName%%` | . | -| `%%GLOBAL_ContactEmail%%` | . | -| `%%GLOBAL_ContactCompanyName%%` | . | -| `%%GLOBAL_ContactPhone%%` | . | -| `%%GLOBAL_ContactOrderNo%%` | . | -| `%%GLOBAL_ContactRMA%%` | . | -| `%%GLOBAL_ContactQuestion%%` | . | -| `%%GLOBAL_CaptchaImage%%` | . | -| `%%GLOBAL_ARSPanel%%` | . | -| `%%GLOBAL_HidePayflowProError%%` | . | -| `%%GLOBAL_PayflowProErrorMessage%%` | . | -| `%%GLOBAL_PayflowProName%%` | . | -| `%%GLOBAL_PayflowProNum%%` | . | -| `%%GLOBAL_PayflowProMonths%%` | . | -| `%%GLOBAL_PayflowProYears%%` | . | -| `%%GLOBAL_PayflowProCCV2%%` | . | -| `%%GLOBAL_ProductReviewFlashMessages%%` | . | -| `%%GLOBAL_throttleToken%%` | . | -| `%%GLOBAL_ReviewRating5%%` | . | -| `%%GLOBAL_ReviewRating4%%` | . | -| `%%GLOBAL_ReviewRating3%%` | . | -| `%%GLOBAL_ReviewRating2%%` | . | -| `%%GLOBAL_ReviewRating1%%` | . | -| `%%GLOBAL_RevTitle%%` | . | -| `%%GLOBAL_RevText%%` | . | -| `%%GLOBAL_HideNoReviewsMessage%%` | . | -| `%%GLOBAL_NoReviews%%` | . | -| `%%GLOBAL_ProductReviewList%%` | . | -| `%%GLOBAL_AutoShowReviewForm%%` | . | -| `%%GLOBAL_JumpToReviews%%` | . | -| `%%GLOBAL_popupCssPath%%` | . | -| `%%GLOBAL_jQueryPath%%` | . | -| `%%GLOBAL_CurrentImageIndex%%` | . | -| `%%GLOBAL_ProductMaxImageHeight%%` | . | -| `%%GLOBAL_ProductMaxImageWidth%%` | . | -| `%%GLOBAL_VariationImage%%` | . | -| `%%GLOBAL_RuleImage%%` | . | -| `%%GLOBAL_ProductTinyBoxHeight%%` | . | -| `%%GLOBAL_UnsubscribeTitle%%` | . | -| `%%GLOBAL_DownloadIntro%%` | . | -| `%%GLOBAL_HideMessageSuccess%%` | . | -| `%%GLOBAL_HideMessageError%%` | . | -| `%%GLOBAL_HideNoOrderMessage%%` | . | -| `%%GLOBAL_HideInbox%%` | . | -| `%%GLOBAL_HideInboxMessage%%` | . | -| `%%GLOBAL_AccountInboxIntro%%` | . | -| `%%GLOBAL_ReturnReasonsList%%` | . | -| `%%GLOBAL_ReturnActionsList%%` | . | -| `%%GLOBAL_HideOrderStatus%%` | . | -| `%%GLOBAL_HideSingleShippingAddress%%` | . | -| `%%GLOBAL_FlassMessage%%` | . | -| `%%GLOBAL_HideItemDetailsHeader%%` | . | -| `%%GLOBAL_OrderTotalRows%%` | . | -| `%%GLOBAL_ShowOrderActions%%` | . | -| `%%GLOBAL_LNG_OrderShipments%%` | . | -| `%%GLOBAL_HideOrderStatusList%%` | . | -| `%%GLOBAL_HideNoOrderStatusMessage%%` | . | -| `%%GLOBAL_HideOrderList%%` | . | -| `%%GLOBAL_HideNoOrdersMessage%%` | . | -| `%%GLOBAL_HideRecentItemList%%` | . | -| `%%GLOBAL_HideNoRecentItemsMessage%%` | . | -| `%%GLOBAL_HideNoReturnsMessage%%` | . | -| `%%GLOBAL_HideReturnsList%%` | . | -| `%%GLOBAL_CheckEmail%%` | . | -| `%%GLOBAL_BrandsMessage%%` | . | -| `%%GLOBAL_HideBrandProductListing%%` | . | -| `%%GLOBAL_BrandProductListing%%` | . | -| `%%GLOBAL_HideShoppingCartGrid%%` | . | -| `%%GLOBAL_CartItemTotal%%` | . | -| `%%GLOBAL_HideGiftWrappingTotal%%` | . | -| `%%GLOBAL_GiftWrappingTotal%%` | . | -| `%%GLOBAL_HideDiscountAmount%%` | . | -| `%%GLOBAL_DiscountAmount%%` | . | -| `%%GLOBAL_HideShoppingCartShippingEstimator%%` | . | -| `%%GLOBAL_ShippingCountryList%%` | . | -| `%%GLOBAL_ShippingHideStateList%%` | . | -| `%%GLOBAL_ShippingStateList%%` | . | -| `%%GLOBAL_ShippingHideStateBox%%` | . | -| `%%GLOBAL_AddressState%%` | . | -| `%%GLOBAL_ShippingZip%%` | . | -| `%%GLOBAL_HideShoppingCartShippingCost%%` | . | -| `%%GLOBAL_ShippingCost%%` | . | -| `%%GLOBAL_HideShoppingCartHandlingCost%%` | . | -| `%%GLOBAL_HandlingCost%%` | . | -| `%%GLOBAL_Taxes%%` | . | -| `%%GLOBAL_CartTotal%%` | . | -| `%%GLOBAL_InclusiveTaxes%%` | . | -| `%%GLOBAL_HideMultipleAddressShipping%%` | . | -| `%%GLOBAL_HideMultipleAddressShippingOr%%` | . | -| `%%GLOBAL_KeepShoppingLink%%` | . | -| `%%GLOBAL_KeepShoppingText%%` | . | -| `%%GLOBAL_HideShoppingCartEmptyMessage%%` | . | -| `%%GLOBAL_CartCheckoutButtonControlScript%%` | . | -| `%%GLOBAL_CartStatusMessage%%` | . | -| `%%GLOBAL_CatName%%` | . | -| `%%GLOBAL_CatDesc%%` | . | -| `%%GLOBAL_DisplayMode%%` | . | -| `%%GLOBAL_CompareButton%%` | . | -| `%%GLOBAL_HideTitle%%` | . | -| `%%GLOBAL_BalanceTitle%%` | . | -| `%%GLOBAL_HideGiftCertificateError%%` | . | -| `%%GLOBAL_HideIntro%%` | . | -| `%%GLOBAL_HideExampleImage%%` | . | -| `%%GLOBAL_HideShippingTabs%%` | . | -| `%%GLOBAL_ActiveTabSingle%%` | . | -| `%%GLOBAL_ActiveTabMultiple%%` | . | -| `%%GLOBAL_HideTabSingle%%` | . | -| `%%GLOBAL_HideTabMultiple%%` | . | -| `%%GLOBAL_CheckoutMultiShippingIntro%%` | . | -| `%%GLOBAL_HideShippingProviderList%%` | . | -| `%%GLOBAL_HideNoShippingProviders%%` | . | -| `%%GLOBAL_ShippingError%%` | . | -| `%%GLOBAL_ComparisonHeading%%` | . | -| `%%GLOBAL_HideTooManyProductsMessage%%` | . | -| `%%GLOBAL_TooManyProductsMessage%%` | . | -| `%%GLOBAL_NumCompareItems%%` | . | -| `%%GLOBAL_HideConfirmOrderPage%%` | . | -| `%%GLOBAL_HideShippingDetails%%` | . | -| `%%GLOBAL_CreateAccountHeading%%` | . | -| `%%GLOBAL_HideCreateAccountIntroMessage%%` | . | -| `%%GLOBAL_HideCreateAccountErrorMessage%%` | . | -| `%%GLOBAL_CreateAccountEmailPassword%%` | . | -| `%%GLOBAL_CreateAccountDetails%%` | . | -| `%%GLOBAL_CreateAccountButtonText%%` | . | -| `%%GLOBAL_CreateAccountShippingFormFieldID%%` | . | -| `%%GLOBAL_HideEditAccountIntroMessage%%` | . | -| `%%GLOBAL_HideEditAccountErrorMessage%%` | . | -| `%%GLOBAL_HideEditAccountSuccessMessage%%` | . | -| `%%GLOBAL_AccountCurrentEmail%%` | . | -| `%%GLOBAL_AccountFirstName%%` | . | -| `%%GLOBAL_AccountLastName%%` | . | -| `%%GLOBAL_AccountCompanyName%%` | . | -| `%%GLOBAL_AccountPhone%%` | . | -| `%%GLOBAL_AccountFields%%` | . | -| `%%GLOBAL_EditAccountAccountFormFieldID%%` | . | -| `%%GLOBAL%%` | . | -| `%%GLOBAL_FacetedSearchOptionsJSON%%` | . | -| `%%GLOBAL_QuickLinkText%%` | . | -| `%%GLOBAL_Year%%` | . | -| `%%GLOBAL_PoweredBy%%` | . | -| `%%GLOBAL_PinterestJS%%` | . | -| `%%GLOBAL_CustomerId%%` | . | -| `%%GLOBAL_ForgottenPasswordToken%%` | . | -| `%%GLOBAL_CustomerEmailAddress%%` | . | -| `%%GLOBAL_RemainingBalance%%` | . | -| `%%GLOBAL_AdditionalMetaTags%%` | . | -| `%%GLOBAL_HeadFonts%%` | . | -| `%%GLOBAL_Favicon%%` | . | -| `%%GLOBAL_Stylesheets%%` | . | -| `%%GLOBAL_HeadRSSLinks%%` | . | -| `%%GLOBAL_TrackingCode%%` | . | -| `%%GLOBAL_DesignModeStyleSheet%%` | . | -| `%%GLOBAL_HeaderImageStyle%%` | . | -| `%%GLOBAL_FastCart%%` | . | -| `%%GLOBAL_ShowCookieWarningMessage%%` | . | -| `%%GLOBAL_ProductThumbImageWidth%%` | . | -| `%%GLOBAL_ProductThumbImageHeight%%` | . | -| `%%GLOBAL_AdditionalScriptTags%%` | . | -| `%%GLOBAL_RTLStyles%%` | . | -| `%%GLOBAL_HideHomeFeaturedProductsPanel%%` | . | -| `%%GLOBAL_HideHomeNewProductsPanel%%` | . | -| `%%GLOBAL_HideHomeRecentBlogsPanel%%` | . | -| `%%GLOBAL_SwapFrequency%%` | . | -| `%%GLOBAL_IdealIssuerOptions%%` | . | -| `%%GLOBAL_NewAccountHeading%%` | . | -| `%%GLOBAL_HideNewCustomerButton%%` | . | -| `%%GLOBAL_HideLoginNewAccountIntro%%` | . | -| `%%GLOBAL_BlogPathNormal%%` | . | -| `%%GLOBAL_BlogTitle%%` | . | -| `%%GLOBAL_NewsDate%%` | . | -| `%%GLOBAL_NewsContent%%` | . | -| `%%GLOBAL_SubscriptionHeading%%` | . | -| `%%GLOBAL_Class%%` | . | -| `%%GLOBAL_SubscriptionMessage%%` | . | -| `%%GLOBAL_ShortName%%` | . | -| `%%GLOBAL_PostTitle%%` | . | -| `%%GLOBAL_PostAuthor%%` | . | -| `%%GLOBAL_PostISO8601DatePublished%%` | . | -| `%%GLOBAL_PostDatePublished%%` | . | -| `%%GLOBAL_PostBody%%` | . | -| `%%GLOBAL_HideBreadCrumbs%%` | . | -| `%%GLOBAL_BreadCrumbs%%` | . | -| `%%GLOBAL_FindByCategory%%` | . | -| `%%GLOBAL_ProductDesc%%` | . | -| `%%GLOBAL_productAttributesCssPath%%` | . | -| `%%GLOBAL_CurrentProdThumbImage%%` | . | -| `%%GLOBAL_ProductMaxZoomWidth%%` | . | -| `%%GLOBAL_ProductMaxZoomHeight%%` | . | -| `%%GLOBAL_ShowImageZoomer%%` | . | -| `%%GLOBAL_ProductDetailFlashMessages%%` | . | -| `%%GLOBAL_HideProductThumb%%` | . | -| `%%GLOBAL_LightBoxImageJavascript%%` | . | -| `%%GLOBAL_HideImageCarousel%%` | . | -| `%%GLOBAL_HideMorePicturesLink%%` | . | -| `%%GLOBAL_SeeMorePictures%%` | . | -| `%%GLOBAL_PinterestButton%%` | . | -| `%%GLOBAL_HideReviewLink%%` | . | -| `%%GLOBAL_ReviewLinkOnClick%%` | . | -| `%%GLOBAL_ReviewLinkText%%` | . | -| `%%GLOBAL_FacebookLikeButtonAbove%%` | . | -| `%%GLOBAL_FacebookLikeButtonBelow%%` | . | -| `%%GLOBAL_NavLinkDisplay%%` | . | -| `%%GLOBAL_DisablePrevLink%%` | . | -| `%%GLOBAL_DisableNextLink%%` | . | -| `%%GLOBAL_TotalImages%%` | . | -| `%%GLOBAL_HideCustomFields%%` | . | -| `%%GLOBAL_ProductTabsControlScript%%` | . | -| `%%GLOBAL_ProductImageMode%%` | . | -| `%%GLOBAL_HideSingleVideo%%` | . | -| `%%GLOBAL_HideVideoList%%` | . | -| `%%GLOBAL_ProductWarranty%%` | . | -| `%%GLOBAL_QuickViewShareLinks%%` | . | -| `%%GLOBAL_QuickViewFacebookLikeButton%%` | . | -| `%%GLOBAL_QuickViewProductName%%` | . | -| `%%GLOBAL_QuickViewReviews%%` | . | -| `%%GLOBAL_HideRRP%%` | . | -| `%%GLOBAL_CertificateTitle%%` | . | -| `%%GLOBAL_HideGiftCertificateForm%%` | . | -| `%%GLOBAL_CertificateTo%%` | . | -| `%%GLOBAL_CertificateToEmail%%` | . | -| `%%GLOBAL_CertificateFrom%%` | . | -| `%%GLOBAL_CertificateFromEmail%%` | . | -| `%%GLOBAL_CertificateMessage%%` | . | -| `%%GLOBAL_HideGiftCertificateAmountSelect%%` | . | -| `%%GLOBAL_GiftCertificateAmountSelect%%` | . | -| `%%GLOBAL_HideGiftCertificateCustomAmount%%` | . | -| `%%GLOBAL_CustomCertificateAmount%%` | . | -| `%%GLOBAL_GiftCertificateRange%%` | . | -| `%%GLOBAL_HideExpiryInfo%%` | . | -| `%%GLOBAL_GiftCertificateTerms%%` | . | -| `%%GLOBAL_GiftCertificateThemes%%` | . | -| `%%GLOBAL_SaveGiftCertificateButton%%` | . | -| `%%GLOBAL_GiftCertificatePreviewModalTitle%%` | . | -| `%%GLOBAL_CategoryOptions%%` | . | -| `%%GLOBAL_SelectedCategoryOptions%%` | . | -| `%%GLOBAL_AutoHideSearchForm%%` | . | -| `%%GLOBAL_HideAdvancedLink%%` | . | -| `%%GLOBAL_HideAdvancedOptions%%` | . | -| `%%GLOBAL_FormattedSearchQuery%%` | . | -| `%%GLOBAL_BrandNameOptions%%` | . | -| `%%GLOBAL_PriceFrom%%` | . | -| `%%GLOBAL_PriceTo%%` | . | -| `%%GLOBAL_HideSearchResults%%` | . | -| `%%GLOBAL_SearchResults%%` | . | -| `%%GLOBAL_HideSearchResultsContent%%` | . | -| `%%GLOBAL_SearchResultsContent%%` | . | -| `%%GLOBAL_HideSearchResultsCategoryAndBrand%%` | . | -| `%%GLOBAL_HideSearchResultsCategory%%` | . | -| `%%GLOBAL_SearchResultsCategory%%` | . | -| `%%GLOBAL_HideSearchResultsBrand%%` | . | -| `%%GLOBAL_SearchResultsBrand%%` | . | -| `%%GLOBAL_HideSearchResultsProduct%%` | . | -| `%%GLOBAL_SearchResultsProduct%%` | . | -| `%%GLOBAL_SnippetSearchResultsFeed%%` | . | -| `%%GLOBAL_FirstProductId%%` | . | -| `%%GLOBAL_SharingData%%` | . | -| `%%GLOBAL_HideChooseAnotherToShare%%` | . | -| `%%GLOBAL_HideAddShippingAddressIntroMessage%%` | . | -| `%%GLOBAL_ShippingAddressFormIntro%%` | . | -| `%%GLOBAL_HideAddShippingAddressMessage%%` | . | -| `%%GLOBAL_Message%%` | . | -| `%%GLOBAL_ShippingAddressFormAction%%` | . | -| `%%GLOBAL_ShipId%%` | . | -| `%%GLOBAL_NumNewMessages%%` | . | -| `%%GLOBAL_NumWishListItems%%` | . | -| `%%GLOBAL_HideStoreCredit%%` | . | -| `%%GLOBAL_StoreCreditAmount%%` | . | -| `%%GLOBAL_HideBrandTagCloudPanel%%` | . | -| `%%GLOBAL_HideSideCart%%` | . | -| `%%GLOBAL_SideCartItemCount%%` | . | -| `%%GLOBAL_SideCategoryListTypeClass%%` | . | -| `%%GLOBAL_HideSideCategoryNewProductsPanel%%` | . | -| `%%GLOBAL_HideSideCategoryPopularProductsPanel%%` | . | -| `%%GLOBAL_HideSideCategoryShopByPricePanel%%` | . | -| `%%GLOBAL_HideSideCategoryTopSellersPanel%%` | . | -| `%%GLOBAL_SideLiveChatCode%%` | . | -| `%%GLOBAL_HideSideNewProductsPanel%%` | . | -| `%%GLOBAL_NewsletterBoxControlScript%%` | . | -| `%%GLOBAL_HideSidePopularProductsPanel%%` | . | -| `%%GLOBAL_WishLists%%` | . | -| `%%GLOBAL_AlsoBoughtProductListing%%` | . | -| `%%GLOBAL_HideRecentlyViewedProductsPanel%%` | . | -| `%%GLOBAL_HideRelatedProductsPanel%%` | . | -| `%%GLOBAL_HideSideShopByBrandFullPanel%%` | . | -| `%%GLOBAL_HideSubPagesList%%` | . | -| `%%GLOBAL_PageLinks%%` | . | -| `%%GLOBAL_HideSideTopSellersPanel%%` | . | -| `%%GLOBAL_HideIfSubsection%%` | . | -| `%%GLOBAL_SitemapLink%%` | . | -| `%%GLOBAL_SitemapSubsectionTrail%%` | . | -| `%%GLOBAL_ShowNewsFeed%%` | . | -| `%%GLOBAL_ShowNewProductsFeed%%` | . | -| `%%GLOBAL_ShowPopularProductsFeed%%` | . | -| `%%GLOBAL_ShowFeaturedProductsFeed%%` | . | -| `%%GLOBAL_ShowSearchFeed%%` | . | -| `%%GLOBAL_TaggedProducts%%` | . | -| `%%GLOBAL_TagProductListing%%` | . | -| `%%GLOBAL_ShowStorePhoneNumber%%` | . | -| `%%GLOBAL_StorePhoneNumber%%` | . | -| `%%GLOBAL_LiveChatCodeEnabled%%` | . | -| `%%GLOBAL_LiveChatCode%%` | . | -| `%%GLOBAL_LoginOrLogoutText%%` | . | -| `%%GLOBAL_HideWishListAddFrom%%` | . | -| `%%GLOBAL_WishListAction%%` | . | -| `%%GLOBAL_SelectPublic%%` | . | -| `%%GLOBAL_HideWishListItems%%` | . | -| `%%GLOBAL_HideShareWishList%%` | . | -| `%%GLOBAL_ShareWishListClass%%` | . | -| `%%GLOBAL_ShareWishListIntro%%` | . | -| `%%GLOBAL_PublicWishListUrl%%` | . | -| `%%GLOBAL_HideWishLists%%` | . | -| `%%GLOBAL_HideWishListsTable%%` | . | -| `%%GLOBAL_DownloadName%%` | . | -| `%%GLOBAL_DisplayDownloadLink%%` | . | -| `%%GLOBAL_DownloadSize%%` | . | -| `%%GLOBAL_DownloadColor%%` | . | -| `%%GLOBAL_DisplayDownloadExpired%%` | . | -| `%%GLOBAL_DownloadDescription%%` | . | -| `%%GLOBAL_MessageSubject%%` | . | -| `%%GLOBAL_MessageDate%%` | . | -| `%%GLOBAL_Icon%%` | . | -| `%%GLOBAL_Sender%%` | . | -| `%%GLOBAL_MessageContent%%` | . | -| `%%GLOBAL_OrderItemMessage%%` | . | -| `%%GLOBAL_ProductQtySelect%%` | . | -| `%%GLOBAL_DisableViewButton%%` | . | -| `%%GLOBAL_DownloadItemEncrypted%%` | . | -| `%%GLOBAL_ItemQty%%` | . | -| `%%GLOBAL_ItemName%%` | . | -| `%%GLOBAL_ItemShippingRow%%` | . | -| `%%GLOBAL_DisableReorder%%` | . | -| `%%GLOBAL_Qty%%` | . | -| `%%GLOBAL_Link%%` | . | -| `%%GLOBAL_Target%%` | . | -| `%%GLOBAL_Name%%` | . | -| `%%GLOBAL_HideItemMessage%%` | . | -| `%%GLOBAL_ReorderMessage%%` | . | -| `%%GLOBAL_Price%%` | . | -| `%%GLOBAL_ItemShippingRow_AddressLine%%` | . | -| `%%GLOBAL_TrackingLink%%` | . | -| `%%GLOBAL_OrderInstructions%%` | . | -| `%%GLOBAL_ReturnedQuantity%%` | . | -| `%%GLOBAL_ReturnedProduct%%` | . | -| `%%GLOBAL_ReturnedProductOptions%%` | . | -| `%%GLOBAL_DateRequested%%` | . | -| `%%GLOBAL_HideReturnComment%%` | . | -| `%%GLOBAL_AddThisServiceButtonMeta%%` | . | -| `%%GLOBAL_AddThisServiceButtons%%` | . | -| `%%GLOBAL_Thumbnail%%` | . | -| `%%GLOBAL_RecentPostSummary%%` | . | -| `%%GLOBAL_NumProducts%%` | . | -| `%%GLOBAL_TagSize%%` | . | -| `%%GLOBAL_ChooseBrandFromList%%` | . | -| `%%GLOBAL_CouponId%%` | . | -| `%%GLOBAL_MASTER_THEME_PATH%%` | . | -| `%%GLOBAL_CustomizeProductTitle%%` | . | -| `%%GLOBAL_GiftCertificateId%%` | . | -| `%%GLOBAL_HideGiftWrappingAdd%%` | . | -| `%%GLOBAL_HideGiftWrappingEdit%%` | . | -| `%%GLOBAL_CartItemQty%%` | . | -| `%%GLOBAL_HideCartItemRemove%%` | . | -| `%%GLOBAL_QtySelectStyle%%` | . | -| `%%GLOBAL_Quantity1%%` | . | -| `%%GLOBAL_Quantity2%%` | . | -| `%%GLOBAL_Quantity3%%` | . | -| `%%GLOBAL_Quantity4%%` | . | -| `%%GLOBAL_Quantity5%%` | . | -| `%%GLOBAL_Quantity6%%` | . | -| `%%GLOBAL_Quantity7%%` | . | -| `%%GLOBAL_Quantity8%%` | . | -| `%%GLOBAL_Quantity9%%` | . | -| `%%GLOBAL_Quantity10%%` | . | -| `%%GLOBAL_Quantity11%%` | . | -| `%%GLOBAL_Quantity12%%` | . | -| `%%GLOBAL_Quantity13%%` | . | -| `%%GLOBAL_Quantity14%%` | . | -| `%%GLOBAL_Quantity15%%` | . | -| `%%GLOBAL_Quantity16%%` | . | -| `%%GLOBAL_Quantity17%%` | . | -| `%%GLOBAL_Quantity18%%` | . | -| `%%GLOBAL_Quantity19%%` | . | -| `%%GLOBAL_Quantity20%%` | . | -| `%%GLOBAL_Quantity21%%` | . | -| `%%GLOBAL_Quantity22%%` | . | -| `%%GLOBAL_Quantity23%%` | . | -| `%%GLOBAL_Quantity24%%` | . | -| `%%GLOBAL_Quantity25%%` | . | -| `%%GLOBAL_Quantity26%%` | . | -| `%%GLOBAL_Quantity27%%` | . | -| `%%GLOBAL_Quantity28%%` | . | -| `%%GLOBAL_Quantity29%%` | . | -| `%%GLOBAL_Quantity30%%` | . | -| `%%GLOBAL_QtyOptionSelected%%` | . | -| `%%GLOBAL_ProductAttributeName%%` | . | -| `%%GLOBAL_ProductAttributeValue%%` | . | -| `%%GLOBAL_NextLink%%` | . | -| `%%GLOBAL_PrevLink%%` | . | -| `%%GLOBAL_URL%%` | . | -| `%%GLOBAL_HiddenSortField%%` | . | -| `%%GLOBAL_SortFeaturedSelected%%` | . | -| `%%GLOBAL_SortNewestSelected%%` | . | -| `%%GLOBAL_SortBestSellingSelected%%` | . | -| `%%GLOBAL_SortAlphaAsc%%` | . | -| `%%GLOBAL_SortAlphaDesc%%` | . | -| `%%GLOBAL_SortAvgReview%%` | . | -| `%%GLOBAL_SortPriceAsc%%` | . | -| `%%GLOBAL_SortPriceDesc%%` | . | -| `%%GLOBAL_HideCartProductFields%%` | . | -| `%%GLOBAL_MailFormatPreferenceOptions%%` | . | -| `%%GLOBAL_ProviderChecked%%` | . | -| `%%GLOBAL_ProviderType%%` | . | -| `%%GLOBAL_ProviderPaymentFormClass%%` | . | -| `%%GLOBAL_ProviderName%%` | . | -| `%%GLOBAL_HideAddressButton%%` | . | -| `%%GLOBAL_CompareWidth%%` | . | -| `%%GLOBAL_RemoveCompareLink%%` | . | -| `%%GLOBAL_HideComparisonReviewLink%%` | . | -| `%%GLOBAL_NumReviews%%` | . | -| `%%GLOBAL_ProductSummary%%` | . | -| `%%GLOBAL_CustomFields%%` | . | -| `%%GLOBAL_ProductBrand%%` | . | -| `%%GLOBAL_CompareHeadWidth%%` | . | -| `%%GLOBAL_HideProductPrice%%` | . | -| `%%GLOBAL_PrivacyCookieNotification%%` | . | -| `%%GLOBAL_ProductAttributesJavascript%%` | . | -| `%%GLOBAL_DesignModeCurrentTemplate%%` | . | -| `%%GLOBAL_DesignModeUpdateUrl%%` | . | -| `%%GLOBAL_ShippingQuoteRow%%` | . | -| `%%GLOBAL_EventDateNameRequired%%` | . | -| `%%GLOBAL_EventDateName%%` | . | -| `%%GLOBAL_EventDateLimitations%%` | . | -| `%%GLOBAL_EventDateMonthStyle%%` | . | -| `%%GLOBAL_OverviewToMonths%%` | . | -| `%%GLOBAL_EventDateDayStyle%%` | . | -| `%%GLOBAL_OverviewToDays%%` | . | -| `%%GLOBAL_EventDateYearStyle%%` | . | -| `%%GLOBAL_OverviewToYears%%` | . | -| `%%GLOBAL_AddressSelected%%` | . | -| `%%GLOBAL_UseExistingAddress%%` | . | -| `%%GLOBAL_AddressList%%` | . | -| `%%GLOBAL_AddNewAddress%%` | . | -| `%%GLOBAL_HideCreateAddress%%` | . | -| `%%GLOBAL_CompiledFormFields%%` | . | -| `%%GLOBAL_HideSaveAddress%%` | . | -| `%%GLOBAL_SaveAddressChecked%%` | . | -| `%%GLOBAL_CompiledFormFieldJavascript%%` | . | -| `%%GLOBAL_AdjustedTotalCost%%` | . | -| `%%GLOBAL_HideButtomPaymentButton%%` | . | -| `%%GLOBAL_ExpressCheckoutLoadPaymentForm%%` | . | -| `%%GLOBAL_FrameWidth%%` | . | -| `%%GLOBAL_FacebookButtonHref%%` | . | -| `%%GLOBAL_fastCartProdImg%%` | . | -| `%%GLOBAL_fastCartQuantityTxt%%` | . | -| `%%GLOBAL_fastCartProdLink%%` | . | -| `%%GLOBAL_fastCartQuantity%%` | . | -| `%%GLOBAL_fastCartProdTotal%%` | . | -| `%%GLOBAL_fastCartSubtotal%%` | . | -| `%%GLOBAL_fastCartNumItemsTxt%%` | . | -| `%%GLOBAL_FeaturedCategoryTextColourClass%%` | . | -| `%%GLOBAL_FeaturedCategoryRootName%%` | . | -| `%%GLOBAL_FeaturedCategoryUrl%%` | . | -| `%%GLOBAL_FeaturedCategoryImage%%` | . | -| `%%GLOBAL_FeaturedCategoryImageStyle%%` | . | -| `%%GLOBAL_FlyoutNodeUrl%%` | . | -| `%%GLOBAL_FlyoutNodeLabel%%` | . | -| `%%GLOBAL_HideWrappingTitle%%` | . | -| `%%GLOBAL_ExtraClass%%` | . | -| `%%GLOBAL_WrappingOptions%%` | . | -| `%%GLOBAL_GiftWrapPreviewLinks%%` | . | -| `%%GLOBAL_GiftWrapMessage%%` | . | -| `%%GLOBAL_HideWrappingSeparator%%` | . | -| `%%GLOBAL_CurrencyID%%` | . | -| `%%GLOBAL_CurrencyFlagURL%%` | . | -| `%%GLOBAL_CurrencyClass%%` | . | -| `%%GLOBAL_CustomerPhone%%` | . | -| `%%GLOBAL_TotalCost%%` | . | -| `%%GLOBAL_CdnStorePath%%` | . | -| `%%GLOBAL_ImageDirectory%%` | The name of the product images directory. | -| `%%GLOBAL_StoreLogo%%` | The store logo (image or text logo) | -| `%%GLOBAL_LogoText%%` | . | -| `%%GLOBAL_MsgBox_Type%%` | . | -| `%%GLOBAL_MsgBox_Message%%` | . | -| `%%GLOBAL_MobileSiteURL%%` | . | -| `%%GLOBAL_ShippingAddressSelect%%` | . | -| `%%GLOBAL_HasSubMenuClass%%` | . | -| `%%GLOBAL_ActivePageClass%%` | . | -| `%%GLOBAL_SubMenu%%` | . | -| `%%GLOBAL_SubMenuLinks%%` | . | -| `%%GLOBAL_RSSLink%%` | . | -| `%%GLOBAL_RSSTitle%%` | . | -| `%%GLOBAL_RSSDescription%%` | . | -| `%%GLOBAL_sPageLink%%` | . | -| `%%GLOBAL_sPageName%%` | . | -| `%%GLOBAL_PinterestButtonDescription%%` | . | -| `%%GLOBAL_TagUrl%%` | . | -| `%%GLOBAL_InvoiceTitle%%` | . | -| `%%GLOBAL_invoiceItemClass%%` | . | -| `%%GLOBAL_addressColumnRowSpan%%` | . | -| `%%GLOBAL_productShippingAddress%%` | . | -| `%%GLOBAL_HidePreOrder%%` | . | -| `%%GLOBAL_ProductPreOrder%%` | . | -| `%%GLOBAL_ProductCost%%` | . | -| `%%GLOBAL_ProductTotalCost%%` | . | -| `%%GLOBAL_FieldName%%` | . | -| `%%GLOBAL_SKUValue%%` | . | -| `%%GLOBAL_FieldValue%%` | . | -| `%%GLOBAL_classNameAppend%%` | . | -| `%%GLOBAL_totalRowColspan%%` | . | -| `%%GLOBAL_ProductBinNumber%%` | . | -| `%%GLOBAL_AddToCartButtonControlScript%%` | . | -| `%%GLOBAL_HideSKU%%` | . | -| `%%GLOBAL_SKU%%` | . | -| `%%GLOBAL_HideCondition%%` | . | -| `%%GLOBAL_ProductCondition%%` | . | -| `%%GLOBAL_HideWeight%%` | . | -| `%%GLOBAL_ProductWeight%%` | . | -| `%%GLOBAL_HideAvailability%%` | . | -| `%%GLOBAL_Availability%%` | . | -| `%%GLOBAL_HideShipping%%` | . | -| `%%GLOBAL_HideMinQty%%` | . | -| `%%GLOBAL_MinQty%%` | . | -| `%%GLOBAL_HideMaxQty%%` | . | -| `%%GLOBAL_MaxQty%%` | . | -| `%%GLOBAL_HideCurrentStock%%` | . | -| `%%GLOBAL_CurrentStockLabel%%` | . | -| `%%GLOBAL_InventoryList%%` | . | -| `%%GLOBAL_GiftWrappingAvailable%%` | . | -| `%%GLOBAL_ProductBulkDiscountThickBox%%` | . | -| `%%GLOBAL_BreadcrumbItems%%` | . | -| `%%GLOBAL_BulkDiscountThickBoxTitle%%` | . | -| `%%GLOBAL_ReleaseDate%%` | . | -| `%%GLOBAL_CheckboxFieldNameLeft%%` | . | -| `%%GLOBAL_CheckboxFieldNameRight%%` | . | -| `%%GLOBAL_FindByCategoryItems%%` | . | -| `%%GLOBAL_ProdImageZoomJavascript%%` | . | -| `%%GLOBAL_LightBoxImageList%%` | . | -| `%%GLOBAL_ProductTinyBoxWidth%%` | . | -| `%%GLOBAL_VisibleImageTotal%%` | . | -| `%%GLOBAL_ReviewError%%` | . | -| `%%GLOBAL_AlternateReviewClass%%` | . | -| `%%GLOBAL_ReviewTitle%%` | . | -| `%%GLOBAL_ReviewRating%%` | . | -| `%%GLOBAL_ReviewName%%` | . | -| `%%GLOBAL_ReviewDate%%` | . | -| `%%GLOBAL_ReviewText%%` | . | -| `%%GLOBAL_ProductReviews%%` | . | -| `%%GLOBAL_PrevRevLink%%` | . | -| `%%GLOBAL_ReviewEnd%%` | . | -| `%%GLOBAL_ProductNumReviews%%` | . | -| `%%GLOBAL_NextRevLink%%` | . | -| `%%GLOBAL_TinyImageOverJavascript%%` | . | -| `%%GLOBAL_ProductThumbImageURL%%` | . | -| `%%GLOBAL_ProductZoomImageURL%%` | . | -| `%%GLOBAL_ProductTinyImageURL%%` | . | -| `%%GLOBAL_VariationChooseText%%` | . | -| `%%GLOBAL_OptionChecked%%` | . | -| `%%GLOBAL_BlogLink%%` | . | -| `%%GLOBAL_BlogText%%` | . | -| `%%GLOBAL_BlogPreview%%` | . | -| `%%GLOBAL_RelatedSearchQuery%%` | . | -| `%%GLOBAL_RelatedSearchText%%` | . | -| `%%GLOBAL_ProductNoImageClassName%%` | . | -| `%%GLOBAL_ProductRatingImage%%` | . | -| `%%GLOBAL_HideSectionSorting%%` | . | -| `%%GLOBAL_SectionSortingOptions%%` | . | -| `%%GLOBAL_SectionExtraClass%%` | . | -| `%%GLOBAL_SectionResults%%` | . | -| `%%GLOBAL_NewsSmallContent%%` | . | -| `%%GLOBAL_GiftWrappingTitle%%` | . | -| `%%GLOBAL_GiftWrapModalClass%%` | . | -| `%%GLOBAL_ShippingData%%` | . | -| `%%GLOBAL_HideAddressLine%%` | . | -| `%%GLOBAL_HideItemList%%` | . | -| `%%GLOBAL_ShippingProviders%%` | . | -| `%%GLOBAL_HideHorizontalRule%%` | . | -| `%%GLOBAL_PriceLink%%` | . | -| `%%GLOBAL_PriceLow%%` | . | -| `%%GLOBAL_PriceHigh%%` | . | -| `%%GLOBAL_LastChildClass%%` | . | -| `%%GLOBAL_CategoryLink%%` | . | -| `%%GLOBAL_CategoryName%%` | . | -| `%%GLOBAL_SubCategoryList%%` | . | -| `%%GLOBAL_CurrencyFlagStyle%%` | . | -| `%%GLOBAL_CurrencySwitchLink%%` | . | -| `%%GLOBAL_CurrencySelected%%` | . | -| `%%GLOBAL_CurrencyFlag%%` | . | -| `%%GLOBAL_RootCatName%%` | . | -| `%%GLOBAL_RootCatList%%` | . | -| `%%GLOBAL_ProductRatingImageDimensions%%` | . | -| `%%GLOBAL_SitemapURL_HTML%%` | . | -| `%%GLOBAL_ModelType%%` | . | -| `%%GLOBAL_ModelHeading%%` | . | -| `%%GLOBAL_ModelBody%%` | . | -| `%%GLOBAL_ModelHideAllLink%%` | . | -| `%%GLOBAL_ModelSubsectionURL%%` | . | -| `%%GLOBAL_Slide_Link_Url%%` | . | -| `%%GLOBAL_Slide_Heading_Color%%` | . | -| `%%GLOBAL_Slide_Heading_Text%%` | . | -| `%%GLOBAL_Slide_Text_Color%%` | . | -| `%%GLOBAL_Slide_Text_Text%%` | . | -| `%%GLOBAL_Slide_Button_Hide%%` | . | -| `%%GLOBAL_Slide_Button_Color%%` | . | -| `%%GLOBAL_Slide_Button_Text%%` | . | -| `%%GLOBAL_Slide_Image_Url%%` | . | -| `%%GLOBAL_Slide_Image_AlternateText%%` | . | -| `%%GLOBAL_SocialMedia_Service_Url%%` | . | -| `%%GLOBAL_UseThemeSettingsClass%%` | . | -| `%%GLOBAL_SocialMedia_Service_Class%%` | . | -| `%%GLOBAL_SharingActiveTab%%` | . | -| `%%GLOBAL_SharingIcon%%` | . | -| `%%GLOBAL_SharingDisplay%%` | . | -| `%%GLOBAL_SubBrandImage%%` | . | -| `%%GLOBAL_SubCatImage%%` | . | -| `%%GLOBAL_VideoTitleShort%%` | . | -| `%%GLOBAL_VideoDescriptionShort%%` | . | -| `%%GLOBAL_NumOfItems%%` | . | -| `%%GLOBAL_WishListShared%%` | . | -| `%%GLOBAL_ShareWishListLink%%` | . | -| `%%GLOBAL_HideRemoveItemButton%%` | . | -| `%%GLOBAL_MerchantName%%` | . | -| `%%GLOBAL_AC_EmailBody%%` | . | -| `%%GLOBAL_AC_UnsubscribeLink%%` | . | -| `%%GLOBAL_Email%%` | . | -| `%%GLOBAL_Password%%` | . | -| `%%GLOBAL_Ebay_Listing_Abort_Email_Message_1%%` | . | -| `%%GLOBAL_Ebay_Listing_Abort_Email_Message_2%%` | . | -| `%%GLOBAL_Ebay_Listing_Error_Email_Message_1%%` | . | -| `%%GLOBAL_Ebay_Listing_Error_Email_Error_Heading%%` | . | -| `%%GLOBAL_Ebay_Listing_Error_Email_Error%%` | . | -| `%%GLOBAL_Ebay_Listing_Error_Email_Error_Footer%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Message_1%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Message_2%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Message_3%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Message_4%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Errors_Heading%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Errors%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Warnings_Heading%%` | . | -| `%%GLOBAL_Ebay_Listing_End_Email_Warnings%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Abort_Email_Message_1%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Abort_Email_Message_2%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Error_Email_Message_1%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error_Heading%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error%%` | . | -| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error_Footer%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_1%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_2%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_3%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_4%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Errors_Heading%%` | . | -| `%%GLOBAL_EmailIntegration_Export_End_Email_Errors%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Header%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Error%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Message%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Time%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Details%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Type%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Subscription%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_CommonCauses%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause1_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause1_Detail%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause2_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause2_Detail%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause3_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause3_Detail%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause4_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause4_Detail%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause5_Intro%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Cause5_Detail%%` | . | -| `%%GLOBAL_EmailIntegrationNotice_Closing%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_1%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_2%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_Lists%%` | . | -| `%%GLOBAL_DeletedLists%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_3%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_4%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_1%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_2%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_MergeFields%%` | . | -| `%%GLOBAL_MergeFieldsList%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_3%%` | . | -| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_4%%` | . | -| `%%GLOBAL_EmailMessage%%` | . | -| `%%GLOBAL_ToName%%` | . | -| `%%GLOBAL_Intro%%` | . | -| `%%GLOBAL_NoPaymentTaken%%` | . | -| `%%GLOBAL_OrderNumber%%` | . | -| `%%GLOBAL_ViewOrderStatusMsg%%` | . | -| `%%GLOBAL_PendingPaymentNotice%%` | . | -| `%%GLOBAL_PendingPaymentDetails%%` | . | -| `%%GLOBAL_OrderCommentBlock%%` | . | -| `%%GLOBAL_CartItemColumns%%` | . | -| `%%GLOBAL_LowInventoryWarning%%` | . | -| `%%GLOBAL_LowInventoryWarningIntro%%` | . | -| `%%GLOBAL_LowInventoryWarningProduct%%` | . | -| `%%GLOBAL_LowInventoryWarningCurrentStock%%` | . | -| `%%GLOBAL_LowInventoryWarningNotice%%` | . | -| `%%GLOBAL_TrackingLinkList%%` | . | -| `%%GLOBAL_ViewOrderStatusLink%%` | . | -| `%%GLOBAL_FormFieldList%%` | . | -| `%%GLOBAL_Question%%` | . | -| `%%GLOBAL_ProductReviewEmailUnsubscribeLink%%` | . | -| `%%GLOBAL_CustomerFirstName%%` | . | -| `%%GLOBAL_ReturnReceivedCredit%%` | . | -| `%%GLOBAL_AC_EmailIntroText%%` | . | -| `%%GLOBAL_ProductThumbnailUrl%%` | . | -| `%%GLOBAL_AC_ExistingCustomer%%` | . | -| `%%GLOBAL_AC_CustomerName%%` | . | -| `%%GLOBAL_AC_CustomerEmail%%` | . | -| `%%GLOBAL_AC_CustomerPhone%%` | . | -| `%%GLOBAL_AC_CustomerAddress%%` | . | -| `%%GLOBAL_AC_ModifiedType%%` | . | -| `%%GLOBAL_AC_DateModified%%` | . | -| `%%GLOBAL_AC_CartContents%%` | . | -| `%%GLOBAL_AC_CouponCode%%` | . | -| `%%GLOBAL_AC_CouponCodeText%%` | . | -| `%%GLOBAL_FormField%%` | . | -| `%%GLOBAL_FormValue%%` | . | -| `%%GLOBAL_PaymentGatewayAmount%%` | . | -| `%%GLOBAL_NoPaymentTakenModuleInTestMode%%` | . | -| `%%GLOBAL_OrderTrackingNo%%` | . | -| `%%GLOBAL_TrackURL%%` | . | -| `%%GLOBAL_RawProductPrice%%` | Currency, as a unique alphanumeric code. To follow best practices for microdata, use this variable – together with `%%GLOBAL_RawProductPrice%%` – rather than `%%GLOBAL_ProductPrice%%` (which includes a currency token/symbol). | -| `%%GLOBAL_SelectedCurrencyCode%% ` | Currency, as a unique alphanumeric code. To follow best practices for microdata, use this variable – together with `%%GLOBAL_RawProductPrice%%` – rather than `%%GLOBAL_ProductPrice%%` (which includes a currency token/symbol). | -| `%%GLOBAL_ProductReviewLink%%` | . | -| `%%GLOBAL_ProductQty%%` | . | -| `%%GLOBAL_ProductCustomFields%%` | You can use the %%GLOBAL_ProductCustomFields%% variable in any template file where you can use %%GLOBAL_ProductPrice%%. (Namely, in template files that render a particular panel's individual items. Examples are: Snippets/CategoryProductsItem.html, for category pages; or Snippets/HomeFeaturedProductsItem.html, for the Featured Products panel.) Once %%GLOBAL_ProductCustomFields%% is added, it will render the entire table of custom fields. To incorporate this variable into faceted search, we recommend adding the following code to Panels/FacetedSearchProductGrid.html: | -| | Once %%GLOBAL_ProductCustomFields%% is added, it will render the entire table of custom fields. To incorporate this variable into faceted search, we recommend adding the following code to Panels/FacetedSearchProductGrid.html: | -| | `{{#each product.custom_fields}}` | -| | `{{ id }} : {{ name }} : {{ value }}` | -| | `{{/each}}` | +# Global Variables + +Blueprint themes use the following GLOBAL variables to pull data from the store's database. + +While these variables are prefixed with the word GLOBAL, the data's availability actually varies per session, layout, panel, and snippet. For the list of variables available from anywhere in the store, regardless of session status, see [Store-Wide Variables](/archive/storefront/blueprint/themes/store-wide-global-variables). + +The list below is sorted by the number of times that the Blueprint base theme references the variable – with the most frequently referenced variables at the top: + +| Variable | Description | +|:---------|:------------| +| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL based page, this will be the HTTPS version of the store path. | +| `%%GLOBAL_IMG_PATH%%` | . | +| `%%GLOBAL_ProductName%%` | . | +| `%%GLOBAL_ProductId%%` | . | +| `%%GLOBAL_ShopPathNormal%%` | The normal (non SSL) version of the store URL. | +| `%%GLOBAL_JSCacheToken%%` | . | +| `%%GLOBAL_ProductRating%%` | . | +| `%%GLOBAL_CdnAppPath%%` | . | +| `%%GLOBAL_ProductPrice%%` | . | +| `%%GLOBAL_ProductAddText%%` | . | +| `%%GLOBAL_ProductFieldId%%` | . | +| `%%GLOBAL_EmailFooter%%` | . | +| `%%GLOBAL_ProductLink%%` | . | +| `%%GLOBAL_ShopPathSSL%%` | The SSL version of the store URL. | +| `%%GLOBAL_OrderId%%` | . | +| `%%GLOBAL_ProductThumb%%` | . | +| `%%GLOBAL_HideProductRating%%` | . | +| `%%GLOBAL_ProductURL%%` | . | +| `%%GLOBAL_TPL_PATH%%` | . | +| `%%GLOBAL_HideActionAdd%%` | . | +| `%%GLOBAL_StoreName%%` | The name of the store. | +| `%%GLOBAL_ProductQuantity%%` | . | +| `%%GLOBAL_AlternateClass%%` | . | +| `%%GLOBAL_CartItemId%%` | . | +| `%%GLOBAL_CompareLink%%` | . | +| `%%GLOBAL_HideCompareItems%%` | . | +| `%%GLOBAL_ProductOptions%%` | . | +| `%%GLOBAL_UpperAddressType%%` | . | +| `%%GLOBAL_ErrorMessage%%` | . | +| `%%GLOBAL_ProductNumber%%` | . | +| `%%GLOBAL_HeaderLogo%%` | . | +| `%%GLOBAL_GiftCertificateCode%%` | . | +| `%%GLOBAL_WishListMessage%%` | . | +| `%%GLOBAL_ProductFieldRequired%%` | . | +| `%%GLOBAL_FieldRequiredClass%%` | . | +| `%%GLOBAL_EmailHeader%%` | . | +| `%%GLOBAL_OrderAmount%%` | . | +| `%%GLOBAL_GiftCertificateTo%%` | . | +| `%%GLOBAL_ShipToBillingName%%` | . | +| `%%GLOBAL_SiteColor%%` | The current template’s active color scheme. | +| `%%GLOBAL_ProductFieldName%%` | . | +| `%%GLOBAL_AddressId%%` | . | +| `%%GLOBAL_PageTitle%%` | . | +| `%%GLOBAL_CharacterSet%%` | . | +| `%%GLOBAL_SearchTrackClass%%` | . | +| `%%GLOBAL_ItemId%%` | . | +| `%%GLOBAL_ProductTotal%%` | . | +| `%%GLOBAL_ProductFieldInputSize%%` | . | +| `%%GLOBAL_ProductFieldValue%%` | . | +| `%%GLOBAL_AddressType%%` | . | +| `%%GLOBAL_HideWishlist%%` | . | +| `%%GLOBAL_VideoId%%` | . | +| `%%GLOBAL_SHARED_GIFT_THEME_PATH%%` | . | +| `%%GLOBAL_GiftCertificateAmount%%` | . | +| `%%GLOBAL_GiftCertificateFrom%%` | . | +| `%%GLOBAL_GiftCertificateMessage%%` | . | +| `%%GLOBAL_GiftCertificateExpiryInfo%%` | . | +| `%%GLOBAL_HideShippingOptions%%` | . | +| `%%GLOBAL_HideLimitedCreditWarning%%` | . | +| `%%GLOBAL_ProductAttributes%%` | . | +| `%%GLOBAL_ImageDescription%%` | . | +| `%%GLOBAL_HideErrorMessage%%` | . | +| `%%GLOBAL_ExtraCategoryClass%%` | . | +| `%%GLOBAL_BillingAddress%%` | . | +| `%%GLOBAL_ShippingAddress%%` | . | +| `%%GLOBAL_OrderDate%%` | . | +| `%%GLOBAL_HideReviewCaptcha%%` | . | +| `%%GLOBAL_HideReturnAction%%` | . | +| `%%GLOBAL_OrderTotal%%` | . | +| `%%GLOBAL_NewsTitle%%` | . | +| `%%GLOBAL_BrandName%%` | . | +| `%%GLOBAL_VideoTitleLong%%` | . | +| `%%GLOBAL_ItemClass%%` | . | +| `%%GLOBAL_EventDate%%` | . | +| `%%GLOBAL_GiftWrappingName%%` | . | +| `%%GLOBAL_WishListID%%` | . | +| `%%GLOBAL_FormFieldRequiredJS%%` | . | +| `%%GLOBAL_HideCreditCardError%%` | . | +| `%%GLOBAL_CustomerName%%` | . | +| `%%GLOBAL_CustomerEmail%%` | . | +| `%%GLOBAL_CustomerGroupId%%` | Contains the group ID for a logged-in customer who is part of a group. Also contains the group ID for a guest where a default group is set for guests. Blank for a logged-in customer who belongs to no group. Also blank for a guest where no default group is set for guests. Globally available across panels and snippets. | +| `%%GLOBAL_ReCaptchaAPIKeyPublic%%` | . | +| `%%GLOBAL_SearchId%%` | . | +| `%%GLOBAL_OrderComments%%` | . | +| `%%GLOBAL_AllBrandsLink%%` | . | +| `%%GLOBAL_CheckoutLink%%` | . | +| `%%GLOBAL_AdditionalCheckoutButtons%%` | . | +| `%%GLOBAL_CheckoutShippingTitle%%` | . | +| `%%GLOBAL_HideUseStoreCredit%%` | . | +| `%%GLOBAL_HideMailingListInvite%%` | . | +| `%%GLOBAL_AllPricesAreInCurrency%%` | . | +| `%%GLOBAL_HidePurchasingOptions%%` | . | +| `%%GLOBAL_jQueryUIPath%%` | . | +| `%%GLOBAL_ProductMaxTinyWidth%%` | . | +| `%%GLOBAL_ProductMaxTinyHeight%%` | . | +| `%%GLOBAL_BrandLink%%` | . | +| `%%GLOBAL_OrderProductId%%` | . | +| `%%GLOBAL_HideExpectedReleaseDate%%` | . | +| `%%GLOBAL_ExpectedReleaseDate%%` | . | +| `%%GLOBAL_label%%` | . | +| `%%GLOBAL_value%%` | . | +| `%%GLOBAL_ShipSuburb%%` | . | +| `%%GLOBAL_ShipState%%` | . | +| `%%GLOBAL_ShipZip%%` | . | +| `%%GLOBAL_ShipCountry%%` | . | +| `%%GLOBAL_ProductAvailability%%` | . | +| `%%GLOBAL_ProductFieldType%%` | . | +| `%%GLOBAL_FileTypes%%` | . | +| `%%GLOBAL_TransitTime%%` | . | +| `%%GLOBAL_ShippingPrice%%` | . | +| `%%GLOBAL_HideGiftWrapping%%` | . | +| `%%GLOBAL_ProviderId%%` | . | +| `%%GLOBAL_ShippingAddressId%%` | . | +| `%%GLOBAL_BaseCompareLink%%` | . | +| `%%GLOBAL_GiftWrappingId%%` | . | +| `%%GLOBAL_HideSectionPaging%%` | . | +| `%%GLOBAL_SectionPagingPrevious%%` | . | +| `%%GLOBAL_SectionPagingNext%%` | . | +| `%%GLOBAL_SectionPaging%%` | . | +| `%%GLOBAL_TrailBrandName%%` | . | +| `%%GLOBAL_LoginMessage%%` | . | +| `%%GLOBAL_ShippingMethod%%` | . | +| `%%GLOBAL_HideCaptcha%%` | . | +| `%%GLOBAL_HideOrderComments%%` | . | +| `%%GLOBAL_DisableReturnButton%%` | . | +| `%%GLOBAL_ShippingProvider%%` | . | +| `%%GLOBAL_HideCheckoutButton%%` | . | +| `%%GLOBAL_ShippingFormAction%%` | . | +| `%%GLOBAL_ShipCustomFields%%` | . | +| `%%GLOBAL_ShipToAddressChecked%%` | . | +| `%%GLOBAL_ShipAddressButtonText%%` | . | +| `%%GLOBAL_ShippingQuotes%%` | . | +| `%%GLOBAL_DeliveryDisclaimer%%` | . | +| `%%GLOBAL_totals%%` | . | +| `%%GLOBAL_HideCartOptions%%` | . | +| `%%GLOBAL_CommentsHTML%%` | . | +| `%%GLOBAL_AddThisLink%%` | . | +| `%%GLOBAL_TinyImageClickJavascript%%` | . | +| `%%GLOBAL_FeaturedVideo%%` | . | +| `%%GLOBAL_QuickViewProductURL%%` | . | +| `%%GLOBAL_ThumbImageURL%%` | . | +| `%%GLOBAL_ProductAttributeList%%` | . | +| `%%GLOBAL_DisplayAdd%%` | . | +| `%%GLOBAL_DisplayAddQty%%` | . | +| `%%GLOBAL_HideNormalMessage%%` | . | +| `%%GLOBAL_HideSuccessMessage%%` | . | +| `%%GLOBAL_WishListName%%` | . | +| `%%GLOBAL_DownloadsLink%%` | . | +| `%%GLOBAL_HideWrappingOptions%%` | . | +| `%%GLOBAL_ReturnId%%` | . | +| `%%GLOBAL_ReturnReason%%` | . | +| `%%GLOBAL_ReturnAction%%` | . | +| `%%GLOBAL_ReturnComments%%` | . | +| `%%GLOBAL_ShipFullName%%` | . | +| `%%GLOBAL_ShipCompany%%` | . | +| `%%GLOBAL_ShipPhone%%` | . | +| `%%GLOBAL_RecentPostUrl%%` | . | +| `%%GLOBAL_CatTrailName%%` | . | +| `%%GLOBAL_HideThumbColumn%%` | . | +| `%%GLOBAL_HideGiftMessagePreview%%` | . | +| `%%GLOBAL_GiftMessagePreview%%` | . | +| `%%GLOBAL_CustomFieldName%%` | . | +| `%%GLOBAL_CustomFieldValue%%` | . | +| `%%GLOBAL_ShippingQuoteId%%` | . | +| `%%GLOBAL_PageLink%%` | . | +| `%%GLOBAL_CartProductFields%%` | . | +| `%%GLOBAL_PaymentFieldPrefix%%` | . | +| `%%GLOBAL_FromURL%%` | . | +| `%%GLOBAL_AddressLine%%` | . | +| `%%GLOBAL_FeaturedCategoryName%%` | . | +| `%%GLOBAL_HideGiftWrapMessage%%` | . | +| `%%GLOBAL_PaymentMessage%%` | . | +| `%%GLOBAL_TagName%%` | . | +| `%%GLOBAL_PaymentMethod%%` | . | +| `%%GLOBAL_ProductSku%%` | . | +| `%%GLOBAL_ZoomImageMaxWidth%%` | . | +| `%%GLOBAL_ZoomImageMaxHeight%%` | . | +| `%%GLOBAL_SectionType%%` | . | +| `%%GLOBAL_SharingName%%` | . | +| `%%GLOBAL_SubBrandLink%%` | . | +| `%%GLOBAL_SubCatLink%%` | . | +| `%%GLOBAL_Amount%%` | . | +| `%%GLOBAL_TransactionType%%` | . | +| `%%GLOBAL_DateTime%%` | . | +| `%%GLOBAL_AuthorisationCode%%` | . | +| `%%GLOBAL_ResponseCode%%` | . | +| `%%GLOBAL_ResponseMessage%%` | . | +| `%%GLOBAL_MerchantURL%%` | . | +| `%%GLOBAL_CardholderName%%` | . | +| `%%GLOBAL_ReferenceNumber%%` | . | +| `%%GLOBAL_InvoiceNumber%%` | . | +| `%%GLOBAL_HideMessagesMenu%%` | . | +| `%%GLOBAL_HideReturnRequestsMenu%%` | . | +| `%%GLOBAL_ReturnInstructions%%` | . | +| `%%GLOBAL_AuthorizeNetHideCVV2%%` | . | +| `%%GLOBAL_BlogPageTitle%%` | . | +| `%%GLOBAL_CCTypes%%` | . | +| `%%GLOBAL_HideLoginMessage%%` | . | +| `%%GLOBAL_MessageClass%%` | . | +| `%%GLOBAL_EWayHideCardCode%%` | . | +| `%%GLOBAL_CreditCardErrorMessage%%` | . | +| `%%GLOBAL_CreditCardNum%%` | . | +| `%%GLOBAL_CreditCardHideCardCode%%` | . | +| `%%GLOBAL_MessageText%%` | . | +| `%%GLOBAL_NMIHideCVV2%%` | . | +| `%%GLOBAL_STYLE_PATH%%` | . | +| `%%GLOBAL_StoreAddressFormatted%%` | The address of the store (as configured on the store settings page) | +| `%%GLOBAL_BillingPhone%%` | . | +| `%%GLOBAL_ShippingPhone%%` | . | +| `%%GLOBAL_HideShippingMethod%%` | . | +| `%%GLOBAL_DateShipped%%` | . | +| `%%GLOBAL_ProductsTable%%` | . | +| `%%GLOBAL_HideComments%%` | . | +| `%%GLOBAL_Comments%%` | . | +| `%%GLOBAL_PageContent%%` | . | +| `%%GLOBAL_HideFullName%%` | . | +| `%%GLOBAL_HideCompanyName%%` | . | +| `%%GLOBAL_HidePhone%%` | . | +| `%%GLOBAL_HideOrderNo%%` | . | +| `%%GLOBAL_HideRMANo%%` | . | +| `%%GLOBAL_PayflowProHideCVV2%%` | . | +| `%%GLOBAL_HideReviewEmail%%` | . | +| `%%GLOBAL_ProductReviewPaging%%` | . | +| `%%GLOBAL_ProdImageJavascript%%` | . | +| `%%GLOBAL_SearchTitle%%` | . | +| `%%GLOBAL_HideRelatedSearches%%` | . | +| `%%GLOBAL_ShowSearchSuggestion%%` | . | +| `%%GLOBAL_SuggestQueryEscaped%%` | . | +| `%%GLOBAL_SuggestQuery%%` | . | +| `%%GLOBAL_ShippingAddressFormTitle%%` | . | +| `%%GLOBAL_HideReturnForm%%` | . | +| `%%GLOBAL_OrderStatus%%` | . | +| `%%GLOBAL_AKBPath%%` | . | +| `%%GLOBAL_AddressFormFieldID%%` | . | +| `%%GLOBAL_HideShopByBrandPanel%%` | . | +| `%%GLOBAL_ListJS%%` | . | +| `%%GLOBAL_CompareOnSubmit%%` | . | +| `%%GLOBAL_CategoryProductListing%%` | . | +| `%%GLOBAL_HideErrors%%` | . | +| `%%GLOBAL_ShipAddressButtonText_JS%%` | . | +| `%%GLOBAL_CheckoutShippingIntro%%` | . | +| `%%GLOBAL_ItemList%%` | . | +| `%%GLOBAL_HideCheckoutError%%` | . | +| `%%GLOBAL_CheckoutErrorMsg%%` | . | +| `%%GLOBAL_HideCheckoutSuccess%%` | . | +| `%%GLOBAL_CheckoutSuccessMsg%%` | . | +| `%%GLOBAL_HideUseCoupon%%` | . | +| `%%GLOBAL_HidePaymentOptions%%` | . | +| `%%GLOBAL_CheckoutStoreCreditWarning%%` | . | +| `%%GLOBAL_StoreCredit%%` | . | +| `%%GLOBAL_Remaining%%` | . | +| `%%GLOBAL_HideRemainingStoreCredit%%` | . | +| `%%GLOBAL_RemainingCredit%%` | . | +| `%%GLOBAL_HideLimitedCreditPaymentOption%%` | . | +| `%%GLOBAL_StoreCreditPaymentProviders%%` | . | +| `%%GLOBAL_CheckoutWith%%` | . | +| `%%GLOBAL_HideCreditAltOptionList%%` | . | +| `%%GLOBAL_CreditAlt%%` | . | +| `%%GLOBAL_HidePaymentProviderList%%` | . | +| `%%GLOBAL_PaymentProviders%%` | . | +| `%%GLOBAL_HideOrderTermsAndConditions%%` | . | +| `%%GLOBAL_HideTermsAndConditionsTextarea%%` | . | +| `%%GLOBAL_OrderTermsAndConditions%%` | . | +| `%%GLOBAL_AgreeTermsAndConditions%%` | . | +| `%%GLOBAL_TermsAndConditionsLink%%` | . | +| `%%GLOBAL_NewsletterBoxIsTicked%%` | . | +| `%%GLOBAL_HideOrderCheckBox%%` | . | +| `%%GLOBAL_OrderBoxIsTicked%%` | . | +| `%%GLOBAL_PaymentButtonSwitch%%` | . | +| `%%GLOBAL_CreateAccountAccountFormFieldID%%` | . | +| `%%GLOBAL_StatusMessage%%` | . | +| `%%GLOBAL_QuickViewButtonText%%` | . | +| `%%GLOBAL_QuickViewButtonColor%%` | . | +| `%%GLOBAL_QuickViewGradientColor%%` | . | +| `%%GLOBAL_QuickViewTextColor%%` | . | +| `%%GLOBAL_FacetedSearchScriptPath%%` | . | +| `%%GLOBAL_DebugDetails%%` | . | +| `%%GLOBAL_DesignModeHTML%%` | . | +| `%%GLOBAL_QueryList%%` | . | +| `%%GLOBAL_DesignModeScriptTag%%` | . | +| `%%GLOBAL_LiveChatFooterCode%%` | . | +| `%%GLOBAL_FooterScripts%%` | . | +| `%%GLOBAL_HideForgotPasswordError%%` | . | +| `%%GLOBAL_MaintenanceNotice%%` | . | +| `%%GLOBAL_CartItems%%` | A textual string representing the number of items in the cart (1 item, 2 items, etc.). | +| `%%GLOBAL_HideSectionSeparator%%` | . | +| `%%GLOBAL_ProductThumbWidth%%` | . | +| `%%GLOBAL_ProductThumbHeight%%` | . | +| `%%GLOBAL_HideBrandLink%%` | . | +| `%%GLOBAL_HideRating%%` | . | +| `%%GLOBAL_Rating%%` | . | +| `%%GLOBAL_HidePrice%%` | . | +| `%%GLOBAL_RetailPrice%%` | . | +| `%%GLOBAL_IncludingExcludingTax%%` | . | +| `%%GLOBAL_YouSave%%` | . | +| `%%GLOBAL_VideoLength%%` | . | +| `%%GLOBAL_VideoDescriptionLong%%` | . | +| `%%GLOBAL_CartLink%%` | . | +| `%%GLOBAL_ProductOptionRequired%%` | . | +| `%%GLOBAL_FastCartButtonJs%%` | . | +| `%%GLOBAL_HideProductAttributeList%%` | . | +| `%%GLOBAL_AddToCartQty%%` | . | +| `%%GLOBAL_HideBulkDiscountLink%%` | . | +| `%%GLOBAL_BulkDiscountThickBoxRates%%` | . | +| `%%GLOBAL_ItemSoldOut%%` | . | +| `%%GLOBAL_OptionMessage%%` | . | +| `%%GLOBAL_ShowAddToCartQtyBox%%` | . | +| `%%GLOBAL_ProductMinMaxQtyJavascript%%` | . | +| `%%GLOBAL_EventDateJavascript%%` | . | +| `%%GLOBAL_AgreeChecked%%` | . | +| `%%GLOBAL_HideThemeSelect%%` | . | +| `%%GLOBAL_GiftCertificateMinimum%%` | . | +| `%%GLOBAL_GiftCertificateMaximum%%` | . | +| `%%GLOBAL_HideSearchPage%%` | . | +| `%%GLOBAL_ProductTabActive%%` | . | +| `%%GLOBAL_ProductTabUrl%%` | . | +| `%%GLOBAL_ContentTabActive%%` | . | +| `%%GLOBAL_ContentTabUrl%%` | . | +| `%%GLOBAL_ProductContainerDisplay%%` | . | +| `%%GLOBAL_ContentContainerDisplay%%` | . | +| `%%GLOBAL_SelectedSearchTab%%` | . | +| `%%GLOBAL_HideProductSearchOptions%%` | . | +| `%%GLOBAL_HideSearchResultsNoResult%%` | . | +| `%%GLOBAL_OriginalSearchQuery%%` | . | +| `%%GLOBAL_HideSideProductRecentlyViewedCompare%%` | . | +| `%%GLOBAL_HideIfNoSubsection%%` | . | +| `%%GLOBAL_HideSuggestiveCartContent%%` | . | +| `%%GLOBAL_SuggestedProductListing%%` | . | +| `%%GLOBAL_HideAccountOptions%%` | . | +| `%%GLOBAL_DownloadLink%%` | . | +| `%%GLOBAL_ExpiryInfo%%` | . | +| `%%GLOBAL_AccountOrderItemList%%` | . | +| `%%GLOBAL_StrikeStart%%` | . | +| `%%GLOBAL_StrikeEnd%%` | . | +| `%%GLOBAL_Refunded%%` | . | +| `%%GLOBAL_HidePaymentInstructions%%` | . | +| `%%GLOBAL_ReturnStatus%%` | . | +| `%%GLOBAL_ShipAddressLines%%` | . | +| `%%GLOBAL_RecentPostTitle%%` | . | +| `%%GLOBAL_CatTrailLink%%` | . | +| `%%GLOBAL_CouponCode%%` | . | +| `%%GLOBAL_CouponDiscount%%` | . | +| `%%GLOBAL_GiftCertificateRemaining%%` | . | +| `%%GLOBAL_CertificateAmountUsed%%` | . | +| `%%GLOBAL_ProductImage%%` | . | +| `%%GLOBAL_ProductNameSpan%%` | . | +| `%%GLOBAL_ProductExpectedReleaseDate%%` | . | +| `%%GLOBAL_GiftCertificateName%%` | . | +| `%%GLOBAL_HideCartFileName%%` | . | +| `%%GLOBAL_ProductFieldFileValue%%` | . | +| `%%GLOBAL_HideDeleteFileLink%%` | . | +| `%%GLOBAL_HideFileHelp%%` | . | +| `%%GLOBAL_FileSize%%` | . | +| `%%GLOBAL_CurrentProductFile%%` | . | +| `%%GLOBAL_SelectOptions%%` | . | +| `%%GLOBAL_ShipperName%%` | . | +| `%%GLOBAL_TaxName%%` | . | +| `%%GLOBAL_TaxCost%%` | . | +| `%%GLOBAL_PageNumber%%` | . | +| `%%GLOBAL_ProductDescription%%` | . | +| `%%GLOBAL_AccountEmail%%` | . | +| `%%GLOBAL_ShipAddressLine1%%` | . | +| `%%GLOBAL_ShipAddressLine2%%` | . | +| `%%GLOBAL_HideChooseAddress%%` | . | +| `%%GLOBAL_UseAddressTitle%%` | . | +| `%%GLOBAL_FlyoutAttributes%%` | . | +| `%%GLOBAL_FlyoutChildHtml%%` | . | +| `%%GLOBAL_CurrencyName%%` | . | +| `%%GLOBAL_AddressFieldId%%` | . | +| `%%GLOBAL_PageName%%` | . | +| `%%GLOBAL_CurrentProductLink%%` | . | +| `%%GLOBAL_InitialZoomImage%%` | . | +| `%%GLOBAL_HideBillingEmail%%` | . | +| `%%GLOBAL_BillingEmail%%` | . | +| `%%GLOBAL_hideInvoiceShippingDetails%%` | . | +| `%%GLOBAL_HideShippingEmail%%` | . | +| `%%GLOBAL_ShippingEmail%%` | . | +| `%%GLOBAL_hideAddressColumn%%` | . | +| `%%GLOBAL_HideAttributes%%` | . | +| `%%GLOBAL_HideVariationOptions%%` | . | +| `%%GLOBAL_HideConfigurableFields%%` | . | +| `%%GLOBAL_ProductConfigurableFields%%` | . | +| `%%GLOBAL_ProductGiftWrapping%%` | . | +| `%%GLOBAL_HideEventDate%%` | . | +| `%%GLOBAL_ProductEventDate%%` | . | +| `%%GLOBAL_OptionChooseText%%` | . | +| `%%GLOBAL_ReviewStart%%` | . | +| `%%GLOBAL_ReviewLink%%` | . | +| `%%GLOBAL_FontSize%%` | . | +| `%%GLOBAL_TagLink%%` | . | +| `%%GLOBAL_TagProductCount%%` | . | +| `%%GLOBAL_ProductThumbIndex%%` | . | +| `%%GLOBAL_VariationName%%` | . | +| `%%GLOBAL_VariationNumber%%` | . | +| `%%GLOBAL_OptionId%%` | . | +| `%%GLOBAL_OptionValue%%` | . | +| `%%GLOBAL_NewsURL%%` | . | +| `%%GLOBAL_PageURL%%` | . | +| `%%GLOBAL_PageSmallContent%%` | . | +| `%%GLOBAL_SectionSearchResults%%` | . | +| `%%GLOBAL_RSSURL%%` | . | +| `%%GLOBAL_HideSplitWrappingOptions%%` | . | +| `%%GLOBAL_ShipperId%%` | . | +| `%%GLOBAL_CatId%%` | . | +| `%%GLOBAL_SocialMedia_Service_Name%%` | . | +| `%%GLOBAL_SubBrandName%%` | . | +| `%%GLOBAL_SubCatName%%` | . | +| `%%GLOBAL_ISOCode%%` | . | +| `%%GLOBAL_IssuerName%%` | . | +| `%%GLOBAL_IssuerConfirmation%%` | . | +| `%%GLOBAL_FirstName%%` | . | +| `%%GLOBAL_NewGuestAccountResetLink%%` | . | +| `%%GLOBAL_OrderStatusChangedHi%%` | . | +| `%%GLOBAL_OrderNumberStatusChangedTo%%` | . | +| `%%GLOBAL_DatePlaced%%` | . | +| `%%GLOBAL_AC_EmailFooterNote%%` | . | +| `%%GLOBAL_ProductUrl%%` | . | +| `%%GLOBAL_Contact%%` | . | +| `%%GLOBAL_DownloadTitle%%` | . | +| `%%GLOBAL_HideReturnInstructions%%` | . | +| `%%GLOBAL_HideAuthorizeNetError%%` | . | +| `%%GLOBAL_AuthorizeNetErrorMessage%%` | . | +| `%%GLOBAL_AuthorizeNetName%%` | . | +| `%%GLOBAL_AuthorizeNetNum%%` | . | +| `%%GLOBAL_AuthorizeNetMonths%%` | . | +| `%%GLOBAL_AuthorizeNetYears%%` | . | +| `%%GLOBAL_AuthorizeNetCCV2%%` | . | +| `%%GLOBAL_HideCCManualError%%` | . | +| `%%GLOBAL_CCErrorMessage%%` | . | +| `%%GLOBAL_CCName%%` | . | +| `%%GLOBAL_CCNum%%` | . | +| `%%GLOBAL_CCCVV2%%` | . | +| `%%GLOBAL_CCIssueNo%%` | . | +| `%%GLOBAL_CCMonths%%` | . | +| `%%GLOBAL_CCYears%%` | . | +| `%%GLOBAL_CCIssueDateMonths%%` | . | +| `%%GLOBAL_CCIssueDateYears%%` | . | +| `%%GLOBAL_HideCheckoutGuest%%` | . | +| `%%GLOBAL_HideCheckoutRegistrationRequired%%` | . | +| `%%GLOBAL_CustomCheckoutFormNewAccount%%` | . | +| `%%GLOBAL_CustomCheckoutFormBillingAddress%%` | . | +| `%%GLOBAL_CustomCheckoutFormShippingAddress%%` | . | +| `%%GLOBAL_ExpressCheckoutSignedIn%%` | . | +| `%%GLOBAL_ExpressCheckoutDigitalOrder%%` | . | +| `%%GLOBAL_GoToStep%%` | . | +| `%%GLOBAL_CollapsedStepClassAccountDetails%%` | . | +| `%%GLOBAL_ExpressCheckoutHideAccountDetails%%` | . | +| `%%GLOBAL_ExpressCheckoutStepAccountDetails%%` | . | +| `%%GLOBAL_HideGuestCheckoutOptions%%` | . | +| `%%GLOBAL_HideRegisteredCheckoutOptions%%` | . | +| `%%GLOBAL_CollapsedStepClassBillingAddress%%` | . | +| `%%GLOBAL_ExpressCheckoutStepBillingAddress%%` | . | +| `%%GLOBAL_CollapsedStepClassShippingAddress%%` | . | +| `%%GLOBAL_ExpressCheckoutHideShippingAddress%%` | . | +| `%%GLOBAL_ExpressCheckoutStepShippingAddress%%` | . | +| `%%GLOBAL_CollapsedStepClassShippingProvider%%` | . | +| `%%GLOBAL_ExpressCheckoutHideShippingProviders%%` | . | +| `%%GLOBAL_ExpressCheckoutStepShippingProvider%%` | . | +| `%%GLOBAL_CollapsedStepClassConfirmation%%` | . | +| `%%GLOBAL_ExpressCheckoutStepConfirmation%%` | . | +| `%%GLOBAL_CollapsedStepClassPaymentDetails%%` | . | +| `%%GLOBAL_ExpressCheckoutHidePaymentDetails%%` | . | +| `%%GLOBAL_ExpressCheckoutStepPaymentDetails%%` | . | +| `%%GLOBAL_PaymentFormContent%%` | . | +| `%%GLOBAL_ContinueLink%%` | . | +| `%%GLOBAL_Continue%%` | . | +| `%%GLOBAL_BlogName%%` | . | +| `%%GLOBAL_ErrorDetails%%` | . | +| `%%GLOBAL_HideeSelectPlusDPError%%` | . | +| `%%GLOBAL_eSelectPlusDPErrorMessage%%` | . | +| `%%GLOBAL_eSelectPlusDPNum%%` | . | +| `%%GLOBAL_eSelectPlusDPMonths%%` | . | +| `%%GLOBAL_eSelectPlusDPYears%%` | . | +| `%%GLOBAL_eSelectPlusDPCCV2%%` | . | +| `%%GLOBAL_eSelectPlusDPCardHolderName%%` | . | +| `%%GLOBAL_eSelectPlusDPBillStNum%%` | . | +| `%%GLOBAL_eSelectPlusDPBillStName%%` | . | +| `%%GLOBAL_eSelectPlusDPBillZip%%` | . | +| `%%GLOBAL_HideEWayError%%` | . | +| `%%GLOBAL_EWayErrorMessage%%` | . | +| `%%GLOBAL_EWayName%%` | . | +| `%%GLOBAL_EWayMonths%%` | . | +| `%%GLOBAL_EWayYears%%` | . | +| `%%GLOBAL_EWayCardCode%%` | . | +| `%%GLOBAL_CreditCardName%%` | . | +| `%%GLOBAL_CreditCardIssueNo%%` | . | +| `%%GLOBAL_CreditCardIssueDateMonths%%` | . | +| `%%GLOBAL_CreditCardIssueDateYears%%` | . | +| `%%GLOBAL_CreditCardMonths%%` | . | +| `%%GLOBAL_CreditCardYears%%` | . | +| `%%GLOBAL_CreditCardCardCode%%` | . | +| `%%GLOBAL_AdditionalPaymentPageContents%%` | . | +| `%%GLOBAL_HideIdealError%%` | . | +| `%%GLOBAL_IdealErrorMessage%%` | . | +| `%%GLOBAL_IdealPaymentForm%%` | . | +| `%%GLOBAL_PrintInvoiceStylesheetPath%%` | . | +| `%%GLOBAL_PrintableInvoiceList%%` | . | +| `%%GLOBAL_PrintableInvoiceScript%%` | . | +| `%%GLOBAL_MaintenanceLogo%%` | . | +| `%%GLOBAL_MessageTitle%%` | . | +| `%%GLOBAL_HideNMIError%%` | . | +| `%%GLOBAL_NMIErrorMessage%%` | . | +| `%%GLOBAL_NMIName%%` | . | +| `%%GLOBAL_NMINum%%` | . | +| `%%GLOBAL_NMIMonths%%` | . | +| `%%GLOBAL_NMIYears%%` | . | +| `%%GLOBAL_NMICCV2%%` | . | +| `%%GLOBAL_HideError%%` | . | +| `%%GLOBAL_HidePaidOrderConfirmation%%` | . | +| `%%GLOBAL_HidePhysicalOrderConfirmation%%` | . | +| `%%GLOBAL_PhysicalOrderConfirmation%%` | . | +| `%%GLOBAL_HideDigitalOrderConfirmation%%` | . | +| `%%GLOBAL_DigitalOrderConfirmation%%` | . | +| `%%GLOBAL_HideDigitalOrderDownloadLink%%` | . | +| `%%GLOBAL_ViewFullOrderPath%%` | . | +| `%%GLOBAL_HideAwaitingPayment%%` | . | +| `%%GLOBAL_HideSuccess%%` | . | +| `%%GLOBAL_OrderConfirmationDetails%%` | . | +| `%%GLOBAL_ContinueShoppingOnStoreName%%` | . | +| `%%GLOBAL_ConversionCode%%` | . | +| `%%GLOBAL_PackingSlipTitle%%` | . | +| `%%GLOBAL_HideBillingPhone%%` | . | +| `%%GLOBAL_HideShippingPhone%%` | . | +| `%%GLOBAL_HideShippingDate%%` | . | +| `%%GLOBAL_HideTrackingNo%%` | . | +| `%%GLOBAL_TrackingNo%%` | . | +| `%%GLOBAL_HideFormError%%` | . | +| `%%GLOBAL_PageId%%` | . | +| `%%GLOBAL_ContactName%%` | . | +| `%%GLOBAL_ContactEmail%%` | . | +| `%%GLOBAL_ContactCompanyName%%` | . | +| `%%GLOBAL_ContactPhone%%` | . | +| `%%GLOBAL_ContactOrderNo%%` | . | +| `%%GLOBAL_ContactRMA%%` | . | +| `%%GLOBAL_ContactQuestion%%` | . | +| `%%GLOBAL_CaptchaImage%%` | . | +| `%%GLOBAL_ARSPanel%%` | . | +| `%%GLOBAL_HidePayflowProError%%` | . | +| `%%GLOBAL_PayflowProErrorMessage%%` | . | +| `%%GLOBAL_PayflowProName%%` | . | +| `%%GLOBAL_PayflowProNum%%` | . | +| `%%GLOBAL_PayflowProMonths%%` | . | +| `%%GLOBAL_PayflowProYears%%` | . | +| `%%GLOBAL_PayflowProCCV2%%` | . | +| `%%GLOBAL_ProductReviewFlashMessages%%` | . | +| `%%GLOBAL_throttleToken%%` | . | +| `%%GLOBAL_ReviewRating5%%` | . | +| `%%GLOBAL_ReviewRating4%%` | . | +| `%%GLOBAL_ReviewRating3%%` | . | +| `%%GLOBAL_ReviewRating2%%` | . | +| `%%GLOBAL_ReviewRating1%%` | . | +| `%%GLOBAL_RevTitle%%` | . | +| `%%GLOBAL_RevText%%` | . | +| `%%GLOBAL_HideNoReviewsMessage%%` | . | +| `%%GLOBAL_NoReviews%%` | . | +| `%%GLOBAL_ProductReviewList%%` | . | +| `%%GLOBAL_AutoShowReviewForm%%` | . | +| `%%GLOBAL_JumpToReviews%%` | . | +| `%%GLOBAL_popupCssPath%%` | . | +| `%%GLOBAL_jQueryPath%%` | . | +| `%%GLOBAL_CurrentImageIndex%%` | . | +| `%%GLOBAL_ProductMaxImageHeight%%` | . | +| `%%GLOBAL_ProductMaxImageWidth%%` | . | +| `%%GLOBAL_VariationImage%%` | . | +| `%%GLOBAL_RuleImage%%` | . | +| `%%GLOBAL_ProductTinyBoxHeight%%` | . | +| `%%GLOBAL_UnsubscribeTitle%%` | . | +| `%%GLOBAL_DownloadIntro%%` | . | +| `%%GLOBAL_HideMessageSuccess%%` | . | +| `%%GLOBAL_HideMessageError%%` | . | +| `%%GLOBAL_HideNoOrderMessage%%` | . | +| `%%GLOBAL_HideInbox%%` | . | +| `%%GLOBAL_HideInboxMessage%%` | . | +| `%%GLOBAL_AccountInboxIntro%%` | . | +| `%%GLOBAL_ReturnReasonsList%%` | . | +| `%%GLOBAL_ReturnActionsList%%` | . | +| `%%GLOBAL_HideOrderStatus%%` | . | +| `%%GLOBAL_HideSingleShippingAddress%%` | . | +| `%%GLOBAL_FlassMessage%%` | . | +| `%%GLOBAL_HideItemDetailsHeader%%` | . | +| `%%GLOBAL_OrderTotalRows%%` | . | +| `%%GLOBAL_ShowOrderActions%%` | . | +| `%%GLOBAL_LNG_OrderShipments%%` | . | +| `%%GLOBAL_HideOrderStatusList%%` | . | +| `%%GLOBAL_HideNoOrderStatusMessage%%` | . | +| `%%GLOBAL_HideOrderList%%` | . | +| `%%GLOBAL_HideNoOrdersMessage%%` | . | +| `%%GLOBAL_HideRecentItemList%%` | . | +| `%%GLOBAL_HideNoRecentItemsMessage%%` | . | +| `%%GLOBAL_HideNoReturnsMessage%%` | . | +| `%%GLOBAL_HideReturnsList%%` | . | +| `%%GLOBAL_CheckEmail%%` | . | +| `%%GLOBAL_BrandsMessage%%` | . | +| `%%GLOBAL_HideBrandProductListing%%` | . | +| `%%GLOBAL_BrandProductListing%%` | . | +| `%%GLOBAL_HideShoppingCartGrid%%` | . | +| `%%GLOBAL_CartItemTotal%%` | . | +| `%%GLOBAL_HideGiftWrappingTotal%%` | . | +| `%%GLOBAL_GiftWrappingTotal%%` | . | +| `%%GLOBAL_HideDiscountAmount%%` | . | +| `%%GLOBAL_DiscountAmount%%` | . | +| `%%GLOBAL_HideShoppingCartShippingEstimator%%` | . | +| `%%GLOBAL_ShippingCountryList%%` | . | +| `%%GLOBAL_ShippingHideStateList%%` | . | +| `%%GLOBAL_ShippingStateList%%` | . | +| `%%GLOBAL_ShippingHideStateBox%%` | . | +| `%%GLOBAL_AddressState%%` | . | +| `%%GLOBAL_ShippingZip%%` | . | +| `%%GLOBAL_HideShoppingCartShippingCost%%` | . | +| `%%GLOBAL_ShippingCost%%` | . | +| `%%GLOBAL_HideShoppingCartHandlingCost%%` | . | +| `%%GLOBAL_HandlingCost%%` | . | +| `%%GLOBAL_Taxes%%` | . | +| `%%GLOBAL_CartTotal%%` | . | +| `%%GLOBAL_InclusiveTaxes%%` | . | +| `%%GLOBAL_HideMultipleAddressShipping%%` | . | +| `%%GLOBAL_HideMultipleAddressShippingOr%%` | . | +| `%%GLOBAL_KeepShoppingLink%%` | . | +| `%%GLOBAL_KeepShoppingText%%` | . | +| `%%GLOBAL_HideShoppingCartEmptyMessage%%` | . | +| `%%GLOBAL_CartCheckoutButtonControlScript%%` | . | +| `%%GLOBAL_CartStatusMessage%%` | . | +| `%%GLOBAL_CatName%%` | . | +| `%%GLOBAL_CatDesc%%` | . | +| `%%GLOBAL_DisplayMode%%` | . | +| `%%GLOBAL_CompareButton%%` | . | +| `%%GLOBAL_HideTitle%%` | . | +| `%%GLOBAL_BalanceTitle%%` | . | +| `%%GLOBAL_HideGiftCertificateError%%` | . | +| `%%GLOBAL_HideIntro%%` | . | +| `%%GLOBAL_HideExampleImage%%` | . | +| `%%GLOBAL_HideShippingTabs%%` | . | +| `%%GLOBAL_ActiveTabSingle%%` | . | +| `%%GLOBAL_ActiveTabMultiple%%` | . | +| `%%GLOBAL_HideTabSingle%%` | . | +| `%%GLOBAL_HideTabMultiple%%` | . | +| `%%GLOBAL_CheckoutMultiShippingIntro%%` | . | +| `%%GLOBAL_HideShippingProviderList%%` | . | +| `%%GLOBAL_HideNoShippingProviders%%` | . | +| `%%GLOBAL_ShippingError%%` | . | +| `%%GLOBAL_ComparisonHeading%%` | . | +| `%%GLOBAL_HideTooManyProductsMessage%%` | . | +| `%%GLOBAL_TooManyProductsMessage%%` | . | +| `%%GLOBAL_NumCompareItems%%` | . | +| `%%GLOBAL_HideConfirmOrderPage%%` | . | +| `%%GLOBAL_HideShippingDetails%%` | . | +| `%%GLOBAL_CreateAccountHeading%%` | . | +| `%%GLOBAL_HideCreateAccountIntroMessage%%` | . | +| `%%GLOBAL_HideCreateAccountErrorMessage%%` | . | +| `%%GLOBAL_CreateAccountEmailPassword%%` | . | +| `%%GLOBAL_CreateAccountDetails%%` | . | +| `%%GLOBAL_CreateAccountButtonText%%` | . | +| `%%GLOBAL_CreateAccountShippingFormFieldID%%` | . | +| `%%GLOBAL_HideEditAccountIntroMessage%%` | . | +| `%%GLOBAL_HideEditAccountErrorMessage%%` | . | +| `%%GLOBAL_HideEditAccountSuccessMessage%%` | . | +| `%%GLOBAL_AccountCurrentEmail%%` | . | +| `%%GLOBAL_AccountFirstName%%` | . | +| `%%GLOBAL_AccountLastName%%` | . | +| `%%GLOBAL_AccountCompanyName%%` | . | +| `%%GLOBAL_AccountPhone%%` | . | +| `%%GLOBAL_AccountFields%%` | . | +| `%%GLOBAL_EditAccountAccountFormFieldID%%` | . | +| `%%GLOBAL%%` | . | +| `%%GLOBAL_FacetedSearchOptionsJSON%%` | . | +| `%%GLOBAL_QuickLinkText%%` | . | +| `%%GLOBAL_Year%%` | . | +| `%%GLOBAL_PoweredBy%%` | . | +| `%%GLOBAL_PinterestJS%%` | . | +| `%%GLOBAL_CustomerId%%` | . | +| `%%GLOBAL_ForgottenPasswordToken%%` | . | +| `%%GLOBAL_CustomerEmailAddress%%` | . | +| `%%GLOBAL_RemainingBalance%%` | . | +| `%%GLOBAL_AdditionalMetaTags%%` | . | +| `%%GLOBAL_HeadFonts%%` | . | +| `%%GLOBAL_Favicon%%` | . | +| `%%GLOBAL_Stylesheets%%` | . | +| `%%GLOBAL_HeadRSSLinks%%` | . | +| `%%GLOBAL_TrackingCode%%` | . | +| `%%GLOBAL_DesignModeStyleSheet%%` | . | +| `%%GLOBAL_HeaderImageStyle%%` | . | +| `%%GLOBAL_FastCart%%` | . | +| `%%GLOBAL_ShowCookieWarningMessage%%` | . | +| `%%GLOBAL_ProductThumbImageWidth%%` | . | +| `%%GLOBAL_ProductThumbImageHeight%%` | . | +| `%%GLOBAL_AdditionalScriptTags%%` | . | +| `%%GLOBAL_RTLStyles%%` | . | +| `%%GLOBAL_HideHomeFeaturedProductsPanel%%` | . | +| `%%GLOBAL_HideHomeNewProductsPanel%%` | . | +| `%%GLOBAL_HideHomeRecentBlogsPanel%%` | . | +| `%%GLOBAL_SwapFrequency%%` | . | +| `%%GLOBAL_IdealIssuerOptions%%` | . | +| `%%GLOBAL_NewAccountHeading%%` | . | +| `%%GLOBAL_HideNewCustomerButton%%` | . | +| `%%GLOBAL_HideLoginNewAccountIntro%%` | . | +| `%%GLOBAL_BlogPathNormal%%` | . | +| `%%GLOBAL_BlogTitle%%` | . | +| `%%GLOBAL_NewsDate%%` | . | +| `%%GLOBAL_NewsContent%%` | . | +| `%%GLOBAL_SubscriptionHeading%%` | . | +| `%%GLOBAL_Class%%` | . | +| `%%GLOBAL_SubscriptionMessage%%` | . | +| `%%GLOBAL_ShortName%%` | . | +| `%%GLOBAL_PostTitle%%` | . | +| `%%GLOBAL_PostAuthor%%` | . | +| `%%GLOBAL_PostISO8601DatePublished%%` | . | +| `%%GLOBAL_PostDatePublished%%` | . | +| `%%GLOBAL_PostBody%%` | . | +| `%%GLOBAL_HideBreadCrumbs%%` | . | +| `%%GLOBAL_BreadCrumbs%%` | . | +| `%%GLOBAL_FindByCategory%%` | . | +| `%%GLOBAL_ProductDesc%%` | . | +| `%%GLOBAL_productAttributesCssPath%%` | . | +| `%%GLOBAL_CurrentProdThumbImage%%` | . | +| `%%GLOBAL_ProductMaxZoomWidth%%` | . | +| `%%GLOBAL_ProductMaxZoomHeight%%` | . | +| `%%GLOBAL_ShowImageZoomer%%` | . | +| `%%GLOBAL_ProductDetailFlashMessages%%` | . | +| `%%GLOBAL_HideProductThumb%%` | . | +| `%%GLOBAL_LightBoxImageJavascript%%` | . | +| `%%GLOBAL_HideImageCarousel%%` | . | +| `%%GLOBAL_HideMorePicturesLink%%` | . | +| `%%GLOBAL_SeeMorePictures%%` | . | +| `%%GLOBAL_PinterestButton%%` | . | +| `%%GLOBAL_HideReviewLink%%` | . | +| `%%GLOBAL_ReviewLinkOnClick%%` | . | +| `%%GLOBAL_ReviewLinkText%%` | . | +| `%%GLOBAL_FacebookLikeButtonAbove%%` | . | +| `%%GLOBAL_FacebookLikeButtonBelow%%` | . | +| `%%GLOBAL_NavLinkDisplay%%` | . | +| `%%GLOBAL_DisablePrevLink%%` | . | +| `%%GLOBAL_DisableNextLink%%` | . | +| `%%GLOBAL_TotalImages%%` | . | +| `%%GLOBAL_HideCustomFields%%` | . | +| `%%GLOBAL_ProductTabsControlScript%%` | . | +| `%%GLOBAL_ProductImageMode%%` | . | +| `%%GLOBAL_HideSingleVideo%%` | . | +| `%%GLOBAL_HideVideoList%%` | . | +| `%%GLOBAL_ProductWarranty%%` | . | +| `%%GLOBAL_QuickViewShareLinks%%` | . | +| `%%GLOBAL_QuickViewFacebookLikeButton%%` | . | +| `%%GLOBAL_QuickViewProductName%%` | . | +| `%%GLOBAL_QuickViewReviews%%` | . | +| `%%GLOBAL_HideRRP%%` | . | +| `%%GLOBAL_CertificateTitle%%` | . | +| `%%GLOBAL_HideGiftCertificateForm%%` | . | +| `%%GLOBAL_CertificateTo%%` | . | +| `%%GLOBAL_CertificateToEmail%%` | . | +| `%%GLOBAL_CertificateFrom%%` | . | +| `%%GLOBAL_CertificateFromEmail%%` | . | +| `%%GLOBAL_CertificateMessage%%` | . | +| `%%GLOBAL_HideGiftCertificateAmountSelect%%` | . | +| `%%GLOBAL_GiftCertificateAmountSelect%%` | . | +| `%%GLOBAL_HideGiftCertificateCustomAmount%%` | . | +| `%%GLOBAL_CustomCertificateAmount%%` | . | +| `%%GLOBAL_GiftCertificateRange%%` | . | +| `%%GLOBAL_HideExpiryInfo%%` | . | +| `%%GLOBAL_GiftCertificateTerms%%` | . | +| `%%GLOBAL_GiftCertificateThemes%%` | . | +| `%%GLOBAL_SaveGiftCertificateButton%%` | . | +| `%%GLOBAL_GiftCertificatePreviewModalTitle%%` | . | +| `%%GLOBAL_CategoryOptions%%` | . | +| `%%GLOBAL_SelectedCategoryOptions%%` | . | +| `%%GLOBAL_AutoHideSearchForm%%` | . | +| `%%GLOBAL_HideAdvancedLink%%` | . | +| `%%GLOBAL_HideAdvancedOptions%%` | . | +| `%%GLOBAL_FormattedSearchQuery%%` | . | +| `%%GLOBAL_BrandNameOptions%%` | . | +| `%%GLOBAL_PriceFrom%%` | . | +| `%%GLOBAL_PriceTo%%` | . | +| `%%GLOBAL_HideSearchResults%%` | . | +| `%%GLOBAL_SearchResults%%` | . | +| `%%GLOBAL_HideSearchResultsContent%%` | . | +| `%%GLOBAL_SearchResultsContent%%` | . | +| `%%GLOBAL_HideSearchResultsCategoryAndBrand%%` | . | +| `%%GLOBAL_HideSearchResultsCategory%%` | . | +| `%%GLOBAL_SearchResultsCategory%%` | . | +| `%%GLOBAL_HideSearchResultsBrand%%` | . | +| `%%GLOBAL_SearchResultsBrand%%` | . | +| `%%GLOBAL_HideSearchResultsProduct%%` | . | +| `%%GLOBAL_SearchResultsProduct%%` | . | +| `%%GLOBAL_SnippetSearchResultsFeed%%` | . | +| `%%GLOBAL_FirstProductId%%` | . | +| `%%GLOBAL_SharingData%%` | . | +| `%%GLOBAL_HideChooseAnotherToShare%%` | . | +| `%%GLOBAL_HideAddShippingAddressIntroMessage%%` | . | +| `%%GLOBAL_ShippingAddressFormIntro%%` | . | +| `%%GLOBAL_HideAddShippingAddressMessage%%` | . | +| `%%GLOBAL_Message%%` | . | +| `%%GLOBAL_ShippingAddressFormAction%%` | . | +| `%%GLOBAL_ShipId%%` | . | +| `%%GLOBAL_NumNewMessages%%` | . | +| `%%GLOBAL_NumWishListItems%%` | . | +| `%%GLOBAL_HideStoreCredit%%` | . | +| `%%GLOBAL_StoreCreditAmount%%` | . | +| `%%GLOBAL_HideBrandTagCloudPanel%%` | . | +| `%%GLOBAL_HideSideCart%%` | . | +| `%%GLOBAL_SideCartItemCount%%` | . | +| `%%GLOBAL_SideCategoryListTypeClass%%` | . | +| `%%GLOBAL_HideSideCategoryNewProductsPanel%%` | . | +| `%%GLOBAL_HideSideCategoryPopularProductsPanel%%` | . | +| `%%GLOBAL_HideSideCategoryShopByPricePanel%%` | . | +| `%%GLOBAL_HideSideCategoryTopSellersPanel%%` | . | +| `%%GLOBAL_SideLiveChatCode%%` | . | +| `%%GLOBAL_HideSideNewProductsPanel%%` | . | +| `%%GLOBAL_NewsletterBoxControlScript%%` | . | +| `%%GLOBAL_HideSidePopularProductsPanel%%` | . | +| `%%GLOBAL_WishLists%%` | . | +| `%%GLOBAL_AlsoBoughtProductListing%%` | . | +| `%%GLOBAL_HideRecentlyViewedProductsPanel%%` | . | +| `%%GLOBAL_HideRelatedProductsPanel%%` | . | +| `%%GLOBAL_HideSideShopByBrandFullPanel%%` | . | +| `%%GLOBAL_HideSubPagesList%%` | . | +| `%%GLOBAL_PageLinks%%` | . | +| `%%GLOBAL_HideSideTopSellersPanel%%` | . | +| `%%GLOBAL_HideIfSubsection%%` | . | +| `%%GLOBAL_SitemapLink%%` | . | +| `%%GLOBAL_SitemapSubsectionTrail%%` | . | +| `%%GLOBAL_ShowNewsFeed%%` | . | +| `%%GLOBAL_ShowNewProductsFeed%%` | . | +| `%%GLOBAL_ShowPopularProductsFeed%%` | . | +| `%%GLOBAL_ShowFeaturedProductsFeed%%` | . | +| `%%GLOBAL_ShowSearchFeed%%` | . | +| `%%GLOBAL_TaggedProducts%%` | . | +| `%%GLOBAL_TagProductListing%%` | . | +| `%%GLOBAL_ShowStorePhoneNumber%%` | . | +| `%%GLOBAL_StorePhoneNumber%%` | . | +| `%%GLOBAL_LiveChatCodeEnabled%%` | . | +| `%%GLOBAL_LiveChatCode%%` | . | +| `%%GLOBAL_LoginOrLogoutText%%` | . | +| `%%GLOBAL_HideWishListAddFrom%%` | . | +| `%%GLOBAL_WishListAction%%` | . | +| `%%GLOBAL_SelectPublic%%` | . | +| `%%GLOBAL_HideWishListItems%%` | . | +| `%%GLOBAL_HideShareWishList%%` | . | +| `%%GLOBAL_ShareWishListClass%%` | . | +| `%%GLOBAL_ShareWishListIntro%%` | . | +| `%%GLOBAL_PublicWishListUrl%%` | . | +| `%%GLOBAL_HideWishLists%%` | . | +| `%%GLOBAL_HideWishListsTable%%` | . | +| `%%GLOBAL_DownloadName%%` | . | +| `%%GLOBAL_DisplayDownloadLink%%` | . | +| `%%GLOBAL_DownloadSize%%` | . | +| `%%GLOBAL_DownloadColor%%` | . | +| `%%GLOBAL_DisplayDownloadExpired%%` | . | +| `%%GLOBAL_DownloadDescription%%` | . | +| `%%GLOBAL_MessageSubject%%` | . | +| `%%GLOBAL_MessageDate%%` | . | +| `%%GLOBAL_Icon%%` | . | +| `%%GLOBAL_Sender%%` | . | +| `%%GLOBAL_MessageContent%%` | . | +| `%%GLOBAL_OrderItemMessage%%` | . | +| `%%GLOBAL_ProductQtySelect%%` | . | +| `%%GLOBAL_DisableViewButton%%` | . | +| `%%GLOBAL_DownloadItemEncrypted%%` | . | +| `%%GLOBAL_ItemQty%%` | . | +| `%%GLOBAL_ItemName%%` | . | +| `%%GLOBAL_ItemShippingRow%%` | . | +| `%%GLOBAL_DisableReorder%%` | . | +| `%%GLOBAL_Qty%%` | . | +| `%%GLOBAL_Link%%` | . | +| `%%GLOBAL_Target%%` | . | +| `%%GLOBAL_Name%%` | . | +| `%%GLOBAL_HideItemMessage%%` | . | +| `%%GLOBAL_ReorderMessage%%` | . | +| `%%GLOBAL_Price%%` | . | +| `%%GLOBAL_ItemShippingRow_AddressLine%%` | . | +| `%%GLOBAL_TrackingLink%%` | . | +| `%%GLOBAL_OrderInstructions%%` | . | +| `%%GLOBAL_ReturnedQuantity%%` | . | +| `%%GLOBAL_ReturnedProduct%%` | . | +| `%%GLOBAL_ReturnedProductOptions%%` | . | +| `%%GLOBAL_DateRequested%%` | . | +| `%%GLOBAL_HideReturnComment%%` | . | +| `%%GLOBAL_AddThisServiceButtonMeta%%` | . | +| `%%GLOBAL_AddThisServiceButtons%%` | . | +| `%%GLOBAL_Thumbnail%%` | . | +| `%%GLOBAL_RecentPostSummary%%` | . | +| `%%GLOBAL_NumProducts%%` | . | +| `%%GLOBAL_TagSize%%` | . | +| `%%GLOBAL_ChooseBrandFromList%%` | . | +| `%%GLOBAL_CouponId%%` | . | +| `%%GLOBAL_MASTER_THEME_PATH%%` | . | +| `%%GLOBAL_CustomizeProductTitle%%` | . | +| `%%GLOBAL_GiftCertificateId%%` | . | +| `%%GLOBAL_HideGiftWrappingAdd%%` | . | +| `%%GLOBAL_HideGiftWrappingEdit%%` | . | +| `%%GLOBAL_CartItemQty%%` | . | +| `%%GLOBAL_HideCartItemRemove%%` | . | +| `%%GLOBAL_QtySelectStyle%%` | . | +| `%%GLOBAL_Quantity1%%` | . | +| `%%GLOBAL_Quantity2%%` | . | +| `%%GLOBAL_Quantity3%%` | . | +| `%%GLOBAL_Quantity4%%` | . | +| `%%GLOBAL_Quantity5%%` | . | +| `%%GLOBAL_Quantity6%%` | . | +| `%%GLOBAL_Quantity7%%` | . | +| `%%GLOBAL_Quantity8%%` | . | +| `%%GLOBAL_Quantity9%%` | . | +| `%%GLOBAL_Quantity10%%` | . | +| `%%GLOBAL_Quantity11%%` | . | +| `%%GLOBAL_Quantity12%%` | . | +| `%%GLOBAL_Quantity13%%` | . | +| `%%GLOBAL_Quantity14%%` | . | +| `%%GLOBAL_Quantity15%%` | . | +| `%%GLOBAL_Quantity16%%` | . | +| `%%GLOBAL_Quantity17%%` | . | +| `%%GLOBAL_Quantity18%%` | . | +| `%%GLOBAL_Quantity19%%` | . | +| `%%GLOBAL_Quantity20%%` | . | +| `%%GLOBAL_Quantity21%%` | . | +| `%%GLOBAL_Quantity22%%` | . | +| `%%GLOBAL_Quantity23%%` | . | +| `%%GLOBAL_Quantity24%%` | . | +| `%%GLOBAL_Quantity25%%` | . | +| `%%GLOBAL_Quantity26%%` | . | +| `%%GLOBAL_Quantity27%%` | . | +| `%%GLOBAL_Quantity28%%` | . | +| `%%GLOBAL_Quantity29%%` | . | +| `%%GLOBAL_Quantity30%%` | . | +| `%%GLOBAL_QtyOptionSelected%%` | . | +| `%%GLOBAL_ProductAttributeName%%` | . | +| `%%GLOBAL_ProductAttributeValue%%` | . | +| `%%GLOBAL_NextLink%%` | . | +| `%%GLOBAL_PrevLink%%` | . | +| `%%GLOBAL_URL%%` | . | +| `%%GLOBAL_HiddenSortField%%` | . | +| `%%GLOBAL_SortFeaturedSelected%%` | . | +| `%%GLOBAL_SortNewestSelected%%` | . | +| `%%GLOBAL_SortBestSellingSelected%%` | . | +| `%%GLOBAL_SortAlphaAsc%%` | . | +| `%%GLOBAL_SortAlphaDesc%%` | . | +| `%%GLOBAL_SortAvgReview%%` | . | +| `%%GLOBAL_SortPriceAsc%%` | . | +| `%%GLOBAL_SortPriceDesc%%` | . | +| `%%GLOBAL_HideCartProductFields%%` | . | +| `%%GLOBAL_MailFormatPreferenceOptions%%` | . | +| `%%GLOBAL_ProviderChecked%%` | . | +| `%%GLOBAL_ProviderType%%` | . | +| `%%GLOBAL_ProviderPaymentFormClass%%` | . | +| `%%GLOBAL_ProviderName%%` | . | +| `%%GLOBAL_HideAddressButton%%` | . | +| `%%GLOBAL_CompareWidth%%` | . | +| `%%GLOBAL_RemoveCompareLink%%` | . | +| `%%GLOBAL_HideComparisonReviewLink%%` | . | +| `%%GLOBAL_NumReviews%%` | . | +| `%%GLOBAL_ProductSummary%%` | . | +| `%%GLOBAL_CustomFields%%` | . | +| `%%GLOBAL_ProductBrand%%` | . | +| `%%GLOBAL_CompareHeadWidth%%` | . | +| `%%GLOBAL_HideProductPrice%%` | . | +| `%%GLOBAL_PrivacyCookieNotification%%` | . | +| `%%GLOBAL_ProductAttributesJavascript%%` | . | +| `%%GLOBAL_DesignModeCurrentTemplate%%` | . | +| `%%GLOBAL_DesignModeUpdateUrl%%` | . | +| `%%GLOBAL_ShippingQuoteRow%%` | . | +| `%%GLOBAL_EventDateNameRequired%%` | . | +| `%%GLOBAL_EventDateName%%` | . | +| `%%GLOBAL_EventDateLimitations%%` | . | +| `%%GLOBAL_EventDateMonthStyle%%` | . | +| `%%GLOBAL_OverviewToMonths%%` | . | +| `%%GLOBAL_EventDateDayStyle%%` | . | +| `%%GLOBAL_OverviewToDays%%` | . | +| `%%GLOBAL_EventDateYearStyle%%` | . | +| `%%GLOBAL_OverviewToYears%%` | . | +| `%%GLOBAL_AddressSelected%%` | . | +| `%%GLOBAL_UseExistingAddress%%` | . | +| `%%GLOBAL_AddressList%%` | . | +| `%%GLOBAL_AddNewAddress%%` | . | +| `%%GLOBAL_HideCreateAddress%%` | . | +| `%%GLOBAL_CompiledFormFields%%` | . | +| `%%GLOBAL_HideSaveAddress%%` | . | +| `%%GLOBAL_SaveAddressChecked%%` | . | +| `%%GLOBAL_CompiledFormFieldJavascript%%` | . | +| `%%GLOBAL_AdjustedTotalCost%%` | . | +| `%%GLOBAL_HideButtomPaymentButton%%` | . | +| `%%GLOBAL_ExpressCheckoutLoadPaymentForm%%` | . | +| `%%GLOBAL_FrameWidth%%` | . | +| `%%GLOBAL_FacebookButtonHref%%` | . | +| `%%GLOBAL_fastCartProdImg%%` | . | +| `%%GLOBAL_fastCartQuantityTxt%%` | . | +| `%%GLOBAL_fastCartProdLink%%` | . | +| `%%GLOBAL_fastCartQuantity%%` | . | +| `%%GLOBAL_fastCartProdTotal%%` | . | +| `%%GLOBAL_fastCartSubtotal%%` | . | +| `%%GLOBAL_fastCartNumItemsTxt%%` | . | +| `%%GLOBAL_FeaturedCategoryTextColourClass%%` | . | +| `%%GLOBAL_FeaturedCategoryRootName%%` | . | +| `%%GLOBAL_FeaturedCategoryUrl%%` | . | +| `%%GLOBAL_FeaturedCategoryImage%%` | . | +| `%%GLOBAL_FeaturedCategoryImageStyle%%` | . | +| `%%GLOBAL_FlyoutNodeUrl%%` | . | +| `%%GLOBAL_FlyoutNodeLabel%%` | . | +| `%%GLOBAL_HideWrappingTitle%%` | . | +| `%%GLOBAL_ExtraClass%%` | . | +| `%%GLOBAL_WrappingOptions%%` | . | +| `%%GLOBAL_GiftWrapPreviewLinks%%` | . | +| `%%GLOBAL_GiftWrapMessage%%` | . | +| `%%GLOBAL_HideWrappingSeparator%%` | . | +| `%%GLOBAL_CurrencyID%%` | . | +| `%%GLOBAL_CurrencyFlagURL%%` | . | +| `%%GLOBAL_CurrencyClass%%` | . | +| `%%GLOBAL_CustomerPhone%%` | . | +| `%%GLOBAL_TotalCost%%` | . | +| `%%GLOBAL_CdnStorePath%%` | . | +| `%%GLOBAL_ImageDirectory%%` | The name of the product images directory. | +| `%%GLOBAL_StoreLogo%%` | The store logo (image or text logo) | +| `%%GLOBAL_LogoText%%` | . | +| `%%GLOBAL_MsgBox_Type%%` | . | +| `%%GLOBAL_MsgBox_Message%%` | . | +| `%%GLOBAL_MobileSiteURL%%` | . | +| `%%GLOBAL_ShippingAddressSelect%%` | . | +| `%%GLOBAL_HasSubMenuClass%%` | . | +| `%%GLOBAL_ActivePageClass%%` | . | +| `%%GLOBAL_SubMenu%%` | . | +| `%%GLOBAL_SubMenuLinks%%` | . | +| `%%GLOBAL_RSSLink%%` | . | +| `%%GLOBAL_RSSTitle%%` | . | +| `%%GLOBAL_RSSDescription%%` | . | +| `%%GLOBAL_sPageLink%%` | . | +| `%%GLOBAL_sPageName%%` | . | +| `%%GLOBAL_PinterestButtonDescription%%` | . | +| `%%GLOBAL_TagUrl%%` | . | +| `%%GLOBAL_InvoiceTitle%%` | . | +| `%%GLOBAL_invoiceItemClass%%` | . | +| `%%GLOBAL_addressColumnRowSpan%%` | . | +| `%%GLOBAL_productShippingAddress%%` | . | +| `%%GLOBAL_HidePreOrder%%` | . | +| `%%GLOBAL_ProductPreOrder%%` | . | +| `%%GLOBAL_ProductCost%%` | . | +| `%%GLOBAL_ProductTotalCost%%` | . | +| `%%GLOBAL_FieldName%%` | . | +| `%%GLOBAL_SKUValue%%` | . | +| `%%GLOBAL_FieldValue%%` | . | +| `%%GLOBAL_classNameAppend%%` | . | +| `%%GLOBAL_totalRowColspan%%` | . | +| `%%GLOBAL_ProductBinNumber%%` | . | +| `%%GLOBAL_AddToCartButtonControlScript%%` | . | +| `%%GLOBAL_HideSKU%%` | . | +| `%%GLOBAL_SKU%%` | . | +| `%%GLOBAL_HideCondition%%` | . | +| `%%GLOBAL_ProductCondition%%` | . | +| `%%GLOBAL_HideWeight%%` | . | +| `%%GLOBAL_ProductWeight%%` | . | +| `%%GLOBAL_HideAvailability%%` | . | +| `%%GLOBAL_Availability%%` | . | +| `%%GLOBAL_HideShipping%%` | . | +| `%%GLOBAL_HideMinQty%%` | . | +| `%%GLOBAL_MinQty%%` | . | +| `%%GLOBAL_HideMaxQty%%` | . | +| `%%GLOBAL_MaxQty%%` | . | +| `%%GLOBAL_HideCurrentStock%%` | . | +| `%%GLOBAL_CurrentStockLabel%%` | . | +| `%%GLOBAL_InventoryList%%` | . | +| `%%GLOBAL_GiftWrappingAvailable%%` | . | +| `%%GLOBAL_ProductBulkDiscountThickBox%%` | . | +| `%%GLOBAL_BreadcrumbItems%%` | . | +| `%%GLOBAL_BulkDiscountThickBoxTitle%%` | . | +| `%%GLOBAL_ReleaseDate%%` | . | +| `%%GLOBAL_CheckboxFieldNameLeft%%` | . | +| `%%GLOBAL_CheckboxFieldNameRight%%` | . | +| `%%GLOBAL_FindByCategoryItems%%` | . | +| `%%GLOBAL_ProdImageZoomJavascript%%` | . | +| `%%GLOBAL_LightBoxImageList%%` | . | +| `%%GLOBAL_ProductTinyBoxWidth%%` | . | +| `%%GLOBAL_VisibleImageTotal%%` | . | +| `%%GLOBAL_ReviewError%%` | . | +| `%%GLOBAL_AlternateReviewClass%%` | . | +| `%%GLOBAL_ReviewTitle%%` | . | +| `%%GLOBAL_ReviewRating%%` | . | +| `%%GLOBAL_ReviewName%%` | . | +| `%%GLOBAL_ReviewDate%%` | . | +| `%%GLOBAL_ReviewText%%` | . | +| `%%GLOBAL_ProductReviews%%` | . | +| `%%GLOBAL_PrevRevLink%%` | . | +| `%%GLOBAL_ReviewEnd%%` | . | +| `%%GLOBAL_ProductNumReviews%%` | . | +| `%%GLOBAL_NextRevLink%%` | . | +| `%%GLOBAL_TinyImageOverJavascript%%` | . | +| `%%GLOBAL_ProductThumbImageURL%%` | . | +| `%%GLOBAL_ProductZoomImageURL%%` | . | +| `%%GLOBAL_ProductTinyImageURL%%` | . | +| `%%GLOBAL_VariationChooseText%%` | . | +| `%%GLOBAL_OptionChecked%%` | . | +| `%%GLOBAL_BlogLink%%` | . | +| `%%GLOBAL_BlogText%%` | . | +| `%%GLOBAL_BlogPreview%%` | . | +| `%%GLOBAL_RelatedSearchQuery%%` | . | +| `%%GLOBAL_RelatedSearchText%%` | . | +| `%%GLOBAL_ProductNoImageClassName%%` | . | +| `%%GLOBAL_ProductRatingImage%%` | . | +| `%%GLOBAL_HideSectionSorting%%` | . | +| `%%GLOBAL_SectionSortingOptions%%` | . | +| `%%GLOBAL_SectionExtraClass%%` | . | +| `%%GLOBAL_SectionResults%%` | . | +| `%%GLOBAL_NewsSmallContent%%` | . | +| `%%GLOBAL_GiftWrappingTitle%%` | . | +| `%%GLOBAL_GiftWrapModalClass%%` | . | +| `%%GLOBAL_ShippingData%%` | . | +| `%%GLOBAL_HideAddressLine%%` | . | +| `%%GLOBAL_HideItemList%%` | . | +| `%%GLOBAL_ShippingProviders%%` | . | +| `%%GLOBAL_HideHorizontalRule%%` | . | +| `%%GLOBAL_PriceLink%%` | . | +| `%%GLOBAL_PriceLow%%` | . | +| `%%GLOBAL_PriceHigh%%` | . | +| `%%GLOBAL_LastChildClass%%` | . | +| `%%GLOBAL_CategoryLink%%` | . | +| `%%GLOBAL_CategoryName%%` | . | +| `%%GLOBAL_SubCategoryList%%` | . | +| `%%GLOBAL_CurrencyFlagStyle%%` | . | +| `%%GLOBAL_CurrencySwitchLink%%` | . | +| `%%GLOBAL_CurrencySelected%%` | . | +| `%%GLOBAL_CurrencyFlag%%` | . | +| `%%GLOBAL_RootCatName%%` | . | +| `%%GLOBAL_RootCatList%%` | . | +| `%%GLOBAL_ProductRatingImageDimensions%%` | . | +| `%%GLOBAL_SitemapURL_HTML%%` | . | +| `%%GLOBAL_ModelType%%` | . | +| `%%GLOBAL_ModelHeading%%` | . | +| `%%GLOBAL_ModelBody%%` | . | +| `%%GLOBAL_ModelHideAllLink%%` | . | +| `%%GLOBAL_ModelSubsectionURL%%` | . | +| `%%GLOBAL_Slide_Link_Url%%` | . | +| `%%GLOBAL_Slide_Heading_Color%%` | . | +| `%%GLOBAL_Slide_Heading_Text%%` | . | +| `%%GLOBAL_Slide_Text_Color%%` | . | +| `%%GLOBAL_Slide_Text_Text%%` | . | +| `%%GLOBAL_Slide_Button_Hide%%` | . | +| `%%GLOBAL_Slide_Button_Color%%` | . | +| `%%GLOBAL_Slide_Button_Text%%` | . | +| `%%GLOBAL_Slide_Image_Url%%` | . | +| `%%GLOBAL_Slide_Image_AlternateText%%` | . | +| `%%GLOBAL_SocialMedia_Service_Url%%` | . | +| `%%GLOBAL_UseThemeSettingsClass%%` | . | +| `%%GLOBAL_SocialMedia_Service_Class%%` | . | +| `%%GLOBAL_SharingActiveTab%%` | . | +| `%%GLOBAL_SharingIcon%%` | . | +| `%%GLOBAL_SharingDisplay%%` | . | +| `%%GLOBAL_SubBrandImage%%` | . | +| `%%GLOBAL_SubCatImage%%` | . | +| `%%GLOBAL_VideoTitleShort%%` | . | +| `%%GLOBAL_VideoDescriptionShort%%` | . | +| `%%GLOBAL_NumOfItems%%` | . | +| `%%GLOBAL_WishListShared%%` | . | +| `%%GLOBAL_ShareWishListLink%%` | . | +| `%%GLOBAL_HideRemoveItemButton%%` | . | +| `%%GLOBAL_MerchantName%%` | . | +| `%%GLOBAL_AC_EmailBody%%` | . | +| `%%GLOBAL_AC_UnsubscribeLink%%` | . | +| `%%GLOBAL_Email%%` | . | +| `%%GLOBAL_Password%%` | . | +| `%%GLOBAL_Ebay_Listing_Abort_Email_Message_1%%` | . | +| `%%GLOBAL_Ebay_Listing_Abort_Email_Message_2%%` | . | +| `%%GLOBAL_Ebay_Listing_Error_Email_Message_1%%` | . | +| `%%GLOBAL_Ebay_Listing_Error_Email_Error_Heading%%` | . | +| `%%GLOBAL_Ebay_Listing_Error_Email_Error%%` | . | +| `%%GLOBAL_Ebay_Listing_Error_Email_Error_Footer%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Message_1%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Message_2%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Message_3%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Message_4%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Errors_Heading%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Errors%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Warnings_Heading%%` | . | +| `%%GLOBAL_Ebay_Listing_End_Email_Warnings%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Abort_Email_Message_1%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Abort_Email_Message_2%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Error_Email_Message_1%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error_Heading%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error%%` | . | +| `%%GLOBAL_EmailIntegration_Export_Error_Email_Error_Footer%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_1%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_2%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_3%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Message_4%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Errors_Heading%%` | . | +| `%%GLOBAL_EmailIntegration_Export_End_Email_Errors%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Header%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Error%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Message%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Time%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Details%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Type%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Subscription%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_CommonCauses%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause1_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause1_Detail%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause2_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause2_Detail%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause3_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause3_Detail%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause4_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause4_Detail%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause5_Intro%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Cause5_Detail%%` | . | +| `%%GLOBAL_EmailIntegrationNotice_Closing%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_1%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_2%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_Lists%%` | . | +| `%%GLOBAL_DeletedLists%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_3%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesDeletion_4%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_1%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_2%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_MergeFields%%` | . | +| `%%GLOBAL_MergeFieldsList%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_3%%` | . | +| `%%GLOBAL_NoticeOfEmailIntegrationRulesUpdate_4%%` | . | +| `%%GLOBAL_EmailMessage%%` | . | +| `%%GLOBAL_ToName%%` | . | +| `%%GLOBAL_Intro%%` | . | +| `%%GLOBAL_NoPaymentTaken%%` | . | +| `%%GLOBAL_OrderNumber%%` | . | +| `%%GLOBAL_ViewOrderStatusMsg%%` | . | +| `%%GLOBAL_PendingPaymentNotice%%` | . | +| `%%GLOBAL_PendingPaymentDetails%%` | . | +| `%%GLOBAL_OrderCommentBlock%%` | . | +| `%%GLOBAL_CartItemColumns%%` | . | +| `%%GLOBAL_LowInventoryWarning%%` | . | +| `%%GLOBAL_LowInventoryWarningIntro%%` | . | +| `%%GLOBAL_LowInventoryWarningProduct%%` | . | +| `%%GLOBAL_LowInventoryWarningCurrentStock%%` | . | +| `%%GLOBAL_LowInventoryWarningNotice%%` | . | +| `%%GLOBAL_TrackingLinkList%%` | . | +| `%%GLOBAL_ViewOrderStatusLink%%` | . | +| `%%GLOBAL_FormFieldList%%` | . | +| `%%GLOBAL_Question%%` | . | +| `%%GLOBAL_ProductReviewEmailUnsubscribeLink%%` | . | +| `%%GLOBAL_CustomerFirstName%%` | . | +| `%%GLOBAL_ReturnReceivedCredit%%` | . | +| `%%GLOBAL_AC_EmailIntroText%%` | . | +| `%%GLOBAL_ProductThumbnailUrl%%` | . | +| `%%GLOBAL_AC_ExistingCustomer%%` | . | +| `%%GLOBAL_AC_CustomerName%%` | . | +| `%%GLOBAL_AC_CustomerEmail%%` | . | +| `%%GLOBAL_AC_CustomerPhone%%` | . | +| `%%GLOBAL_AC_CustomerAddress%%` | . | +| `%%GLOBAL_AC_ModifiedType%%` | . | +| `%%GLOBAL_AC_DateModified%%` | . | +| `%%GLOBAL_AC_CartContents%%` | . | +| `%%GLOBAL_AC_CouponCode%%` | . | +| `%%GLOBAL_AC_CouponCodeText%%` | . | +| `%%GLOBAL_FormField%%` | . | +| `%%GLOBAL_FormValue%%` | . | +| `%%GLOBAL_PaymentGatewayAmount%%` | . | +| `%%GLOBAL_NoPaymentTakenModuleInTestMode%%` | . | +| `%%GLOBAL_OrderTrackingNo%%` | . | +| `%%GLOBAL_TrackURL%%` | . | +| `%%GLOBAL_RawProductPrice%%` | Currency, as a unique alphanumeric code. To follow best practices for microdata, use this variable – together with `%%GLOBAL_RawProductPrice%%` – rather than `%%GLOBAL_ProductPrice%%` (which includes a currency token/symbol). | +| `%%GLOBAL_SelectedCurrencyCode%% ` | Currency, as a unique alphanumeric code. To follow best practices for microdata, use this variable – together with `%%GLOBAL_RawProductPrice%%` – rather than `%%GLOBAL_ProductPrice%%` (which includes a currency token/symbol). | +| `%%GLOBAL_ProductReviewLink%%` | . | +| `%%GLOBAL_ProductQty%%` | . | +| `%%GLOBAL_ProductCustomFields%%` | You can use the %%GLOBAL_ProductCustomFields%% variable in any template file where you can use %%GLOBAL_ProductPrice%%. (Namely, in template files that render a particular panel's individual items. Examples are: Snippets/CategoryProductsItem.html, for category pages; or Snippets/HomeFeaturedProductsItem.html, for the Featured Products panel.) Once %%GLOBAL_ProductCustomFields%% is added, it will render the entire table of custom fields. To incorporate this variable into faceted search, we recommend adding the following code to Panels/FacetedSearchProductGrid.html: | +| | Once %%GLOBAL_ProductCustomFields%% is added, it will render the entire table of custom fields. To incorporate this variable into faceted search, we recommend adding the following code to Panels/FacetedSearchProductGrid.html: | +| | `{{#each product.custom_fields}}` | +| | `{{ id }} : {{ name }} : {{ value }}` | +| | `{{/each}}` | diff --git a/docs/legacy/blueprint-themes/lng-variables.mdx b/archive/storefront/blueprint/themes/lng-variables.mdx similarity index 98% rename from docs/legacy/blueprint-themes/lng-variables.mdx rename to archive/storefront/blueprint/themes/lng-variables.mdx index a55d491ae..7fc3bb74e 100644 --- a/docs/legacy/blueprint-themes/lng-variables.mdx +++ b/archive/storefront/blueprint/themes/lng-variables.mdx @@ -1,894 +1,894 @@ -# LNG Variables - -The Blueprint theme uses the following LNG variables to reference text strings. This list is sorted alphabetically by variable name. - -To make it easier for store owners who might wish to translate, or otherwise modify, their strings: Use these variables instead of hard-coding string values into your theme. - -| Variable | Default string value | -|:---------|:---------------------| -| `%%LNG_AC_AbandonedCartConvertedHeading%%` | "An abandoned cart was converted to an order" | -| `%%LNG_AC_AbandonedCartNoticeHeading%%` | "Abandoned Cart Notice" | -| `%%LNG_AC_CartContentsSubheading%%` | "Products In Cart" | -| `%%LNG_AC_ContactDetailsSubheading%%` | "Contact Details" | -| `%%LNG_AC_CouponCodeAfterText%%` | " during checkout to receive " | -| `%%LNG_AC_CouponCodeBeforeText%%` | "Enter coupon code " | -| `%%LNG_AC_EmailUnsubscribe%%` | "Unsubscribe" | -| `%%LNG_AC_EmailUnsubscribeSuffix%%` | " from future emails like this" | -| `%%LNG_AC_RecoveredEmailIntroText%%` | "The automated emails we've been sending shoppers who didn't make it all the way through the checkout process have resulted in a new order. The customer's contact details and ordered items are shown below." | -| `%%LNG_AC_RecoveredEmailSubHeading%%` | "Congratulations!" | -| `%%LNG_AccountDetailsDescription%%` | "Update your contact details, email address and/or change your password." | -| `%%LNG_AccountEnterFirstName%%` | "Please type in your first name." | -| `%%LNG_AccountEnterLastName%%` | "Please type in your last name." | -| `%%LNG_AccountEnterPassword%%` | "Please type in a password." | -| `%%LNG_AccountEnterPhoneNumber%%` | "Please type in your phone number." | -| `%%LNG_AccountEnterValidEmail%%` | "Please type in a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>" | -| `%%LNG_AccountInboxIntroNoOrders%%` | "Once you place an order you'll have full access to your inbox from this page." | -| `%%LNG_AccountNoRecentItems%%` | "You haven't looked at any items on our site. When you do, they will appear here." | -| `%%LNG_AccountOrdersIntro%%` | "Your completed orders with us are shown below. Click 'View Order' to view an orders details." | -| `%%LNG_AccountOrdersNone%%` | "You don't have any completed orders with us. When you do, they will appear on this page." | -| `%%LNG_AccountOrderStatusIntro%%` | "The status of your recent orders is shown below. Click 'View Order' to see complete details." | -| `%%LNG_AccountOrderStatusNone%%` | "You haven't placed any orders with us. When you do, their status will appear on this page." | -| `%%LNG_AccountPasswordsDontMatch%%` | "Your passwords don't match." | -| `%%LNG_AccountRecentItemsIntro%%` | "The items you've recently looked at on our site are shown below." | -| `%%LNG_AccountReturnsIntro%%` | "To return an item from one of your previous orders, please <a href='account.php?action=view_orders'>click here</a>." | -| `%%LNG_AccountReturnsNone%%` | "You do not have any outstanding return requests with us at the moment." | -| `%%LNG_Action%%` | "Action" | -| `%%LNG_Add%%` | "Add" | -| `%%LNG_AddressBook%%` | "Address Book" | -| `%%LNG_AddressBookDescription%%` | "Add, edit and remove shipping and billing destinations from your address book." | -| `%%LNG_AddShippingAddress%%` | "Add New Address" | -| `%%LNG_AddToCart1%%` | "Click the button below to add the" | -| `%%LNG_AddToWishList%%` | "Add to Wish List" | -| `%%LNG_AdminMaintenanceNotice%%` | "<br />Only administrators can view the store at the moment. Visit your control panel settings page to disable maintenance mode.<br /><br /><a href='?showStore=no'>Click here to see what your visitors will see.</a>" | -| `%%LNG_AdminMaintenanceNoticeHeader%%` | "Your store is down for maintenance." | -| `%%LNG_AdvancedExample1%%` | "ipod <em>or</em> creative" | -| `%%LNG_AdvancedExample2%%` | "music <em>not</em> creative" | -| `%%LNG_AdvancedSearch%%` | "Advanced Search" | -| `%%LNG_AdvancedSearching%%` | "Advanced Searching" | -| `%%LNG_AdvancedSearchingAnd%%` | "<em>not</em> specifies that the term must not be present in the search results." | -| `%%LNG_AdvancedSearchingKeywords%%` | "The words 'and', 'or' and 'not' are special keywords used to join words." | -| `%%LNG_AdvancedSearchingNot%%` | "<em>not</em> specifies that the term must not be present in the search results." | -| `%%LNG_AdvancedSearchingOr%%` | "<em>or</em> specifies that either of the terms must be present in the results." | -| `%%LNG_AdvancedSearchingPhrases%%` | "If you wish to search for a phrase, enclose it within <em>"double quotes"</em>" | -| `%%LNG_AlphaAsc%%` | "Alphabetical: A to Z" | -| `%%LNG_AlphaDesc%%` | "Alphabetical: Z to A" | -| `%%LNG_AlreadyHaveAnAccount%%` | "I'm A Returning Customer" | -| `%%LNG_AlreadyHaveAnAccountIntro%%` | "To continue, please enter your email address and password that you use for your account." | -| `%%LNG_AlsoWantToShipToThisAddress%%` | "I also want to ship to this address" | -| `%%LNG_Amount%%` | "Amount" | -| `%%LNG_Apply%%` | "Apply" | -| `%%LNG_AuthorisationCode%%` | "Authorisation Code" | -| `%%LNG_AuthorizeNetCardHoldersName%%` | ”Cardholder's Name" | -| `%%LNG_AuthorizeNetCreditCardCCV2%%` | ”CVV Code" | -| `%%LNG_AuthorizeNetCreditCardNo%%` | ”Credit Card Number" | -| `%%LNG_AuthorizeNetCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | -| `%%LNG_AuthorizeNetEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | -| `%%LNG_AuthorizeNetEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | -| `%%LNG_AuthorizeNetEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | -| `%%LNG_AuthorizeNetEnterCVV2Number%%` | ”Please enter your credit card vertification number. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_AuthorizeNetEnterName%%` | ”You forgot to enter the cardholder's name." | -| `%%LNG_AuthorizeNetExpirationDate%%` | ”Expiration Date" | -| `%%LNG_AuthorizeNetPayForOrder%%` | ”Pay for Order" | -| `%%LNG_AuthorizeNetPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | -| `%%LNG_AuthorizeNetProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_AuthorizeNetTotalAmount%%` | ”Order Total" | -| `%%LNG_AutoSearchSubCats%%` | "Automatically search sub categories" | -| `%%LNG_Availability%%` | "Availability" | -| `%%LNG_AvgCustomerReview%%` | "Avg. Customer Review" | -| `%%LNG_BadContactFormCaptcha%%` | "The characters you copied from the image are incorrect. Please try again." | -| `%%LNG_BasicExample1%%` | "ipod touch" | -| `%%LNG_BasicExample2%%` | "mp3 player" | -| `%%LNG_BasicSearching%%` | "Basic Searching" | -| `%%LNG_BasicSearchingCommon%%` | "Common words such as 'are' and 'is' as well as words below 3 characters are automatically removed from your search terms." | -| `%%LNG_BasicSearchingFields%%` | "All search terms are matched against product names, descriptions and the product code." | -| `%%LNG_BasicSearchingMultiple%%` | "Multiple search words are supported. Results containing all of your search terms are ranked higher than those which don't." | -| `%%LNG_BasicSearchingShort%%` | "Try to keep search terms short and to the point." | -| `%%LNG_Bestselling%%` | "Bestselling" | -| `%%LNG_BillAndShipToAddress%%` | "Bill & Ship to this Address" | -| `%%LNG_BillingAddress%%` | "Billing Address" | -| `%%LNG_BillingDetails%%` | "Billing Details" | -| `%%LNG_BillTo%%` | "Billing Details" | -| `%%LNG_BillToThisAddress%%` | "Bill to this address" | -| `%%LNG_Brand%%` | "Brand" | -| `%%LNG_BrandName%%` | "Brand Name" | -| `%%LNG_Brands%%` | "Brands" | -| `%%LNG_BrandsTagCloud%%` | "Brands Tag Cloud" | -| `%%LNG_BrandTagCloudHelp%%` | "The <em>brands tag cloud</em> shows all of the brands available for purchase.<br /><br />The bigger the brand appears, the more products it contains.<br /><br />Click on a brand below to see all products listed under that brand.<br /><br />" | -| `%%LNG_BulkDiscountLink%%` | "Buy in bulk and save" | -| `%%LNG_BulkDiscountThickBoxIntro%%` | "Below are the available bulk discount rates for each individual item when you purchase a certain amount" | -| `%%LNG_BulkDiscountThickBoxIntro%%` | "Below are the available bulk discount rates for each individual item when you purchase a certain amount" | -| `%%LNG_CalculateShipping%%` | "Estimate Shipping & Tax" | -| `%%LNG_CalculateShippingHandling%%` | "Estimate Shipping & Tax" | -| `%%LNG_Calculating%%` | "Estimating..." | -| `%%LNG_Cancel%%` | "Cancel" | -| `%%LNG_CantReorderGiftCertificateAlert%%` | "Unfortunately gift certificates can not be reordered. Click on the 'Gift Certificates' link to purchase a new one." | -| `%%LNG_CantReorderItems%%` | "One or more selected items can\'t be reordered." | -| `%%LNG_CapitalFor%%` | "For" | -| `%%LNG_CaptchaIntro%%` | "Please copy the characters from the image into the text field below. Doing this helps us prevent automated submissions." | -| `%%LNG_CaptchaVerification%%` | "Captcha Check" | -| `%%LNG_CardholderName%%` | "Cardholder Name" | -| `%%LNG_CartItems%%` | "Cart Items" | -| `%%LNG_CartRemoveConfirm%%` | "Are you sure you want to remove this item from your cart?" | -| `%%LNG_CatalogPriceExTaxLabel%%` | " (ex :label)" | -| `%%LNG_CatalogPriceIncTaxLabel%%` | " (inc :label)" | -| `%%LNG_Categories%%` | "Categories" | -| `%%LNG_CategoryNewProductsFeed%%` | "New Products RSS Feed for %s" | -| `%%LNG_CategoryPopularProductsFeed%%` | "Popular Products RSS Feed for %s" | -| `%%LNG_CCManualCardHoldersName%%` | ”Cardholder's Name" | -| `%%LNG_CCManualChooseCardType%%` | ”You forgot to choose a card type." | -| `%%LNG_CCManualCreditCardCCV2%%` | ”CCV2 Value" | -| `%%LNG_CCManualCreditCardCVV2Help%%` | | -| `%%LNG_CCManualCreditCardIssueNo%%` | ”Card Issue No" | -| `%%LNG_CCManualCreditCardIssueNoHelp%%` | | -| `%%LNG_CCManualCreditCardNo%%` | ”Credit Card No" | -| `%%LNG_CCManualCreditCardNoHelp%%` | | -| `%%LNG_CCManualCreditCardType%%` | ”Card Type" | -| `%%LNG_CCManualEnterCardNumber%%` | ”Please enter a valid credit card number containing no spaces or dashes." | -| `%%LNG_CCManualEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | -| `%%LNG_CCManualEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | -| `%%LNG_CCManualEnterCVV2Number%%` | ”Please enter your credit card verification number. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_CCManualEnterIssueDetails%%` | ”Please enter a valid issue number or issue date." | -| `%%LNG_CCManualEnterName%%` | ”You forgot to enter the cardholder's name." | -| `%%LNG_CCManualExpirationDate%%` | ”Expiration Date" | -| `%%LNG_CCManualIssueDate%%` | ”Card Issue Date" | -| `%%LNG_CCManualIssueDateHelp%%` | | -| `%%LNG_CCManualPayForOrder%%` | | -| `%%LNG_CCManualPaymentIntro%%` | | -| `%%LNG_CCManualPleaseChoose%%` | | -| `%%LNG_CCManualTotalAmount%%` | | -| `%%LNG_CertificateCode%%` | "Code" | -| `%%LNG_CertificateFrom%%` | "From" | -| `%%LNG_CertificateTo%%` | "To" | -| `%%LNG_Change%%` | "Change" | -| `%%LNG_ChangeYourPassword%%` | "Change Your Password" | -| `%%LNG_CharactersRemaining%%` | "characters remaining" | -| `%%LNG_CheckBalance%%` | "Check Balance" | -| `%%LNG_CheckCertificateBalance%%` | "Check Remaining Balance" | -| `%%LNG_CheckingOutAs%%` | "Checking Out As" | -| `%%LNG_Checkout%%` | "Checkout" | -| `%%LNG_CheckoutAsAGuest%%` | "Checkout as a guest" | -| `%%LNG_CheckoutButtonTitle%%` | "Click here to proceed to checkout" | -| `%%LNG_CheckoutGuestIntro%%` | "Register with us for a faster checkout, to track the status of your order and more. You can also checkout as a guest." | -| `%%LNG_CheckoutUseStoreCredit%%` | "Pay using my store credit" | -| `%%LNG_CheckoutWithMultipleAddresses%%` | "Checkout with multiple addresses" | -| `%%LNG_ChooseAnotherProduct%%` | "Choose Another Product" | -| `%%LNG_ChooseGiftWrappingOption%%` | "-- Please choose a type of gift wrapping --" | -| `%%LNG_ChooseHowToWrapItems%%` | "Please choose how you'd like to have this item gift wrapped." | -| `%%LNG_ChooseReturnAction%%` | "-- Please Choose an Action (Optional) --" | -| `%%LNG_ChooseReturnReason%%` | "-- Please Choose a Reason --" | -| `%%LNG_ChooseShippingCountry%%` | "Please choose your country." | -| `%%LNG_ChooseShippingMethod%%` | "Please choose a shipping method." | -| `%%LNG_ChooseShippingProvider%%` | "Choose a Shipping Method" | -| `%%LNG_ChooseShippingState%%` | "Please choose a state/province." | -| `%%LNG_ChooseYourOptions%%` | "Choose Your Options" | -| `%%LNG_ClickHere%%` | "click here" | -| `%%LNG_ClickHereToTrackYourOrder%%` | "Track the status of your order" | -| `%%LNG_ClickToCreateAnAccount%%` | "Click here to create a new account." | -| `%%LNG_ClickToPrintInvoice%%` | "Print Invoice" | -| `%%LNG_ClickToViewReturnStatus%%` | "Click here to view the status of this return." | -| `%%LNG_Close%%` | "Close" | -| `%%LNG_CloseWindow%%` | "Close Window" | -| `%%LNG_CloseWindow%%` | "Close Window" | -| `%%LNG_Code%%` | "Code/SKU" | -| `%%LNG_Comments%%` | "Comments" | -| `%%LNG_CompanyName%%` | "Company Name" | -| `%%LNG_Compare%%` | "Compare" | -| `%%LNG_CompareSelected%%` | "Compare Selected" | -| `%%LNG_CompareSelectMessage%%` | "Please choose at least 2 products to compare." | -| `%%LNG_CompareTwoProducts%%` | "At least 2 products are needed to make a valid comparison." | -| `%%LNG_CompletedOrders%%` | "Completed Orders" | -| `%%LNG_CompletedOrdersDescription%%` | "See all completed orders you've placed at %s. You can also print invoices from this page." | -| `%%LNG_Condition%%` | "Condition" | -| `%%LNG_ConfirmAddressTypeChange%%` | | -| `%%LNG_ConfirmDeleteShippingAddress%%` | "Are you sure you want to delete this shipping address?" | -| `%%LNG_ConfirmDeleteWishLists%%` | "Are you sure you want to delete the selected wish list(s)? This action cannot be undone." | -| `%%LNG_ConfirmRemoveGiftWrapping%%` | "Are you sure you want to remove the gift wrapping from this item?" | -| `%%LNG_ConfirmYourOrder%%` | "Please Review Your Order Before Continuing" | -| `%%LNG_ContactCompanyName%%` | "Company Name" | -| `%%LNG_ContactEmail%%` | "Email Address" | -| `%%LNG_ContactFormDetails%%` | "Here are their details" | -| `%%LNG_ContactFormEmail1%%` | "A user has submitted the contact form on your store." | -| `%%LNG_ContactFormEnterEmail%%` | "Please enter a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>." | -| `%%LNG_ContactFormEnterQuestion%%` | "You forgot to enter your question/comment." | -| `%%LNG_ContactName%%` | "Full Name" | -| `%%LNG_ContactOrderNo%%` | "Order Number" | -| `%%LNG_ContactPageFormSubmitted%%` | "'%s' submitted the form from your '%s' page" | -| `%%LNG_ContactPhone%%` | "Phone Number" | -| `%%LNG_ContactQuestion%%` | "Details" | -| `%%LNG_ContactRMANo%%` | "RMA Number" | -| `%%LNG_ContainsTheFollowingItems%%` | "Contained the Following Items" | -| `%%LNG_Continue%%` | "Continue" | -| `%%LNG_ContinueRaquo%%` | "Continue »" | -| `%%LNG_ContinueShopping%%` | "Continue Shopping" | -| `%%LNG_CouldNotShipFollowingItems%%` | "The following item(s) could not be shipped to your shipping address:" | -| `%%LNG_Country%%` | "Country" | -| `%%LNG_Coupon%%` | "Coupon" | -| `%%LNG_CouponCode%%` | "Coupon Code" | -| `%%LNG_CouponCodeIntro%%` | "If you have a coupon code, enter it in the box below and click 'Go'." | -| `%%LNG_CreateAccount%%` | "Create Account" | -| `%%LNG_CreateAccountIntro1%%` | <b>Checkout:</b> "Fill in the fields below to create an "<br><b>Express Checkout:</b> "Checkout faster"| -| `%%LNG_CreateAccountIntro2%%` | <b>Checkout:</b> "account. You'll be able to shop and check out faster on your next visit, check your order status online, and optionally receive updates on special offers and events."<br><b>Express Checkout:</b> "Save multiple addresses in your address book" | -| `%%LNG_CreateAccountIntro3%%` | "Access order history and track your orders" | -| `%%LNG_CreateAccountIntro4%%` | "Checkout faster at" | -| `%%LNG_CreateAccountIntro5%%` | "and save multiple addresses in your address book." | -| `%%LNG_CreateAccountIntroTitle%%` | "Create an account with us and you'll be able to:" | -| `%%LNG_CreateAccountLoginIntro%%` | "<p>Create an account with us and you'll be able to:</p><ul><li>Check out faster</li><li>Save multiple shipping addresses</li><li>Access your order history</li><li>Track new orders</li><li>Save items to your wish list</li></ul>" | -| `%%LNG_CreateAccountPersonalIntro%%` | "Enter your email address and password to create your account." | -| `%%LNG_CreateAccountShippingIntro%%` | "Enter the name and address you'd like us to ship your order to." | -| `%%LNG_CreateAccountThanks%%` | "Your Account Has Been Created" | -| `%%LNG_CreateAccountThanksIntro%%` | "Thank you for creating your account at %s. Your account details have been emailed to %s." | -| `%%LNG_CreateANewWishList%%` | "Create a New Wish List..." | -| `%%LNG_CreditCardCardCode%%` | ”CVV2" | -| `%%LNG_CreditCardCardHoldersName%%` | ”Cardholder's Name" | -| `%%LNG_CreditCardCardType%%` | ”Credit Card Type" | -| `%%LNG_CreditCardChooseCardType%%` | ”You forgot to choose a card type." | -| `%%LNG_CreditCardCreditCardIssueNo%%` | ”Card Issue No" | -| `%%LNG_CreditCardCreditCardIssueNoHelp%%` | ”The issue number found on the front of your card under 'ISS' or 'ISSUE'<br />Only required for cards that contain it." | -| `%%LNG_CreditCardCreditCardNo%%` | ”Credit Card Number" | -| `%%LNG_CreditCardCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | -| `%%LNG_CreditCardCVV2Help%%` | "For Visa/MasterCard/Discover cards, it\'s the three digit code beside your signature strip on the back of the card. For American Express cards, it\'s the four digit code above the account number on the front of the card." | -| `%%LNG_CreditCardEnterCardCode%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_CreditCardEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | -| `%%LNG_CreditCardEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | -| `%%LNG_CreditCardEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | -| `%%LNG_CreditCardEnterIssueNoOrDate%%` | ”Please enter your card issue number or issue date." | -| `%%LNG_CreditCardEnterName%%` | ”You forgot to enter the cardholder's name." | -| `%%LNG_CreditCardExpirationDate%%` | ”Expiration Date" | -| `%%LNG_CreditCardIssueDate%%` | ”Card Issue Date" | -| `%%LNG_CreditCardIssueDateHelp%%` | ”The issue date found on the front of your card.<br />Only required for cards that contain it." | -| `%%LNG_CreditCardPayForOrder%%` | ”Pay for Order" | -| `%%LNG_CreditCardPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | -| `%%LNG_CreditCardPleaseChoose%%` | ”-- Please Choose --" | -| `%%LNG_CreditCardProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_CreditCardTotalAmount%%` | ”Total Amount" | -| `%%LNG_CreditPaymentMethod%%` | "Pay the remaining %s via:" | -| `%%LNG_CurrencyConverter%%` | "Currency Converter" | -| `%%LNG_Currently%%` | "Currently" | -| `%%LNG_CurrentTopSellers%%` | "Current Top Sellers" | -| `%%LNG_CustomersAlsoBought%%` | "Customers Also Purchased" | -| `%%LNG_CustomersWhoLikedThisProductAlsoLiked%%` | "Customers Who Liked This Product Also Liked" | -| `%%LNG_DateAndTime%%` | "Date and Time" | -| `%%LNG_DateOfOrder%%` | "Order Date" | -| `%%LNG_DateRequested%%` | "Date Requested" | -| `%%LNG_DateShipped%%` | "Date Shipped" | -| `%%LNG_Dear%%` | "Dear" | -| `%%LNG_Delete%%` | "Delete" | -| `%%LNG_DeleteProductFieldFileConfirmation%%` | "Are you sure you want to delete the uploaded file?" | -| `%%LNG_DeliveryDisclaimer%%` | "*Delivery time is approximate from date of shipment" | -| `%%LNG_DesignModeCancel%%` | "Cancel" | -| `%%LNG_DesignModeChangesSaved%%` | "Your design mode changes have been saved successfully." | -| `%%LNG_DesignModeConfirmDisable%%` | "Are you sure you want to disable design mode? Any changes you've made won't be saved.\n\nYou can re-enable design mode at any time by logging in to your store's control panel, visiting the 'Store Design' page and clicking the 'Design Mode' tab.\n\nClick OK to confirm." | -| `%%LNG_DesignModeConfirmPanelRemove%%` | "Are you sure you want to remove the panel ':panel' from the page? It may still appear on other pages. Click OK to confirm." | -| `%%LNG_DesignModeConfirmUndo%%` | "Are you sure? Any changes you've made wont be saved. Click OK to confirm." | -| `%%LNG_DesignModeDisable%%` | "Disable" | -| `%%LNG_DesignModeLangSaving%%` | "Saving..." | -| `%%LNG_DesignModeMenuEditLayout%%` | "Edit Layout..." | -| `%%LNG_DesignModeMenuEditPanel%%` | "Edit Panel..." | -| `%%LNG_DesignModeMenuEditStylesheet%%` | "Edit Stylesheet..." | -| `%%LNG_DesignModeMenuRemovePanel%%` | "Remove Panel" | -| `%%LNG_DesignModeRemoveLastPanel%%` | "This is the last panel in this column.\n\nIf you wish to move this panel please move another panel in to this column first." | -| `%%LNG_DesignModeSave%%` | "Save" | -| `%%LNG_DesignModeToggle%%` | "Toggle" | -| `%%LNG_DesignModeUndo%%` | "Undo" | -| `%%LNG_DidYouMean%%` | "Did you mean" | -| `%%LNG_Discount%%` | "Discount" | -| `%%LNG_DownloadLink%%` | "Download" | -| `%%LNG_DownloadTheItemsYouOrdered%%` | "Download the items you ordered" | -| `%%LNG_Edit%%` | "Edit" | -| `%%LNG_EditAccountIntro%%` | "Make changes to your account details below. Click 'Update My Details' when you're done." | -| `%%LNG_Email%%` | | -| `%%LNG_EmailAddress%%` | "Email Address" | -| `%%LNG_EmptyCartInfo%%` | "To add a product to your cart, first browse for it or use the search box and then click its "Add to Cart" button." | -| `%%LNG_EmptyHomePage%%` | "home page." | -| `%%LNG_EmptySmallSearch%%` | "You forgot to enter some search keywords." | -| `%%LNG_EnterCaptchaCode%%` | "Please copy the characters from the image into the \'Captcha Check\' text box." | -| `%%LNG_EnterCouponCode%%` | "Please enter your coupon code." | -| `%%LNG_EnterGiftCertificateCode%%` | "Please enter your gift certificate code." | -| `%%LNG_EnterGiftCertificateValueBetween%%` | "Please enter an amount between the minimum and maximum gift certificate value." | -| `%%LNG_EnterOrderComments%%` | "Order Instructions/Comments (Optional)" | -| `%%LNG_EnterRequiredField%%` | "Please enter the required field(s)." | -| `%%LNG_EnterShippingAddress%%` | "Please type in an address." | -| `%%LNG_EnterShippingCity%%` | "Please type in your suburb/city." | -| `%%LNG_EnterShippingFirstName%%` | "Please type in your first name." | -| `%%LNG_EnterShippingLastName%%` | "Please type in your last name." | -| `%%LNG_EnterShippingPhone%%` | "Please enter your phone number." | -| `%%LNG_EnterShippingZip%%` | "Please type in your zip/postcode." | -| `%%LNG_EnterTheCodeBelow%%` | "Enter the code below:" | -| `%%LNG_EnterValidCertificateCode%%` | "Please enter a gift certificate code." | -| `%%LNG_EnterValidCertificateFromEmail%%` | "Please enter your email address." | -| `%%LNG_EnterValidCertificateFromName%%` | "Please enter your name." | -| `%%LNG_EnterValidCertificateToEmail%%` | "Please enter a valid email address for the person you wish to send this gift certificate to." | -| `%%LNG_EnterValidCertificateToName%%` | "Please enter the name of the person you wish to send this gift certificate to." | -| `%%LNG_EnterValidFromPrice%%` | "Please enter a valid \'from\' price containing numbers only." | -| `%%LNG_EnterValidGiftCertificateAmount%%` | "Please enter a valid amount for this gift certificate." | -| `%%LNG_EnterValidToPrice%%` | "Please enter a valid \'to\' price containing numbers only." | -| `%%LNG_EnterWishListName%%` | "Please enter a wishlist name." | -| `%%LNG_eSelectPlusDPCardHoldersName%%` | ”Cardholder's Name" | -| `%%LNG_eSelectPlusDPCreditCardCCV2%%` | ”Card Security Code" | -| `%%LNG_eSelectPlusDPCreditCardNo%%` | ”Credit Card Number" | -| `%%LNG_eSelectPlusDPCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | -| `%%LNG_eSelectPlusDPEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | -| `%%LNG_eSelectPlusDPEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | -| `%%LNG_eSelectPlusDPEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | -| `%%LNG_eSelectPlusDPEnterCVV2Number%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_eSelectPlusDPEnterName%%` | ”You forgot to enter the cardholder's name." | -| `%%LNG_eSelectPlusDPEnterPostcode%%` | ”You forgot to enter a zip/postcode." | -| `%%LNG_eSelectPlusDPEnterStreetName%%` | ”You forgot to enter your street name." | -| `%%LNG_eSelectPlusDPEnterStreetNumber%%` | ”You forgot to enter your street number." | -| `%%LNG_eSelectPlusDPExpirationDate%%` | ”Expiration Date" | -| `%%LNG_eSelectPlusDPPayForOrder%%` | ”Pay for Order" | -| `%%LNG_eSelectPlusDPPaymentIntro%%` | ”Please enter the following information as it appears on your credit card statement and then click the "Pay for Order" button to pay for your order." | -| `%%LNG_eSelectPlusDPProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_eSelectPlusDPStreetName%%` | ”Street Address" | -| `%%LNG_eSelectPlusDPTotalAmount%%` | ”Order Total" | -| `%%LNG_eSelectPlusDPZip%%` | ”Zip/Postcode" | -| `%%LNG_EWayCardCode%%` | ”CVV Code" | -| `%%LNG_EWayCardHoldersName%%` | ”Cardholder's Name" | -| `%%LNG_EWayCreditCardNo%%` | ”Credit Card Number" | -| `%%LNG_EWayCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | -| `%%LNG_EWayEnterCardCode%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_EWayEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | -| `%%LNG_EWayEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | -| `%%LNG_EWayEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | -| `%%LNG_EWayEnterName%%` | ”You forgot to enter the cardholder's name." | -| `%%LNG_EWayExpirationDate%%` | ”Expiration Date" | -| `%%LNG_EWayPayForOrder%%` | ”Pay for Order" | -| `%%LNG_EWayPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | -| `%%LNG_EWayProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_EWayTotalAmount%%` | ”Order Total" | -| `%%LNG_ExpressCheckoutCheckingOutAsGuest%%` | "Checking out as a guest" | -| `%%LNG_ExpressCheckoutChooseBilling%%` | "Please select the address you'd like to use as your billing address for this order." | -| `%%LNG_ExpressCheckoutChooseShipper%%` | "Please select the shipping method you'd like to use for your order." | -| `%%LNG_ExpressCheckoutChooseShipping%%` | "Please select the address you'd like to use as your shipping address for this order." | -| `%%LNG_ExpressCheckoutCreatingAnAccount%%` | "Creating an account" | -| `%%LNG_ExpressCheckoutFor%%` | "for" | -| `%%LNG_ExpressCheckoutLoadError%%` | "There was an error loading this step of the checkout. Please try again." | -| `%%LNG_ExpressCheckoutLoading%%` | "Loading..." | -| `%%LNG_ExpressCheckoutSelectShippingProvider%%` | "Please choose the shipping method for your order:" | -| `%%LNG_ExpressCheckoutStep%%` | "Step" | -| `%%LNG_ExpressCheckoutStepAccountDetails%%` | "Account Details" | -| `%%LNG_ExpressCheckoutStepBillingAccountDetails%%` | "Billing & Account Details" | -| `%%LNG_ExpressCheckoutStepBillingAddress%%` | "Billing Details" | -| `%%LNG_ExpressCheckoutStepOrderConfirmation%%` | "Order Confirmation" | -| `%%LNG_ExpressCheckoutStepPaymentDetails%%` | "Payment Details" | -| `%%LNG_ExpressCheckoutStepShippingAddress%%` | "Shipping Details" | -| `%%LNG_ExpressCheckoutStepShippingMethod%%` | "Shipping Method" | -| `%%LNG_FeaturedItems%%` | "Featured Items" | -| `%%LNG_FeaturedProduct%%` | "Featured Product" | -| `%%LNG_FeaturedProducts%%` | "Featured Products" | -| `%%LNG_FeaturedProductsFeed%%` | "Featured Products RSS Feed" | -| `%%LNG_FilterBy%%` | "Filter by" | -| `%%LNG_FindByCategory%%` | "Find Similar Products by Category" | -| `%%LNG_FindProductsByTag%%` | "Find Similar Products by Tag" | -| `%%LNG_FirstName%%` | "First Name" | -| `%%LNG_ForbiddenAccessPage%%` | "You Do Not Have Permission To Access This Page" | -| `%%LNG_ForgotPassword%%` | "Forgot Password" | -| `%%LNG_ForgotPasswordIntro%%` | "Fill in your email below to request a new password. An email will be sent to the address below containing a link to verify your email address." | -| `%%LNG_ForgotYourPassword%%` | "Forgot your password?" | -| `%%LNG_FreeShipping%%` | "Free Shipping" | -| `%%LNG_From%%` | "From" | -| `%%LNG_GetNewPasswordIntro%%` | "Your password should be at least 6 characters long and will be case sensitive." | -| `%%LNG_GiftCertificate%%` | "Gift Certificate" | -| `%%LNG_GiftCertificateAmount%%` | "Amount" | -| `%%LNG_GiftCertificateBalanceCode%%` | "Gift Certificate Code" | -| `%%LNG_GiftCertificateBalanceFor%%` | "Gift Certificate Balance for" | -| `%%LNG_GiftCertificateBalanceIntro%%` | "You can check the balance of a gift certificate by typing the code in to the box below." | -| `%%LNG_GiftCertificateCode%%` | "Redeem Gift Certificate" | -| `%%LNG_GiftCertificateCodeIntro%%` | "To pay for this order using a gift certificate, enter the gift certificate code in the box below and click 'Go'." | -| `%%LNG_GiftCertificateEmailAttached%%` | "Your gift certificate is attached to this email." | -| `%%LNG_GiftCertificateEmailedAfterPurchase%%` | "This gift certificate will be emailed to the recipient after your order has been paid for." | -| `%%LNG_GiftCertificateEmailInstructions%%` | "For instructions on how to redeem your gift certificate please <a href='%s/giftcertificates.php?action=redeem'>click here</a>." | -| `%%LNG_GiftCertificateEmailWarning%%` | "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable." | -| `%%LNG_GiftCertificateEmailYouHaveReceived%%` | "You have received a Gift Certificate for" | -| `%%LNG_GiftCertificateFrom%%` | "Your Name" | -| `%%LNG_GiftCertificateFromEmail%%` | "Your Email" | -| `%%LNG_GiftCertificateMessage%%` | "Your Message" | -| `%%LNG_GiftCertificateMessageTooLong%%` | "Please enter a shorter message for your gift certificate." | -| `%%LNG_GiftCertificateRemaining%%` | "remaining" | -| `%%LNG_GiftCertificates%%` | "Gift Certificates" | -| `%%LNG_GiftCertificateTerms2%%` | "I understand that gift certificates are non-refundable" | -| `%%LNG_GiftCertificateTheme%%` | "Gift Certificate Theme" | -| `%%LNG_GiftCertificateTo%%` | "Recipient's Name" | -| `%%LNG_GiftCertificateToEmail%%` | "Recipient's Email" | -| `%%LNG_GiftMessage%%` | "Gift Message" | -| `%%LNG_GiftWrapping%%` | "Gift Wrapping" | -| `%%LNG_GrandTotal%%` | "Grand Total" | -| `%%LNG_Handling%%` | "Handling" | -| `%%LNG_HC_address%%` | ”Address" | -| `%%LNG_HC_allbrands%%` | ”View all brands" | -| `%%LNG_HC_allprices%%` | ”All prices are in" | -| `%%LNG_HC_billingaddress%%` | ”Billing Address" | -| `%%LNG_HC_brands%%` | ”Brands" | -| `%%LNG_HC_calluson%%` | ”Call us on" | -| `%%LNG_HC_categories%%` | ”Categories" | -| `%%LNG_HC_chooseproduct%%` | ”choose another product" | -| `%%LNG_HC_clicktochangebilling%%` | ”Click Here to Change Billing Details if Required" | -| `%%LNG_HC_continuetostore%%` | ”Continue to our store" | -| `%%LNG_HC_customerviewed%%` | ”Customers also viewed" | -| `%%LNG_HC_date%%` | ”Date" | -| `%%LNG_HC_downloadedfileexpired%%` | ”This file can no longer be downloaded as it has expired." | -| `%%LNG_HC_email%%` | ”Email" | -| `%%LNG_HC_emailbigcommerce%%` | ”with BigCommerce" | -| `%%LNG_HC_emaillaunchstore%%` | ”Launch your own store for free" | -| `%%LNG_HC_emailpowered%%` | ”is powered by BigCommerce" | -| `%%LNG_HC_existingcustomer%%` | ”Existing Customer" | -| `%%LNG_HC_giftcertificatecode%%` | ”Gift certificate code" | -| `%%LNG_HC_giftcertificatecoupon%%` | ”Gift Certificate or Coupon Code" | -| `%%LNG_HC_modify%%` | ”Modify" | -| `%%LNG_HC_name%%` | ”Name" | -| `%%LNG_HC_nomarketingmails%%` | ”You will no longer receive marketing emails from" | -| `%%LNG_HC_ok%%` | ”OK" | -| `%%LNG_HC_or%%` | ”or" | -| `%%LNG_HC_order%%` | ”Order" | -| `%%LNG_HC_orderconfirmation%%` | ”Order Confirmation" | -| `%%LNG_HC_outofstock%%` | ”Out of Stock" | -| `%%LNG_HC_payfororder%%` | ”Pay for your order" | -| `%%LNG_HC_phone%%` | ”Phone" | -| `%%LNG_HC_proceedcheckout%%` | ”Proceed To Checkout" | -| `%%LNG_HC_productreviews%%` | ”Product Reviews" | -| `%%LNG_HC_quantity%%` | ”Quantity" | -| `%%LNG_HC_returnitem%%` | ”Return Item(s)" | -| `%%LNG_HC_returnstore%%` | ”Return to store" | -| `%%LNG_HC_rrp%%` | ”RRP" | -| `%%LNG_HC_searchresults%%` | HC_searchresults ”Search Results" | -| `%%LNG_HC_securityquestion%%` | ”Security Question" | -| `%%LNG_HC_sharediffproduct%%` | ”To share a different product, just select it from those shown below." | -| `%%LNG_HC_sharethis%%` | ”Share This" | -| `%%LNG_HC_shippingaddress%%` | ”Shipping Address" | -| `%%LNG_HC_shippingmethod%%` | ”Shipping Method" | -| `%%LNG_HC_shopnow%%` | ”SHOP NOW" | -| `%%LNG_HC_signin%%` | ”Sign In" | -| `%%LNG_HC_signinorcreate%%` | ”Sign in or Create Account" | -| `%%LNG_HC_signupnewsletter%%` | ”Sign up for our newsletter" | -| `%%LNG_HC_Submit%%` | "Submit" | -| `%%LNG_HC_total%%` | ”Total" | -| `%%LNG_HC_unsubscribe%%` | ”Unsubscribe from" | -| `%%LNG_HC_voucherredemptioncode%%` | ”Voucher redemption code" | -| `%%LNG_HC_writereview%%` | ”Write Review" | -| `%%LNG_HCT_delete%%` | ”Delete" | -| `%%LNG_HCT_edit%%` | ”Edit" | -| `%%LNG_HCV_addshoppingbag%%` | ”Add to shopping bag" | -| `%%LNG_HCV_apply%%` | ”Apply" | -| `%%LNG_HCV_clearform%%` | ”Clear Form" | -| `%%LNG_HCV_go%%` | ”Go" | -| `%%LNG_HearFromUsViaEmail%%` | "Hear From Us Via Email?" | -| `%%LNG_HeresHowToPayForYourOrder%%` | ”Your order was sent to us but requires payment before it can be completed." | -| `%%LNG_HeresHowtoPayforYourOrderThanks%%` | ”Here's How To Pay For Your Order" | -| `%%LNG_HeresHowtoPayforYourOrderUC%%` | "Here's How to Pay for Your Order..." | -| `%%LNG_Hi%%` | "Hi" | -| `%%LNG_HideSearchForm%%` | "Hide Search Form" | -| `%%LNG_Home%%` | "Home" | -| `%%LNG_HowRateProduct%%` | "How do you rate this product?" | -| `%%LNG_HowWouldYouLikeToPay%%` | "How Would You Like to Pay?" | -| `%%LNG_IdealBank%%` | "Bank" | -| `%%LNG_IdealIssuerNotSelected%%` | "Please select your issuer to continue" | -| `%%LNG_IdealPaymentIntro%%` | "Select your bank below and click the "Continue" button to proceed with payment." | -| `%%LNG_IdealProcessingError%%` | "Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_Image%%` | "Image" | -| `%%LNG_Inbox%%` | "Inbox" | -| `%%LNG_InstructionsForPaymentBelow%%` | "Instructions to pay for your order are shown below:" | -| `%%LNG_InvalidFileTypeJS%%` | "The file type of the file you are trying to upload is not allowed for this field." | -| `%%LNG_InvalidQuantity%%` | "Please enter a valid product quantity." | -| `%%LNG_InvoiceNumber%%` | "Hi" | -| `%%LNG_InvoicePendingPaymentText%%` | "Your order requires payment before it can be finalized. Details on how to pay are shown below." | -| `%%LNG_IPreferThisEmailFormat%%` | "I prefer to receive emails in this format:" | -| `%%LNG_ISOCode%%` | "ISO Code" | -| `%%LNG_IssuerConfirmation%%` | "Issuer Confirmation" | -| `%%LNG_IssuerName%%` | "Issuer Name" | -| `%%LNG_Item%%` | "Item" | -| `%%LNG_ItemDetails%%` | "Item Details" | -| `%%LNG_ItemPrice%%` | "Item Price" | -| `%%LNG_Items%%` | "Items" | -| `%%LNG_ItemsShippedTo%%` | "Items shipped to" | -| `%%LNG_ItemTotal%%` | "Item Total" | -| `%%LNG_JS_BillToThisAddress%%` | | -| `%%LNG_JS_Description%%` | | -| `%%LNG_JS_OtherDetails%%` | | -| `%%LNG_JS_OtherProducts%%` | | -| `%%LNG_JS_ProductVideos%%` | | -| `%%LNG_JS_Reviews%%` | | -| `%%LNG_JS_SimilarProducts%%` | | -| `%%LNG_JS_SimilarProductsByCustomerViews%%` | | -| `%%LNG_JS_Tags%%` | | -| `%%LNG_JS_Warranty%%` | | -| `%%LNG_JustSentAnEmailConfirmation%%` | "We've just sent you an email confirming your order." | -| `%%LNG_LastName%%` | "Last Name" | -| `%%LNG_LoadingPleaseWait%%` | "Loading... Please wait..." | -| `%%LNG_Login%%` | "Sign in" | -| `%%LNG_LoginEnterPassword%%` | "Please type in your password." | -| `%%LNG_LoginEnterValidEmail%%` | "Please type in a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>" | -| `%%LNG_LoginWord%%` | "Sign In" | -| `%%LNG_LowInventoryWarningAdjust%%` | "Click here to adjust the inventory level for this product." | -| `%%LNG_LowInventoryWarningAll%%` | "Click here to view all products with a low inventory level." | -| `%%LNG_ManageYourAccount%%` | "Manage Your Account" | -| `%%LNG_MerchantName%%` | "Merchant Name" | -| `%%LNG_MerchantURL%%` | "Merchant URL" | -| `%%LNG_MessageContent%%` | "Message" | -| `%%LNG_MessageEmailText1%%` | "has sent you a message about your order." | -| `%%LNG_MessageEmailText2%%` | "To view the message and reply, follow the link below:" | -| `%%LNG_MessageEnterContent%%` | "Please enter a message." | -| `%%LNG_MessageEnterSubject%%` | "Please enter a subject." | -| `%%LNG_MessageOrder%%` | "Order" | -| `%%LNG_MessageSaid%%` | "Said" | -| `%%LNG_MessageSendError%%` | "Something went wrong when trying to send your message. Please try again." | -| `%%LNG_MessageSendSuccess%%` | "Your message was sent and you will receive a response via email shortly." | -| `%%LNG_MessageSubject%%` | "Subject" | -| `%%LNG_MobileSite%%` | "Mobile Site" | -| `%%LNG_NewCustomerIntro1%%` | "If this is your first purchase from" | -| `%%LNG_NewCustomerIntro2%%` | "please click the "Continue." button to get started." | -| `%%LNG_NewestItems%%` | "Newest Items" | -| `%%LNG_NewProducts%%` | "New Products" | -| `%%LNG_NewProductsFeed%%` | "New Products RSS Feed" | -| `%%LNG_NewsletterEnterEmail%%` | "You forgot to type in your email address." | -| `%%LNG_NewsletterEnterFirstName%%` | "You forgot to type in your first name." | -| `%%LNG_NewsletterEnterValidEmail%%` | "Please enter a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>." | -| `%%LNG_NewsletterSpecialOffersText%%` | "I'd like to receive special offers" | -| `%%LNG_NewsletterSubscription%%` | "Newsletter Subscription" | -| `%%LNG_Next%%` | "Next" | -| `%%LNG_NextImage%%` | "Next" | -| `%%LNG_NMICardHoldersName%%` | "Cardholder's Name" | -| `%%LNG_NMICreditCardCCV2%%` | ”CVV Code" | -| `%%LNG_NMICreditCardNo%%` | ”Credit Card Number" | -| `%%LNG_NMICreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | -| `%%LNG_NMIExpirationDate%%` | ”Expiration Date" | -| `%%LNG_NMIPayForOrder%%` | ”Pay for Order" | -| `%%LNG_NMIPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | -| `%%LNG_NMIProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_NMITotalAmount%%` | ”Order Total" | -| `%%LNG_NoCaptcha%%` | "Please enter the code shown." | -| `%%LNG_NoItemsInCart%%` | "There are no products in your cart." | -| `%%LNG_NoPermissionToAccessThisPage%%` | "You don't have the necessary permissions to view this page." | -| `%%LNG_NoPreference%%` | "No Preference" | -| `%%LNG_NoProductsInCategory%%` | "There are no products in this category." | -| `%%LNG_NotAnExistingCustomer%%` | "I'm A New Customer" | -| `%%LNG_NotFound%%` | "Not Found" | -| `%%LNG_NotFoundError%%` | "The page you were looking for appears to have been moved, deleted or does not exist." | -| `%%LNG_NotFoundReason1%%` | "An outdated link on another site" | -| `%%LNG_NotFoundReason2%%` | "A typo in the address / URL" | -| `%%LNG_NotFoundReasonTitle%%` | "This is most likely due to:" | -| `%%LNG_NotificationAReturnSummaryIsShownBelow%%` | "A summary of your return is shown below. To view the status of this return" | -| `%%LNG_NotificationClickHereViewReturn%%` | "View details for return #" | -| `%%LNG_NotificationConfirmationForReturn%%` | "Confirmation for Return Request for Order ID" | -| `%%LNG_NotificationCustomerDetails%%` | "Customer Details" | -| `%%LNG_NotificationNewReturnRequest%%` | "New Return Request for Order ID" | -| `%%LNG_NotificationReturnRequestSubmitted%%` | "A new return request has been submitted on" | -| `%%LNG_NotificationTheReturnContainsTheFollowingItems%%` | "The Return Request Contains the Following Items..." | -| `%%LNG_NotificationYourReturnContainsTheFollowingItems%%` | "Your Return Request Contains the Following Items..." | -| `%%LNG_Of%%` | "of" | -| `%%LNG_OnlyFeaturedProducts%%` | "Only Featured Products" | -| `%%LNG_OnlyFreeShipping%%` | "Only Free Shipping" | -| `%%LNG_OnlyNonFeaturedProducts%%` | "Only Non-Featured Products" | -| `%%LNG_OnlyPaidShipping%%` | "Only Paid Shipping" | -| `%%LNG_OnThe%%` | "on the" | -| `%%LNG_Oops%%` | "Oops..." | -| `%%LNG_Optional%%` | "Optional" | -| `%%LNG_Or%%` | "or" | -| `%%LNG_Order%%` | "Order" | -| `%%LNG_OrderAwaitingPayment%%` | "Your order was sent to us but is currently awaiting payment. Once we receive the payment for your order, it will be completed. If you've already provided payment details then we will process your order manually and send you an email when it's completed." | -| `%%LNG_OrderComments%%` | "Order Instructions/Comments" | -| `%%LNG_OrderDate%%` | "Order Date" | -| `%%LNG_OrderDetails%%` | "Order Details" | -| `%%LNG_OrderDownloads%%` | "Files" | -| `%%LNG_OrderedItemRemovedFromStore%%` | "That item was removed from our store and is no longer available for order." | -| `%%LNG_OrderId%%` | "Order #%s" | -| `%%LNG_OrderIdHash%%` | "Order #" | -| `%%LNG_OrderItems%%` | "Order Items" | -| `%%LNG_OrderStatus%%` | "Order Status" | -| `%%LNG_OrderStatusChanged%%` | "Order Status Changed" | -| `%%LNG_OrderStatusChangedDatePlaced%%` | "Date Placed" | -| `%%LNG_OrderStatusChangedIntro%%` | "An order you recently placed on our website has had its status changed." | -| `%%LNG_OrderStatusChangedOrderTotal%%` | "Order Total" | -| `%%LNG_OrderStatusChangedPaymentMethod%%` | "Payment Method" | -| `%%LNG_OrderSubtotal%%` | "Order Subtotal" | -| `%%LNG_OrderTotal%%` | "Order Total" | -| `%%LNG_OrderTrackingNoIs%%` | "The tracking number for this order is" | -| `%%LNG_Other%%` | "Other" | -| `%%LNG_OtherDetails%%` | "Other Details" | -| `%%LNG_Outstanding%%` | "outstanding" | -| `%%LNG_OutstandingOrderTotal%%` | "Your outstanding order total:" | -| `%%LNG_Password%%` | "Password" | -| `%%LNG_PasswordConfirm%%` | "Confirm Password" | -| `%%LNG_PayflowProCardHoldersName%%` | "Cardholder's Name" | -| `%%LNG_PayflowProCreditCardCCV2%%` | "Card Security Code" | -| `%%LNG_PayflowProCreditCardNo%%` | "Credit Card Number" | -| `%%LNG_PayflowProCreditCardNoHelp%%` | "Numbers only, no spaces or dashes." | -| `%%LNG_PayflowProEnterCardNumber%%` | "Please enter the card number only, no spaces or dashes." | -| `%%LNG_PayflowProEnterCreditCardMonth%%` | "You forgot to choose an expiry month." | -| `%%LNG_PayflowProEnterCreditCardYear%%` | "You forgot to choose an expiry year." | -| `%%LNG_PayflowProEnterCVV2Number%%` | "Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | -| `%%LNG_PayflowProEnterName%%` | "You forgot to enter the cardholder's name." | -| `%%LNG_PayflowProExpirationDate%%` | "Expiration Date" | -| `%%LNG_PayflowProPayForOrder%%` | "Pay for Order" | -| `%%LNG_PayflowProPaymentIntro%%` | "Complete the form below and then click the "Pay for Order" button to pay for your order." | -| `%%LNG_PayflowProProcessingError%%` | "Something went wrong when trying to process your payment. Please review the error message and try again:" | -| `%%LNG_PayflowProTotalAmount%%` | "Order Total" | -| `%%LNG_PayForYourOrderHelp%%` | "Once you've provided payment, your order will be completed." | -| `%%LNG_PayForYourOrderHelp%%` | "Once you've provided payment your order will be completed." | -| `%%LNG_PaymentMethod%%` | "Payment Method" | -| `%%LNG_PersonalDetails%%` | "Personal Details" | -| `%%LNG_Phone%%` | "Phone" | -| `%%LNG_PhoneNumber%%` | "Phone Number" | -| `%%LNG_PleaseAgreeGiftCertificateTerms%%` | "Please agree to the gift certificate terms." | -| `%%LNG_PleaseChooseAPaymentMethod%%` | "Please choose a payment method." | -| `%%LNG_PleaseChooseShippingProvider%%` | "Please choose a shipping method." | -| `%%LNG_PleaseSelectAProduct%%` | | -| `%%LNG_PopularProducts%%` | "Popular Products" | -| `%%LNG_PopularProductsFeed%%` | "Popular Products RSS Feed" | -| `%%LNG_PostedBy%%` | "Posted by" | -| `%%LNG_PostedOn%%` | "Posted on" | -| `%%LNG_PrepositionOn%%` | "on" | -| `%%LNG_Preview%%` | "Preview" | -| `%%LNG_Previous%%` | "Previous" | -| `%%LNG_PreviousImage%%` | "Previous" | -| `%%LNG_PreviousPage%%` | "Previous Page" | -| `%%LNG_Price%%` | "Price" | -| `%%LNG_PriceAsc%%` | "Price: Low to High" | -| `%%LNG_PriceDesc%%` | "Price: High to Low" | -| `%%LNG_PriceRange%%` | "Price Range" | -| `%%LNG_ProceedToPayment%%` | "Proceed to Payment" | -| `%%LNG_ProceedToPaymentContinue%%` | "Continue" | -| `%%LNG_ProdBin%%` | | -| `%%LNG_ProdName%%` | "Product Name" | -| `%%LNG_Product%%` | "Product" | -| `%%LNG_ProductAddToCartLink%%` | "Add To Cart" | -| `%%LNG_ProductChooseOptionLink%%` | "Choose Options" | -| `%%LNG_ProductComparison%%` | "Product Comparison" | -| `%%LNG_ProductComparisonIntro%%` | "Your product comparison is shown below. Click a product attribute in the left column to sort by that attribute." | -| `%%LNG_ProductDescription%%` | "Product Description" | -| `%%LNG_ProductDetails%%` | "Product Details" | -| `%%LNG_ProductMaxQty%%` | | -| `%%LNG_ProductMinQty%%` | | -| `%%LNG_ProductPreOrderCartLink%%` | "Pre-Order Now" | -| `%%LNG_ProductReviewEmailHeading%%` | | -| `%%LNG_ProductReviewEmailInstructions%%` | | -| `%%LNG_ProductReviewEmailSubheading%%` | | -| `%%LNG_ProductReviewEmailThanks%%` | | -| `%%LNG_ProductReviewEmailUnsubscribe%%` | | -| `%%LNG_ProductReviewEmailUnsubscribeSuffix%%` | | -| `%%LNG_ProductReviewLinkText%%` | | -| `%%LNG_Products%%` | "Products" | -| `%%LNG_ProductsByCategory%%` | "Categories" | -| `%%LNG_ProductTagCloud%%` | "Browse by Tag" | -| `%%LNG_ProductTagCloudIntro%%` | "The product tag cloud shows the different tags (keywords) associated with products. The bigger the tag appears, the more products it contains. Click on a tag to see all products listed under that tag." | -| `%%LNG_ProductVideos%%` | "Product Videos" | -| `%%LNG_ProductWarranty%%` | "Warranty Information" | -| `%%LNG_PublishedBy%%` | "Posted by" | -| `%%LNG_PurchaseGiftCertificate%%` | "Purchase a Gift Certificate" | -| `%%LNG_PurchaseGiftCertificates%%` | | -| `%%LNG_Qty%%` | | -| `%%LNG_Quantity%%` | "Quantity" | -| `%%LNG_QuantityFull%%` | "Quantity" | -| `%%LNG_QuestionMark%%` | "?" | -| `%%LNG_QuickViewBulkDiscountsLabel%%` | "Bulk Discounts" | -| `%%LNG_QuickViewViewDetailsText%%` | "View Details" | -| `%%LNG_Rate1Star%%` | "1 star (worst)" | -| `%%LNG_Rate2Stars%%` | "2 stars" | -| `%%LNG_Rate3Stars%%` | "3 stars (average)" | -| `%%LNG_Rate4Stars%%` | "4 stars" | -| `%%LNG_Rate5Stars%%` | "5 stars (best)" | -| `%%LNG_Rating%%` | "Rating" | -| `%%LNG_ReadMoreLink%%` | "Read More »" | -| `%%LNG_ReadReviews%%` | "Read Reviews" | -| `%%LNG_RecentBlogsFeed%%` | "Recent News RSS Feed" | -| `%%LNG_RecentlySubmittedReturnRequest%%` | | -| `%%LNG_RecentlyViewedItems%%` | "Your Recent Items" | -| `%%LNG_RecentlyViewedItemsDescription%%` | "See a list of items you've recently viewed at %s." | -| `%%LNG_RecentNews%%` | "Recent Updates" | -| `%%LNG_RecentPosts%%` | "Recent Posts" | -| `%%LNG_RedeemAGiftCertificate%%` | "Redeem a Gift Certificate" | -| `%%LNG_RedeemGiftCertificate%%` | "Redeem a Gift Certificate" | -| `%%LNG_RedeemGiftCertificate1%%` | "You need your unique gift certificate code, which is part of the gift certificate that was emailed to you as an attachment. It will look something like Z50-Y6K-COS-402." | -| `%%LNG_RedeemGiftCertificate2%%` | "Browse the store and add items to your cart as you normally would." | -| `%%LNG_RedeemGiftCertificate3%%` | "Click the '<a href='cart.php'>View Cart</a>' link to view the contents of your shopping cart." | -| `%%LNG_RedeemGiftCertificate4%%` | "Type your gift certificate code in to the 'Redeem Gift Certificate' box and click 'Go'." | -| `%%LNG_RedeemGiftCertificateAt%%` | "Redeem your gift certificate at" | -| `%%LNG_RedeemGiftCertificateIntro%%` | "To redeem a gift certificate at %s, follow the simple steps below." | -| `%%LNG_ReferenceNumber%%` | | -| `%%LNG_RegisterAnAccount%%` | "Register an account" | -| `%%LNG_RelatedProducts%%` | "Related Products" | -| `%%LNG_RelatedSearches%%` | "Related Searches" | -| `%%LNG_RemainingStoreCredit%%` | "Remaining store credit:" | -| `%%LNG_Remove%%` | "Remove" | -| `%%LNG_RemoveFromWishList%%` | "Remove Item" | -| `%%LNG_Reorder%%` | "Reorder" | -| `%%LNG_ReplyToYourOrderMessage%%` | | -| `%%LNG_ResponseCode%%` | | -| `%%LNG_ResponseMessage%%` | | -| `%%LNG_Return%%` | "Return" | -| `%%LNG_ReturnAction%%` | "Return Action" | -| `%%LNG_ReturnComments%%` | "Comments" | -| `%%LNG_ReturnedItem%%` | "Returned Item" | -| `%%LNG_ReturnInstructions%%` | "Return Instructions" | -| `%%LNG_ReturnItems%%` | "Return Items" | -| `%%LNG_ReturnOrderItems%%` | "Return Item(s)" | -| `%%LNG_ReturnQty%%` | "Qty. to Return" | -| `%%LNG_ReturnReason%%` | "Return Reason" | -| `%%LNG_ReturnRequests%%` | "Return Requests" | -| `%%LNG_ReturnRequestsDescription%%` | "View any outstanding return requests you've made for products you ordered from %s." | -| `%%LNG_ReturnRequestSubmitted%%` | "Your return request has been submitted successfully." | -| `%%LNG_ReturnStatusChangedTo%%` | | -| `%%LNG_ReturnSubmittedInfo%%` | "Your return request was submitted to %s for processing. When it has been processed you will receive an email with more details." | -| `%%LNG_ReturnToHomepage%%` | "Return to the home page" | -| `%%LNG_ReviewEmailHint%%` | "We promise to never spam you, and just use your email address to identify you as a valid customer." | -| `%%LNG_ReviewEnterYourEmail%%` | "Your email:" | -| `%%LNG_ReviewEnterYourName%%` | "Enter your name: (optional)" | -| `%%LNG_ReviewNoEmail%%` | "Please enter your email address." | -| `%%LNG_ReviewNoRating%%` | "Please select a rating." | -| `%%LNG_ReviewNoText%%` | "Please enter some text for your review." | -| `%%LNG_ReviewNoTitle%%` | "Please enter a title for your review." | -| `%%LNG_ReviewTheContentsOfYourOrder%%` | "Please review the contents of your order below and then choose how you'd like to pay for your order." | -| `%%LNG_SaleProducts%%` | "Products On Sale" | -| `%%LNG_Save%%` | "Save" | -| `%%LNG_SaveAddress%%` | "Save Address" | -| `%%LNG_SaveAddressInAddressBook%%` | "Save this address in my address book" | -| `%%LNG_SaveMyReview%%` | "Save My Review" | -| `%%LNG_SaveWishList%%` | "Save Wish List" | -| `%%LNG_Search%%` | "Search" | -| `%%LNG_SearchByPrice%%` | "Search by Price" | -| `%%LNG_SearchBySetting%%` | "Search by Setting" | -| `%%LNG_SearchDidNotMatchContent%%` | "did not match any news or information." | -| `%%LNG_SearchDidNotMatchProduct%%` | "did not match any products." | -| `%%LNG_SearchedForBrands%%` | "Did you mean to browse one of the following brands instead?" | -| `%%LNG_SearchedForCategories%%` | "Did you mean to browse one of the following categories instead?" | -| `%%LNG_SearchExamples%%` | "Examples:" | -| `%%LNG_SearchFeed%%` | "View Results as RSS Feed" | -| `%%LNG_SearchFilters%%` | "Search Filters" | -| `%%LNG_SearchFilters1%%` | "Search filters allow you to specify custom conditions in your search terms. It's similar to performing an advanced search however you do not have to visit the advanced search page first." | -| `%%LNG_SearchFilters2%%` | "Search filters should be appended to the end of your search terms. Multiple search filters can be separated by a space." | -| `%%LNG_SearchFilters3%%` | "Supported search filters are listed below." | -| `%%LNG_SearchFiltersFeatured%%` | "Return featured products only." | -| `%%LNG_SearchFiltersFreeShipping%%` | "Return products with free shipping." | -| `%%LNG_SearchFiltersInStock%%` | "Return products that are currently in stock." | -| `%%LNG_SearchFiltersPrice%%` | "Allows search results to be filtered by price." | -| `%%LNG_SearchFiltersRating%%` | "Allows search results to be filtered by rating." | -| `%%LNG_SearchKeyword%%` | "Search Keyword" | -| `%%LNG_SearchResultsTabContent%%` | "News & Information" | -| `%%LNG_SearchResultsTabProduct%%` | "Products" | -| `%%LNG_SearchSuggestion1%%` | "Make sure all words are spelled correctly." | -| `%%LNG_SearchSuggestion2%%` | "Try different keywords." | -| `%%LNG_SearchSuggestion3%%` | "Try more general keywords." | -| `%%LNG_SearchSuggestions%%` | "Suggestions" | -| `%%LNG_SearchTips%%` | "Search Tips" | -| `%%LNG_SearchTypeNewsItem%%` | "News Item" | -| `%%LNG_SearchTypeWebPage%%` | "Web Page" | -| `%%LNG_SearchYourSearch%%` | " Your search for" | -| `%%LNG_SecureCheckout%%` | "Secure Checkout" | -| `%%LNG_SeeAllBrands%%` | "See all brands" | -| `%%LNG_SelectAWishListToDelete%%` | "Please choose at least one wish list to delete." | -| `%%LNG_SelectItemsToReorder%%` | "Please select one or more items to reorder." | -| `%%LNG_SelectItemsToReturn%%` | "Which items do you want to return?" | -| `%%LNG_SelectOneMoreItemsReturn%%` | "Please select one or more items to return." | -| `%%LNG_SelectReturnReason%%` | "Please enter the reason you are returning these item(s)." | -| `%%LNG_SelectValidGiftCertificateAmount%%` | "Please choose a valid amount for this gift certificate." | -| `%%LNG_SelectValidGiftCertificateTheme%%` | "Please select a theme for your gift certificate." | -| `%%LNG_SendAMessage%%` | "Send a Message" | -| `%%LNG_SendForm%%` | "Send Form" | -| `%%LNG_SendMessage%%` | "Send Message" | -| `%%LNG_Shared%%` | "Shared" | -| `%%LNG_ShipAllItemsToDifferentAddresses%%` | "Ship items to different addresses" | -| `%%LNG_ShipAllItemsToOneAddress%%` | "Ship all items to the same address" | -| `%%LNG_ShipmentOrderDate%%` | | -| `%%LNG_ShipmentTrackingNumbersLinks%%` | | -| `%%LNG_ShippedItems%%` | | -| `%%LNG_ShippedTo%%` | "Shipped to" | -| `%%LNG_Shipping%%` | "Shipping" | -| `%%LNG_ShippingAddress%%` | "Shipping Address" | -| `%%LNG_ShippingDetails%%` | "Shipping Details" | -| `%%LNG_ShippingMethod%%` | "Shipping Method" | -| `%%LNG_ShippingMethodCombined%%` | "Multiple Shipping Methods" | -| `%%LNG_ShippingProvider%%` | "Choose a Shipping Method" | -| `%%LNG_ShipTo%%` | "Shipping Details" | -| `%%LNG_ShipToTheseAddresses%%` | "Ship to These Addresses" | -| `%%LNG_ShipToThisAddress%%` | "Ship to this address" | -| `%%LNG_ShopByPrice%%` | "Shop by Price" | -| `%%LNG_ShowingReviews%%` | "Showing reviews" | -| `%%LNG_ShowSearchForm%%` | "Show Search Form" | -| `%%LNG_SideCartTotalCost%%` | "Your sub total is <b>%s</b>." | -| `%%LNG_Sitemap%%` | "Sitemap" | -| `%%LNG_SitemapIntroduction%%` | "A sitemap lists all pages available on a website. The sitemap for web pages on `%%GLOBAL_StoreName%%` is shown below:" | -| `%%LNG_SitemapSeeAll%%` | "See All" | -| `%%LNG_Size%%` | "Maximum Size" | -| `%%LNG_SKU%%` | "SKU" | -| `%%LNG_SomethingWentWrong%%` | "Something Went Wrong..." | -| `%%LNG_SortBy%%` | "Sort by" | -| `%%LNG_SortByProductBrand%%` | "Sort products by brand" | -| `%%LNG_SortByProductName%%` | "Sort products by name" | -| `%%LNG_SortByProductPrice%%` | "Sort products by price" | -| `%%LNG_SortByProductRating%%` | "Sort products by average rating" | -| `%%LNG_StateProvince%%` | "State/Province" | -| `%%LNG_StatusOfReturnChanged%%` | | -| `%%LNG_StoreCredit%%` | "Store Credit" | -| `%%LNG_StoreCreditBalance%%` | "Your store credit balance:" | -| `%%LNG_SubmitNewReturn%%` | "Return Item(s) from Order #%s" | -| `%%LNG_SubmitReturn%%` | "Submit Return Request" | -| `%%LNG_Subtotal%%` | "Subtotal" | -| `%%LNG_SuggestiveCartIntro%%` | "We found some products that you might also be interested in." | -| `%%LNG_Summary%%` | "Summary" | -| `%%LNG_SyndicateFeaturedProducts%%` | "Featured Products" | -| `%%LNG_SyndicateFeaturedProductsAtom%%` | "Latest %s Featured Products (Atom)" | -| `%%LNG_SyndicateFeaturedProductsIntro%%` | "The featured products feed contains the latest %s featured products." | -| `%%LNG_SyndicateFeaturedProductsRSS%%` | "Latest %s Featured Products (RSS)" | -| `%%LNG_SyndicateIntro%%` | "RSS feeds are used for syndicating regularly changing content on a web site, including this one. You can open an RSS feed using an [RSS reader](https://en.wikipedia.org/wiki/RSS) and use it to see if there is any new content on this site or you can set up a server-side script to parse the feed and display it on your web site." | -| `%%LNG_SyndicateNewProducts%%` | "New Products" | -| `%%LNG_SyndicateNewProductsAtom%%` | "Latest %s New Products (Atom)" | -| `%%LNG_SyndicateNewProductsIntro%%` | "The latest products feed contains the latest %s products added to %s." | -| `%%LNG_SyndicateNewProductsRSS%%` | "Latest %s New Products (RSS)" | -| `%%LNG_SyndicateNews%%` | "Recent News" | -| `%%LNG_SyndicateNewsAtom%%` | "Latest %s News items (Atom)" | -| `%%LNG_SyndicateNewsIntro%%` | "The recent news feed contains the latest %s news items published on %s." | -| `%%LNG_SyndicateNewsRSS%%` | "Latest %s New Products (RSS)" | -| `%%LNG_SyndicatePopularProducts%%` | "Popular Products" | -| `%%LNG_SyndicatePopularProductsAtom%%` | "Latest %s Popular Products (Atom)" | -| `%%LNG_SyndicatePopularProductsIntro%%` | "The popular products feed contains the top %s most popular products on %s as rated by users." | -| `%%LNG_SyndicatePopularProductsRSS%%` | "Latest %s Popular Products (RSS)" | -| `%%LNG_SyndicateSearches%%` | "Product Searches" | -| `%%LNG_SyndicateSearchesIntro%%` | "Product search feeds allow you to save your custom product searches as syndication feed that will always update when there are new results." | -| `%%LNG_SyndicateSearchesIntro2%%` | "To create a product search feed, perform a standard search on %s and at the bottom of the page click on one of the syndication options." | -| `%%LNG_TermsAndConditions%%` | "Terms And Conditions" | -| `%%LNG_ThanksForRegisteringAt%%` | | -| `%%LNG_ThanksForRegisteringAtIntro%%` | | -| `%%LNG_ThanksForRegisteringEmailHelp%%` | | -| `%%LNG_ThanksForRegisteringEmailLogin%%` | | -| `%%LNG_ThanksForRegisteringEmailLogin%%` | | -| `%%LNG_ThanksForYourOrder%%` | | -| `%%LNG_ThisIsAnAutomatedMessage%%` | "*** This is an automated message, please do not reply ***" | -| `%%LNG_ThisOrderIsMarkedAs%%` | "This order is marked as" | -| `%%LNG_TickArgeeTermsAndConditions%%` | "Please agree to the terms and conditions by ticking the check box to place your order." | -| `%%LNG_To%%` | "to" | -| `%%LNG_Total%%` | "Total" | -| `%%LNG_ToYourWishList%%` | "to your wish list." | -| `%%LNG_TrackingLink%%` | "Tracking Link" | -| `%%LNG_TrackingNumber%%` | | -| `%%LNG_TransactionType%%` | | -| `%%LNG_TryAgain%%` | "Try again." | -| `%%LNG_Type%%` | "Type" | -| `%%LNG_units%%` | | -| `%%LNG_Update%%` | "Update" | -| `%%LNG_UpdateMyDetails%%` | "Update My Details" | -| `%%LNG_UpdateShippingCost%%` | "Update Shipping Cost" | -| `%%LNG_ValutecNumber%%` | | -| `%%LNG_VariationSoldOutMessage%%` | "The selected product combination is currently unavailable." | -| `%%LNG_ViewCart%%` | "View Cart" | -| `%%LNG_ViewEditCart%%` | "View or edit your cart" | -| `%%LNG_ViewMessages%%` | "View Messages" | -| `%%LNG_ViewMessagesDescription%%` | "You can receive and send messages to %s about your order. When a message is sent regarding one of your orders, you will receive an email notification." | -| `%%LNG_ViewOrder%%` | "View Order Details" | -| `%%LNG_ViewOrderStatusDescription%%` | "See the status of every order you've placed at %s, including whether it has been shipped, and if so an optional tracking number." | -| `%%LNG_ViewYourOrderStatus%%` | "View Order Status" | -| `%%LNG_Weight%%` | "Weight" | -| `%%LNG_WhatsThis%%` | "What's This?" | -| `%%LNG_WhyReturningItems%%` | "Why are you returning these items?" | -| `%%LNG_WishListCancel%%` | "Are you sure you want to cancel? Any unsaved changes will be lost." | -| `%%LNG_WishListDelete%%` | "Delete Selected" | -| `%%LNG_WishListName%%` | "Wish List Name" | -| `%%LNG_WishLists%%` | "Wish Lists" | -| `%%LNG_WishListsDescription%%` | "See a list of items in your wish list and optionally add each item to your shopping cart for purchase." | -| `%%LNG_WouldLikeToReceiveNewsletter%%` | "I'd like to receive your newsletter" | -| `%%LNG_WrapItemsDifferently%%` | "I'd like to gift wrap each item separately" | -| `%%LNG_WrapItemsTheSame%%` | "I'd like to wrap each of this item using the same wrapping options" | -| `%%LNG_WriteAHeadline%%` | "Write a headline for your review here:" | -| `%%LNG_WriteYourOwnReview%%` | "Write Your Own Review" | -| `%%LNG_WriteYourReview%%` | "Write your review here:" | -| `%%LNG_xOn%%` | "on" | -| `%%LNG_YesShareWishList%%` | "I want to be able to share this wish list" | -| `%%LNG_YouMayAlsoLike%%` | "You May Also Like..." | -| `%%LNG_YourAccount%%` | "My Account" | -| `%%LNG_YourAccountDetails%%` | "Your Account Details" | -| `%%LNG_YourAccountHelpIntro%%` | "From this page you can view your orders, update your account details and more. Choose an option from the menu on the right or learn more about each option below:" | -| `%%LNG_YourAddressBook%%` | "Your Address Book" | -| `%%LNG_YourCartContains%%` | "Your cart contains" | -| `%%LNG_YourComments%%` | "Your Comments" | -| `%%LNG_YouRecentlyViewed%%` | "You Recently Viewed..." | -| `%%LNG_YourOrder%%` | "Your Order" | -| `%%LNG_YourOrderContainsTheFollowingDownloadableItems%%` | | -| `%%LNG_YourOrderContainsTheFollowingItems%%` | | -| `%%LNG_YourOrderContainsTheFollowingItems2%%` | | -| `%%LNG_YourOrderDetailsBelow%%` | "Your order details are shown below." | -| `%%LNG_YourOrderIDIs%%` | | -| `%%LNG_YourOrderNumber%%` | | -| `%%LNG_YourOrders%%` | "Your Completed Orders" | -| `%%LNG_YourOrderTotal%%` | "Your order total cost:" | -| `%%LNG_YourOrderTotalIs%%` | "The outstanding balance of your order is" | -| `%%LNG_YourReturns%%` | "Your Return Requests" | -| `%%LNG_YourShoppingCart%%` | "Your Shopping Cart" | -| `%%LNG_ZipPostcode%%` | "Zip/Postcode" | +# LNG Variables + +The Blueprint theme uses the following LNG variables to reference text strings. This list is sorted alphabetically by variable name. + +To make it easier for store owners who might wish to translate, or otherwise modify, their strings: Use these variables instead of hard-coding string values into your theme. + +| Variable | Default string value | +|:---------|:---------------------| +| `%%LNG_AC_AbandonedCartConvertedHeading%%` | "An abandoned cart was converted to an order" | +| `%%LNG_AC_AbandonedCartNoticeHeading%%` | "Abandoned Cart Notice" | +| `%%LNG_AC_CartContentsSubheading%%` | "Products In Cart" | +| `%%LNG_AC_ContactDetailsSubheading%%` | "Contact Details" | +| `%%LNG_AC_CouponCodeAfterText%%` | " during checkout to receive " | +| `%%LNG_AC_CouponCodeBeforeText%%` | "Enter coupon code " | +| `%%LNG_AC_EmailUnsubscribe%%` | "Unsubscribe" | +| `%%LNG_AC_EmailUnsubscribeSuffix%%` | " from future emails like this" | +| `%%LNG_AC_RecoveredEmailIntroText%%` | "The automated emails we've been sending shoppers who didn't make it all the way through the checkout process have resulted in a new order. The customer's contact details and ordered items are shown below." | +| `%%LNG_AC_RecoveredEmailSubHeading%%` | "Congratulations!" | +| `%%LNG_AccountDetailsDescription%%` | "Update your contact details, email address and/or change your password." | +| `%%LNG_AccountEnterFirstName%%` | "Please type in your first name." | +| `%%LNG_AccountEnterLastName%%` | "Please type in your last name." | +| `%%LNG_AccountEnterPassword%%` | "Please type in a password." | +| `%%LNG_AccountEnterPhoneNumber%%` | "Please type in your phone number." | +| `%%LNG_AccountEnterValidEmail%%` | "Please type in a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>" | +| `%%LNG_AccountInboxIntroNoOrders%%` | "Once you place an order you'll have full access to your inbox from this page." | +| `%%LNG_AccountNoRecentItems%%` | "You haven't looked at any items on our site. When you do, they will appear here." | +| `%%LNG_AccountOrdersIntro%%` | "Your completed orders with us are shown below. Click 'View Order' to view an orders details." | +| `%%LNG_AccountOrdersNone%%` | "You don't have any completed orders with us. When you do, they will appear on this page." | +| `%%LNG_AccountOrderStatusIntro%%` | "The status of your recent orders is shown below. Click 'View Order' to see complete details." | +| `%%LNG_AccountOrderStatusNone%%` | "You haven't placed any orders with us. When you do, their status will appear on this page." | +| `%%LNG_AccountPasswordsDontMatch%%` | "Your passwords don't match." | +| `%%LNG_AccountRecentItemsIntro%%` | "The items you've recently looked at on our site are shown below." | +| `%%LNG_AccountReturnsIntro%%` | "To return an item from one of your previous orders, please <a href='account.php?action=view_orders'>click here</a>." | +| `%%LNG_AccountReturnsNone%%` | "You do not have any outstanding return requests with us at the moment." | +| `%%LNG_Action%%` | "Action" | +| `%%LNG_Add%%` | "Add" | +| `%%LNG_AddressBook%%` | "Address Book" | +| `%%LNG_AddressBookDescription%%` | "Add, edit and remove shipping and billing destinations from your address book." | +| `%%LNG_AddShippingAddress%%` | "Add New Address" | +| `%%LNG_AddToCart1%%` | "Click the button below to add the" | +| `%%LNG_AddToWishList%%` | "Add to Wish List" | +| `%%LNG_AdminMaintenanceNotice%%` | "<br />Only administrators can view the store at the moment. Visit your control panel settings page to disable maintenance mode.<br /><br /><a href='?showStore=no'>Click here to see what your visitors will see.</a>" | +| `%%LNG_AdminMaintenanceNoticeHeader%%` | "Your store is down for maintenance." | +| `%%LNG_AdvancedExample1%%` | "ipod <em>or</em> creative" | +| `%%LNG_AdvancedExample2%%` | "music <em>not</em> creative" | +| `%%LNG_AdvancedSearch%%` | "Advanced Search" | +| `%%LNG_AdvancedSearching%%` | "Advanced Searching" | +| `%%LNG_AdvancedSearchingAnd%%` | "<em>not</em> specifies that the term must not be present in the search results." | +| `%%LNG_AdvancedSearchingKeywords%%` | "The words 'and', 'or' and 'not' are special keywords used to join words." | +| `%%LNG_AdvancedSearchingNot%%` | "<em>not</em> specifies that the term must not be present in the search results." | +| `%%LNG_AdvancedSearchingOr%%` | "<em>or</em> specifies that either of the terms must be present in the results." | +| `%%LNG_AdvancedSearchingPhrases%%` | "If you wish to search for a phrase, enclose it within <em>"double quotes"</em>" | +| `%%LNG_AlphaAsc%%` | "Alphabetical: A to Z" | +| `%%LNG_AlphaDesc%%` | "Alphabetical: Z to A" | +| `%%LNG_AlreadyHaveAnAccount%%` | "I'm A Returning Customer" | +| `%%LNG_AlreadyHaveAnAccountIntro%%` | "To continue, please enter your email address and password that you use for your account." | +| `%%LNG_AlsoWantToShipToThisAddress%%` | "I also want to ship to this address" | +| `%%LNG_Amount%%` | "Amount" | +| `%%LNG_Apply%%` | "Apply" | +| `%%LNG_AuthorisationCode%%` | "Authorisation Code" | +| `%%LNG_AuthorizeNetCardHoldersName%%` | ”Cardholder's Name" | +| `%%LNG_AuthorizeNetCreditCardCCV2%%` | ”CVV Code" | +| `%%LNG_AuthorizeNetCreditCardNo%%` | ”Credit Card Number" | +| `%%LNG_AuthorizeNetCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | +| `%%LNG_AuthorizeNetEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | +| `%%LNG_AuthorizeNetEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | +| `%%LNG_AuthorizeNetEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | +| `%%LNG_AuthorizeNetEnterCVV2Number%%` | ”Please enter your credit card vertification number. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_AuthorizeNetEnterName%%` | ”You forgot to enter the cardholder's name." | +| `%%LNG_AuthorizeNetExpirationDate%%` | ”Expiration Date" | +| `%%LNG_AuthorizeNetPayForOrder%%` | ”Pay for Order" | +| `%%LNG_AuthorizeNetPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | +| `%%LNG_AuthorizeNetProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_AuthorizeNetTotalAmount%%` | ”Order Total" | +| `%%LNG_AutoSearchSubCats%%` | "Automatically search sub categories" | +| `%%LNG_Availability%%` | "Availability" | +| `%%LNG_AvgCustomerReview%%` | "Avg. Customer Review" | +| `%%LNG_BadContactFormCaptcha%%` | "The characters you copied from the image are incorrect. Please try again." | +| `%%LNG_BasicExample1%%` | "ipod touch" | +| `%%LNG_BasicExample2%%` | "mp3 player" | +| `%%LNG_BasicSearching%%` | "Basic Searching" | +| `%%LNG_BasicSearchingCommon%%` | "Common words such as 'are' and 'is' as well as words below 3 characters are automatically removed from your search terms." | +| `%%LNG_BasicSearchingFields%%` | "All search terms are matched against product names, descriptions and the product code." | +| `%%LNG_BasicSearchingMultiple%%` | "Multiple search words are supported. Results containing all of your search terms are ranked higher than those which don't." | +| `%%LNG_BasicSearchingShort%%` | "Try to keep search terms short and to the point." | +| `%%LNG_Bestselling%%` | "Bestselling" | +| `%%LNG_BillAndShipToAddress%%` | "Bill & Ship to this Address" | +| `%%LNG_BillingAddress%%` | "Billing Address" | +| `%%LNG_BillingDetails%%` | "Billing Details" | +| `%%LNG_BillTo%%` | "Billing Details" | +| `%%LNG_BillToThisAddress%%` | "Bill to this address" | +| `%%LNG_Brand%%` | "Brand" | +| `%%LNG_BrandName%%` | "Brand Name" | +| `%%LNG_Brands%%` | "Brands" | +| `%%LNG_BrandsTagCloud%%` | "Brands Tag Cloud" | +| `%%LNG_BrandTagCloudHelp%%` | "The <em>brands tag cloud</em> shows all of the brands available for purchase.<br /><br />The bigger the brand appears, the more products it contains.<br /><br />Click on a brand below to see all products listed under that brand.<br /><br />" | +| `%%LNG_BulkDiscountLink%%` | "Buy in bulk and save" | +| `%%LNG_BulkDiscountThickBoxIntro%%` | "Below are the available bulk discount rates for each individual item when you purchase a certain amount" | +| `%%LNG_BulkDiscountThickBoxIntro%%` | "Below are the available bulk discount rates for each individual item when you purchase a certain amount" | +| `%%LNG_CalculateShipping%%` | "Estimate Shipping & Tax" | +| `%%LNG_CalculateShippingHandling%%` | "Estimate Shipping & Tax" | +| `%%LNG_Calculating%%` | "Estimating..." | +| `%%LNG_Cancel%%` | "Cancel" | +| `%%LNG_CantReorderGiftCertificateAlert%%` | "Unfortunately gift certificates can not be reordered. Click on the 'Gift Certificates' link to purchase a new one." | +| `%%LNG_CantReorderItems%%` | "One or more selected items can\'t be reordered." | +| `%%LNG_CapitalFor%%` | "For" | +| `%%LNG_CaptchaIntro%%` | "Please copy the characters from the image into the text field below. Doing this helps us prevent automated submissions." | +| `%%LNG_CaptchaVerification%%` | "Captcha Check" | +| `%%LNG_CardholderName%%` | "Cardholder Name" | +| `%%LNG_CartItems%%` | "Cart Items" | +| `%%LNG_CartRemoveConfirm%%` | "Are you sure you want to remove this item from your cart?" | +| `%%LNG_CatalogPriceExTaxLabel%%` | " (ex :label)" | +| `%%LNG_CatalogPriceIncTaxLabel%%` | " (inc :label)" | +| `%%LNG_Categories%%` | "Categories" | +| `%%LNG_CategoryNewProductsFeed%%` | "New Products RSS Feed for %s" | +| `%%LNG_CategoryPopularProductsFeed%%` | "Popular Products RSS Feed for %s" | +| `%%LNG_CCManualCardHoldersName%%` | ”Cardholder's Name" | +| `%%LNG_CCManualChooseCardType%%` | ”You forgot to choose a card type." | +| `%%LNG_CCManualCreditCardCCV2%%` | ”CCV2 Value" | +| `%%LNG_CCManualCreditCardCVV2Help%%` | | +| `%%LNG_CCManualCreditCardIssueNo%%` | ”Card Issue No" | +| `%%LNG_CCManualCreditCardIssueNoHelp%%` | | +| `%%LNG_CCManualCreditCardNo%%` | ”Credit Card No" | +| `%%LNG_CCManualCreditCardNoHelp%%` | | +| `%%LNG_CCManualCreditCardType%%` | ”Card Type" | +| `%%LNG_CCManualEnterCardNumber%%` | ”Please enter a valid credit card number containing no spaces or dashes." | +| `%%LNG_CCManualEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | +| `%%LNG_CCManualEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | +| `%%LNG_CCManualEnterCVV2Number%%` | ”Please enter your credit card verification number. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_CCManualEnterIssueDetails%%` | ”Please enter a valid issue number or issue date." | +| `%%LNG_CCManualEnterName%%` | ”You forgot to enter the cardholder's name." | +| `%%LNG_CCManualExpirationDate%%` | ”Expiration Date" | +| `%%LNG_CCManualIssueDate%%` | ”Card Issue Date" | +| `%%LNG_CCManualIssueDateHelp%%` | | +| `%%LNG_CCManualPayForOrder%%` | | +| `%%LNG_CCManualPaymentIntro%%` | | +| `%%LNG_CCManualPleaseChoose%%` | | +| `%%LNG_CCManualTotalAmount%%` | | +| `%%LNG_CertificateCode%%` | "Code" | +| `%%LNG_CertificateFrom%%` | "From" | +| `%%LNG_CertificateTo%%` | "To" | +| `%%LNG_Change%%` | "Change" | +| `%%LNG_ChangeYourPassword%%` | "Change Your Password" | +| `%%LNG_CharactersRemaining%%` | "characters remaining" | +| `%%LNG_CheckBalance%%` | "Check Balance" | +| `%%LNG_CheckCertificateBalance%%` | "Check Remaining Balance" | +| `%%LNG_CheckingOutAs%%` | "Checking Out As" | +| `%%LNG_Checkout%%` | "Checkout" | +| `%%LNG_CheckoutAsAGuest%%` | "Checkout as a guest" | +| `%%LNG_CheckoutButtonTitle%%` | "Click here to proceed to checkout" | +| `%%LNG_CheckoutGuestIntro%%` | "Register with us for a faster checkout, to track the status of your order and more. You can also checkout as a guest." | +| `%%LNG_CheckoutUseStoreCredit%%` | "Pay using my store credit" | +| `%%LNG_CheckoutWithMultipleAddresses%%` | "Checkout with multiple addresses" | +| `%%LNG_ChooseAnotherProduct%%` | "Choose Another Product" | +| `%%LNG_ChooseGiftWrappingOption%%` | "-- Please choose a type of gift wrapping --" | +| `%%LNG_ChooseHowToWrapItems%%` | "Please choose how you'd like to have this item gift wrapped." | +| `%%LNG_ChooseReturnAction%%` | "-- Please Choose an Action (Optional) --" | +| `%%LNG_ChooseReturnReason%%` | "-- Please Choose a Reason --" | +| `%%LNG_ChooseShippingCountry%%` | "Please choose your country." | +| `%%LNG_ChooseShippingMethod%%` | "Please choose a shipping method." | +| `%%LNG_ChooseShippingProvider%%` | "Choose a Shipping Method" | +| `%%LNG_ChooseShippingState%%` | "Please choose a state/province." | +| `%%LNG_ChooseYourOptions%%` | "Choose Your Options" | +| `%%LNG_ClickHere%%` | "click here" | +| `%%LNG_ClickHereToTrackYourOrder%%` | "Track the status of your order" | +| `%%LNG_ClickToCreateAnAccount%%` | "Click here to create a new account." | +| `%%LNG_ClickToPrintInvoice%%` | "Print Invoice" | +| `%%LNG_ClickToViewReturnStatus%%` | "Click here to view the status of this return." | +| `%%LNG_Close%%` | "Close" | +| `%%LNG_CloseWindow%%` | "Close Window" | +| `%%LNG_CloseWindow%%` | "Close Window" | +| `%%LNG_Code%%` | "Code/SKU" | +| `%%LNG_Comments%%` | "Comments" | +| `%%LNG_CompanyName%%` | "Company Name" | +| `%%LNG_Compare%%` | "Compare" | +| `%%LNG_CompareSelected%%` | "Compare Selected" | +| `%%LNG_CompareSelectMessage%%` | "Please choose at least 2 products to compare." | +| `%%LNG_CompareTwoProducts%%` | "At least 2 products are needed to make a valid comparison." | +| `%%LNG_CompletedOrders%%` | "Completed Orders" | +| `%%LNG_CompletedOrdersDescription%%` | "See all completed orders you've placed at %s. You can also print invoices from this page." | +| `%%LNG_Condition%%` | "Condition" | +| `%%LNG_ConfirmAddressTypeChange%%` | | +| `%%LNG_ConfirmDeleteShippingAddress%%` | "Are you sure you want to delete this shipping address?" | +| `%%LNG_ConfirmDeleteWishLists%%` | "Are you sure you want to delete the selected wish list(s)? This action cannot be undone." | +| `%%LNG_ConfirmRemoveGiftWrapping%%` | "Are you sure you want to remove the gift wrapping from this item?" | +| `%%LNG_ConfirmYourOrder%%` | "Please Review Your Order Before Continuing" | +| `%%LNG_ContactCompanyName%%` | "Company Name" | +| `%%LNG_ContactEmail%%` | "Email Address" | +| `%%LNG_ContactFormDetails%%` | "Here are their details" | +| `%%LNG_ContactFormEmail1%%` | "A user has submitted the contact form on your store." | +| `%%LNG_ContactFormEnterEmail%%` | "Please enter a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>." | +| `%%LNG_ContactFormEnterQuestion%%` | "You forgot to enter your question/comment." | +| `%%LNG_ContactName%%` | "Full Name" | +| `%%LNG_ContactOrderNo%%` | "Order Number" | +| `%%LNG_ContactPageFormSubmitted%%` | "'%s' submitted the form from your '%s' page" | +| `%%LNG_ContactPhone%%` | "Phone Number" | +| `%%LNG_ContactQuestion%%` | "Details" | +| `%%LNG_ContactRMANo%%` | "RMA Number" | +| `%%LNG_ContainsTheFollowingItems%%` | "Contained the Following Items" | +| `%%LNG_Continue%%` | "Continue" | +| `%%LNG_ContinueRaquo%%` | "Continue »" | +| `%%LNG_ContinueShopping%%` | "Continue Shopping" | +| `%%LNG_CouldNotShipFollowingItems%%` | "The following item(s) could not be shipped to your shipping address:" | +| `%%LNG_Country%%` | "Country" | +| `%%LNG_Coupon%%` | "Coupon" | +| `%%LNG_CouponCode%%` | "Coupon Code" | +| `%%LNG_CouponCodeIntro%%` | "If you have a coupon code, enter it in the box below and click 'Go'." | +| `%%LNG_CreateAccount%%` | "Create Account" | +| `%%LNG_CreateAccountIntro1%%` | <b>Checkout:</b> "Fill in the fields below to create an "<br><b>Express Checkout:</b> "Checkout faster"| +| `%%LNG_CreateAccountIntro2%%` | <b>Checkout:</b> "account. You'll be able to shop and check out faster on your next visit, check your order status online, and optionally receive updates on special offers and events."<br><b>Express Checkout:</b> "Save multiple addresses in your address book" | +| `%%LNG_CreateAccountIntro3%%` | "Access order history and track your orders" | +| `%%LNG_CreateAccountIntro4%%` | "Checkout faster at" | +| `%%LNG_CreateAccountIntro5%%` | "and save multiple addresses in your address book." | +| `%%LNG_CreateAccountIntroTitle%%` | "Create an account with us and you'll be able to:" | +| `%%LNG_CreateAccountLoginIntro%%` | "<p>Create an account with us and you'll be able to:</p><ul><li>Check out faster</li><li>Save multiple shipping addresses</li><li>Access your order history</li><li>Track new orders</li><li>Save items to your wish list</li></ul>" | +| `%%LNG_CreateAccountPersonalIntro%%` | "Enter your email address and password to create your account." | +| `%%LNG_CreateAccountShippingIntro%%` | "Enter the name and address you'd like us to ship your order to." | +| `%%LNG_CreateAccountThanks%%` | "Your Account Has Been Created" | +| `%%LNG_CreateAccountThanksIntro%%` | "Thank you for creating your account at %s. Your account details have been emailed to %s." | +| `%%LNG_CreateANewWishList%%` | "Create a New Wish List..." | +| `%%LNG_CreditCardCardCode%%` | ”CVV2" | +| `%%LNG_CreditCardCardHoldersName%%` | ”Cardholder's Name" | +| `%%LNG_CreditCardCardType%%` | ”Credit Card Type" | +| `%%LNG_CreditCardChooseCardType%%` | ”You forgot to choose a card type." | +| `%%LNG_CreditCardCreditCardIssueNo%%` | ”Card Issue No" | +| `%%LNG_CreditCardCreditCardIssueNoHelp%%` | ”The issue number found on the front of your card under 'ISS' or 'ISSUE'<br />Only required for cards that contain it." | +| `%%LNG_CreditCardCreditCardNo%%` | ”Credit Card Number" | +| `%%LNG_CreditCardCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | +| `%%LNG_CreditCardCVV2Help%%` | "For Visa/MasterCard/Discover cards, it\'s the three digit code beside your signature strip on the back of the card. For American Express cards, it\'s the four digit code above the account number on the front of the card." | +| `%%LNG_CreditCardEnterCardCode%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_CreditCardEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | +| `%%LNG_CreditCardEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | +| `%%LNG_CreditCardEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | +| `%%LNG_CreditCardEnterIssueNoOrDate%%` | ”Please enter your card issue number or issue date." | +| `%%LNG_CreditCardEnterName%%` | ”You forgot to enter the cardholder's name." | +| `%%LNG_CreditCardExpirationDate%%` | ”Expiration Date" | +| `%%LNG_CreditCardIssueDate%%` | ”Card Issue Date" | +| `%%LNG_CreditCardIssueDateHelp%%` | ”The issue date found on the front of your card.<br />Only required for cards that contain it." | +| `%%LNG_CreditCardPayForOrder%%` | ”Pay for Order" | +| `%%LNG_CreditCardPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | +| `%%LNG_CreditCardPleaseChoose%%` | ”-- Please Choose --" | +| `%%LNG_CreditCardProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_CreditCardTotalAmount%%` | ”Total Amount" | +| `%%LNG_CreditPaymentMethod%%` | "Pay the remaining %s via:" | +| `%%LNG_CurrencyConverter%%` | "Currency Converter" | +| `%%LNG_Currently%%` | "Currently" | +| `%%LNG_CurrentTopSellers%%` | "Current Top Sellers" | +| `%%LNG_CustomersAlsoBought%%` | "Customers Also Purchased" | +| `%%LNG_CustomersWhoLikedThisProductAlsoLiked%%` | "Customers Who Liked This Product Also Liked" | +| `%%LNG_DateAndTime%%` | "Date and Time" | +| `%%LNG_DateOfOrder%%` | "Order Date" | +| `%%LNG_DateRequested%%` | "Date Requested" | +| `%%LNG_DateShipped%%` | "Date Shipped" | +| `%%LNG_Dear%%` | "Dear" | +| `%%LNG_Delete%%` | "Delete" | +| `%%LNG_DeleteProductFieldFileConfirmation%%` | "Are you sure you want to delete the uploaded file?" | +| `%%LNG_DeliveryDisclaimer%%` | "*Delivery time is approximate from date of shipment" | +| `%%LNG_DesignModeCancel%%` | "Cancel" | +| `%%LNG_DesignModeChangesSaved%%` | "Your design mode changes have been saved successfully." | +| `%%LNG_DesignModeConfirmDisable%%` | "Are you sure you want to disable design mode? Any changes you've made won't be saved.\n\nYou can re-enable design mode at any time by logging in to your store's control panel, visiting the 'Store Design' page and clicking the 'Design Mode' tab.\n\nClick OK to confirm." | +| `%%LNG_DesignModeConfirmPanelRemove%%` | "Are you sure you want to remove the panel ':panel' from the page? It may still appear on other pages. Click OK to confirm." | +| `%%LNG_DesignModeConfirmUndo%%` | "Are you sure? Any changes you've made wont be saved. Click OK to confirm." | +| `%%LNG_DesignModeDisable%%` | "Disable" | +| `%%LNG_DesignModeLangSaving%%` | "Saving..." | +| `%%LNG_DesignModeMenuEditLayout%%` | "Edit Layout..." | +| `%%LNG_DesignModeMenuEditPanel%%` | "Edit Panel..." | +| `%%LNG_DesignModeMenuEditStylesheet%%` | "Edit Stylesheet..." | +| `%%LNG_DesignModeMenuRemovePanel%%` | "Remove Panel" | +| `%%LNG_DesignModeRemoveLastPanel%%` | "This is the last panel in this column.\n\nIf you wish to move this panel please move another panel in to this column first." | +| `%%LNG_DesignModeSave%%` | "Save" | +| `%%LNG_DesignModeToggle%%` | "Toggle" | +| `%%LNG_DesignModeUndo%%` | "Undo" | +| `%%LNG_DidYouMean%%` | "Did you mean" | +| `%%LNG_Discount%%` | "Discount" | +| `%%LNG_DownloadLink%%` | "Download" | +| `%%LNG_DownloadTheItemsYouOrdered%%` | "Download the items you ordered" | +| `%%LNG_Edit%%` | "Edit" | +| `%%LNG_EditAccountIntro%%` | "Make changes to your account details below. Click 'Update My Details' when you're done." | +| `%%LNG_Email%%` | | +| `%%LNG_EmailAddress%%` | "Email Address" | +| `%%LNG_EmptyCartInfo%%` | "To add a product to your cart, first browse for it or use the search box and then click its "Add to Cart" button." | +| `%%LNG_EmptyHomePage%%` | "home page." | +| `%%LNG_EmptySmallSearch%%` | "You forgot to enter some search keywords." | +| `%%LNG_EnterCaptchaCode%%` | "Please copy the characters from the image into the \'Captcha Check\' text box." | +| `%%LNG_EnterCouponCode%%` | "Please enter your coupon code." | +| `%%LNG_EnterGiftCertificateCode%%` | "Please enter your gift certificate code." | +| `%%LNG_EnterGiftCertificateValueBetween%%` | "Please enter an amount between the minimum and maximum gift certificate value." | +| `%%LNG_EnterOrderComments%%` | "Order Instructions/Comments (Optional)" | +| `%%LNG_EnterRequiredField%%` | "Please enter the required field(s)." | +| `%%LNG_EnterShippingAddress%%` | "Please type in an address." | +| `%%LNG_EnterShippingCity%%` | "Please type in your suburb/city." | +| `%%LNG_EnterShippingFirstName%%` | "Please type in your first name." | +| `%%LNG_EnterShippingLastName%%` | "Please type in your last name." | +| `%%LNG_EnterShippingPhone%%` | "Please enter your phone number." | +| `%%LNG_EnterShippingZip%%` | "Please type in your zip/postcode." | +| `%%LNG_EnterTheCodeBelow%%` | "Enter the code below:" | +| `%%LNG_EnterValidCertificateCode%%` | "Please enter a gift certificate code." | +| `%%LNG_EnterValidCertificateFromEmail%%` | "Please enter your email address." | +| `%%LNG_EnterValidCertificateFromName%%` | "Please enter your name." | +| `%%LNG_EnterValidCertificateToEmail%%` | "Please enter a valid email address for the person you wish to send this gift certificate to." | +| `%%LNG_EnterValidCertificateToName%%` | "Please enter the name of the person you wish to send this gift certificate to." | +| `%%LNG_EnterValidFromPrice%%` | "Please enter a valid \'from\' price containing numbers only." | +| `%%LNG_EnterValidGiftCertificateAmount%%` | "Please enter a valid amount for this gift certificate." | +| `%%LNG_EnterValidToPrice%%` | "Please enter a valid \'to\' price containing numbers only." | +| `%%LNG_EnterWishListName%%` | "Please enter a wishlist name." | +| `%%LNG_eSelectPlusDPCardHoldersName%%` | ”Cardholder's Name" | +| `%%LNG_eSelectPlusDPCreditCardCCV2%%` | ”Card Security Code" | +| `%%LNG_eSelectPlusDPCreditCardNo%%` | ”Credit Card Number" | +| `%%LNG_eSelectPlusDPCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | +| `%%LNG_eSelectPlusDPEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | +| `%%LNG_eSelectPlusDPEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | +| `%%LNG_eSelectPlusDPEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | +| `%%LNG_eSelectPlusDPEnterCVV2Number%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_eSelectPlusDPEnterName%%` | ”You forgot to enter the cardholder's name." | +| `%%LNG_eSelectPlusDPEnterPostcode%%` | ”You forgot to enter a zip/postcode." | +| `%%LNG_eSelectPlusDPEnterStreetName%%` | ”You forgot to enter your street name." | +| `%%LNG_eSelectPlusDPEnterStreetNumber%%` | ”You forgot to enter your street number." | +| `%%LNG_eSelectPlusDPExpirationDate%%` | ”Expiration Date" | +| `%%LNG_eSelectPlusDPPayForOrder%%` | ”Pay for Order" | +| `%%LNG_eSelectPlusDPPaymentIntro%%` | ”Please enter the following information as it appears on your credit card statement and then click the "Pay for Order" button to pay for your order." | +| `%%LNG_eSelectPlusDPProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_eSelectPlusDPStreetName%%` | ”Street Address" | +| `%%LNG_eSelectPlusDPTotalAmount%%` | ”Order Total" | +| `%%LNG_eSelectPlusDPZip%%` | ”Zip/Postcode" | +| `%%LNG_EWayCardCode%%` | ”CVV Code" | +| `%%LNG_EWayCardHoldersName%%` | ”Cardholder's Name" | +| `%%LNG_EWayCreditCardNo%%` | ”Credit Card Number" | +| `%%LNG_EWayCreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | +| `%%LNG_EWayEnterCardCode%%` | ”Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_EWayEnterCardNumber%%` | ”Please enter the card number only, no spaces or dashes." | +| `%%LNG_EWayEnterCreditCardMonth%%` | ”You forgot to choose an expiry month." | +| `%%LNG_EWayEnterCreditCardYear%%` | ”You forgot to choose an expiry year." | +| `%%LNG_EWayEnterName%%` | ”You forgot to enter the cardholder's name." | +| `%%LNG_EWayExpirationDate%%` | ”Expiration Date" | +| `%%LNG_EWayPayForOrder%%` | ”Pay for Order" | +| `%%LNG_EWayPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | +| `%%LNG_EWayProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_EWayTotalAmount%%` | ”Order Total" | +| `%%LNG_ExpressCheckoutCheckingOutAsGuest%%` | "Checking out as a guest" | +| `%%LNG_ExpressCheckoutChooseBilling%%` | "Please select the address you'd like to use as your billing address for this order." | +| `%%LNG_ExpressCheckoutChooseShipper%%` | "Please select the shipping method you'd like to use for your order." | +| `%%LNG_ExpressCheckoutChooseShipping%%` | "Please select the address you'd like to use as your shipping address for this order." | +| `%%LNG_ExpressCheckoutCreatingAnAccount%%` | "Creating an account" | +| `%%LNG_ExpressCheckoutFor%%` | "for" | +| `%%LNG_ExpressCheckoutLoadError%%` | "There was an error loading this step of the checkout. Please try again." | +| `%%LNG_ExpressCheckoutLoading%%` | "Loading..." | +| `%%LNG_ExpressCheckoutSelectShippingProvider%%` | "Please choose the shipping method for your order:" | +| `%%LNG_ExpressCheckoutStep%%` | "Step" | +| `%%LNG_ExpressCheckoutStepAccountDetails%%` | "Account Details" | +| `%%LNG_ExpressCheckoutStepBillingAccountDetails%%` | "Billing & Account Details" | +| `%%LNG_ExpressCheckoutStepBillingAddress%%` | "Billing Details" | +| `%%LNG_ExpressCheckoutStepOrderConfirmation%%` | "Order Confirmation" | +| `%%LNG_ExpressCheckoutStepPaymentDetails%%` | "Payment Details" | +| `%%LNG_ExpressCheckoutStepShippingAddress%%` | "Shipping Details" | +| `%%LNG_ExpressCheckoutStepShippingMethod%%` | "Shipping Method" | +| `%%LNG_FeaturedItems%%` | "Featured Items" | +| `%%LNG_FeaturedProduct%%` | "Featured Product" | +| `%%LNG_FeaturedProducts%%` | "Featured Products" | +| `%%LNG_FeaturedProductsFeed%%` | "Featured Products RSS Feed" | +| `%%LNG_FilterBy%%` | "Filter by" | +| `%%LNG_FindByCategory%%` | "Find Similar Products by Category" | +| `%%LNG_FindProductsByTag%%` | "Find Similar Products by Tag" | +| `%%LNG_FirstName%%` | "First Name" | +| `%%LNG_ForbiddenAccessPage%%` | "You Do Not Have Permission To Access This Page" | +| `%%LNG_ForgotPassword%%` | "Forgot Password" | +| `%%LNG_ForgotPasswordIntro%%` | "Fill in your email below to request a new password. An email will be sent to the address below containing a link to verify your email address." | +| `%%LNG_ForgotYourPassword%%` | "Forgot your password?" | +| `%%LNG_FreeShipping%%` | "Free Shipping" | +| `%%LNG_From%%` | "From" | +| `%%LNG_GetNewPasswordIntro%%` | "Your password should be at least 6 characters long and will be case sensitive." | +| `%%LNG_GiftCertificate%%` | "Gift Certificate" | +| `%%LNG_GiftCertificateAmount%%` | "Amount" | +| `%%LNG_GiftCertificateBalanceCode%%` | "Gift Certificate Code" | +| `%%LNG_GiftCertificateBalanceFor%%` | "Gift Certificate Balance for" | +| `%%LNG_GiftCertificateBalanceIntro%%` | "You can check the balance of a gift certificate by typing the code in to the box below." | +| `%%LNG_GiftCertificateCode%%` | "Redeem Gift Certificate" | +| `%%LNG_GiftCertificateCodeIntro%%` | "To pay for this order using a gift certificate, enter the gift certificate code in the box below and click 'Go'." | +| `%%LNG_GiftCertificateEmailAttached%%` | "Your gift certificate is attached to this email." | +| `%%LNG_GiftCertificateEmailedAfterPurchase%%` | "This gift certificate will be emailed to the recipient after your order has been paid for." | +| `%%LNG_GiftCertificateEmailInstructions%%` | "For instructions on how to redeem your gift certificate please <a href='%s/giftcertificates.php?action=redeem'>click here</a>." | +| `%%LNG_GiftCertificateEmailWarning%%` | "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable." | +| `%%LNG_GiftCertificateEmailYouHaveReceived%%` | "You have received a Gift Certificate for" | +| `%%LNG_GiftCertificateFrom%%` | "Your Name" | +| `%%LNG_GiftCertificateFromEmail%%` | "Your Email" | +| `%%LNG_GiftCertificateMessage%%` | "Your Message" | +| `%%LNG_GiftCertificateMessageTooLong%%` | "Please enter a shorter message for your gift certificate." | +| `%%LNG_GiftCertificateRemaining%%` | "remaining" | +| `%%LNG_GiftCertificates%%` | "Gift Certificates" | +| `%%LNG_GiftCertificateTerms2%%` | "I understand that gift certificates are non-refundable" | +| `%%LNG_GiftCertificateTheme%%` | "Gift Certificate Theme" | +| `%%LNG_GiftCertificateTo%%` | "Recipient's Name" | +| `%%LNG_GiftCertificateToEmail%%` | "Recipient's Email" | +| `%%LNG_GiftMessage%%` | "Gift Message" | +| `%%LNG_GiftWrapping%%` | "Gift Wrapping" | +| `%%LNG_GrandTotal%%` | "Grand Total" | +| `%%LNG_Handling%%` | "Handling" | +| `%%LNG_HC_address%%` | ”Address" | +| `%%LNG_HC_allbrands%%` | ”View all brands" | +| `%%LNG_HC_allprices%%` | ”All prices are in" | +| `%%LNG_HC_billingaddress%%` | ”Billing Address" | +| `%%LNG_HC_brands%%` | ”Brands" | +| `%%LNG_HC_calluson%%` | ”Call us on" | +| `%%LNG_HC_categories%%` | ”Categories" | +| `%%LNG_HC_chooseproduct%%` | ”choose another product" | +| `%%LNG_HC_clicktochangebilling%%` | ”Click Here to Change Billing Details if Required" | +| `%%LNG_HC_continuetostore%%` | ”Continue to our store" | +| `%%LNG_HC_customerviewed%%` | ”Customers also viewed" | +| `%%LNG_HC_date%%` | ”Date" | +| `%%LNG_HC_downloadedfileexpired%%` | ”This file can no longer be downloaded as it has expired." | +| `%%LNG_HC_email%%` | ”Email" | +| `%%LNG_HC_emailbigcommerce%%` | ”with BigCommerce" | +| `%%LNG_HC_emaillaunchstore%%` | ”Launch your own store for free" | +| `%%LNG_HC_emailpowered%%` | ”is powered by BigCommerce" | +| `%%LNG_HC_existingcustomer%%` | ”Existing Customer" | +| `%%LNG_HC_giftcertificatecode%%` | ”Gift certificate code" | +| `%%LNG_HC_giftcertificatecoupon%%` | ”Gift Certificate or Coupon Code" | +| `%%LNG_HC_modify%%` | ”Modify" | +| `%%LNG_HC_name%%` | ”Name" | +| `%%LNG_HC_nomarketingmails%%` | ”You will no longer receive marketing emails from" | +| `%%LNG_HC_ok%%` | ”OK" | +| `%%LNG_HC_or%%` | ”or" | +| `%%LNG_HC_order%%` | ”Order" | +| `%%LNG_HC_orderconfirmation%%` | ”Order Confirmation" | +| `%%LNG_HC_outofstock%%` | ”Out of Stock" | +| `%%LNG_HC_payfororder%%` | ”Pay for your order" | +| `%%LNG_HC_phone%%` | ”Phone" | +| `%%LNG_HC_proceedcheckout%%` | ”Proceed To Checkout" | +| `%%LNG_HC_productreviews%%` | ”Product Reviews" | +| `%%LNG_HC_quantity%%` | ”Quantity" | +| `%%LNG_HC_returnitem%%` | ”Return Item(s)" | +| `%%LNG_HC_returnstore%%` | ”Return to store" | +| `%%LNG_HC_rrp%%` | ”RRP" | +| `%%LNG_HC_searchresults%%` | HC_searchresults ”Search Results" | +| `%%LNG_HC_securityquestion%%` | ”Security Question" | +| `%%LNG_HC_sharediffproduct%%` | ”To share a different product, just select it from those shown below." | +| `%%LNG_HC_sharethis%%` | ”Share This" | +| `%%LNG_HC_shippingaddress%%` | ”Shipping Address" | +| `%%LNG_HC_shippingmethod%%` | ”Shipping Method" | +| `%%LNG_HC_shopnow%%` | ”SHOP NOW" | +| `%%LNG_HC_signin%%` | ”Sign In" | +| `%%LNG_HC_signinorcreate%%` | ”Sign in or Create Account" | +| `%%LNG_HC_signupnewsletter%%` | ”Sign up for our newsletter" | +| `%%LNG_HC_Submit%%` | "Submit" | +| `%%LNG_HC_total%%` | ”Total" | +| `%%LNG_HC_unsubscribe%%` | ”Unsubscribe from" | +| `%%LNG_HC_voucherredemptioncode%%` | ”Voucher redemption code" | +| `%%LNG_HC_writereview%%` | ”Write Review" | +| `%%LNG_HCT_delete%%` | ”Delete" | +| `%%LNG_HCT_edit%%` | ”Edit" | +| `%%LNG_HCV_addshoppingbag%%` | ”Add to shopping bag" | +| `%%LNG_HCV_apply%%` | ”Apply" | +| `%%LNG_HCV_clearform%%` | ”Clear Form" | +| `%%LNG_HCV_go%%` | ”Go" | +| `%%LNG_HearFromUsViaEmail%%` | "Hear From Us Via Email?" | +| `%%LNG_HeresHowToPayForYourOrder%%` | ”Your order was sent to us but requires payment before it can be completed." | +| `%%LNG_HeresHowtoPayforYourOrderThanks%%` | ”Here's How To Pay For Your Order" | +| `%%LNG_HeresHowtoPayforYourOrderUC%%` | "Here's How to Pay for Your Order..." | +| `%%LNG_Hi%%` | "Hi" | +| `%%LNG_HideSearchForm%%` | "Hide Search Form" | +| `%%LNG_Home%%` | "Home" | +| `%%LNG_HowRateProduct%%` | "How do you rate this product?" | +| `%%LNG_HowWouldYouLikeToPay%%` | "How Would You Like to Pay?" | +| `%%LNG_IdealBank%%` | "Bank" | +| `%%LNG_IdealIssuerNotSelected%%` | "Please select your issuer to continue" | +| `%%LNG_IdealPaymentIntro%%` | "Select your bank below and click the "Continue" button to proceed with payment." | +| `%%LNG_IdealProcessingError%%` | "Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_Image%%` | "Image" | +| `%%LNG_Inbox%%` | "Inbox" | +| `%%LNG_InstructionsForPaymentBelow%%` | "Instructions to pay for your order are shown below:" | +| `%%LNG_InvalidFileTypeJS%%` | "The file type of the file you are trying to upload is not allowed for this field." | +| `%%LNG_InvalidQuantity%%` | "Please enter a valid product quantity." | +| `%%LNG_InvoiceNumber%%` | "Hi" | +| `%%LNG_InvoicePendingPaymentText%%` | "Your order requires payment before it can be finalized. Details on how to pay are shown below." | +| `%%LNG_IPreferThisEmailFormat%%` | "I prefer to receive emails in this format:" | +| `%%LNG_ISOCode%%` | "ISO Code" | +| `%%LNG_IssuerConfirmation%%` | "Issuer Confirmation" | +| `%%LNG_IssuerName%%` | "Issuer Name" | +| `%%LNG_Item%%` | "Item" | +| `%%LNG_ItemDetails%%` | "Item Details" | +| `%%LNG_ItemPrice%%` | "Item Price" | +| `%%LNG_Items%%` | "Items" | +| `%%LNG_ItemsShippedTo%%` | "Items shipped to" | +| `%%LNG_ItemTotal%%` | "Item Total" | +| `%%LNG_JS_BillToThisAddress%%` | | +| `%%LNG_JS_Description%%` | | +| `%%LNG_JS_OtherDetails%%` | | +| `%%LNG_JS_OtherProducts%%` | | +| `%%LNG_JS_ProductVideos%%` | | +| `%%LNG_JS_Reviews%%` | | +| `%%LNG_JS_SimilarProducts%%` | | +| `%%LNG_JS_SimilarProductsByCustomerViews%%` | | +| `%%LNG_JS_Tags%%` | | +| `%%LNG_JS_Warranty%%` | | +| `%%LNG_JustSentAnEmailConfirmation%%` | "We've just sent you an email confirming your order." | +| `%%LNG_LastName%%` | "Last Name" | +| `%%LNG_LoadingPleaseWait%%` | "Loading... Please wait..." | +| `%%LNG_Login%%` | "Sign in" | +| `%%LNG_LoginEnterPassword%%` | "Please type in your password." | +| `%%LNG_LoginEnterValidEmail%%` | "Please type in a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>" | +| `%%LNG_LoginWord%%` | "Sign In" | +| `%%LNG_LowInventoryWarningAdjust%%` | "Click here to adjust the inventory level for this product." | +| `%%LNG_LowInventoryWarningAll%%` | "Click here to view all products with a low inventory level." | +| `%%LNG_ManageYourAccount%%` | "Manage Your Account" | +| `%%LNG_MerchantName%%` | "Merchant Name" | +| `%%LNG_MerchantURL%%` | "Merchant URL" | +| `%%LNG_MessageContent%%` | "Message" | +| `%%LNG_MessageEmailText1%%` | "has sent you a message about your order." | +| `%%LNG_MessageEmailText2%%` | "To view the message and reply, follow the link below:" | +| `%%LNG_MessageEnterContent%%` | "Please enter a message." | +| `%%LNG_MessageEnterSubject%%` | "Please enter a subject." | +| `%%LNG_MessageOrder%%` | "Order" | +| `%%LNG_MessageSaid%%` | "Said" | +| `%%LNG_MessageSendError%%` | "Something went wrong when trying to send your message. Please try again." | +| `%%LNG_MessageSendSuccess%%` | "Your message was sent and you will receive a response via email shortly." | +| `%%LNG_MessageSubject%%` | "Subject" | +| `%%LNG_MobileSite%%` | "Mobile Site" | +| `%%LNG_NewCustomerIntro1%%` | "If this is your first purchase from" | +| `%%LNG_NewCustomerIntro2%%` | "please click the "Continue." button to get started." | +| `%%LNG_NewestItems%%` | "Newest Items" | +| `%%LNG_NewProducts%%` | "New Products" | +| `%%LNG_NewProductsFeed%%` | "New Products RSS Feed" | +| `%%LNG_NewsletterEnterEmail%%` | "You forgot to type in your email address." | +| `%%LNG_NewsletterEnterFirstName%%` | "You forgot to type in your first name." | +| `%%LNG_NewsletterEnterValidEmail%%` | "Please enter a valid email address, such as <a href='mailto:joe@example.com'>joe@example.com</a>." | +| `%%LNG_NewsletterSpecialOffersText%%` | "I'd like to receive special offers" | +| `%%LNG_NewsletterSubscription%%` | "Newsletter Subscription" | +| `%%LNG_Next%%` | "Next" | +| `%%LNG_NextImage%%` | "Next" | +| `%%LNG_NMICardHoldersName%%` | "Cardholder's Name" | +| `%%LNG_NMICreditCardCCV2%%` | ”CVV Code" | +| `%%LNG_NMICreditCardNo%%` | ”Credit Card Number" | +| `%%LNG_NMICreditCardNoHelp%%` | ”Numbers only, no spaces or dashes." | +| `%%LNG_NMIExpirationDate%%` | ”Expiration Date" | +| `%%LNG_NMIPayForOrder%%` | ”Pay for Order" | +| `%%LNG_NMIPaymentIntro%%` | ”Complete the form below and then click the "Pay for Order" button to pay for your order using our secure server." | +| `%%LNG_NMIProcessingError%%` | ”Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_NMITotalAmount%%` | ”Order Total" | +| `%%LNG_NoCaptcha%%` | "Please enter the code shown." | +| `%%LNG_NoItemsInCart%%` | "There are no products in your cart." | +| `%%LNG_NoPermissionToAccessThisPage%%` | "You don't have the necessary permissions to view this page." | +| `%%LNG_NoPreference%%` | "No Preference" | +| `%%LNG_NoProductsInCategory%%` | "There are no products in this category." | +| `%%LNG_NotAnExistingCustomer%%` | "I'm A New Customer" | +| `%%LNG_NotFound%%` | "Not Found" | +| `%%LNG_NotFoundError%%` | "The page you were looking for appears to have been moved, deleted or does not exist." | +| `%%LNG_NotFoundReason1%%` | "An outdated link on another site" | +| `%%LNG_NotFoundReason2%%` | "A typo in the address / URL" | +| `%%LNG_NotFoundReasonTitle%%` | "This is most likely due to:" | +| `%%LNG_NotificationAReturnSummaryIsShownBelow%%` | "A summary of your return is shown below. To view the status of this return" | +| `%%LNG_NotificationClickHereViewReturn%%` | "View details for return #" | +| `%%LNG_NotificationConfirmationForReturn%%` | "Confirmation for Return Request for Order ID" | +| `%%LNG_NotificationCustomerDetails%%` | "Customer Details" | +| `%%LNG_NotificationNewReturnRequest%%` | "New Return Request for Order ID" | +| `%%LNG_NotificationReturnRequestSubmitted%%` | "A new return request has been submitted on" | +| `%%LNG_NotificationTheReturnContainsTheFollowingItems%%` | "The Return Request Contains the Following Items..." | +| `%%LNG_NotificationYourReturnContainsTheFollowingItems%%` | "Your Return Request Contains the Following Items..." | +| `%%LNG_Of%%` | "of" | +| `%%LNG_OnlyFeaturedProducts%%` | "Only Featured Products" | +| `%%LNG_OnlyFreeShipping%%` | "Only Free Shipping" | +| `%%LNG_OnlyNonFeaturedProducts%%` | "Only Non-Featured Products" | +| `%%LNG_OnlyPaidShipping%%` | "Only Paid Shipping" | +| `%%LNG_OnThe%%` | "on the" | +| `%%LNG_Oops%%` | "Oops..." | +| `%%LNG_Optional%%` | "Optional" | +| `%%LNG_Or%%` | "or" | +| `%%LNG_Order%%` | "Order" | +| `%%LNG_OrderAwaitingPayment%%` | "Your order was sent to us but is currently awaiting payment. Once we receive the payment for your order, it will be completed. If you've already provided payment details then we will process your order manually and send you an email when it's completed." | +| `%%LNG_OrderComments%%` | "Order Instructions/Comments" | +| `%%LNG_OrderDate%%` | "Order Date" | +| `%%LNG_OrderDetails%%` | "Order Details" | +| `%%LNG_OrderDownloads%%` | "Files" | +| `%%LNG_OrderedItemRemovedFromStore%%` | "That item was removed from our store and is no longer available for order." | +| `%%LNG_OrderId%%` | "Order #%s" | +| `%%LNG_OrderIdHash%%` | "Order #" | +| `%%LNG_OrderItems%%` | "Order Items" | +| `%%LNG_OrderStatus%%` | "Order Status" | +| `%%LNG_OrderStatusChanged%%` | "Order Status Changed" | +| `%%LNG_OrderStatusChangedDatePlaced%%` | "Date Placed" | +| `%%LNG_OrderStatusChangedIntro%%` | "An order you recently placed on our website has had its status changed." | +| `%%LNG_OrderStatusChangedOrderTotal%%` | "Order Total" | +| `%%LNG_OrderStatusChangedPaymentMethod%%` | "Payment Method" | +| `%%LNG_OrderSubtotal%%` | "Order Subtotal" | +| `%%LNG_OrderTotal%%` | "Order Total" | +| `%%LNG_OrderTrackingNoIs%%` | "The tracking number for this order is" | +| `%%LNG_Other%%` | "Other" | +| `%%LNG_OtherDetails%%` | "Other Details" | +| `%%LNG_Outstanding%%` | "outstanding" | +| `%%LNG_OutstandingOrderTotal%%` | "Your outstanding order total:" | +| `%%LNG_Password%%` | "Password" | +| `%%LNG_PasswordConfirm%%` | "Confirm Password" | +| `%%LNG_PayflowProCardHoldersName%%` | "Cardholder's Name" | +| `%%LNG_PayflowProCreditCardCCV2%%` | "Card Security Code" | +| `%%LNG_PayflowProCreditCardNo%%` | "Credit Card Number" | +| `%%LNG_PayflowProCreditCardNoHelp%%` | "Numbers only, no spaces or dashes." | +| `%%LNG_PayflowProEnterCardNumber%%` | "Please enter the card number only, no spaces or dashes." | +| `%%LNG_PayflowProEnterCreditCardMonth%%` | "You forgot to choose an expiry month." | +| `%%LNG_PayflowProEnterCreditCardYear%%` | "You forgot to choose an expiry year." | +| `%%LNG_PayflowProEnterCVV2Number%%` | "Please enter your credit card security code. This is usually the last three or four digits on the signature strip of your card." | +| `%%LNG_PayflowProEnterName%%` | "You forgot to enter the cardholder's name." | +| `%%LNG_PayflowProExpirationDate%%` | "Expiration Date" | +| `%%LNG_PayflowProPayForOrder%%` | "Pay for Order" | +| `%%LNG_PayflowProPaymentIntro%%` | "Complete the form below and then click the "Pay for Order" button to pay for your order." | +| `%%LNG_PayflowProProcessingError%%` | "Something went wrong when trying to process your payment. Please review the error message and try again:" | +| `%%LNG_PayflowProTotalAmount%%` | "Order Total" | +| `%%LNG_PayForYourOrderHelp%%` | "Once you've provided payment, your order will be completed." | +| `%%LNG_PayForYourOrderHelp%%` | "Once you've provided payment your order will be completed." | +| `%%LNG_PaymentMethod%%` | "Payment Method" | +| `%%LNG_PersonalDetails%%` | "Personal Details" | +| `%%LNG_Phone%%` | "Phone" | +| `%%LNG_PhoneNumber%%` | "Phone Number" | +| `%%LNG_PleaseAgreeGiftCertificateTerms%%` | "Please agree to the gift certificate terms." | +| `%%LNG_PleaseChooseAPaymentMethod%%` | "Please choose a payment method." | +| `%%LNG_PleaseChooseShippingProvider%%` | "Please choose a shipping method." | +| `%%LNG_PleaseSelectAProduct%%` | | +| `%%LNG_PopularProducts%%` | "Popular Products" | +| `%%LNG_PopularProductsFeed%%` | "Popular Products RSS Feed" | +| `%%LNG_PostedBy%%` | "Posted by" | +| `%%LNG_PostedOn%%` | "Posted on" | +| `%%LNG_PrepositionOn%%` | "on" | +| `%%LNG_Preview%%` | "Preview" | +| `%%LNG_Previous%%` | "Previous" | +| `%%LNG_PreviousImage%%` | "Previous" | +| `%%LNG_PreviousPage%%` | "Previous Page" | +| `%%LNG_Price%%` | "Price" | +| `%%LNG_PriceAsc%%` | "Price: Low to High" | +| `%%LNG_PriceDesc%%` | "Price: High to Low" | +| `%%LNG_PriceRange%%` | "Price Range" | +| `%%LNG_ProceedToPayment%%` | "Proceed to Payment" | +| `%%LNG_ProceedToPaymentContinue%%` | "Continue" | +| `%%LNG_ProdBin%%` | | +| `%%LNG_ProdName%%` | "Product Name" | +| `%%LNG_Product%%` | "Product" | +| `%%LNG_ProductAddToCartLink%%` | "Add To Cart" | +| `%%LNG_ProductChooseOptionLink%%` | "Choose Options" | +| `%%LNG_ProductComparison%%` | "Product Comparison" | +| `%%LNG_ProductComparisonIntro%%` | "Your product comparison is shown below. Click a product attribute in the left column to sort by that attribute." | +| `%%LNG_ProductDescription%%` | "Product Description" | +| `%%LNG_ProductDetails%%` | "Product Details" | +| `%%LNG_ProductMaxQty%%` | | +| `%%LNG_ProductMinQty%%` | | +| `%%LNG_ProductPreOrderCartLink%%` | "Pre-Order Now" | +| `%%LNG_ProductReviewEmailHeading%%` | | +| `%%LNG_ProductReviewEmailInstructions%%` | | +| `%%LNG_ProductReviewEmailSubheading%%` | | +| `%%LNG_ProductReviewEmailThanks%%` | | +| `%%LNG_ProductReviewEmailUnsubscribe%%` | | +| `%%LNG_ProductReviewEmailUnsubscribeSuffix%%` | | +| `%%LNG_ProductReviewLinkText%%` | | +| `%%LNG_Products%%` | "Products" | +| `%%LNG_ProductsByCategory%%` | "Categories" | +| `%%LNG_ProductTagCloud%%` | "Browse by Tag" | +| `%%LNG_ProductTagCloudIntro%%` | "The product tag cloud shows the different tags (keywords) associated with products. The bigger the tag appears, the more products it contains. Click on a tag to see all products listed under that tag." | +| `%%LNG_ProductVideos%%` | "Product Videos" | +| `%%LNG_ProductWarranty%%` | "Warranty Information" | +| `%%LNG_PublishedBy%%` | "Posted by" | +| `%%LNG_PurchaseGiftCertificate%%` | "Purchase a Gift Certificate" | +| `%%LNG_PurchaseGiftCertificates%%` | | +| `%%LNG_Qty%%` | | +| `%%LNG_Quantity%%` | "Quantity" | +| `%%LNG_QuantityFull%%` | "Quantity" | +| `%%LNG_QuestionMark%%` | "?" | +| `%%LNG_QuickViewBulkDiscountsLabel%%` | "Bulk Discounts" | +| `%%LNG_QuickViewViewDetailsText%%` | "View Details" | +| `%%LNG_Rate1Star%%` | "1 star (worst)" | +| `%%LNG_Rate2Stars%%` | "2 stars" | +| `%%LNG_Rate3Stars%%` | "3 stars (average)" | +| `%%LNG_Rate4Stars%%` | "4 stars" | +| `%%LNG_Rate5Stars%%` | "5 stars (best)" | +| `%%LNG_Rating%%` | "Rating" | +| `%%LNG_ReadMoreLink%%` | "Read More »" | +| `%%LNG_ReadReviews%%` | "Read Reviews" | +| `%%LNG_RecentBlogsFeed%%` | "Recent News RSS Feed" | +| `%%LNG_RecentlySubmittedReturnRequest%%` | | +| `%%LNG_RecentlyViewedItems%%` | "Your Recent Items" | +| `%%LNG_RecentlyViewedItemsDescription%%` | "See a list of items you've recently viewed at %s." | +| `%%LNG_RecentNews%%` | "Recent Updates" | +| `%%LNG_RecentPosts%%` | "Recent Posts" | +| `%%LNG_RedeemAGiftCertificate%%` | "Redeem a Gift Certificate" | +| `%%LNG_RedeemGiftCertificate%%` | "Redeem a Gift Certificate" | +| `%%LNG_RedeemGiftCertificate1%%` | "You need your unique gift certificate code, which is part of the gift certificate that was emailed to you as an attachment. It will look something like Z50-Y6K-COS-402." | +| `%%LNG_RedeemGiftCertificate2%%` | "Browse the store and add items to your cart as you normally would." | +| `%%LNG_RedeemGiftCertificate3%%` | "Click the '<a href='cart.php'>View Cart</a>' link to view the contents of your shopping cart." | +| `%%LNG_RedeemGiftCertificate4%%` | "Type your gift certificate code in to the 'Redeem Gift Certificate' box and click 'Go'." | +| `%%LNG_RedeemGiftCertificateAt%%` | "Redeem your gift certificate at" | +| `%%LNG_RedeemGiftCertificateIntro%%` | "To redeem a gift certificate at %s, follow the simple steps below." | +| `%%LNG_ReferenceNumber%%` | | +| `%%LNG_RegisterAnAccount%%` | "Register an account" | +| `%%LNG_RelatedProducts%%` | "Related Products" | +| `%%LNG_RelatedSearches%%` | "Related Searches" | +| `%%LNG_RemainingStoreCredit%%` | "Remaining store credit:" | +| `%%LNG_Remove%%` | "Remove" | +| `%%LNG_RemoveFromWishList%%` | "Remove Item" | +| `%%LNG_Reorder%%` | "Reorder" | +| `%%LNG_ReplyToYourOrderMessage%%` | | +| `%%LNG_ResponseCode%%` | | +| `%%LNG_ResponseMessage%%` | | +| `%%LNG_Return%%` | "Return" | +| `%%LNG_ReturnAction%%` | "Return Action" | +| `%%LNG_ReturnComments%%` | "Comments" | +| `%%LNG_ReturnedItem%%` | "Returned Item" | +| `%%LNG_ReturnInstructions%%` | "Return Instructions" | +| `%%LNG_ReturnItems%%` | "Return Items" | +| `%%LNG_ReturnOrderItems%%` | "Return Item(s)" | +| `%%LNG_ReturnQty%%` | "Qty. to Return" | +| `%%LNG_ReturnReason%%` | "Return Reason" | +| `%%LNG_ReturnRequests%%` | "Return Requests" | +| `%%LNG_ReturnRequestsDescription%%` | "View any outstanding return requests you've made for products you ordered from %s." | +| `%%LNG_ReturnRequestSubmitted%%` | "Your return request has been submitted successfully." | +| `%%LNG_ReturnStatusChangedTo%%` | | +| `%%LNG_ReturnSubmittedInfo%%` | "Your return request was submitted to %s for processing. When it has been processed you will receive an email with more details." | +| `%%LNG_ReturnToHomepage%%` | "Return to the home page" | +| `%%LNG_ReviewEmailHint%%` | "We promise to never spam you, and just use your email address to identify you as a valid customer." | +| `%%LNG_ReviewEnterYourEmail%%` | "Your email:" | +| `%%LNG_ReviewEnterYourName%%` | "Enter your name: (optional)" | +| `%%LNG_ReviewNoEmail%%` | "Please enter your email address." | +| `%%LNG_ReviewNoRating%%` | "Please select a rating." | +| `%%LNG_ReviewNoText%%` | "Please enter some text for your review." | +| `%%LNG_ReviewNoTitle%%` | "Please enter a title for your review." | +| `%%LNG_ReviewTheContentsOfYourOrder%%` | "Please review the contents of your order below and then choose how you'd like to pay for your order." | +| `%%LNG_SaleProducts%%` | "Products On Sale" | +| `%%LNG_Save%%` | "Save" | +| `%%LNG_SaveAddress%%` | "Save Address" | +| `%%LNG_SaveAddressInAddressBook%%` | "Save this address in my address book" | +| `%%LNG_SaveMyReview%%` | "Save My Review" | +| `%%LNG_SaveWishList%%` | "Save Wish List" | +| `%%LNG_Search%%` | "Search" | +| `%%LNG_SearchByPrice%%` | "Search by Price" | +| `%%LNG_SearchBySetting%%` | "Search by Setting" | +| `%%LNG_SearchDidNotMatchContent%%` | "did not match any news or information." | +| `%%LNG_SearchDidNotMatchProduct%%` | "did not match any products." | +| `%%LNG_SearchedForBrands%%` | "Did you mean to browse one of the following brands instead?" | +| `%%LNG_SearchedForCategories%%` | "Did you mean to browse one of the following categories instead?" | +| `%%LNG_SearchExamples%%` | "Examples:" | +| `%%LNG_SearchFeed%%` | "View Results as RSS Feed" | +| `%%LNG_SearchFilters%%` | "Search Filters" | +| `%%LNG_SearchFilters1%%` | "Search filters allow you to specify custom conditions in your search terms. It's similar to performing an advanced search however you do not have to visit the advanced search page first." | +| `%%LNG_SearchFilters2%%` | "Search filters should be appended to the end of your search terms. Multiple search filters can be separated by a space." | +| `%%LNG_SearchFilters3%%` | "Supported search filters are listed below." | +| `%%LNG_SearchFiltersFeatured%%` | "Return featured products only." | +| `%%LNG_SearchFiltersFreeShipping%%` | "Return products with free shipping." | +| `%%LNG_SearchFiltersInStock%%` | "Return products that are currently in stock." | +| `%%LNG_SearchFiltersPrice%%` | "Allows search results to be filtered by price." | +| `%%LNG_SearchFiltersRating%%` | "Allows search results to be filtered by rating." | +| `%%LNG_SearchKeyword%%` | "Search Keyword" | +| `%%LNG_SearchResultsTabContent%%` | "News & Information" | +| `%%LNG_SearchResultsTabProduct%%` | "Products" | +| `%%LNG_SearchSuggestion1%%` | "Make sure all words are spelled correctly." | +| `%%LNG_SearchSuggestion2%%` | "Try different keywords." | +| `%%LNG_SearchSuggestion3%%` | "Try more general keywords." | +| `%%LNG_SearchSuggestions%%` | "Suggestions" | +| `%%LNG_SearchTips%%` | "Search Tips" | +| `%%LNG_SearchTypeNewsItem%%` | "News Item" | +| `%%LNG_SearchTypeWebPage%%` | "Web Page" | +| `%%LNG_SearchYourSearch%%` | " Your search for" | +| `%%LNG_SecureCheckout%%` | "Secure Checkout" | +| `%%LNG_SeeAllBrands%%` | "See all brands" | +| `%%LNG_SelectAWishListToDelete%%` | "Please choose at least one wish list to delete." | +| `%%LNG_SelectItemsToReorder%%` | "Please select one or more items to reorder." | +| `%%LNG_SelectItemsToReturn%%` | "Which items do you want to return?" | +| `%%LNG_SelectOneMoreItemsReturn%%` | "Please select one or more items to return." | +| `%%LNG_SelectReturnReason%%` | "Please enter the reason you are returning these item(s)." | +| `%%LNG_SelectValidGiftCertificateAmount%%` | "Please choose a valid amount for this gift certificate." | +| `%%LNG_SelectValidGiftCertificateTheme%%` | "Please select a theme for your gift certificate." | +| `%%LNG_SendAMessage%%` | "Send a Message" | +| `%%LNG_SendForm%%` | "Send Form" | +| `%%LNG_SendMessage%%` | "Send Message" | +| `%%LNG_Shared%%` | "Shared" | +| `%%LNG_ShipAllItemsToDifferentAddresses%%` | "Ship items to different addresses" | +| `%%LNG_ShipAllItemsToOneAddress%%` | "Ship all items to the same address" | +| `%%LNG_ShipmentOrderDate%%` | | +| `%%LNG_ShipmentTrackingNumbersLinks%%` | | +| `%%LNG_ShippedItems%%` | | +| `%%LNG_ShippedTo%%` | "Shipped to" | +| `%%LNG_Shipping%%` | "Shipping" | +| `%%LNG_ShippingAddress%%` | "Shipping Address" | +| `%%LNG_ShippingDetails%%` | "Shipping Details" | +| `%%LNG_ShippingMethod%%` | "Shipping Method" | +| `%%LNG_ShippingMethodCombined%%` | "Multiple Shipping Methods" | +| `%%LNG_ShippingProvider%%` | "Choose a Shipping Method" | +| `%%LNG_ShipTo%%` | "Shipping Details" | +| `%%LNG_ShipToTheseAddresses%%` | "Ship to These Addresses" | +| `%%LNG_ShipToThisAddress%%` | "Ship to this address" | +| `%%LNG_ShopByPrice%%` | "Shop by Price" | +| `%%LNG_ShowingReviews%%` | "Showing reviews" | +| `%%LNG_ShowSearchForm%%` | "Show Search Form" | +| `%%LNG_SideCartTotalCost%%` | "Your sub total is <b>%s</b>." | +| `%%LNG_Sitemap%%` | "Sitemap" | +| `%%LNG_SitemapIntroduction%%` | "A sitemap lists all pages available on a website. The sitemap for web pages on `%%GLOBAL_StoreName%%` is shown below:" | +| `%%LNG_SitemapSeeAll%%` | "See All" | +| `%%LNG_Size%%` | "Maximum Size" | +| `%%LNG_SKU%%` | "SKU" | +| `%%LNG_SomethingWentWrong%%` | "Something Went Wrong..." | +| `%%LNG_SortBy%%` | "Sort by" | +| `%%LNG_SortByProductBrand%%` | "Sort products by brand" | +| `%%LNG_SortByProductName%%` | "Sort products by name" | +| `%%LNG_SortByProductPrice%%` | "Sort products by price" | +| `%%LNG_SortByProductRating%%` | "Sort products by average rating" | +| `%%LNG_StateProvince%%` | "State/Province" | +| `%%LNG_StatusOfReturnChanged%%` | | +| `%%LNG_StoreCredit%%` | "Store Credit" | +| `%%LNG_StoreCreditBalance%%` | "Your store credit balance:" | +| `%%LNG_SubmitNewReturn%%` | "Return Item(s) from Order #%s" | +| `%%LNG_SubmitReturn%%` | "Submit Return Request" | +| `%%LNG_Subtotal%%` | "Subtotal" | +| `%%LNG_SuggestiveCartIntro%%` | "We found some products that you might also be interested in." | +| `%%LNG_Summary%%` | "Summary" | +| `%%LNG_SyndicateFeaturedProducts%%` | "Featured Products" | +| `%%LNG_SyndicateFeaturedProductsAtom%%` | "Latest %s Featured Products (Atom)" | +| `%%LNG_SyndicateFeaturedProductsIntro%%` | "The featured products feed contains the latest %s featured products." | +| `%%LNG_SyndicateFeaturedProductsRSS%%` | "Latest %s Featured Products (RSS)" | +| `%%LNG_SyndicateIntro%%` | "RSS feeds are used for syndicating regularly changing content on a web site, including this one. You can open an RSS feed using an [RSS reader](https://en.wikipedia.org/wiki/RSS) and use it to see if there is any new content on this site or you can set up a server-side script to parse the feed and display it on your web site." | +| `%%LNG_SyndicateNewProducts%%` | "New Products" | +| `%%LNG_SyndicateNewProductsAtom%%` | "Latest %s New Products (Atom)" | +| `%%LNG_SyndicateNewProductsIntro%%` | "The latest products feed contains the latest %s products added to %s." | +| `%%LNG_SyndicateNewProductsRSS%%` | "Latest %s New Products (RSS)" | +| `%%LNG_SyndicateNews%%` | "Recent News" | +| `%%LNG_SyndicateNewsAtom%%` | "Latest %s News items (Atom)" | +| `%%LNG_SyndicateNewsIntro%%` | "The recent news feed contains the latest %s news items published on %s." | +| `%%LNG_SyndicateNewsRSS%%` | "Latest %s New Products (RSS)" | +| `%%LNG_SyndicatePopularProducts%%` | "Popular Products" | +| `%%LNG_SyndicatePopularProductsAtom%%` | "Latest %s Popular Products (Atom)" | +| `%%LNG_SyndicatePopularProductsIntro%%` | "The popular products feed contains the top %s most popular products on %s as rated by users." | +| `%%LNG_SyndicatePopularProductsRSS%%` | "Latest %s Popular Products (RSS)" | +| `%%LNG_SyndicateSearches%%` | "Product Searches" | +| `%%LNG_SyndicateSearchesIntro%%` | "Product search feeds allow you to save your custom product searches as syndication feed that will always update when there are new results." | +| `%%LNG_SyndicateSearchesIntro2%%` | "To create a product search feed, perform a standard search on %s and at the bottom of the page click on one of the syndication options." | +| `%%LNG_TermsAndConditions%%` | "Terms And Conditions" | +| `%%LNG_ThanksForRegisteringAt%%` | | +| `%%LNG_ThanksForRegisteringAtIntro%%` | | +| `%%LNG_ThanksForRegisteringEmailHelp%%` | | +| `%%LNG_ThanksForRegisteringEmailLogin%%` | | +| `%%LNG_ThanksForRegisteringEmailLogin%%` | | +| `%%LNG_ThanksForYourOrder%%` | | +| `%%LNG_ThisIsAnAutomatedMessage%%` | "*** This is an automated message, please do not reply ***" | +| `%%LNG_ThisOrderIsMarkedAs%%` | "This order is marked as" | +| `%%LNG_TickArgeeTermsAndConditions%%` | "Please agree to the terms and conditions by ticking the check box to place your order." | +| `%%LNG_To%%` | "to" | +| `%%LNG_Total%%` | "Total" | +| `%%LNG_ToYourWishList%%` | "to your wish list." | +| `%%LNG_TrackingLink%%` | "Tracking Link" | +| `%%LNG_TrackingNumber%%` | | +| `%%LNG_TransactionType%%` | | +| `%%LNG_TryAgain%%` | "Try again." | +| `%%LNG_Type%%` | "Type" | +| `%%LNG_units%%` | | +| `%%LNG_Update%%` | "Update" | +| `%%LNG_UpdateMyDetails%%` | "Update My Details" | +| `%%LNG_UpdateShippingCost%%` | "Update Shipping Cost" | +| `%%LNG_ValutecNumber%%` | | +| `%%LNG_VariationSoldOutMessage%%` | "The selected product combination is currently unavailable." | +| `%%LNG_ViewCart%%` | "View Cart" | +| `%%LNG_ViewEditCart%%` | "View or edit your cart" | +| `%%LNG_ViewMessages%%` | "View Messages" | +| `%%LNG_ViewMessagesDescription%%` | "You can receive and send messages to %s about your order. When a message is sent regarding one of your orders, you will receive an email notification." | +| `%%LNG_ViewOrder%%` | "View Order Details" | +| `%%LNG_ViewOrderStatusDescription%%` | "See the status of every order you've placed at %s, including whether it has been shipped, and if so an optional tracking number." | +| `%%LNG_ViewYourOrderStatus%%` | "View Order Status" | +| `%%LNG_Weight%%` | "Weight" | +| `%%LNG_WhatsThis%%` | "What's This?" | +| `%%LNG_WhyReturningItems%%` | "Why are you returning these items?" | +| `%%LNG_WishListCancel%%` | "Are you sure you want to cancel? Any unsaved changes will be lost." | +| `%%LNG_WishListDelete%%` | "Delete Selected" | +| `%%LNG_WishListName%%` | "Wish List Name" | +| `%%LNG_WishLists%%` | "Wish Lists" | +| `%%LNG_WishListsDescription%%` | "See a list of items in your wish list and optionally add each item to your shopping cart for purchase." | +| `%%LNG_WouldLikeToReceiveNewsletter%%` | "I'd like to receive your newsletter" | +| `%%LNG_WrapItemsDifferently%%` | "I'd like to gift wrap each item separately" | +| `%%LNG_WrapItemsTheSame%%` | "I'd like to wrap each of this item using the same wrapping options" | +| `%%LNG_WriteAHeadline%%` | "Write a headline for your review here:" | +| `%%LNG_WriteYourOwnReview%%` | "Write Your Own Review" | +| `%%LNG_WriteYourReview%%` | "Write your review here:" | +| `%%LNG_xOn%%` | "on" | +| `%%LNG_YesShareWishList%%` | "I want to be able to share this wish list" | +| `%%LNG_YouMayAlsoLike%%` | "You May Also Like..." | +| `%%LNG_YourAccount%%` | "My Account" | +| `%%LNG_YourAccountDetails%%` | "Your Account Details" | +| `%%LNG_YourAccountHelpIntro%%` | "From this page you can view your orders, update your account details and more. Choose an option from the menu on the right or learn more about each option below:" | +| `%%LNG_YourAddressBook%%` | "Your Address Book" | +| `%%LNG_YourCartContains%%` | "Your cart contains" | +| `%%LNG_YourComments%%` | "Your Comments" | +| `%%LNG_YouRecentlyViewed%%` | "You Recently Viewed..." | +| `%%LNG_YourOrder%%` | "Your Order" | +| `%%LNG_YourOrderContainsTheFollowingDownloadableItems%%` | | +| `%%LNG_YourOrderContainsTheFollowingItems%%` | | +| `%%LNG_YourOrderContainsTheFollowingItems2%%` | | +| `%%LNG_YourOrderDetailsBelow%%` | "Your order details are shown below." | +| `%%LNG_YourOrderIDIs%%` | | +| `%%LNG_YourOrderNumber%%` | | +| `%%LNG_YourOrders%%` | "Your Completed Orders" | +| `%%LNG_YourOrderTotal%%` | "Your order total cost:" | +| `%%LNG_YourOrderTotalIs%%` | "The outstanding balance of your order is" | +| `%%LNG_YourReturns%%` | "Your Return Requests" | +| `%%LNG_YourShoppingCart%%` | "Your Shopping Cart" | +| `%%LNG_ZipPostcode%%` | "Zip/Postcode" | diff --git a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx b/archive/storefront/blueprint/themes/product-filtering-toolkit.mdx similarity index 98% rename from docs/legacy/blueprint-themes/product-filtering-toolkit.mdx rename to archive/storefront/blueprint/themes/product-filtering-toolkit.mdx index 17ea9513f..f7f324757 100644 --- a/docs/legacy/blueprint-themes/product-filtering-toolkit.mdx +++ b/archive/storefront/blueprint/themes/product-filtering-toolkit.mdx @@ -1,101 +1,101 @@ -# Product Filtering Toolkit - -Product filtering (also known as faceted search) enables shoppers to refine product searches based on multiple attributes like price, size, ratings, etc. For a store owner's view of administering this feature, please see [product filtering settings (Help Center)](https://support.bigcommerce.com/s/article/Product-Filtering-Settings). - - -<Callout type="warning"> - #### Requirements/Restrictions - * Adding product filtering to a theme is recommended for experienced theme developers only. You must have facility with HTML and CSS, and must also familiarize yourself with how BigCommerce themes are structured and operate. - * Product filtering is a Pro/Enterprise feature. To enable it on an active public store, you must upgrade to a Pro or Enterprise plan. - * As noted below, we recommend implementing product filtering on a temporary sandbox store. You can create a trial store, and then upload your theme customizations to that store via WebDAV to replicate your local changes. -</Callout> - -## Creating a New Theme with Product Filtering - -Product filtering is fully functional in the Blueprint base theme. Once you’ve enabled [Developer Mode](#blueprint-and-developer-mode), you’ll be able to access this base theme and add product filtering to your developer store. - -<Callout type="warning"> - #### Restricted/Grandfathered Access to Blueprint Base Theme - The Blueprint base theme is now available only to stores that applied it before November 2016. -</Callout> - -As of that date, stores are being offered themes only from BigCommerce's new <a href="https://support.bigcommerce.com/articles/Public/The-Stencil-Theme-Platform" target="_blank">Stencil</a> theme platform. Within a store's control panel, the **Themes Marketplace** and **My Themes** pages will show only those Blueprint themes that have been applied to the store and/or purchased before November 2016. - -For information about developing on the current Stencil platform, please see <a href="https://developer.bigcommerce.com/docs/storefront/stencil" target="_blank">this developer documentation</a>. - -## Enabling Product Filtering for Your Customized Theme - -To enable product filtering, just enable [Developer Mode](#devmode) on your store. This will enable product filtering on your store by default, regardless of whether or not your theme and plan support it. - - -<Callout type="warning"> - #### Start with a Sandbox Store - Depending on the customizations you have made to your theme, enabling Developer Mode could have unexpected results. **We recommend** using a sandbox store (not your main store) when applying these changes for the first time. -</Callout> - -If you are working with a new store, product filtering might already work out-of-the-box for your theme. - -## Implementing Product Filtering in Your Theme - -Once you’ve enabled product filtering for your sandbox store, you’ll need to get the most up-to-date Blueprint files and copy them into your own theme. Here is how to do so. - -<Callout type="warning"> - #### Restricted/Grandfathered Access to Blueprint Base Theme - As noted above, the Blueprint base theme is now available only to stores that applied it before November 2016. -</Callout> - -1. Enable [Developer Mode](#devmode) in your sandbox store, if you haven’t already. This will enable the Blueprint theme and the faceted search feature. -2. Unless you’re starting from scratch, back up your theme customizations. -3. Select Blueprint as your store’s theme. -4. Download the Blueprint theme – don’t worry, you’ll only need certain files for faceted search. -5. Restore your theme from the backups you downloaded in step 2. -6. Upload the following files from Blueprint to your sandbox store: - - * `Panels/FacetedSearch.html` – This panel contains the markup for your Faceted Search column. It calls all the panels for each of the searchable facets as well. - * `Panels/FacetedSearchProductGrid.html` - This panel contains the markup for your list of product results when your category lists are set to "grid view". - * `Panels/FacetedSearchProductList.html` - This panel contains the markup for your list of product results when your category lists are set to "list view". - * `Panels/FacetedSearchTemplateCategory.html` – The panel that contains the markup for the Category facet. - * `Panels/FacetedSearchTemplateMultichoice.html` – The panel that contains the markup for any facet containing multiple-choice check boxes. - * `Panels/FacetedSearchTemplateRange.html` – The panel that contains the markup for facets containing ranges. - * `Panels/FacetedSearchTemplateRating.html` – The panel that contains the markup for the Rating facet. - * `Panels/FacetedSearchTemplateShowing.html` – The panel that contains the markup for the list of currently selected filters. - * `Panels/FacetedSearchTemplateSingle.html` – The panel that contains the markup for any facet containing single-choice radio buttons. - * `Panels/Pagination.html` – The panel that contains the markup for your pagination – note that this will not use any existing pagination panels that your theme may have. - * `Styles/faceted-search.css` – This will be included in `FacetedSearch.html`, so you don’t need to add it to your `HTMLHead.html` file. - -7. Copy your `brands.html` page and name it `brands_with_facets.html`. -8. Copy your `search.html` page and name it `search_with_facets.html`. -9. Copy your `category.html` page and name it `category_with_facets.html`. -10. Include the required assets on your new facets pages. You can use the facets pages from Blueprint for reference (the assets will be named the same): - - * `%%Panel.FacetedSearch%%` – This is the main Faceted Search panel, and will call the rest of the panels it needs accordingly (including required JavaScript and CSS). - * Add the `js-faceted-search-column` class to the container of your Faceted Search panel. - * If you have a responsive theme, you can add the `Refine` button to your page, which toggles the Faceted Search column on or off. By default, this button displays only on mobile:<br /> - `<button class="js-faceted-search-action btn"> %%LNG_FilterBy%% </button>` -11. If the pages mentioned above don’t exist, you can copy the existing pages from the Blueprint theme. Keep in mind that you’ll need to modify these pages to suit the structure of your theme. - -## Allowing For Filtering On/Off - -When faceted search is switched on, the following templates will be used: - -* Brand pages > `brands_with_facets.html` -* Search page > `search_with_facets.html` -* Category pages > `category_with_facets.html` - -When switched off: - -* Brand pages > `brands.html` -* Search page > `search.html` -* Category pages > `category.html` - -<Callout type="warning"> - #### Clone and Rename Templates, Don’t Alter Originals - Development agencies should not modify the _base_ templates of the `brand.html`, `search.html`, or `category.html` pages to include faceted search. Clients who are not on a Pro or Enterprise plan do not get faceted search, so if you include it on `category.html`, `brand.html` or `search.html` page, your theme will be useless to those clients. -</Callout> - - -## Category Filtering Details - -When you turn on product filtering for a store, it will automatically switch all `Category Layout File`s to your new `category_with_facets.html` page. To view product filtering on Category pages, you must ensure that the `Category Layout File` is set to `category_with_facets.html`. - -You will not see the Category filter on storefront Category pages. This has been hidden for SEO reasons. +# Product Filtering Toolkit + +Product filtering (also known as faceted search) enables shoppers to refine product searches based on multiple attributes like price, size, ratings, etc. For a store owner's view of administering this feature, please see [product filtering settings (Help Center)](https://support.bigcommerce.com/s/article/Product-Filtering-Settings). + + +<Callout type="warning"> + #### Requirements/Restrictions + * Adding product filtering to a theme is recommended for experienced theme developers only. You must have facility with HTML and CSS, and must also familiarize yourself with how BigCommerce themes are structured and operate. + * Product filtering is a Pro/Enterprise feature. To enable it on an active public store, you must upgrade to a Pro or Enterprise plan. + * As noted below, we recommend implementing product filtering on a temporary sandbox store. You can create a trial store, and then upload your theme customizations to that store via WebDAV to replicate your local changes. +</Callout> + +## Creating a New Theme with Product Filtering + +Product filtering is fully functional in the Blueprint base theme. Once you’ve enabled [Developer Mode](#blueprint-and-developer-mode), you’ll be able to access this base theme and add product filtering to your developer store. + +<Callout type="warning"> + #### Restricted/Grandfathered Access to Blueprint Base Theme + The Blueprint base theme is now available only to stores that applied it before November 2016. +</Callout> + +As of that date, stores are being offered themes only from BigCommerce's new <a href="https://support.bigcommerce.com/articles/Public/The-Stencil-Theme-Platform" target="_blank">Stencil</a> theme platform. Within a store's control panel, the **Themes Marketplace** and **My Themes** pages will show only those Blueprint themes that have been applied to the store and/or purchased before November 2016. + +For information about developing on the current Stencil platform, please see <a href="https://developer.bigcommerce.com/docs/storefront/stencil" target="_blank">this developer documentation</a>. + +## Enabling Product Filtering for Your Customized Theme + +To enable product filtering, just enable [Developer Mode](#devmode) on your store. This will enable product filtering on your store by default, regardless of whether or not your theme and plan support it. + + +<Callout type="warning"> + #### Start with a Sandbox Store + Depending on the customizations you have made to your theme, enabling Developer Mode could have unexpected results. **We recommend** using a sandbox store (not your main store) when applying these changes for the first time. +</Callout> + +If you are working with a new store, product filtering might already work out-of-the-box for your theme. + +## Implementing Product Filtering in Your Theme + +Once you’ve enabled product filtering for your sandbox store, you’ll need to get the most up-to-date Blueprint files and copy them into your own theme. Here is how to do so. + +<Callout type="warning"> + #### Restricted/Grandfathered Access to Blueprint Base Theme + As noted above, the Blueprint base theme is now available only to stores that applied it before November 2016. +</Callout> + +1. Enable [Developer Mode](#devmode) in your sandbox store, if you haven’t already. This will enable the Blueprint theme and the faceted search feature. +2. Unless you’re starting from scratch, back up your theme customizations. +3. Select Blueprint as your store’s theme. +4. Download the Blueprint theme – don’t worry, you’ll only need certain files for faceted search. +5. Restore your theme from the backups you downloaded in step 2. +6. Upload the following files from Blueprint to your sandbox store: + + * `Panels/FacetedSearch.html` – This panel contains the markup for your Faceted Search column. It calls all the panels for each of the searchable facets as well. + * `Panels/FacetedSearchProductGrid.html` - This panel contains the markup for your list of product results when your category lists are set to "grid view". + * `Panels/FacetedSearchProductList.html` - This panel contains the markup for your list of product results when your category lists are set to "list view". + * `Panels/FacetedSearchTemplateCategory.html` – The panel that contains the markup for the Category facet. + * `Panels/FacetedSearchTemplateMultichoice.html` – The panel that contains the markup for any facet containing multiple-choice check boxes. + * `Panels/FacetedSearchTemplateRange.html` – The panel that contains the markup for facets containing ranges. + * `Panels/FacetedSearchTemplateRating.html` – The panel that contains the markup for the Rating facet. + * `Panels/FacetedSearchTemplateShowing.html` – The panel that contains the markup for the list of currently selected filters. + * `Panels/FacetedSearchTemplateSingle.html` – The panel that contains the markup for any facet containing single-choice radio buttons. + * `Panels/Pagination.html` – The panel that contains the markup for your pagination – note that this will not use any existing pagination panels that your theme may have. + * `Styles/faceted-search.css` – This will be included in `FacetedSearch.html`, so you don’t need to add it to your `HTMLHead.html` file. + +7. Copy your `brands.html` page and name it `brands_with_facets.html`. +8. Copy your `search.html` page and name it `search_with_facets.html`. +9. Copy your `category.html` page and name it `category_with_facets.html`. +10. Include the required assets on your new facets pages. You can use the facets pages from Blueprint for reference (the assets will be named the same): + + * `%%Panel.FacetedSearch%%` – This is the main Faceted Search panel, and will call the rest of the panels it needs accordingly (including required JavaScript and CSS). + * Add the `js-faceted-search-column` class to the container of your Faceted Search panel. + * If you have a responsive theme, you can add the `Refine` button to your page, which toggles the Faceted Search column on or off. By default, this button displays only on mobile:<br /> + `<button class="js-faceted-search-action btn"> %%LNG_FilterBy%% </button>` +11. If the pages mentioned above don’t exist, you can copy the existing pages from the Blueprint theme. Keep in mind that you’ll need to modify these pages to suit the structure of your theme. + +## Allowing For Filtering On/Off + +When faceted search is switched on, the following templates will be used: + +* Brand pages > `brands_with_facets.html` +* Search page > `search_with_facets.html` +* Category pages > `category_with_facets.html` + +When switched off: + +* Brand pages > `brands.html` +* Search page > `search.html` +* Category pages > `category.html` + +<Callout type="warning"> + #### Clone and Rename Templates, Don’t Alter Originals + Development agencies should not modify the _base_ templates of the `brand.html`, `search.html`, or `category.html` pages to include faceted search. Clients who are not on a Pro or Enterprise plan do not get faceted search, so if you include it on `category.html`, `brand.html` or `search.html` page, your theme will be useless to those clients. +</Callout> + + +## Category Filtering Details + +When you turn on product filtering for a store, it will automatically switch all `Category Layout File`s to your new `category_with_facets.html` page. To view product filtering on Category pages, you must ensure that the `Category Layout File` is set to `category_with_facets.html`. + +You will not see the Category filter on storefront Category pages. This has been hidden for SEO reasons. diff --git a/docs/legacy/blueprint-themes/recaptcha-two.mdx b/archive/storefront/blueprint/themes/recaptcha-v2.mdx similarity index 97% rename from docs/legacy/blueprint-themes/recaptcha-two.mdx rename to archive/storefront/blueprint/themes/recaptcha-v2.mdx index 623acb546..7fcd0cae1 100644 --- a/docs/legacy/blueprint-themes/recaptcha-two.mdx +++ b/archive/storefront/blueprint/themes/recaptcha-v2.mdx @@ -1,94 +1,94 @@ -# ReCaptcha 2 - - - -To deter spam submission through storefront forms, BigCommerce now supports Google [reCAPTCHA v2](https://support.google.com/recaptcha/?hl=en#6080933) challenges, to distinguish human customers/visitors from automated bots. - -## Better Spam Deterrence - -We recommend that all storefront themes take advantage of this upgraded bot detection. However, BigCommerce's legacy Blueprint themes were last published in our Theme Marketplace before we implemented reCAPTCHA v2. Therefore, please use the following instructions to update your Blueprint-based theme with the best-available deterrent against automated spam. - -## How to Upgrade - -To incorporate reCAPTCHA v2, you will need to update script references in these three template files: - -* `Panels/CreateAccountForm.html` -* `page_contact_form.html` -* `product_comments.html` - - -<Callout type="warning"> - #### Updating Safely - Please back up each file before making any changes. -</Callout> - -The instructions below are based on the default Blueprint theme (Classic Next), as it was last published in BigCommerce’s Theme Marketplace. Therefore, the HTML markup will vary, based on customizations you have already made to this theme, or to other Marketplace themes. - - - -### Script Tag to Remove -Search each of the three template files for a ``<script>`` tag like the following. If you find it, delete the whole tag. (This script invokes a legacy reCAPTCHA v1 challenge:) - -```html filename="Script Tag to Remove" showLineNumbers copy -<script type="text/javascript"> - var RecaptchaOptions = { - theme : 'clean' or 'white' - }; - </script> -``` -### Variable to Remove - -Alternately, you might see the same `RecaptchaOptions` variable inside a different `<script>` tag at the top of the same three templates. If so, delete the lines shown here: - - -```js filename="Variable to Remove" showLineNumbers copy -var RecaptchaOptions = { - theme : 'clean' or 'white' -}; - -``` - -### reCAPTCHA Script to Update - -In each of the three template files, add the following script tag to the top of the page. - - -```html filename="Script Tag to Update" copy -<script src="https://www.google.com/recaptcha/api.js" async defer></script> -``` - -Then replace the "before" code block just below with the simplified "after" code that follows. - -#### Replace this (before): - -```html filename="Script Tag to Remove" showLineNumbers copy -<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=%%GLOBAL_ReCaptchaAPIKeyPublic%%"> -</script> - -<noscript> - <iframe src="https://www.google.com/recaptcha/api/noscript?k=%%GLOBAL_ReCaptchaAPIKeyPublic%%" height="300" width="500" frameborder="0"> - </iframe> - <br /> - <textarea name="recaptcha_challenge_field" rows="3" cols="40"> - </textarea> - <input type="hidden" name="recaptcha_response_field" value="manual_challenge"> -</noscript> -``` - -#### ...with this (after): - -```java filename="" copy -%%GLOBAL_ReCaptchaMarkup%% -``` - -## Supported Browsers - -Below are the browsers supported for the BigCommerce control panel. We drop support when a version falls below 2% of usage. The browsers are sorted by popularity, with the most popular browsers at the top. - -| Desktop | -|-| -| Chrome latest | -| Firefox latest | -| Safari latest | - -For a current list of target browsers (desktop and mobile) that BigCommerce supports for _storefronts_ using our themes, please see our [article on supported browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers?language=en_US). +# ReCaptcha 2 + + + +To deter spam submission through storefront forms, BigCommerce now supports Google [reCAPTCHA v2](https://support.google.com/recaptcha/?hl=en#6080933) challenges, to distinguish human customers/visitors from automated bots. + +## Better Spam Deterrence + +We recommend that all storefront themes take advantage of this upgraded bot detection. However, BigCommerce's legacy Blueprint themes were last published in our Theme Marketplace before we implemented reCAPTCHA v2. Therefore, please use the following instructions to update your Blueprint-based theme with the best-available deterrent against automated spam. + +## How to Upgrade + +To incorporate reCAPTCHA v2, you will need to update script references in these three template files: + +* `Panels/CreateAccountForm.html` +* `page_contact_form.html` +* `product_comments.html` + + +<Callout type="warning"> + #### Updating Safely + Please back up each file before making any changes. +</Callout> + +The instructions below are based on the default Blueprint theme (Classic Next), as it was last published in BigCommerce’s Theme Marketplace. Therefore, the HTML markup will vary, based on customizations you have already made to this theme, or to other Marketplace themes. + + + +### Script Tag to Remove +Search each of the three template files for a ``<script>`` tag like the following. If you find it, delete the whole tag. (This script invokes a legacy reCAPTCHA v1 challenge:) + +```html filename="Script Tag to Remove" showLineNumbers copy +<script type="text/javascript"> + var RecaptchaOptions = { + theme : 'clean' or 'white' + }; + </script> +``` +### Variable to Remove + +Alternately, you might see the same `RecaptchaOptions` variable inside a different `<script>` tag at the top of the same three templates. If so, delete the lines shown here: + + +```js filename="Variable to Remove" showLineNumbers copy +var RecaptchaOptions = { + theme : 'clean' or 'white' +}; + +``` + +### reCAPTCHA Script to Update + +In each of the three template files, add the following script tag to the top of the page. + + +```html filename="Script Tag to Update" copy +<script src="https://www.google.com/recaptcha/api.js" async defer></script> +``` + +Then replace the "before" code block just below with the simplified "after" code that follows. + +#### Replace this (before): + +```html filename="Script Tag to Remove" showLineNumbers copy +<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=%%GLOBAL_ReCaptchaAPIKeyPublic%%"> +</script> + +<noscript> + <iframe src="https://www.google.com/recaptcha/api/noscript?k=%%GLOBAL_ReCaptchaAPIKeyPublic%%" height="300" width="500" frameborder="0"> + </iframe> + <br /> + <textarea name="recaptcha_challenge_field" rows="3" cols="40"> + </textarea> + <input type="hidden" name="recaptcha_response_field" value="manual_challenge"> +</noscript> +``` + +#### ...with this (after): + +```java filename="" copy +%%GLOBAL_ReCaptchaMarkup%% +``` + +## Supported Browsers + +Below are the browsers supported for the BigCommerce control panel. We drop support when a version falls below 2% of usage. The browsers are sorted by popularity, with the most popular browsers at the top. + +| Desktop | +|-| +| Chrome latest | +| Firefox latest | +| Safari latest | + +For a current list of target browsers (desktop and mobile) that BigCommerce supports for _storefronts_ using our themes, please see our [article on supported browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers?language=en_US). diff --git a/docs/legacy/blueprint-themes/store-wide-global-panels.mdx b/archive/storefront/blueprint/themes/store-wide-global-panels.mdx similarity index 98% rename from docs/legacy/blueprint-themes/store-wide-global-panels.mdx rename to archive/storefront/blueprint/themes/store-wide-global-panels.mdx index fa4eabff4..842d20762 100644 --- a/docs/legacy/blueprint-themes/store-wide-global-panels.mdx +++ b/archive/storefront/blueprint/themes/store-wide-global-panels.mdx @@ -1,22 +1,22 @@ -# Store-Wide Global Panels - -The following panels are available store-wide: - -| Variable | Description | -|:---------|:------------| -| `HTMLHead` | Content shown between the `<head>` tags of each page. This includes code for visitor tracking, RSS feeds, etc. | -| `Header` | The header for each page in the store (includes the `TopMenu` and `HeaderSearch` panels) | -| `Footer` | The footer for each page in the store. | -| `SideCategoryList` | A list of categories shown in the store, to the category depth configured in the control panel. | -| `SideNewProducts` | A list of products recently added to the store. | -| `SideNewsletterBox` | The newsletter subscription form. | -| `SideShopByBrand` | A list of popular brands on the store (based on the number of products in each brand). | -| `SideProductRecentlyViewed` | A list of the products recently viewed by the current customer. | -| `SideTopSellers` | A list of top selling-products on the store (based purely on the number of times the product has sold on this store). | -| `SidePopularProducts` | A list of popular products on the store (by average rating). | -| `SideLiveChatServices` | Any live chat service code that has been integrated in to the store. | -| `SideCurrencySelector` | The store currency selection box, containing the list of currencies configured on the store. | -| `SideCartContents` | A list of items in currently in the customer's cart. | -| `TopMenu` | The top navigation menu (`Home`, `My Account`, `Sign In or Create Account`, etc.) | -| `PagesMenu` | A list of parent-level pages configured on the store. | -| `HeaderSearch` | The search box included at the top of each of the store's pages. | +# Store-Wide Global Panels + +The following panels are available store-wide: + +| Variable | Description | +|:---------|:------------| +| `HTMLHead` | Content shown between the `<head>` tags of each page. This includes code for visitor tracking, RSS feeds, etc. | +| `Header` | The header for each page in the store (includes the `TopMenu` and `HeaderSearch` panels) | +| `Footer` | The footer for each page in the store. | +| `SideCategoryList` | A list of categories shown in the store, to the category depth configured in the control panel. | +| `SideNewProducts` | A list of products recently added to the store. | +| `SideNewsletterBox` | The newsletter subscription form. | +| `SideShopByBrand` | A list of popular brands on the store (based on the number of products in each brand). | +| `SideProductRecentlyViewed` | A list of the products recently viewed by the current customer. | +| `SideTopSellers` | A list of top selling-products on the store (based purely on the number of times the product has sold on this store). | +| `SidePopularProducts` | A list of popular products on the store (by average rating). | +| `SideLiveChatServices` | Any live chat service code that has been integrated in to the store. | +| `SideCurrencySelector` | The store currency selection box, containing the list of currencies configured on the store. | +| `SideCartContents` | A list of items in currently in the customer's cart. | +| `TopMenu` | The top navigation menu (`Home`, `My Account`, `Sign In or Create Account`, etc.) | +| `PagesMenu` | A list of parent-level pages configured on the store. | +| `HeaderSearch` | The search box included at the top of each of the store's pages. | diff --git a/docs/legacy/blueprint-themes/store-wide-global-variables.mdx b/archive/storefront/blueprint/themes/store-wide-global-variables.mdx similarity index 98% rename from docs/legacy/blueprint-themes/store-wide-global-variables.mdx rename to archive/storefront/blueprint/themes/store-wide-global-variables.mdx index b34be32f9..e57ec7fd0 100644 --- a/docs/legacy/blueprint-themes/store-wide-global-variables.mdx +++ b/archive/storefront/blueprint/themes/store-wide-global-variables.mdx @@ -1,47 +1,47 @@ -# Store-Wide Global Variables - -The following GLOBAL variables are available from any layout, panel, or snippet in the store, independent of session status: - -| Variable | Description | -|:---------|:------------| -| `%%GLOBAL_AllPricesAreInCurrency%%` | This variable produces a text string that identifies the currency currently active on the store. For example: <nobr>`All Prices are in USD`</nobr> | -| `%%GLOBAL_AlternateClass%%` | . | -| `%%GLOBAL_CdnAppPath%%` | The URI of the CDN application. | -| `%%GLOBAL_CdnStorePath%%` | The URI to the store's CDN directory. | -| `%%GLOBAL_CharacterSet%%` | The character set currently active on the store. For example, UTF-8. | -| `%%GLOBAL_CheckoutLink%%` | The URI that initiates a checkout sequence. | -| `%%GLOBAL_CurrentCustomerFirstName%%` | The first name of the customer who is currently logged in. If no customer is logged in, returns: `Guest` | -| `%%GLOBAL_CurrentCustomerLastName%%` | The last name of the customer who is currently logged in. If no customer is logged in, returns no content. | -| `%%GLOBAL_CustomerGroupId%%` | The ID of the customer group for the currently logged-in user or guest. Blank if none. | -| `%%GLOBAL_CustomerGroupName%%` | The name of the customer group for the currently logged-in user or guest. Blank if none. | -| `%%GLOBAL_Favicon%%` | The URI location of the favicon file. | -| `%%GLOBAL_HeaderLogo%%` | The store's logo. This can be either an image file or an HTML-formatted text string. | -| `%%GLOBAL_ImageDirectory%%` | The name of the images directory. | -| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site's image files reside. | -| `%%GLOBAL_jQueryPath%%` | The URI of the minified jQuery library in use. For example:<br />`https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js` | -| `%%GLOBAL_jQueryUIPath%%` | The path to the jQuery UI script. For example:<br /> `https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.js` | -| `%%GLOBAL_LiveChatCodeEnabled%%` | A value representing whether Live Chat is enabled or disabled. For example: `none` | -| `%%GLOBAL_LoginOrLogoutText%%` | The HTML code of the string (including links) providing the option to sign into the store or to log out. For example: <nobr>`Sign in or Create an account`</nobr> | -| `%%GLOBAL_LogoText%%` | The text string used for the store logo. | -| `%%GLOBAL_MASTER_THEME_PATH%%` | The URI of the __master theme directory. | -| `%%GLOBAL_PageLink%%` | The URI of the page. | -| `%%GLOBAL_PageName%%` | The name of the page. For example: <nobr>`RSS Syndication`</nobr> | -| `%%GLOBAL_PoweredBy%%` | The string identifying the software used by the store. For example: `Shopping Cart Software by BigCommerce` | -| `%%GLOBAL_SHARED_GIFT_THEME_PATH%%` | The CDN URI of the store's gift themes. | -| `%%GLOBAL_ShopPath%%` | The store's URI. If the page is protected with TLS/SSL, this will be an HTTPS path. | -| `%%GLOBAL_ShopPathNormal%%` | The unencrypted URI of the store, prefixed with HTTP. | -| `%%GLOBAL_ShopPathSSL%%` | The encrypted URI of the store, prefixed with HTTPS. | -| `%%GLOBAL_ShowCookieWarningMessage%%` | A boolean value that represents whether or not the display of a cookie warning message is enabled or disabled. | -| `%%GLOBAL_SiteColor%%` | The current template's active color scheme. | -| `%%GLOBAL_SitemapURL_HTML%%` | The URI to the store's site map directory. | -| `%%GLOBAL_SocialMedia_Service_Class%%` | The name of the social media class. For example: `#FFFFFF` | -| `%%GLOBAL_SocialMedia_Service_Url%%` | The URI to the social media service. | -| `%%GLOBAL_SocialMediaService_Name%%` | The name of the social media service. For example: `LinkedIn` | -| `%%GLOBAL_StoreLogo%%` | The file name of the store logo image. | -| `%%GLOBAL_StoreName%%` | The name of the store. | -| `%%GLOBAL_StorePhoneNumber%%` | The phone number of the store. | -| `%%GLOBAL_STYLE_PATH%%` | The CDN URI of the active theme's styles directory. | -| `%%GLOBAL_SwapFrequency%%` | . | -| `%%GLOBAL_TPL_PATH%%` | The CDN URI of the theme. | -| `%%GLOBAL_value%%` | The type of value. For example: `Array` | -| `%%GLOBAL_Year%%` | The current year. For example: `2015` | +# Store-Wide Global Variables + +The following GLOBAL variables are available from any layout, panel, or snippet in the store, independent of session status: + +| Variable | Description | +|:---------|:------------| +| `%%GLOBAL_AllPricesAreInCurrency%%` | This variable produces a text string that identifies the currency currently active on the store. For example: <nobr>`All Prices are in USD`</nobr> | +| `%%GLOBAL_AlternateClass%%` | . | +| `%%GLOBAL_CdnAppPath%%` | The URI of the CDN application. | +| `%%GLOBAL_CdnStorePath%%` | The URI to the store's CDN directory. | +| `%%GLOBAL_CharacterSet%%` | The character set currently active on the store. For example, UTF-8. | +| `%%GLOBAL_CheckoutLink%%` | The URI that initiates a checkout sequence. | +| `%%GLOBAL_CurrentCustomerFirstName%%` | The first name of the customer who is currently logged in. If no customer is logged in, returns: `Guest` | +| `%%GLOBAL_CurrentCustomerLastName%%` | The last name of the customer who is currently logged in. If no customer is logged in, returns no content. | +| `%%GLOBAL_CustomerGroupId%%` | The ID of the customer group for the currently logged-in user or guest. Blank if none. | +| `%%GLOBAL_CustomerGroupName%%` | The name of the customer group for the currently logged-in user or guest. Blank if none. | +| `%%GLOBAL_Favicon%%` | The URI location of the favicon file. | +| `%%GLOBAL_HeaderLogo%%` | The store's logo. This can be either an image file or an HTML-formatted text string. | +| `%%GLOBAL_ImageDirectory%%` | The name of the images directory. | +| `%%GLOBAL_IMG_PATH%%` | The URI of the directory in which the site's image files reside. | +| `%%GLOBAL_jQueryPath%%` | The URI of the minified jQuery library in use. For example:<br />`https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js` | +| `%%GLOBAL_jQueryUIPath%%` | The path to the jQuery UI script. For example:<br /> `https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.js` | +| `%%GLOBAL_LiveChatCodeEnabled%%` | A value representing whether Live Chat is enabled or disabled. For example: `none` | +| `%%GLOBAL_LoginOrLogoutText%%` | The HTML code of the string (including links) providing the option to sign into the store or to log out. For example: <nobr>`Sign in or Create an account`</nobr> | +| `%%GLOBAL_LogoText%%` | The text string used for the store logo. | +| `%%GLOBAL_MASTER_THEME_PATH%%` | The URI of the __master theme directory. | +| `%%GLOBAL_PageLink%%` | The URI of the page. | +| `%%GLOBAL_PageName%%` | The name of the page. For example: <nobr>`RSS Syndication`</nobr> | +| `%%GLOBAL_PoweredBy%%` | The string identifying the software used by the store. For example: `Shopping Cart Software by BigCommerce` | +| `%%GLOBAL_SHARED_GIFT_THEME_PATH%%` | The CDN URI of the store's gift themes. | +| `%%GLOBAL_ShopPath%%` | The store's URI. If the page is protected with TLS/SSL, this will be an HTTPS path. | +| `%%GLOBAL_ShopPathNormal%%` | The unencrypted URI of the store, prefixed with HTTP. | +| `%%GLOBAL_ShopPathSSL%%` | The encrypted URI of the store, prefixed with HTTPS. | +| `%%GLOBAL_ShowCookieWarningMessage%%` | A boolean value that represents whether or not the display of a cookie warning message is enabled or disabled. | +| `%%GLOBAL_SiteColor%%` | The current template's active color scheme. | +| `%%GLOBAL_SitemapURL_HTML%%` | The URI to the store's site map directory. | +| `%%GLOBAL_SocialMedia_Service_Class%%` | The name of the social media class. For example: `#FFFFFF` | +| `%%GLOBAL_SocialMedia_Service_Url%%` | The URI to the social media service. | +| `%%GLOBAL_SocialMediaService_Name%%` | The name of the social media service. For example: `LinkedIn` | +| `%%GLOBAL_StoreLogo%%` | The file name of the store logo image. | +| `%%GLOBAL_StoreName%%` | The name of the store. | +| `%%GLOBAL_StorePhoneNumber%%` | The phone number of the store. | +| `%%GLOBAL_STYLE_PATH%%` | The CDN URI of the active theme's styles directory. | +| `%%GLOBAL_SwapFrequency%%` | . | +| `%%GLOBAL_TPL_PATH%%` | The CDN URI of the theme. | +| `%%GLOBAL_value%%` | The type of value. For example: `Array` | +| `%%GLOBAL_Year%%` | The current year. For example: `2015` | diff --git a/docs/legacy/blueprint-themes/style-editor.mdx b/archive/storefront/blueprint/themes/style-editor.mdx similarity index 98% rename from docs/legacy/blueprint-themes/style-editor.mdx rename to archive/storefront/blueprint/themes/style-editor.mdx index 933258b0c..3921d9f64 100644 --- a/docs/legacy/blueprint-themes/style-editor.mdx +++ b/archive/storefront/blueprint/themes/style-editor.mdx @@ -1,134 +1,134 @@ -# Style Editor - - - -Style Editor allows users to customize the look and feel of their BigCommerce store, without needing to know HTML or CSS conventions. Using a simple WYSIWYG interface, users can edit colors and fonts, then see the changes simultaneously in a live preview. - -Style Editor uses Less.js as a CSS preprocessor. This allows Style Editor to take advantage of variables and other functions to ensure design consistency. - -## What Is Less.js? - -Less (formally, Less.js) is a CSS preprocessor that allows theme designers to use advanced functions and programming principles in their CSS. A JavaScript compiler runs over the Less files, and converts them into usable CSS that can be included in themes. - -For more information on examples, techniques, and how to install Less, please see [lesscss.org](http://lesscss.org/). - -## Integrating a Theme with the Style Editor - -The Style Editor uses a specific group of files to build its user interface, and to compile and generate the stylesheet. BigCommerce’s base developer theme, Blueprint, already contains these out-of-the-box. The files are stored in the `Styles/less` directory. - -The Style Editor depends on these files: - -* `style-editor-variables.less` -* `internal-variables.less` -* `init.less` -* `theme.less` - -### style-editor-variables.less - -Style Editor uses this file to generate its user interface. Here, you can enter variables for colours, fonts and numbers that will help the merchant customize the design of the theme. You can separate these variables out into sections with headings to help categorize the variables in a logical manner. No actual CSS is written in this file. - -There are some syntax patterns involved that Style Editor will understand to help you customize the UI. Special syntax: - -`@color-your-text-here` — This is the naming convention for a color variable. The style editor will generate this as a color picker, with the value of the variable set as the color picker’s default hexadecimal color value. - -For example: - -```css filename="" copy -@color-header-background: #FFFFFF; -``` - -This will generate a color picker with the label “Header Background”, set to #FFFFFF (white) by default. - -`@font-your-text-here` — This is the naming convention for a font variable. The style editor will generate this as a dropdown, preloaded with your theme’s predefined fonts. The variable’s value will be preselected. - -For example: - -```css filename="" copy -@font-page-text: "Open Sans",Helvetica,Arial,sans-serif; -``` - -This will generate a dropdown with the label “Page Text”, and with the “Open Sans” font preselected. The dropdown’s other options will be the predefined list of fonts you’ve provided. - -`@font-declaration` — This variable will store all the default fonts (and their fallbacks) for the style editor. It will use these fonts in the font dropdown mentioned in the above point. - -For example: - -```css filename="" copy -@font-declaration: '{ "Lato":["Lato", "Arial", "sans-serif"], "Freckle Face":["Freckle Face", "cursive"]}'; -``` - -This will populate all font drop-downs with the fonts “Lato” and “Freckle Face,” and if one of them is selected, the fonts for that variable will be set to the values in the corresponding array of fonts. For example, “Lato” will set the fonts to “Lato”, Arial, sans-serif. - -To use these fonts in the Style Editor, they must be included in the style editor variables file through an import. For the above example, you would include the styles from Google Fonts like so: - -```css filename="" copy -@import url(//fonts.googleapis.com/css?family=Lato|Freckle+Face); -``` -`@color-declaration` — This variable will store all the default colors for the style editor. It will list these colours in the color picker’s palette after all the color picker’s defaults. - -For example: - -```css filename="" copy -@color-declaration: '["#FF7700, #9966CC" ]'; -``` - -This will add a shade of orange and a shade of purple to the end of the list of colors selectable in the color picker. - -`//! @section: your text here` — You can group variables into sections with headings using this syntax to help your users read and understand your variables more easily. - -For example: - -`//! @section: Header` -`@color-header-background: #FFF;` -`//! @endsection` of - -This will create a section in the left navigation with the title “Header”, which will house the “Header Background” variable. - -More information on syntax, and examples, can be found in the comments of the style-editor-variables.less file found in Blueprint. - -### internal-variables.less - -This file is for you to store the variables that you may need to use, but don’t want the Style editor to see. For example, you can use it to create a hierarchy within your Less file, so that: - -* The user sets a value to `@color-store-name;` -* in internal-variables.less, `@main-accent: @color-store-name;` -* in init.less, we set a:hover `{color: @main-accent};` - -In this example, the link hover color will be set to whatever the store name color is. We can add as many selectors as we want to this css statement, depending on our design. - -This way, we can reuse the color that gets set to `@color-store-name` as the color for elements that we may not want to be edited in the Style Editor, but will now carry on the colour of the store name to create consistency within your design. - -### init.less - -This is where you initialize the use of the variables. This file contains all the CSS that will be compiled and generated into the theme.css file. For example, the @color-store-name can now be applied to the `#HeaderLogo h1` element by saying: - -```css filename="" showLineNumbers -#HeaderLogo h1 { -color: @color-store-name -} -``` -### theme.less - -The file that ultimately gets compiled into `theme.css`. This just uses `@import` to include the other three Less files for compilation. The Style Editor will read this file for instructions on how to compile your styles using Less. - -Compiling your Less files - -Once you have finished working on your `.less` files, _don’t forget to compile them!_ If you are using the command line, you should be doing something similar to: - -```less filename="" copy -lessc Styles/less/theme.less > Styles/theme.css -``` -This will use the `theme.less` file to generate the `theme.css` file into your theme's `Styles/` folder. - -If you find that you have to make a change to `theme.css`, please don't forget to replicate this change in `theme.less` (but more preferably, in `init.less`). Otherwise, every time you recompile the less files, this change will be overwritten. - -Less offers a variety of compilation methods, including applications for both Windows and Mac that you can use if you prefer not to use the command prompt/terminal. - -## Testing Style Editor with Your Theme - -If you'd like to add Style Editor support to your theme, you can enable the Style Editor on just your store. Simply log in to the control panel and place `/index.php?ToDo=viewTemplates&dev=enable` after `/admin`. - -(For example: <nobr>`https://store-123abmy.mybigcommerce.com/admin/index.php?ToDo=viewTemplates&dev=enable`</nobr>) - - -This will enable [Developer Mode](#) for your store, which also enables Blueprint and other features for theme developers. You can [use Blueprint](#) as a basis for creating new themes. +# Style Editor + + + +Style Editor allows users to customize the look and feel of their BigCommerce store, without needing to know HTML or CSS conventions. Using a simple WYSIWYG interface, users can edit colors and fonts, then see the changes simultaneously in a live preview. + +Style Editor uses Less.js as a CSS preprocessor. This allows Style Editor to take advantage of variables and other functions to ensure design consistency. + +## What Is Less.js? + +Less (formally, Less.js) is a CSS preprocessor that allows theme designers to use advanced functions and programming principles in their CSS. A JavaScript compiler runs over the Less files, and converts them into usable CSS that can be included in themes. + +For more information on examples, techniques, and how to install Less, please see [lesscss.org](http://lesscss.org/). + +## Integrating a Theme with the Style Editor + +The Style Editor uses a specific group of files to build its user interface, and to compile and generate the stylesheet. BigCommerce’s base developer theme, Blueprint, already contains these out-of-the-box. The files are stored in the `Styles/less` directory. + +The Style Editor depends on these files: + +* `style-editor-variables.less` +* `internal-variables.less` +* `init.less` +* `theme.less` + +### style-editor-variables.less + +Style Editor uses this file to generate its user interface. Here, you can enter variables for colours, fonts and numbers that will help the merchant customize the design of the theme. You can separate these variables out into sections with headings to help categorize the variables in a logical manner. No actual CSS is written in this file. + +There are some syntax patterns involved that Style Editor will understand to help you customize the UI. Special syntax: + +`@color-your-text-here` — This is the naming convention for a color variable. The style editor will generate this as a color picker, with the value of the variable set as the color picker’s default hexadecimal color value. + +For example: + +```css filename="" copy +@color-header-background: #FFFFFF; +``` + +This will generate a color picker with the label “Header Background”, set to #FFFFFF (white) by default. + +`@font-your-text-here` — This is the naming convention for a font variable. The style editor will generate this as a dropdown, preloaded with your theme’s predefined fonts. The variable’s value will be preselected. + +For example: + +```css filename="" copy +@font-page-text: "Open Sans",Helvetica,Arial,sans-serif; +``` + +This will generate a dropdown with the label “Page Text”, and with the “Open Sans” font preselected. The dropdown’s other options will be the predefined list of fonts you’ve provided. + +`@font-declaration` — This variable will store all the default fonts (and their fallbacks) for the style editor. It will use these fonts in the font dropdown mentioned in the above point. + +For example: + +```css filename="" copy +@font-declaration: '{ "Lato":["Lato", "Arial", "sans-serif"], "Freckle Face":["Freckle Face", "cursive"]}'; +``` + +This will populate all font drop-downs with the fonts “Lato” and “Freckle Face,” and if one of them is selected, the fonts for that variable will be set to the values in the corresponding array of fonts. For example, “Lato” will set the fonts to “Lato”, Arial, sans-serif. + +To use these fonts in the Style Editor, they must be included in the style editor variables file through an import. For the above example, you would include the styles from Google Fonts like so: + +```css filename="" copy +@import url(//fonts.googleapis.com/css?family=Lato|Freckle+Face); +``` +`@color-declaration` — This variable will store all the default colors for the style editor. It will list these colours in the color picker’s palette after all the color picker’s defaults. + +For example: + +```css filename="" copy +@color-declaration: '["#FF7700, #9966CC" ]'; +``` + +This will add a shade of orange and a shade of purple to the end of the list of colors selectable in the color picker. + +`//! @section: your text here` — You can group variables into sections with headings using this syntax to help your users read and understand your variables more easily. + +For example: + +`//! @section: Header` +`@color-header-background: #FFF;` +`//! @endsection` of + +This will create a section in the left navigation with the title “Header”, which will house the “Header Background” variable. + +More information on syntax, and examples, can be found in the comments of the style-editor-variables.less file found in Blueprint. + +### internal-variables.less + +This file is for you to store the variables that you may need to use, but don’t want the Style editor to see. For example, you can use it to create a hierarchy within your Less file, so that: + +* The user sets a value to `@color-store-name;` +* in internal-variables.less, `@main-accent: @color-store-name;` +* in init.less, we set a:hover `{color: @main-accent};` + +In this example, the link hover color will be set to whatever the store name color is. We can add as many selectors as we want to this css statement, depending on our design. + +This way, we can reuse the color that gets set to `@color-store-name` as the color for elements that we may not want to be edited in the Style Editor, but will now carry on the colour of the store name to create consistency within your design. + +### init.less + +This is where you initialize the use of the variables. This file contains all the CSS that will be compiled and generated into the theme.css file. For example, the @color-store-name can now be applied to the `#HeaderLogo h1` element by saying: + +```css filename="" showLineNumbers +#HeaderLogo h1 { +color: @color-store-name +} +``` +### theme.less + +The file that ultimately gets compiled into `theme.css`. This just uses `@import` to include the other three Less files for compilation. The Style Editor will read this file for instructions on how to compile your styles using Less. + +Compiling your Less files + +Once you have finished working on your `.less` files, _don’t forget to compile them!_ If you are using the command line, you should be doing something similar to: + +```less filename="" copy +lessc Styles/less/theme.less > Styles/theme.css +``` +This will use the `theme.less` file to generate the `theme.css` file into your theme's `Styles/` folder. + +If you find that you have to make a change to `theme.css`, please don't forget to replicate this change in `theme.less` (but more preferably, in `init.less`). Otherwise, every time you recompile the less files, this change will be overwritten. + +Less offers a variety of compilation methods, including applications for both Windows and Mac that you can use if you prefer not to use the command prompt/terminal. + +## Testing Style Editor with Your Theme + +If you'd like to add Style Editor support to your theme, you can enable the Style Editor on just your store. Simply log in to the control panel and place `/index.php?ToDo=viewTemplates&dev=enable` after `/admin`. + +(For example: <nobr>`https://store-123abmy.mybigcommerce.com/admin/index.php?ToDo=viewTemplates&dev=enable`</nobr>) + + +This will enable [Developer Mode](#) for your store, which also enables Blueprint and other features for theme developers. You can [use Blueprint](#) as a basis for creating new themes. diff --git a/docs/legacy/blueprint-themes/blueprint-template-syntax.mdx b/archive/storefront/blueprint/themes/template-syntax.mdx similarity index 97% rename from docs/legacy/blueprint-themes/blueprint-template-syntax.mdx rename to archive/storefront/blueprint/themes/template-syntax.mdx index 7c7e4155a..375582098 100644 --- a/docs/legacy/blueprint-themes/blueprint-template-syntax.mdx +++ b/archive/storefront/blueprint/themes/template-syntax.mdx @@ -1,139 +1,139 @@ -# Template Syntax - - - -Each of the layout, panel, and snippet files in a theme uses variables (also called placeholders) to show external content or content fetched from the database (such as the name of a product). - -Template variables are enclosed within `%%` markers. These types of variables are available for use in templates: global variables, string variables, panel references, snippet references, and file includes. - -## Global-Variables References - -Global variables are used to render dynamic content into a template. Global variables are referenced using the following syntax: - -``` -%%GLOBAL_[placeholder_name]%% -``` - -For example: - -``` -%%GLOBAL_ProductName%% -``` - -Specific variables' availability depends on the layout template that you're editing. For example, the variable for a product's description is available on the product details page, but not on the category view/product listing page. - -## Panel References - -Panels are the different blocks used by BigCommerce to build a page. Panels are referenced both inside layout files and inside other panel files. - -Panels are referenced in templates as follows, where `[panel_name]` is a placeholder for the name of a file in the theme’s Panels directory: - - -``` -%%Panel.[panel_name]%% -``` - -For example: - - -``` -%%Panel.HomeFeaturedProducts%% -``` - -This panel reference will load in the content from the `Panels/HomeFeaturedProducts.html` panel file. - -## Snippet References - -Snippets are templates containing HTML, which you can use multiple times on one page – either by using them in different parts of the template, or by including them a loop. For example, a loop might build a list of products on the page, with each product in the list being a repeated version of the same snippet. - -Snippets are referenced in templates as follows: - -``` -%%SNIPPET_[snippet_name]%% -``` - -In most cases, this will correspond to a similarly named file in the theme’s Snippets directory. For example: - -``` -%%SNIPPET_HomeFeaturedProducts%% -``` - -This snippet reference will contain repeated copies of `Snippets/HomeFeaturedProductsItem.html`, one for each featured product to be shown in the list. - -## Referencing Distributed Theme Assets - -After the Blueprint framework was first released, BigCommerce added the ability to reference theme assets that are stored remotely on a CDN (content delivery network). This section provides examples that map first-generation Blueprint syntax to updated syntax for distributed assets. - -You can use WebDAV to upload your own custom theme assets (JavaScripts, stylesheets, images, fonts, etc). In your HTML, reference these assets that aren’t present in the base theme using the `ASSET` syntax: - -``` -%%ASSET_[path_to_asset]%% -``` - -This syntax will output an absolute URL like: - -``` -http://cdn-host/templates/__custom/path_to_asset?t=timestamp -``` - -This loads the custom asset from our CDN server, and includes a cache-busting querystring. - -For example: - -``` -%%ASSET_Styles/myownstyle.css%% -``` - -...will be output as: - -``` -http://cdn-host/templates/__custom/Styles/myonwstyle.css?t=123 -``` - -#### Syntax Examples - -The following tables map earlier to current syntax: - -##### Assets in CSS Files - -| Previous Syntax | Updated Syntax (CDN) | -|--|-| -| `url(/template/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | -| `url(/templates/__custom/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | -| `url(/template/foo/bar/font.woff)` | `url(%%ASSET_foo/bar/font.woff%%)` | -| `url(../images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | -| `url(icons/foo.ico)` | `url(%%ASSET_Styles/icons/foo.ico%%)` | -| `url(//mystore.com/template/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | - -##### Assets in HTML Files - -| Previous Syntax | Updated Syntax (CDN) | -|-|-| -| `<img src="../images/foo.jpg" />` | `<img src="%%ASSET_images/foo.jpg%%" />` | -| `<img src="//mystore.com/template/images/foo.jpg">` | `<img src="%%ASSET_images/foo.jpg%%" />` | -| `<link href="/template/Styles/foo.css" />` | `<link href="%%ASSET_Styles/foo.css%%" />` | -| `<script src="/template/js/foo.js%%"></script>` | `<script src="%%ASSET_js/foo.js%%"></script>` | - -##### Assets Outside of the /template/ Directory - -The `ASSET` variable can be used only with files and folders inside the `/template/` directory. To take advantage of a CDN's benefits, we strongly recommend moving your assets to the `/template/` directory. However, if you need to keep assets outside of the `/template/` directory, the best practice is to use _protocol-relative_, absolute or fully qualified, URLs. Here are some examples: - -``` copy showLineNumbers -<img src="//mystore.com/content/images/foo.jpg" /> -url(//mystore.com/content/images/foo.jpg") -<link href="//mystore.com/content/foo.css" rel="stylesheet" type="text/css" /> -``` - -## File Includes - -You can include another file within a template, using file include variables. This practice is extremely useful for external files such as banners or site-network headers. - -Includes are referenced within template files as follows: - - -``` -%%Include.http://www.example.com/remote_file.html%% -%%Include.https://www.example.com/secure_remote_file.html%% -``` - -Notes: Included external links will not follow redirects (HTTP status codes 301 and 302). So if a redirect is encountered, it will not include the content. +# Template Syntax + + + +Each of the layout, panel, and snippet files in a theme uses variables (also called placeholders) to show external content or content fetched from the database (such as the name of a product). + +Template variables are enclosed within `%%` markers. These types of variables are available for use in templates: global variables, string variables, panel references, snippet references, and file includes. + +## Global-Variables References + +Global variables are used to render dynamic content into a template. Global variables are referenced using the following syntax: + +``` +%%GLOBAL_[placeholder_name]%% +``` + +For example: + +``` +%%GLOBAL_ProductName%% +``` + +Specific variables' availability depends on the layout template that you're editing. For example, the variable for a product's description is available on the product details page, but not on the category view/product listing page. + +## Panel References + +Panels are the different blocks used by BigCommerce to build a page. Panels are referenced both inside layout files and inside other panel files. + +Panels are referenced in templates as follows, where `[panel_name]` is a placeholder for the name of a file in the theme’s Panels directory: + + +``` +%%Panel.[panel_name]%% +``` + +For example: + + +``` +%%Panel.HomeFeaturedProducts%% +``` + +This panel reference will load in the content from the `Panels/HomeFeaturedProducts.html` panel file. + +## Snippet References + +Snippets are templates containing HTML, which you can use multiple times on one page – either by using them in different parts of the template, or by including them a loop. For example, a loop might build a list of products on the page, with each product in the list being a repeated version of the same snippet. + +Snippets are referenced in templates as follows: + +``` +%%SNIPPET_[snippet_name]%% +``` + +In most cases, this will correspond to a similarly named file in the theme’s Snippets directory. For example: + +``` +%%SNIPPET_HomeFeaturedProducts%% +``` + +This snippet reference will contain repeated copies of `Snippets/HomeFeaturedProductsItem.html`, one for each featured product to be shown in the list. + +## Referencing Distributed Theme Assets + +After the Blueprint framework was first released, BigCommerce added the ability to reference theme assets that are stored remotely on a CDN (content delivery network). This section provides examples that map first-generation Blueprint syntax to updated syntax for distributed assets. + +You can use WebDAV to upload your own custom theme assets (JavaScripts, stylesheets, images, fonts, etc). In your HTML, reference these assets that aren’t present in the base theme using the `ASSET` syntax: + +``` +%%ASSET_[path_to_asset]%% +``` + +This syntax will output an absolute URL like: + +``` +http://cdn-host/templates/__custom/path_to_asset?t=timestamp +``` + +This loads the custom asset from our CDN server, and includes a cache-busting querystring. + +For example: + +``` +%%ASSET_Styles/myownstyle.css%% +``` + +...will be output as: + +``` +http://cdn-host/templates/__custom/Styles/myonwstyle.css?t=123 +``` + +#### Syntax Examples + +The following tables map earlier to current syntax: + +##### Assets in CSS Files + +| Previous Syntax | Updated Syntax (CDN) | +|--|-| +| `url(/template/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | +| `url(/templates/__custom/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | +| `url(/template/foo/bar/font.woff)` | `url(%%ASSET_foo/bar/font.woff%%)` | +| `url(../images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | +| `url(icons/foo.ico)` | `url(%%ASSET_Styles/icons/foo.ico%%)` | +| `url(//mystore.com/template/images/foo.jpg)` | `url(%%ASSET_images/foo.jpg%%)` | + +##### Assets in HTML Files + +| Previous Syntax | Updated Syntax (CDN) | +|-|-| +| `<img src="../images/foo.jpg" />` | `<img src="%%ASSET_images/foo.jpg%%" />` | +| `<img src="//mystore.com/template/images/foo.jpg">` | `<img src="%%ASSET_images/foo.jpg%%" />` | +| `<link href="/template/Styles/foo.css" />` | `<link href="%%ASSET_Styles/foo.css%%" />` | +| `<script src="/template/js/foo.js%%"></script>` | `<script src="%%ASSET_js/foo.js%%"></script>` | + +##### Assets Outside of the /template/ Directory + +The `ASSET` variable can be used only with files and folders inside the `/template/` directory. To take advantage of a CDN's benefits, we strongly recommend moving your assets to the `/template/` directory. However, if you need to keep assets outside of the `/template/` directory, the best practice is to use _protocol-relative_, absolute or fully qualified, URLs. Here are some examples: + +``` copy showLineNumbers +<img src="//mystore.com/content/images/foo.jpg" /> +url(//mystore.com/content/images/foo.jpg") +<link href="//mystore.com/content/foo.css" rel="stylesheet" type="text/css" /> +``` + +## File Includes + +You can include another file within a template, using file include variables. This practice is extremely useful for external files such as banners or site-network headers. + +Includes are referenced within template files as follows: + + +``` +%%Include.http://www.example.com/remote_file.html%% +%%Include.https://www.example.com/secure_remote_file.html%% +``` + +Notes: Included external links will not follow redirects (HTTP status codes 301 and 302). So if a redirect is encountered, it will not include the content. diff --git a/docs/legacy/blueprint-themes/blueprint-theme-update-process.mdx b/archive/storefront/blueprint/themes/theme-update-process.mdx similarity index 97% rename from docs/legacy/blueprint-themes/blueprint-theme-update-process.mdx rename to archive/storefront/blueprint/themes/theme-update-process.mdx index c792933d9..eb91da2b5 100644 --- a/docs/legacy/blueprint-themes/blueprint-theme-update-process.mdx +++ b/archive/storefront/blueprint/themes/theme-update-process.mdx @@ -1,48 +1,48 @@ -# Theme Update Process - - - -Here is how BigCommerce and our partners collaborate to integrate a partner's theme changes/updates into the BigCommerce Theme Marketplace (which merchants also know as our "theme store"): - -## Prerequisites - -Integrating a partner's theme changes requires these preconditions: - -* Partner has an existing theme in the BigCommerce Theme Marketplace. - -* BigCommerce sets up a Theme Development store (or converts an existing regular store) and applies the theme. All theme files will automatically be copied into the WebDAV `/template/` directory. - -<Callout type="info"> - #### Template Path Abstracted - The Theme Development store resolves the %%GLOBAL_TPL_PATH%% variable into /template/. Therefore, assets will be pulled from the /template/ directory, which is accessible via WebDAV or via the BigCommerce control panel. -</Callout> - - -## Update Process - -1. The partner switches on Theme Development mode, by using: -`http://<STORE>/admin/index.php?ToDo=viewTemplates&dev=enable`. -2. The partner asks BigCommerce to switch a theme. (Partners currently cannot switch it directly, because it’s a paid theme.) - -<Callout type="warning"> - This step will wipe out all files in the /template/ directory and copy in the latest version of the integrated theme. -</Callout> - - -3. The partner pulls changes from BigCommerce's GitHub fork, to get the most recent version onto their local machine as well. -4. The partner makes appropriate changes to CSS/HTML files. -5. The partner commits their changes into the feature branch, and opens a pull request against the BigCommerce fork. - -<Callout type="warning"> - If BigCommerce made conflicting changes (which should happen only when resolving urgent issues), the partner might need to rebase changes (using git rebase master) in order to resolve the conflicts. -</Callout> - - -6. Partner [emails](mailto:themestore@bigcommerce.com) their Git URL to the BigCommerce Theme Marketplace. -7. BigCommerce integrates changes into BigCommerce Themes. - -## Other Requirements - -* Partners must not change the repository's directory structure or directory names. -* Files should have permission 644 (`rw-r–r–`). -* Directories should have permission 755 (`drwxr-x-r-x`). +# Theme Update Process + + + +Here is how BigCommerce and our partners collaborate to integrate a partner's theme changes/updates into the BigCommerce Theme Marketplace (which merchants also know as our "theme store"): + +## Prerequisites + +Integrating a partner's theme changes requires these preconditions: + +* Partner has an existing theme in the BigCommerce Theme Marketplace. + +* BigCommerce sets up a Theme Development store (or converts an existing regular store) and applies the theme. All theme files will automatically be copied into the WebDAV `/template/` directory. + +<Callout type="info"> + #### Template Path Abstracted + The Theme Development store resolves the %%GLOBAL_TPL_PATH%% variable into /template/. Therefore, assets will be pulled from the /template/ directory, which is accessible via WebDAV or via the BigCommerce control panel. +</Callout> + + +## Update Process + +1. The partner switches on Theme Development mode, by using: +`http://<STORE>/admin/index.php?ToDo=viewTemplates&dev=enable`. +2. The partner asks BigCommerce to switch a theme. (Partners currently cannot switch it directly, because it’s a paid theme.) + +<Callout type="warning"> + This step will wipe out all files in the /template/ directory and copy in the latest version of the integrated theme. +</Callout> + + +3. The partner pulls changes from BigCommerce's GitHub fork, to get the most recent version onto their local machine as well. +4. The partner makes appropriate changes to CSS/HTML files. +5. The partner commits their changes into the feature branch, and opens a pull request against the BigCommerce fork. + +<Callout type="warning"> + If BigCommerce made conflicting changes (which should happen only when resolving urgent issues), the partner might need to rebase changes (using git rebase master) in order to resolve the conflicts. +</Callout> + + +6. Partner [emails](mailto:themestore@bigcommerce.com) their Git URL to the BigCommerce Theme Marketplace. +7. BigCommerce integrates changes into BigCommerce Themes. + +## Other Requirements + +* Partners must not change the repository's directory structure or directory names. +* Files should have permission 644 (`rw-r–r–`). +* Directories should have permission 755 (`drwxr-x-r-x`). diff --git a/docs/legacy/storefronts/nextjs-commerce-guide.mdx b/archive/storefront/nextjs-commerce.mdx similarity index 100% rename from docs/legacy/storefronts/nextjs-commerce-guide.mdx rename to archive/storefront/nextjs-commerce.mdx diff --git a/docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx b/archive/storefront/stencil/google-analytics-enhanced-ecommerce.mdx similarity index 98% rename from docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx rename to archive/storefront/stencil/google-analytics-enhanced-ecommerce.mdx index 3b3d76743..8845baa30 100644 --- a/docs/stencil-docs/developing-further/google-analytics-enhanced-ecommerce.mdx +++ b/archive/storefront/stencil/google-analytics-enhanced-ecommerce.mdx @@ -1,184 +1,184 @@ -# Google Analytics Enhanced ECommerce - -Google Analytics is a free analytics tool that helps you track visitors and conversions on your store. BigCommerce has updated the Google Analytics integration to support Enhanced Ecommerce. As apart of the Enhanced ECommerce feature, Stencil themes now support data attributes. - -Data attributes provide detailed data on the way shoppers interact with your store’s products. However, data attributes are not only limited to only product data collection. Data attributes can also track your store’s header and footer for promotions and can collect data on whether those promotions were viewed and/or clicked. BigCommerce’s data attributes are powered by [Segment](https://segment.com/docs/destinations/google-analytics/) and [Platform.js](https://github.com/segment-integrations/analytics.js-integration-google-analytics/blob/master/lib/index.js), and will send your store’s product data through to Google Analytics. - -Cornerstone versions 2.6.0+ will have data attributes already included in the theme. - -<Callout type="warning"> - #### GAEE for Blueprint Themes - While you can implement data attributes with Blueprint themes, we do not currently have specific documentation on how to do this. The data attribute HTML structure, however, will be the same as it is in a Stencil theme. -</Callout> - - -### Downloading a theme -Data attributes will work on any theme. For this tutorial, we will be adding data attributes to the Cornerstone theme. If you do not already have a local copy of Cornerstone on your machine, see [Downloading Cornerstone](/docs/storefront/stencil/cli/install#authorizing_download). - - -If you would like to implement data attributes on your custom theme and do not already have a copy of your custom theme downloaded, see [Downloading a Marketplace Theme](/docs/storefront/stencil/cli/install#authorizing_download). - -<Callout type="info"> - The remainder of this tutorial will be working off the theme’s base folder `cornerstone`. -</Callout> - -## Adding data attributes - -### Prerequisites -* [BigCommerce Store](https://support.bigcommerce.com/s/article/Starting-a-Bigcommerce-Trial) -* [Optimized One-Page Checkout enabled](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout) -* [Cornerstone theme installed](/docs/storefront/stencil/start#cornerstone) - -### Include the Enhanced ECommerce property - -1. Open your local copy of your theme and navigate to the theme’s <span class="fn">cornerstone/config.json</span> file. - -2. In the `config.json` file, navigate to the features array. There should be a property in this array called `enhanced ecommerce`. If the `enhanced ecommerce` property is not present in the features array, add it. The features object should then look similar to the image below. - -```json filename="Enhanced eCommerce feature: config.json" showLineNumbers copy -"features": [ - "fully_responsive", - "mega_navigation", - "multi_tiered_sidebar_menu", - "masonry_design", - "frontpage_slideshow", - "quick_add_to_cart", - "switchable_product_view", - "product_comparison_table", - "complex_search_filtering", - "customizable_product_selector", - "cart_suggested_products", - "free_customer_support", - "free_theme_upgrades", - "high_res_product_images", - "product_filtering", - "advanced_quick_view", - "product_showcase", - "persistent_cart", - "one_page_check_out", - "product_videos", - "google_amp", - "customized_checkout", - "account_payment_methods", - "enhanced_ecommerce", - "csrf_protection" -] -``` - -You are now ready to begin adding data attributes into the HTML files across your Cornerstone theme. - -### Adding data attributes into Cornerstone’s HTML files - -Data attributes must be manually added to a product in order to track shopper events and interactions with a product. Because data attributes collect product data at a very granular level, there will be multiple locations you will have to add attributes on a singular product in order to get a comprehensive look at the product’s data. For example, if you want to, it is imperative to note that a product can be viewed by clicking any of the following: - -* The name of the product -* The “Quick View” button -* The product image - -So, if you would like to track the clicks on a specific product, in order to ensure you get a fully comprehensive look at shoppers’ interactions with a product, you will want to include a data attribute on each of these fields. If a specific product possesses multiple data attributes, the data attribute that is closest to the product is the one which will track clicks, product impressions, or product views. - -Data attributes will be implemented in your store by using simple HTML. In order to begin tracking, you will add data attributes to the already existing HTML tags present in your theme. - -See [Pull Request #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) to see how data attributes were implemented in Cornerstone 2.6.0. - -### Data attribute implementation example - -You can see a data attribute implemented in the HTML form tag in the code sample below: - -```handlebars filename="Data attribute HTML" showLineNumbers copy -<form action="{{urls.compare}}" method='POST' data-list-name="Brand: {{brand.name}}" data-product-compare> - {{#if theme_settings.product_list_display_mode '===' 'grid'}} - {{> components/products/grid products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} - {{else}} - {{> components/products/list products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} - {{/if}} -</form> - -{{> components/common/paginator pagination.brand}} -``` - -In the above snippet, the data attribute is embedded in a `<form>` HTML tag in lines 1 and 2. The data attribute is `data-list-name` and its value is `"Brand: {{brand.name}}"`. - - -## Data attribute reference - -Currently, BigCommerce supports 11 different data attributes. Below is a table with a breakdown of each attribute and its description. - -<Callout type="warning"> - **Mandatory data** - * If tracking promotions data, either `data-banner-id` or `data-name` are required. - * If tracking data for a product, either `data-entity-id` or `data-name` are required. - * If tracking data for a product list, `data-product-list` or `data-entity-id` are required. -</Callout> - -The “tracked product” refers to the product on which you are inserting the data attribute. - -| Data Attribute | Description | Value Type | Example | -|-----|-----|-----|-----| -| `data-list-name` | The `data-list-name` attribute denotes the name of the list that will be reflected on Google Analytics. | string or handlebars helper | **String Example**:`data-list-name="Kitchen Appliances"` <br /><br /> **Handlebars Value Example**: The `data-list-name` attribute can also get its value using Handlebars. For example, if you are adding a data attribute to your carousel products in products/carousel.html, you could create the attribute `data-list-name="{{list}}"` and define the list value in products/new.html to be: `list="New products"`| -| `data-entity-id` | The `data-entity-id` is equal to the tracked item’s id. | integer | `data-entity-id=12` | -| `data-position` | The `data-position` attribute is equal to the tracked product’s position or the tracked promotion’s position. | Value is a string if creating the data attribute for a promotion. The string should denote the location of the promotion. <br /><br />Value is an integer if creating the data attribute for a product. The integer should represent the product’s placement. An example use case for this data attribute is to answer a question like, “does the product in position 1 sell more than the product in position 4?” | **String Value Example:** `data-position="center"` <br /><br />**Integer Value Example:** `data-position=2` | -| `data-banner-id` | The `data-banner-id` attribute is the id of the banner being tracked. The banner id is not to be mistaken with the promotion id. | integer | `data-banner-id=5` | -| `data-event-type` | The `data-event-type` attribute is equal to the shopper event that will be tracked. There are a 4 shopper/product interactions you can measure and set the data-event-type equal to. Custom events are not yet implemented. | **String that can be one of:** <br />`"promotion"`<br />`"promotion click"`<br />`"product"`<br />`"list"` | `data-event-type="promotion"` | -| `data-name` | The `data-name` attribute is equal to the tracked product’s or banner’s name. | string or handlebars helper | **String Value Example:** <br />`data-name="Ruffle Off-the-Shoulder Top"` <br /><br /> **Handlebars Value Example:** <br />The `data-name` attribute can also get its value using Handlebars. <br /><br />For example, if you are adding a data attribute to your footer in products/footer.html, you could create the attribute: `data-name="{{this.banner-name}}"` <br /><br />Or, if you are adding a data attribute to a product list item in products/list-item.html, you could create the attribute below `data-name="{{name}}"` as long as these values are defined. | -| `data-product-category` | The `data-product-category` attribute is equal to the tracked product’s category. | string | `data-product-category="Women’s Apparel"` | -| `data-product-brand` | The `data-product-brand` attribute is equal to the tracked product’s brand. | string | `data-product-brand="Ralph Lauren Corporation"` | -| `data-product-price` | The `data-product-price` attribute is equal to the tracked product’s price. | integer | `data-product-price="27.99"` | -| `data-product-sku` | The `data-product-sku` attribute is equal to the tracked product’s sku value. | string | `data-product-sku="S18T-Ots-YM"` | -| `data-product-variant` | The `data-product-variant` is equal to the tracked product’s variant. | string | `data-product-variant="4-Yellow"` | - - -## Custom Dimensions and Metrics - -Custom dimensions and metrics are also supported. To add them in the `config.json` `settings` array, add the name of the dimension/metric followed by the generic custom metric/dimension alias: - -```json filename="config.json: Settings array" showLineNumbers copy -{ - // ... - "settings": { - // ... - "custom-dimensions": { - "<your-custom-dimension-name>": "dimension1", "dimension-common": "dimension2" - }, - "custom-metrics": { - "<your-custom-metric-name": "metric1", "metric-common": "metric2" - } - } - // ... -} -``` - -<Callout type="info"> - * Spelling must be exact - * Names may not have spaces -</Callout> - -Next, add the custom metrics/dimensions to the desired theme template: - -```handlebars filename="Theme template with custom dimensions and metrics" showLineNumbers copy -<!--...--> -{{#if settings.data_tag_enabled}} - <article class="listItem" dimension-common="yes" metric-common=1 data-event-type="{{event}}"> -{{else}} -<!--...--> -{{/if}} -<!--...--> -``` - -<Callout type="info"> - **Dimensions and metrics** - - Dimensions are typically strings; metrics are usually integers. -</Callout> -## Resources - -### Pull Requests -* Cornerstone [PR #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) (GitHub) -* [Google Analytics Product Data Tags](https://github.com/bigcommerce/cornerstone/commit/9a4ddcae7f531a9d542aeb8ebf38c8bda2656b1c) (BigCommerce GitHub) - -### Related Articles - -* [Customizing the BigCommerce Google Analytics Enhanced ECommerce Integration](https://medium.com/bigcommerce-developer-blog/customizing-the-bigcommerce-google-analytics-enhanced-ecommerce-integration-803d4338d018) (Developer Blog) - -### Additional Resources -* [Google Analytics Enhanced ECommerce](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#ecommerce-data) (Google) +# Google Analytics Enhanced ECommerce + +Google Analytics is a free analytics tool that helps you track visitors and conversions on your store. BigCommerce has updated the Google Analytics integration to support Enhanced Ecommerce. As apart of the Enhanced ECommerce feature, Stencil themes now support data attributes. + +Data attributes provide detailed data on the way shoppers interact with your store’s products. However, data attributes are not only limited to only product data collection. Data attributes can also track your store’s header and footer for promotions and can collect data on whether those promotions were viewed and/or clicked. BigCommerce’s data attributes are powered by [Segment](https://segment.com/docs/destinations/google-analytics/) and [Platform.js](https://github.com/segment-integrations/analytics.js-integration-google-analytics/blob/master/lib/index.js), and will send your store’s product data through to Google Analytics. + +Cornerstone versions 2.6.0+ will have data attributes already included in the theme. + +<Callout type="warning"> + #### GAEE for Blueprint Themes + While you can implement data attributes with Blueprint themes, we do not currently have specific documentation on how to do this. The data attribute HTML structure, however, will be the same as it is in a Stencil theme. +</Callout> + + +### Downloading a theme +Data attributes will work on any theme. For this tutorial, we will be adding data attributes to the Cornerstone theme. If you do not already have a local copy of Cornerstone on your machine, see [Downloading Cornerstone](/docs/storefront/stencil/cli/install#authorizing_download). + + +If you would like to implement data attributes on your custom theme and do not already have a copy of your custom theme downloaded, see [Downloading a Marketplace Theme](/docs/storefront/stencil/cli/install#authorizing_download). + +<Callout type="info"> + The remainder of this tutorial will be working off the theme’s base folder `cornerstone`. +</Callout> + +## Adding data attributes + +### Prerequisites +* [BigCommerce Store](https://support.bigcommerce.com/s/article/Starting-a-Bigcommerce-Trial) +* [Optimized One-Page Checkout enabled](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout) +* [Cornerstone theme installed](/docs/storefront/stencil/start#cornerstone) + +### Include the Enhanced ECommerce property + +1. Open your local copy of your theme and navigate to the theme’s <span class="fn">cornerstone/config.json</span> file. + +2. In the `config.json` file, navigate to the features array. There should be a property in this array called `enhanced ecommerce`. If the `enhanced ecommerce` property is not present in the features array, add it. The features object should then look similar to the image below. + +```json filename="Enhanced eCommerce feature: config.json" showLineNumbers copy +"features": [ + "fully_responsive", + "mega_navigation", + "multi_tiered_sidebar_menu", + "masonry_design", + "frontpage_slideshow", + "quick_add_to_cart", + "switchable_product_view", + "product_comparison_table", + "complex_search_filtering", + "customizable_product_selector", + "cart_suggested_products", + "free_customer_support", + "free_theme_upgrades", + "high_res_product_images", + "product_filtering", + "advanced_quick_view", + "product_showcase", + "persistent_cart", + "one_page_check_out", + "product_videos", + "google_amp", + "customized_checkout", + "account_payment_methods", + "enhanced_ecommerce", + "csrf_protection" +] +``` + +You are now ready to begin adding data attributes into the HTML files across your Cornerstone theme. + +### Adding data attributes into Cornerstone’s HTML files + +Data attributes must be manually added to a product in order to track shopper events and interactions with a product. Because data attributes collect product data at a very granular level, there will be multiple locations you will have to add attributes on a singular product in order to get a comprehensive look at the product’s data. For example, if you want to, it is imperative to note that a product can be viewed by clicking any of the following: + +* The name of the product +* The “Quick View” button +* The product image + +So, if you would like to track the clicks on a specific product, in order to ensure you get a fully comprehensive look at shoppers’ interactions with a product, you will want to include a data attribute on each of these fields. If a specific product possesses multiple data attributes, the data attribute that is closest to the product is the one which will track clicks, product impressions, or product views. + +Data attributes will be implemented in your store by using simple HTML. In order to begin tracking, you will add data attributes to the already existing HTML tags present in your theme. + +See [Pull Request #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) to see how data attributes were implemented in Cornerstone 2.6.0. + +### Data attribute implementation example + +You can see a data attribute implemented in the HTML form tag in the code sample below: + +```handlebars filename="Data attribute HTML" showLineNumbers copy +<form action="{{urls.compare}}" method='POST' data-list-name="Brand: {{brand.name}}" data-product-compare> + {{#if theme_settings.product_list_display_mode '===' 'grid'}} + {{> components/products/grid products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} + {{else}} + {{> components/products/list products=brand.products show_compare=brand.show_compare theme_settings=theme_settings event="list"}} + {{/if}} +</form> + +{{> components/common/paginator pagination.brand}} +``` + +In the above snippet, the data attribute is embedded in a `<form>` HTML tag in lines 1 and 2. The data attribute is `data-list-name` and its value is `"Brand: {{brand.name}}"`. + + +## Data attribute reference + +Currently, BigCommerce supports 11 different data attributes. Below is a table with a breakdown of each attribute and its description. + +<Callout type="warning"> + **Mandatory data** + * If tracking promotions data, either `data-banner-id` or `data-name` are required. + * If tracking data for a product, either `data-entity-id` or `data-name` are required. + * If tracking data for a product list, `data-product-list` or `data-entity-id` are required. +</Callout> + +The “tracked product” refers to the product on which you are inserting the data attribute. + +| Data Attribute | Description | Value Type | Example | +|-----|-----|-----|-----| +| `data-list-name` | The `data-list-name` attribute denotes the name of the list that will be reflected on Google Analytics. | string or handlebars helper | **String Example**:`data-list-name="Kitchen Appliances"` <br /><br /> **Handlebars Value Example**: The `data-list-name` attribute can also get its value using Handlebars. For example, if you are adding a data attribute to your carousel products in products/carousel.html, you could create the attribute `data-list-name="{{list}}"` and define the list value in products/new.html to be: `list="New products"`| +| `data-entity-id` | The `data-entity-id` is equal to the tracked item’s id. | integer | `data-entity-id=12` | +| `data-position` | The `data-position` attribute is equal to the tracked product’s position or the tracked promotion’s position. | Value is a string if creating the data attribute for a promotion. The string should denote the location of the promotion. <br /><br />Value is an integer if creating the data attribute for a product. The integer should represent the product’s placement. An example use case for this data attribute is to answer a question like, “does the product in position 1 sell more than the product in position 4?” | **String Value Example:** `data-position="center"` <br /><br />**Integer Value Example:** `data-position=2` | +| `data-banner-id` | The `data-banner-id` attribute is the id of the banner being tracked. The banner id is not to be mistaken with the promotion id. | integer | `data-banner-id=5` | +| `data-event-type` | The `data-event-type` attribute is equal to the shopper event that will be tracked. There are a 4 shopper/product interactions you can measure and set the data-event-type equal to. Custom events are not yet implemented. | **String that can be one of:** <br />`"promotion"`<br />`"promotion click"`<br />`"product"`<br />`"list"` | `data-event-type="promotion"` | +| `data-name` | The `data-name` attribute is equal to the tracked product’s or banner’s name. | string or handlebars helper | **String Value Example:** <br />`data-name="Ruffle Off-the-Shoulder Top"` <br /><br /> **Handlebars Value Example:** <br />The `data-name` attribute can also get its value using Handlebars. <br /><br />For example, if you are adding a data attribute to your footer in products/footer.html, you could create the attribute: `data-name="{{this.banner-name}}"` <br /><br />Or, if you are adding a data attribute to a product list item in products/list-item.html, you could create the attribute below `data-name="{{name}}"` as long as these values are defined. | +| `data-product-category` | The `data-product-category` attribute is equal to the tracked product’s category. | string | `data-product-category="Women’s Apparel"` | +| `data-product-brand` | The `data-product-brand` attribute is equal to the tracked product’s brand. | string | `data-product-brand="Ralph Lauren Corporation"` | +| `data-product-price` | The `data-product-price` attribute is equal to the tracked product’s price. | integer | `data-product-price="27.99"` | +| `data-product-sku` | The `data-product-sku` attribute is equal to the tracked product’s sku value. | string | `data-product-sku="S18T-Ots-YM"` | +| `data-product-variant` | The `data-product-variant` is equal to the tracked product’s variant. | string | `data-product-variant="4-Yellow"` | + + +## Custom Dimensions and Metrics + +Custom dimensions and metrics are also supported. To add them in the `config.json` `settings` array, add the name of the dimension/metric followed by the generic custom metric/dimension alias: + +```json filename="config.json: Settings array" showLineNumbers copy +{ + // ... + "settings": { + // ... + "custom-dimensions": { + "<your-custom-dimension-name>": "dimension1", "dimension-common": "dimension2" + }, + "custom-metrics": { + "<your-custom-metric-name": "metric1", "metric-common": "metric2" + } + } + // ... +} +``` + +<Callout type="info"> + * Spelling must be exact + * Names may not have spaces +</Callout> + +Next, add the custom metrics/dimensions to the desired theme template: + +```handlebars filename="Theme template with custom dimensions and metrics" showLineNumbers copy +<!--...--> +{{#if settings.data_tag_enabled}} + <article class="listItem" dimension-common="yes" metric-common=1 data-event-type="{{event}}"> +{{else}} +<!--...--> +{{/if}} +<!--...--> +``` + +<Callout type="info"> + **Dimensions and metrics** + + Dimensions are typically strings; metrics are usually integers. +</Callout> +## Resources + +### Pull Requests +* Cornerstone [PR #1377](https://github.com/bigcommerce/cornerstone/pull/1377/commits/55fc73eeb1edc6e140005ca811f090f06ab35435) (GitHub) +* [Google Analytics Product Data Tags](https://github.com/bigcommerce/cornerstone/commit/9a4ddcae7f531a9d542aeb8ebf38c8bda2656b1c) (BigCommerce GitHub) + +### Related Articles + +* [Customizing the BigCommerce Google Analytics Enhanced ECommerce Integration](https://medium.com/bigcommerce-developer-blog/customizing-the-bigcommerce-google-analytics-enhanced-ecommerce-integration-803d4338d018) (Developer Blog) + +### Additional Resources +* [Google Analytics Enhanced ECommerce](https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#ecommerce-data) (Google) diff --git a/docs/legacy/stencil-themes/stored-credit-card-management.mdx b/archive/storefront/stencil/stored-credit-card-management.mdx similarity index 98% rename from docs/legacy/stencil-themes/stored-credit-card-management.mdx rename to archive/storefront/stencil/stored-credit-card-management.mdx index 2e7acce7a..ff88f2d81 100644 --- a/docs/legacy/stencil-themes/stored-credit-card-management.mdx +++ b/archive/storefront/stencil/stored-credit-card-management.mdx @@ -1,124 +1,124 @@ -# Stored Credit Card Management - - - -Stored Credit Card management gives customer’s the ability to manage their stored credit cards from the My Account page of the storefront. In the Cornerstone theme, shoppers with store accounts will have the ability to add new cards, delete cards, select a default card, and edit the billing details of existing cards from their customer account area of the storefront. - -![Stored Credit Card Management](https://storage.googleapis.com/bigcommerce-production-dev-center/images/stored-credit-card-management.png "Stored Credit Card Management") - -<Callout type="info"> - #### Theme Versions - Cornerstone versions 2.6.0+ include the ability to manage [Stored Credit Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Support). -</Callout> - - -<a id="stored-cc-mgmt_prerequisites"></a> - -## Prerequisites - -* Store must be on a [Plus plan or higher](https://www.bigcommerce.com/essentials/pricing/). -* Store needs to be using a compatible payment gateway: - * PayPal powered by Braintree - * Cybersource - * Authorize.net - * Stripe - * Paymetric - -## Adding Stored Credit Card Management - -Stored Credit Card Management was added to Cornerstone in [pull request #1376](https://github.com/bigcommerce/cornerstone/pull/1376). To add Stored Credit Cards to pre-2.6.0 Cornerstone or Marketplace themes, copy the changes from [PR #1376](https://github.com/bigcommerce/cornerstone/pull/1376) to your theme. This section will walk through [each individual commit](https://github.com/bigcommerce/cornerstone/pull/1376/commits), highlighting the changes that you will need to make to your template files. - -## Step 1: [Add Payment Methods Page](https://github.com/bigcommerce/cornerstone/pull/1376/commits/24abc038fe346a8572b40da40c98a9465788957a) - -* Create the new Payment Methods page on a shopper’s account by editing the following files: - * <span class="fp">lang/en.json</span> - * <span class="fp">templates/components/account/navigation.html</span> - * <span class="fp">templates/pages/account/payment-methods.html</span> - -![Payment Methods Page Addition Example](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-methods-page-addition.png "Payment Methods Page Addition Example") - -## Step 2: [Add Translations](https://github.com/bigcommerce/cornerstone/pull/1376/commits/9edf1a0f6907811abf470db1486b4fdb199b27ae) - -* Makes the Payments Method page translatable by modifying the following: - * <span class="fp">lang/en.json</span> - * <span class="fp">templates/components/account/navigation.html</span> files - -## Step 3: [Include Credit Card Listing](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5574eb98c710f4540e8390420563099b6f5710bf) - -* Group the credit cards by payment providers -* Include the payment method icons -* Account for mobile and desktop layouts -* Account for translations - -*Icons have been used to identify the credit card **type**. The data only provides the card brand in the credit card details.* - -![image](https://storage.googleapis.com/bigcommerce-production-dev-center/images/credit-cards-details.png) - -## Step 4: [Add Credit Card Actions](https://github.com/bigcommerce/cornerstone/pull/1376/commits/499016d320995852fe4ef621724e08556896b70d) - -* add `Edit`, `Delete`, and `Add` buttons - -![Implementation of Add, Edit, and Delete Methods](https://storage.googleapis.com/bigcommerce-production-dev-center/images/edit-delete-add-buttons.png "Implementation of Add, Edit, and Delete Methods") - -## Step 5: [Implement Delete Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/cf102901d9061b7334e8c39f15a8904c37cf0652) - -* Bind the delete button's front end and back end - -First, the click will trigger window confirm. The confirmation modal has been added to prevent unintended action. Then, on confirming, a post request will be sent. The action is initiated through a localized form post request in the template which uses a [`delete_url`](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L34) key provided in the credit card details data. Finally, there will be a redirect to the credit card listing. - -## Step 6: [Implement Edit Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/ab2fe1df455fa8ac93760904b718fbce7ce361ed) - -* Add the design for credit card details and the edit billing address form, synced with existing address fields validation - -*The action is initiated via a [redirect](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L36) to the edit page. The page uses HTML, CSS, and JavaScript for the billing address validation. The "name on card" label and values are also removed, as we do not store name along with the vaulted credit card. The full [edit-payment-method.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/edit-payment-method.html) can be viewed in the Cornerstone GitHub Repo.* - -![Edit Payment Method Form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-method-form.png "Edit Payment Method Form") - -## Step 7: [Implement Add Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/c960338c32faa8fb798b2826c72dfe9d74bf9751) - -* Adding new icon `lock.svg` -* Unify the CSS classes for the add and edit form. -* Add a new template for edit form with an injection of global variables into context. -* Extend the `account.js` file with a new method to initiate credit card and billing address fields validations, mapping form fields name and value to body request. -* Add a `payment-method.js` file for credit card validations and helpers with unit test. - -*The add form will use ajax to validate and submit the credit card details (this differs from the way the edit form validates and submits). The [payment-method.js file](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/common/payment-method.js) has been designed to be dragged and used in themes to simplify its implementation.* - -*The [add-payment-method.html template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html) also requires some customization because variables need to pass through handlebars in order to be used by JavaScript. From [line 20 to 25 of the template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L20-L25), we store variables, mostly for building the request url and header. The request body will directly use the form data. [More validations and extra mapping](https://github.com/bigcommerce/cornerstone/blob/24686de577c6ad5409ec8b82f5839c3d083cb760/assets/js/theme/account.js#L211) are added to the `add-payment-method.html` template as well.* - -![Example of the addition of the Add Payment Method](https://storage.googleapis.com/bigcommerce-production-dev-center/images/add-payment-method.png "Example of the addition of the Add Payment Method") - -## Step 8: [Add Default Instrument](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5576aee5af0194e85cb11dbf44563f89b2687f40) - -* Add HTML and CSS for a single checkbox, default instrument -* Capture form data on ADD and transform to boolean -* Fix HTML credit card for tabulation navigation -* Fix for states reload list via AJAX - -![Add default instrument checkbox to edit and add form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/default-instrument-checkbox.png "Add default instrument checkbox to edit and add form") - -<Callout type="info"> - #### Utilizing GitHub Automation to Merge the Changes - Since this feature involves heavy code changes, it may be easier to merge the necessary code into your theme by utilizing GitHub's automated process for syncing a fork. See GitHub's documentation on [Syncing a Fork](https://help.github.com/articles/syncing-a-fork/) for more details on this method. -</Callout> - - -## FAQ -**Where is the card data stored?** - -Card data is stored securely with the payment gateway. - -**Is storing credit cards PCI compliant?** - -Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. - -**Can shoppers modify their stored card?** - -After adding a card, shoppers will only be able to modify the billing address. If other credit card details need to be modified (such as expiration date), the shopper must delete and re-add the card. - -## Resources - -### Related Articles -* [Payments API](/docs/store-operations/payments) -* [Enabling Stored Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Knowledge Base) -* [The Complete Guide to Checkout Customization on BigCommerce](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) (Developer Blog) +# Stored Credit Card Management + + + +Stored Credit Card management gives customer’s the ability to manage their stored credit cards from the My Account page of the storefront. In the Cornerstone theme, shoppers with store accounts will have the ability to add new cards, delete cards, select a default card, and edit the billing details of existing cards from their customer account area of the storefront. + +![Stored Credit Card Management](https://storage.googleapis.com/bigcommerce-production-dev-center/images/stored-credit-card-management.png "Stored Credit Card Management") + +<Callout type="info"> + #### Theme Versions + Cornerstone versions 2.6.0+ include the ability to manage [Stored Credit Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Support). +</Callout> + + +<a id="stored-cc-mgmt_prerequisites"></a> + +## Prerequisites + +* Store must be on a [Plus plan or higher](https://www.bigcommerce.com/essentials/pricing/). +* Store needs to be using a compatible payment gateway: + * PayPal powered by Braintree + * Cybersource + * Authorize.net + * Stripe + * Paymetric + +## Adding Stored Credit Card Management + +Stored Credit Card Management was added to Cornerstone in [pull request #1376](https://github.com/bigcommerce/cornerstone/pull/1376). To add Stored Credit Cards to pre-2.6.0 Cornerstone or Marketplace themes, copy the changes from [PR #1376](https://github.com/bigcommerce/cornerstone/pull/1376) to your theme. This section will walk through [each individual commit](https://github.com/bigcommerce/cornerstone/pull/1376/commits), highlighting the changes that you will need to make to your template files. + +## Step 1: [Add Payment Methods Page](https://github.com/bigcommerce/cornerstone/pull/1376/commits/24abc038fe346a8572b40da40c98a9465788957a) + +* Create the new Payment Methods page on a shopper’s account by editing the following files: + * <span class="fp">lang/en.json</span> + * <span class="fp">templates/components/account/navigation.html</span> + * <span class="fp">templates/pages/account/payment-methods.html</span> + +![Payment Methods Page Addition Example](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-methods-page-addition.png "Payment Methods Page Addition Example") + +## Step 2: [Add Translations](https://github.com/bigcommerce/cornerstone/pull/1376/commits/9edf1a0f6907811abf470db1486b4fdb199b27ae) + +* Makes the Payments Method page translatable by modifying the following: + * <span class="fp">lang/en.json</span> + * <span class="fp">templates/components/account/navigation.html</span> files + +## Step 3: [Include Credit Card Listing](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5574eb98c710f4540e8390420563099b6f5710bf) + +* Group the credit cards by payment providers +* Include the payment method icons +* Account for mobile and desktop layouts +* Account for translations + +*Icons have been used to identify the credit card **type**. The data only provides the card brand in the credit card details.* + +![image](https://storage.googleapis.com/bigcommerce-production-dev-center/images/credit-cards-details.png) + +## Step 4: [Add Credit Card Actions](https://github.com/bigcommerce/cornerstone/pull/1376/commits/499016d320995852fe4ef621724e08556896b70d) + +* add `Edit`, `Delete`, and `Add` buttons + +![Implementation of Add, Edit, and Delete Methods](https://storage.googleapis.com/bigcommerce-production-dev-center/images/edit-delete-add-buttons.png "Implementation of Add, Edit, and Delete Methods") + +## Step 5: [Implement Delete Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/cf102901d9061b7334e8c39f15a8904c37cf0652) + +* Bind the delete button's front end and back end + +First, the click will trigger window confirm. The confirmation modal has been added to prevent unintended action. Then, on confirming, a post request will be sent. The action is initiated through a localized form post request in the template which uses a [`delete_url`](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L34) key provided in the credit card details data. Finally, there will be a redirect to the credit card listing. + +## Step 6: [Implement Edit Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/ab2fe1df455fa8ac93760904b718fbce7ce361ed) + +* Add the design for credit card details and the edit billing address form, synced with existing address fields validation + +*The action is initiated via a [redirect](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/account/payment-methods-list.html#L36) to the edit page. The page uses HTML, CSS, and JavaScript for the billing address validation. The "name on card" label and values are also removed, as we do not store name along with the vaulted credit card. The full [edit-payment-method.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/edit-payment-method.html) can be viewed in the Cornerstone GitHub Repo.* + +![Edit Payment Method Form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/payment-method-form.png "Edit Payment Method Form") + +## Step 7: [Implement Add Payment Method](https://github.com/bigcommerce/cornerstone/pull/1376/commits/c960338c32faa8fb798b2826c72dfe9d74bf9751) + +* Adding new icon `lock.svg` +* Unify the CSS classes for the add and edit form. +* Add a new template for edit form with an injection of global variables into context. +* Extend the `account.js` file with a new method to initiate credit card and billing address fields validations, mapping form fields name and value to body request. +* Add a `payment-method.js` file for credit card validations and helpers with unit test. + +*The add form will use ajax to validate and submit the credit card details (this differs from the way the edit form validates and submits). The [payment-method.js file](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/common/payment-method.js) has been designed to be dragged and used in themes to simplify its implementation.* + +*The [add-payment-method.html template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html) also requires some customization because variables need to pass through handlebars in order to be used by JavaScript. From [line 20 to 25 of the template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L20-L25), we store variables, mostly for building the request url and header. The request body will directly use the form data. [More validations and extra mapping](https://github.com/bigcommerce/cornerstone/blob/24686de577c6ad5409ec8b82f5839c3d083cb760/assets/js/theme/account.js#L211) are added to the `add-payment-method.html` template as well.* + +![Example of the addition of the Add Payment Method](https://storage.googleapis.com/bigcommerce-production-dev-center/images/add-payment-method.png "Example of the addition of the Add Payment Method") + +## Step 8: [Add Default Instrument](https://github.com/bigcommerce/cornerstone/pull/1376/commits/5576aee5af0194e85cb11dbf44563f89b2687f40) + +* Add HTML and CSS for a single checkbox, default instrument +* Capture form data on ADD and transform to boolean +* Fix HTML credit card for tabulation navigation +* Fix for states reload list via AJAX + +![Add default instrument checkbox to edit and add form](https://storage.googleapis.com/bigcommerce-production-dev-center/images/default-instrument-checkbox.png "Add default instrument checkbox to edit and add form") + +<Callout type="info"> + #### Utilizing GitHub Automation to Merge the Changes + Since this feature involves heavy code changes, it may be easier to merge the necessary code into your theme by utilizing GitHub's automated process for syncing a fork. See GitHub's documentation on [Syncing a Fork](https://help.github.com/articles/syncing-a-fork/) for more details on this method. +</Callout> + + +## FAQ +**Where is the card data stored?** + +Card data is stored securely with the payment gateway. + +**Is storing credit cards PCI compliant?** + +Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. + +**Can shoppers modify their stored card?** + +After adding a card, shoppers will only be able to modify the billing address. If other credit card details need to be modified (such as expiration date), the shopper must delete and re-add the card. + +## Resources + +### Related Articles +* [Payments API](/docs/store-operations/payments) +* [Enabling Stored Cards](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) (BigCommerce Knowledge Base) +* [The Complete Guide to Checkout Customization on BigCommerce](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) (Developer Blog) diff --git a/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx b/archive/storefront/stencil/transitioning.mdx similarity index 98% rename from docs/stencil-docs/getting-started/transitioning-to-stencil.mdx rename to archive/storefront/stencil/transitioning.mdx index b20b40d1b..ce46d2f9a 100644 --- a/docs/stencil-docs/getting-started/transitioning-to-stencil.mdx +++ b/archive/storefront/stencil/transitioning.mdx @@ -1,81 +1,81 @@ -# Transitioning to Stencil - - - -This article outlines the key differences between Blueprint and Stencil for developers, agency partners, and anyone interested in Stencil's enhanced capabilities. - -## What is Stencil? - -[Stencil](/docs/storefront/stencil/start) is BigCommerce’s latest theme framework engine. Launched in 2016, Stencil incorporates industry best practices in technology, design standards, and SEO. You can use the framework’s theme on mobile, tablet, and desktop browsers. Stencil also allows developers to build storefronts that engage shoppers and encourage checkouts on any device. All of BigCommerce’s new storefronts use Stencil. - -If you are still using our legacy theme framework, Blueprint, we highly encourage switching to Stencil so you can take advantage of the new features and benefits. For more in-depth information about Stencil’s features, see the [Stencil Theme Platform](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#features) page. - -## Why transition to Stencil? - -Stencil improves the overall storefront experience for merchants and their customers. With enhancements in speed, security, and updates to your themes, this modern framework provides a more streamlined process for the everyday maintenance and tasks required to run a store. - -Stencil themes are built on non-proprietary, open-source code to provide easier adoption and adaptation while providing greater flexibility and access for customization. In comparison, Blueprint is built on a rigid, proprietary codebase, making it difficult to tailor and extend theme functionality. - -For more information on the enhanced capabilities of Stencil, see the [Stencil vs. Legacy Blueprint](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#compare) page. - -## Technical differences - -When transitioning any store from Blueprint to Stencil, you should be aware of a few key differences. Transitioning to Stencil allows developers to do the following: -- [Develop locally on Stencil CLI](#developing-locally-on-stencil-cli) -- [Use Handlebars instead of global variables](#using-handlebars) -- [Customize Page Builder mode](#customize-page-builder-mode) -- [Create custom templates](#create-custom-templates) - - -### Developing locally on Stencil CLI - -For complete control over a theme’s appearance, logic, and theme configuration files, developers can use the Stencil command line interface (Stencil CLI). This interface allows you to design and preview storefronts locally before pushing them to production. Access to real-time previews and testing across various devices is available via [Browsersync](https://www.browsersync.io/), a browser testing assistant built into Stencil CLI. - - -While Blueprint themes allow users to add new files and assets to themes via WebDav, Stencil assets must be added to and bundled into the theme, or referenced from an external source. - -For images referenced from anywhere in your Blueprint file directory, you will need to move these assets to your Stencil theme and reference them appropriately. You can still reference assets from within the `/content/` folder in WebDav or from an external source. - -For more information on Stencil theme assets, see the [Theme Assets](/docs/storefront/stencil/themes/style/assets) page. - -### Using Handlebars - - -While PHP variables enclosed within `%%` markers represent dynamic content, [Handlebars](https://handlebarsjs.com/), a JavaScript templating language represents BigCommerce dynamic stored data in Stencil themes. - -Handlebars keeps your HTML page clean by separating the logic-less templates from the business logic in your JavaScript files. This organization improves the structure of the application, promoting maintainability and scalability. Handlebars also simplifies the task of manually updating data in the customer-facing display view. - - -For more information about Handlebars, refer to these external resources: -- [A Beginner’s Guide to Handlebars](https://www.sitepoint.com/a-beginners-guide-to-handlebars/) -- [Getting Started with Handlebars.js](https://handlebarsjs.com/guide) -- [Handlebars interactive tutorial](http://tryhandlebarsjs.com/) - -For details on using Handlebars to surface objects in Stencil, see [Stencil Technology Stack](/docs/storefront/stencil/start/tech-stack). - -### Customize Page Builder mode - -While Blueprint uses Style Editor to customize legacy themes, Stencil uses Page Builder. [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) is BigCommerce's browser-based tool that enables merchants to rapidly modify and customize a storefront's look and feel without writing code. Stencil theme developers can configure settings for Page Builder. The configuration determines the theme's customizable aspects. - -For example, by customizing the configuration of Page Builder, you can modify how merchants customize colors, fonts, display of page features, and the number of products displayed per feature. - -When you switch to Stencil from Blueprint, you won’t lose any of your store data. However, you will lose any customization you’ve hardcoded into your previous Blueprint theme. - -### Create custom templates - -Stencil allows theme developers and merchants to assign custom layout templates to the following types of storefront pages: -- Brand (unique to Stencil) -- Category -- Product -- Store (static page) - -Unlike Blueprint, Stencil does not require that custom template file names start with an underscore. In the current Stencil release, you must create and bundle custom templates using Stencil CLI before uploading the custom templates to stores. However, once you have created and uploaded templates, authorized store users can assign them to storefront pages through the control panel. For more information on custom templates, see the [Custom Templates](/docs/storefront/stencil/themes/templates) page. - -### Resources - -For more information about switching to Stencil, see the following resources: -- [Getting Started with the Stencil Framework](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) -- [Stencil Theme Editor](https://support.bigcommerce.com/s/article/Stencil-Themes) -- [Editing Stencil Theme Files](https://support.bigcommerce.com/s/article/Stencil-Themes#edit) -- [Personalizing Your Stencil Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) -- [What to Consider When Changing Your Stencil Theme](https://support.bigcommerce.com/s/article/What-to-Consider-When-Changing-Your-Theme) +# Transitioning to Stencil + + + +This article outlines the key differences between Blueprint and Stencil for developers, agency partners, and anyone interested in Stencil's enhanced capabilities. + +## What is Stencil? + +[Stencil](/docs/storefront/stencil/start) is BigCommerce’s latest theme framework engine. Launched in 2016, Stencil incorporates industry best practices in technology, design standards, and SEO. You can use the framework’s theme on mobile, tablet, and desktop browsers. Stencil also allows developers to build storefronts that engage shoppers and encourage checkouts on any device. All of BigCommerce’s new storefronts use Stencil. + +If you are still using our legacy theme framework, Blueprint, we highly encourage switching to Stencil so you can take advantage of the new features and benefits. For more in-depth information about Stencil’s features, see the [Stencil Theme Platform](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#features) page. + +## Why transition to Stencil? + +Stencil improves the overall storefront experience for merchants and their customers. With enhancements in speed, security, and updates to your themes, this modern framework provides a more streamlined process for the everyday maintenance and tasks required to run a store. + +Stencil themes are built on non-proprietary, open-source code to provide easier adoption and adaptation while providing greater flexibility and access for customization. In comparison, Blueprint is built on a rigid, proprietary codebase, making it difficult to tailor and extend theme functionality. + +For more information on the enhanced capabilities of Stencil, see the [Stencil vs. Legacy Blueprint](https://support.bigcommerce.com/s/article/The-Stencil-Theme-Platform#compare) page. + +## Technical differences + +When transitioning any store from Blueprint to Stencil, you should be aware of a few key differences. Transitioning to Stencil allows developers to do the following: +- [Develop locally on Stencil CLI](#developing-locally-on-stencil-cli) +- [Use Handlebars instead of global variables](#using-handlebars) +- [Customize Page Builder mode](#customize-page-builder-mode) +- [Create custom templates](#create-custom-templates) + + +### Developing locally on Stencil CLI + +For complete control over a theme’s appearance, logic, and theme configuration files, developers can use the Stencil command line interface (Stencil CLI). This interface allows you to design and preview storefronts locally before pushing them to production. Access to real-time previews and testing across various devices is available via [Browsersync](https://www.browsersync.io/), a browser testing assistant built into Stencil CLI. + + +While Blueprint themes allow users to add new files and assets to themes via WebDav, Stencil assets must be added to and bundled into the theme, or referenced from an external source. + +For images referenced from anywhere in your Blueprint file directory, you will need to move these assets to your Stencil theme and reference them appropriately. You can still reference assets from within the `/content/` folder in WebDav or from an external source. + +For more information on Stencil theme assets, see the [Theme Assets](/docs/storefront/stencil/themes/style/assets) page. + +### Using Handlebars + + +While PHP variables enclosed within `%%` markers represent dynamic content, [Handlebars](https://handlebarsjs.com/), a JavaScript templating language represents BigCommerce dynamic stored data in Stencil themes. + +Handlebars keeps your HTML page clean by separating the logic-less templates from the business logic in your JavaScript files. This organization improves the structure of the application, promoting maintainability and scalability. Handlebars also simplifies the task of manually updating data in the customer-facing display view. + + +For more information about Handlebars, refer to these external resources: +- [A Beginner’s Guide to Handlebars](https://www.sitepoint.com/a-beginners-guide-to-handlebars/) +- [Getting Started with Handlebars.js](https://handlebarsjs.com/guide) +- [Handlebars interactive tutorial](http://tryhandlebarsjs.com/) + +For details on using Handlebars to surface objects in Stencil, see [Stencil Technology Stack](/docs/storefront/stencil/start/tech-stack). + +### Customize Page Builder mode + +While Blueprint uses Style Editor to customize legacy themes, Stencil uses Page Builder. [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) is BigCommerce's browser-based tool that enables merchants to rapidly modify and customize a storefront's look and feel without writing code. Stencil theme developers can configure settings for Page Builder. The configuration determines the theme's customizable aspects. + +For example, by customizing the configuration of Page Builder, you can modify how merchants customize colors, fonts, display of page features, and the number of products displayed per feature. + +When you switch to Stencil from Blueprint, you won’t lose any of your store data. However, you will lose any customization you’ve hardcoded into your previous Blueprint theme. + +### Create custom templates + +Stencil allows theme developers and merchants to assign custom layout templates to the following types of storefront pages: +- Brand (unique to Stencil) +- Category +- Product +- Store (static page) + +Unlike Blueprint, Stencil does not require that custom template file names start with an underscore. In the current Stencil release, you must create and bundle custom templates using Stencil CLI before uploading the custom templates to stores. However, once you have created and uploaded templates, authorized store users can assign them to storefront pages through the control panel. For more information on custom templates, see the [Custom Templates](/docs/storefront/stencil/themes/templates) page. + +### Resources + +For more information about switching to Stencil, see the following resources: +- [Getting Started with the Stencil Framework](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) +- [Stencil Theme Editor](https://support.bigcommerce.com/s/article/Stencil-Themes) +- [Editing Stencil Theme Files](https://support.bigcommerce.com/s/article/Stencil-Themes#edit) +- [Personalizing Your Stencil Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) +- [What to Consider When Changing Your Stencil Theme](https://support.bigcommerce.com/s/article/What-to-Consider-When-Changing-Your-Theme) diff --git a/docs/api-docs/users/Account-level-API-accounts.mdx b/docs/graphql-account/draft/Account-level-API-accounts.mdx similarity index 100% rename from docs/api-docs/users/Account-level-API-accounts.mdx rename to docs/graphql-account/draft/Account-level-API-accounts.mdx diff --git a/docs/api-docs/users/overview.mdx b/docs/graphql-account/users.mdx similarity index 100% rename from docs/api-docs/users/overview.mdx rename to docs/graphql-account/users.mdx diff --git a/docs/integrations/apps/app-extensions/glossary.mdx b/docs/integrations/apps/app-extensions/glossary.mdx new file mode 100644 index 000000000..d32a6670e --- /dev/null +++ b/docs/integrations/apps/app-extensions/glossary.mdx @@ -0,0 +1,105 @@ + +# Glossary + +The following glossary describes key App Extensions features. + +## Context + +An App Extension's **context** describes the control panel location where the Extension's UI loads. The context determines the window dimensions of the iFrame where the Extension's UI loads. There are currently two possible contexts: + +| Enum | Description | +|:-----|:------------| +| `PANEL` | The iFrame target is a side panel overlay that opens on the right side of the current [model](#model) view. Panels include expander arrows in the upper left corner that toggle the panel to full screen and then back to the narrower width, so panel markup should be responsive. The control panel URL does not change when the user clicks the App Extension's **Action** menu item. | +| `LINK` | The iFrame target is the app's usual location, in the store control panel's **Apps** sub-menu. When the user clicks the App Extension menu item, the control panel navigates them away from the [model](#model) view they were interacting with when they clicked to open the App Extension. The iFrame size is the same as other pages of your app that load in the **Apps** sub-menu. The control panel URL changes when the user clicks the App Extension's **Action** menu item. | + +## Model + +An App Extension's **model** describes the control panel view it extends. Currently, App Extensions apply to the **View All** page of an API entity. There are currently three possible models: + +| Enum | Description | +|:-----|:------------| +| `PRODUCTS` | App Extension menu items render in the **Action** menu for each product on the **[View Products](https://login.bigcommerce.com/deep-links/manage/products)** page. | +| `ORDERS` | App Extension menu items render in the **Action** menu for each order on the **[View Orders](https://login.bigcommerce.com/deep-links/manage/orders)** page. | +| `CUSTOMERS` | App Extension menu items render in the **Action** menu for each customer on the **[View Customers](https://login.bigcommerce.com/deep-links/manage/customers)** page. | + +## Label + +An App Extension's **label** is the human-readable link text that describes it in the **Action** menu of each item listed on its [model](#model) page. + +For example, in the following App Extension, when a user is on the **View Orders** page and clicks **Add personal thanks** in the **Action** menu for any order, **Add personal thanks** is the label. + +```json filename="Partial App Extension query response, Add personal thanks" showLineNumbers copy +{ + "id": "bc/store/appExtension/2", + "url": "/orders/${id}/personal-thanks", + "model": "ORDERS", + "label": { + "defaultValue": "Add personal thanks" + } +} +``` + +## Label.defaultValue + +Use English for an App Extension's default label. BigCommerce uses this link text when the control panel locale settings do not correspond with any of the locale codes defined in the App Extension at `label.locales.localeCode`. The technical string length limit is 255 characters, but for the most predictable user experience, we suggest a length of ≤25 characters. + +## Label.locales + +In the `AppExtension` mutation, the `label.locales` array describes alternate label text for control panel users using languages other than English. The locale labels render based on the **Preferred language** configured in **[My Profile > Profile Information](https://login.bigcommerce.com/deep-links/manage/user-settings/profile)**. For a list of locales the control panel currently supports, see [User Profile: Edit Profile (Help Center)](https://support.bigcommerce.com/s/article/User-Profile#edit-profile). + +For example, in the following App Extension, when a user with their control panel language set to French is on the **View Orders** page and clicks **Envoyez un merci personnel** in the **Action** menu for any order, **Envoyez un merci personnel** is the label. + +```json filename="Partial App Extension query response, Add personal thanks" showLineNumbers copy +{ + "id": "bc/store/appExtension/2", + "url": "/orders/${id}/personal-thanks", + "model": "ORDERS", + "label": { + "defaultValue": "Add personal thanks", + "locales": [ + { + "value": "Envoyez un merci personnel", + "localeCode": "fr-FR" + } + ] + } +} +``` + +## Label.locales.localeCode + +For a list of locales the control panel currently supports, see [User Profile: Edit Profile (Help Center)](https://support.bigcommerce.com/s/article/User-Profile#edit-profile). + +## Label.locales.value + +BigCommerce uses this link text when the control panel locale settings correspond with the text's accompanying locale code. The technical string length limit is 255 characters, but for the most predictable user experience, we suggest a length of ≤25 characters. + +## URL + +The `url` is the App Extension's path, or *deep link*. In the `AppExtension` mutation, the `url` contains variable parameters templated as JavaScript ES6+ strings. **The string length limit is 255 characters.** + +When the user clicks the App Extension's [label](#label), BigCommerce sends your app a [load callback](#load-callback). The load callback's [signed_payload_jwt](#signed_payload_jwt) contains a `url` property in which the variable parameters you defined are replaced with data points injected by the referring model. Consider the following App Extension and action diagram: + +```json filename="Partial App Extension query response, Add personal thanks" showLineNumbers copy +{ + "id": "bc/store/appExtension/2", + "url": "/orders/${id}/personal-thanks", + "model": "ORDERS", + "label": { + "defaultValue": "Add personal thanks" + } +} +``` + +![App Extension URL diagram](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/app-extensions-scope.png "App Extension URL diagram") + + +## signed_payload_jwt + +The contextual information your app needs to load an App Extension is delivered using properties of our load callback's `signed_payload_jwt`. + +For more information, see [Handling App Callbacks: Data Properties in the signed_payload_jwt](/docs/integrations/apps/guide/callbacks#data-properties-in-the-signed_payload_jwt). + +## Load callback + +Clicking an App Extension menu item triggers the **load** callback. If you're using the [Next.js starter app](https://github.com/bigcommerce/sample-app-nodejs), a significant amount of app callback complexity is handled for you under the covers. If you're using a different stack or want to learn more, see [Handling App Callbacks](/docs/integrations/apps/guide/callbacks#render-the-app-with-load). diff --git a/docs/integrations/apps/app-extensions/guide.mdx b/docs/integrations/apps/app-extensions/guide.mdx new file mode 100644 index 000000000..f23d8f899 --- /dev/null +++ b/docs/integrations/apps/app-extensions/guide.mdx @@ -0,0 +1,591 @@ +# App Extensions: Guide + +This guide describes how to get started developing App Extensions. It contains the following: + +- An App Extensions-flavored variation on setting up a draft app +- Example requests and responses for the App Extensions mutations and query +- Implementation and code examples + +## Prerequisites + +Before getting started working with App Extensions, make sure you have the following: + +- A BigCommerce store; we recommend using a [sandbox store](/docs/start/about/sandboxes) or other non-production store. +- A [Developer Portal](https://devtools.bigcommerce.com/my/apps) account registered to the same email account that owns the sandbox store. +- General familiarity with developing BigCommerce apps. To familiarize yourself, see the [Apps Guide](/docs/integrations/apps) or [Apps Quick Start](/docs/integrations/apps/quick-start). + +## OAuth scopes + +<Callout type="info"> + Use an [app-level API + account](/docs/start/authentication/api-accounts#app-level-api-accounts) to + make App Extensions API calls. Neither + [store-level](/docs/start/authentication/api-accounts#store-level-api-accounts) + nor + [account-level](/docs/start/authentication/api-accounts#store-level-api-accounts) + API accounts can manage App Extensions. +</Callout> + +The following section describes the process for creating an app profile and app-level API account. Configure the following OAuth scopes as directed in [Setup](#setup): + +| Name | Permission | Parameter | Description | +| :--- | :--------- | :-------- | :---------- | +| App Extensions | manage | `store_app_extensions_manage` | Manage App Extensions; requires an app-level API account | +| Other | | | As needed for the app to function; for a list, see [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes). | + +## Setup + +<Callout type="info"> + Unlike store-level API accounts, you can edit an app-level API account's list + of authorized scopes during development. +</Callout> + +<Steps> + ### Create an app profile + + Generate an [app-level API account](/docs/start/authentication/api-accounts#app-level-api-accounts) by [creating an app profile](/docs/integrations/apps/guide/developer-portal#create-an-app-profile) in a [Developer Portal account](https://devtools.bigcommerce.com/my/apps) registered to the same email account that owns the development store. + + Add the [required OAuth scopes](#oauth-scopes) from the preceding section on the **Technical** tab of the app profile dialog, then click **Update & Close**. + + For more information on creating app profiles, see [Managing Apps in the Developer Portal](/docs/integrations/apps/guide/developer-portal). + + The following image shows the `App Extensions : manage` scope on the **Technical** tab of the Developer Portal's app profile dialog: + + ![App Extensions scope](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/app-extensions-scope.png "App Extensions scope") + + ### Create a draft app + + You can fork our [Next.js starter app](https://github.com/bigcommerce/sample-app-nodejs) to get started quickly. + + After you clone the starter app repository, [start the development server](https://github.com/bigcommerce/sample-app-nodejs/blob/main/package.json#L7) and [serve the draft app over https using ngrok](/docs/integrations/apps/quick-start#add-and-start-ngrok). + + For more information on persisting ngrok tunnels longer, see [ngrok configuration](/docs/integrations/apps/quick-start#ngrok-configuration). + + For more information on working with draft apps, see the [Apps Quick Start](/docs/integrations/apps/quick-start) or [Apps Guide](/docs/integrations/apps). + + ```shell filename="Draft app terminal commands" showLineNumbers copy + git clone git@github.com:bigcommerce/sample-app-nodejs.git app-with-extensions + + cd app-with-extensions + + npm install + + npm run dev + + # open new terminal window + + npm install ngrok + + ngrok http 3000 + ``` + + ### Edit the draft app's environment variables + + Copy `.env-sample` and rename it `.env`. Add the app profile's **client ID** and **client secret**. Select a database type and enter your connection credentials. Configure the app callback URLs by replacing the [domain name](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL#authority) segment of the pre-populated **auth callback URL** with the ngrok instance's domain name. For more on configuring additional environment variables, see the [starter app README](https://github.com/bigcommerce/sample-app-nodejs) and [.env-sample](https://github.com/bigcommerce/sample-app-nodejs/blob/main/.env-sample). + + For more information on working with app environment variables, see the [Apps Quick Start](/docs/integrations/apps/quick-start#configure-environment-variables). + + ```shell filename=".env" showLineNumbers copy + #Get the Client ID and Secret from the Developer Portal + # https://developer.bigcommerce.com/api-docs/apps/quick-start#register-a-draft-app + CLIENT_ID={app client id} + CLIENT_SECRET={app secret} + + # Test locally with ngrok + # https://developer.bigcommerce.com/api-docs/apps/guide/development#testing-locally-with-ngrok + AUTH_CALLBACK=https://{ngrok_url}/api/auth + + # Replace jwt key with a 32+ random character secret + JWT_KEY={SECRET} + + # Specify the type of database + DB_TYPE=firebase + + # If using firebase, enter your config here + FIRE_API_KEY={firebase key} + FIRE_DOMAIN={firebase domain} + FIRE_PROJECT_ID={firebase project id} + + # If using mysql, enter your config here + MYSQL_HOST={mysql host} + MYSQL_DATABASE={mysql database name} + MYSQL_USERNAME={mysql username} + MYSQL_PASSWORD={mysql password} + MYSQL_PORT={mysql port *optional*} + + # BigCommerce API URL + API_URL=api.bigcommerce.com + ``` + + ### Seed the database + + Use the starter app's [db:setup script](https://github.com/bigcommerce/sample-app-nodejs/blob/main/package.json#L12), then restart the development server. + + ```shell filename="Seed the database" showLineNumbers copy + npm run db:setup + + npm run dev + ``` + + ### Add the ngrok callback URLs to the app profile + + Copy the ngrok domain name from the `.env` file to the matching inputs on the **Technical** tab of the **app profile**. + + ![Callback URLs](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/callback-urls.png "Callback URLs") + + ### Install the draft app on your store + + For directions, see the [Apps Quick Start](/docs/integrations/apps/quick-start#install-the-app). + +</Steps> + +## Example requests + +This section contains examples of App Extensions-related GraphQL Admin API queries and mutations. It presents mutations and their variables separately. You can use a tool like [Postman](https://postman.com) or [Altair](https://altairgraphql.dev/) to make requests; if you prefer to get started quickly in Postman, see the [App Extensions Postman collection](/docs/integrations/apps/app-extensions/postman). + +Use the following HTTP configuration to send requests: + +```http filename="GraphQL Admin API HTTP configuration" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/graphql +X-Auth-Token: {{access_token}} +Accept: application/json +Content-Type: application/json +``` + +The following examples direct you to stringify the GraphQL query portion of your requests, but how this works in practice varies depending on the client you use. + +### Create an App Extension + +The [createAppExtension](/graphql-admin/reference#definition-AppExtensionMutations) mutation registers an App Extension that opens a side panel on the store control panel's customers page to let users read and write notes about interactions with specific customers. + +<Tabs items={['Mutation', 'Variables', 'Request and Response']}> + <Tab> + + ```graphql filename="Example mutation: createAppExtension" showLineNumbers copy + mutation AppExtension($input: CreateAppExtensionInput!) { + appExtension { + createAppExtension(input: $input) { + appExtension { + id + context + model + url + label { + defaultValue + locales { + value + localeCode + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example variables: createAppExtension" showLineNumbers copy + { + "input": { + "context": "PANEL", + "model": "CUSTOMERS", + "url": "/customers/${id}/interactions", + "label": { + "defaultValue": "Interactions", + "locales": [ + { + "value": "Interaction Notes", + "localeCode": "en-US" + }, + { + "value": "Notas de interacción", + "localeCode": "es-MX" + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```http filename="Example request: createAppExtension" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/graphql + X-Auth-Token: {{access_token}} + Accept: application/json + Content-Type: application/json + + { + "query": "`mutation`", //stringify the value from the Mutation tab + "variables": variables //use the value from the variables tab + } + + ``` + + ```json filename="Example response: createAppExtension" showLineNumbers copy + { + "data": { + "appExtension": { + "createAppExtension": { + "appExtension": { + "id": "bc/store/appExtension/2", + "context": "PANEL", + "model": "CUSTOMERS", + "url": "/customers/${id}/interactions", + "label": { + "defaultValue": "Interactions", + "locales": [ + { + "value": "Interaction Notes", + "localeCode": "en-US" + }, + { + "value": "Notas de interacción", + "localeCode": "es-MX" + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Get a store's App Extensions + +The [Store appExtensions](/graphql-admin/reference#query-store) query returns a list of the store's App Extensions registered to the API account that makes the request, along with any details requested using the query schema. Note that all GraphQL requests use the `POST` method. + +<Tabs items={['Query', 'Request and Response']}> + <Tab> + + ```graphql filename="Example query: Get store appExtensions" showLineNumbers copy + query { + store { + appExtensions { + edges { + node { + id + url + model + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```http filename="Example request: Store appExtensions" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/graphql + X-Auth-Token: {{access_token}} + Accept: application/json + Content-Type: application/json + + { + "query": "`query`" //stringify the value from the Query tab + } + + ``` + + ```json filename="Example response: Store appExtensions" showLineNumbers copy + { + "data": { + "store": { + "appExtensions": { + "edges": [ + { + "node": { + "id": "bc/store/appExtension/1", + "url": "/product-app-extension/${id}", + "model": "PRODUCTS" + } + }, + { + "node": { + "id": "bc/store/appExtension/2", + "url": "/customers/${id}/interactions", + "model": "CUSTOMERS" + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Update an App Extension + +The [updateAppExtension](/graphql-admin/reference#definition-AppExtensionMutations) mutation can update the `label` object and the `url` of an existing App Extension. All other properties are non-mutable. + +Changes to the `label` object overwrite existing values, rather than upserting. Be sure to send the full label object you intend the App Extension to have. + +Note that the `UpdateAppExtensionInput` has two properties, `id` and `data`. Add the desired new values for the `url` or `label` properties to the `data` attribute. + +<Tabs items={['Mutation', 'Variables', 'Request and Response']}> + <Tab> + + ```graphql filename="Example mutation: updateAppExtension" showLineNumbers copy + mutation AppExtension($input: UpdateAppExtensionInput!) { + appExtension { + updateAppExtension(input: $input) { + appExtension { + id + url + label { + defaultValue + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example variables: updateAppExtension" showLineNumbers copy + { + "input": { + "id": "bc/store/appExtension/2", + "data": { + "url": "/interactions/customers/${id}" + } + } + } + ``` + + </Tab> + <Tab> + + ```http filename="Example request: updateAppExtension" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/graphql + X-Auth-Token: {{access_token}} + Accept: application/json + Content-Type: application/json + + { + "query": "`mutation`", //stringify the value from the Mutation tab + "variables": variables //use the value from the variables tab + } + + ``` + + ```json filename="Example response: updateAppExtension" showLineNumbers copy + { + "data": { + "appExtension": { + "updateAppExtension": { + "appExtension": { + "id": "bc/store/appExtension/2", + "url": "/interactions/customers/${id}", + "label": { + "defaultValue": "Interactions" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Delete an App Extension + +The [deleteAppExtension](/graphql-admin/reference#definition-AppExtensionMutations) mutation deletes an App Extension. It cannot be recovered. Note that you can request an additional property that isn't accessible to the other queries and mutations, `deletedAppExtensionId`. You can't request any other properties in the delete mutation. + +<Tabs items={['Mutation', 'Variables', 'Request and Response']}> + <Tab> + + ```graphql filename="Example mutation: deleteAppExtension" showLineNumbers copy + mutation AppExtension($input: DeleteAppExtensionInput!) { + appExtension { + deleteAppExtension(input: $input) { + deletedAppExtensionId + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example variables: deleteAppExtension" showLineNumbers copy + { + "input": { + "id": "bc/store/appExtension/2" + } + } + ``` + + </Tab> + <Tab> + + ```http filename="Example request: deleteAppExtension" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/graphql + X-Auth-Token: {{access_token}} + Accept: application/json + Content-Type: application/json + + { + "query": "`mutation`", //stringify the value from the Mutation tab + "variables": variables //use the value from the variables tab + } + + ``` + + ```json filename="Example response: deleteAppExtension" showLineNumbers copy + { + "data": { + "appExtension": { + "deleteAppExtension": { + "deletedAppExtensionId": "bc/store/appExtension/2" + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Example code + +### Starter app + +The BigCommerce [Next.js starter app (GitHub)](https://github.com/bigcommerce/sample-app-nodejs/tree/app-extensions) contains a branch that features a working, end-to-end App Extensions reference implementation. + +### Code sample + +The following Node.js code sample uses the [node-fetch http request package](https://www.npmjs.com/package/node-fetch) to create a color picker App Extension that opens in a side panel on the **View Products** page of the merchant's store control panel. + +<Tabs items={['Configuration', 'Request Logic']}> + <Tab> + +```js filename="create-color-picker-extension.js" showLineNumbers copy +import setAppExtension from "./set-app-extension"; + +// Hardcoded example of store-specific credentials +const subjectStore = { + store_hash: "qwerty", + // the store's access_token from your DB + access_token: "xxxxxalphanumxxxxx" +}; + +// stringified GraphQL Mutation +const registerAppExtensionMutation = ` +mutation AppExtension($input: CreateAppExtensionInput!) { + appExtension { + createAppExtension(input: $input) { + appExtension { + id + context + model + url + label { + defaultValue + locales { + value + localeCode + } + } + } + } + } +} +`; + +// This GraphQL variable describes the particular App Extension your app is registering; modify for your use case +const colorPickerExtension = { + input: { + context: "PANEL", + model: "PRODUCTS", + url: "/product/${id}/pigment", + label: { + defaultValue: "Select Color", + locales: [ + { + value: "Pick Color", + localeCode: "en-US" + }, + { + value: "Choisissez la couleur", + localeCode: "fr-FR" + }, + ], + }, + }, +}; + +return setAppExtension( + subjectStore, + registerAppExtensionMutation, + colorPickerExtension +); +``` + + </Tab> + <Tab> + + ```js filename="set-app-extension.js" showLineNumbers copy + // set-app-extension.js + import fetch from 'node-fetch'; + + const newAppExtension = async(store, query, variables) => { + + let {store_hash, access_token} = store; + + try { + + let response = await fetch({ + method: 'POST', + url: `https://api.bigcommerce.com/stores/${store_hash}/graphql`, + headers: { + 'X-Auth-Token': access_token, + 'Accept': 'application/json', + 'Content-Type': 'application/json', + }, + body: { + query, + variables + } + }); + + let data = await response.json(); + console.log(data); + + } catch(error) { + console.log(error); + }; + } + + export default async(store, query, variables) => await newAppExtension(store, query, variables); + ``` + + </Tab> +</Tabs> + +## Resources + +### Related articles + +- [Developer Portal](https://devtools.bigcommerce.com) +- [Single-Click App OAuth Flow](/docs/integrations/apps/guide/auth) + +### External resources + +- [node-fetch http request package (npmjs.com)](https://www.npmjs.com/package/node-fetch) diff --git a/docs/integrations/apps/app-extensions/index.mdx b/docs/integrations/apps/app-extensions/index.mdx new file mode 100644 index 000000000..d468883d3 --- /dev/null +++ b/docs/integrations/apps/app-extensions/index.mdx @@ -0,0 +1,262 @@ +# App Extensions Overview + +App Extensions help developers extend the capabilities of the BigCommerce control panel by registering custom menu items that appear on select native control panel pages. This article is a high-level explanation of what App Extensions are and what they can do, and covers the following topics: + +* The App Extensions user experience +* Registering App Extensions +* Rendering markup from an App Extension's [load callback](/docs/integrations/apps/guide/callbacks#render-the-app-with-load) +* The sources of truth for the information required to respond accurately to an App Extension [load callback](/docs/integrations/apps/guide/callbacks#render-the-app-with-load), including: + * The App Extension object + * The load callback's **signed_payload_jwt** + * Your app or an API call +* Use cases + +For more detail about each attribute of the App Extension object, see the [App Extensions Glossary](/docs/integrations/apps/app-extensions/glossary) or the [full AppExtension object schema](/graphql-admin/reference#definition-AppExtension) in GraphQL Admin API Reference. + +## User experience + +As the preceding section says, App Extensions let you add custom menu items on select control panel pages. This section describes what that's like from the user's point of view. + +### Locale support + +App Extensions support all available control panel languages, so you can show the user app content in the language they are already using. You can register alternate link text for any [supported control panel language (Help Center)](https://support.bigcommerce.com/s/article/User-Profile#edit-profile) and handle content rendering to present markup in translation on a per-user basis, using the `user.locale` property of the [signed_payload_jwt](/docs/integrations/apps/guide/callbacks#data-properties-in-the-signed_payload_jwt) that accompanies BigCommerce's [load callback](/docs/integrations/apps/guide/callbacks#render-the-app-with-load) to your app. + +### Navigation + +When a control panel user clicks an App Extension-generated menu item, the app can either render content in a side panel - without navigating the user away from the native page - or it can redirect the user to the app's home iFrame in the **Apps** sub-menu, and render App Extension-specific content there. + +The following set of tabs show example pictures of the menu item and two load contexts, along with the schemas that describe them. If image diagrams are not accessible to you, use the alt text to determine which sections of the [App Extensions Glossary](/docs/integrations/apps/app-extensions/glossary) to read instead. + +### Menu item + +The menu item also includes one of the app images you upload as part of the app profile. A production app that uses App Extensions should have high-quality app images. You can read more about app images in the [Apps Guide](/docs/integrations/apps/app-extensions/guide). + +The following tabs show a screenshot of an App Extensions menu item and the corresponding AppExtensions object. For more about the menu item [URL](/docs/integrations/apps/app-extensions/glossary#url) and [default label](/docs/integrations/apps/app-extensions/glossary#label), see the [App Extensions Glossary](/docs/integrations/apps/app-extensions/glossary). + +Use English for `label.defaultValue`. + +<Tabs items={["Screenshot of menu item", "App Extension Schema"]}> + <Tab> + ![An App Extension menu item on the Orders page, with the link text highlighted. For more info, see the App Extensions Glossary.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/orders-personal-thanks-app-extension.png) + </Tab> + <Tab> + ```json {5,7} filename="Store appExtension" showLineNumbers copy + { + "id": "bc/store/appExtension/2", + "model": "ORDERS", + "context": "PANEL", + "url": "/orders/${id}/personal-thanks", // link in your app + "label": { + "defaultValue": "Add personal thanks", // link text + "locales": [ + { + "value": "Envie pessoal obrigado", + "localeCode": "pt-BR" + } + ] + } + } + ``` + </Tab> +</Tabs> + +### Panel + +In the **panel context**, the App Extension renders your response to the [load callback](/docs/integrations/apps/guide/callbacks#render-the-app-with-load) in an overlay panel that opens from the right. The panel is responsive, so make sure to send responsive markup. The width can vary from 45% to nearly 100% of the control panel content page. + +The following tabs show both a panel and an example of an alternate user locale. The first tab contains screenshots of the control panel locale, an App Extensions menu item, and app content rendered in the panel context. The second tab shows the corresponding AppExtensions object and signed_payload_jwt, with highlighted lines that indicate what information is useful in determining which locale's markup to send. For more about [rendering context](/docs/integrations/apps/app-extensions/glossary#context) and [label locales](/docs/integrations/apps/app-extensions/glossary#label-locales), see the [App Extensions Glossary](/docs/integrations/apps/app-extensions/glossary). + +<Tabs items={["Screenshot of side panel", "App Extension and JWT"]}> + <Tab> + + ![The User Profile information page, with language input set to English.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/profile-language-english.png) + + ![The same App Extension menu item on the Orders page as the preceding set of tabs, rendered in a control panel configured to use English.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/orders-personal-thanks-app-extension.png) + + ![The App Extension side panel on the Orders page, in English. For more info, see the App Extensions Glossary.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/app-extensions-panel-content-english.png) + + </Tab> + <Tab> + ```json {4-5,7} filename="Store appExtension" showLineNumbers copy + { + "id": "bc/store/appExtension/2", + "model": "ORDERS", + "context": "PANEL", + "url": "/orders/${id}/personal-thanks", // link in your app + "label": { + "defaultValue": "Add personal thanks", // link text + "locales": [ + { + "value": "Envie pessoal obrigado", + "localeCode": "pt-BR" + } + ] + } + } + ``` + + ```json {12,18} filename="signed_payload_jwt" showLineNumbers copy + { + "aud": "xxxxxxAppClientIdxxxxx", + "iss": "bc", + "iat": 1687811320, + "nbf": 1687811315, + "exp": 1687897720, + "jti": "546b29bf-e648-45f9-911e-ad59df520cae", + "sub": "stores/{store_hash}", + "user": { + "id": 2222222, + "email": "shanice.jackson@example.com", + "locale": "en-US" + }, + "owner": { + "id": 1111111, + "email": "ana.oliveiria@example.com" + }, + "url": "/orders/106/personal-thanks", + "channel_id": null + } + ``` + </Tab> +</Tabs> + +### Link + + + +<Tabs items={["Screenshot of deep link", "App Extension and JWT"]}> + <Tab> + + ![The User Profile information page, with language input set to Portuguese.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/profile-language-portuguese.png) + + ![A link version of the same App Extension menu item on the Orders page as the preceding set of tabs, rendered in a control panel configured to use Portuguese.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/orders-personal-thanks-portugues.png) + + ![A page in the Apps menu that opened after the user clicked an App Extension that uses the link context. For more info, see the App Extensions Glossary.](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-extensions/app-extensions-link-content-portugues.png) + + </Tab> + <Tab> + ```json {4-5,10-11} filename="App Extension schema" showLineNumbers copy + { + "id": "bc/store/appExtension/17", + "model": "ORDERS", + "context": "LINK", + "url": "/orders/${id}/personal-thanks", + "label": { + "defaultValue": "Add personal thanks", + "locales": [ + { + "value": "Envie pessoal obrigado", + "localeCode": "pt-BR" + } + ] + } + } + ``` + + ```json {12,18} filename="signed_payload_jwt" showLineNumbers copy + { + "aud": "xxxxxxAppClientIdxxxxx", + "iss": "bc", + "iat": 1687811320, + "nbf": 1687811315, + "exp": 1687897720, + "jti": "546b29bf-e648-45f9-911e-ad59df520cae", + "sub": "stores/{store_hash}", + "user": { + "id": 1111111, + "email": "ana.oliveiria@example.com", + "locale": "pt-BR" + }, + "owner": { + "id": 1111111, + "email": "ana.oliveiria@example.com" + }, + "url": "/orders/106/personal-thanks", + "channel_id": null + } + ``` + </Tab> +</Tabs> + +## Registering App Extensions + +You can register, update, query, and remove App Extensions using the [GraphQL Admin API](/graphql-admin/reference). For example requests and responses, as well as additional information about each call, see the [App Extensions Guide](/docs/integrations/apps/app-extensions/guide). + +### Store-specific registration + +App Extensions are registered independently for each store that installs your app; they are scoped to the **store**, not the app client ID. This means you must register a given App Extension separately for each store. This provides several benefits, including the following: + +* Your app can offer App Extension-based functionality based on user settings, pricing plan, or code version. +* You can offer different sets of App Extensions to different stores. +* You can design your app to be transparent about the data you collect and allow merchants to opt out of features. +* You can limit the app's exposure to denial-of-service attacks. +* You can control the timing of an App Extension's rollout in the store control panel. + +It's a best practice for your app to keep track of how it has instantiated its types of App Extensions on each store; namely, the mapping between the store's App Extension IDs and your set of possible App Extensions. This is particularly crucial if you offer several related App Extensions distinguished by settings or pricing. You can retrieve your app's App Extensions from BigCommerce using the [Store appExtensions](/docs/integrations/apps/app-extensions/guide#get-a-stores-app-extensions) query. + +The simplest design pattern is registering identical App Extensions on each store as part of your app's initial installation flow. You can use the [updateAppExtension](/docs/integrations/apps/app-extensions/guide#update-an-app-extension) mutation to modify them later or use the [deleteAppExtension](/docs/integrations/apps/app-extensions/guide#remove-an-app-extension) mutation to remove them. + +## Sources of truth + +Several components go into using App Extensions effectively. The following table lists some of the key components of App Extensions and disambiguates the source of truth for each: + +| Component or feature | AppExtension schema object | Your app | signed_payload_jwt | +|:---------------------|:---------------------------|:---------|:-------------------| +| Markup rendering context | `context` | | | +| App Extension markup | | × | | +| Relative URL that contains an entity ID | `url` with variable | | `url` with value | +| Relative URL validation and response logic | | × | | +| Locale-based link text in the **Action** menu | `label.locales` | | | +| Support for locale-based markup | | × | `user.locale` | + +## Supported control panel pages + +Each App Extension is associated with one control panel page, which you define using the [model](/docs/integrations/apps/app-extensions/glossary#model) property. The model corresponds with the page's primary API entity. + +For supported models, see the [App Extensions Glossary](/docs/integrations/apps/app-extensions/glossary) and the [GraphQL Admin API Reference](/graphql-admin/reference). + +<Callout type="info"> + There is a **limit** of two App Extensions per app, per [model](/docs/integrations/apps/app-extensions/glossary#model). Your app can register up to two App Extensions for the orders model, two for the products model, and two for customers. If these limits are detrimental to your use case or user experience, please reach out through our [Developer Community](/community). +</Callout> + + +## Load context + +When you develop an App Extension, keep in mind the two available page load contexts: the side panel, or panel, and the deep link, or link. Panel-type App Extensions load in an `<iframe>` element that overlays the content of the control panel page in which they are embedded. Link-type App Extensions redirect to a detail view in the app's dedicated iFrame in the **Apps** sub-menu. + +The side panel context can enhance a lot of use cases that benefit from keeping the control panel user on the page for task context or workflow efficiency reasons. The user can expand the panel to full screen, but if the task the App Extension assists would benefit from additional control over page routing, the link context can provide the desired experience. The link context allows users to jump to the relevant page within the app. It supports transparent multi-page workflows because the app can expose additional URLs that let the user navigate more intuitively between different routes in the app. + +## Use cases + +The App Extensions feature unlocks new use cases. The following sections organize use cases by the supported control panel page. + +### View Orders + +* Send receipts on request. +* View and modify draft invoices. +* Verify or manually retry order syncing between BigCommerce and an OMS or ERP system. +* Generate and view a pick map that gives stockroom associates the fastest fulfillment trajectory through a warehouse, using data from the Catalog API or a third-party PIM system. +* Use Inventory and Location API features to help group or regroup multi-consignment order items. +* Use the control panel to move orders through more complex fulfillment states than are available in the native control panel view. + +### View Customers + +* Open equivalent customer objects in a CRM or help desk system. +* Check whether the merchant has received feedback, input, or requests from the customer in multiple channels, such as emails in a shared inbox. +* Expose Customer attributes and other data in a CRM-like interface. +* View multiple parts of a customer's shopper journeys from both BigCommerce and third-party providers, such as net promoter score, abandoned cart metrics, promotions used, and customer reviews. +* Unlock extra features written into a headless storefront bundle on a per-customer basis. + +### View Products + +* Manage related variants in a novel UI. +* Expose the whole product object, including metafields, for control panel users to view and edit. +* Expose a third-party product configurator that uses an ERP or PIM system as the source of truth, then use the Catalog API to sync with BigCommerce and resolve any errors. + +## Using App Extensions in public apps + +Public apps that use App Extensions have the following additional requirements for approval: +* Must meet the [App Marketplace approval criteria](/docs/integrations/apps/guide/requirements) +* Must follow the best practices outlined for App Extensions and the BigCommerce platform +* Must use our [BigDesign component library](https://developer.bigcommerce.com/big-design/) to match the look and feel of the underlying control panel +* Must complete a UX review session diff --git a/docs/integrations/apps/app-extensions/postman.mdx b/docs/integrations/apps/app-extensions/postman.mdx new file mode 100644 index 000000000..b092c9b81 --- /dev/null +++ b/docs/integrations/apps/app-extensions/postman.mdx @@ -0,0 +1,193 @@ +# App Extensions Postman Collection + +One way to get started or refine requests is to use the BigCommerce App Extensions Postman collection, which contains the core mutations and queries. To work with the Postman collection, you need to supply the following: + +* The sandbox store's `store_hash`. +* The sandbox store's `access_token` is available in your app's database as soon as you successfully install the app. You can also add a console log to get it from the terminal after the app completes the [auth callback](/docs/integrations/apps/guide/auth). + +## Importing the collection + +The following code block is an exported Postman collection of App Extensions mutations and queries. To copy the collection, hover over the upper right corner of the code block. + +For instructions on importing collections into Postman, see their article on [Importing and Exporting Data (Postman)](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/#importing-postman-data). + +```json filename="App Extensions Postman collection" showLineNumbers copy +{ + "info": { + "_postman_id": "e4f08356-fc98-4b78-8ccd-edb6e88ab7b2", + "name": "BigCommerce App Extensions", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "18111578" + }, + "item": [ + { + "name": "get a store's app extensions", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "query {\n store {\n appExtensions {\n edges {\n node {\n id\n url\n context\n model\n }\n }\n }\n }\n}", + "variables": "" + } + }, + "url": { + "raw": "https://api.bigcommerce.com/stores/{{store_hash}}/graphql", + "protocol": "https", + "host": [ + "api", + "bigcommerce", + "com" + ], + "path": [ + "stores", + "{{store_hash}}", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "create an app extension", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation AppExtension($input: CreateAppExtensionInput!) {\n appExtension {\n createAppExtension(input: $input) {\n appExtension {\n id\n context\n label {\n defaultValue\n locales {\n value\n localeCode\n }\n }\n model\n url\n }\n }\n }\n}", + "variables": "{\n \"input\": {\n \"context\": \"PANEL\",\n \"model\": \"CUSTOMERS\",\n \"url\": \"/customers/${id}\",\n \"label\": {\n \"defaultValue\": \"Link Text\",\n \"locales\": [\n {\n \"value\": \"Link Text\",\n \"localeCode\": \"en-US\"\n },\n {\n \"value\": \"Texto del enlace\",\n \"localeCode\": \"es-MX\"\n },\n {\n \"value\": \"Texte du lien\",\n \"localeCode\": \"fr-FR\"\n }\n ]\n }\n }\n}" + } + }, + "url": { + "raw": "https://api.bigcommerce.com/stores/{{store_hash}}/graphql", + "protocol": "https", + "host": [ + "api", + "bigcommerce", + "com" + ], + "path": [ + "stores", + "{{store_hash}}", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "update an app extension", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation AppExtension($input: UpdateAppExtensionInput!) {\n appExtension {\n updateAppExtension(input: $input) {\n appExtension {\n id\n url\n }\n }\n }\n}", + "variables": "{\n \"input\": {\n \"id\": \"bc/store/appExtension/5\",\n \"data\": {\n \"url\": \"/customers/profile/${id}\"\n } \n }\n}" + } + }, + "url": { + "raw": "https://api.bigcommerce.com/stores/{{store_hash}}/graphql", + "protocol": "https", + "host": [ + "api", + "bigcommerce", + "com" + ], + "path": [ + "stores", + "{{store_hash}}", + "graphql" + ] + } + }, + "response": [] + }, + { + "name": "delete an app extension", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "graphql", + "graphql": { + "query": "mutation AppExtension($input: DeleteAppExtensionInput!) {\n appExtension {\n deleteAppExtension(input: $input) {\n deletedAppExtensionId\n }\n }\n}", + "variables": "{\n \"input\": {\n \"id\": \"bc/store/appExtension/5\" \n }\n}" + } + }, + "url": { + "raw": "https://api.bigcommerce.com/stores/{{store_hash}}/graphql", + "protocol": "https", + "host": [ + "api", + "bigcommerce", + "com" + ], + "path": [ + "stores", + "{{store_hash}}", + "graphql" + ] + } + }, + "response": [] + } + ], + "auth": { + "type": "apikey", + "apikey": [ + { + "key": "value", + "value": "{{access_token}}", + "type": "string" + }, + { + "key": "key", + "value": "X-Auth-Token", + "type": "string" + } + ] + }, + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "access_token", + "value": "", + "type": "string" + }, + { + "key": "store_hash", + "value": "", + "type": "string" + } + ] +} +``` + +## Resources + +* [Importing and Exporting Data (postman.com)](https://learning.postman.com/docs/getting-started/importing-and-exporting-data/#importing-postman-data) +* [Apps Guide: Implementing OAuth](/docs/integrations/apps/guide/auth) diff --git a/docs/api-docs/apps/guide/apps-05-oauth.mdx b/docs/integrations/apps/guide/auth.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-05-oauth.mdx rename to docs/integrations/apps/guide/auth.mdx diff --git a/docs/api-docs/apps/guide/apps-11-best-practices.mdx b/docs/integrations/apps/guide/best-practices.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-11-best-practices.mdx rename to docs/integrations/apps/guide/best-practices.mdx diff --git a/docs/api-docs/apps/guide/apps-10-buttons.mdx b/docs/integrations/apps/guide/buttons.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-10-buttons.mdx rename to docs/integrations/apps/guide/buttons.mdx diff --git a/docs/api-docs/apps/guide/apps-06-callbacks.mdx b/docs/integrations/apps/guide/callbacks.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-06-callbacks.mdx rename to docs/integrations/apps/guide/callbacks.mdx diff --git a/docs/api-docs/apps/guide/apps-04-devloper-portal.mdx b/docs/integrations/apps/guide/developer-portal.mdx similarity index 96% rename from docs/api-docs/apps/guide/apps-04-devloper-portal.mdx rename to docs/integrations/apps/guide/developer-portal.mdx index 5180ee1f5..7813a347b 100644 --- a/docs/api-docs/apps/guide/apps-04-devloper-portal.mdx +++ b/docs/integrations/apps/guide/developer-portal.mdx @@ -70,7 +70,7 @@ To learn more about using an app API account to generate store-specific access t ### Edit technical details -1. Once you [enter the app dialog](#edit-an-app), click the **Technical** tab at the top to edit enabled features, callback URLs, and OAuth scopes. +1. Once you [enter the app dialog](#edit-an-app-profile), click the **Technical** tab at the top to edit enabled features, callback URLs, and OAuth scopes. ![Technical Details](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-technical.png "Technical Details") @@ -88,7 +88,7 @@ To learn more about using an app API account to generate store-specific access t If your app supports stores that sell through multiple storefronts or sales channels, add that information to the app's profile. -1. Once you [enter the edit app dialog](#edit-an-app), click the **App Supported Features** tab at the top. +1. Once you [enter the edit app dialog](#edit-an-app-profile), click the **App Supported Features** tab at the top. ![MSF Toggle](https://storage.googleapis.com/bigcommerce-production-dev-center/images/app-api-account/devtools-msf.png "Toggle MSF on the App Supported Features tab") diff --git a/docs/api-docs/apps/guide/apps-08-events.mdx b/docs/integrations/apps/guide/events.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-08-events.mdx rename to docs/integrations/apps/guide/events.mdx diff --git a/docs/api-docs/apps/apps-id.mdx b/docs/integrations/apps/guide/id.mdx similarity index 100% rename from docs/api-docs/apps/apps-id.mdx rename to docs/integrations/apps/guide/id.mdx diff --git a/docs/api-docs/apps/guide/apps-03-developing.mdx b/docs/integrations/apps/guide/index.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-03-developing.mdx rename to docs/integrations/apps/guide/index.mdx diff --git a/docs/api-docs/apps/guide/apps-13-publishing.mdx b/docs/integrations/apps/guide/publishing.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-13-publishing.mdx rename to docs/integrations/apps/guide/publishing.mdx diff --git a/docs/api-docs/apps/guide/apps-12-requirements.mdx b/docs/integrations/apps/guide/requirements.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-12-requirements.mdx rename to docs/integrations/apps/guide/requirements.mdx diff --git a/docs/api-docs/apps/guide/apps-02-types.mdx b/docs/integrations/apps/guide/types.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-02-types.mdx rename to docs/integrations/apps/guide/types.mdx diff --git a/docs/api-docs/apps/guide/apps-09-ui.mdx b/docs/integrations/apps/guide/ui.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-09-ui.mdx rename to docs/integrations/apps/guide/ui.mdx diff --git a/docs/api-docs/apps/guide/apps-07-users.mdx b/docs/integrations/apps/guide/users.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-07-users.mdx rename to docs/integrations/apps/guide/users.mdx diff --git a/docs/api-docs/apps/guide/apps-01-introduction.mdx b/docs/integrations/apps/index.mdx similarity index 100% rename from docs/api-docs/apps/guide/apps-01-introduction.mdx rename to docs/integrations/apps/index.mdx diff --git a/docs/msf/msf-app-compatibility.mdx b/docs/integrations/apps/multi-storefront.mdx similarity index 100% rename from docs/msf/msf-app-compatibility.mdx rename to docs/integrations/apps/multi-storefront.mdx diff --git a/docs/api-docs/apps/apps-quick-start.mdx b/docs/integrations/apps/quick-start.mdx similarity index 100% rename from docs/api-docs/apps/apps-quick-start.mdx rename to docs/integrations/apps/quick-start.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/introduction.mdx b/docs/integrations/apps/tutorial/index.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/introduction.mdx rename to docs/integrations/apps/tutorial/index.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx b/docs/integrations/apps/tutorial/nextjs-connect.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/step-2-connect-to-bc.mdx rename to docs/integrations/apps/tutorial/nextjs-connect.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx b/docs/integrations/apps/tutorial/nextjs-enhance.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/step-4-enhance-ux.mdx rename to docs/integrations/apps/tutorial/nextjs-enhance.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx b/docs/integrations/apps/tutorial/nextjs-integrate.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/step-3-integrate-api.mdx rename to docs/integrations/apps/tutorial/nextjs-integrate.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx b/docs/integrations/apps/tutorial/nextjs-quick-start.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/heroku-deploy.mdx rename to docs/integrations/apps/tutorial/nextjs-quick-start.mdx diff --git a/docs/api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx b/docs/integrations/apps/tutorial/nextjs-setup.mdx similarity index 100% rename from docs/api-docs/apps/tutorials/sample-app-next/step-1-setup.mdx rename to docs/integrations/apps/tutorial/nextjs-setup.mdx diff --git a/docs/integrations/buy-online-pick-up-in-store/api-guide.mdx b/docs/integrations/buy-online-pick-up-in-store/api-guide.mdx new file mode 100644 index 000000000..86bea4ba9 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/api-guide.mdx @@ -0,0 +1,1855 @@ +# End-to-End User Journey API Guide + +This page is a how-to guide on creating end-to-end Buy Online Pickup In-Store (BOPIS) *customized* experiences for both merchants and shoppers through BigCommerce’s APIs. This guide lays out the API calls in sequence, framed from the perspective of an end-to-end user journey, i.e. + +## 1.0 Prerequisites +1. You've created your BigCommerce store and opted into the MLI BOPIS APIs Open Beta (**Settings** > **Inventory Settings** > Click "Try it now" button). +2. Store settings have been configured (e.g. Payments, Shipping, Tax, Catalog, etc) +3. You are not using BigCommerce's defeault Checkout, but are using a custom checkout, i.e. + - You have installed a new custom checkout or you have an existing checkout built on the Checkout JS SDK or; + - You have built a headless experience using the Server-to-Server (S2S) Checkout V3 APIs +4. OAuth scopes have been granted and configured on your store: + - Store Inventory + - Store Locations + - Pickup Methods + - Order Fulfillment +5. Obtain [Store API Credentials](/api-docs/getting-started/authentication/rest-api-authentication#store-api-accounts) containing the required [OAuth scopes](/api-docs/getting-started/authentication/rest-api-authentication#oauth-scopes). + + +---------- + +## 2.0 Setup and configure as a merchant +### 2.1 Create a location + +You start by first creating a location. Customers can pick up their orders from this location, i.e. a *pickup* location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create locations" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "code": "DTOWN_PARK_ST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "address": { + "email": "jane.doe@bigcommerce.com", + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "country_code": "US", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create locations" showLineNumbers copy + { + "transaction_id": "f2e9c9da-8f35-403c-8f9f-d0b1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +### 2.2 Update details about a location + +Once a location has been created, you may choose to update its details. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "code": "DTOWN_PARKST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + } + }, + "time_zone": "Etc/UTC", + "address": { + "email": "jane.doe@bigcommerce.com", + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "country_code": "US", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "d3f9c9df-8d35-403c-8f9f-d1v1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +### 2.3 Get all locations + +At this point, you may have created multiple locations and want to check on all of these locations. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get locations" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get locations" showLineNumbers copy + { + "data": [ + { + "id": 2, + "code": "DTOWN_PARK_ST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "created_at": "2022-01-01T00:00:00.0001", + "updated_at": "2022-02-02T00:00:00.0001", + "address": { + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "email": "jane.doe@bigcommerce.com", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + "country_code": "US" + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25T00:00:00.0001", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + }, + { + "id": 3, + "code": "UPTOWN_MAYFAIR)LANE", + "label": "Uptown Location - Mayfair Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "created_at": "2022-01-01T00:00:00.0001", + "updated_at": "2022-02-02T00:00:00.0001", + "address": { + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "email": "jane.doe@bigcommerce.com", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -120.123456, + "latitude": 60.987654 + } + "country_code": "US" + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ], + "meta": {} + } + ``` + </Tab> +</Tabs> + +### 2.4 Manage inventory for a location + +BigCommerce’s Inventory API enables two ways of managing inventory quantities: +* **Absolute quantity** - the amount defined in the API payload is the inventory quantity that will be set for a product or variant. +* **Relative quantity** - the amount defined in the API payload will be added to (or subtracted from) the existing inventory quantity that already exists for the product or variant. + +Before setting inventory quantity to a location, check the inventory tracking configurations that have been enabled. There are three inventory tracking configurations: +* **Inventory is tracked by product** - This setting is used if your product has no variations, e.g. a champagne glass or a water glass tumbler. +* **Inventory is tracked by variant** - This setting is used if your product has different attributes (variations), e.g. a shirt has various sizes and colors. +* **Inventory is not tracked** - This setting is used if you do not have a need to track inventory quantity, e.g. you may sell a digital asset (like a PDF or music). When inventory is not tracked, the product will always be considered available to sell on your storefront, even if it may not be in your physical storage location. + +It’s important to know the type of tracking when making absolute or relative adjustments, as this will ultimately determine how you author your API request to set inventory quantity. + +#### 2.4.1 Absolute adjustments to inventory quantity + +You can make absolute adjustments for inventory tracked by product. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Absolute adjustment to inventory" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/absolute + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 1, + "product_id": 111, + "quantity": 10 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Absolute adjustment to inventory" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + </Tab> +</Tabs> + +You can make absolute adjustments for inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Absolute adjustment to inventory" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/absolute + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "variant_id": 78, + "quantity": 5 + }, + { + "location_id": 2, + "variant_id": 79, + "quantity": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Absolute adjustment to inventory" showLineNumbers copy + { + "transaction_id": "b8dfdfbd-bfaa-40f4-b1b1-04d540604867" + } + ``` + </Tab> +</Tabs> + +#### 2.4.2 Relative adjustments to inventory quantity + +You can make relative adjustments for inventory tracked by product. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Relative adjustment to inventory" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/relative + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "product_id": 111, + "quantity": -2 + }, + { + "location_id": 2, + "product_id": 112, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Relative adjustment to inventory" showLineNumbers copy + { + "transaction_id": "6511a3d1-5392-4d10-8a0b-910d95c48d1e" + } + ``` + </Tab> +</Tabs> + +You can make relative adjustments for inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Relative adjustment to inventory" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/relative + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "variant_id": 78, + "quantity": -2 + }, + { + "location_id": 2, + "variant_id": 79, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Relative adjustment to inventory" showLineNumbers copy + { + "transaction_id": "d0e1c1ca-8f35-403c-8d9f-d9a1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +### 2.5 Configure inventory settings + +In addition to making absolute or relative adjustments to inventory quantities, other inventory settings can also be set, including: + +- **Warning Level** - This is the same as the `inventory_warning_level` attribute in the Catalog API +- **Safety Stock** - The quantity of product that is stored to prevent an out-of-stock situation. It serves as insurance against sudden or rapid fluctuations in demand. Safety stock quantity is not included in the "available to sell" quantity that may be displayed to customers on the storefront. + +You can configure inventory settings for inventory tracked by product. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update inventory settings at a location" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "settings": [ + { + "identity": { + "product_id": 111 + }, + "safety_stock": 2, + "warning_level": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update inventory settings at a location" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + + </Tab> +</Tabs> + +You can configure inventory settings for inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update inventory settings at a location" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "settings": [ + { + "identity": { + "variant_id": 78 + }, + "safety_stock": 2, + "warning_level": 5 + }, + { + "identity": { + "variant_id": 79 + }, + "safety_stock": 2, + "warning_level": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update inventory settings at a location" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + + </Tab> +</Tabs> + +### 2.6 Get inventory by location + +At this point you may want to view inventory by location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get inventory at a location" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory at a location" showLineNumbers copy + { + "data": [ + { + "identity": { + "sku": "SM13", + "variant_id": 74, + "product_id": 111 + }, + "available_to_sell": 8, + "total_inventory_onhand": 10, + "settings": { + "safety_stock": 2, + "is_in_stock": true, + "warning_level": 5 + } + }, + { + "identity": { + "sku": "SM14-SM", + "variant_id": 78, + "product_id": 112 + }, + "available_to_sell": 5, + "total_inventory_onhand": 5, + "settings": { + "safety_stock": 0, + "is_in_stock": true, + "warning_level": 0 + } + }, + { + "identity": { + "sku": "SM14-ME", + "variant_id": 79, + "product_id": 112 + }, + "available_to_sell": , + "total_inventory_onhand": 5, + "settings": { + "safety_stock": 0, + "is_in_stock": true, + "warning_level": 0 + } + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +### 2.7 [Optional step] Get a product's inventory across all locations + +Alternatively, you may want to view inventory information for a product across all locations where that product is stocked. This can be achieved by filtering on the `product_id`, `variant_id` or `sku`. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get inventory at locations" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{store_hash}/v3/inventory/items?variant_id=123 + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory at locations" showLineNumbers copy + { + "data": [ + { + "identity": { + "product_id": 123 + }, + "locations": [ + { + "location_id": 1, + "location_code": "BC-LOCATION-1", + "location_name": "Default location", + "available_to_sell": 10, + "total_inventory_onhand": 11, + "location_enabled": true, + "settings": { + "safety_stock": 1, + "is_in_stock": true, + "warning_level": 1 + } + } + ] + } + ], + "meta": {} + } + ``` + </Tab> +</Tabs> + +### 2.8 Create a pickup method and assign it to a location + +Once locations have been created, you can create pickup methods and assign them to a location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create pickup methods" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 1, + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +### 2.9 Add a second pickup method and assign it to a location + +Some merchants offer multiple pickup options at a single location (e.g. in-store pickup and curbside pickup.) To achieve this, you'll create another pickup method and assign it to the same location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create pickup methods" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "location_id": 1, + "display_name": "Curb-side pickup", + "collection_instructions": "See our staff member outside of the store", + "collection_time_description": "Wait for a pickup confirmation and visit in business hours" + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 2, + "location_id": 1, + "display_name": "Curb-side pickup", + "collection_instructions": "See our staff member outside of the store", + "collection_time_description": "Wait for a pickup confirmation and visit in business hours" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +### 2.10 Update a specific detail for a pickup method + +If you need to update the original pickup method details, you have the ability to do so via the Pickup Methods API. You can update the: +- `location_id` +- `display_name` +- `collection_instructions` +- `collection_time_description` + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update pickup methods" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "collection_instructions": "See our friendly staff member outside of the store" + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 2, + "location_id": 1, + "display_name": "Curb-side pickup", + "collection_instructions": "See our friendly staff member outside of the store", + "collection_time_description": "Wait for a pickup confirmation and visit in business hours" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +### 2.11 [Optional step] Validate the pickup methods are assigned to the location + +Once you have assigned the pickup methods to the location(s), you can check what you've configured. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get pickup methods" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 1, + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + }, + { + "id": 2, + "location_id": 1, + "display_name": "Curb-side pickup", + "collection_instructions": "See our staff member outside of the store", + "collection_time_description": "Wait for a pickup confirmation and visit in business hours" + } + ] + "meta": {} + } + ``` + </Tab> +</Tabs> + +---------- + +## 3.0 Browse and discover as a shopper + +There are two ways to access data on the storefront: +- Storefront REST API +- Storefront GraphQL API + +Over time, BigCommerce will be investing more in the Storefront GraphQL API, so all future enhancements to support BOPIS will be made against the Storefront GraphQL API. + +### 3.1 Storefront REST API + +#### 3.1.1 Find available pickup options with stock available + +Use this to show pickup options to customers on a storefront page (e.g. the product detail page). + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Find available pickup options" showLineNumbers copy + POST https://{{yourstore.example.com}}/api/storefront/pickup-options + Content-Type: application/json + Accept: application/json + + { + "searchArea": { + "radius": { + "value": 25, + "unit": "MI" + }, + "coordinates": { + "latitude": 32.8058616, + "longitude": -98.0105544 + } + }, + "items": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Find available pickup options" showLineNumbers copy + { + "results": [ + { + "pickupOptions": [ + { + "pickupMethod": { + "id": 1, + "locationId": 1, + "displayName": "Office Pickup", + "collectionInstructions": "Bring your ID", + "collectionTimeDescription": "Collect during our opening hours of 0900 - 1700" + }, + "availableItems": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ] + }, + { + "pickupOptions": [ + { + "pickupMethod": { + "id": 2, + "locationId": 2, + "displayName": "Pickup method 2", + "collectionInstructions": "Instructions", + "collectionTimeDescription": "Desc" + }, + "availableItems": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ] + } + ] + } + ``` + </Tab> +</Tabs> + +### 3.2 Storefront GraphQL API + +#### 3.2.1 Get locations + +For info on getting locations, see [Get Locations](#). +{/* https://bigcommerce.stoplight.io/docs/api-beta-buy-online-pick-up-in-store/api-docs/graphql/get-locations */} + +For info on getting location data in the storefront using Stencil Utils powered by GraphQL, see [Stencil Utils Reference- Get page by GraphQL](/stencil-docs/reference-docs/stencil-utils-api-reference#get-page-by-graphql). + +#### 3.2.2 Get inventory by location + +For info on getting inventory by location, see [Get Inventory by Location](#). +{/* https://bigcommerce.stoplight.io/docs/api-beta-buy-online-pick-up-in-store/api-docs/graphql/get-inventory-by-location */} + +---------- + +## 4.0 Manage checkout as a shopper +The Checkout SDK and Server-to-Server (S2S) Checkout APIs have been updated to support BOPIS experiences. As a developer, you may wonder which to choose and when to use the SDK vs the API. If you’re developing: +* A native storefront and custom checkout experience, use the Checkout SDK +* An end-to-end headless experience, use the S2S Checkout APIs + +If you’re dependent on webhook events, all [existing Cart webhooks](/api-docs/store-management/webhooks/webhook-events) have been updated to support BOPIS. + +### 4.1 Native storefront & custom checkout experience via Checkout SDK +In order to fetch pickup-options via the Checkout SDK, you will need to be on SDK version 1.224.0 or above. This applies to existing custom checkouts as well as new custom checkouts. + +```js filename="Example JavaScript Code" showLineNumbers copy +const consignmentId = '123'; +const searchArea = { + radius: { + value: 1.4, + unit: 'KM' // Another unit allowed here is 'MI' + }, + coordinates: { + latitude: 1.4, + longitude: 0 + } +}; + +const query: PickupOptionRequestBody = { consignmentId, searchArea }; + +const state = await checkoutService.loadPickupOptions(query: PickupOptionRequestBody); + +/* +* Pickup options are once fetched and then cached against the consignmentId and +* searchArea. So unless you change either of the parameters the options there won’t +* be an API call to the server and memoized options will be returned to checkout App +*/ + +// To log and see pickup options +console.log(state.data.getPickupOptions(consignmentId, searchArea)); +``` + +If you want to show pickup method options to customers on a storefront page (e.g. the Product Detail Page), before having a consignment, refer to [4.2.2 Find available pickup methods with stock available](#422-find-available-pickup-methods-with-stock-available). + + +### 4.2 End-to-end headless experience (S2S APIs) + +#### 4.2.1 Create a cart with a product in it + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create a cart" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/carts + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "line_items": [ + { + "quantity": 1, + "product_id": 97 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create a cart" showLineNumbers copy + { + "data": { + "id": "76f1bfe4-dbbe-4018-8ee6-2e3c36bf1518", + … + "line_items": { + "physical_items": [ + { + "id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + … + } + ], + "digital_items": [], + "gift_certificates": [], + "custom_items": [] + }, + … + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +For a successfully-created cart, the response will have: +* The newly-created cart ID. In this example, the cart ID is `76f1bfe4-dbbe-4018-8ee6-2e3c36bf1518`. +* The physical product ID. In this example, the cart ID is `67642f07-49d1-4501-8b7d-2e589aec34b8`. + +Cart ID is the same as Checkout ID and both represent the same identifier for a cart depending on which API is being consumed: the Cart API uses cart ID and the Checkout API uses Checkout ID. + +#### 4.2.2 Find available pickup options with stock available + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Find available pickup options" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/options + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "search_area": { + "coordinates": { + "latitude": 32.8058616, + "longitude": -98.0105544 + }, + "radius": { + "value": 25, + "unit": "MI" + } + }, + "items": [ + { + "variant_id": 1, + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Find available pickup options" showLineNumbers copy + { + "results": [ + { + "pickup_options": [ + { + "pickup_method": { + "id": 1, + "location_id": 1, + "display_name": "Office Pickup", + "collection_instructions": "Bring your ID", + "collection_time_description": "Collect during our opening hours of 0900 - 1700" + }, + "available_items": [ + { + "variant_id": 1, + "quantity": 1 + } + ] + } + ] + } + ] + } + ``` + + </Tab> +</Tabs> + +#### 4.2.3 Create the pickup consignment for the checkout + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Add consignment to checkout" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "pickup_option": { + "pickup_method_id": 2 + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Add consignment to checkout" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_pickup_option": { + "pickup_method_id": 2 + } + ... + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +From the response we can see the consignment object now has a `selected_pickup_option` set with the `pickup_method_id` we requested. + +Currently BOPIS only supports 1 consignment of type Pickup. If you attempt to mix pickup and shipping consignments or create multiple pickup consignments, you will receive an error message. + +```json filename="Example error response" showLineNumbers copy +{ + "status": 422, + "title": "Pickup method is limited to 1 consignment.", + "type": "https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes" +} +``` + +If you have a change of mind, and you want to change it from pickup to be shipped, then you will need to update the consignment. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}}?include=consignments.available_shipping_options + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "shipping_address": { + "first_name": "abc1", + "last_name": "abc1", + "company": "a", + "email": "abc1@bigcommerce.com", + "phone": "0410123456", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "country_code": "US", + "state_or_province": "", + "state_or_province_code": "TX", + "postal_code": "78704", + "custom_fields": [] + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "shipping_address": { + "first_name": "abc1", + "last_name": "abc1", + "email": "abc1@bigcommerce.com", + "company": "a", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "state_or_province": "Texas", + "state_or_province_code": "TX", + "country": "United States", + "country_code": "US", + "postal_code": "78704", + "phone": "0410123456", + "custom_fields": [] + }, + "available_shipping_options": [ + { + "id": "4dcbf24f457dd67d5f89bcf374e0bc9b", + "type": "freeshipping", + "description": "Free Shipping", + "image_url": "", + "cost": 0, + "transit_time": "", + "additional_description": "" + } + ] + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +The `available_shipping_options` is returned if we add the `include=consignments.available_shipping_options` to the request. + +This allows us to select a shipping option as described in the next request: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "shipping_option_id" : "4dcbf24f457dd67d5f89bcf374e0bc9b" + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_shipping_option": { + "id": "4dcbf24f457dd67d5f89bcf374e0bc9b", + "type": "freeshipping", + "description": "Free Shipping", + "image_url": "", + "cost": 0, + "transit_time": "", + "additional_description": "" + }, + "shipping_address": { + "first_name": "Jane", + "last_name": "Doe", + "email": "jane.doe@bigcommerce.com", + "company": "Acme Inc", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "state_or_province": "Texas", + "state_or_province_code": "TX", + "country": "United States", + "country_code": "US", + "postal_code": "78704", + "phone": "0410123456", + "custom_fields": [] + } + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +We can see in the response above the `selected_shipping_option` contains the shipping method selected, and there isn’t any pickup object anymore. + +#### 4.2.4 Update pickup consignment in the cart/checkout +If you want to update the consignment from shipping to pickup or select another pickup method you can edit the consignment and send a new pickup method ID, retrieved from the api call to the pickup endpoint earlier. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "pickup_option": { + "pickup_method_id": 1 + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_pickup_option": { + "pickup_method_id": 1 + }... + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +#### 4.2.5 Finalize order creation (i.e. complete checkout via API) + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Finalize an order" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/orders + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Finalize an order" showLineNumbers copy + { + "data": { + "id": 126 + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +Order ID is 126. + +## 5.0 Manage order as a merchant +### 5.1 View the newly-created order’s pickup consignment + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get consignments" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}}/consignments + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get consignments" showLineNumbers copy + { + "pickups": [ + { + "id": 13, + "pickup_method_id": 2, + "pickup_method_display_name": "Pickup Method 2", + "collection_instructions": "Pickup Method 2 instructions", + "collection_time_description": "Pickup Method 2 time", + "location": { + "id": 2, + "name": "location2", + "code": "LOCATION-2", + "address_line_1": "2802 Skyway Cir", + "address_line_2": "", + "city": "Austin", + "state": "Texas", + "postal_code": "78704", + "country_alpha2": "US", + "email": "location2@example.com", + "phone": "410123002" + }, + "line_items": [ + { + "url": "https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/126/products/22", + "resource": "/orders/126/products/22" + } + ] + } + ] + } + ``` + + </Tab> +</Tabs> + +The order's pickup consignment is 13. + +### 5.2 View the newly-created order's products + +The response returns products that were assigned to a pickup consignment. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get order products" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}}/products + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get order products" showLineNumbers copy + [ + { + "id": 22, + "order_id": 126, + "product_id": 97, + "variant_id": 69, + "order_pickup_method_id": 13, + … + } + ] + ``` + + </Tab> +</Tabs> + +The `order_pickup_method_id` field is 13 (same value as the pickup consignment ID). + +### 5.3 Update pickup consignment + +If you need to update the original pickup consignment details, you have the ability to do so via the Orders API. You can update the: +* `pickup_method_id` +* `pickup_method_display_name` +* `collection_instructions` +* `collection_time_description` +* location attributes (except for the `location_id`) + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update an order" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "consignments": { + "pickups": [ + { + "id": 13, + "pickup_method_id": 1, + "pickup_method_display_name": "Pickup Method 1 name - override", + "collection_instructions": "Pickup Method 1 instructions - override", + "collection_time_description": "Pickup Method 1 time - override", + "location": { + "name": "Location 1 - override", + "code": "LOCATION-1 - override", + "address_line_1": "123 Main Street - override", + "address_line_2": "Suite 101 - override", + "city": "Austin - override", + "state": "Texas - override", + "postal_code": "78726 - override", + "country_alpha2": "US", + "email": "location1_override@example.com", + "phone": "+1 111-111-1111 - override" + } + } + ] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update an order" showLineNumbers copy + { + "id": 126, + ... + "consignments": { + "url": "https://api.bigcommerce.com/stores/cc8eopdesv/v2/orders/126/consignments", + "resource": "/orders/126/consignments" + } + } + ``` + + </Tab> +</Tabs> + +## 6.0 Fulfill order as a merchant + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create an order" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "billing_address": { + "state": "Washington", + "zip": "98006", + "country": "United States" + }, + "consignments": { + "pickups": [ + { + "pickup_method_id": 1, + "pickup_method_display_name": "Pick Up", + "collection_instructions": "Bring your ID", + "collection_time_description": "9am - 6pm", + "location": { + "name": "Location 1", + "code": "LOCATION-1", + "address_line_1": "123 Main Street", + "address_line_2": "Suite 101", + "city": "Austin", + "state": "Texas", + "postal_code": "78726", + "country_alpha2": "US", + "email": "location1@example.com", + "phone": "+1 111-111-1111" + }, + "line_items": [ + { + "name": "Fog Linen Chambray Towel - Beige Stripe", + "quantity": 3, + "price_ex_tax": 0, + "price_inc_tax": 0 + } + ] + } + ] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create an order" showLineNumbers copy + { + "id": 1234000049, + ... + "billing_address": { + "first_name": "", + "last_name": "", + "company": "", + "street_1": "", + "street_2": "", + "city": "", + "state": "Washington", + "zip": "98006", + "country": "United States", + "country_iso2": "US", + "phone": "", + "email": "", + "form_fields": [] + }, + "consignments": { + "url": "https://api.bigcommerce.com/stores/o8ertuc7vw/v2/orders/1234000049/consignments", + "resource": "/orders/1234000049/consignments" + }, + ... + } + ``` + + </Tab> +</Tabs> + +## 7.0 Terminate configuration as a merchant + +### 7.1 Reassign inventory from one location to another +No dedicated endpoint exists to reassign inventory from one location to another. The existing inventory API endpoints can be used to achieve this outcome. + +### 7.2 Location + +#### 7.2.1 Disable a location + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "enabled": false + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "e81ada43-fc10-41a0-9a61-b25d8223a71c" + } + ``` + + </Tab> +</Tabs> + +#### 7.2.2 Disable a location’s storefront visibility + +Storefront visibility is currently a shopper-facing property of a location. +If it is set to false, then details about the location (e.g. description, operating hours) on the location details page and inventory quantities at that location will be excluded from the "available to sell" quantity on the storefront. +If it is set to true, then details about the location on the location details page and inventory quantities at that location will be included in the "available to sell" quantity on the storefront. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "storefront_visibility": false + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "e81ada43-fc10-41a0-9a61-b25d8223a71c" + } + ``` + + </Tab> +</Tabs> + +### 7.3 Delete a pickup method + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Delete pickup methods" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods?id:in=1,2 + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```http filename="Example response: Delete pickup methods" showLineNumbers copy + No Content + ``` + + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/draft/catalog.mdx b/docs/integrations/buy-online-pick-up-in-store/draft/catalog.mdx new file mode 100644 index 000000000..9f1ded2b9 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/draft/catalog.mdx @@ -0,0 +1,11 @@ +# Breaking Changes to Catalog API + +## Writing Inventory: +Using the existing Catalog APIs to add or update inventory will not be supported with MLI enabled. The new Inventory APIs can be utilized to manage inventory for a merchant's catalog. + +## Reading Inventory: +You will still be able to read an inventory value for products using the v2/v3 endpoints. However the behavior will change slightly. The inventory retunred from the Catalog API will be the total inventory available to sell for the merchant. This provides limited backwards compatibility with any apps or integrations that facilitate selling a merchants products on external sales channels, such as Amazon. + +## Additional Resources: +- [Catalog API Docs](/api-docs/store-management/catalog/products-overview) +- [Catalog API Specs](/docs/rest-catalog) diff --git a/docs/integrations/buy-online-pick-up-in-store/draft/get-locations.mdx b/docs/integrations/buy-online-pick-up-in-store/draft/get-locations.mdx new file mode 100644 index 000000000..ad88452e6 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/draft/get-locations.mdx @@ -0,0 +1,712 @@ +# Get Locations + +The Storefront GraphQL API allows you to fetch data for your store's locations. Below are examples of Storefront GraphQL queries that allow you to fetch location data for storefront locations. + +For a general overview of the Storefront GraphQL API usage and capabilities, see [GraphQL Storefront API Overview](/api-docs/storefront/graphql/graphql-storefront-api-overview). See GraphQL Playground for documentation of the full schema. + +## How to get location data for stores + +You can retrieve location data for store locations that a merchant has enabled. Here is an example query that returns location data, for example, address and operating hours on the specified days. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data" showLineNumbers copy + query { + inventory { + locations { + edges { + node { + entityId + code + label + description + typeId + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data" lineItems + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL", + "timeZone": "Etc/UTC", + "address": { + "city": "Austin", + "address1": "103 Example Drive", + "address2": "", + "postalCode": "78726", + "stateOrProvince": "TX", + "email": "person@person.com", + "phone": "", + "latitude": 37.7749, + "longitude": 122.4194, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": true, + "opening": "09:30", + "closing": "20:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + }, + { + "node": { + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL", + "timeZone": "Etc/UTC", + "address": { + "city": "San Francisco", + "address1": "123 Example St", + "address2": "", + "postalCode": "94105", + "stateOrProvince": "CA", + "email": "email@example.com", + "phone": "", + "latitude": 37.7877, + "longitude": 122.4026, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +Only data from locations that a merchant has enabled will be returned. +A merchant must also choose to display a location's details on the storefront in order for that location's storefront details to be returned. + +Locations are identified by a unique ID (`entityId`) and code (`code`). The location's type ID (`typeId`) is the location type, either PHYSICAL or VIRTUAL. The location's code and type can be customized using [Locations API](#). +{/* https://bigcommerce.stoplight.io/docs/api-beta-buy-online-pick-up-in-store/api-reference/locations */} + +The location identities and data that are returned from the response can be used to filter the data returned for certain locations. See [How to Filter Location Data](#how-to-filter-location-data). + +When you query for metafields, only metafields with storefront access permissions will be returned. In other words, a metafield's `permission_set` field must be `write_and_sf_access` or `read_and_sf_access` when you create or update a metafield. The following example includes the metafields along with the location data that are returned. As shown, the `namespace` of the metafield you wish to query must be specified: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location metafields" showLineNumbers copy + query { + inventory { + locations { + edges { + node { + metafields(namespace: "examplespace") { + edges { + node { + entityId + key + value + } + } + } + entityId + code + label + description + typeId + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location metafields" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "metafields": { + "edges": [] + }, + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL" + } + }, + { + "node": { + "metafields": { + "edges": [ + { + "node": { + "entityId": 2, + "key": "example key", + "value": "new location" + } + } + ] + }, + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL" + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + A location's descriptions can be added using the [Create locations](#) endpoint in the Locations API. + A location's metafields can be added using [Create a metafield](#) endpoint in the Locations API. +</Callout> +{/* Create locations was https://bigcommerce.stoplight.io/docs/api-beta-buy-online-pick-up-in-store/api-reference/locations/operations/create-a-store-v-3-inventory-location */} +{/* Create a metafield was https://bigcommerce.stoplight.io/docs/api-beta-buy-online-pick-up-in-store/api-reference/locations/operations/create-a-store-v-3-inventory-location-metafield */} + + +## How to filter location data + +You can filter by the identities of locations, as well as the data for locations, so that data for only some locations will be returned. To do so, specify a filter in the argument for `locations`. + +### Filter by location identity + +You can filter by the entityIds, codes, and typeIds of the locations you wish to return: + +```graphql filename="Filters for Location Identity" showLineNumbers copy +... +locations( + entityIds: [1, 2, 3] + codes: ["BC-LOCATION-2", "BC-LOCATION-1", "BC-LOCATION-3"] + typeIds: ["PHYSICAL", "VIRTUAL"] + ) +... +``` + +Here is an example query that returns the locations that have a specific entityId, code, and typeId: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data using ID filters" showLineNumbers copy + query { + inventory { + locations ( + entityIds: [2] + codes: ["BC-LOCATION-2"] + typeIds: ["PHYSICAL"] + ) { + edges { + node { + entityId + code + label + description + typeId + distance { + value + lengthUnit + } + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data using ID filters" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL", + "distance": null, + "timeZone": "Etc/UTC", + "address": { + "city": "San Francisco", + "address1": "123 Example St", + "address2": "", + "postalCode": "94105", + "stateOrProvince": "CA", + "email": "email@example.com", + "phone": "", + "latitude": 37.7877, + "longitude": 122.4026, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Filter by location data + +You can also filter for locations by their data. For example, you can filter by location country, state, and city. You can also filter for locations that are within a specified distance from a shopper, specified by latitude and longitude coordinates. + +```graphql filename="Filters for Location Data" showLineNumbers copy +... +locations( + countryCodes: [US, AU] + states: ["TX", "CA"] + cities: ["Austin", "San Francisco"] + distanceFilter: { + radius: 1.0 + longitude: 122.4194 + latitude: 37.7749 + lengthUnit: Kilometres + } + ) +... +``` + +<Callout type="info"> + When filtering by country, use the country's two-letter code. For states, use the state abbreviation. + When filtering by distance, specify distance in terms of `Kilometres` or `Miles`. +</Callout> + +This example query returns the stores that are in the specified country, state, and city, and that are within one kilometer from the specified latitude and longitude: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data using distance filters" showLineNumbers copy + query { + inventory { + locations ( + countryCodes: [US] + states: ["TX"] + cities: ["Austin"] + distanceFilter: { + radius: 1.0 + longitude: 122.4194 + latitude: 37.7749 + lengthUnit: Kilometres + } + ) { + edges { + node { + entityId + code + label + description + typeId + distance { + value + lengthUnit + } + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data using distance filters" lineItems + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL", + "distance": { + "value": 0, + "lengthUnit": "Kilometres" + }, + "timeZone": "Etc/UTC", + "address": { + "city": "Austin", + "address1": "103 Example Drive", + "address2": "", + "postalCode": "78726", + "stateOrProvince": "TX", + "email": "person@person.com", + "phone": "", + "latitude": 37.7749, + "longitude": 122.4194, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": true, + "opening": "09:30", + "closing": "20:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +The distance from the queried latitude and longitude is returned in the response. In this example, one store location was returned, in which the store was located 0 km from the queried latitude and longitude. diff --git a/docs/integrations/buy-online-pick-up-in-store/draft/inventory-by-location.mdx b/docs/integrations/buy-online-pick-up-in-store/draft/inventory-by-location.mdx new file mode 100644 index 000000000..7182c6cf3 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/draft/inventory-by-location.mdx @@ -0,0 +1,702 @@ +# Get Inventory by Location + +The Storefront GraphQL API allows you to fetch inventory for products, as well as variants in your store locations. You can fetch inventory at the product level that is aggregated for all locations. You can fetch inventory at the variant level that is aggregated for all locations, as well as for each location. In addition, you can filter by product or variant. Below are examples of Storefront GraphQL queries that allow you to fetch inventory for storefront locations. + +For a general overview of the Storefront GraphQL API usage and capabilities, see [GraphQL Storefront API Overview](/api-docs/storefront/graphql/graphql-storefront-api-overview). + +## Fetch inventory at product-level: aggregated locations + +This query returns the inventory level for each product. The inventory for each product is the sum of the inventory from all locations (aggregated). + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get aggregate inventory for a base product" showLineNumbers copy + query { + site { + products { + edges { + node { + entityId + name + inventory { + aggregated { + availableToSell + warningLevel + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get aggregate inventory for a base product" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": { + "availableToSell": 20, + "warningLevel": 5 + } + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +In the example response, Example Product 1 has an aggregated inventory of 11. + +<Callout type="info"> + You can filter by product so that only the inventory for certain products will be returned. To do so, use the entity IDs of the products you wish to return. + For example, in the example response, Example Product 1 has an entityId of 113. You can make a new request that filters for this product by using entityId 113. See GraphQL Playground for documentation. +</Callout> + +### How inventory settings affect product inventories returned + +The products returned depend on a store's inventory settings for out-of-stock products. If a merchant decides to hide out-of-stock products completely, out-of-stock products will not be returned. In the following example, Example Product 2s are out-of-stock and therefore, only (in-stock) Example Product 1 is returned: + +```json filename="Example JSON Response" lineItems +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": { + "availableToSell": 20, + "warningLevel": 5 + } + } + } + } + ] + } + } + } +} +``` + +The inventory levels for products depend on a stores's inventory settings for displaying stock levels. If a merchant decides to not show stock levels, inventory levels will return `null` as shown here: + +```json filename="Example JSON Response" lineItems +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": null + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": null + } + } + } + ] + } + } + } +} +``` + +Similarly, if a merchant decides to only show stock levels for a product when stock is low, inventory levels for products that aren't low or aren't out of stock will return `null`. In the following example, Example Product 1 returns `null` because it is not low or out of stock: + +```json filename="Example JSON Response" lineItems +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": null + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } +} +``` + +## Fetch inventory at variant-level: aggregated locations + +This query returns the inventory level for each variant. The inventory for each variant is the sum of the inventory from all locations (aggregated). In this example, the query returns data for only one product by specifying the product's entityId. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get aggregate inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get aggregate inventory for a variant" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "aggregated": { + "availableToSell": 11, + "warningLevel": 20 + } + } + } + }, + { + "node": { + "entityId": 96, + "sku": "ABC-1111-PU", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Fetch inventory at variant-level: each location + +This query returns the inventory level for a specified variant. The inventory for the variant is shown for each location (not aggregated for all locations). In this example, the query returns data for only one product and only one variant by specifying the product's entityId and the variant's entityId. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get a location's inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95]) { + edges { + node { + entityId + sku + inventory { + byLocation { + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get a location's inventory for a variant" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 6, + "warningLevel": 20, + "isInStock": false + } + }, + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 5, + "warningLevel": 20, + "isInStock": false + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + As shown in the example response, locations are identified by a unique ID (`locationEntityId`) and code (`locationEntityCode`). + The location type ID (`locationEntityTypeId`) is the location type, either `PHYSICAL` or `VIRTUAL`. + The location's code and type can be customized using Locations API. +</Callout> + +### How inventory settings affect variant inventories returned + +The following examples show how variant inventories are affected when a merchant decides to hide out-of-stock options. + +If a variant has stock in at least one location, the variant inventory for all locations are shown: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds: [95]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "aggregated": { + "availableToSell": 10, + "warningLevel": 10 + }, + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 10, + "warningLevel": 5, + "isInStock": true + } + }, + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 0, + "warningLevel": 5, + "isInStock": true + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + + +If a variant is out of stock at all locations, the variant is not returned. In the following example, variant `entityId: 95` is out of stock at all locations, but variant `entityId: 96` has stock in at least one location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95,96]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 96, + "sku": "ABC-1111-PU", + "inventory": { + "aggregated": { + "availableToSell": 10, + "warningLevel": 5 + }, + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 10, + "warningLevel": 5, + "isInStock": true + } + }, + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 0, + "warningLevel": 0, + "isInStock": false + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + +The following example shows the returned response if you query for variants whose inventories are zero at all locations: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95,96]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" lineItems + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/draft/partner-integration-guide/add-to-cart.mdx b/docs/integrations/buy-online-pick-up-in-store/draft/partner-integration-guide/add-to-cart.mdx new file mode 100644 index 000000000..7742820c5 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/draft/partner-integration-guide/add-to-cart.mdx @@ -0,0 +1,88 @@ +## Implementing a BOPIS Add to Cart Flow + +A common pattern used by online brands is allowing a shopper to choose to pick up or ship directly from the Product Details page. + +This can reduce friction for shoppers who already have a preferred local store location (or your best estimate of their local store) by letting them add to cart and lock in a pickup location in one click. + +Then, depending on the payment options available, the shopper could complete Checkout in just a couple of clicks. + + +![Selecting fulfillment type from the product page](https://storage.googleapis.com/bigcommerce-production-dev-center/images/fulfillment%20product%20page.png "Selecting fulfillment type from the product page") + +## How to Implement a BOPIS Add to Cart Flow + +You will need to customize a store's Theme to display appropriate options based on the desired experience. + +Whether you implement a dropdown, radio buttons, or separate buttons to select between shipping and BOPIS, you will need to interact with both the Cart and Checkout APIs to take advantage of the new BOPIS features in BigCommerce. + +Use the [Carts API](#) to add the item(s) to cart. +{/* https://bigcommerce.stoplight.io/docs/api-beta-multi-location-inventory/YXBpOjIzMTM0ODM-carts */} + +```http filename="Example request: Add cart line items" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/cart/{cartId}/items +X-Auth-Token: {{access_token}} +Content-Type: application/json +Accept: application/json +{ +... + +"lineItems": [ + { + "quantity": 1, + "productId": 5, + "variantId": 55 + } +] + +... +} +``` + +This returns line item ids which will need to be referenced in subsequent calls. + +```json filename="Example response: Add cart line items" showLineNumbers copy +{ +... + "lineItems": { + "physicalItems": [ + { + "id": 20, // line item id + "qty": 1, + "productId": 5, + "variantId": 55, + ... + } + ] + } +... +} +``` + +Next, use the updated [Checkout API](#) to create a new Consignment (or use an existing one). If the shopper is using the Pick Up method, the `pickupMethodId` is the `id` retrieved from [Get Pickup Methods](#). +{/* https://bigcommerce.stoplight.io/docs/api-beta-multi-location-inventory/b3A6MTk4MDkzOTc-add-new-consignment-to-checkout */} +{/* https://bigcommerce.stoplight.io/docs/api-beta-multi-location-inventory/b3A6Mzk4Njc3MTk-get-pickup-methods */} + +```http filename="Example request: Add consignment to checkout" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/checkouts/{checkoutId}/consignments +X-Auth-Token: {{access_token}} +Content-Type: application/json +Accept: application/json + +{ + ... + + "lineItems": [ + { + id: 20, + quantity: 1 + } + ] + "pickupOption": { + "pickupMethodId": 1 + } + "address": [] +} +``` + + +You can continue to modify Consignment via the Checkout API, updating the selected pickup option or even switching the Consignment back to a "shipping" type. diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout.mdx new file mode 100644 index 000000000..4e3a5ea5c --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout.mdx @@ -0,0 +1,496 @@ +## 4.0 Manage checkout as a shopper + +The [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) and [Server-to-Server (S2S) Checkout V3 APIs](/docs/rest-management/checkouts) have been updated to support _Buy Online, Pick up in Store_ experiences. + +When building a _Buy Online, Pick up in Store_ solution, you can allow shoppers to find available pickup options and create checkout consignments that are fulfilled by a pickup method. + +As a developer, you may wonder which to choose and when to use the SDK vs the API. If you’re developing: +* A native storefront and custom checkout experience, use the Checkout SDK +* An end-to-end headless experience, use the S2S Checkout APIs + +If you’re dependent on webhook events, all [existing Cart webhooks](/docs/integrations/webhooks/events) have been updated to support _Buy Online, Pick up in Store_. + +### 4.1 Native storefront & custom checkout experience using Checkout SDK +To support _Buy Online, Pick up in Store_, we would be adding a `loadPickupOptions` method to the [CheckoutService](https://github.com/bigcommerce/checkout-sdk-js/blob/master/docs/classes/CheckoutService.md) class, allowing you to load pickup options to your storefront checkout. In order to fetch pickup options using the Checkout SDK, you will need to be on SDK version 1.224.0 or above. This applies to existing custom checkouts, as well as new custom checkouts. + +```js filename="Example JavaScript Code" showLineNumbers copy +const consignmentId = '123'; +const searchArea = { + radius: { + value: 1.4, + unit: 'KM' // Another unit allowed here is 'MI' + }, + coordinates: { + latitude: 1.4, + longitude: 0 + } +}; + +const query: PickupOptionRequestBody = { consignmentId, searchArea }; + +const state = await checkoutService.loadPickupOptions(query: PickupOptionRequestBody); + +/* +* Pickup options are once fetched and then cached against the consignmentId and +* searchArea. So unless you change either of the parameters the options there won’t +* be an API call to the server and memoized options will be returned to checkout App +*/ + +// To log and see pickup options +console.log(state.data.getPickupOptions(consignmentId, searchArea)); +``` + +Youy can show pickup method options to customers on a storefront page, such as the Product Detail Page, before having a consignment. For more information, see [4.2.2 Find available pickup methods with stock available](#422-find-available-pickup-methods-with-stock-available). + + +### 4.2 End-to-end headless experience (S2S APIs) + +#### 4.2.1 Create a cart with a product in it + +To create a cart, send a request to the [Create a cart](/docs/rest-management/carts/carts-single#create-a-cart) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create a cart" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/carts + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "line_items": [ + { + "quantity": 1, + "product_id": 97 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create a cart" showLineNumbers copy + { + "data": { + "id": "76f1bfe4-dbbe-4018-8ee6-2e3c36bf1518", + … + "line_items": { + "physical_items": [ + { + "id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + … + } + ], + "digital_items": [], + "gift_certificates": [], + "custom_items": [] + }, + … + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +For a successfully-created cart, the response will have: +* The newly-created cart ID. In this example, the cart ID is `76f1bfe4-dbbe-4018-8ee6-2e3c36bf1518`. +* The physical product ID. In this example, the cart ID is `67642f07-49d1-4501-8b7d-2e589aec34b8`. + +Cart ID is the same as Checkout ID and both represent the same identifier for a cart depending on which API is being consumed: the Cart API uses cart ID and the Checkout API uses Checkout ID. + +#### 4.2.2 Find available pickup options with stock available + +To find available pickup options, send a request to the [Find available pickup options](/docs/rest-management/pickup-options#find-available-pickup-options) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Find available pickup options" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/options + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "search_area": { + "coordinates": { + "latitude": 32.8058616, + "longitude": -98.0105544 + }, + "radius": { + "value": 25, + "unit": "MI" + } + }, + "items": [ + { + "variant_id": 1, + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Find available pickup options" showLineNumbers copy + { + "results": [ + { + "pickup_options": [ + { + "pickup_method": { + "id": 1, + "location_id": 1, + "display_name": "Office Pickup", + "collection_instructions": "Bring your ID", + "collection_time_description": "Collect during our opening hours of 0900 - 1700" + }, + "available_items": [ + { + "variant_id": 1, + "quantity": 1 + } + ] + } + ] + } + ] + } + ``` + + </Tab> +</Tabs> + +#### 4.2.3 Create the pickup consignment for the checkout + +To create the pickup consignment for the checkout, send a request to the [Add consignment to checkout](/docs/rest-management/checkouts/checkout-consignments#add-consignment-to-checkout) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Add consignment to checkout" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "pickup_option": { + "pickup_method_id": 2 + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Add consignment to checkout" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_pickup_option": { + "pickup_method_id": 2 + } + ... + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +From the response we can see the consignment object now has a `selected_pickup_option` set with the `pickup_method_id` that you requested. + +Currently _Buy Online, Pick up in Store_ only supports 1 consignment of type Pickup. If you attempt to mix pickup and shipping consignments or create multiple pickup consignments, you will receive an error message. + +```json filename="Example error response" showLineNumbers copy +{ + "status": 422, + "title": "Pickup method is limited to 1 consignment.", + "type": "https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes" +} +``` + +If you have a change of mind, and you want to change it from pickup to be shipped, then you will need to update the consignment. To update a consignment, send a request to the [Update checkout consignment](/docs/rest-management/checkouts/checkout-consignments#update-checkout-consignment) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}}?include=consignments.available_shipping_options + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "shipping_address": { + "first_name": "abc1", + "last_name": "abc1", + "company": "a", + "email": "abc1@bigcommerce.com", + "phone": "0410123456", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "country_code": "US", + "state_or_province": "", + "state_or_province_code": "TX", + "postal_code": "78704", + "custom_fields": [] + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "shipping_address": { + "first_name": "abc1", + "last_name": "abc1", + "email": "abc1@bigcommerce.com", + "company": "a", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "state_or_province": "Texas", + "state_or_province_code": "TX", + "country": "United States", + "country_code": "US", + "postal_code": "78704", + "phone": "0410123456", + "custom_fields": [] + }, + "available_shipping_options": [ + { + "id": "4dcbf24f457dd67d5f89bcf374e0bc9b", + "type": "freeshipping", + "description": "Free Shipping", + "image_url": "", + "cost": 0, + "transit_time": "", + "additional_description": "" + } + ] + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +The `available_shipping_options` is returned if we add the `include=consignments.available_shipping_options` to the request. + +This allows us to select a shipping option as described in the next request: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "shipping_option_id" : "4dcbf24f457dd67d5f89bcf374e0bc9b" + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_shipping_option": { + "id": "4dcbf24f457dd67d5f89bcf374e0bc9b", + "type": "freeshipping", + "description": "Free Shipping", + "image_url": "", + "cost": 0, + "transit_time": "", + "additional_description": "" + }, + "shipping_address": { + "first_name": "Jane", + "last_name": "Doe", + "email": "jane.doe@bigcommerce.com", + "company": "Acme Inc", + "address1": "2808 Skyway Cir", + "address2": "", + "city": "Austin", + "state_or_province": "Texas", + "state_or_province_code": "TX", + "country": "United States", + "country_code": "US", + "postal_code": "78704", + "phone": "0410123456", + "custom_fields": [] + } + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +We can see in the response above the `selected_shipping_option` contains the shipping method selected, and there is no longer a pickup object. + +#### 4.2.4 Update pickup consignment in the cart/checkout +If you want to update the consignment from shipping to pickup or select another pickup method, you can edit the consignment and send a new pickup method ID. The pickup method ID is retrieved from the api call to the pickup endpoint earlier. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update checkout consignment" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/consignments/{{consignment_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "pickup_option": { + "pickup_method_id": 1 + }, + "line_items": [ + { + "item_id": "67642f07-49d1-4501-8b7d-2e589aec34b8", + "quantity": 1 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update checkout consignment" showLineNumbers copy + { + "data": { + ... + "consignments": [ + { + "id": "6218019d81754", + "shipping_cost_inc_tax": 0, + "shipping_cost_ex_tax": 0, + "handling_cost_inc_tax": 0, + "handling_cost_ex_tax": 0, + "coupon_discounts": [], + "discounts": [], + "line_item_ids": [ + "67642f07-49d1-4501-8b7d-2e589aec34b8" + ], + "selected_pickup_option": { + "pickup_method_id": 1 + }... + } + ] + ... + } + } + ``` + + </Tab> +</Tabs> + +#### 4.2.5 Finalize order creation (i.e. complete checkout by API) + +To finalize an order, send a request to the [Finalize an order](/docs/rest-management/checkouts/checkout-orders#create-an-order) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Finalize an order" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/checkouts/{{checkout_id}}/orders + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Finalize an order" showLineNumbers copy + { + "data": { + "id": 126 + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + + +The order ID is 126. diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration.mdx new file mode 100644 index 000000000..6b24620fd --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration.mdx @@ -0,0 +1,916 @@ + +# Merchant configuration + +To build a _Buy Online, Pick up in Store_ solution, you must first create a location for pickup. +You can then manage inventory for a location, configure inventory settings such as stock warning levels. +Last, you must create a method for pickup. You can define collection instructions and assign the method to a location. + +## Create locations + +Create one or more locations using the [Create locations](/docs/rest-management/locations#create-locations) endpoint. Include a *pickup location* from which customers can pick up their orders. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create locations" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "code": "DTOWN_PARK_ST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "address": { + "email": "jane.doe@bigcommerce.com", + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "country_code": "US", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create locations" showLineNumbers copy + { + "transaction_id": "f2e9c9da-8f35-403c-8f9f-d0b1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +## Update location details + +After you create a location, you can update its details using the [Update locations](/docs/rest-management/locations#update-locations) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "code": "DTOWN_PARKST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + } + }, + "time_zone": "Etc/UTC", + "address": { + "email": "jane.doe@bigcommerce.com", + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "country_code": "US", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "d3f9c9df-8d35-403c-8f9f-d1v1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +## Get all locations + +After you create one or more locations, use the [Get locations](/docs/rest-management/locations#get-locations) endpoint to retrieve location details. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get locations" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get locations" showLineNumbers copy + { + "data": [ + { + "id": 2, + "code": "DTOWN_PARK_ST", + "label": "Downtown Location - Park Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "created_at": "2022-01-01T00:00:00.0001", + "updated_at": "2022-02-02T00:00:00.0001", + "address": { + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "email": "jane.doe@bigcommerce.com", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -97.849560, + "latitude": 30.404500 + } + "country_code": "US" + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25T00:00:00.0001", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + }, + { + "id": 3, + "code": "UPTOWN_MAYFAIR)LANE", + "label": "Uptown Location - Mayfair Lane", + "description": "Customer-facing additional details about this location.", + "managed_by_external_source": false, + "type_id": "PHYSICAL", + "enabled": true, + "operating_hours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "time_zone": "Etc/UTC", + "created_at": "2022-01-01T00:00:00.0001", + "updated_at": "2022-02-02T00:00:00.0001", + "address": { + "address1": "100 Park Lane", + "address2": "", + "city": "Austin", + "state": "TX", + "zip": "78726", + "email": "jane.doe@bigcommerce.com", + "phone": "+15128654500", + "geo_coordinates": { + "longitude": -120.123456, + "latitude": 60.987654 + } + "country_code": "US" + }, + "storefront_visibility": true, + "special_hours": [ + { + "label": "Christmas Eve", + "date": "2022-12-25", + "open": true, + "opening": "00:00", + "closing": "09:00", + "all_day": false, + "annual": false + } + ] + } + ], + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Manage inventory for a location + +_Buy Online, Pick up in Store_ uses the [Inventory API](/docs/rest-management/inventory) to manage inventory quantities in two ways: + +* **Absolute quantity** sets or overwrites the inventory quantity of a product or variant. +* **Relative quantity** adjusts a product or variant's inventory quantity by adding to or subtracting from the existing quantity. + +Before setting inventory quantity to a location, check the inventory tracking configurations that have been enabled. There are three inventory tracking configurations: +* **Inventory is tracked by product** - This setting is used if your product has no variations. For example, champagne glasses or . +* **Inventory is tracked by variant** - This setting is used if your product has different attributes (variations), e.g. a shirt has various sizes and colors. +* **Inventory is not tracked** - This setting is used if you do not have a need to track inventory quantity, e.g. you may sell a digital asset like a PDF or digital music title. When inventory is not tracked, the product will always be considered available to sell on your storefront, even if it may not be in your physical storage location. + +It’s important to know the type of tracking when making absolute or relative adjustments, as this will ultimately determine how you author your API request to set inventory quantity. + +### Absolute adjustments to inventory quantity + +You can make absolute adjustments for inventory tracked by product. To make absolute adjustments, send a request to the [Absolute adjustment](/docs/rest-management/inventory/adjustments#absolute-adjustment) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Absolute adjustment to inventory" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/absolute + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 1, + "product_id": 111, + "quantity": 10 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Absolute adjustment to inventory" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + </Tab> +</Tabs> + +You can make absolute adjustments for inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Absolute adjustment to inventory" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/absolute + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "variant_id": 78, + "quantity": 5 + }, + { + "location_id": 2, + "variant_id": 79, + "quantity": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Absolute adjustment to inventory" showLineNumbers copy + { + "transaction_id": "b8dfdfbd-bfaa-40f4-b1b1-04d540604867" + } + ``` + </Tab> +</Tabs> + +### Relative adjustments to inventory quantity + +You can make relative adjustments to inventory tracked by product. To make relative adjustments, send a request to the [Relative inventory adjustments](/docs/rest-management/inventory/adjustments#relative-adjustment) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Relative adjustment to inventory" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/relative + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "product_id": 111, + "quantity": -2 + }, + { + "location_id": 2, + "product_id": 112, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Relative adjustment to inventory" showLineNumbers copy + { + "transaction_id": "6511a3d1-5392-4d10-8a0b-910d95c48d1e" + } + ``` + </Tab> +</Tabs> + +You can also make relative adjustments to inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Relative adjustment to inventory" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/adjustments/relative + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "items": [ + { + "location_id": 2, + "variant_id": 78, + "quantity": -2 + }, + { + "location_id": 2, + "variant_id": 79, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Relative adjustment to inventory" showLineNumbers copy + { + "transaction_id": "d0e1c1ca-8f35-403c-8d9f-d9a1b3302efbv" + } + ``` + + </Tab> +</Tabs> + +## Configure inventory settings + +In addition to making absolute or relative adjustments to inventory quantities, other inventory settings can also be set, including: + +- **Warning Level** - This is the same as the `inventory_warning_level` attribute in the Catalog API +- **Safety Stock** - The quantity of product that is stored to prevent an out-of-stock situation. It serves as insurance against sudden or rapid fluctuations in demand. Safety stock quantity is not included in the "available to sell" quantity that may be displayed to customers on the storefront. + +To do so, send a request to the [Update inventory settings for a location](/docs/rest-management/inventory/items#update-inventory-settings-for-a-location) endpoint. + +You can configure inventory settings for inventory tracked by product. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update inventory settings for a location" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "settings": [ + { + "identity": { + "product_id": 111 + }, + "safety_stock": 2, + "warning_level": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update inventory settings for a location" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + + </Tab> +</Tabs> + +You can configure inventory settings for inventory tracked by variant. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update inventory settings for a location" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "settings": [ + { + "identity": { + "variant_id": 78 + }, + "safety_stock": 2, + "warning_level": 5 + }, + { + "identity": { + "variant_id": 79 + }, + "safety_stock": 2, + "warning_level": 5 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update inventory settings for a location" showLineNumbers copy + { + "transaction_id": "6e172496-b0bb-46d5-adf5-855ba901cae7" + } + ``` + + </Tab> +</Tabs> + +## Get inventory by location + +At this point you may want to view inventory by location. To do so, send a request to the [Get inventory at a location](/docs/rest-management/inventory/items#get-inventory-at-a-location) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get inventory at a location" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations/{location_id}/items + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory at a location" showLineNumbers copy + { + "data": [ + { + "identity": { + "sku": "SM13", + "variant_id": 74, + "product_id": 111 + }, + "available_to_sell": 8, + "total_inventory_onhand": 10, + "settings": { + "safety_stock": 2, + "is_in_stock": true, + "warning_level": 5 + } + }, + { + "identity": { + "sku": "SM14-SM", + "variant_id": 78, + "product_id": 112 + }, + "available_to_sell": 5, + "total_inventory_onhand": 5, + "settings": { + "safety_stock": 0, + "is_in_stock": true, + "warning_level": 0 + } + }, + { + "identity": { + "sku": "SM14-ME", + "variant_id": 79, + "product_id": 112 + }, + "available_to_sell": , + "total_inventory_onhand": 5, + "settings": { + "safety_stock": 0, + "is_in_stock": true, + "warning_level": 0 + } + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## [Optional step] Get a product's inventory across all locations + +Alternatively, you can view aggregate inventory information for a product, across all locations that stock it. Send a request to the [Get inventory at locations](/docs/rest-management/inventory/items#get-inventory-at-locations) endpoint and filter by `product_id`, `variant_id`, or `sku`. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get inventory at locations" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{store_hash}/v3/inventory/items?variant_id=123 + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory at locations" showLineNumbers copy + { + "data": [ + { + "identity": { + "product_id": 123 + }, + "locations": [ + { + "location_id": 1, + "location_code": "BC-LOCATION-1", + "location_name": "Default location", + "available_to_sell": 10, + "total_inventory_onhand": 11, + "location_enabled": true, + "settings": { + "safety_stock": 1, + "is_in_stock": true, + "warning_level": 1 + } + } + ] + } + ], + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Create a pickup method and assign it to a location + +Once locations have been created, you can create pickup methods and assign them to a location. To do so, send a request to the [Create pickup methods](/docs/rest-management/pickup-methods#create-pickup-methods) endpoint. + +{/* can a pickup method be used across more than one location? */} + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create pickup methods" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 1, + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Add a second pickup method and assign it to a location + +Some merchants offer multiple pickup options at a single location. For example, a merchant might offer both in-store pickup and curbside pickup. To achieve this, send a request to the [Create pickup methods](/docs/rest-management/pickup-methods#create-pickup-methods) endpoint to create another pickup method and assign it to the same location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create pickup methods" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "location_id": 1, + "display_name": "Curbside pickup", + "collection_instructions": "See our staff member outside the store", + "collection_time_description": "Wait for a pickup confirmation and visit during business hours." + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 2, + "location_id": 1, + "display_name": "Curbside pickup", + "collection_instructions": "See our staff member outside the store", + "collection_time_description": "Wait for a pickup confirmation and visit during business hours." + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Update a specific detail for a pickup method + +If you need to update the original pickup method details, you can use the [Pickup Methods API](/docs/rest-management/pickup-methods). Update any of the following details using the [Update pickup methods](/docs/rest-management/pickup-methods#update-pickup-methods) endpoint: + +- `location_id` +- `display_name` +- `collection_instructions` +- `collection_time_description` + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update pickup methods" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "collection_instructions": "See our friendly staff member outside the store." + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 2, + "location_id": 1, + "display_name": "Curbside pickup", + "collection_instructions": "See our friendly staff member outside the store.", + "collection_time_description": "Wait for a pickup confirmation and visit during business hours." + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## [Optional step] Verify pickup method assignment + +Once you have assigned the pickup methods to the location(s), you can check what you've configured. To do so, send a request to the [Get pickup methods](/docs/rest-management/pickup-methods#get-pickup-methods) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get pickup methods" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get pickup methods" showLineNumbers copy + { + "data": [ + { + "id": 1, + "location_id": 1, + "display_name": "In-store pickup", + "collection_instructions": "Visit the service desk on arrival with your order number", + "collection_time_description": "9 AM to 5 PM" + }, + { + "id": 2, + "location_id": 1, + "display_name": "Curbside pickup", + "collection_instructions": "See our staff member outside the store.", + "collection_time_description": "Wait for a pickup confirmation and visit during business hours." + } + ] + "meta": {} + } + ``` + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/fulfillment.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/fulfillment.mdx new file mode 100644 index 000000000..b9b291a94 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/fulfillment.mdx @@ -0,0 +1,87 @@ + +## 6.0 Fulfill order as a merchant + +When building a _Buy Online, Pick up in Store_ solution, merchants can fulfill orders for pickup using the existing [Orders V2 API](/docs/rest-management/orders). + +To fulfill an order, send a request to the [Create an order](/docs/rest-management/orders#create-an-order) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create an order" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "billing_address": { + "state": "Washington", + "zip": "98006", + "country": "United States" + }, + "consignments": { + "pickups": [ + { + "pickup_method_id": 1, + "pickup_method_display_name": "Pick Up", + "collection_instructions": "Bring your ID", + "collection_time_description": "9am - 6pm", + "location": { + "name": "Location 1", + "code": "LOCATION-1", + "address_line_1": "123 Main Street", + "address_line_2": "Suite 101", + "city": "Austin", + "state": "Texas", + "postal_code": "78726", + "country_alpha2": "US", + "email": "location1@example.com", + "phone": "+1 111-111-1111" + }, + "line_items": [ + { + "name": "Fog Linen Chambray Towel - Beige Stripe", + "quantity": 3, + "price_ex_tax": 0, + "price_inc_tax": 0 + } + ] + } + ] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create an order" showLineNumbers copy + { + "id": 1234000049, + ... + "billing_address": { + "first_name": "", + "last_name": "", + "company": "", + "street_1": "", + "street_2": "", + "city": "", + "state": "Washington", + "zip": "98006", + "country": "United States", + "country_iso2": "US", + "phone": "", + "email": "", + "form_fields": [] + }, + "consignments": { + "url": "https://api.bigcommerce.com/stores/o8ertuc7vw/v2/orders/1234000049/consignments", + "resource": "/orders/1234000049/consignments" + }, + ... + } + ``` + + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/orders.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/orders.mdx new file mode 100644 index 000000000..37bd6ddb0 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/orders.mdx @@ -0,0 +1,157 @@ + + +## 5.0 Manage order as a merchant + +When building a _Buy Online, Pick up in Store_ solution, you can allow merchants to manage orders that have pickup consignments. They can view and update the pickup consignment for an order. + +### 5.1 View the newly-created order’s pickup consignment + +To view the pickup consignment for the newly-created order, send a request to the [Get consignments](/docs/rest-management/orders/order-consignments#get-consignments) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get consignments" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}}/consignments + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get consignments" showLineNumbers copy + { + "pickups": [ + { + "id": 13, + "pickup_method_id": 2, + "pickup_method_display_name": "Pickup Method 2", + "collection_instructions": "Pickup Method 2 instructions", + "collection_time_description": "Pickup Method 2 time", + "location": { + "id": 2, + "name": "location2", + "code": "LOCATION-2", + "address_line_1": "2802 Skyway Cir", + "address_line_2": "", + "city": "Austin", + "state": "Texas", + "postal_code": "78704", + "country_alpha2": "US", + "email": "location2@example.com", + "phone": "410123002" + }, + "line_items": [ + { + "url": "https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/126/products/22", + "resource": "/orders/126/products/22" + } + ] + } + ] + } + ``` + + </Tab> +</Tabs> + +The order's pickup consignment is 13. + +### 5.2 View the newly-created order's products + +To view the products for a newly-created order, send a request to the [Get order products](/docs/rest-management/orders/order-products#list-order-products) endpoint. The response returns products that were assigned to a pickup consignment. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get order products" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}}/products + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get order products" showLineNumbers copy + [ + { + "id": 22, + "order_id": 126, + "product_id": 97, + "variant_id": 69, + "order_pickup_method_id": 13, + … + } + ] + ``` + + </Tab> +</Tabs> + +The `order_pickup_method_id` field is 13 (same value as the pickup consignment ID). + +### 5.3 Update pickup consignment + +If you need to update the original pickup consignment details, you have the ability to do so using the Orders API. You can update the: +* `pickup_method_id` +* `pickup_method_display_name` +* `collection_instructions` +* `collection_time_description` +* location attributes (except for the `location_id`) + +To update a pickup consignment, send a request to the [Update an order](/docs/rest-management/orders#updates-an-order) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update an order" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/orders/{{order_id}} + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + { + "consignments": { + "pickups": [ + { + "id": 13, + "pickup_method_id": 1, + "pickup_method_display_name": "Pickup Method 1 name - override", + "collection_instructions": "Pickup Method 1 instructions - override", + "collection_time_description": "Pickup Method 1 time - override", + "location": { + "name": "Location 1 - override", + "code": "LOCATION-1 - override", + "address_line_1": "123 Main Street - override", + "address_line_2": "Suite 101 - override", + "city": "Austin - override", + "state": "Texas - override", + "postal_code": "78726 - override", + "country_alpha2": "US", + "email": "location1_override@example.com", + "phone": "+1 111-111-1111 - override" + } + } + ] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update an order" showLineNumbers copy + { + "id": 126, + ... + "consignments": { + "url": "https://api.bigcommerce.com/stores/cc8eopdesv/v2/orders/126/consignments", + "resource": "/orders/126/consignments" + } + } + ``` + + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/overview.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/overview.mdx new file mode 100644 index 000000000..b8f88aa7c --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/overview.mdx @@ -0,0 +1,40 @@ + +# End-to-End API Guide + +This document guides you through the steps on how to create customized _Buy Online, Pick up in Store_ solutions for merchants and shoppers. +This guide provides a sequence of API calls, framed from the perspective of the merchant and their shoppers. +For more on the API endpoints that support _Buy Online, Pick up in Store_, see [Overview](/docs/integrations/buy-online-pick-up-in-store). + +## Guide + +- [Merchant configuration](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration) +- [Browse and discover as a shopper](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/shopping) +- [Manage checkout as a shopper](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout) +- [Manage order as a merchant](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/orders) +- [Fulfill order as a merchant](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/fulfillment) +- [Terminate configuration as a merchant](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/retirement) + +## Prerequisites + +This guide assumes the merchant already has the following elements configured: + +* A functioning BigCommerce store. +* Store settings, including [Catalog](https://support.bigcommerce.com/s/article/Adding-Your-Catalog), [Payments](https://support.bigcommerce.com/s/article/Payment-Methods-Video), [Tax](https://support.bigcommerce.com/s/article/Tax-Overview), [Order Fulfillment](https://support.bigcommerce.com/s/article/What-is-Order-Fulfillment), etc. +* A storefront that uses a [custom checkout](/docs/storefront/cart-checkout/open-checkouts/guide), such as one of the following: + - a new or existing checkout built with the [Checkout JS SDK](/docs/storefront/cart-checkout/checkout-sdk) + - a headless storefront that uses the [Store Management Checkout API](/docs/rest-management/checkouts) +* A [store-level API account](/docs/start/authentication/api-accounts#store-api-accounts) that contains the following [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes): + +| UI Name | Permission | Parameter | Description | +|:--------|:-----------|:----------|:------------| +| Store Inventory | modify | `store_inventory` | View and modify the store inventory | +| Store Locations | modify | `store_locations` | View and modify store locations | +| Fulfillment Methods| modify | `store_fulfillment_methods_manage` | View and modify order fulfillment methods | +| Order Fulfillment | modify | `store_order_fulfillment_manage` | View and modify order fulfillments | + +* If your implementation uses a single-click app wrapper, a separately configured [app profile and app-level API account](/docs/integrations/apps/guide/developer-portal) is required to manage installation and access. + +## Resources + +* [FAQ](/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions) +* [Glossary](/docs/integrations/buy-online-pick-up-in-store/glossary) diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/retirement.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/retirement.mdx new file mode 100644 index 000000000..40cba59a6 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/retirement.mdx @@ -0,0 +1,131 @@ + + +## 7.0 Terminate configuration as a merchant + +It is possible to terminate the merchant configuration that supports _Buy Online, Pick up in Store_ . +To do so, you can reassign inventory, disable a location and its storefront visibility, and delete pickup methods. + +### 7.1 Reassign inventory from one location to another +There is no dedicated endpoint for reassigning inventory from one location to another. Instead, use the existing inventory API endpoints. + +### 7.2 Location + +#### 7.2.1 Disable a location + +To disable a location, send a request to the [Update locations](/docs/rest-management/locations#update-locations) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "enabled": false + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "e81ada43-fc10-41a0-9a61-b25d8223a71c" + } + ``` + + </Tab> +</Tabs> + +#### 7.2.2 Disable a location’s storefront visibility + +Storefront visibility is currently a shopper-facing property of a location. +If it is set to false, then details about the location (e.g. description, operating hours) on the location details page and inventory quantities at that location will be excluded from the "available to sell" quantity on the storefront. +If it is set to true, then details about the location on the location details page and inventory quantities at that location will be included in the "available to sell" quantity on the storefront. + +To disable a location’s visibility on the storefront, send a request to the [Update locations](/docs/rest-management/locations#update-locations) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update locations" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations + X-Auth-Token: {{access_token}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": 2, + "storefront_visibility": false + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update locations" showLineNumbers copy + { + "transaction_id": "e81ada43-fc10-41a0-9a61-b25d8223a71c" + } + ``` + + </Tab> +</Tabs> + +#### 7.2.3 Delete a location + +To delete a location, send a request to the [Delete locations](/docs/rest-management/locations#delete-locations) endpoint. + +If a location has inventory that you want to keep, use [Inventory adjustments](/docs/rest-management/inventory/adjustments) to reassign the inventory to a different location before deleting the location. + +For locations that you can't delete, see the [Delete locations](/docs/rest-management/locations#delete-locations) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Delete locations" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations?location_id:in=1,2 + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Delete locations" showLineNumbers copy + No Content + ``` + + </Tab> +</Tabs> + +### 7.3 Delete a pickup method + +To delete a pickup method, send a request to the [Delete pickup methods](/docs/rest-management/pickup-methods#delete-pickup-methods) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Delete pickup methods" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{store_hash}}/v3/pickup/methods?id:in=1,2 + X-Auth-Token: {{access_token}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```http filename="Example response: Delete pickup methods" showLineNumbers copy + No Content + ``` + + </Tab> +</Tabs> diff --git a/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/shopping.mdx b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/shopping.mdx new file mode 100644 index 000000000..07b776295 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/shopping.mdx @@ -0,0 +1,120 @@ + +## 3.0 Browse and discover as a shopper + +When building a _Buy Online, Pick up in Store_ solution, you can create custom experiences for shoppers that support _Buy Online, Pick up in Store_. + +There are two ways to access data on the storefront: +- REST Storefront API +- GraphQL Storefront API + +Over time, BigCommerce will be investing more in the GraphQL Storefront API, so all future enhancements to support _Buy Online, Pick up in Store_ will be made against the GraphQL Storefront API. + +### 3.1 REST Storefront API + +#### 3.1.1 Find available pickup options with stock available + +To show pickup options to customers on a storefront page (e.g. the product detail page), send a request to the [Find available pickup options](/docs/rest-storefront/pickup-options#find-available-pickup-options) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Find available pickup options" showLineNumbers copy + POST https://{{yourstore.example.com}}/api/storefront/pickup-options + Content-Type: application/json + Accept: application/json + + { + "searchArea": { + "radius": { + "value": 25, + "unit": "MI" + }, + "coordinates": { + "latitude": 32.8058616, + "longitude": -98.0105544 + } + }, + "items": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Find available pickup options" showLineNumbers copy + { + "results": [ + { + "pickupOptions": [ + { + "pickupMethod": { + "id": 1, + "locationId": 1, + "displayName": "Office Pickup", + "collectionInstructions": "Bring your ID", + "collectionTimeDescription": "Collect during our opening hours of 0900 - 1700" + }, + "availableItems": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ] + }, + { + "pickupOptions": [ + { + "pickupMethod": { + "id": 2, + "locationId": 2, + "displayName": "Pickup method 2", + "collectionInstructions": "Instructions", + "collectionTimeDescription": "Desc" + }, + "availableItems": [ + { + "variantId": 1, + "quantity": 1 + }, + { + "variantId": 2, + "quantity": 2 + } + ] + } + ] + } + ] + } + ``` + </Tab> +</Tabs> + +### 3.2 GraphQL Storefront API + +You can use the GraphQL Storefront API to query locations and inventory that are available to a storefront. + +#### 3.2.1 Get locations + +For example queries, see [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries). + +For info on getting location data in the storefront using Stencil Utils powered by GraphQL, see [Stencil Utils Reference- Get page by GraphQL](/docs/storefront/stencil/utils/reference#get-page-by-graphql). + +#### 3.2.2 Get inventory by location + +For example queries, see [Query Inventory with the GraphQL Storefront API](/docs/storefront/graphql/inventory/queries). diff --git a/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx b/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx new file mode 100644 index 000000000..8dae8a485 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx @@ -0,0 +1,28 @@ +# Frequently Asked Questions (FAQ) + +**Does the native, out-of-the-box Cornerstone theme support _Buy Online, Pick up in Store_?** + +No. The native Cornerstone theme does not support _Buy Online, Pick up in Store_. To use _Buy Online, Pick up in Store_ on a Stencil storefront, [create a custom theme](https://support.bigcommerce.com/s/article/Stencil-Themes) or consider using a [headless storefront](https://support.bigcommerce.com/s/article/The-Headless-Approach). +**Does the store control panel support Buy Online, Pick up in Store?** + +_Buy Online, Pick up in Store_ is primarily API-driven. The store control panel does not provide support comparable to using the APIs. For more information, see our [product blog article on Buy Online, Pick up in Store](https://support.bigcommerce.com/s/blog-article/aAn4O0000001Il2SAE/unlock-instore-pickup-with-bopis-apis?language=en_US). + +**When is inventory deducted within the checkout? Does BigCommerce support the concept of inventory deductions for checkouts in progress?** + +No. To keep the logic clean and simple, a store's inventory is not adjusted until a shopper has successfully paid for their order. Any desired inventory reservation functionality should be performed by the implementation. + +Assume there is one umbrella left in stock. If two shoppers both have the umbrella in their cart prior to reaching the payment step of checkout, the first to pay will purchase the umbrella, and the second will encounter an out-of-stock message when they reach the payment step of checkout. + +**Does BigCommerce support in-stock transfers** + +BigCommerce does not natively support in-stock transfers. This is best handled by an external application, such as an OMS or ERP. + +**How does performing an order refund affect order consignments?** + +Order Refunds do not affect order consignments. + +**How does editing an order affect order consignments?** + +When an order is edited, the order consignment will be modified to reflect these changes. For example, this includes changes to shipping addresses or line item quantities, as well as the addition or removal of line items. + +An order can be edited at any time of the fulfillment lifecycle; this includes orders that have already been fulfilled. diff --git a/docs/integrations/buy-online-pick-up-in-store/glossary.mdx b/docs/integrations/buy-online-pick-up-in-store/glossary.mdx new file mode 100644 index 000000000..03eb2e174 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/glossary.mdx @@ -0,0 +1,49 @@ +# Glossary + + +## BOPIS + +An acronym, commonly used in North America, that stands for _Buy Online, Pick up in Store_. + + +## Click & Collect + +Another term for _Buy Online, Pick up in Store_. + + +## Consignment + +_Consignment_ refers to a list of line items and information about how those items should be fulfilled, as captured during the checkout or order creation process. This includes the transit path they take to move from their stock location into the shopper’s possession. + +In practice, a consignment is a collection of store catalog item identifiers and their quantities, along with fulfillment information. There are two main fulfillment types: _shipping_ and _pickup_. The consignment provides details required to complete the selected type of fulfillment, such as a pickup location ID, or a shipping destination address with a shipping origin location ID. + +A consignment captures the shopper’s wishes about how they’d like to receive their order. A consignment does not necessarily represent how the merchant actually chooses to fulfill the shopper’s order. + +## Location + +_Location_ is a concept that allows merchants to track product inventory across multiple physical or virtual locations. Locations also allow merchants to manage their store and warehouse physical addresses in a single source of truth, which can be used by tools such as store locator widgets or app integrations that are concerned with locations where a store’s business is conducted. + +## Pickup + +_Pickup_ is a concept analogous to _shipment_. It allows merchants to track and record order consignments that are fulfilled when someone travels to a store location to take possession of the order items. + +## Pickup method + +_Pickup method_ is a concept analogous to _shipping method_. It allows merchants to customize the pickup options that display at checkout with an additional description and display text, beyond the basic address details defined by the associated location. Pickup methods allow merchants to set up multiple different pickup options for a single location, such as offering both in-store pickup and curbside pickup. + +## Routing + +_Routing_ refers to the process of determining which inventory locations to use as fulfillment sources for line items within a cart, checkout, and order. + +At launch, the _Buy Online, Pick up in Store_ feature does not manage routing; however, an implementation might use the Inventory and Locations APIs to externally impose consistent routing logic. + +## Safety Stock + +The quantity of product that is stored to prevent the inadvertent sale of an out-of-stock item. It serves as insurance against sudden or rapid fluctuations in demand. + +Safety stock quantity is not included in the _available to sell_ quantity that may be displayed to customers on the storefront. + +## Warning Level + +_Warning level_ is the same as the `inventory_warning_level` attribute in the Catalog API. + diff --git a/docs/integrations/buy-online-pick-up-in-store/guide/add-to-cart.mdx b/docs/integrations/buy-online-pick-up-in-store/guide/add-to-cart.mdx new file mode 100644 index 000000000..c10e81155 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/guide/add-to-cart.mdx @@ -0,0 +1,79 @@ +# Implementing an Add to Cart Flow for Buy Online, Pick up in Store + +Many online brands allow shoppers to choose pick up or ship directly from the product details page. + +This can reduce friction for shoppers who already have a preferred local store, or for whom you can estimate the location of their local store. These shoppers can add to cart and lock in a pickup location in one click. + +Depending on the payment options available, the shopper could then complete Checkout in just a couple of clicks. + +You will need to customize a store's Theme to display appropriate options based on the desired experience. + +You will need to interact with both the Cart and Checkout APIs to take advantage of the new _Buy Online, Pick up in Store_ features in BigCommerce. This is needed whether you implement dropdown, radio buttons, or separate buttons to select between shipping or pickup. + +Use the [Carts API](/docs/rest-storefront/carts) to add the item(s) to cart. + +```http filename="Example request: Add cart line items" showLineNumbers copy +POST https://{store_domain}/api/storefront/carts/{cartId}/items +Content-Type: application/json +Accept: application/json + +{ + ... + + "lineItems": [ + { + "quantity": 1, + "productId": 5, + "variantId": 55 + } + ] + + ... +} +``` + +This returns line item ids which will need to be referenced in subsequent calls. + +```json filename="Example response: Add cart line items" showLineNumbers copy +{ +... + "lineItems": { + "physicalItems": [ + { + "id": 20, // line item id + "quantity": 1, + "productId": 5, + "variantId": 55, + ... + } + ] + } +... +} +``` + +Next, use the updated [Checkout API](/docs/rest-storefront/checkouts) to create or use an existing Consignment. If the shopper wants to pick up their items, use the `id` retrieved from [Find available pickup options](/docs/rest-storefront/pickup-options#find-available-pickup-options) for the `pickupMethodId`. + +```http filename="Example request: Add consignment to checkout" showLineNumbers copy +POST https://{store_domain}/api/storefront/checkouts/{checkoutId}/consignments +Content-Type: application/json +Accept: application/json + +[ + ... + + "lineItems": [ + { + itemId: 20, + quantity: 1 + } + ] + "pickupOption": { + "pickupMethodId": 1 + } + "address": [] +] +``` + + +You can continue to modify Consignment using the Checkout API, updating the selected pickup option or even switching the Consignment back to a "shipping" type. diff --git a/docs/integrations/buy-online-pick-up-in-store/guide/checkout.mdx b/docs/integrations/buy-online-pick-up-in-store/guide/checkout.mdx new file mode 100644 index 000000000..35ef84aa2 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/guide/checkout.mdx @@ -0,0 +1,21 @@ +# Building a Buy Online, Pick up in Store-friendly Checkout Experience + +You can customize the checkout to tailor the shopper experience depending on whether the shopper chooses shipping or a Pickup fulfillment method. + +If you want to create a _Buy Online, Pick up in Store_ experience on top of our existing Optimized One-Page Checkout, you can [install a custom checkouts](/docs/storefront/cart-checkout/open-checkouts/guide). + +Alternatively, if you want to create a fully custom checkout experience that diverges significantly from our Optimized One-Page Checkout, use the [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) to interact with the Storefront Checkout APIs. +For info on incorporating BOPIS features, see the [Manage Checkout as a Shopper](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/checkout) guide. + +Regardless of which approach you choose, you can customize by doing the following: + +- Remove the Shipping Address section for _Buy Online, Pick up in Store_ flows +- Connect your middleware service to take additional _Buy Online, Pick up in Store_ form fields +- Allow changing the pickup location within Checkout +- Allow toggling between shipping and _Buy Online, Pick up in Store_ in Checkout + +Use the [Storefront Checkout APIs](/docs/rest-storefront/checkouts) from your custom frontend implementation to interact with the BigCommerce Consignment model so that you can update shipping and pickup options that account for inventory levels. + +<Callout type="info"> +Payment providers, such as Stripe V3 and PayPal powered by Braintree, support _Buy Online, Pick up in Store_ transactions through custom checkouts. +</Callout> \ No newline at end of file diff --git a/docs/integrations/buy-online-pick-up-in-store/guide/orders.mdx b/docs/integrations/buy-online-pick-up-in-store/guide/orders.mdx new file mode 100644 index 000000000..4b52c4edb --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/guide/orders.mdx @@ -0,0 +1,15 @@ +# Reading and Updating Order Fulfillment Info + +You can manage inventory at multiple locations and offer _Buy Online, Pick up in Store_ functionality for shoppers. + +In _Buy Online, Pick up in Store_ solutions, Orders use Consignments, which represent collections of line items and a fulfillment method. The fulfillment method can be one of `shipping`, `pickup`, or `digital` in the case of digital products. + +You can integrate your existing backend with BigCommerce's _Buy Online, Pick up in Store_ offering using our new and updated APIs. + +You may also continue to use the current API in a backwards compatible way without using _Buy Online, Pick up in Store_ features. + +![order management.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/order%20management.png) + +Use the updated [Orders V2 API](/docs/rest-management/orders) to query or update fulfillment information on orders. This will maintain consistent inventory levels across your defined locations. + +Use the [Locations API](/docs/rest-management/locations) to query detailed inventory levels and address information from a store's locations. diff --git a/docs/integrations/buy-online-pick-up-in-store/guide/storefront.mdx b/docs/integrations/buy-online-pick-up-in-store/guide/storefront.mdx new file mode 100644 index 000000000..9de5d85c1 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/guide/storefront.mdx @@ -0,0 +1,79 @@ +# Adding Buy Online, Pick up in Store Features to the Storefront + +You can enhance the storefront browsing experience by letting shoppers see and select a Pickup fulfillment method. + +The biggest benefit is that shoppers can see product inventory availability by location. This helps inform their shopping decisions. + +![storefront browsing.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BOPIS%20storefront%20product%202.png) + +Adding inventory data experiences can be achieved by customizing a store's theme to query the [GraphQL Storefront API](/docs/storefront/graphql) and display the appropriate components for availability. + +The [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries) and [Query Inventory with the GraphQL Storefront API](/docs/storefront/graphql/inventory/queries) pages contain info about what has been added to the API to support _Buy Online, Pick up in Store_ features. + +The following example shows how you can show inventory for the base product and its variants using [Stencil](/docs/storefront/stencil): + +1. Add the following [GraphQL attribute](/docs/storefront/stencil/themes/context/frontmatter-reference#graphql-attributes) to the [Stencil Front Matter](/docs/storefront/stencil/themes/context/frontmatter) of the `product.html` page: + +```graphql showLineNumbers copy +gql: "query($productId: Int!) { + site { + product(entityId: $productId) { + name + inventory { + aggregated { + availableToSell + } + } + variants { + edges { + node { + sku + inventory { + aggregated { + availableToSell + } + byLocation { + edges { + node { + locationEntityCode + availableToSell + isInStock + } + } + } + } + } + } + } + } + } +}" +``` + +2. Add the following handlebars to the `product-view.html` page: + +```handlebars showLineNumbers copy +{{#if gql.data.site.product}} + +<b>Available to Sell:</b> {{gql.data.site.product.inventory.aggregated.availableToSell}} <br></br> + +{{#each gql.data.site.product.variants.edges}} + {{#with node}} + + <b>Variant SKU: </b> {{sku}} <br></br> + Total Available to Sell: {{inventory.aggregated.availableToSell}} <br></br> + + {{#each inventory.byLocation.edges}} + {{#with node}} + + {{#if isInStock}} + {{locationEntityCode}} has {{availableToSell}} in stock <br></br> + {{/if}} + + {{/with}} + {{/each}} + {{/with}} +{{/each}} + +{{/if}} +``` \ No newline at end of file diff --git a/docs/integrations/buy-online-pick-up-in-store/index.mdx b/docs/integrations/buy-online-pick-up-in-store/index.mdx new file mode 100644 index 000000000..833727fe6 --- /dev/null +++ b/docs/integrations/buy-online-pick-up-in-store/index.mdx @@ -0,0 +1,161 @@ +# Overview + +_Buy Online, Pick up in Store_ involves the following users: + +- The **shopper**, who interacts with the storefront, cart, and checkout +- The **merchant**, who manages back office operations, such as locations, inventory, pickup methods, catalog, and orders +- The **agency partner**, who implements the project integrations +- The **technology partner**, who integrates solutions for the merchant, such as ERPs, OMSes, IMSes, listing marketplaces, etc. + +As a developer, there are many ways in which you interact with these users to build Buy Online, Pick Up in Store. + +You can store back-office components, such as location and inventories, on partner solutions. These partner solutions then serve as the source of truth for your data. + +You can expose back-office components on the storefront. This would enable partners to create _Buy Online, Pick up in Store_ experiences. For example, partners can create store locator widgets for the shopper. + +The following diagram illustrates how all the different parts relate with each other. + +![_Buy Online, Pick up in Store_ APIs.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BOPIS%20all%20APIs.png) + +The above diagram contains two colored symbols: + +- Purple - Existing API endpoint, updated to support _Buy Online, Pick up in Store_. +- Aqua - New API endpoint, introduced to support _Buy Online, Pick up in Store_. + +For more on the tools you can use to do build _Buy Online, Pick up in Store_ experiences, see [Shopper experience](#shopper-experience) and [Merchant experience](#merchant-experience). + +## Shopper experience + +Shoppers are the end-customers who make a purchase on the retailer, or merchant, site. + +The following diagram shows the API endpoints that support a _Buy Online, Pick up in Store_ solution for shoppers. + +![_Buy Online, Pick up in Store_ Storefront APIs.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BOPIS%20Storefront%20APIs.png) + +To build custom experiences for shoppers, use the following tools: + +### GraphQL Storefront API + +You can use the GraphQL Storefront API to query locations and inventory exposed to the storefront. + +For more information, see [Get Locations](/docs/storefront/graphql/locations/settings) and [Get Inventory](/docs/storefront/graphql/inventory/settings). + +If you want to customize a storefront theme, use Stencil Handlebars. +- BOPIS does not include new Stencil Handlebars. +- However, you can use GraphQL to define your own resources within the theme. You can add data such as inventory and locations the Stencil page context. +- For more, see [GraphQL attributes](/docs/storefront/stencil/themes/context/frontmatter-reference#graphql-attributes) under the [Stencil Docs](/docs/storefront/stencil). + +### Storefront Checkout API + +You can use the [Storefront Checkout API](/docs/rest-storefront/checkouts) to manage checkout operations on Stencil-powered storefronts. + +- The API's consignment model now includes a pickup fulfillment type in addition to the existing shipping fulfillment type. +- The [Checkout SDK](/docs/storefront/cart-checkout/checkout-sdk) uses the Storefront Checkouts API. Any updates made to the Storefront Checkouts API will also be reflected in the SDK. + +### Storefront Pickup Options API + +You can use the [Storefront Pickup Options API](/docs/rest-storefront/pickup-options) to allow shoppers to search for available pickup options near provided coordinates. +Shoppers can retrieve pickup options for items based on shopper location and the availability of items at specific locations. + +## Merchant experience + +Merchants are retailers who have BigCommerce stores and want to sell online. + +The following diagram shows the API endpoints that support a _Buy Online, Pick up in Store_ solution for merchants. + +![_Buy Online, Pick up in Store_ Management APIs.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BOPIS%20Management%20APIs.png) + +The following APIs are primarily targeted towards Mid-Market and Enterprise merchants who have in-house IT teams or work with agency partners to connect BigCommerce to external partner systems (e.g. ERP, OMS, IMS). + +### Inventory API + +The [Inventory API](/docs/rest-management/inventory) exposes location-aware, item-level inventory data. +You can create BigCommerce apps and custom API-driven solutions that do the following: + +- Track inventory across multiple locations. +- Display location-level inventory to shoppers. +- Provide multi-location fulfillment options. +- Facilitate _Buy Online, Pick up in Store_ processes. +- Manage post-checkout order fulfillment. + +For more information, see [Inventory Overview](/docs/store-operations/catalog/inventory-adjustments). + +### Catalog API + +When your store starts using the new [Inventory API](#inventory-api), you may experience breaking changes. +The [Catalog API](/docs/rest-catalog) only supports basic inventory concepts (`inventory_level`, `inventory_warning_level`, `inventory_tracking`). +When you start using the Inventory API, inventory management not be handled through the Catalog API, but instead through the Inventory API. + +### Locations API + +You can create new locations for your inventory using the [Locations API](/docs/rest-management/locations) +For more information, see [Locations Overview](/docs/store-operations/catalog/inventory-locations). + +### Pickup Methods API + +You can use the [Pickup Methods API](/docs/rest-management/pickup-methods) to create pickup methods for your shoppers. The API lets you make the methods available at certain locations. +These methods determine the options that are available to shoppers if they pick up their orders, i.e. fulfill their order with a pickup method. + +### Pickup Options V3 API + +You can use the [Pickup Options V3 API](/docs/rest-management/pickup-options) to retrieve pickup options for items. +The retrieved options are based on the shopper's location and the availability of items at locations. +The Pickup Options V3 API returns only options from locations in which all requested items are available. + +### Pickup API + +"Pickup in store" is a new fulfillment method that supports _Buy Online, Pick up in Store_. +You can use the [Pickup API](/docs/rest-management/pickup) to manage pickups, including the items to be collected and the method of pickup. + +### Checkouts V3 + +You can use the [Checkout V3 API](/docs/rest-management/checkouts) to manage checkouts from server-to-server. +- The API's consignment model now includes a pickup fulfillment type in addition to the existing shipping fulfillment type. +- The pickup-in-store fulfillment type functions the same way as the [Storefront Checkouts API](#storefront-checkout-api). + +### Orders V2 API + +To support _Buy Online, Pick up in Store_, the [Orders V2 API](/docs/rest-management/orders) uses consignments, or collections of line items and a fulfillment method. +You can create orders that have a pickup, shipping, or digital fulfillment method for consignments. +An order can have only one type of fulfillment method. Also, you can create only one pickup consignment per order. + +The updates to the existing Orders V2 API were additive changes to ensure backward Compatibility. + +## Out of scope + +### Checkout routing logic API + +- Such an API allows routing logic within an ERP/OMS to be exposed in the BigCommerce Checkout, to drive routing logic & thus shipping quote generation in the Checkout. +- This is out of scope because: + - It complicates the checkout which can negatively impact conversion. + - Shipping costs can decrease conversion. It's simpler to offer flat-rate shipping or free shipping to customers and provides a cleaner shopper experience. + - The merchant may already use a shipping partner who handles this complexity. + +### Mixed consignment orders + +- Mixed consignment orders are made up of different types of consignments; a subset of products in a mixed consignment order may be pickup, while another subset of products in the order may be delivered. +- You cannot create mixed consignment orders. You can only create orders that have either pickup or shipping consignments, but not both. + +### Multiple pickup consignment orders + +- A multiple pickup consignment order is one in which a subset of products in the order is picked up from one location, and another subset of products in the order is picked up from an entirely different location. +- For each order, you can only create one consignment with a single pickup location. You cannot create partial pickups. +- Multiple destination shipping addresses will still be supported. + +### Multiple shipping origins + +_Buy Online, Pick up in Store_ currently focuses on pick up in store capability that uses APIs. You currently cannot quote shipping rates from multiple shipping origins with partners. + +### Multi-channel awareness + +_Buy Online, Pick up in Store_ currently supports pick up on a single storefront channel. Currently, you cannot have different warehouse locations and inventory service different storefront channels. + +### In-stock transfers + +_Buy Online, Pick up in Store_ does not support in-stock transfers. Use a partner system (e.g. OMS / ERP), which is the source of truth for inventory and order management, to handle in-stock transfers. + + +## Resources + +- [FAQ](/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions) +- [Glossary](/docs/integrations/buy-online-pick-up-in-store/glossary) diff --git a/docs/api-docs/partner/pos/channels-pos-tutorial.mdx b/docs/integrations/channels/draft/channels-pos-tutorial.mdx similarity index 99% rename from docs/api-docs/partner/pos/channels-pos-tutorial.mdx rename to docs/integrations/channels/draft/channels-pos-tutorial.mdx index 4e181d085..f58c99d49 100644 --- a/docs/api-docs/partner/pos/channels-pos-tutorial.mdx +++ b/docs/integrations/channels/draft/channels-pos-tutorial.mdx @@ -118,7 +118,7 @@ Accept: application/json Use the `query_path` value passed to the app's control panel iFrame to render the corresponding UI section. -### Exmple overview section +### Example overview section ![Example Overview Section](https://storage.googleapis.com/bigcommerce-production-dev-center/images/channels/channels-channel-overview.png "Example Overview Section") diff --git a/docs/api-docs/channels/channel-app-best-practices.mdx b/docs/integrations/channels/guide/best-practices.mdx similarity index 100% rename from docs/api-docs/channels/channel-app-best-practices.mdx rename to docs/integrations/channels/guide/best-practices.mdx diff --git a/docs/api-docs/channels/channels-extending-existing.mdx b/docs/integrations/channels/guide/extending-existing-apps.mdx similarity index 100% rename from docs/api-docs/channels/channels-extending-existing.mdx rename to docs/integrations/channels/guide/extending-existing-apps.mdx diff --git a/docs/api-docs/channels/building-channel-apps.mdx b/docs/integrations/channels/guide/index.mdx similarity index 100% rename from docs/api-docs/channels/building-channel-apps.mdx rename to docs/integrations/channels/guide/index.mdx diff --git a/docs/api-docs/channels/channel-app-requirements.mdx b/docs/integrations/channels/guide/requirements.mdx similarity index 100% rename from docs/api-docs/channels/channel-app-requirements.mdx rename to docs/integrations/channels/guide/requirements.mdx diff --git a/docs/api-docs/channels/channels-storefront-tutorial.mdx b/docs/integrations/channels/guide/storefronts.mdx similarity index 100% rename from docs/api-docs/channels/channels-storefront-tutorial.mdx rename to docs/integrations/channels/guide/storefronts.mdx diff --git a/docs/api-docs/channels/channels-overview.mdx b/docs/integrations/channels/index.mdx similarity index 100% rename from docs/api-docs/channels/channels-overview.mdx rename to docs/integrations/channels/index.mdx diff --git a/docs/api-docs/channels/channels-quick-start.mdx b/docs/integrations/channels/quick-start.mdx similarity index 100% rename from docs/api-docs/channels/channels-quick-start.mdx rename to docs/integrations/channels/quick-start.mdx diff --git a/docs/api-docs/channels/channels-toolkit-reference.mdx b/docs/integrations/channels/toolkit-reference.mdx similarity index 91% rename from docs/api-docs/channels/channels-toolkit-reference.mdx rename to docs/integrations/channels/toolkit-reference.mdx index 5f2d1a3c9..4a1efaf7e 100644 --- a/docs/api-docs/channels/channels-toolkit-reference.mdx +++ b/docs/integrations/channels/toolkit-reference.mdx @@ -90,8 +90,8 @@ The following UI components are highly recommended for channels. | Link | Description | |-|-| -|[Channels Overview](/docs/integrations/channels)|High-level overview of channels and developing channels apps on BigCommerce| -|[Building Channel Apps](/docs/integrations/channels/guide)|In-depth technical guide to building a channel app| -|[Extending Sales Channel Apps with Channels Toolkit](/docs/integrations/channels/guide/extending-existing-apps)|Tutorial on intregrating Channels Toolkit into existing apps| -|[Channel App Best Practices](/docs/integrations/channels/guide/best-practices)|List of best practices for channel apps| -|[Building a Storefront Channel](/docs/integrations/channels/guide/storefronts)|Tutorial on creating a channel app for a headless storefront| +|[Channels overview](/docs/integrations/channels)|High-level overview of channels and developing channels apps on BigCommerce| +|[Channels guide](/docs/integrations/channels/guide)|In-depth technical guide to building a channel app| +|[Extending existing apps with the channels toolkit](/docs/integrations/channels/guide/extending-existing-apps)|Guide to integrating the channels toolkit into existing apps| +|[Channel app best practices](/docs/integrations/channels/guide/best-practices)|List of best practices for channel apps| +|[Building storefront channels](/docs/integrations/channels/guide/storefronts)|Guide to creating a channel app for a headless storefront| diff --git a/docs/api-docs/analytics/bodl-for-storefronts.mdx b/docs/integrations/hosted-analytics.mdx similarity index 91% rename from docs/api-docs/analytics/bodl-for-storefronts.mdx rename to docs/integrations/hosted-analytics.mdx index 9ef5bd34e..a63253450 100644 --- a/docs/api-docs/analytics/bodl-for-storefronts.mdx +++ b/docs/integrations/hosted-analytics.mdx @@ -3,7 +3,7 @@ title: Big Open Data Layer for Storefront Analytics keywords: currency, currencies, analytics, storefronts, bodl, big open data layer, data, scripts, draft order, ga4, GA4, google, events, if, google analytics 4, --- -# Big Open Data Layer for Storefront Analytics +# Big Open Data Layer for storefront analytics The Big Open Data Layer (shortened as _BODL_, pronounced 'Bottle') is a JavaScript object that simplifies sending data from BigCommerce-hosted storefronts to third-party analytics providers. It gives third-party scripts access to clean, consistent data. BODL makes store sites more efficient by consolidating data of interest and presenting it as a package. Each analytics script does not need to fetch the same data independently. @@ -29,12 +29,12 @@ BODL exposes data when shoppers trigger storefront events. Currently, BODL suppo - [Update consent](#update-consent) - [Keyword search](#keyword-search) - [View banner](#view-banner) -- [View product page](#view-product-page-event-schema) -- [View product category](#view-product-category-event-schema) -- [Add product to cart](#add-product-to-cart-event-schema) -- [View cart](#view-cart-event-schema) -- [Remove product from cart](#remove-product-from-cart-event-schema) -- [Start checkout](#start-checkout-event-schema) +- [View product page](#view-product-page) +- [View product category](#view-product-category) +- [Add product to cart](#add-product-to-cart) +- [View cart](#view-cart) +- [Remove product from cart](#remove-product-from-cart) +- [Start checkout](#start-checkout) - [Add shipping information](#add-shipping-information) - [Add payment information](#add-payment-information) - [Purchase order](#purchase-order-event-schema) @@ -101,7 +101,7 @@ When the shopper clicks a button to view a product page, the following fields ap | Event field | Type | Description | BigCommerce data map | |:---|:---|:---|:---| | `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) for the currency the storefront displays to shoppers. | [Get all currencies](/docs/rest-management/currencies#get-all-currencies) <br /> `currency_code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) for the currency the storefront displays to shoppers. | [Get all currencies](/docs/rest-management/currencies#get-all-currencies) <br /> `currency_code` | | `product_value` | number | Price of the product before taxes; tax-exclusive price. | [Get prices](/docs/rest-management/pricing/products#get-prices-batch) <br /> `data.calculated_price.tax_exclusive` | | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `line_items[]` | array of `line_item` objects | Item on the product page. | See [line_item](#line_item-object-schema) object for event fields | @@ -113,7 +113,7 @@ When the shopper clicks a button to add a product to a cart, the following field | Event field | Type | Description | BigCommerce data map | |:---|:---|:---|:---| | `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `line_items[]` | array of `line_item` objects | Items added to the cart. | See [line_item](#line_item-object-schema) object for event fields | | `product_value` | number | Item price multiplied by quantity. Product default price or, if applicable, the sale price configured in the admin panel, before discounts and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `lineItems.physicalItems.listPrice` or <br /> `lineItems.digitalItems.listPrice`| @@ -126,7 +126,7 @@ When the shopper clicks a button to view a cart, the following fields appear in |:---|:---|:---|:---| | `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `cartAmount` | | `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `line_items[]` | array of `line_item` objects | All items in the cart. | See [line_item](#line_item-object-schema) object for event fields | @@ -139,7 +139,7 @@ When the shopper clicks a button to remove a product from the cart, the followin | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `product_value` | number | Item price multiplied by quantity. Product default price or, if applicable, the sale price configured in the admin panel, before discounts and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `lineItems.physicalItems.listPrice` or <br /> `lineItems.digitalItems.listPrice`| | `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#gset-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#gset-a-checkout) <br /> `data.cart.currency.code` | | `line_items[]` | array of `line_item` objects | Items removed from the cart. | See [line_item](#line_item-object-schema) object for event fields | ### Start checkout @@ -151,7 +151,7 @@ When the shopper clicks on the button to initiate a checkout process, the follow | `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `cartAmount` | | `channel_id` | string | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | | `coupon_codes[]` | array of strings | Coupon codes applied to the cart. BigCommerce supports only one coupon code per checkout. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `coupons.code` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. BigCommerce tracks currency for a cart and not for each line item within the cart. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. BigCommerce tracks currency for a cart and not for each line item within the cart. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `currency.code` | | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `line_items[]` | array of `line_item` objects | Items that were checked out. | See [line_item](#line_item-object-schema) object for event fields | @@ -163,7 +163,7 @@ Each time the shopper adds shipping information, the following fields appear in |:---|:---|:---|:---| | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout) <br /> `data.cart.cart_amount_inc_tax` | | `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per checkout. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.coupons.code` | | `shipping_method` | string | Shipping method, for example, UPS or First Class Mail. | [Get order shipments](/docs/rest-management/orders/order-shipments#get-order-shipments) <br /> `shipping_method` | @@ -177,7 +177,7 @@ Each time the shopper adds payment information, the following fields appear in t |:---|:---|:---|:---| | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout) <br /> `data.cart.cart_amount_inc_tax` | | `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per checkout. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.coupons.code` | | `payment_type` | string | Payment type, for example, check or credit card. | [Get an order](/docs/rest-management/orders#get-an-order) <br /> `payment_method` | @@ -192,7 +192,7 @@ When the shopper clicks a button to finalize a purchase, the following fields ap | `cart_value` | number | Final value of cart after taxes, discounts, and coupons are applied. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout) <br /> `data.cart.cart_amount_inc_tax` | | `channel_id` | integer | The BigCommerce channel ID. Channel ID of the channel where checkout is taking place. | [Get all channels](/docs/rest-management/channels#get-all-channels) <br /> `data.id` | | `coupon_codes[]` | array of strings | Coupon codes applied to the purchase. BigCommerce supports only one coupon code per order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.coupons.code` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) of the order. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `event_id` | string | Unique ID for each event instance. | Unique event ID generated by BigCommerce. | | `line_items[]` | array of `line_item` objects | Items that were purchased. | See [line_item](#line_item-object-schema) object for event fields | | `order_id` | integer | Unique order ID generated by BigCommerce. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.orderId` | @@ -208,7 +208,7 @@ The `line_item` object has many common fields for browser events, including the | `base_price` | number | Price of product. Default price in the control panel. The price should include or exclude tax, based on the store settings. | [Get a product](/docs/rest-catalog/products#get-a-product) <br /> `data.price` | | `brand_name` | string | Brand name. | [Get a product](/docs/rest-catalog/products#get-a-product) <br /> `data.brand_name` | | `category_names[]` | array of strings | Category names. | [Get a product](/docs/rest-catalog/products#get-a-product) <br /> `data.categories[]` | -| `currency` | string | [ISO-4217 currency code](https://en.wikipedia.org/wiki/ISO_4217) for the transaction. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | +| `currency` | string | [ISO-4217 currency code](https://www.iso.org/iso-4217-currency-codes.html) for the transaction. | [Get a checkout](/docs/rest-management/checkouts#get-a-checkout) <br /> `data.cart.currency.code` | | `discount` | number | Discount applied to the purchase. | [Get a checkout](/docs/rest-storefront/checkouts#get-a-checkout) <br /> `data.cart.discountAmount` | | `gift_certificate_id` | string | ID of gift certificate. | [Get a cart](/docs/rest-storefront/carts#get-a-cart) <br /> `lineItems.giftCertificates.id` | | `gift_certificate_name` | string | Name of gift certificate that appears in the control panel. | [Get a Cart](/docs/rest-storefront/carts#get-a-cart) <br /> `lineItems.giftCertificates.name` | @@ -458,6 +458,6 @@ Accept: application/json ## Resources -- [Scripts API article](/docs/integrations/scripts) -- [Scripts API reference](/docs/rest-management/scripts#create-a-script) -- [Scripts Manager support article](https://support.bigcommerce.com/s/article/Using-Script-Manager) +- [Scripts overview](/docs/integrations/scripts) +- [REST Management API: Scripts reference](/docs/rest-management/scripts) +- [Using Script Manager (Help Center)](https://support.bigcommerce.com/s/article/Using-Script-Manager) diff --git a/docs/api-docs/partner/pos/foundation-guide.mdx b/docs/integrations/point-of-sale.mdx similarity index 100% rename from docs/api-docs/partner/pos/foundation-guide.mdx rename to docs/integrations/point-of-sale.mdx diff --git a/docs/api-docs/storefront/scripts-overview.mdx b/docs/integrations/scripts.mdx similarity index 100% rename from docs/api-docs/storefront/scripts-overview.mdx rename to docs/integrations/scripts.mdx diff --git a/docs/api-docs/store-management/shipping/shipping-provider-api.mdx b/docs/integrations/shipping.mdx similarity index 100% rename from docs/api-docs/store-management/shipping/shipping-provider-api.mdx rename to docs/integrations/shipping.mdx diff --git a/docs/api-docs/staging/staging-pro-overview.mdx b/docs/integrations/staging-pro.mdx similarity index 100% rename from docs/api-docs/staging/staging-pro-overview.mdx rename to docs/integrations/staging-pro.mdx diff --git a/docs/api-docs/partner/subscriptions/foundation-guide.mdx b/docs/integrations/subscriptions.mdx similarity index 100% rename from docs/api-docs/partner/subscriptions/foundation-guide.mdx rename to docs/integrations/subscriptions.mdx diff --git a/docs/api-docs/provider-apis/tax/overview.mdx b/docs/integrations/tax.mdx similarity index 100% rename from docs/api-docs/provider-apis/tax/overview.mdx rename to docs/integrations/tax.mdx diff --git a/docs/api-docs/channels/channel-webhooks.mdx b/docs/integrations/webhooks/events/channels.mdx similarity index 100% rename from docs/api-docs/channels/channel-webhooks.mdx rename to docs/integrations/webhooks/events/channels.mdx diff --git a/docs/api-docs/webhooks/webhook-events.mdx b/docs/integrations/webhooks/events/index.mdx similarity index 100% rename from docs/api-docs/webhooks/webhook-events.mdx rename to docs/integrations/webhooks/events/index.mdx diff --git a/docs/integrations/webhooks/events/inventory-location.mdx b/docs/integrations/webhooks/events/inventory-location.mdx new file mode 100644 index 000000000..9ff32e94b --- /dev/null +++ b/docs/integrations/webhooks/events/inventory-location.mdx @@ -0,0 +1,111 @@ +# Inventory and Location Webhooks + +_Buy Online, Pick up in Store_ allows merchants to distribute inventory among locations. Developers might need notification when inventories or locations change. This notification helps them perform downstream actions required to manage inventory at multiple locations. +To this end, developers can subscribe to webhook events for changes to inventory or location. <br /><br /> +This page is a reference for inventory and location webhooks for _Buy Online, Pick up in Store_. This article assumes that you're familiar with webhooks. +For a general introduction to webhooks, see [Webhooks Overview](/docs/integrations/webhooks). + +<Callout type="info"> + Storefront channels share the inventory for a product or variant. A product or variant's inventory settings apply to _all_ storefront channels. The `*` in the scope indicates that you subscribe to inventory events across _all_ storefront channels. An inventory change fires a _single_ webhook event. + + You can track inventory changes at _any_ location. A product or variant's inventory levels and settings apply to a specific location. When you update inventory, the callback returns the location for the inventory. + +</Callout> + +## Creating a webhook + +To create a webhook, send a request to the [Create a webhook](/docs/webhooks/webhooks/manage-webhooks-bulk#create-a-webhook) endpoint. Follow the process described in the [Webhooks Overview](/docs/integrations/webhooks#creating-a-webhook). + +The following example creates a webhook that subscribes to changes in inventory settings. + +```http filename="Example request: Create a webhook" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/hooks +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "scope": "store/channel/*/inventory/product/settings_changed", // The `*` indicates that you subscribe to events across all storefront channels + "destination": "https://placeholder.ngrok.io/webhooks", // replace placeholder.ngrok.io with your HTTPS tunnel URL + "is_active": true +} +``` + +<Callout type="info"> + * The `destination` URL must be served on port **443**; custom ports are not currently supported. + * It can take up to one minute for a newly created webhook to work. +</Callout> + +For information on creating a webhook, consult the [creating a webhook section of the Webhooks Overview](/docs/integrations/webhooks#creating-a-webhook). + +## Callback structure + +For webhook callback structure reference, see [Webhook Events](/docs/integrations/webhooks/events#callback-structure). + +## Inventory + +The following inventory webhook events fire in response to changes in inventory for a product or variant. <br /><br /> +You can track inventory changes for products or variants. The `*` in the scope indicates that you subscribe to inventory events across _all_ storefront channels. An inventory change fires a _single_ webhook event. + +Storefront channels share the inventory for a product or variant. For order-related events, the webhook fires a single event in response to a change from _any_ storefront channel. For example, placing an order from any channel can trigger one webhook event. + +A store's [inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings) affect _when_ stock levels change through an order. For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). Settings for a channel apply when inventory changes through an order in a channel. + +| Name / Scope | Description | Corresponding Endpoint | +|:-------------|:------------|:-----------------------| +| `store/channel/*/inventory/product/stock_changed` | Fires when a product or variant stock level changes at a location. For example, stock levels can change by manual merchant adjustments in the control panel or API. | [Absolute adjustment](/docs/rest-management/inventory/adjustments#absolute-adjustment) | +| `store/channel/*/inventory/product/low_stock_reached` | Fires when a product or variant stock level is lower or equal to the low-stock value at a location. Stock levels must change through an order. | not applicable | +| `store/channel/*/inventory/product/out_of_stock_reached` | Fires when a product or variant stock level is zero at a location. Stock levels must change through an order. | not applicable | +| `store/channel/*/inventory/product/settings_changed` | Fires when a product's safety stock, `is_in_stock` flag, or warning level changes at a location.<br /><br />A product or variant's inventory settings apply to all storefront channels. Changing a product or variant's inventory settings triggers one webhook event. | [Update inventory settings for a location](/docs/rest-management/inventory/items#update-inventory-settings-for-a-location) | + +Inventory payload objects take the form that follows: + +```json filename="Example stock changed payload object" showLineNumbers copy +{ + "producer": "stores/{store_hash}", + "hash": "996ea203c939d05ca667a515ef2f029976d6df80", + "created_at": 1682624640, + "store_id": "1234567890", + "scope": "store/channel/*/inventory/product/stock_changed", + "data": { + "variant_id": 127, + "product_id": 113, + "location_id": 2 + } +} +``` + +The channel does not have to be active or visible for you to track changes. + +## Locations + +The following location webhook events fire in response to actions that affect a location. You can track changes for _any_ location. + +| Name / Scope | Description | Corresponding Endpoint | +|:-------------|:------------|:-----------------------| +| `store/inventory/location/created` | Fires when a location is created. | [Create locations](/docs/rest-management/locations#create-locations) | +| `store/inventory/location/updated` | Fires when a location is updated, including enabling or disabling a location. | [Update locations](/docs/rest-management/locations#update-locations) | + +Location payload objects take the form that follows: + +```json filename="Example location created payload object" showLineNumbers copy +{ + "producer": "stores/{store_hash}", + "hash": "f23133c2b4caa5a8763b678fed2e3b643348599d", + "created_at": 1682627509, + "store_id": "1234567890", + "scope": "store/inventory/location/created", + "data": { + "location_id": 2 + } +} +``` + + +## Resources + +* [Webhooks Overview](/docs/integrations/webhooks) +* [Webhooks Tutorial](/docs/integrations/webhooks/tutorial) +* [Webhooks Events](/docs/integrations/webhooks/events) +* [Channel Webhook Events](/docs/integrations/webhooks/events/channels) +* [Webhooks Reference](/docs/webhooks/webhooks) diff --git a/docs/api-docs/webhooks/about-webhooks.mdx b/docs/integrations/webhooks/overview.mdx similarity index 100% rename from docs/api-docs/webhooks/about-webhooks.mdx rename to docs/integrations/webhooks/overview.mdx diff --git a/docs/api-docs/webhooks/setting-up-webhooks.mdx b/docs/integrations/webhooks/tutorial.mdx similarity index 100% rename from docs/api-docs/webhooks/setting-up-webhooks.mdx rename to docs/integrations/webhooks/tutorial.mdx diff --git a/docs/api-docs/getting-started/filtering.mdx b/docs/start/about/common-query-params.mdx similarity index 100% rename from docs/api-docs/getting-started/filtering.mdx rename to docs/start/about/common-query-params.mdx diff --git a/docs/api-docs/getting-started/about-our-api.mdx b/docs/start/about/index.mdx similarity index 100% rename from docs/api-docs/getting-started/about-our-api.mdx rename to docs/start/about/index.mdx diff --git a/docs/api-docs/partner/create-a-sandbox.mdx b/docs/start/about/sandboxes.mdx similarity index 100% rename from docs/api-docs/partner/create-a-sandbox.mdx rename to docs/start/about/sandboxes.mdx diff --git a/docs/api-docs/getting-started/api-status-codes.mdx b/docs/start/about/status-codes.mdx similarity index 100% rename from docs/api-docs/getting-started/api-status-codes.mdx rename to docs/start/about/status-codes.mdx diff --git a/docs/api-docs/partner/support.mdx b/docs/start/about/support.mdx similarity index 100% rename from docs/api-docs/partner/support.mdx rename to docs/start/about/support.mdx diff --git a/docs/api-docs/getting-started/rest-api-authentication.mdx b/docs/start/authentication/api-accounts.mdx similarity index 100% rename from docs/api-docs/getting-started/rest-api-authentication.mdx rename to docs/start/authentication/api-accounts.mdx diff --git a/docs/api-docs/customers/current-customer-api.mdx b/docs/start/authentication/current-customer.mdx similarity index 98% rename from docs/api-docs/customers/current-customer-api.mdx rename to docs/start/authentication/current-customer.mdx index 15f96b4a5..575eeb686 100644 --- a/docs/api-docs/customers/current-customer-api.mdx +++ b/docs/start/authentication/current-customer.mdx @@ -1,79 +1,79 @@ -# Current Customer API - -## Securely identifying signed-in customers - -Suppose your application interacts dynamically with a storefront and conveys specific information to a particular signed-in customer. You must confirm that customer's identity within the insecure environment of the user's browser before revealing any sensitive information. - - -To address this need, BigCommerce provides a Current Customer endpoint that your app can access on the storefront using JavaScript. This endpoint allows a remote application, such as a third-party subscription billing app, to request a JSON web token, or _JWT_, with identifying customer details. The response is encrypted with your [app-level API account's client secret](/docs/start/authentication/api-accounts#app-level-api-accounts). - - - -<Callout type="info"> -#### API account notes -- This endpoint requires **app API account** credentials. For more information about generating accounts, consult the [Guide to API Accounts](/docs/start/authentication/api-accounts#app-level-api-accounts). -- The app you create doesn't need to be installed or published on a store, and you don't need to generate access tokens. All you need are the client ID and client secret. See the section on [client ID-based authentication](/docs/start/authentication#client-id) in the Authentication tutorial. -</Callout> - -## Request - -To test this endpoint, save this [Current Customer API example request](/docs/start/authentication#current-customer-api-example-request) JavaScript snippet in the storefront's **Script Manager**, located in the store control panel. Include your app API account's client ID as the value of the `app_client_id` query parameter. - -For more about adding scripts with the UI, see our support article on [Using Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager). - - -## Response - -This API call returns a JWT, sent as a plain-text string. See the [example response](/docs/start/authentication#current-customer-api-example-request) on the tab next to the preceding example request. - -Decode the JWT using the client secret from the same app API account as the client ID you sent with the request. We recommend that your browser script send this JWT in a POST request to your server or a Function-as-a-Service (FaaS) that can work securely with your client secret. After your implementation decodes and validates the JWT, you can trust the payload as a source of truth about the signed-in customer's identity. You can now use the payload's customer information to make other API calls and display confidential data to the shopper. - -The following code block is an example payload from a decoded Current Customer JWT: - -```json filename="Example payload: Current Customer" showLineNumbers -{ - "customer": { - "id": 4927, - "email": "john.doe@gmail.com", - "group_id": "6" - }, - "iss": "bc/apps", - "sub": "abc123", - "iat": 1480831863, - "exp": 1480832763, - "version": 1, - "aud": "6sv16tfx3j5gsopm42ss5dd67g2srvq", - "application_id": "6sv16tasdgr2b5hs5dd67g2srvq", - "store_hash": "abc123", - "operation": "current_customer" -} -``` - -<Callout type="info"> -#### IAT and EXP claims -Current customer tokens are valid for 15 minutes. -</Callout> - -To view the data during development, you can use the JWT decoding tool at [jwt.io](https://jwt.io/). In production, your implementation should handle decoding the JWT. There are robust packages for most languages that can handle this for you. You can see end-to-end examples that display a customer's recently purchased products in the [Ruby](https://github.com/bigcommerce/hello-world-app-ruby-sinatra/) and [PHP](https://github.com/bigcommerce/hello-world-app-php-silex/) sample apps. - -When a shopper is browsing as a guest, the endpoint returns a `404 Not Found` HTTP status code and an error message. - -On Stencil storefronts, you can check whether any customer is signed in before running the request by wrapping your request in an `{{#if customer}}` [Handlebars Helper](/docs/storefront/stencil/themes/context/handlebars-reference#if). - -## Resources - -### Reference - -* [Get current customer](/docs/rest-authentication/current-customer#get-current-customer) endpoint -* [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts) -* [Authentication and Example Requests](/docs/start/authentication) -* [#if Handlebars Helpers](/docs/storefront/stencil/themes/context/handlebars-reference#if) -* [JWT sandbox (jwt.io)](https://jwt.io/) - -### Sample apps -* [Ruby (GitHub)](https://github.com/bigcommerce/hello-world-app-ruby-sinatra/) -* [PHP (GitHub)](https://github.com/bigcommerce/hello-world-app-php-silex/) - - - - +# Current Customer API + +## Securely identifying signed-in customers + +Suppose your application interacts dynamically with a storefront and conveys specific information to a particular signed-in customer. You must confirm that customer's identity within the insecure environment of the user's browser before revealing any sensitive information. + + +To address this need, BigCommerce provides a Current Customer endpoint that your app can access on the storefront using JavaScript. This endpoint allows a remote application, such as a third-party subscription billing app, to request a JSON web token, or _JWT_, with identifying customer details. The response is encrypted with your [app-level API account's client secret](/docs/start/authentication/api-accounts#app-level-api-accounts). + + + +<Callout type="info"> +#### API account notes +- This endpoint requires **app API account** credentials. For more information about generating accounts, consult the [Guide to API Accounts](/docs/start/authentication/api-accounts#app-level-api-accounts). +- The app you create doesn't need to be installed or published on a store, and you don't need to generate access tokens. All you need are the client ID and client secret. See the section on [client ID-based authentication](/docs/start/authentication#client-id) in the Authentication tutorial. +</Callout> + +## Request + +To test this endpoint, save this [Current Customer API example request](/docs/start/authentication#current-customer-api-example-request) JavaScript snippet in the storefront's **Script Manager**, located in the store control panel. Include your app API account's client ID as the value of the `app_client_id` query parameter. + +For more about adding scripts with the UI, see our support article on [Using Script Manager](https://support.bigcommerce.com/s/article/Using-Script-Manager). + + +## Response + +This API call returns a JWT, sent as a plain-text string. See the [example response](/docs/start/authentication#current-customer-api-example-request) on the tab next to the preceding example request. + +Decode the JWT using the client secret from the same app API account as the client ID you sent with the request. We recommend that your browser script send this JWT in a POST request to your server or a Function-as-a-Service (FaaS) that can work securely with your client secret. After your implementation decodes and validates the JWT, you can trust the payload as a source of truth about the signed-in customer's identity. You can now use the payload's customer information to make other API calls and display confidential data to the shopper. + +The following code block is an example payload from a decoded Current Customer JWT: + +```json filename="Example payload: Current Customer" showLineNumbers +{ + "customer": { + "id": 4927, + "email": "john.doe@gmail.com", + "group_id": "6" + }, + "iss": "bc/apps", + "sub": "abc123", + "iat": 1480831863, + "exp": 1480832763, + "version": 1, + "aud": "6sv16tfx3j5gsopm42ss5dd67g2srvq", + "application_id": "6sv16tasdgr2b5hs5dd67g2srvq", + "store_hash": "abc123", + "operation": "current_customer" +} +``` + +<Callout type="info"> +#### IAT and EXP claims +Current customer tokens are valid for 15 minutes. +</Callout> + +To view the data during development, you can use the JWT decoding tool at [jwt.io](https://jwt.io/). In production, your implementation should handle decoding the JWT. There are robust packages for most languages that can handle this for you. You can see end-to-end examples that display a customer's recently purchased products in the [Ruby](https://github.com/bigcommerce/hello-world-app-ruby-sinatra/) and [PHP](https://github.com/bigcommerce/hello-world-app-php-silex/) sample apps. + +When a shopper is browsing as a guest, the endpoint returns a `404 Not Found` HTTP status code and an error message. + +On Stencil storefronts, you can check whether any customer is signed in before running the request by wrapping your request in an `{{#if customer}}` [Handlebars Helper](/docs/storefront/stencil/themes/context/handlebars-reference#if). + +## Resources + +### Reference + +* [Get current customer](/docs/rest-authentication/current-customer#get-current-customer) endpoint +* [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts) +* [Authentication and Example Requests](/docs/start/authentication) +* [#if Handlebars Helpers](/docs/storefront/stencil/themes/context/handlebars-reference#if) +* [JWT sandbox (jwt.io)](https://jwt.io/) + +### Sample apps +* [Ruby (GitHub)](https://github.com/bigcommerce/hello-world-app-ruby-sinatra/) +* [PHP (GitHub)](https://github.com/bigcommerce/hello-world-app-php-silex/) + + + + diff --git a/docs/api-docs/customers/customer-login-api.mdx b/docs/start/authentication/customer-login.mdx similarity index 97% rename from docs/api-docs/customers/customer-login-api.mdx rename to docs/start/authentication/customer-login.mdx index 061f1d02f..2a7ee814a 100644 --- a/docs/api-docs/customers/customer-login-api.mdx +++ b/docs/start/authentication/customer-login.mdx @@ -67,7 +67,7 @@ To sign a customer in to their storefront account using the Customer Login API, The `{token}` parameter is the JWT containing the payload data signed by your app’s OAuth client secret. -We recommend writing a script to generate a login token since JTW’s `iat` (issued at) claim is only valid for 30 seconds. BigCommerce supplies helper methods for generating login tokens in our [API Client Libraries](/tools-resources). +We recommend writing a script to generate a login token since the JWT’s `iat` (issued at) claim is only valid for 30 seconds. BigCommerce supplies helper methods for generating login tokens in our [API Client Libraries](/tools-resources). The beginning of this tutorial focuses on manually creating a token using the debugger tool at [JWT.io](https://jwt.io/). Then, we will explore how to use a JavaScript function to programmatically generate an access point URL. diff --git a/docs/api-docs/getting-started/authentication.mdx b/docs/start/authentication/index.mdx similarity index 100% rename from docs/api-docs/getting-started/authentication.mdx rename to docs/start/authentication/index.mdx diff --git a/docs/api-docs/customers/passwordless-login.mdx b/docs/start/authentication/passwordless-login.mdx similarity index 97% rename from docs/api-docs/customers/passwordless-login.mdx rename to docs/start/authentication/passwordless-login.mdx index 1ff2e054e..ef27e6411 100644 --- a/docs/api-docs/customers/passwordless-login.mdx +++ b/docs/start/authentication/passwordless-login.mdx @@ -38,7 +38,7 @@ If the request body does not include a `redirect_url`, customers will be redirec Upon receiving a successful `POST` request, BigCommerce will send a response that contains: * `expiry`: The time in seconds during which the login link is valid. -* `sent_email`: A value of `sign_in` indicates BigCommerce sent the login link to the customer via the email provided. A value of `password_reset` means the customer requested a sign-in link, however BigCommerce sent a reset password email instead. BigCommerce sends the email immediately upon recieving the `POST` request. +* `sent_email`: A value of `sign_in` indicates BigCommerce sent the login link to the customer via the email provided. A value of `password_reset` means the customer requested a sign-in link, however BigCommerce sent a reset password email instead. BigCommerce sends the email immediately upon receiving the `POST` request. ```json filename="Example" showLineNumbers { diff --git a/docs/api-docs/getting-started/best-practices.mdx b/docs/start/best-practices/index.mdx similarity index 98% rename from docs/api-docs/getting-started/best-practices.mdx rename to docs/start/best-practices/index.mdx index a04dcf7d9..3bec8b518 100644 --- a/docs/api-docs/getting-started/best-practices.mdx +++ b/docs/start/best-practices/index.mdx @@ -89,7 +89,7 @@ X-Rate-Limit-Requests-Left: 35 If your implementation's request to the API triggers a [429: Too Many Requests](/docs/start/about/status-codes#4xx-client-error) response, it is encountering rate limits. Responses contain the `X-Rate-Limit-Time-Reset-Ms` header, which specifies the time in milliseconds that your client must wait before its quota refreshes. Retry the request after this time has elapsed. -For more about rate limit headers and how to calculate the timing of your requests to reduce the risk of encoutering rate limits, see [About Our API](/docs/start/about#bigcommerce-specific-response-headers). +For more about rate limit headers and how to calculate the timing of your requests to reduce the risk of encountering rate limits, see [About Our API](/docs/start/about#bigcommerce-specific-response-headers). ### Example of 429 status code diff --git a/docs/api-docs/getting-started/integration-design.mdx b/docs/start/best-practices/integration-design.mdx similarity index 99% rename from docs/api-docs/getting-started/integration-design.mdx rename to docs/start/best-practices/integration-design.mdx index e46840812..684edf3d2 100644 --- a/docs/api-docs/getting-started/integration-design.mdx +++ b/docs/start/best-practices/integration-design.mdx @@ -16,7 +16,7 @@ When interacting with a resource on a store, consider how many calls it takes to The same principle applies to bulk endpoints. The base number of resources returned from a bulk request is 50. If you need to retrieve 5,000 products, the default response pagination limit requires you to make 100 API calls to the bulk endpoint. Instead, you can use query parameters to set the response limit to 250 and request the same information in 20 calls. -The same efficency principle extends to creating and updating resources. +The same efficiency principle extends to creating and updating resources. In addition, consider using conditional logic to avoid making API calls when they are not needed. For example, when the resource hasn't changed or the app conditions are such that more API data is not helpful at that time, don't request more data. You can use [Webhooks](/docs/webhooks) to trigger requests as they become relevant, rather than polling the API. diff --git a/docs/api-docs/getting-started/deprecations-and-sunsets.mdx b/docs/start/best-practices/sunsets.mdx similarity index 100% rename from docs/api-docs/getting-started/deprecations-and-sunsets.mdx rename to docs/start/best-practices/sunsets.mdx diff --git a/docs/api-docs/partner/marketing-api-overview.mdx b/docs/start/draft/marketing-api-overview.mdx similarity index 100% rename from docs/api-docs/partner/marketing-api-overview.mdx rename to docs/start/draft/marketing-api-overview.mdx diff --git a/docs/start/introduction-to-bigcommerce.mdx b/docs/start/intro-to-bigcommerce.mdx similarity index 100% rename from docs/start/introduction-to-bigcommerce.mdx rename to docs/start/intro-to-bigcommerce.mdx diff --git a/docs/api-docs/partner/becoming-a-partner.mdx b/docs/start/partner.mdx similarity index 100% rename from docs/api-docs/partner/becoming-a-partner.mdx rename to docs/start/partner.mdx diff --git a/docs/api-docs/management-apis/contextual-filters.mdx b/docs/store-operations/catalog/contextual-filters.mdx similarity index 100% rename from docs/api-docs/management-apis/contextual-filters.mdx rename to docs/store-operations/catalog/contextual-filters.mdx diff --git a/docs/store-operations/catalog/graphql-admin/product-attributes.mdx b/docs/store-operations/catalog/graphql-admin/product-attributes.mdx new file mode 100644 index 000000000..5930af82c --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-attributes.mdx @@ -0,0 +1,768 @@ +# Product Attributes + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query product attributes, for example, storefront details, pre-order messages, and whether a product is featured. + +Perform the following: +- Set a product's [pre-order settings](#pre-order-settings) for the store or a locale within a channel. Pre-order messages communicate info about products that aren't yet available for purchase. +- Set a product's [storefront details](#storefront-details) for the store or a locale within a channel. Details include product warranty, availability, and search keywords. +- Set a product as [featured](#featured-products) for the store or a channel. Channel values apply to all locales within the channel. + +Attributes for the locale or channel override global values. If you remove an override, the product attribute defaults to its global store value. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Pre-order settings + +Set a product's pre-order settings for a store or a locale within a storefront channel. You can set the pre-order message that shoppers see for products that aren't yet available for purchase. + +### Set pre-order settings at the global level + +The following example sets a product's pre-order settings for a store, from which channels inherit by default. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set pre-order settings at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductPreOrderSettingsInput!) { + product { + setProductPreOrderSettings (input: $input) { + product { + preOrderSettings { + message + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "message": "Product will be released soon" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set pre-order settings at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductPreOrderSettings": { + "product": { + "preOrderSettings": { + "message": "Product will be released soon" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set pre-order settings for a locale + +The following example sets a product's pre-order settings for the locale within a storefront channel. These settings override global store information. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set pre-order settings for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductPreOrderSettingsInput!) { + product { + setProductPreOrderSettings (input: $input) { + product { + overridesForLocale (localeContext: {channelId: "bc/store/channel/2", locale: "fr"}) { + preOrderSettings { + message + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "locale": "fr", + "channelId": "bc/store/channel/2" + }, + "data": { + "message": "Le produit sortira dans un mois" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set pre-order settings for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductPreOrderSettings": { + "product": { + "overridesForLocale": { + "preOrderSettings": { + "message": "Le produit sortira dans un mois" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +### Remove pre-order settings for a locale + +The following example removes the overrides for a product's pre-order settings. This mutation removes the overrides for the locale within the storefront channel, and the pre-order setting defaults to its global store value. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove pre-order settings for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductPreOrderSettingsOverridesInput!) { + product { + removeProductPreOrderSettingsOverrides (input: $input) { + product { + overridesForLocale (localeContext: {channelId: "bc/store/channel/2", locale: "fr"}) { + preOrderSettings { + message + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "locale": "fr", + "channelId": "bc/store/channel/2" + }, + "overridesToRemove": ["PRODUCT_PRE_ORDER_MESSAGE"] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove pre-order settings for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductPreOrderSettingsOverrides": { + "product": { + "overridesForLocale": { + "preOrderSettings": null + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Query pre-order settings + +The following example retrieves a product's pre-order settings. You can retrieve global information for the store and overrides for a locale within a storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get pre-order settings for a product" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + preOrderSettings { + message + } + overridesForLocale (localeContext: {locale: "fr", channelId: "bc/store/channel/2"}) { + preOrderSettings { + message + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Get pre-order settings for a product" showLineNumbers copy + { + "data": { + "store": { + "product": { + "preOrderSettings": { + "message": "Product will be released soon" + }, + "overridesForLocale": { + "preOrderSettings": { + "message": "Le produit sortira dans un mois" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +## Storefront details + +Set a product's storefront details for a store or a locale within a storefront channel. Set details like product warranty, availability, and search keywords. + +### Set storefront details at the global level + +The following example sets a product's storefront details for a store, from which channels inherit by default. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set storefront details at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductStorefrontDetailsInput!) { + product { + setProductStorefrontDetails (input: $input) { + product { + storefrontDetails { + warranty + availabilityDescription + searchKeywords + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "warranty": "1 year warranty", + "availabilityDescription": "Available in a month", + "searchKeywords": "Best selling" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set storefront details at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductStorefrontDetails": { + "product": { + "storefrontDetails": { + "warranty": "1 year warranty", + "availabilityDescription": "Available in a month", + "searchKeywords": "Best selling" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set storefront details for a locale + +The following example sets a product's storefront details for the locale within a storefront channel. These details override global store information. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set storefront details for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductStorefrontDetailsInput!) { + product { + setProductStorefrontDetails (input: $input) { + product { + overridesForLocale (localeContext: {locale: "fr", channelId: "bc/store/channel/2"}) { + storefrontDetails { + warranty + availabilityDescription + searchKeywords + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "locale": "fr", + "channelId": "bc/store/channel/2" + }, + "data": { + "warranty": "Garantie un an", + "availabilityDescription": "Disponible dans un mois", + "searchKeywords": "meilleure vente" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set storefront details for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductStorefrontDetails": { + "product": { + "overridesForLocale": { + "storefrontDetails": { + "warranty": "Garantie un an", + "availabilityDescription": "Disponible dans un mois", + "searchKeywords": "meilleure vente" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove storefront details for a locale + +The following example removes the overrides for a product's storefront details. This mutation removes the overrides for the locale within the storefront channel, and the storefront details default to their global store values. + +Omitting the `overridesToRemove` field from the input removes _all_ overrides for storefront details from the locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove storefront details for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductStorefrontDetailsOverridesInput!) { + product { + removeProductStorefrontDetailsOverrides (input: $input) { + product { + overridesForLocale (localeContext: {channelId: "bc/store/channel/2", locale: "fr"}) { + storefrontDetails { + warranty + availabilityDescription + searchKeywords + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "locale": "fr", + "channelId": "bc/store/channel/2" + }, + "overridesToRemove": ["PRODUCT_AVAILABILITY_DESCRIPTION_FIELD", "PRODUCT_SEARCH_KEYWORDS", "PRODUCT_WARRANTY"] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove storefront details for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductStorefrontDetailsOverrides": { + "product": { + "overridesForLocale": { + "storefrontDetails": { + "warranty": null, + "availabilityDescription": null, + "searchKeywords": null + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Query storefront details + +The following example retrieves a product's storefront details. You can retrieve global information for the store and overrides for a locale within a storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Get storefront details for a product" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + storefrontDetails { + warranty + availabilityDescription + searchKeywords + } + overridesForLocale (localeContext: {locale: "fr", channelId: "bc/store/channel/2"}) { + storefrontDetails { + warranty + availabilityDescription + searchKeywords + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Get storefront details for a product" showLineNumbers copy + { + "data": { + "store": { + "product": { + "storefrontDetails": { + "warranty": "1 year warranty", + "availabilityDescription": "Available in a month", + "searchKeywords": "Best selling" + }, + "overridesForLocale": { + "storefrontDetails": { + "warranty": "Garantie un an", + "availabilityDescription": "Disponible dans un mois", + "searchKeywords": "meilleure vente" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +## Featured products + +Set whether to feature a product for a store or a storefront channel. Channel values apply to all locales within the channel. + +### Set featured flag at the global level + +The following example sets whether to feature a product for a store, from which channels inherit by default. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set featured flag at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductIsFeaturedInput!) { + product { + setProductIsFeatured (input: $input) { + product { + isFeatured + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "isFeatured": true + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set featured flag at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductIsFeatured": { + "product": { + "isFeatured": true + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set featured flag for a channel + +The following example sets whether to feature a product in a storefront channel. These override global store information. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set featured flag for a channel" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductIsFeaturedInput!) { + product { + setProductIsFeatured (input: $input) { + product { + overridesForChannel (channelId: "bc/store/channel/2") { + isFeatured + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "channelId": "bc/store/channel/2", + "productId": "bc/store/product/111", + "data": { + "isFeatured": false + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set featured flag for a channel" showLineNumbers copy + { + "data": { + "product": { + "setProductIsFeatured": { + "product": { + "overridesForChannel": { + "isFeatured": false + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove featured flag for a channel + +The following example removes the overrides for whether a product is featured. This mutation removes the override from the storefront channel, and the featured flag defaults to its global store value. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove featured flag for a channel" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductIsFeaturedOverrideInput!) { + product { + removeProductIsFeaturedOverride (input: $input) { + product { + overridesForChannel (channelId: "bc/store/channel/2") { + isFeatured + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "channelId": "bc/store/channel/2", + "productId": "bc/store/product/111" + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove featured flag for a channel" showLineNumbers copy + { + "data": { + "product": { + "removeProductIsFeaturedOverride": { + "product": { + "overridesForChannel": { + "isFeatured": null + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Query featured flag + +The following example retrieves whether a product is featured. You can retrieve global information for the store and overrides for a storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Get featured flag for a product" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + isFeatured + overridesForChannel (channelId: "bc/store/channel/2") { + isFeatured + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Get featured flag for a product" showLineNumbers copy + { + "data": { + "store": { + "product": { + "isFeatured": true, + "overridesForChannel": { + "isFeatured": false + } + } + } + } + } + ``` + + </Tab> +</Tabs> \ No newline at end of file diff --git a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx new file mode 100644 index 000000000..f72c86683 --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx @@ -0,0 +1,317 @@ +# Basic Product Information + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query basic product information, for example, product name and description. + +You can perform the following: +- [Set global basic product information](#set-basic-product-information-at-the-global-level) for the catalog. Channels inherit these by default. +- [Create overrides for a channel and channel locale](#set-basic-product-information-for-a-locale) using the `overridesForLocale` mutation. +- [Remove overrides for a channel and channel locale](#remove-basic-product-information-for-a-locale). A channel then inherits global values. +- [Query basic product information](#query-basic-product-information), those set at the global level and the overrides. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. These ID fields contain global IDs that you can retrieve from REST API endpoints. + +For example, the `productId` field contains the global product ID. Retrieve the global product ID from the response body of the [Get all products](/docs/rest-catalog/products#get-all-products) endpoint. A product with a global ID of `111` has a `productId` of `"bc/store/product/111"`. + +The following table describes the ID fields that you can use in inputs for mutations: + +| Field in Input | Description | Global ID | Example | +| :--- | :--- | :--- | :--- | +| `productId` | Product ID | [Get all products](/docs/rest-catalog/products#get-all-products) | `"bc/store/product/111"` | +| `channelId` | Channel ID | [Get all channels](/docs/rest-management/channels#get-all-channels) | `"bc/store/channel/2"` | +| `optionId` | Variant option ID | [Get all product variant options](/docs/rest-catalog/product-variant-options#get-all-product-variant-options) | `"bc/store/productOption/108"` | +| | Shared variant option ID | Navigate to **Products <br /> >Product Options <br /> >_OptionName_** <br />in the control panel. <br /><br />Retrieve the global ID from the URL. | `"bc/store/sharedProductOption/1"` | +| `modifierId` | Modifier ID | [Get all product modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) | `"bc/store/productModifier/121"` | +| | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | +| `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | +| | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | + +## Set basic product information at the global level + +The following example sets global basic product information for the store, from which channels inherit by default. You can set the product name and description. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set basic product information at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: SetProductBasicInformationInput! + ) { + product { + setProductBasicInformation(input: $input) { + product { + id + basicInformation { + name + description + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "name": "Global Name", + "description": "Global Description" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set basic product information at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductBasicInformation": { + "product": { + "id": "bc/store/product/111", + "basicInformation": { + "name": "Global Name", + "description": "Global Description" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Set basic product information for a locale + +The following example sets basic product information for the specified storefront channel and locale within the channel. These will override global store information. You can set the product name and description. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set basic product information for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: SetProductBasicInformationInput! + ) { + product { + setProductBasicInformation(input: $input) { + product { + id + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "en" }) { + basicInformation { + name + description + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "data": { + "name": "name override", + "description": "description override" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set basic product information for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductBasicInformation": { + "product": { + "id": "bc/store/product/111", + "overridesForLocale": { + "basicInformation": { + "name": "name override", + "description": "Description override" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Remove basic product information for a locale + +The following example removes basic product information for the specified channel and locale. + +Omitting the `overridesToRemove` field from the input removes _all_ overrides for basic product information from the locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove basic product information for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: RemoveProductBasicInformationOverridesInput! + ) { + product { + removeProductBasicInformationOverrides(input: $input) { + product { + id + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + basicInformation { + name + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "overridesToRemove": ["PRODUCT_NAME_FIELD"] + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove basic product information for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductBasicInformationOverrides": { + "product": { + "id": "bc/store/product/111", + "overridesForLocale": { + "basicInformation": { + "name": "name override" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Query basic product information + +The following example retrieves basic product information. You can retrieve global information for the store and overrides for the specified channel and locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get basic product information" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + products (filters: {ids: ["bc/store/product/111"]}) { + edges { + node { + id + basicInformation { + name + description + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + basicInformation { + name + description + } + } + } + } + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example query: Get basic product information" showLineNumbers copy + { + "data": { + "store": { + "products": { + "edges": [ + { + "node": { + "id": "bc/store/product/111", + "basicInformation": { + "name": "Global Name", + "description": "Global Description" + }, + "overridesForLocale": { + "basicInformation": { + "name": "name override", + "description": "Description override" + } + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + - The `id` field contains the product's global ID that you can retrieve from the [Get all products](/docs/rest-catalog/products#get-all-products) endpoint. For example, a product with a global ID of 111 will have an `id` of `"bc/store/product/111"`. + - The `channelId` field contains the channel's global ID that you can retrieve from the [Get all channels](/docs/rest-management/channels#get-all-channels) endpoint. For example, a channel with a global ID of 2 will have a `channelId` of `"bc/store/channel/2"`. +</Callout> diff --git a/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx b/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx new file mode 100644 index 000000000..6f359648e --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx @@ -0,0 +1,1444 @@ +# Product Modifier Options + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query information about a product modifier options, for example, option name and values. + +You can perform the following: +- [Set global modifier option information](#set-product-modifier-options-at-the-global-level) for the catalog. Channels inherit these by default. +- [Create overrides for a channel locale](#set-product-modifier-options-for-a-locale) using the `overridesForLocale` mutation. +- [Remove overrides for a channel locale](#remove-product-modifier-options-for-a-locale) +- [Query modifier option information](#query-modifier-options), those set at the global level and the overrides. + +You can also set and remove information for [shared modifiers](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US#smo). The changes affect all products that you assign to the shared modifier. [Querying modifier options](#query-modifier-options) returns all modifiers, including shared ones. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Set product modifier options + +Set information about a product modifier option for a store or a locale within a storefront channel. + +The following mutations let you set the name and values for existing modifier options. You must first create the modifier option for the product through the control panel or the REST [Create a product modifier](/docs/rest-catalog/product-modifiers#create-a-product-modifier) endpoint. + +<Callout type="info"> + The responses may include all modifier options, including those that are shared. However, to _set_ shared modifier options, use the mutations in [Set shared modifier options](#set-shared-modifier-options). +</Callout> + +### Set product modifier options at the global level + +The following example sets global product modifier information for the store, from which channels inherit by default. You can set the modifier name and values. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product modifier options at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductModifiersInformationInput!) { + product { + setProductModifiersInformation (input: $input) { + product { + id + modifiers { + edges { + node { + id + displayName + isRequired + isShared + ... on CheckboxProductModifier { + checkedByDefault + fieldValue + } + ... on TextFieldProductModifier { + defaultValue + } + ... on MultilineTextFieldProductModifier { + defaultValue + } + ... on NumbersOnlyTextFieldProductModifier { + defaultValueFloat: defaultValue + } + ... on DropdownProductModifier { + values { + id + label + isDefault + } + } + ... on RadioButtonsProductModifier { + values { + id + label + isDefault + } + } + ... on RectangleListProductModifier { + values { + id + label + isDefault + } + } + ... on SwatchProductModifier { + values { + id + label + isDefault + } + } + } + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "modifiers": [ + { + "modifierId": "bc/store/productModifier/121", + "data": { + "rectangleList": { + "displayName": "Holiday Theme", + "values": [ + { + "valueId": "bc/store/productModifierValue/113", + "label": "Birthday" + }, + { + "valueId": "bc/store/productModifierValue/114", + "label": "Christmas" + } + ] + } + } + } + ] + } + } + } + ``` + +</Tab> +<Tab> + + ```json filename="Example mutation: Set product modifier options at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductModifiersInformation": { + "product": { + "id": "bc/store/product/111", + "modifiers": { + "edges": [ + { + "node": { + "id": "bc/store/productModifier/118", + "displayName": "Include Insurance?", + "isRequired": true, + "isShared": false, + "checkedByDefault": true, + "fieldValue": "Yes" + } + }, + { + "node": { + "id": "bc/store/productModifier/119", + "displayName": "Custom Message", + "isRequired": false, + "isShared": false, + "defaultValue": "Enjoy your gift" + } + }, + { + "node": { + "id": "bc/store/productModifier/121", + "displayName": "Holiday Theme", + "isRequired": false, + "isShared": false, + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Birthday", + "isDefault": true + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Christmas", + "isDefault": true + } + ] + } + }, + { + "node": { + "id": "bc/store/productModifier/122", + "displayName": "Hood Color", + "isRequired": true, + "isShared": false, + "values": [ + { + "id": "bc/store/productModifierValue/115", + "label": "Red Hood", + "isDefault": false + }, + { + "id": "bc/store/productModifierValue/116", + "label": "Blue Hood", + "isDefault": false + } + ] + } + }, + { + "node": { + "id": "bc/store/productModifier/123", + "displayName": "Pattern", + "isRequired": false, + "isShared": false, + "values": [ + { + "id": "bc/store/productModifierValue/117", + "label": "Plain", + "isDefault": true + }, + { + "id": "bc/store/productModifierValue/118", + "label": "Checkered", + "isDefault": true + } + ] + } + }, + { + "node": { + "id": "bc/store/productModifier/124", + "displayName": "Fit Type", + "isRequired": false, + "isShared": false, + "values": [ + { + "id": "bc/store/productModifierValue/119", + "label": "Regular fit", + "isDefault": false + }, + { + "id": "bc/store/productModifierValue/120", + "label": "Loose fit", + "isDefault": false + } + ] + } + }, + { + "node": { + "id": "bc/store/productModifier/125", + "displayName": "Optional details", + "isRequired": false, + "isShared": false, + "defaultValue": "" + } + }, + { + "node": { + "id": "bc/store/productModifier/127", + "displayName": "Number of Pockets", + "isRequired": true, + "isShared": false, + "defaultValueFloat": 1 + } + }, + { + "node": { + "id": "bc/store/productModifier/128", + "displayName": "Anniversary Date", + "isRequired": false, + "isShared": false + } + }, + { + "node": { + "id": "bc/store/productModifier/129", + "displayName": "Custom-printed Image", + "isRequired": false, + "isShared": false + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set product modifier options for a locale + +The following example sets product modifier option information for the locale within the specified storefront channel. These will override global store information. You can set the modifier option name and values. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product modifier options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductModifiersInformationInput!) { + product { + setProductModifiersInformation (input: $input) { + product { + id + modifiers { + edges { + node { + id + displayName + ... on CheckboxProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + fieldValue + } + } + ... on TextFieldProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + defaultValue + } + } + ... on MultilineTextFieldProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + defaultValue + } + } + ... on NumbersOnlyTextFieldProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + defaultValueFloat: defaultValue + } + } + ... on DropdownProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + values { + id + label + } + } + } + ... on RadioButtonsProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + values { + id + label + } + } + } + ... on RectangleListProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + values { + id + label + } + } + } + ... on SwatchProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + values { + id + label + } + } + } + ... on FileUploadProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + } + } + ... on DateFieldProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr"}) { + displayName + } + } + } + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "data": { + "modifiers": [ + { + "modifierId": "bc/store/productModifier/121", + "data": { + "rectangleList": { + "displayName": "Thème de vacances", + "values": [ + { + "valueId": "bc/store/productModifierValue/113", + "label": "Anniversaire" + }, + { + "valueId": "bc/store/productModifierValue/114", + "label": "Noël" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set product modifier options for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductModifiersInformation": { + "product": { + "id": "bc/store/product/111", + "modifiers": { + "edges": [ + { + "node": { + "id": "bc/store/productModifier/118", + "displayName": "Include Insurance?", + "overridesForLocale": null + } + }, + { + "node": { + "id": "bc/store/productModifier/119", + "displayName": "Custom Message", + "overridesForLocale": null + } + }, + { + "node": { + "id": "bc/store/productModifier/121", + "displayName": "Holiday Theme", + "overridesForLocale": { + "displayName": "Thème de vacances", + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Anniversaire" + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Noël" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productModifier/122", + "displayName": "Hood Color", + "overridesForLocale": { + "displayName": "Couleur du capot", + "values": [ + { + "id": "bc/store/productModifierValue/115", + "label": "Rouge" + }, + { + "id": "bc/store/productModifierValue/116", + "label": "Bleu" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productModifier/123", + "displayName": "Pattern", + "overridesForLocale": { + "displayName": "Modèle", + "values": [ + { + "id": "bc/store/productModifierValue/117", + "label": "Ordinaire" + }, + { + "id": "bc/store/productModifierValue/118", + "label": "A carreaux" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productModifier/124", + "displayName": "Fit Type", + "overridesForLocale": { + "displayName": "Type d'ajustement", + "values": [ + { + "id": "bc/store/productModifierValue/119", + "label": "Régulière" + }, + { + "id": "bc/store/productModifierValue/120", + "label": "Ample" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productModifier/125", + "displayName": "Optional details", + "overridesForLocale": null + } + }, + { + "node": { + "id": "bc/store/productModifier/127", + "displayName": "Number of Pockets", + "overridesForLocale": null + } + }, + { + "node": { + "id": "bc/store/productModifier/128", + "displayName": "Anniversary Date", + "overridesForLocale": { + "displayName": "Date d'anniversaire" + } + } + }, + { + "node": { + "id": "bc/store/productModifier/129", + "displayName": "Custom-printed Image", + "overridesForLocale": { + "displayName": "Image personnalisée" + } + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove product modifier options for a locale + +The following example removes product modifier option information for the locale within the specified storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove product modifier options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductModifiersOverridesInput!) { + product { + removeProductModifiersOverrides (input: $input) { + product { + id + modifiers { + edges { + node { + id + displayName + } + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "locale": "fr", + "channelId": "bc/store/channel/2" + }, + "data": { + "modifiers": [ + { + "modifierId": "bc/store/productModifier/118", + "data": { + "checkbox": { + "fields": [ + "CHECKBOX_PRODUCT_MODIFIER_DISPLAY_NAME_FIELD" + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove product modifier options for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductModifiersOverrides": { + "product": { + "id": "bc/store/product/111", + "modifiers": { + "edges": [ + { + "node": { + "id": "bc/store/productModifier/118", + "displayName": "Include Insurance?" + } + }, + { + "node": { + "id": "bc/store/productModifier/119", + "displayName": "Custom Message" + } + }, + { + "node": { + "id": "bc/store/productModifier/121", + "displayName": "Holiday Theme" + } + }, + { + "node": { + "id": "bc/store/productModifier/122", + "displayName": "Hood Color" + } + }, + { + "node": { + "id": "bc/store/productModifier/123", + "displayName": "Pattern" + } + }, + { + "node": { + "id": "bc/store/productModifier/124", + "displayName": "Fit Type" + } + }, + { + "node": { + "id": "bc/store/productModifier/125", + "displayName": "Optional details" + } + }, + { + "node": { + "id": "bc/store/productModifier/127", + "displayName": "Number of Pockets" + } + }, + { + "node": { + "id": "bc/store/productModifier/128", + "displayName": "Anniversary Date" + } + }, + { + "node": { + "id": "bc/store/productModifier/129", + "displayName": "Custom-printed Image" + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Set shared modifier options + +You can set information about a shared modifier option for a store or a locale within a storefront channel. You must first create the shared modifier options through the control panel. Changing a shared modifier option affects all products that you assign to the shared modifier option. You cannot customize shared modifier options on a product level. + +The following mutations let you set the name and values for existing shared modifiers. + +### Set shared modifier options at the global level + +The following example sets global shared modifier information for the store, from which channels inherit by default. You can set the name and values for existing modifiers. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set shared modifier options at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetSharedProductModifiersInformationInput!) { + sharedProductModifiers { + setSharedProductModifiersInformation (input: $input) { + sharedProductModifiers { + id + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "data": { + "modifiers": [ + { + "modifierId": "bc/store/sharedProductModifier/2", + "data": { + "rectangleList": { + "displayName": "Button type", + "values": [ + { + "valueId": "bc/store/sharedProductModifierValue/107", + "label": "Large buttons" + }, + { + "valueId": "bc/store/sharedProductModifierValue/108", + "label": "Small buttons" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set shared modifier options at the global level" showLineNumbers copy + { + "data": { + "sharedProductModifiers": { + "setSharedProductModifiersInformation": { + "sharedProductModifiers": [ + { + "id": "bc/store/sharedProductModifier/2" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set shared modifier options for a locale + +The following example sets shared modifier information for the locale within the specified storefront channel. These override global store information. You can set the name and values for existing modifiers. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set shared modifier options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetSharedProductModifiersInformationInput!) { + sharedProductModifiers { + setSharedProductModifiersInformation (input: $input) { + sharedProductModifiers { + id + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "data": { + "modifiers": [ + { + "modifierId": "bc/store/sharedProductModifier/2", + "data": { + "rectangleList": { + "displayName": "bouton", + "values": [ + { + "valueId": "bc/store/sharedProductModifierValue/107", + "label": "grande" + }, + { + "valueId": "bc/store/sharedProductModifierValue/108", + "label": "petite" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set shared modifier options for a locale" showLineNumbers copy + { + "data": { + "sharedProductModifiers": { + "setSharedProductModifiersInformation": { + "sharedProductModifiers": [ + { + "id": "bc/store/sharedProductModifier/2" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove shared modifier options for a locale + +The following example removes shared modifier option information for the locale within the specified storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove shared modifier options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveSharedProductModifiersOverridesInput!) { + sharedProductModifiers { + removeSharedProductModifiersOverrides (input: $input) { + sharedProductModifiers { + id + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "data": { + "modifiers": [ + { + "modifierId": "bc/store/sharedProductModifier/1", + "data": { + "textField": { + "fields": ["SHARED_TEXT_FIELD_PRODUCT_MODIFIER_DEFAULT_VALUE_FIELD"] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove shared modifier options for a locale" showLineNumbers copy + { + "data": { + "sharedProductModifiers": { + "removeSharedProductModifiersOverrides": { + "sharedProductModifiers": [ + { + "id": "bc/store/sharedProductModifier/1" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Query modifier options + +The following example retrieves modifier information. You can retrieve global information for the store and overrides for the locale within the specified storefront channel. The query returns all modifier options, including those that are shared. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get modifier options" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + id + modifiers (first: 10) { + edges { + node { + __typename + id + displayName + isShared + isRequired + ... on CheckboxProductModifier { + checkedByDefault + fieldValue + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + fieldValue + } + } + ... on TextFieldProductModifier { + defaultValue + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + defaultValue + } + } + ... on MultilineTextFieldProductModifier { + defaultValue + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + defaultValue + } + } + ... on NumbersOnlyTextFieldProductModifier { + defaultValueFloat: defaultValue + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + defaultValueFloat: defaultValue + } + } + ... on DropdownProductModifier { + values { + id + label + isDefault + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + values { + id + label + } + } + } + ... on RadioButtonsProductModifier { + values { + id + label + isDefault + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + values { + id + label + } + } + } + ... on RectangleListProductModifier { + values { + id + label + isDefault + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + values { + id + label + } + } + } + ... on SwatchProductModifier { + values { + id + label + isDefault + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + values { + id + label + } + } + } + ... on FileUploadProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + } + } + ... on DateFieldProductModifier { + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + } + } + } + } + } + } + } + } + + ``` + </Tab> + <Tab> + + ```json filename="Example query: Get modifier options" showLineNumbers copy + { + "data": { + "store": { + "product": { + "id": "bc/store/product/111", + "modifiers": { + "edges": [ + { + "node": { + "__typename": "CheckboxProductModifier", + "id": "bc/store/productModifier/118", + "displayName": "Include Insurance?", + "isShared": false, + "isRequired": true, + "checkedByDefault": true, + "fieldValue": "Yes", + "overridesForLocale": { + "displayName": null, + "fieldValue": null + } + } + }, + { + "node": { + "__typename": "TextFieldProductModifier", + "id": "bc/store/productModifier/119", + "displayName": "Custom Message", + "isShared": false, + "isRequired": false, + "defaultValue": "Enjoy your gift", + "overridesForLocale": { + "displayName": null, + "fieldValue": null + } + } + }, + { + "node": { + "__typename": "RectangleListProductModifier", + "id": "bc/store/productModifier/121", + "displayName": "Holiday Theme", + "isShared": false, + "isRequired": false, + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Birthday", + "isDefault": true + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Christmas", + "isDefault": true + } + ], + "overridesForLocale": { + "displayName": "Thème de vacances", + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Anniversaire" + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Noël" + } + ] + } + } + }, + { + "node": { + "__typename": "SwatchProductModifier", + "id": "bc/store/productModifier/122", + "displayName": "Hood Color", + "isShared": false, + "isRequired": true, + "values": [ + { + "id": "bc/store/productModifierValue/115", + "label": "Red Hood", + "isDefault": false + }, + { + "id": "bc/store/productModifierValue/116", + "label": "Blue Hood", + "isDefault": false + } + ], + "overridesForLocale": { + "displayName": "Couleur du capot", + "values": [ + { + "id": "bc/store/productModifierValue/115", + "label": "Rouge" + }, + { + "id": "bc/store/productModifierValue/116", + "label": "Bleu" + } + ] + } + } + }, + { + "node": { + "__typename": "RectangleListProductModifier", + "id": "bc/store/productModifier/123", + "displayName": "Pattern", + "isShared": false, + "isRequired": false, + "values": [ + { + "id": "bc/store/productModifierValue/117", + "label": "Plain", + "isDefault": true + }, + { + "id": "bc/store/productModifierValue/118", + "label": "Checkered", + "isDefault": true + } + ], + "overridesForLocale": { + "displayName": "Modèle", + "values": [ + { + "id": "bc/store/productModifierValue/117", + "label": "ordinaire" + }, + { + "id": "bc/store/productModifierValue/118", + "label": "à carreaux" + } + ] + } + } + }, + { + "node": { + "__typename": "RectangleListProductModifier", + "id": "bc/store/productModifier/124", + "displayName": "Fit Type", + "isShared": false, + "isRequired": false, + "values": [ + { + "id": "bc/store/productModifierValue/119", + "label": "Regular fit", + "isDefault": false + }, + { + "id": "bc/store/productModifierValue/120", + "label": "Loose fit", + "isDefault": false + } + ], + "overridesForLocale": { + "displayName": "Type d'ajustement", + "values": [ + { + "id": "bc/store/productModifierValue/119", + "label": "Régulière" + }, + { + "id": "bc/store/productModifierValue/120", + "label": "Ample" + } + ] + } + } + }, + { + "node": { + "__typename": "MultilineTextFieldProductModifier", + "id": "bc/store/productModifier/125", + "displayName": "Optional details", + "isShared": false, + "isRequired": false, + "defaultValue": "", + "overridesForLocale": { + "displayName": null, + "fieldValue": null + } + } + }, + { + "node": { + "__typename": "NumbersOnlyTextFieldProductModifier", + "id": "bc/store/productModifier/127", + "displayName": "Number of Pockets", + "isShared": false, + "isRequired": true, + "defaultValueFloat": 1, + "overridesForLocale": { + "displayName": null, + "defaultValueFloat": null + } + } + }, + { + "node": { + "__typename": "DateFieldProductModifier", + "id": "bc/store/productModifier/128", + "displayName": "Anniversary Date", + "isShared": false, + "isRequired": false, + "overridesForLocale": { + "displayName": "Date d'anniversaire" + } + } + }, + { + "node": { + "__typename": "FileUploadProductModifier", + "id": "bc/store/productModifier/129", + "displayName": "Custom-printed Image", + "isShared": false, + "isRequired": false, + "overridesForLocale": { + "displayName": "image personnalisée" + } + } + } + ] + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +You can retrieve overrides for multiple locales in a channel, as shown in the following example: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get modifier options" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + id + modifiers (first: 1) { + edges { + node { + __typename + id + displayName + isShared + isRequired + + // modifier values for rectangle List product modifiers + ... on RectangleListProductModifier { + + // global values for the store + values { + id + label + isDefault + } + + // overrides for the UK locale in channel 2 + uk: overridesForLocale(localeContext: { channelId: "bc/store/channel/2", locale: "uk" }) { + displayName + values { + id + label + } + } + + // overrides for the France locale in channel 2 + fr: overridesForLocale(localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + displayName + values { + id + label + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example query: Get modifier options" showLineNumbers copy + { + "data": { + "store": { + "product": { + "id": "bc/store/product/111", + "modifiers": { + "edges": [ + { + "node": { + "__typename": "RectangleListProductModifier", + "id": "bc/store/productModifier/121", + "displayName": "Holiday Theme", + "isShared": false, + "isRequired": false, + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Birthday", + "isDefault": true + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Christmas", + "isDefault": true + } + ], + "uk": { + "displayName": "Public Holiday", + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "New Year's Day" + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Chrimbo" + } + ] + }, + "fr": { + "displayName": "Thème de vacances", + "values": [ + { + "id": "bc/store/productModifierValue/113", + "label": "Anniversaire" + }, + { + "id": "bc/store/productModifierValue/114", + "label": "Noël" + } + ] + } + } + } + ] + } + } + } + } + } + ``` + + </Tab> +</Tabs> diff --git a/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx b/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx new file mode 100644 index 000000000..8dfcbb438 --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx @@ -0,0 +1,291 @@ +# Product SEO Information + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query product SEO information, for example, page title and meta description. + +You can perform the following: +- [Set global product SEO information](#set-product-seo-information-at-the-global-level) for the catalog. Channels inherit these by default. +- [Create overrides for a channel and channel locale](#set-product-seo-information-for-a-locale) using the `overridesForLocale` mutation. +- [Remove overrides for a channel and channel locale](#remove-product-seo-information-for-a-locale). A channel then inherits global values. +- [Query product SEO information](#query-product-seo-information), those set at the global level and the overrides. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Set product SEO information at the global level + +The following example sets global product SEO information for the store, from which channels inherit by default. You can set the title and meta description for the product page. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product SEO information globally" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: SetProductSeoInformationInput! + ) { + product { + setProductSeoInformation(input: $input) { + product { + id + seoInformation { + pageTitle + metaDescription + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "pageTitle": "Global page title", + "metaDescription": "Global meta description" + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example mutation: Set product SEO information at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductSeoInformation": { + "product": { + "id": "bc/store/product/111", + "seoInformation": { + "pageTitle": "Journal", + "metaDescription": "journal book" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +## Set product SEO information for a locale + +The following example sets product SEO information for the specified storefront channel and locale within the channel. These will override global store information. You can set the title and meta description for the product page. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product SEO information for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: SetProductSeoInformationInput! + ) { + product { + setProductSeoInformation(input: $input) { + product { + id + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + seoInformation { + pageTitle + metaDescription + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "data": { + "pageTitle": "Page title override FR", + "metaDescription": "Meta description override FR" + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example mutation: Set product SEO information for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductSeoInformation": { + "product": { + "id": "bc/store/product/111", + "overridesForLocale": { + "seoInformation": { + "pageTitle": "Page title override FR", + "metaDescription": "Meta description override FR" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Remove product SEO information for a locale + +The following example removes product SEO information for the specified channel and locale. + +Omitting the `overridesToRemove` field from the input removes _all_ overrides for product SEO information from the locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove product SEO information for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ( + $input: RemoveProductSeoInformationOverridesInput! + ) { + product { + removeProductSeoInformationOverrides(input: $input) { + product { + id + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + seoInformation { + pageTitle + metaDescription + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "fr" + }, + "overridesToRemove": ["PRODUCT_PAGE_TITLE_FIELD"] + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example mutation: Remove product SEO information for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductSeoInformationOverrides": { + "product": { + "id": "bc/store/product/111", + "overridesForLocale": { + "seoInformation": { + "pageTitle": "Page title override FR", + "metaDescription": "Meta description override FR" + } + } + } + } + } + } + } + ``` + </Tab> +</Tabs> + +## Query product SEO information + +The following example retrieves product SEO information. You can retrieve global information for the store and overrides for the specified channel and locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get product SEO information" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + id + seoInformation { + pageTitle + metaDescription + } + overridesForLocale(localeContext: { channelId: "bc/store/channel/2", locale: "fr" }) { + seoInformation { + pageTitle + metaDescription + } + } + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example query: Get product SEO information" showLineNumbers copy + { + "data": { + "store": { + "product": { + "id": "bc/store/product/111", + "seoInformation": { + "pageTitle": "Example global page title", + "metaDescription": "Example global meta description" + }, + "overridesForLocale": { + "seoInformation": { + "pageTitle": "Page title override FR", + "metaDescription": "Meta description override FR" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + - The `id` field contains the product's global ID that you can retrieve from the [Get all products](/docs/rest-catalog/products#get-all-products) endpoint. For example, a product with a global ID of 111 will have an `id` of `"bc/store/product/111"`. + - The `channelId` field contains the channel's global ID that you can retrieve from the [Get all channels](/docs/rest-management/channels#get-all-channels) endpoint. For example, a channel with a global ID of 2 will have a `channelId` of `"bc/store/channel/2"`. +</Callout> diff --git a/docs/store-operations/catalog/graphql-admin/product-url.mdx b/docs/store-operations/catalog/graphql-admin/product-url.mdx new file mode 100644 index 000000000..ab4b42696 --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-url.mdx @@ -0,0 +1,269 @@ +# Product URL + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query product URLs for a store or a locale within a storefront channel. + +Perform the following: +- [Set product URLs](#set-product-url-at-the-global-level) for the store. Channels inherit these by default. +- [Create overrides for a channel's locale](#set-product-url-for-a-locale) using the `overridesForLocale` mutation. The product URL for the locale overrides the global value. +- [Remove overrides for a channel's locale](#remove-product-url-for-a-locale). The product URL then defaults to its global store value. +- [Query product URL](#query-product-url), those set at the global level and the overrides. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Set product URL at the global level + +The following example sets a product's URL for a store, from which channels inherit by default. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product URL at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductUrlPathInput!) { + product { + setProductUrlPath (input: $input) { + product { + id + urlPath { + path + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "path": "/global-product-111" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set product URL at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductUrlPath": { + "product": { + "id": "bc/store/product/111", + "urlPath": { + "path": "/overrides-product-111" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Set product URL for a locale + +The following example sets a product's URL for the locale within a storefront channel. These settings override global store information. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product URL for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductUrlPathInput!) { + product { + setProductUrlPath (input: $input) { + product { + id + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "uk" }) { + urlPath { + path + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + }, + "data": { + "path": "/overrides-product-111" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set product URL for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductUrlPath": { + "product": { + "id": "bc/store/product/111", + "overridesForLocale": { + "urlPath": { + "path": "/overrides-product-111" + } + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + + +## Remove product URL for a locale + +The following example removes the overrides for a product's URL. This mutation removes the overrides for the locale within the storefront channel, and the product URL defaults to its global store value. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove product URL for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductUrlPathOverrideInput!) { + product { + removeProductUrlPathOverride (input: $input) { + product { + id + urlPath { + path + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "b/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove product URL for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductUrlPathOverride": { + "product": { + "id": "bc/store/product/111", + "urlPath": { + "path": "/overrides-product-111" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Query product URL + +The following example retrieves a product's URL. You can retrieve global information for the store and overrides for a locale within a storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get product URL for a product" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product (id: "bc/store/product/111") { + id + urlPath { + path + } + overridesForLocale (localeContext: { channelId: "bc/store/channel/2", locale: "uk" }) { + urlPath { + path + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Get product URL for a product" showLineNumbers copy + { + "data": { + "store": { + "product": { + "id": "bc/store/product/111", + "urlPath": { + "path": "/global-product-111", + }, + "overridesForLocale": { + "urlPath": { + "path": "/overrides-product-111" + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> \ No newline at end of file diff --git a/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx b/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx new file mode 100644 index 000000000..5a7f5cff0 --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx @@ -0,0 +1,875 @@ +# Product Variant Options + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can set and query information about a [product variant option](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US#variations), such as option name and values. + +Perform the following for product variant options: +- [Set global variant option information](#set-variant-options-at-the-global-level) for the catalog. Channels inherit global information by default. +- [Create overrides for a channel locale](#set-variant-options-for-a-locale) using the `overridesForLocale` field. These override global store information. +- [Remove overrides for a channel locale](#remove-variant-options-for-a-locale) + +You can also set and remove information for [shared variant options](https://support.bigcommerce.com/s/article/Product-Options-v3?language=en_US#svo). The changes affect all products that you assign to the shared variant option. [Querying variant options](#query-product-variant-options) returns all variant options, including shared ones. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Set variant options + +Set information about a product variant option for a store or a locale within a storefront channel. + +The following mutations let you set the name and values for existing variant options. You must first create the variant option for the product through the control panel or the REST [Create a product variant option](/docs/rest-catalog/product-variant-options#create-a-product-variant-option) endpoint. + +<Callout type="info"> + The responses may include all variant options, including those that are shared. However, to _set_ shared variant options, use the mutations in [Set shared variant options](#set-shared-variant-options). +</Callout> + +### Set variant options at the global level + +The following example sets the store's global product variant option information, from which channels inherit by default. You can set the name and values for existing variant options. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product variant options at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductOptionsInformationInput!) { + product { + setProductOptionsInformation (input: $input) { + product { + id + options (first: 2) { + edges { + node { + id + displayName + isShared + values { + id + label + } + } + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": { + "options": [ + { + "optionId": "bc/store/productOption/108", + "data": { + "dropdown": { + "displayName": "Size US", + "values": [ + { + "valueId": "bc/store/productOptionValue/68", + "label": "Small US" + }, + { + "valueId": "bc/store/productOptionValue/69", + "label": "Medium US" + }, + { + "valueId": "bc/store/productOptionValue/70", + "label": "Large US" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set product variant options at the global level" showLineNumbers copy + { + "data": { + "product": { + "setProductOptionsInformation": { + "product": { + "id": "bc/store/product/111", + "options": { + "edges": [ + { + "node": { + "id": "bc/store/productOption/108", + "displayName": "Size US", + "isShared": false, + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small US" + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium US" + }, + { + "id": "bc/store/productOptionValue/70", + "label": "Large US" + } + ] + } + }, + { + "node": { + "id": "bc/store/productOption/109", + "displayName": "Color", + "isShared": false, + "values": [ + { + "id": "bc/store/productOptionValue/7", + "label": "Silver" + }, + { + "id": "bc/store/productOptionValue/8", + "label": "Black" + } + ] + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set variant options for a locale + +The following example sets product variant option information for the locale within the specified storefront channel. These override global store information. You can set the name and values for existing variant options. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product variant options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductOptionsInformationInput!) { + product { + setProductOptionsInformation (input: $input) { + product { + id + options (first: 2) { + edges { + node { + id + overridesForLocale( + localeContext: { + channelId: "bc/store/channel/2", + locale: "uk" + } + ) { + displayName + values { + id + label + } + } + } + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + }, + "data": { + "options": [ + { + "optionId": "bc/store/productOption/108", + "data": { + "dropdown": { + "displayName": "Size UK", + "values": [ + { + "valueId": "bc/store/productOptionValue/68", + "label": "Small UK" + }, + { + "valueId": "bc/store/productOptionValue/69", + "label": "Medium UK" + }, + { + "valueId": "bc/store/productOptionValue/70", + "label": "Large UK" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set product variant options for a locale" showLineNumbers copy + { + "data": { + "product": { + "setProductOptionsInformation": { + "product": { + "id": "bc/store/product/111", + "options": { + "edges": [ + { + "node": { + "id": "bc/store/productOption/108", + "overridesForLocale": { + "displayName": "Size UK", + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small UK" + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium UK" + }, + { + "id": "bc/store/productOptionValue/70", + "label": "Large UK" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productOption/109", + "overridesForLocale": { + "displayName": null, + "values": [] + } + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove variant options for a locale + +The following example removes product variant option information for the locale within the specified storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove product variant options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductOptionsOverridesInput!) { + product { + removeProductOptionsOverrides (input: $input) { + product { + id + options (first: 2) { + edges { + node { + id + displayName + values { + id + label + } + overridesForLocale (localeContext: {channelId: "bc/store/channel/2", locale: "uk"}) { + displayName + values { + id + label + } + } + } + } + } + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + }, + "data": { + "options": [ + { + "optionId": "bc/store/productOption/108", + "data": { + "dropdown": { + "fields": ["DROPDOWN_PRODUCT_OPTION_DISPLAY_NAME_FIELD"], + "values": { + "ids": ["bc/store/productOptionValue/70"] + } + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove product variant options for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductOptionsOverrides": { + "product": { + "id": "bc/store/product/111", + "options": { + "edges": [ + { + "node": { + "id": "bc/store/productOption/108", + "displayName": "Size US", + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small US" + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium US" + }, + { + "id": "bc/store/productOptionValue/70", + "label": "Large US" + } + ], + "overridesForLocale": { + "displayName": null, + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small UK" + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium UK" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productOption/109", + "displayName": "Color", + "values": [ + { + "id": "bc/store/productOptionValue/7", + "label": "Silver" + }, + { + "id": "bc/store/productOptionValue/8", + "label": "Black" + } + ], + "overridesForLocale": { + "displayName": null, + "values": [] + } + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Set shared variant options + +You can set information about a shared variant option for a store or a locale within a storefront channel. You must first create the shared variant options through the control panel. Changing a shared variant option affects all products that you assign to the shared variant option. You cannot customize shared variant options on a product level. + +The following mutations let you set the name and values for existing shared variant options. + +### Set shared variant options at the global level + +The following example sets global shared variant option information for the store, from which channels inherit by default. You can set the name and values for existing variant options. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set shared variant options at the global level" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetSharedProductOptionsInformationInput!) { + sharedProductOptions { + setSharedProductOptionsInformation (input: $input) { + sharedProductOptions { + id + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "data": { + "options": [ + { + "optionId": "bc/store/sharedProductOption/1", + "data": { + "dropdown": { + "displayName": "Fabric", + "values": [ + { + "valueId": "bc/store/sharedProductOptionValue/123", + "label": "Cotton" + }, + { + "valueId": "bc/store/sharedProductOptionValue/124", + "label": "Polyester" + } + ] + } + } + }, + { + "optionId": "bc/store/sharedProductOption/4", + "data": { + "swatch": { + "displayName": "Zipper color", + "values": [ + { + "valueId": "bc/store/sharedProductOptionValue/129", + "label": "Orange" + }, + { + "valueId": "bc/store/sharedProductOptionValue/130", + "label": "Green" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set shared variant options at the global level" showLineNumbers copy + { + "data": { + "sharedProductOptions": { + "setSharedProductOptionsInformation": { + "sharedProductOptions": [ + { + "id": "bc/store/sharedProductOption/1" + }, + { + "id": "bc/store/sharedProductOption/4" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Set shared variant options for a locale + +The following example sets shared variant option information for the locale within the specified storefront channel. These override global store information. You can set the name and values for existing variant options. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set shared variant options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetSharedProductOptionsInformationInput!) { + sharedProductOptions { + setSharedProductOptionsInformation (input: $input) { + sharedProductOptions { + id + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + }, + "data": { + "options": [ + { + "optionId": "bc/store/sharedProductOption/1", + "data": { + "dropdown": { + "displayName": "Fabric material", + "values": [ + { + "valueId": "bc/store/sharedProductOptionValue/123", + "label": "Linen" + }, + { + "valueId": "bc/store/sharedProductOptionValue/124", + "label": "Nylon" + } + ] + } + } + }, + { + "optionId": "bc/store/sharedProductOption/4", + "data": { + "swatch": { + "displayName": "Color of zipper", + "values": [ + { + "valueId": "bc/store/sharedProductOptionValue/129", + "label": "Black" + }, + { + "valueId": "bc/store/sharedProductOptionValue/130", + "label": "Brown" + } + ] + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Set shared variant options for a locale" showLineNumbers copy + { + "data": { + "sharedProductOptions": { + "setSharedProductOptionsInformation": { + "sharedProductOptions": [ + { + "id": "bc/store/sharedProductOption/1" + }, + { + "id": "bc/store/sharedProductOption/4" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Remove shared variant options for a locale + +The following example removes shared variant option information for the locale within the specified storefront channel. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove shared variant options for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveSharedProductOptionsOverridesInput!) { + sharedProductOptions { + removeSharedProductOptionsOverrides (input: $input) { + sharedProductOptions { + id + } + } + } + } + ``` + + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "localeContext": { + "channelId": "bc/store/channel/2", + "locale": "uk" + }, + "data": { + "options": [ + { + "optionId": "bc/store/sharedProductOption/2", + "data": { + "radioButtons": { + "fields": ["RADIO_BUTTONS_SHARED_PRODUCT_OPTION_DISPLAY_NAME_FIELD"], + "values": { + "ids": ["bc/store/sharedProductOptionValue/125", "bc/store/sharedProductOptionValue/126"] + } + } + } + } + ] + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example mutation: Remove shared variant options for a locale" showLineNumbers copy + { + "data": { + "sharedProductOptions": { + "removeSharedProductOptionsOverrides": { + "sharedProductOptions": [ + { + "id": "bc/store/sharedProductOption/2" + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Query variant options + +The following example retrieves variant information. You can retrieve global information for the store and overrides for the locale within the specified storefront channel. The query returns all variant options, including those that are shared. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get variant options" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product(id: "bc/store/product/111") { + id + options (first: 3) { + edges { + node { + id + displayName + isShared + values { + id + label + isDefault + } + overridesForLocale( + localeContext: { channelId: "bc/store/channel/2", locale: "uk"} + ) { + displayName + values { + id + label + } + } + } + } + } + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example query: Get variant options" showLineNumbers copy + { + "data": { + "store": { + "product": { + "id": "bc/store/product/111", + "options": { + "edges": [ + { + "node": { + "id": "bc/store/productOption/108", + "displayName": "Size", + "isShared": false, + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small US", + "isDefault": false + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium US", + "isDefault": false + }, + { + "id": "bc/store/productOptionValue/70", + "label": "Large US", + "isDefault": false + } + ], + "overridesForLocale": { + "displayName": "Size UK", + "values": [ + { + "id": "bc/store/productOptionValue/68", + "label": "Small UK" + }, + { + "id": "bc/store/productOptionValue/69", + "label": "Medium UK" + } + ] + } + } + }, + { + "node": { + "id": "bc/store/productOption/109", + "displayName": "Color", + "isShared": false, + "values": [ + { + "id": "bc/store/productOptionValue/7", + "label": "Silver", + "isDefault": false + }, + { + "id": "bc/store/productOptionValue/8", + "label": "Black", + "isDefault": false + } + ], + "overridesForLocale": { + "displayName": null, + "values": [] + } + } + }, + { + "node": { + "id": "bc/store/productOption/130", + "displayName": "Fabric", + "isShared": true, + "values": [ + { + "id": "bc/store/productOptionValue/123", + "label": "Cotton", + "isDefault": true + }, + { + "id": "bc/store/productOptionValue/124", + "label": "Polyester", + "isDefault": false + } + ], + "overridesForLocale": { + "displayName": "Fabric material", + "values": [ + { + "id": "bc/store/productOptionValue/123", + "label": "Linen" + }, + { + "id": "bc/store/productOptionValue/124", + "label": "Nylon" + } + ] + } + } + } + ] + } + } + } + } + } + ``` + + </Tab> +</Tabs> \ No newline at end of file diff --git a/docs/api-docs/catalog/products-overview.mdx b/docs/store-operations/catalog/index.mdx similarity index 100% rename from docs/api-docs/catalog/products-overview.mdx rename to docs/store-operations/catalog/index.mdx diff --git a/docs/store-operations/catalog/inventory-adjustments.mdx b/docs/store-operations/catalog/inventory-adjustments.mdx new file mode 100644 index 000000000..07d92b946 --- /dev/null +++ b/docs/store-operations/catalog/inventory-adjustments.mdx @@ -0,0 +1,407 @@ +# Inventory Overview + +BigCommerce's Inventory API is an asynchronous API that enables merchants to track a store's inventory and make updates to the number of products in the store's catalog. + +This article provides examples for adjusting a store's inventory and describes how BigCommerce handles concurrent adjustment requests. + +## Breaking changes to Catalog API + +### Writing inventory + +The existing [Catalog APIs](/docs/rest-catalog) no longer add or update inventory. Catalog endpoints that partly perform these functions now themselves use the Inventory API under the hood. The most direct way to update inventory is using the Inventory API. + +### Reading Inventory + +Although you can still read product inventory values using Catalog endpoints, the behavior has changed slightly. The stock levels returned using the Catalog API reflect the total inventory the merchant has available to sell. This provides limited backwards compatibility with any apps or integrations that facilitate selling a merchant's products through external sales channels, such as Amazon. + +## Inventory adjustments + +Due to the asynchronous nature of the Inventory API, there may be a short delay before data is updated after the endpoints are called. Endpoints that manage these inventories and locations for these inventories return a `transaction_id` for any write requests. + +The total inventory for a product cannot exceed 2,147,483,647 _at a single location_. The total inventory includes that of its variants. The inventory for a variant can reach 2,147,483,647 at each location. + +Using shirts as an example, you can store 2,147,483,647 shirts at each location. +For shirts with variants, this total includes all the shirts for its variants. +You can store up to 2,147,483,647 shirts for a variant. For example, you can have 2,147,483,647 small red shirts or 2,147,483,647 large blue shirts. + +<Callout type="info"> + #### Limit handling in Inventory versus Catalog API + - The Inventory API handles limits in a different way than the Catalog API. + - In the Inventory API, the store does not save the product or variant if you exceed the inventory limit. + - In the Catalog API, the store sets the inventory level to the limit if you exceed the limit. If a product has variants, the store may not save the inventory for a variant. For more information, see the [Update a product variant](/docs/rest-catalog/product-variants#update-a-product-variant) endpoint. +</Callout> + +<Callout type="warning"> + The Inventory API is not [channel aware](/docs/storefront/multi-storefront). Automated or bulk operations you perform with the Inventory API can change stock levels for products and variants that are not available on the storefront you intend to affect. +</Callout> + + +### Optimizing performance + +Keep the following points in mind to optimize API performance and stability: +- Wait to send new requests until the current request returns a 200 success status code. +- Update up to 2,000 products or variants per request. For example, you can update the inventory for 2,000 products (or variants) at one location, 200 products (or variants) at 10 locations, or 20 products (or variants) at 100 locations. +- Do not perform _bulk_ operations using the Inventory API in parallel with _bulk_ operations that use the Catalog or Orders APIs. Doing so may cause unpredictable, incorrect calculation results, as the Catalog and Orders APIs may force inventory calculations. +- Group _bulk_ absolute adjustments by _location_. For an example, see [Create absolute adjustments](#create-absolute-adjustment). + +## Absolute adjustment + +Use absolute adjustments as the default method for updating inventory. Absolute adjustments have lower complexity than [relative adjustments](#relative-adjustment), which synchronize with orders. + +### Example quantities + +| Property | Quantity | +| ------------------- | -------- | +| Initial Stock | `0` | +| Safety buffer | `0` | +| Absolute Adjustment | `100` | + +### Create absolute adjustment + +```http filename="Example request: Create absolute adjustment" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/adjustments/absolute +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "reason": "absolute adjustment example", + "items": [ + { + "location_id": 1, + "variant_id": 74, + "quantity": 100 + } + ] +} +``` + +For the best performance, group the payload data by _location_, not item, for bulk adjustments, as shown in the following example: + +```json filename="Example request body: Create a bulk absolute adjustment" showLineNumbers copy +// Specify adjustments for location 1 before specifying adjustments for location 2 + +{ + "reason": "Bulk absolute adjustment", + "items": [ + { + "location_id": 1, // adjustments for location 1 + "variant_id": 15, + "quantity": 100 + }, + { + "location_id": 1, + "variant_id": 20, + "quantity": 100 + }, + { + "location_id": 2, // adjustments for location 2 + "variant_id": 15, + "quantity": 100 + }, + { + "location_id": 2, + "variant_id": 20, + "quantity": 100 + } + ] +} +``` + +### Get location stock + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get location stock" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/locations/1/items?variant_id:in=74 + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location stock" showLineNumbers copy + { + "data":[ + { + "identity":{ + "sku": "SM13", + "variant_id": 74, + "product_id": 111 + }, + "available_to_sell": 100, + "total_inventory_onhand": 100, + "settings":{ + "safety_stock": 0, + "is_in_stock": true, + "warning_level": 5 + } + } + ] + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + There is some time delay between adjustment operations and actual stock level updates. So, if you call Get Stock request immediately after the adjustment operation, you might find the stock level unchanged. +</Callout> + +## Relative adjustment + +Use relative adjustments only when you do not know absolute quantities. For example, making order-related inventory changes through a third-party may require relative adjustments. Otherwise, use [absolute adjustments](#absolute-adjustment) for updating inventory. + +To make a relative adjustment to an inventory level, send a request to the [Relative inventory adjustments](/docs/rest-management/inventory/adjustments#relative-adjustment) endpoint. To retrieve inventory at a location, send a request to the [Get inventory at a location](/docs/rest-management/inventory/items#get-inventory-at-a-location) endpoint. + +### Example quantities + +| Property | Quantity | +| ------------- | -------- | +| Initial Stock | `50` | +| Safety buffer | `0` | +| Adjustment | `-25` | + +### Create a relative adjustment + + +```http filename="Example request: Create relative adjustment" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/adjustments/relative +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "reason": "single relative adjustment operation", + "items": [ + { + "location_id": 1, + "variant_id": 74, + "quantity": -25 + } + ] +} +``` + +### Get location stock + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get location stock" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/locations/1/items?variant_id:in=74 + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location stock" showLineNumbers copy + { + "data":[ + { + "identity":{ + "sku":"SM13", + "variant_id":74, + "product_id":111 + }, + "available_to_sell":25, + "total_inventory_onhand":25, + "settings":{ + "safety_stock":0, + "is_in_stock":true, + "warning_level":5 + } + } + ] + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + There is some time delay between the adjustment operations and actual updates to the stock level. So, if you call Get Stock request immediately after the adjustment operation you might find stock level unchanged for a while. +</Callout> + +## Relative adjustment with buffer (success) + +### Example quantities + +| Property | Quantity | +| ------------------- | -------- | +| Initial stock | `50` | +| Safety buffer | `10` | +| Relative adjustment | `-20` | + +### Create relative adjustment + +```http filename="Example request: Create relative adjustment" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/adjustments/relative +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "reason": "single relative adjustment operation", + "items": [ + { + "location_id": 1, + "variant_id": 74, + "quantity": -20 + } + ] +} +``` + +### Get location stock + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get location stock" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/locations/1/items?variant_id:in=74 + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location stock" showLineNumbers copy + { + ... + "available_to_sell": 20, + "total_inventory_onhand": 30, + ... + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + There is a delay between adjustment operations and stock level updates; if you get location stock immediately after the adjustment operation, you might find stock level unchanged. +</Callout> + +## Relative adjustment with buffer (error) + +### Example quantities + +| Property | Description | +| ------------- | ----------- | +| Initial Stock | `50` | +| Safety buffer | `10` | +| Adjustment | `-41` | + +### Create relative adjustment + +```http filename="Example request: Create relative adjustment" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/adjustments/relative +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "reason": "single relative adjustment operation", + "items": [ + { + "location_id": 1, + "variant_id": 74, + "quantity": -41 + } + ] +} +``` + +Since the relative adjustment of `-41` would bring the item's stock below the safety buffer, the above request would error; stock would be unchanged. + +## Concurrent adjustments + +Concurrent adjustments occur when two or more adjustment requests adjust the **same item** at the **same location** at the **same time**. For example, consider the adjustments in the table below (which assumes all requests in a single row occur simultaneously). + +| Example | Concurrency | +|-|-| +| Relative adjustment item **A** at Location **1**| No | +| Relative adjustment item **A** at Location **1** <br /> Relative adjustment item A at Location **2** | No | +| Absolute Adjustment Item **A** at Location **1**| No | +| Absolute Adjustment item **A** at location **1** <br /> Absolute Adjustment item **B** at location **1** | No | +| Relative adjustment item **A** at location **1** <br /> Relative adjustment item **A** at location **1** | Yes| +| Relative adjustment item **A** at location **1**, item **B** at location **2** <br /> Relative adjustment item **B** at location **1** | No | +| Relative adjustment item **A** at location **1**, item **B** at location **2** <br /> Relative adjustment item **B** at location **2** | Yes | +| Relative adjustment item **A** at location **1**, item **B** at location **2** <br /> Absolute adjustment item **A** at location **1** | Yes | + +## Concurrent adjustment handling + +Internally, concurrent requests are handled one-by-one and have a strict order, to avoid overselling. Position of the adjustment operation in this strict order sequence determines whether it can or can't deduct item stock quantity when stock is low or near zero. + +Assuming all adjustments in one row are relative and executed simultaneously (and assuming no other concurrent operations were performed), the table below demonstrates how BigCommerce handles concurrent adjustments. + +| Example | Initial Stock | Adjustment Sequence | Result | +| ------- | ------------- | ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| A | 10 | 1. Operation **A**: `-10` <br /> 2. Operation **B**: `-1` | Operation **A**: success <br /> Operation **B**: error | +| B | 10 | 1. Operation **B**: `-1` <br /> 2. Operation **A**: `-10` | Operation **A**: success <br /> Operation **B**: error | +| C | 10 | 1. Operation **B**: `-1` <br /> 2. Operation **A**: `-10` <br /> 3. Operation **C**: `-2` | Operation **B**: success <br /> Operation **A**: error <br /> Operation **C**: error | +| D | 10 | 1. Operation **B**: `-1` <br /> 2. Operation **C**: `-2` <br /> 3. Operation **A**: `-10` | Operation **B**: success <br /> Operation **A**: success <br /> Operation **C**: error | +| E | 10 | 1. Operation **A**: `-10` <br /> 2. Operation **C**: `-2` <br /> 3. Operation **B**: `-1` | Operation **B**: success <br /> Operation **A**: error <br /> Operation **C**: error | +| F | 10 | 1. Operation **A**: `-11` <br /> 2. Operation **C**: `-2` <br /> 3. Operation **B**: `-1` | Operation **B**: error <br /> Operation **A**: error <br /> Operation **C**: error | + +Let's go deeper into the **C** and **F** edge case. It is only possible in concurrent relative adjustment operations, because we never return insufficient stock error in absolute adjustment. Even though there is a strict internal sequence, each operation is isolated and handled independently. + +There are three major stages of each operation in a client (synchronous) part of the request: + +- **Stage A**: Pre-check (verification on eventually consistent data, without concurrent requests verification) +- **Stage B**: Make strict adjustment order (store adjustment "intention" into persistent memory) +- **Stage C**: Post-check (include concurrent adjustments and verify stock limit on master data, respects the concurrent adjustments strict order) +- **Stage D**: Decide whether operation success or failure. Fail the operation and return ERROR or execute other business logic and return SUCCESS. + +So, if Operation **B** and Operation **C** are on **Stage C**, each of them decide the item's stock is insufficient to proceed with the operation: Operation **B** (-1 + -10 > 10), Operation **C** (-2 + -10 > 10). + +This edge case is only possible when the store is on the high load with concurrent adjustments and insufficient item stock. + +## Concurrent absolute adjustments + +Absolute adjustment handling is based on a **First-In-First-Handled** strategy, which is simpler than relative adjustment handling. There is no pre-check and post-check operations under-the-hood (because absolute adjustments can't be rejected with insufficient quantity). Despite that, the order of concurrent absolute adjustments is hard to predict. + +| Initial Stock | Concurrent Operations | Result Stock | +| ------------- | ------------------------------------------------ | ------------ | +| 10 | Operation **A**: `0` <br /> Operation **B**: `100` | `100` | +| 10 | Operation **A**: `0` <br /> Operation **B**: `100` | `0` | + +As you can see sending concurrent absolute operations at the same time you never know which will be the first. Try to avoid sending concurrent absolute operations. + +## Concurrent mixed operations + +Relative and absolute adjustments are mostly independent concepts. The only point of intersection between them is item stock value. + +Considering the async nature of operations, relative adjustment applies new absolute stock value when absolute operation is completely handled by the server-side async job process. + +It means the following: if relative adjustment operation was started the pre-check stage BEFORE absolute operation completely handled, it applies the item stock value that was before the absolute adjustment. + +Here are some examples: + +| Initial stock | Concurrent Operations | Intermediate State of Absolute Adjustment | Final State | +| ------------- | ---------------------------------------------- | ----------------------------------------- | -------------------------------------------------------------------- | +| `10` | Relative **A**: `-10` <br /> Absolute **B**: `5` | Completed | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | +| `10` | Relative **A**: `-10` <br /> Absolute **B**: `5` | In Progress | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | +| `10` | Relative **A**: `-10` <br /> Absolute **B**: `5` | In Progress | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | +| `10` | Relative **A**: `-10` <br /> Absolute **B**: `5` | Completed | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | +| `0` | Relative **A**: `-10` <br /> Absolute **B**: `5` | In Progress | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | +| `100` | Relative **A**: `-10` <br /> Absolute **B**: `5` | In Progress | Relative **A**: error <br /> Stock after Absolute **B** operation: `5` | + +## Definitions + +| Term | Definition | +| ---------------------- | ------------------------------------------------------------------------------------------------------------------ | +| Concurrent adjustments | Occur when two or more adjustment requests adjust the **same item** at the **same location** at the **same time**. | +| Relative adjustment | Addition or subtraction of an item's stock at a specific location | +| Absolute adjustment | Override of an item's stock at a specific location | +| Mixed operation | Occurs when a concurrent adjustment operations contains both absolute and relative adjustments | +| Safety Stock | The quantity of product that is stored to prevent an out-of-stock situation. It serves as insurance against sudden/rapid fluctuations in demand. Safety stock quantity is not included in the Available to Sell quantity that may be displayed to customers on the storefront. | + diff --git a/docs/store-operations/catalog/inventory-locations.mdx b/docs/store-operations/catalog/inventory-locations.mdx new file mode 100644 index 000000000..ce5a6ab1a --- /dev/null +++ b/docs/store-operations/catalog/inventory-locations.mdx @@ -0,0 +1,101 @@ +# Locations + +_Locations_ allow merchants to track product inventory across multiple physical or virtual locations. +Locations also allow merchants to manage their store and warehouse physical addresses in a single source of truth, which can be used by tools such as store locator widgets or app integrations that are concerned with locations where a store’s business is conducted. + +## Managing locations + +You can create up to the following number of locations: +- Standard plan: up to 4 +- Plus plan: up to 5 +- Pro plan: up to 8 +- Enterprise plan: 100; can be customized by request + +You can disable, remove visibility, and [delete locations](/docs/rest-management/locations#delete-locations). + +The `enabled` and `storefront_visibility` flags for a location determine whether a location is available for Storefront and Management APIs. +- Both flags determine if a location will return through any of the Storefront APIs, including getting available pickup methods. The flags control location visibility through the Storefront APIs. +- However, the `enabled` flag also controls: + - Whether a location can be used to create orders and pickup methods. + - Whether you can edit stock levels through the management APIs + - If any stock for products at a location contribute to the "available to sell" total returned by the Storefront APIs. +- For example, a location can be "enabled", allowing orders to be fulfilled at that location through the Order V2 or Checkout APIs. If its `storefront_visibility` is set to false, the details of that location are omitted from the Storefront APIs. + +The [Locations API](/docs/rest-management/locations) allows you to manage locations. For examples, see [Merchant Configuration](/docs/integrations/buy-online-pick-up-in-store/end-to-end-guide/configuration) under the End-to-end guides. + +You can query locations using the GraphQL Storefront API. For examples, see [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries). + +<Callout type="info"> + Due to the asynchronous nature of the Locations API, there may be a short delay before data is updated after the endpoints are called. Endpoints that manage these locations and inventory at these locations return a `transaction_id` for any write requests. +</Callout> + +### Location metafields + +Manage location metafields using the [Locations API](/docs/rest-management/locations). + +To create a location metafield, send a request to the [Create a location metafield](/docs/rest-management/locations/metafields#create-a-metafield) endpoint. Each metafield must have a unique combination of `key` and `value` for a `namespace`. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create a location metafield" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/inventory/locations/{{LOCATION_ID}}/metafields + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + { + "key": "location status", + "value": "upcoming", + "namespace": "headquarters", + "permission_set": "write_and_sf_access", + "description": "new location" + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create a location metafield" showLineNumbers copy + { + "data": { + "id": 4, + "key": "location status", + "value": "upcoming", + "namespace": "headquarters", + "permission_set": "write_and_sf_access", + "resource_type": "location", + "resource_id": 1, + "description": "new location", + "date_created": "2023-03-16T15:14:47+00:00", + "date_modified": "2023-03-16T15:14:47+00:00" + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + + +Location metafields that have storefront access permissions (i.e. permission set as `read_and_sf_access` or `write_and_sf_access`) can be returned in the GraphQL Storefront API. +For example queries of this, see [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries). + +## Resources + +- [Locations API Reference](/docs/rest-management/locations) + + - [Create Locations](/docs/rest-management/locations#create-locations) + - [Update Locations](/docs/rest-management/locations#update-locations) + - [Get Locations](/docs/rest-management/locations#get-locations) + - [Delete locations](/docs/rest-management/locations#delete-locations) + + - [Create a location metafield](/docs/rest-management/locations/metafields#create-a-metafield) + - [Update a location metafield](/docs/rest-management/locations/metafields#update-a-metafield) + - [Get a location metafield](/docs/rest-management/locations/metafields#get-a-metafield) + - [Get location metafields](/docs/rest-management/locations/metafields#get-metafields) + - [Delete a location metafield](/docs/rest-management/locations/metafields#delete-a-metafield) + +- [Get Locations](/docs/storefront/graphql/locations/settings) + - [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries) + diff --git a/docs/api-docs/catalog/v2-v3-examples.mdx b/docs/store-operations/catalog/migration/guide.mdx similarity index 100% rename from docs/api-docs/catalog/v2-v3-examples.mdx rename to docs/store-operations/catalog/migration/guide.mdx diff --git a/docs/api-docs/catalog/v2-vs-v3.mdx b/docs/store-operations/catalog/migration/index.mdx similarity index 100% rename from docs/api-docs/catalog/v2-vs-v3.mdx rename to docs/store-operations/catalog/migration/index.mdx diff --git a/docs/store-operations/catalog/msf-international-enhancements.mdx b/docs/store-operations/catalog/msf-international-enhancements.mdx new file mode 100644 index 000000000..48f5fb94e --- /dev/null +++ b/docs/store-operations/catalog/msf-international-enhancements.mdx @@ -0,0 +1,81 @@ +# International Enhancements for Multi-Storefront + +<Callout type="info"> + These features are currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +_International Enhancements for Multi-Storefront_ allow merchants to deliver localized experiences to fit different shopper needs. You can express product details differently across cultures and countries. +For example, when selling products internationally, you can add information for products in various languages. +Shoppers can then see key product details in the language of their choice throughout the complete checkout and post-order experience for a personalized shopping experience. +This personalized shopping experience helps shoppers find and learn information about a product before purchasing. + +The following pages provide sample queries: + +- [Basic product information](/docs/store-operations/catalog/graphql-admin/product-basic-info) +- [Product SEO information](/docs/store-operations/catalog/graphql-admin/product-seo-info) +- [Product variant options](/docs/store-operations/catalog/graphql-admin/product-variant-options) +- [Product modifier options](/docs/store-operations/catalog/graphql-admin/product-modifier-options) +- [Product URL](/docs/store-operations/catalog/graphql-admin/product-url) +- [Additional product attributes](/docs/store-operations/catalog/graphql-admin/product-attributes) + +You can create webhooks that trigger for the following events: +- [Product updated](/docs/integrations/webhooks/events#products) +- [Product or shared option updated](/docs/integrations/webhooks/events#options) +- [Product or shared modifier updated](/docs/integrations/webhooks/events#modifiers) + +## Use cases + +To use these features, set product attributes to locales within storefront channels. This update overrides global product attributes. +Product attributes you can customize include the product name, description, variant options, modifier options, and SEO settings. + +This allows you to perform the following: + +- Customize product name and description for culture or language +- Optimize SEO or display product options and variations based on country +- Create additional brands to position the same product to multiple market segments and shopper personas +- Tailor product content for different countries that have different compliance regulations +- Display relevant seasonal or featured products +- Enable two-way syncing of listings data to catalog between channels + +## GraphQL schema + +The catalog features in _International Enhancements for MSF_ are part of the GraphQL Admin API. You can use this GraphQL management API to set and query catalog data for a locale _within a channel_. + +**Request URL:** + +`https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql` + +**Path Parameters:** + +| Name | Type | Description | Required | +| :----------- | :----- | :-------------------- | :------- | +| `STORE_HASH` | string | Unique ID for a store | Yes | + + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Authentication + +The GraphQL Admin API works with [store-level API accounts](/docs/start/authentication/api-accounts#store-level-api-accounts). + +### Authentication header + +Your requests should have the following for authentication. + +| Header | Argument | Description | +| :------------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication). | + +For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication#x-auth-token-header-example-requests). + +### OAuth scopes + +The API account should have the following OAuth scopes. + +| UI Name | Permission | Parameter | +| :------- | :--------- | :---------------------------- | +| Products | modify | `store_v2_products` | +| Products | read-only | `store_v2_products_read_only` | + +For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts#oauth-scopes). diff --git a/docs/api-docs/catalog/currencies/how-currencies-work.mdx b/docs/store-operations/currencies/guide.mdx similarity index 100% rename from docs/api-docs/catalog/currencies/how-currencies-work.mdx rename to docs/store-operations/currencies/guide.mdx diff --git a/docs/api-docs/catalog/currencies/currencies-overview.mdx b/docs/store-operations/currencies/index.mdx similarity index 98% rename from docs/api-docs/catalog/currencies/currencies-overview.mdx rename to docs/store-operations/currencies/index.mdx index f7f550950..97ef25239 100644 --- a/docs/api-docs/catalog/currencies/currencies-overview.mdx +++ b/docs/store-operations/currencies/index.mdx @@ -35,7 +35,7 @@ Before setting up multiple currencies on a store, ensure your store is using the * The [Optimized One-Page Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout) type. * A [multi-currency compatible payment gateway](https://support.bigcommerce.com/s/article/Managing-Currencies) set up and enabled. (Your store's default currency can use any gateway). -Additionally, review the [Currency API reference](/docs/rest-management/currencies) to get aquainted with the endpoints and resources related to configuring multiple currencies. +Additionally, review the [Currency API reference](/docs/rest-management/currencies) to get acquainted with the endpoints and resources related to configuring multiple currencies. <Callout type="info"> Make sure to not change the store’s default currency. This could cause the currency to malfunction. diff --git a/docs/api-docs/customers/channel-specific-customers.mdx b/docs/store-operations/customers/channel-specific-customers.mdx similarity index 100% rename from docs/api-docs/customers/channel-specific-customers.mdx rename to docs/store-operations/customers/channel-specific-customers.mdx diff --git a/docs/api-docs/customers/customers-subscribers-overview.mdx b/docs/store-operations/customers/index.mdx similarity index 97% rename from docs/api-docs/customers/customers-subscribers-overview.mdx rename to docs/store-operations/customers/index.mdx index 8ed2d9800..6d9de8ed6 100644 --- a/docs/api-docs/customers/customers-subscribers-overview.mdx +++ b/docs/store-operations/customers/index.mdx @@ -1,267 +1,267 @@ -# Customers and subscribers - -The following overview covers the authentication patterns and API endpoints that BigCommerce offers for customer management. - -## OAuth scopes - -| Name | Permission | Parameter | -|:-----|:-----------|:----------| -| Customers | modify | `store_v2_customers` | -| Customers | read-only | `store_v2_customers_read_only` | - -For more information on available authentication methods, see [Authentication](/docs/start/authentication). - -## What is a customer? - -A customer is anyone who purchases from a store and creates an account. BigCommerce stores an email address, customer address, and name in the customer object. - -You can extend the data for customer records using [customer metafields](/docs/rest-management/customers/metafields-batch), [custom account sign-up form fields](/docs/rest-management/customers/form-field-values#get-customer-form-field-values), and [customer attributes](/docs/rest-management/customers/attributes#get-all-customer-attributes) endpoints. - -You can use the following APIs to work with customer data and authentication: - -* [GraphQL Storefront API](/docs/storefront/graphql/customers) -* [REST storefront customers API](/docs/rest-storefront/customers) -* [REST management API V3 customers](/docs/rest-management/customers/addresses) -* [REST management API V2 customers](/docs/rest-management/customers-v2) -* [Customer login API](/docs/start/authentication/customer-login) -* [Current customer API](/docs/start/authentication/current-customer) - -### Customer groups - -Customer groups let you organize customers, give them discounts, and restrict access to specific products or categories. For more information, see [Customer Groups (Help Center)](https://support.bigcommerce.com/s/article/Customer-Groups). - -<Callout type="info"> - Customer groups are only available on specific plans. See [Pricing](https://support.bigcommerce.com/s/article/Pricing) to learn more. -</Callout> - -## What is a subscriber? - -A subscriber is someone who signs up for a store's newsletter or abandoned cart emails. The sign-up field is located in the footer of most storefront themes. - -You can also add subscribers in the following ways: - -- Exposing a newsletter sign-up field during checkout - -- Sending a request to the [Create a subscriber](/docs/rest-management/subscribers#create-a-subscriber) endpoint in the REST Management API - -Where possible, the API indicates the origin of the subscriber. When customers sign up for the newsletter using One-Page Checkout, the Order ID becomes part of the subscriber's record. When customers use Optimized One-Page Checkout, the customer becomes a subscriber before checking out, resulting in a subscriber record without an Order ID. - -## Subscribers vs. customers - -- A subscriber is not always a customer. Someone can sign up for the newsletter without creating an account. -- A customer is not always a subscriber. Signing up for the newsletter is a separate action from creating an account and purchasing an item. -- A customer and a subscriber can be the same. If a shopper checks out on the storefront, creates an account and opts into the newsletter, they are both a customer and a subscriber. - -## What is a guest? - -Store [settings](https://support.bigcommerce.com/s/article/Checkout-Settings#checkout-settings) can be configured to allow a shopper to complete checkout without creating an account. These shoppers are not captured as customers or stored on BigCommerce. If you want to capture guest data, using the [Storefront APIs](/docs/storefront/cart-checkout/guide/rest-management) can help. - -## Customer login API - -The [Customer login API](/docs/start/authentication/customer-login) allows single sign-on. Once a customer has authenticated by logging in to a third-party system (CMS, portal, or app), you can use the Customer login API to seamlessly log the customer into their BigCommerce customer account. - - -## Current customer API - -The [Current customer API](/docs/start/authentication/current-customer) allows your application to identify logged-in customers. This identification is useful when you need to show customer-specific information. - -## Customers API - -The following endpoints are available: - -**GraphQL API** -- Customers GraphQL API - -**REST API** -- V3 customers REST API -- V2 customers REST API - -### V3 customers API - -The [V3 customers API](/docs/rest-management/customers) consists of customers, customer address books, [customer attributes](/docs/rest-management/customers/attributes), customer addresses, customer form fields, and other endpoints that help manage the customer object. - - -A customer can purchase from a store and create an account. The `customers` object comprises both customer details and a customer address book. - -Customer details include data preferences, attribute fields, form fields, and authentication. The V3 customers API can accomplish the same tasks as the existing V2 customers API, with greater efficiency. - - -The customer address book stores a collection of addresses entered by the customer. Add an address to capture the customer address details where you can ship orders if selected. - - -[Customer attributes](/docs/rest-management/customers/attributes) and [Customer attribute values](/docs/rest-management/customers/attribute-values) let you store additional information against a customer. Customer attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer attribute values endpoint lets you define the values for the attributes. - - -<Callout type="info"> -#### Name-value pairs -Each customer can have up to 50 name-value pairs stored. -</Callout> - -Customer attributes are created separately from the customer. After the name and type are created, then the attributes can be added to the customer using the name-value pair. - -[Customer addresses](/docs/rest-management/customers/addresses) consist of a customers address and phone number. Customers can have multiple addresses stored against them. - -[Customer form field values](/docs/rest-management/customers/form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account sign up Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). - -You can access and edit the values for the fields on customer and customer address records using the API. - -### V2 Customers API - -The [V2 customers API](/docs/rest-management/customers-v2) consists of customers, customer addresses, and customer groups. The customer's object consists of basic customer information such as customer name and phone number. - - -[Customer addresses](/docs/rest-management/customers-v2/customer-addresses) consist of a customer's address and phone number. Customers can have multiple addresses stored against them. - -[Customer groups](/docs/rest-management/customers-v2/customer-groups) let you organize your customers, give them discounts, and restrict access to specific products or categories. Customer groups are not yet available on the V3 customers API. - - -## Differences between V2 and V3 customers APIs - -When resources are available through both APIs, we recommend using the V3 customers API as BigCommerce will eventually migrate all existing V2 resources to V3. - -This section covers the important differences between V2 and V3 customers APIs. - -### Making requests - -The V3 customers API is easier to use. It reduces the number of API calls needed to accomplish a task. For example, to create a new customer with the V2 API, you have to make multiple API calls. With the V3 API, you can create customer attributes and their address in one step, allowing you to batch-create multiple customers and their subresources in a single API call. - -**Create a customer** - -Single customer on V3: - --`/customers` - -Single customer on V2: - -- `/customers/{{customer_id}}` -- `/customers/{{customer_id}}/addresses` - -### Queries - -With the V3 customers API, queries become a powerful tool. There is one `GET` endpoint per resource with filters to refine the request. The V2 API necessitates using a different endpoint to get customer subresources. - -**Get customer addresses** -Get customer address by name and company on V3: - -`/customers/addresses?company:in=bigcommerce,commongood&customer_id:in1,2,3` - -Get customer address by name and company on V2: - -`/customers/{{customer_id}}/addresses/{{customer_address_id}}` - -### Requests - -V3 Customers `POST` and `PUT` requests require an array object. - -```http filename="Example request: Update a customer V3" showLineNumbers copy -PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers -X-Auth-Token: {{ACCESS_TOKEN}} -Content-Type: application/json -Accept: application/json - -[ - { - "id": 12, - "email": "janedoe@example.com", - "first_name": "Jane", - "last_name": "Doe" - } -] -``` - -```http filename="Example request: Update a customer V2" showLineNumbers copy -PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/customer_groups/{{customer_group_id}} -X-Auth-Token: {{ACCESS_TOKEN}} -Content-Type: application/json -Accept: application/json - -{ - "first_name": "Jane", - "email": "jane@example.com", - "phone": "1234567890" -} -``` - -### Upsert - -You can use the V3 customers API [Upsert customer attribute values](/docs/rest-management/customers/attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. - -### Authentication object - -The V3 customers API offers two ways to set a customer's password: - -- You can set a new password under the `authentication > new_password` object in a `PUT` or `POST` request. -- To prompt a customer to reset their password, set `force_password_reset` to `true` under `authentication > new_password` object in a `PUT` or `POST` request. - -[Password confirmation](/docs/rest-management/subscribers#create-a-subscriber) and [validation](/docs/rest-management/customers-v2/customer-passwords#validate-a-password) are still available under the V2 customers API. - -## Subscribers API - -The subscribers API allows you to manage subscribers who have signed up for the store’s newsletter or have signed up for abandoned cart emails. -An important field to note is `consents` - this field determines whether the Subscriber signed up for marketing newsletter emails, abandoned cart emails, or both. This field can also be empty, meaning they have not subscribed to either (or may have opted out). - - -```http filename="Example request: Create a subscriber V3" showLineNumbers copy -POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers -X-Auth-Token: {{ACCESS_TOKEN}} -Content-Type: application/json -Accept: application/json - -{ - "email": "string@test.com", - "first_name": "string", - "last_name": "string", - "channel_id": 1, - "consents": ["marketing_newsletter", "abandoned_cart"], - "source": "storefront" -} -``` - -```js filename="Example request: Update a subscriber V3" showLineNumbers copy -POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers/1 -X-Auth-Token: {{ACCESS_TOKEN}} -Content-Type: application/json -Accept: application/json - -{ - "email": "string@test.com", - "first_name": "string", - "last_name": "string", - "channel_id": 1, - "consents": [], - "source": "order" -} -``` - -## Related resources - -### Articles - -* [Adding and Editing Fields in the Account sign up Form (Help Center)](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields) -* [Checkout Settings (Help Center)](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout#checkout-settings) - -### API - -* [Customer Login API](/docs/start/authentication/customer-login) -* [Current Customer API](/docs/start/authentication/current-customer) - -#### REST storefront API - -* [Customers](/docs/rest-storefront/customers) -* [Cookie consents](/docs/rest-storefront/consent) -* [Subscriptions](/docs/rest-storefront/subscriptions) - -#### REST management API V3 - -* [Customers](/docs/rest-management/customers) -* [Subscribers](/docs/rest-management/subscribers) -* [Validate customer credentials](/docs/rest-management/customers/validate-credentials#validate-a-customer-credentials) -* [Customer segmentation](/beta/customer-segmentation/rest-management) - -#### REST management API V2 - -* [Customer groups](/docs/rest-management/customers-v2/customer-groups#get-all-customer-groups) - -### Webhooks - -* [Customers](/docs/integrations/webhooks/events#customer) +# Customers and subscribers + +The following overview covers the authentication patterns and API endpoints that BigCommerce offers for customer management. + +## OAuth scopes + +| Name | Permission | Parameter | +|:-----|:-----------|:----------| +| Customers | modify | `store_v2_customers` | +| Customers | read-only | `store_v2_customers_read_only` | + +For more information on available authentication methods, see [Authentication](/docs/start/authentication). + +## What is a customer? + +A customer is anyone who purchases from a store and creates an account. BigCommerce stores an email address, customer address, and name in the customer object. + +You can extend the data for customer records using [customer metafields](/docs/rest-management/customers/metafields-batch), [custom account sign-up form fields](/docs/rest-management/customers/form-field-values#get-customer-form-field-values), and [customer attributes](/docs/rest-management/customers/attributes#get-all-customer-attributes) endpoints. + +You can use the following APIs to work with customer data and authentication: + +* [GraphQL Storefront API](/docs/storefront/graphql/customers) +* [REST storefront customers API](/docs/rest-storefront/customers) +* [REST management API V3 customers](/docs/rest-management/customers/addresses) +* [REST management API V2 customers](/docs/rest-management/customers-v2) +* [Customer login API](/docs/start/authentication/customer-login) +* [Current customer API](/docs/start/authentication/current-customer) + +### Customer groups + +Customer groups let you organize customers, give them discounts, and restrict access to specific products or categories. For more information, see [Customer Groups (Help Center)](https://support.bigcommerce.com/s/article/Customer-Groups). + +<Callout type="info"> + Customer groups are only available on specific plans. See [Pricing](https://support.bigcommerce.com/s/article/Pricing) to learn more. +</Callout> + +## What is a subscriber? + +A subscriber is someone who signs up for a store's newsletter or abandoned cart emails. The sign-up field is located in the footer of most storefront themes. + +You can also add subscribers in the following ways: + +- Exposing a newsletter sign-up field during checkout + +- Sending a request to the [Create a subscriber](/docs/rest-management/subscribers#create-a-subscriber) endpoint in the REST Management API + +Where possible, the API indicates the origin of the subscriber. When customers sign up for the newsletter using One-Page Checkout, the Order ID becomes part of the subscriber's record. When customers use Optimized One-Page Checkout, the customer becomes a subscriber before checking out, resulting in a subscriber record without an Order ID. + +## Subscribers vs. customers + +- A subscriber is not always a customer. Someone can sign up for the newsletter without creating an account. +- A customer is not always a subscriber. Signing up for the newsletter is a separate action from creating an account and purchasing an item. +- A customer and a subscriber can be the same. If a shopper checks out on the storefront, creates an account and opts into the newsletter, they are both a customer and a subscriber. + +## What is a guest? + +Store [settings](https://support.bigcommerce.com/s/article/Checkout-Settings#checkout-settings) can be configured to allow a shopper to complete checkout without creating an account. These shoppers are not captured as customers or stored on BigCommerce. If you want to capture guest data, using the [Storefront APIs](/docs/storefront/cart-checkout/guide/rest-management) can help. + +## Customer login API + +The [Customer login API](/docs/start/authentication/customer-login) allows single sign-on. Once a customer has authenticated by logging in to a third-party system (CMS, portal, or app), you can use the Customer login API to seamlessly log the customer into their BigCommerce customer account. + + +## Current customer API + +The [Current customer API](/docs/start/authentication/current-customer) allows your application to identify logged-in customers. This identification is useful when you need to show customer-specific information. + +## Customers API + +The following endpoints are available: + +**GraphQL API** +- Customers GraphQL API + +**REST API** +- V3 customers REST API +- V2 customers REST API + +### V3 customers API + +The [V3 customers API](/docs/rest-management/customers) consists of customers, customer address books, [customer attributes](/docs/rest-management/customers/attributes), customer addresses, customer form fields, and other endpoints that help manage the customer object. + + +A customer can purchase from a store and create an account. The `customers` object comprises both customer details and a customer address book. + +Customer details include data preferences, attribute fields, form fields, and authentication. The V3 customers API can accomplish the same tasks as the existing V2 customers API, with greater efficiency. + + +The customer address book stores a collection of addresses entered by the customer. Add an address to capture the customer address details where you can ship orders if selected. + + +[Customer attributes](/docs/rest-management/customers/attributes) and [Customer attribute values](/docs/rest-management/customers/attribute-values) let you store additional information against a customer. Customer attributes define the name of a name-value pair and the type of information stored (for example, `"name": "Shoe size"`, `"type": "number"`). The Customer attribute values endpoint lets you define the values for the attributes. + + +<Callout type="info"> +#### Name-value pairs +Each customer can have up to 50 name-value pairs stored. +</Callout> + +Customer attributes are created separately from the customer. After the name and type are created, then the attributes can be added to the customer using the name-value pair. + +[Customer addresses](/docs/rest-management/customers/addresses) consist of a customers address and phone number. Customers can have multiple addresses stored against them. + +[Customer form field values](/docs/rest-management/customers/form-field-values) are fields on either the customer address or customer sign-up that accept any string data. For example, a sign-up field can have a customer input a wholesaler ID or, for an address field, have them input any special delivery instructions. For more information about creating form fields, see [Account sign up Fields](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields). + +You can access and edit the values for the fields on customer and customer address records using the API. + +### V2 Customers API + +The [V2 customers API](/docs/rest-management/customers-v2) consists of customers, customer addresses, and customer groups. The customer's object consists of basic customer information such as customer name and phone number. + + +[Customer addresses](/docs/rest-management/customers-v2/customer-addresses) consist of a customer's address and phone number. Customers can have multiple addresses stored against them. + +[Customer groups](/docs/rest-management/customers-v2/customer-groups) let you organize your customers, give them discounts, and restrict access to specific products or categories. Customer groups are not yet available on the V3 customers API. + + +## Differences between V2 and V3 customers APIs + +When resources are available through both APIs, we recommend using the V3 customers API as BigCommerce will eventually migrate all existing V2 resources to V3. + +This section covers the important differences between V2 and V3 customers APIs. + +### Making requests + +The V3 customers API is easier to use. It reduces the number of API calls needed to accomplish a task. For example, to create a new customer with the V2 API, you have to make multiple API calls. With the V3 API, you can create customer attributes and their address in one step, allowing you to batch-create multiple customers and their subresources in a single API call. + +**Create a customer** + +Single customer on V3: + +-`/customers` + +Single customer on V2: + +- `/customers/{{customer_id}}` +- `/customers/{{customer_id}}/addresses` + +### Queries + +With the V3 customers API, queries become a powerful tool. There is one `GET` endpoint per resource with filters to refine the request. The V2 API necessitates using a different endpoint to get customer subresources. + +**Get customer addresses** +Get customer address by name and company on V3: + +`/customers/addresses?company:in=bigcommerce,commongood&customer_id:in1,2,3` + +Get customer address by name and company on V2: + +`/customers/{{customer_id}}/addresses/{{customer_address_id}}` + +### Requests + +V3 Customers `POST` and `PUT` requests require an array object. + +```http filename="Example request: Update a customer V3" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +[ + { + "id": 12, + "email": "janedoe@example.com", + "first_name": "Jane", + "last_name": "Doe" + } +] +``` + +```http filename="Example request: Update a customer V2" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/customer_groups/{{customer_group_id}} +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "first_name": "Jane", + "email": "jane@example.com", + "phone": "1234567890" +} +``` + +### Upsert + +You can use the V3 customers API [Upsert customer attribute values](/docs/rest-management/customers/attribute-values#upsert-customer-attribute-values) operation to upsert form field values and customer attributes. Upsert looks for a match to the existing record and makes an update if there is one. If there is no match, it creates a new record. + +### Authentication object + +The V3 customers API offers two ways to set a customer's password: + +- You can set a new password under the `authentication > new_password` object in a `PUT` or `POST` request. +- To prompt a customer to reset their password, set `force_password_reset` to `true` under `authentication > new_password` object in a `PUT` or `POST` request. + +[Password confirmation](/docs/rest-management/subscribers#create-a-subscriber) and [validation](/docs/rest-management/customers-v2/customer-passwords#validate-a-password) are still available under the V2 customers API. + +## Subscribers API + +The subscribers API allows you to manage subscribers who have signed up for the store’s newsletter or have signed up for abandoned cart emails. +An important field to note is `consents` - this field determines whether the Subscriber signed up for marketing newsletter emails, abandoned cart emails, or both. This field can also be empty, meaning they have not subscribed to either (or may have opted out). + + +```http filename="Example request: Create a subscriber V3" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "email": "string@test.com", + "first_name": "string", + "last_name": "string", + "channel_id": 1, + "consents": ["marketing_newsletter", "abandoned_cart"], + "source": "storefront" +} +``` + +```js filename="Example request: Update a subscriber V3" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/customers/subscribers/1 +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "email": "string@test.com", + "first_name": "string", + "last_name": "string", + "channel_id": 1, + "consents": [], + "source": "order" +} +``` + +## Related resources + +### Articles + +* [Adding and Editing Fields in the Account sign up Form (Help Center)](https://support.bigcommerce.com/s/article/Editing-Form-Fields#account-fields) +* [Checkout Settings (Help Center)](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout#checkout-settings) + +### API + +* [Customer Login API](/docs/start/authentication/customer-login) +* [Current Customer API](/docs/start/authentication/current-customer) + +#### REST storefront API + +* [Customers](/docs/rest-storefront/customers) +* [Cookie consents](/docs/rest-storefront/consent) +* [Subscriptions](/docs/rest-storefront/subscriptions) + +#### REST management API V3 + +* [Customers](/docs/rest-management/customers) +* [Subscribers](/docs/rest-management/subscribers) +* [Validate customer credentials](/docs/rest-management/customers/validate-credentials#validate-a-customer-credentials) +* [Customer segmentation](/beta/customer-segmentation/rest-management) + +#### REST management API V2 + +* [Customer groups](/docs/rest-management/customers-v2/customer-groups#get-all-customer-groups) + +### Webhooks + +* [Customers](/docs/integrations/webhooks/events#customer) diff --git a/docs/api-docs/capture/capture.mdx b/docs/store-operations/draft/capture/capture.mdx similarity index 100% rename from docs/api-docs/capture/capture.mdx rename to docs/store-operations/draft/capture/capture.mdx diff --git a/docs/api-docs/void/void.mdx b/docs/store-operations/draft/void/void.mdx similarity index 100% rename from docs/api-docs/void/void.mdx rename to docs/store-operations/draft/void/void.mdx diff --git a/docs/api-docs/management-apis/email-templates/email-template-examples.mdx b/docs/store-operations/emails/examples.mdx similarity index 100% rename from docs/api-docs/management-apis/email-templates/email-template-examples.mdx rename to docs/store-operations/emails/examples.mdx diff --git a/docs/api-docs/management-apis/email-templates/overview.mdx b/docs/store-operations/emails/index.mdx similarity index 100% rename from docs/api-docs/management-apis/email-templates/overview.mdx rename to docs/store-operations/emails/index.mdx diff --git a/models/email_templates/combined/README.md b/docs/store-operations/emails/object-reference/README.md similarity index 100% rename from models/email_templates/combined/README.md rename to docs/store-operations/emails/object-reference/README.md diff --git a/models/email_templates/combined/abandoned_cart_email_deprecated.yml b/docs/store-operations/emails/object-reference/abandoned-cart-deprecated.yml similarity index 100% rename from models/email_templates/combined/abandoned_cart_email_deprecated.yml rename to docs/store-operations/emails/object-reference/abandoned-cart-deprecated.yml diff --git a/models/email_templates/combined/abandoned_cart_email.yml b/docs/store-operations/emails/object-reference/abandoned-cart.yml similarity index 100% rename from models/email_templates/combined/abandoned_cart_email.yml rename to docs/store-operations/emails/object-reference/abandoned-cart.yml diff --git a/models/email_templates/combined/account_details_changed_email.yml b/docs/store-operations/emails/object-reference/account-details-changed.yml similarity index 100% rename from models/email_templates/combined/account_details_changed_email.yml rename to docs/store-operations/emails/object-reference/account-details-changed.yml diff --git a/models/email_templates/combined/account_reset_password_email.yml b/docs/store-operations/emails/object-reference/account-reset-password.yml similarity index 100% rename from models/email_templates/combined/account_reset_password_email.yml rename to docs/store-operations/emails/object-reference/account-reset-password.yml diff --git a/models/email_templates/combined/combined_order_status_email.yml b/docs/store-operations/emails/object-reference/combined-order-status.yml similarity index 100% rename from models/email_templates/combined/combined_order_status_email.yml rename to docs/store-operations/emails/object-reference/combined-order-status.yml diff --git a/models/email_templates/combined/create_account_email.yml b/docs/store-operations/emails/object-reference/create-account.yml similarity index 100% rename from models/email_templates/combined/create_account_email.yml rename to docs/store-operations/emails/object-reference/create-account.yml diff --git a/models/email_templates/combined/create_guest_account_email.yml b/docs/store-operations/emails/object-reference/create-guest-account.yml similarity index 100% rename from models/email_templates/combined/create_guest_account_email.yml rename to docs/store-operations/emails/object-reference/create-guest-account.yml diff --git a/models/email_templates/data/abandoned_cart_email.json b/docs/store-operations/emails/object-reference/data/abandoned_cart_email.json similarity index 97% rename from models/email_templates/data/abandoned_cart_email.json rename to docs/store-operations/emails/object-reference/data/abandoned_cart_email.json index 3f7ad732e..fe6462cf8 100644 --- a/models/email_templates/data/abandoned_cart_email.json +++ b/docs/store-operations/emails/object-reference/data/abandoned_cart_email.json @@ -1,39 +1,39 @@ -{ - "abandoned_cart": { - "body": "You recently visited our online store and we noticed that you didn't complete your order.\n <br>To complete your order right now, just click on the link below:\n <a href=\"#link\">Complete your order</a>", - "unsubscribe_link": "#unsubscribe-link" - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "unsubscribe": "<a href=\"{link}\">Unsubscribe</a> from future emails like this" - } - } +{ + "abandoned_cart": { + "body": "You recently visited our online store and we noticed that you didn't complete your order.\n <br>To complete your order right now, just click on the link below:\n <a href=\"#link\">Complete your order</a>", + "unsubscribe_link": "#unsubscribe-link" + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "unsubscribe": "<a href=\"{link}\">Unsubscribe</a> from future emails like this" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/account_details_changed_email.json b/docs/store-operations/emails/object-reference/data/account_details_changed_email.json similarity index 100% rename from models/email_templates/data/account_details_changed_email.json rename to docs/store-operations/emails/object-reference/data/account_details_changed_email.json diff --git a/models/email_templates/data/account_reset_password_email.json b/docs/store-operations/emails/object-reference/data/account_reset_password_email.json similarity index 100% rename from models/email_templates/data/account_reset_password_email.json rename to docs/store-operations/emails/object-reference/data/account_reset_password_email.json diff --git a/models/email_templates/data/combined_order_status_email.json b/docs/store-operations/emails/object-reference/data/combined_order_status_email.json similarity index 100% rename from models/email_templates/data/combined_order_status_email.json rename to docs/store-operations/emails/object-reference/data/combined_order_status_email.json diff --git a/models/email_templates/data/create_account_email.json b/docs/store-operations/emails/object-reference/data/create_account_email.json similarity index 97% rename from models/email_templates/data/create_account_email.json rename to docs/store-operations/emails/object-reference/data/create_account_email.json index 41ec1ba03..5e7afe8e7 100644 --- a/models/email_templates/data/create_account_email.json +++ b/docs/store-operations/emails/object-reference/data/create_account_email.json @@ -1,44 +1,44 @@ -{ - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "Thanks for registering at {store}", - "hello": "Hello {name},", - "message": "Thank you for creating your account at {name}.", - "details_title": "Account details", - "email_label": "Email Address:", - "password_label": "Password:", - "password_placeholder": "[The password you specified]", - "sign_in": "Sign in to account", - "help": "If you have any questions regarding your account, click 'Reply' in your email client and we'll be only too happy to help.", - "go_shopping": "Go shopping" - } - } +{ + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "Thanks for registering at {store}", + "hello": "Hello {name},", + "message": "Thank you for creating your account at {name}.", + "details_title": "Account details", + "email_label": "Email Address:", + "password_label": "Password:", + "password_placeholder": "[The password you specified]", + "sign_in": "Sign in to account", + "help": "If you have any questions regarding your account, click 'Reply' in your email client and we'll be only too happy to help.", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/create_guest_account_email.json b/docs/store-operations/emails/object-reference/data/create_guest_account_email.json similarity index 97% rename from models/email_templates/data/create_guest_account_email.json rename to docs/store-operations/emails/object-reference/data/create_guest_account_email.json index 8512f60cf..b645f2ae4 100644 --- a/models/email_templates/data/create_guest_account_email.json +++ b/docs/store-operations/emails/object-reference/data/create_guest_account_email.json @@ -1,43 +1,43 @@ -{ - "guest_account": { - "link": "#reset-password-link" - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "Welcome to {name}", - "hello": "Hello {name},", - "message": "For your convenience, we've created you an account on {store} so you can check the status of your order and checkout quicker in the future.", - "instruction": "To login you will need to follow the link below to nominate your password:", - "help": "If you have any questions regarding your account, click 'Reply' in your email client and we'll be only too happy to help.", - "go_shopping": "Go shopping" - } - } +{ + "guest_account": { + "link": "#reset-password-link" + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "Welcome to {name}", + "hello": "Hello {name},", + "message": "For your convenience, we've created you an account on {store} so you can check the status of your order and checkout quicker in the future.", + "instruction": "To login you will need to follow the link below to nominate your password:", + "help": "If you have any questions regarding your account, click 'Reply' in your email client and we'll be only too happy to help.", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/gift_certificate_email.json b/docs/store-operations/emails/object-reference/data/gift_certificate_email.json similarity index 97% rename from models/email_templates/data/gift_certificate_email.json rename to docs/store-operations/emails/object-reference/data/gift_certificate_email.json index 9fe97570f..f3880d393 100644 --- a/models/email_templates/data/gift_certificate_email.json +++ b/docs/store-operations/emails/object-reference/data/gift_certificate_email.json @@ -1,55 +1,55 @@ -{ - "certificate": { - "code": "FA-21465", - "to_name": "John", - "to_email": "john.f@example.com", - "from_name": "John Wick", - "from_email": "johnwick@example.com", - "amount": "12.34", - "redeem_link": "#redeem-link", - "expiry_date": { - "formatted": "03/01/2121", - "value": 1614615821 - } - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "You have received a Gift Certificate for {name}", - "hello": "Dear {name},", - "message": "{from_name} ({from_email}) has sent you a {amount} gift certificate for <a href=\"{path}\">{name}</a>.", - "expiry_info": "You have until {date} to use this gift certificate before it expires.", - "instruction": "For instructions on how to redeem your gift certificate please <a href=\"{link}\">click here</a>.", - "attached": "Your gift certificate is attached to this email.", - "warning": "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable.", - "go_shopping": "Go shopping" - } - } +{ + "certificate": { + "code": "FA-21465", + "to_name": "John", + "to_email": "john.f@example.com", + "from_name": "John Wick", + "from_email": "johnwick@example.com", + "amount": "12.34", + "redeem_link": "#redeem-link", + "expiry_date": { + "formatted": "03/01/2121", + "value": 1614615821 + } + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "You have received a Gift Certificate for {name}", + "hello": "Dear {name},", + "message": "{from_name} ({from_email}) has sent you a {amount} gift certificate for <a href=\"{path}\">{name}</a>.", + "expiry_info": "You have until {date} to use this gift certificate before it expires.", + "instruction": "For instructions on how to redeem your gift certificate please <a href=\"{link}\">click here</a>.", + "attached": "Your gift certificate is attached to this email.", + "warning": "Please download or print a copy of your gift certificate for safe keeping as gift certificates are non-transferable.", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/global.json b/docs/store-operations/emails/object-reference/data/global.json similarity index 95% rename from models/email_templates/data/global.json rename to docs/store-operations/emails/object-reference/data/global.json index 55c5a68b9..5b7732b78 100644 --- a/models/email_templates/data/global.json +++ b/docs/store-operations/emails/object-reference/data/global.json @@ -1,30 +1,30 @@ -{ - "store" : { - "name" : "string", - "domain_name" : "string", - "logo" : { - "title" : "string", - "name" : "string", - "url" : "string" - } , - "ssl_path" : "string", - "cdn_path" : "string", - "image_directory" : "string", - "img_path" : "string", - "path_normal" : "string", - "path" : "string", - "address" : "string", - "language" : { - "code" : "string" , - "direction" : "string" - } - }, - "customer" : { - "first_name" : "string", - "full_name" : "string", - "email" : "string" - }, - "misc" : { - "year" : "int" - } +{ + "store" : { + "name" : "string", + "domain_name" : "string", + "logo" : { + "title" : "string", + "name" : "string", + "url" : "string" + } , + "ssl_path" : "string", + "cdn_path" : "string", + "image_directory" : "string", + "img_path" : "string", + "path_normal" : "string", + "path" : "string", + "address" : "string", + "language" : { + "code" : "string" , + "direction" : "string" + } + }, + "customer" : { + "first_name" : "string", + "full_name" : "string", + "email" : "string" + }, + "misc" : { + "year" : "int" + } } \ No newline at end of file diff --git a/models/email_templates/data/invoice_email.json b/docs/store-operations/emails/object-reference/data/invoice_email.json similarity index 96% rename from models/email_templates/data/invoice_email.json rename to docs/store-operations/emails/object-reference/data/invoice_email.json index a78b59f31..c8f1b3668 100644 --- a/models/email_templates/data/invoice_email.json +++ b/docs/store-operations/emails/object-reference/data/invoice_email.json @@ -1,180 +1,180 @@ -{ - "order": { - "id": 1, - "customer_message": "Order custom message", - "customer_id": 11, - "date_placed": { - "formatted": "11th Feb 2021", - "value": 1613060604 - }, - "account_order_status_url": "#url", - "shipping": { - "methods": [], - "address": { - "email": "test@gmail.com", - "phone": "+112233445566", - "first_name": "John", - "last_name": "Wick", - "company": "MyCompany", - "country": "", - "city": "La", - "state": "", - "zip": "1622", - "address_lines": [], - "custom_fields": [] - } - }, - "products": [ - { - "name": "Test product name", - "quantity": 2, - "sku": "SF42", - "address_lines": [], - "address_id": 0, - "options": { - "Size": "XL" - }, - "download_url": "", - "thumbnail_url": "/test.jpg", - "event": { - "name": "", - "date": { - "value": 0, - "formatted": "" - } - }, - "price": { - "value": 250.1, - "formatted": "250.1" - }, - "total": { - "value": 250.1, - "formatted": "250.1" - }, - "preorder": { - "is_preorder": false, - "message": "", - "date": { - "value": 0, - "formatted": "" - } - }, - "attribute_lines": [], - "configurable_fields": [] - } - ], - "payment": { - "is_test": false, - "provider_name": "PaymentMethod", - "offline_payment_message": "", - "gateway_amount": { - "formatted": "", - "value": 0 - } - }, - "billing": { - "is_managed_by_amazon": false, - "address": { - "email": "test@gmail.com", - "phone": "+112233445566", - "first_name": "John", - "last_name": "Wick", - "company": "MyCompany", - "country": "", - "city": "La", - "state": "", - "zip": "1622", - "address_lines": [], - "custom_fields": [] - } - }, - "total_rows": [ - { - "label": "Total", - "price": { - "value": 250.1, - "formatted": "250.1" - }, - "shipping_discounts": [] - } - ], - "total_cost": { - "formatted": "100.0$", - "value": 100 - }, - "meta": { - "mandate_url": "", - "shipping_addresses_num": 1, - "show_immediate_download": false - } - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "comment_label": "Order Instructions/Comments", - "order_id_line": "Your order ID is <strong>#{id}</strong>.", - "view_summary": "A summary of your order is shown below. To view the status of your order <a href='{link}'>click here</a>.", - "sepa": "SEPA Direct Debit Mandate", - "shipment_to_multiple_addresses": "(Order will be shipped to multiple addresses)", - "shipping_immediate_download": "Immediate download after completion of payment.", - "shipping_address_label": "Shipping Address", - "immediate_download": "Immediate Download", - "email": "Email", - "billing_address_managed_by_amazon": "Managed by Amazon", - "billing_address_label": "Billing Address", - "pending_payment": "Your order requires payment before it can be finalized. Details on how to pay are shown below.", - "how_to_pay": "Your order requires payment before it can be finalized. Details on how to pay are shown below.", - "pay_for_order_help": "Once you've provided payment your order will be completed.", - "order_total": "The outstanding balance of your order is {amount}", - "cart_items": "Cart Items", - "sku": "SKU", - "quantity": "Qty", - "item_price": "Item Price", - "item_total": "Item Total", - "payment_method": "Payment Method", - "no_payment_taken_in_test_mode": "<b>Please Note</b>: No money was taken for this order, because the payment provider is in test mode.", - "download_files": "Download Files", - "preorder": "This product is available for pre-order only", - "download_available_after_payment": "Items available for immediate download after completion of payment", - "shipped_to": "Items shipped to {address}", - "shipping_discount": "{price} off using {code} Coupon Code", - "thanks_for_your_order": "Thanks for Your Order", - "your_order_contains": "Your Order Contains...", - "shipping_method": "Shipping Method", - "shipping_to_address": "Shipping to Address", - "your_order_will_be_shipped_by": "Your Order Will Be Shipped By...", - "total_cost": "Total Cost", - "items": "Items", - "total": "Total", - "price": "Price", - "email_address": "Email Address" - } - } +{ + "order": { + "id": 1, + "customer_message": "Order custom message", + "customer_id": 11, + "date_placed": { + "formatted": "11th Feb 2021", + "value": 1613060604 + }, + "account_order_status_url": "#url", + "shipping": { + "methods": [], + "address": { + "email": "test@gmail.com", + "phone": "+112233445566", + "first_name": "John", + "last_name": "Wick", + "company": "MyCompany", + "country": "", + "city": "La", + "state": "", + "zip": "1622", + "address_lines": [], + "custom_fields": [] + } + }, + "products": [ + { + "name": "Test product name", + "quantity": 2, + "sku": "SF42", + "address_lines": [], + "address_id": 0, + "options": { + "Size": "XL" + }, + "download_url": "", + "thumbnail_url": "/test.jpg", + "event": { + "name": "", + "date": { + "value": 0, + "formatted": "" + } + }, + "price": { + "value": 250.1, + "formatted": "250.1" + }, + "total": { + "value": 250.1, + "formatted": "250.1" + }, + "preorder": { + "is_preorder": false, + "message": "", + "date": { + "value": 0, + "formatted": "" + } + }, + "attribute_lines": [], + "configurable_fields": [] + } + ], + "payment": { + "is_test": false, + "provider_name": "PaymentMethod", + "offline_payment_message": "", + "gateway_amount": { + "formatted": "", + "value": 0 + } + }, + "billing": { + "is_managed_by_amazon": false, + "address": { + "email": "test@gmail.com", + "phone": "+112233445566", + "first_name": "John", + "last_name": "Wick", + "company": "MyCompany", + "country": "", + "city": "La", + "state": "", + "zip": "1622", + "address_lines": [], + "custom_fields": [] + } + }, + "total_rows": [ + { + "label": "Total", + "price": { + "value": 250.1, + "formatted": "250.1" + }, + "shipping_discounts": [] + } + ], + "total_cost": { + "formatted": "100.0$", + "value": 100 + }, + "meta": { + "mandate_url": "", + "shipping_addresses_num": 1, + "show_immediate_download": false + } + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "comment_label": "Order Instructions/Comments", + "order_id_line": "Your order ID is <strong>#{id}</strong>.", + "view_summary": "A summary of your order is shown below. To view the status of your order <a href='{link}'>click here</a>.", + "sepa": "SEPA Direct Debit Mandate", + "shipment_to_multiple_addresses": "(Order will be shipped to multiple addresses)", + "shipping_immediate_download": "Immediate download after completion of payment.", + "shipping_address_label": "Shipping Address", + "immediate_download": "Immediate Download", + "email": "Email", + "billing_address_managed_by_amazon": "Managed by Amazon", + "billing_address_label": "Billing Address", + "pending_payment": "Your order requires payment before it can be finalized. Details on how to pay are shown below.", + "how_to_pay": "Your order requires payment before it can be finalized. Details on how to pay are shown below.", + "pay_for_order_help": "Once you've provided payment your order will be completed.", + "order_total": "The outstanding balance of your order is {amount}", + "cart_items": "Cart Items", + "sku": "SKU", + "quantity": "Qty", + "item_price": "Item Price", + "item_total": "Item Total", + "payment_method": "Payment Method", + "no_payment_taken_in_test_mode": "<b>Please Note</b>: No money was taken for this order, because the payment provider is in test mode.", + "download_files": "Download Files", + "preorder": "This product is available for pre-order only", + "download_available_after_payment": "Items available for immediate download after completion of payment", + "shipped_to": "Items shipped to {address}", + "shipping_discount": "{price} off using {code} Coupon Code", + "thanks_for_your_order": "Thanks for Your Order", + "your_order_contains": "Your Order Contains...", + "shipping_method": "Shipping Method", + "shipping_to_address": "Shipping to Address", + "your_order_will_be_shipped_by": "Your Order Will Be Shipped By...", + "total_cost": "Total Cost", + "items": "Items", + "total": "Total", + "price": "Price", + "email_address": "Email Address" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/order_message_notification.json b/docs/store-operations/emails/object-reference/data/order_message_notification.json similarity index 97% rename from models/email_templates/data/order_message_notification.json rename to docs/store-operations/emails/object-reference/data/order_message_notification.json index f687de208..da68ad129 100644 --- a/models/email_templates/data/order_message_notification.json +++ b/docs/store-operations/emails/object-reference/data/order_message_notification.json @@ -1,43 +1,43 @@ -{ - "notification": { - "message": "Message from the merchant", - "link": "https://my-dev-store-97434969.store.bcdev/account.php?action=inbox" - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "New Reply to your Order Message", - "hello": "Hello {name},", - "message": "{name} has sent you a message about your order.", - "reply": "Reply", - "go_shopping": "Go shopping" - } - } +{ + "notification": { + "message": "Message from the merchant", + "link": "https://my-dev-store-97434969.store.bcdev/account.php?action=inbox" + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "New Reply to your Order Message", + "hello": "Hello {name},", + "message": "{name} has sent you a message about your order.", + "reply": "Reply", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/passwordless_login_email.json b/docs/store-operations/emails/object-reference/data/passwordless_login_email.json similarity index 97% rename from models/email_templates/data/passwordless_login_email.json rename to docs/store-operations/emails/object-reference/data/passwordless_login_email.json index 12817a313..1813918a2 100644 --- a/models/email_templates/data/passwordless_login_email.json +++ b/docs/store-operations/emails/object-reference/data/passwordless_login_email.json @@ -1,43 +1,43 @@ -{ - "passwordless_login": { - "link": "#sign-in-link" - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "Please click the link below to sign in to your account with {name}", - "message": "You have requested a sign-in link. Please <a href=\"{link}\">click here to sign in</a> and continue.", - "alternatively": "Alternatively, paste the following link in your browser:", - "login_request": "This login is for {name} if you did not request this link, please ignore this email.", - "secure": "Your account is still secure.", - "go_shopping": "Go shopping" - } - } +{ + "passwordless_login": { + "link": "#sign-in-link" + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "Please click the link below to sign in to your account with {name}", + "message": "You have requested a sign-in link. Please <a href=\"{link}\">click here to sign in</a> and continue.", + "alternatively": "Alternatively, paste the following link in your browser:", + "login_request": "This login is for {name} if you did not request this link, please ignore this email.", + "secure": "Your account is still secure.", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/product_review_email.json b/docs/store-operations/emails/object-reference/data/product_review_email.json similarity index 97% rename from models/email_templates/data/product_review_email.json rename to docs/store-operations/emails/object-reference/data/product_review_email.json index 6e2ea5dd9..570f260f4 100644 --- a/models/email_templates/data/product_review_email.json +++ b/docs/store-operations/emails/object-reference/data/product_review_email.json @@ -1,51 +1,51 @@ -{ - "review": { - "products": [ - { - "name": "Name of Product", - "sku": "FA44", - "link": "#review-link" - } - ], - "unsubscribe_link": "#unsubscribe-link" - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "Review products you've recently purchased", - "hello": "Hello {name},", - "message": "Thanks for your recent order with us!", - "instruction": "If you have a few minutes, we'd like to invite you to review the products you ordered. Just click on the link below to write a review and share your opinion with other shoppers.", - "review_text": "Review product", - "thanks": "Thanks in advance for taking the time to review the products you purchased!", - "go_shopping": "Go shopping" - } - } +{ + "review": { + "products": [ + { + "name": "Name of Product", + "sku": "FA44", + "link": "#review-link" + } + ], + "unsubscribe_link": "#unsubscribe-link" + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "Review products you've recently purchased", + "hello": "Hello {name},", + "message": "Thanks for your recent order with us!", + "instruction": "If you have a few minutes, we'd like to invite you to review the products you ordered. Just click on the link below to write a review and share your opinion with other shoppers.", + "review_text": "Review product", + "thanks": "Thanks in advance for taking the time to review the products you purchased!", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/return_confirmation_email.json b/docs/store-operations/emails/object-reference/data/return_confirmation_email.json similarity index 96% rename from models/email_templates/data/return_confirmation_email.json rename to docs/store-operations/emails/object-reference/data/return_confirmation_email.json index 5de372931..2326106fb 100644 --- a/models/email_templates/data/return_confirmation_email.json +++ b/docs/store-operations/emails/object-reference/data/return_confirmation_email.json @@ -1,56 +1,56 @@ -{ - "return": { - "return_id": "123", - "reason": "reason of return", - "action": "action", - "comments": "sample comment", - "order_id": "321", - "products": [ - { - "name": "Shower Gel", - "quantity": 3 - } - ] - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "confirmation": "Confirmation for Return Request for Order ID", - "summary": "A summary of your return is shown below. To view the status of this return", - "clickHere": "click here", - "reason": "Return Reason", - "action": "Return Action", - "comments": "Your Comments", - "contains": "Your Return Request Contains the Following Items...", - "items": "Return Items", - "quantity": "Qty" - } - } +{ + "return": { + "return_id": "123", + "reason": "reason of return", + "action": "action", + "comments": "sample comment", + "order_id": "321", + "products": [ + { + "name": "Shower Gel", + "quantity": 3 + } + ] + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "confirmation": "Confirmation for Return Request for Order ID", + "summary": "A summary of your return is shown below. To view the status of this return", + "clickHere": "click here", + "reason": "Return Reason", + "action": "Return Action", + "comments": "Your Comments", + "contains": "Your Return Request Contains the Following Items...", + "items": "Return Items", + "quantity": "Qty" + } + } } \ No newline at end of file diff --git a/models/email_templates/data/return_status_change_email.json b/docs/store-operations/emails/object-reference/data/return_status_change_email.json similarity index 97% rename from models/email_templates/data/return_status_change_email.json rename to docs/store-operations/emails/object-reference/data/return_status_change_email.json index d231f47f8..2930fae64 100644 --- a/models/email_templates/data/return_status_change_email.json +++ b/docs/store-operations/emails/object-reference/data/return_status_change_email.json @@ -1,71 +1,71 @@ -{ - "return": { - "id": 1, - "reason": "reason of return", - "action": "action", - "comments": "sample comment", - "product": { - "name": "ProductName", - "quantity": 2, - "thumbnail_url": "" - }, - "status": { - "value": 1, - "formatted": "Pending" - }, - "store_credit": { - "value": 10.1, - "formatted": "$10.1 USD" - }, - "link": "https://my-dev-store-97434969.store.bcdev/account.php?action=view_returns", - "instructions": "" - }, - "order": { - "id": 1 - }, - "store": { - "name": "My Dev Store 97434969", - "domain_name": "my-dev-store-97434969.store.bcdev", - "logo": { - "title": "[= My Dev Store 97434969 =]", - "name": "avatar-2020_1612860757__16350.jpeg", - "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" - }, - "ssl_path": "https://my-dev-store-97434969.store.bcdev", - "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", - "image_directory": "product_images", - "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", - "path_normal": "https://my-dev-store-97434969.store.bcdev", - "path": "https://my-dev-store-97434969.store.bcdev", - "address": "", - "language": { - "code": "en", - "direction": "ltr" - } - }, - "customer": { - "first_name": "John", - "full_name": "John Jr", - "email": "john.f@example.com" - }, - "misc": { - "year": 2021 - }, - "translations": { - "en": { - "title": "Return request status changed", - "hello": "Hello {name},", - "message": "The status of your return request for order #{id} has changed to <strong>{status}</strong>.", - "received_credit": "You have received a store credit of {credits} To use it, simply place your order and you will be able to choose store credit as the payment method when it comes time to pay for your order.", - "details_title": "Return details", - "return_reason": "Return reason:", - "return_action": "Return action:", - "return_comments": "Your comments:", - "check_status": "Check return status", - "products_title": "Return items", - "quantity": "Qty:", - "instructions_title": "Return Instructions:", - "go_shopping": "Go shopping" - } - } +{ + "return": { + "id": 1, + "reason": "reason of return", + "action": "action", + "comments": "sample comment", + "product": { + "name": "ProductName", + "quantity": 2, + "thumbnail_url": "" + }, + "status": { + "value": 1, + "formatted": "Pending" + }, + "store_credit": { + "value": 10.1, + "formatted": "$10.1 USD" + }, + "link": "https://my-dev-store-97434969.store.bcdev/account.php?action=view_returns", + "instructions": "" + }, + "order": { + "id": 1 + }, + "store": { + "name": "My Dev Store 97434969", + "domain_name": "my-dev-store-97434969.store.bcdev", + "logo": { + "title": "[= My Dev Store 97434969 =]", + "name": "avatar-2020_1612860757__16350.jpeg", + "url": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96/product_images/avatar-2020_1612860757__16350.jpeg" + }, + "ssl_path": "https://my-dev-store-97434969.store.bcdev", + "cdn_path": "https://valeryderived-cloud-dev-vm.store.bcdev/store/f1kr2akw96", + "image_directory": "product_images", + "img_path": "https://valeryderived-cloud-dev-vm.store.bcdev/r08d84bb67d250c7624502ed76d8e0bafb1a5cacf/g-themes/ClassicNext/images", + "path_normal": "https://my-dev-store-97434969.store.bcdev", + "path": "https://my-dev-store-97434969.store.bcdev", + "address": "", + "language": { + "code": "en", + "direction": "ltr" + } + }, + "customer": { + "first_name": "John", + "full_name": "John Jr", + "email": "john.f@example.com" + }, + "misc": { + "year": 2021 + }, + "translations": { + "en": { + "title": "Return request status changed", + "hello": "Hello {name},", + "message": "The status of your return request for order #{id} has changed to <strong>{status}</strong>.", + "received_credit": "You have received a store credit of {credits} To use it, simply place your order and you will be able to choose store credit as the payment method when it comes time to pay for your order.", + "details_title": "Return details", + "return_reason": "Return reason:", + "return_action": "Return action:", + "return_comments": "Your comments:", + "check_status": "Check return status", + "products_title": "Return items", + "quantity": "Qty:", + "instructions_title": "Return Instructions:", + "go_shopping": "Go shopping" + } + } } \ No newline at end of file diff --git a/models/email_templates/README.md b/docs/store-operations/emails/object-reference/draft/README.md similarity index 97% rename from models/email_templates/README.md rename to docs/store-operations/emails/object-reference/draft/README.md index e99eed9d0..3d6690d38 100644 --- a/models/email_templates/README.md +++ b/docs/store-operations/emails/object-reference/draft/README.md @@ -1,32 +1,32 @@ -# Email Template Objects - -Object schemas for handlebars email templates. - -## Directory structure - -```shell -. -├── data # json data for generating and updating yaml schema -├── _all.yml # Groups models together for docs -├── account_details_changed_email.yml # Individual email template models -├── ... -``` - -## Updating models - -To generate a new model from json data and overwrite the existing schema file: - -1. Copy and paste template `data-*.json` from [localization-tools](https://github.com/bigcommerce/localization-tools/blob/master/email-check/modules/email-templates/types/abandoned_cart_email/data-0.json) to `models/_json/email_templates`. -2. Use `models/json2schema.py` to convert the json data to a yaml schema. - -Example: - -```bash -cat data.json | python json2schema.py > schema.yml -``` - -Bash for overwriting all email template models: - -```bash -for f in models/email_templates/data/*.json; do cat $f | python models/json2schema.py > ${f%.*}.yml; mv ${f%.*}.yml models/email_templates/; done +# Email Template Objects + +Object schemas for handlebars email templates. + +## Directory structure + +```shell +. +├── data # json data for generating and updating yaml schema +├── _all.yml # Groups models together for docs +├── account_details_changed_email.yml # Individual email template models +├── ... +``` + +## Updating models + +To generate a new model from json data and overwrite the existing schema file: + +1. Copy and paste template `data-*.json` from [localization-tools](https://github.com/bigcommerce/localization-tools/blob/master/email-check/modules/email-templates/types/abandoned_cart_email/data-0.json) to `models/_json/email_templates`. +2. Use `models/json2schema.py` to convert the json data to a yaml schema. + +Example: + +```bash +cat data.json | python json2schema.py > schema.yml +``` + +Bash for overwriting all email template models: + +```bash +for f in models/email_templates/data/*.json; do cat $f | python models/json2schema.py > ${f%.*}.yml; mv ${f%.*}.yml models/email_templates/; done ``` \ No newline at end of file diff --git a/models/email_templates/_all.yml b/docs/store-operations/emails/object-reference/draft/_all.yml similarity index 96% rename from models/email_templates/_all.yml rename to docs/store-operations/emails/object-reference/draft/_all.yml index fb37bee75..3b1991123 100644 --- a/models/email_templates/_all.yml +++ b/docs/store-operations/emails/object-reference/draft/_all.yml @@ -1,2368 +1,2368 @@ -title: Handlebars Email Template Objects -type: object -properties: - Global Email Template Object: - title: Global Email Template Object - description: Data objects across all email templates. - type: object - properties: - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - Abandoned Cart: - title: Abandoned Cart Email Template - description: Abandoned cart email triggers when a shopper doesnʼt complete an order. - type: object - oneOf: - - properties: - notification: - type: array - items: - type: object - properties: - unsubscribe_link: - type: string - checkout_link: - type: string - coupon: - type: array - items: - type: object - properties: - code: - type: string - type: - type: array - items: - type: object - properties: - value: - type: string - formatted: - type: string - amount: - type: array - items: - type: object - properties: - value: - type: number - format: float - formatted: - type: string - cart: - type: array - items: - type: object - properties: - products: - type: array - items: - type: object - properties: - '0': - type: array - items: - type: object - properties: - id: - type: number - url: - type: string - name: - type: string - quantity: - type: integer - sku: - type: string - thumbnail: - type: string - attributes: - type: array - items: - type: object - properties: - '0': - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - '1': - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - price: - type: array - items: - type: object - properties: - value: - type: number - format: float - formatted: - type: string - type: - type: array - items: - type: object - properties: - value: - type: integer - formatted: - type: string - '1': - type: array - items: - type: object - properties: - id: - type: number - url: - type: string - name: - type: string - quantity: - type: integer - sku: - type: string - thumbnail: - type: string - attributes: - type: array - items: - type: object - properties: - '0': - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - '1': - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - price: - type: array - items: - type: object - properties: - value: - type: number - format: float - formatted: - type: string - type: - type: array - items: - type: object - properties: - value: - type: integer - formatted: - type: string - store: - type: array - items: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: array - items: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - path: - type: string - address: - type: string - phone_number: - type: string - language: - type: array - items: - type: object - properties: - code: - type: string - direction: - type: string - customer: - type: array - items: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - id: - type: number - name: - type: string - misc: - type: array - items: - type: object - properties: - year: - type: integer - - deprecated: true - properties: - abandoned_cart: - type: object - title: deprecated - deprecated: true - properties: - body: - type: string - unsubscribe_link: - type: string - store: - type: object - deprecated: true - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - deprecated: true - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - deprecated: true - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - deprecated: true - properties: - year: - type: integer - translations: - type: object - deprecated: true - properties: - en: - type: object - properties: - unsubscribe: - type: string - examples: - - notification: - - unsubscribe_link: string - checkout_link: string - coupon: - - code: string - type: - - value: string - formatted: string - amount: - - value: 0 - formatted: string - cart: - - products: - - '0': - - id: 0 - url: string - name: string - quantity: 0 - sku: string - thumbnail: string - attributes: - - '0': - - name: string - value: string - '1': - - name: string - value: string - price: - - value: 0 - formatted: string - type: - - value: 0 - formatted: string - '1': - - id: 0 - url: string - name: string - quantity: 0 - sku: string - thumbnail: string - attributes: - - '0': - - name: string - value: string - '1': - - name: string - value: string - price: - - value: 0 - formatted: string - type: - - value: 0 - formatted: string - store: - - name: string - domain_name: string - logo: - - title: string - name: string - url: string - ssl_path: string - cdn_path: string - image_directory: string - img_path: string - path_normal: string - path: string - address: string - phone_number: string - language: - - code: string - direction: string - customer: - - first_name: string - full_name: string - email: string - group: - - id: 0 - name: string - misc: - - year: 0 - Account Settings Edited: - title: Account Settings Edited Email Template - description: Account settings email triggers when the store admin or a customer edits account settings. - type: object - properties: - details_changed: - type: object - properties: - fields: - type: array - items: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - warning: - type: string - thanks: - type: string - security: - type: string - go_shopping: - type: string - Password Reset: - title: Password Reset Email Template - description: Password reset email triggers when a customer resets their account password on the customer details page. - type: object - properties: - reset_password: - type: object - properties: - link: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - message: - type: string - go_shopping: - type: string - Order Status Update: - title: Order Status Update Email Template - description: Order status update email triggers when the status of an order change. - type: object - properties: - order: - type: object - properties: - id: - type: integer - new_status: - type: string - example: 'Incomplete, Pending, Shipped, Partially Shipped, Refunded, Cancelled, Declined, Awaiting Payment, Awaiting, Awaiting Shipment, Completed, Awaiting Fulfillment, Manual Verification Required, Disputed, Partially Refunded' - new_formatted_status: - type: string - example: 'Shipment123, PendingOrder345, Cancelled0223222, Awaiting Payment in Store' - total: - type: object - properties: - value: - type: float - formatted: - type: string - refund: - type: object - properties: - value: - type: float - formatted: - type: string - date_placed: - type: object - properties: - value: - type: integer - formatted: - type: string - payment_method: - type: string - link: - type: string - customer_name: - type: string - downloadable_products: - type: array - items: - type: object - properties: - name: - type: string - options: - type: string - quantity: - type: integer - link: - type: string - thumbnail: - type: string - products: - type: array - items: - type: object - description: Products that have been shipped, i.e., have been added to a consignment. - example: [Partially Shipped, Completed, Shipped, Refunded] - properties: - name: - type: string - sku: - type: string - price: - type: string - quantity: - type: integer - thumbnail: - type: string - brand: - type: string - tracking: - type: array - items: - type: object - properties: - id: - type: string - shipping_method: - type: string - link: - type: string - unshipped_products: - type: array - description: Products that have not been shipped or added to a shipping consignment. - example: [Awaiting Fulfillment, Awaiting Shipment, Awaiting Pickup, Partially Shipped, Completed, Shipped, Refunded] - ready_for_pickup_products: - type: array - description: Products that have been added to a BOPIS pickup consignment and marked as ready for pickup. - items: - type: object - properties: - name: - type: string - sku: - type: string - quantity: - type: integer - thumbnail: - type: string - price: - type: string - brand: - type: string - picked_up_products: - type: array - description: Products that have been added to a BOPIS pickup consignment and marked as picked up. - items: - type: object - properties: - name: - type: string - sku: - type: string - quantity: - type: integer - thumbnail: - type: string - price: - type: string - brand: - type: string - pickup_methods: - type: array - items: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - prodname: - type: string - example: "Product Name" - prodsku: - type: string - example: "Product SKU" - fr: - type: object - properties: - store: - type: string - example: "Boutique" - Account Created: - title: Account Created Email Template - description: Account created email triggers when a customer or store admin creates their account. - type: object - properties: - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - details_title: - type: string - email_label: - type: string - password_label: - type: string - password_placeholder: - type: string - sign_in: - type: string - help: - type: string - go_shopping: - type: string - Account Created Guest: - title: Create Guest Account Email Template - description: Guest account created email triggers when a customer or store admin creates a guest account. - type: object - properties: - guest_account: - type: object - properties: - link: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - instruction: - type: string - help: - type: string - go_shopping: - type: string - Gift Certificate Recipient: - title: Gift Certificate Email Template - description: Gift certificate recipient email triggers when a customer purchases a gift certificate. - type: object - properties: - certificate: - type: object - properties: - code: - type: string - to_name: - type: string - to_email: - type: string - from_name: - type: string - from_email: - type: string - amount: - type: string - redeem_link: - type: string - expiry_date: - type: object - properties: - formatted: - type: string - value: - type: integer - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - expiry_info: - type: string - instruction: - type: string - attached: - type: string - warning: - type: string - go_shopping: - type: string - Order: - title: Order Email Template - description: Order email triggers when a customer or store admin creates an order. - type: object - properties: - order: - type: object - properties: - id: - type: integer - customer_message: - type: string - customer_id: - type: integer - pickup_methods: - type: array - items: - type: string - date_placed: - type: object - properties: - formatted: - type: string - value: - type: integer - account_order_status_url: - type: string - shipping: - type: object - properties: - methods: - type: array - items: - type: object - properties: {} - address: - type: object - properties: - email: - type: string - phone: - type: string - first_name: - type: string - last_name: - type: string - company: - type: string - country: - type: string - city: - type: string - state: - type: string - zip: - type: string - address_lines: - type: array - items: - type: object - properties: {} - custom_fields: - type: array - items: - type: object - properties: {} - products: - type: array - items: - type: object - properties: - name: - type: string - quantity: - type: integer - sku: - type: string - address_lines: - type: array - items: - type: object - properties: {} - address_id: - type: integer - options: - type: object - properties: - Size: - type: string - download_url: - type: string - thumbnail: - type: string - brand: - type: string - event: - type: object - properties: - name: - type: string - date: - type: object - properties: - value: - type: integer - formatted: - type: string - price: - type: object - properties: - value: - type: float - formatted: - type: string - total: - type: object - properties: - value: - type: float - formatted: - type: string - preorder: - type: object - properties: - is_preorder: - type: boolean - message: - type: string - date: - type: object - properties: - value: - type: integer - formatted: - type: string - attribute_lines: - type: array - description: A list of strings that represents product variant options. - items: - type: object - properties: {} - configurable_fields: - type: array - description: Object array with properties name and value. - items: - type: object - properties: {} - pickup: - type: array - items: - type: object - properties: - id: - type: integer - email: - type: string - phone: - type: string - instructions: - type: string - name: - type: string - location: - type: array - items: - type: object - properties: - name: - type: string - address_lines: - type: array - items: - type: string - city: - type: string - state: - type: string - country: - type: string - zip: - type: string - operating_hours: - type: array - items: - type: object - properties: - sunday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - monday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - tuesday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - wednesday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - thursday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - friday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - saturday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - payment: - type: object - properties: - is_test: - type: boolean - provider_name: - type: string - deprecated: true - offline_payment_message: - type: string - payment_method: - type: string - provider: - type: object - properties: - name: - type: string - gateway_amount: - type: object - description: Price value. Provided only if the payment method is offline. - properties: - formatted: - type: string - value: - type: float - billing: - type: object - properties: - is_managed_by_amazon: - type: boolean - address: - type: object - properties: - email: - type: string - phone: - type: string - first_name: - type: string - last_name: - type: string - company: - type: string - country: - type: string - city: - type: string - state: - type: string - zip: - type: string - address_lines: - type: array - items: - type: object - properties: {} - custom_fields: - type: array - items: - type: object - properties: {} - total_rows: - type: array - items: - type: object - properties: - label: - type: string - price: - type: object - properties: - value: - type: float - formatted: - type: string - shipping_discounts: - type: array - items: - type: object - properties: {} - total_cost: - type: object - properties: - formatted: - type: string - value: - type: float - meta: - type: object - properties: - mandate_url: - type: string - description: Link to the confirmation page in Stripe - mandate_tag: - type: string - description: Short name of the payment document - shipping_addresses_num: - type: integer - show_immediate_download: - type: boolean - - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - prodname: - type: string - example: "Product Name" - prodsku: - type: string - example: "Product SKU" - fr: - type: object - properties: - store: - type: string - example: "Boutique" - Order Notification: - title: Order Notification Email Template - description: Order notification email triggers when a merchant or store admin adds a message to an order. - type: object - properties: - notification: - type: object - properties: - message: - type: string - link: - type: string - subject: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - reply: - type: string - go_shopping: - type: string - Order ready for pickup: - title: Order Ready for Pick-up Email Template - description: Order ready for pick-up email triggers when a customer or store admin creates a pick-up order. - type: object - properties: - order: - type: object - properties: - id: - type: integer - account_order_status_url: - type: string - products: - type: array - items: - type: object - properties: - id: - type: integer - quantity: - type: integer - name: - type: string - sku: - type: string - thumbnail: - type: string - options: - type: array - properties: - Size: - type: string - attribute_lines: - type: array - description: A list of strings that represents product variant options. - items: - type: object - properties: {} - configurable_fields: - type: array - description: Object array with properties name and value. - items: - type: object - properties: {} - pickup: - type: array - items: - type: object - properties: - id: - type: integer - email: - type: string - phone: - type: string - instructions: - type: string - name: - type: string - location: - type: array - items: - type: object - properties: - name: - type: string - address_lines: - type: array - items: - type: string - city: - type: string - state: - type: string - country: - type: string - zip: - type: string - operating_hours: - type: array - items: - type: object - properties: - sunday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - monday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - tuesday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - wednesday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - thursday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - friday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - saturday: - type: object - properties: - is_open: - type: boolean - opening_time: - formatted: - type: string - closing_time: - formatted: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - prodname: - type: string - example: "Product Name" - prodsku: - type: string - example: "Product SKU" - fr: - type: object - properties: - store: - type: string - example: "Boutique" - Sign in Link Request: - title: Sign in Link Request Email Template - description: Sign-in request email triggers when an existing customer requests passwordless login while checking out. - type: object - properties: - passwordless_login: - type: object - properties: - link: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - message: - type: string - alternatively: - type: string - login_request: - type: string - secure: - type: string - go_shopping: - type: string - Product Review Request: - title: Product Review Email Template - description: Product review request email triggers after a customer purchases a product. - type: object - properties: - review: - type: object - properties: - products: - type: array - items: - type: object - properties: - name: - type: string - sku: - type: string - link: - type: string - price: - type: string - thumbnail: - type: string - unsubscribe_link: - type: string - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - instruction: - type: string - review_text: - type: string - thanks: - type: string - go_shopping: - type: string - Return Requested: - title: Return Requested Email Template - description: Return requested email triggers after a customerʼs return is approved. - type: object - properties: - return: - type: object - properties: - return_id: - type: string - reason: - type: string - action: - type: string - comments: - type: string - products: - type: array - items: - type: object - properties: - name: - type: string - quantity: - type: integer - price: - type: string - sku: - type: string - thumbnail: - type: string - order: - type: object - properties: - id: - type: integer - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - confirmation: - type: string - summary: - type: string - clickHere: - type: string - reason: - type: string - action: - type: string - comments: - type: string - contains: - type: string - items: - type: string - quantity: - type: string - Return Status Change: - description: Return status change email triggers after a customer returnʼs status has changed. - type: object - title: Return Status Change Email Template - properties: - return: - type: object - properties: - id: - type: integer - reason: - type: string - action: - type: string - comments: - type: string - product: - type: object - properties: - name: - type: string - quantity: - type: integer - price: - type: string - sku: - type: string - thumbnail: - type: string - status: - type: object - properties: - value: - type: integer - formatted: - type: string - store_credit: - type: object - properties: - value: - type: float - formatted: - type: string - link: - type: string - instructions: - type: string - order: - type: object - properties: - id: - type: integer - store: - type: object - properties: - name: - type: string - domain_name: - type: string - logo: - type: object - properties: - title: - type: string - name: - type: string - url: - type: string - ssl_path: - type: string - cdn_path: - type: string - image_directory: - type: string - img_path: - type: string - path_normal: - type: string - description: 'Path to the store (i.e., domain + protocol)' - path: - type: string - address: - type: string - language: - type: object - properties: - code: - type: string - direction: - type: string - description: 'Left to right or right to left, depending on the language' - customer: - type: object - properties: - first_name: - type: string - full_name: - type: string - email: - type: string - group: - type: array - items: - type: object - properties: - name: - type: string - misc: - type: object - properties: - year: - type: integer - translations: - type: object - properties: - en: - type: object - properties: - title: - type: string - hello: - type: string - message: - type: string - received_credit: - type: string - details_title: - type: string - return_reason: - type: string - return_action: - type: string - return_comments: - type: string - check_status: - type: string - products_title: - type: string - quantity: - type: string - instructions_title: - type: string - go_shopping: - type: string +title: Handlebars Email Template Objects +type: object +properties: + Global Email Template Object: + title: Global Email Template Object + description: Data objects across all email templates. + type: object + properties: + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + Abandoned Cart: + title: Abandoned Cart Email Template + description: Abandoned cart email triggers when a shopper doesnʼt complete an order. + type: object + oneOf: + - properties: + notification: + type: array + items: + type: object + properties: + unsubscribe_link: + type: string + checkout_link: + type: string + coupon: + type: array + items: + type: object + properties: + code: + type: string + type: + type: array + items: + type: object + properties: + value: + type: string + formatted: + type: string + amount: + type: array + items: + type: object + properties: + value: + type: number + format: float + formatted: + type: string + cart: + type: array + items: + type: object + properties: + products: + type: array + items: + type: object + properties: + '0': + type: array + items: + type: object + properties: + id: + type: number + url: + type: string + name: + type: string + quantity: + type: integer + sku: + type: string + thumbnail: + type: string + attributes: + type: array + items: + type: object + properties: + '0': + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + '1': + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + price: + type: array + items: + type: object + properties: + value: + type: number + format: float + formatted: + type: string + type: + type: array + items: + type: object + properties: + value: + type: integer + formatted: + type: string + '1': + type: array + items: + type: object + properties: + id: + type: number + url: + type: string + name: + type: string + quantity: + type: integer + sku: + type: string + thumbnail: + type: string + attributes: + type: array + items: + type: object + properties: + '0': + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + '1': + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + price: + type: array + items: + type: object + properties: + value: + type: number + format: float + formatted: + type: string + type: + type: array + items: + type: object + properties: + value: + type: integer + formatted: + type: string + store: + type: array + items: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: array + items: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + path: + type: string + address: + type: string + phone_number: + type: string + language: + type: array + items: + type: object + properties: + code: + type: string + direction: + type: string + customer: + type: array + items: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + id: + type: number + name: + type: string + misc: + type: array + items: + type: object + properties: + year: + type: integer + - deprecated: true + properties: + abandoned_cart: + type: object + title: deprecated + deprecated: true + properties: + body: + type: string + unsubscribe_link: + type: string + store: + type: object + deprecated: true + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + deprecated: true + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + deprecated: true + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + deprecated: true + properties: + year: + type: integer + translations: + type: object + deprecated: true + properties: + en: + type: object + properties: + unsubscribe: + type: string + examples: + - notification: + - unsubscribe_link: string + checkout_link: string + coupon: + - code: string + type: + - value: string + formatted: string + amount: + - value: 0 + formatted: string + cart: + - products: + - '0': + - id: 0 + url: string + name: string + quantity: 0 + sku: string + thumbnail: string + attributes: + - '0': + - name: string + value: string + '1': + - name: string + value: string + price: + - value: 0 + formatted: string + type: + - value: 0 + formatted: string + '1': + - id: 0 + url: string + name: string + quantity: 0 + sku: string + thumbnail: string + attributes: + - '0': + - name: string + value: string + '1': + - name: string + value: string + price: + - value: 0 + formatted: string + type: + - value: 0 + formatted: string + store: + - name: string + domain_name: string + logo: + - title: string + name: string + url: string + ssl_path: string + cdn_path: string + image_directory: string + img_path: string + path_normal: string + path: string + address: string + phone_number: string + language: + - code: string + direction: string + customer: + - first_name: string + full_name: string + email: string + group: + - id: 0 + name: string + misc: + - year: 0 + Account Settings Edited: + title: Account Settings Edited Email Template + description: Account settings email triggers when the store admin or a customer edits account settings. + type: object + properties: + details_changed: + type: object + properties: + fields: + type: array + items: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + warning: + type: string + thanks: + type: string + security: + type: string + go_shopping: + type: string + Password Reset: + title: Password Reset Email Template + description: Password reset email triggers when a customer resets their account password on the customer details page. + type: object + properties: + reset_password: + type: object + properties: + link: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + message: + type: string + go_shopping: + type: string + Order Status Update: + title: Order Status Update Email Template + description: Order status update email triggers when the status of an order change. + type: object + properties: + order: + type: object + properties: + id: + type: integer + new_status: + type: string + example: 'Incomplete, Pending, Shipped, Partially Shipped, Refunded, Cancelled, Declined, Awaiting Payment, Awaiting, Awaiting Shipment, Completed, Awaiting Fulfillment, Manual Verification Required, Disputed, Partially Refunded' + new_formatted_status: + type: string + example: 'Shipment123, PendingOrder345, Cancelled0223222, Awaiting Payment in Store' + total: + type: object + properties: + value: + type: float + formatted: + type: string + refund: + type: object + properties: + value: + type: float + formatted: + type: string + date_placed: + type: object + properties: + value: + type: integer + formatted: + type: string + payment_method: + type: string + link: + type: string + customer_name: + type: string + downloadable_products: + type: array + items: + type: object + properties: + name: + type: string + options: + type: string + quantity: + type: integer + link: + type: string + thumbnail: + type: string + products: + type: array + items: + type: object + description: Products that have been shipped, i.e., have been added to a consignment. + example: [Partially Shipped, Completed, Shipped, Refunded] + properties: + name: + type: string + sku: + type: string + price: + type: string + quantity: + type: integer + thumbnail: + type: string + brand: + type: string + tracking: + type: array + items: + type: object + properties: + id: + type: string + shipping_method: + type: string + link: + type: string + unshipped_products: + type: array + description: Products that have not been shipped or added to a shipping consignment. + example: [Awaiting Fulfillment, Awaiting Shipment, Awaiting Pickup, Partially Shipped, Completed, Shipped, Refunded] + ready_for_pickup_products: + type: array + description: Products that have been added to a BOPIS pickup consignment and marked as ready for pickup. + items: + type: object + properties: + name: + type: string + sku: + type: string + quantity: + type: integer + thumbnail: + type: string + price: + type: string + brand: + type: string + picked_up_products: + type: array + description: Products that have been added to a BOPIS pickup consignment and marked as picked up. + items: + type: object + properties: + name: + type: string + sku: + type: string + quantity: + type: integer + thumbnail: + type: string + price: + type: string + brand: + type: string + pickup_methods: + type: array + items: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + prodname: + type: string + example: "Product Name" + prodsku: + type: string + example: "Product SKU" + fr: + type: object + properties: + store: + type: string + example: "Boutique" + Account Created: + title: Account Created Email Template + description: Account created email triggers when a customer or store admin creates their account. + type: object + properties: + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + details_title: + type: string + email_label: + type: string + password_label: + type: string + password_placeholder: + type: string + sign_in: + type: string + help: + type: string + go_shopping: + type: string + Account Created Guest: + title: Create Guest Account Email Template + description: Guest account created email triggers when a customer or store admin creates a guest account. + type: object + properties: + guest_account: + type: object + properties: + link: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + instruction: + type: string + help: + type: string + go_shopping: + type: string + Gift Certificate Recipient: + title: Gift Certificate Email Template + description: Gift certificate recipient email triggers when a customer purchases a gift certificate. + type: object + properties: + certificate: + type: object + properties: + code: + type: string + to_name: + type: string + to_email: + type: string + from_name: + type: string + from_email: + type: string + amount: + type: string + redeem_link: + type: string + expiry_date: + type: object + properties: + formatted: + type: string + value: + type: integer + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + expiry_info: + type: string + instruction: + type: string + attached: + type: string + warning: + type: string + go_shopping: + type: string + Order: + title: Order Email Template + description: Order email triggers when a customer or store admin creates an order. + type: object + properties: + order: + type: object + properties: + id: + type: integer + customer_message: + type: string + customer_id: + type: integer + pickup_methods: + type: array + items: + type: string + date_placed: + type: object + properties: + formatted: + type: string + value: + type: integer + account_order_status_url: + type: string + shipping: + type: object + properties: + methods: + type: array + items: + type: object + properties: {} + address: + type: object + properties: + email: + type: string + phone: + type: string + first_name: + type: string + last_name: + type: string + company: + type: string + country: + type: string + city: + type: string + state: + type: string + zip: + type: string + address_lines: + type: array + items: + type: object + properties: {} + custom_fields: + type: array + items: + type: object + properties: {} + products: + type: array + items: + type: object + properties: + name: + type: string + quantity: + type: integer + sku: + type: string + address_lines: + type: array + items: + type: object + properties: {} + address_id: + type: integer + options: + type: object + properties: + Size: + type: string + download_url: + type: string + thumbnail: + type: string + brand: + type: string + event: + type: object + properties: + name: + type: string + date: + type: object + properties: + value: + type: integer + formatted: + type: string + price: + type: object + properties: + value: + type: float + formatted: + type: string + total: + type: object + properties: + value: + type: float + formatted: + type: string + preorder: + type: object + properties: + is_preorder: + type: boolean + message: + type: string + date: + type: object + properties: + value: + type: integer + formatted: + type: string + attribute_lines: + type: array + description: A list of strings that represents product variant options. + items: + type: object + properties: {} + configurable_fields: + type: array + description: Object array with properties name and value. + items: + type: object + properties: {} + pickup: + type: array + items: + type: object + properties: + id: + type: integer + email: + type: string + phone: + type: string + instructions: + type: string + name: + type: string + location: + type: array + items: + type: object + properties: + name: + type: string + address_lines: + type: array + items: + type: string + city: + type: string + state: + type: string + country: + type: string + zip: + type: string + operating_hours: + type: array + items: + type: object + properties: + sunday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + monday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + tuesday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + wednesday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + thursday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + friday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + saturday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + payment: + type: object + properties: + is_test: + type: boolean + provider_name: + type: string + deprecated: true + offline_payment_message: + type: string + payment_method: + type: string + provider: + type: object + properties: + name: + type: string + gateway_amount: + type: object + description: Price value. Provided only if the payment method is offline. + properties: + formatted: + type: string + value: + type: float + billing: + type: object + properties: + is_managed_by_amazon: + type: boolean + address: + type: object + properties: + email: + type: string + phone: + type: string + first_name: + type: string + last_name: + type: string + company: + type: string + country: + type: string + city: + type: string + state: + type: string + zip: + type: string + address_lines: + type: array + items: + type: object + properties: {} + custom_fields: + type: array + items: + type: object + properties: {} + total_rows: + type: array + items: + type: object + properties: + label: + type: string + price: + type: object + properties: + value: + type: float + formatted: + type: string + shipping_discounts: + type: array + items: + type: object + properties: {} + total_cost: + type: object + properties: + formatted: + type: string + value: + type: float + meta: + type: object + properties: + mandate_url: + type: string + description: Link to the confirmation page in Stripe + mandate_tag: + type: string + description: Short name of the payment document + shipping_addresses_num: + type: integer + show_immediate_download: + type: boolean + + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + prodname: + type: string + example: "Product Name" + prodsku: + type: string + example: "Product SKU" + fr: + type: object + properties: + store: + type: string + example: "Boutique" + Order Notification: + title: Order Notification Email Template + description: Order notification email triggers when a merchant or store admin adds a message to an order. + type: object + properties: + notification: + type: object + properties: + message: + type: string + link: + type: string + subject: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + reply: + type: string + go_shopping: + type: string + Order ready for pickup: + title: Order Ready for Pick-up Email Template + description: Order ready for pick-up email triggers when a customer or store admin creates a pick-up order. + type: object + properties: + order: + type: object + properties: + id: + type: integer + account_order_status_url: + type: string + products: + type: array + items: + type: object + properties: + id: + type: integer + quantity: + type: integer + name: + type: string + sku: + type: string + thumbnail: + type: string + options: + type: array + properties: + Size: + type: string + attribute_lines: + type: array + description: A list of strings that represents product variant options. + items: + type: object + properties: {} + configurable_fields: + type: array + description: Object array with properties name and value. + items: + type: object + properties: {} + pickup: + type: array + items: + type: object + properties: + id: + type: integer + email: + type: string + phone: + type: string + instructions: + type: string + name: + type: string + location: + type: array + items: + type: object + properties: + name: + type: string + address_lines: + type: array + items: + type: string + city: + type: string + state: + type: string + country: + type: string + zip: + type: string + operating_hours: + type: array + items: + type: object + properties: + sunday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + monday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + tuesday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + wednesday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + thursday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + friday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + saturday: + type: object + properties: + is_open: + type: boolean + opening_time: + formatted: + type: string + closing_time: + formatted: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + prodname: + type: string + example: "Product Name" + prodsku: + type: string + example: "Product SKU" + fr: + type: object + properties: + store: + type: string + example: "Boutique" + Sign in Link Request: + title: Sign in Link Request Email Template + description: Sign-in request email triggers when an existing customer requests passwordless login while checking out. + type: object + properties: + passwordless_login: + type: object + properties: + link: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + message: + type: string + alternatively: + type: string + login_request: + type: string + secure: + type: string + go_shopping: + type: string + Product Review Request: + title: Product Review Email Template + description: Product review request email triggers after a customer purchases a product. + type: object + properties: + review: + type: object + properties: + products: + type: array + items: + type: object + properties: + name: + type: string + sku: + type: string + link: + type: string + price: + type: string + thumbnail: + type: string + unsubscribe_link: + type: string + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + instruction: + type: string + review_text: + type: string + thanks: + type: string + go_shopping: + type: string + Return Requested: + title: Return Requested Email Template + description: Return requested email triggers after a customerʼs return is approved. + type: object + properties: + return: + type: object + properties: + return_id: + type: string + reason: + type: string + action: + type: string + comments: + type: string + products: + type: array + items: + type: object + properties: + name: + type: string + quantity: + type: integer + price: + type: string + sku: + type: string + thumbnail: + type: string + order: + type: object + properties: + id: + type: integer + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + confirmation: + type: string + summary: + type: string + clickHere: + type: string + reason: + type: string + action: + type: string + comments: + type: string + contains: + type: string + items: + type: string + quantity: + type: string + Return Status Change: + description: Return status change email triggers after a customer returnʼs status has changed. + type: object + title: Return Status Change Email Template + properties: + return: + type: object + properties: + id: + type: integer + reason: + type: string + action: + type: string + comments: + type: string + product: + type: object + properties: + name: + type: string + quantity: + type: integer + price: + type: string + sku: + type: string + thumbnail: + type: string + status: + type: object + properties: + value: + type: integer + formatted: + type: string + store_credit: + type: object + properties: + value: + type: float + formatted: + type: string + link: + type: string + instructions: + type: string + order: + type: object + properties: + id: + type: integer + store: + type: object + properties: + name: + type: string + domain_name: + type: string + logo: + type: object + properties: + title: + type: string + name: + type: string + url: + type: string + ssl_path: + type: string + cdn_path: + type: string + image_directory: + type: string + img_path: + type: string + path_normal: + type: string + description: 'Path to the store (i.e., domain + protocol)' + path: + type: string + address: + type: string + language: + type: object + properties: + code: + type: string + direction: + type: string + description: 'Left to right or right to left, depending on the language' + customer: + type: object + properties: + first_name: + type: string + full_name: + type: string + email: + type: string + group: + type: array + items: + type: object + properties: + name: + type: string + misc: + type: object + properties: + year: + type: integer + translations: + type: object + properties: + en: + type: object + properties: + title: + type: string + hello: + type: string + message: + type: string + received_credit: + type: string + details_title: + type: string + return_reason: + type: string + return_action: + type: string + return_comments: + type: string + check_status: + type: string + products_title: + type: string + quantity: + type: string + instructions_title: + type: string + go_shopping: + type: string diff --git a/models/email_templates/abandoned_cart_email.yml b/docs/store-operations/emails/object-reference/draft/abandoned_cart_email.yml similarity index 100% rename from models/email_templates/abandoned_cart_email.yml rename to docs/store-operations/emails/object-reference/draft/abandoned_cart_email.yml diff --git a/models/email_templates/account_details_changed_email.yml b/docs/store-operations/emails/object-reference/draft/account_details_changed_email.yml similarity index 100% rename from models/email_templates/account_details_changed_email.yml rename to docs/store-operations/emails/object-reference/draft/account_details_changed_email.yml diff --git a/models/email_templates/account_reset_password_email.yml b/docs/store-operations/emails/object-reference/draft/account_reset_password_email.yml similarity index 100% rename from models/email_templates/account_reset_password_email.yml rename to docs/store-operations/emails/object-reference/draft/account_reset_password_email.yml diff --git a/models/email_templates/combined_order_status_email.yml b/docs/store-operations/emails/object-reference/draft/combined_order_status_email.yml similarity index 100% rename from models/email_templates/combined_order_status_email.yml rename to docs/store-operations/emails/object-reference/draft/combined_order_status_email.yml diff --git a/models/email_templates/create_account_email.yml b/docs/store-operations/emails/object-reference/draft/create_account_email.yml similarity index 100% rename from models/email_templates/create_account_email.yml rename to docs/store-operations/emails/object-reference/draft/create_account_email.yml diff --git a/models/email_templates/create_guest_account_email.yml b/docs/store-operations/emails/object-reference/draft/create_guest_account_email.yml similarity index 100% rename from models/email_templates/create_guest_account_email.yml rename to docs/store-operations/emails/object-reference/draft/create_guest_account_email.yml diff --git a/models/email_templates/gift_certificate_email.yml b/docs/store-operations/emails/object-reference/draft/gift_certificate_email.yml similarity index 100% rename from models/email_templates/gift_certificate_email.yml rename to docs/store-operations/emails/object-reference/draft/gift_certificate_email.yml diff --git a/models/email_templates/global.yml b/docs/store-operations/emails/object-reference/draft/global.yml similarity index 100% rename from models/email_templates/global.yml rename to docs/store-operations/emails/object-reference/draft/global.yml diff --git a/models/email_templates/invoice_email.yml b/docs/store-operations/emails/object-reference/draft/invoice_email.yml similarity index 100% rename from models/email_templates/invoice_email.yml rename to docs/store-operations/emails/object-reference/draft/invoice_email.yml diff --git a/models/email_templates/order_message_notification.yml b/docs/store-operations/emails/object-reference/draft/order_message_notification.yml similarity index 100% rename from models/email_templates/order_message_notification.yml rename to docs/store-operations/emails/object-reference/draft/order_message_notification.yml diff --git a/models/email_templates/passwordless_login_email.yml b/docs/store-operations/emails/object-reference/draft/passwordless_login_email.yml similarity index 100% rename from models/email_templates/passwordless_login_email.yml rename to docs/store-operations/emails/object-reference/draft/passwordless_login_email.yml diff --git a/models/email_templates/product_review_email.yml b/docs/store-operations/emails/object-reference/draft/product_review_email.yml similarity index 100% rename from models/email_templates/product_review_email.yml rename to docs/store-operations/emails/object-reference/draft/product_review_email.yml diff --git a/models/email_templates/return_confirmation_email.yml b/docs/store-operations/emails/object-reference/draft/return_confirmation_email.yml similarity index 100% rename from models/email_templates/return_confirmation_email.yml rename to docs/store-operations/emails/object-reference/draft/return_confirmation_email.yml diff --git a/models/email_templates/return_status_change_email.yml b/docs/store-operations/emails/object-reference/draft/return_status_change_email.yml similarity index 100% rename from models/email_templates/return_status_change_email.yml rename to docs/store-operations/emails/object-reference/draft/return_status_change_email.yml diff --git a/models/email_templates/combined/gift_certificate_email.yml b/docs/store-operations/emails/object-reference/gift-certificate.yml similarity index 100% rename from models/email_templates/combined/gift_certificate_email.yml rename to docs/store-operations/emails/object-reference/gift-certificate.yml diff --git a/models/email_templates/combined/global.yml b/docs/store-operations/emails/object-reference/global-email-object.yml similarity index 100% rename from models/email_templates/combined/global.yml rename to docs/store-operations/emails/object-reference/global-email-object.yml diff --git a/models/email_templates/combined/invoice_email.yml b/docs/store-operations/emails/object-reference/invoice.yml similarity index 100% rename from models/email_templates/combined/invoice_email.yml rename to docs/store-operations/emails/object-reference/invoice.yml diff --git a/models/email_templates/combined/order_message_notification.yml b/docs/store-operations/emails/object-reference/order-message-notification.yml similarity index 100% rename from models/email_templates/combined/order_message_notification.yml rename to docs/store-operations/emails/object-reference/order-message-notification.yml diff --git a/models/email_templates/combined/passwordless_login_email.yml b/docs/store-operations/emails/object-reference/passwordless-login.yml similarity index 100% rename from models/email_templates/combined/passwordless_login_email.yml rename to docs/store-operations/emails/object-reference/passwordless-login.yml diff --git a/models/email_templates/combined/product_review_email.yml b/docs/store-operations/emails/object-reference/product-review.yml similarity index 100% rename from models/email_templates/combined/product_review_email.yml rename to docs/store-operations/emails/object-reference/product-review.yml diff --git a/models/email_templates/combined/return_confirmation_email.yml b/docs/store-operations/emails/object-reference/return-confirmation.yml similarity index 100% rename from models/email_templates/combined/return_confirmation_email.yml rename to docs/store-operations/emails/object-reference/return-confirmation.yml diff --git a/models/email_templates/combined/return_status_change_email.yml b/docs/store-operations/emails/object-reference/return-status-change.yml similarity index 100% rename from models/email_templates/combined/return_status_change_email.yml rename to docs/store-operations/emails/object-reference/return-status-change.yml diff --git a/docs/api-docs/orders/orders-api-overview.mdx b/docs/store-operations/orders/index.mdx similarity index 100% rename from docs/api-docs/orders/orders-api-overview.mdx rename to docs/store-operations/orders/index.mdx diff --git a/docs/stencil-docs/developing-further/customizing-invoices.mdx b/docs/store-operations/orders/invoice-templates.mdx similarity index 98% rename from docs/stencil-docs/developing-further/customizing-invoices.mdx rename to docs/store-operations/orders/invoice-templates.mdx index e490602ca..3da204c91 100644 --- a/docs/stencil-docs/developing-further/customizing-invoices.mdx +++ b/docs/store-operations/orders/invoice-templates.mdx @@ -1,79 +1,79 @@ -# Customizing Invoices - -There are four editable invoices in BigCommerce: - -1. Email invoice -2. Merchant printable invoice -3. Customer printable invoice -4. Detailed merchant printable invoice (Supported by UK, France, and Poland) - -Merchants commonly request developers modify the default content of invoices in order to satisfy specific business requirements and industry demands. In order to assist developers in making these changes, this articles contains instructions on how to edit each invoice. - -## Email invoice template - -To define merchant-facing email invoice templates, see the [Email Templates Overview](/docs/store-operations/emails) and the reference for the [email invoice object](/docs/store-operations/emails/object-reference#invoice). - - -## Merchant printable invoice - -The merchant printable invoice is the invoice that can be printed from the control panel in **Orders** > **View**. Clicking the **...** in the **Action** column will generate a list of options, one option being **Print Invoice**. - -![Print Order Invoice](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/customizing_invoice_print_order_invoice.png "Order Invoice") - -The invoice that is generated by clicking **Print Invoice** relies on template files and variables from [BigCommerce's legacy Blueprint themes framework](/archive/storefront/blueprint/themes/email-templates). This invoice can be customized by performing the following steps: - -1. Download the [invoice_printable.zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. -2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. -3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. - -<Callout type="info"> - **Note** - For a list of available variables, see [Blueprint Email Templates](/archive/storefront/blueprint/themes/email-templates). -</Callout> - -### Localizing the merchant printable invoice - -Localization of the merchant-printed invoice is handled the same way as system and error storefront messages. `PrintableInvoice.html` relies on the Blueprint template that contains currently undecorated (untranslatable) strings. The following steps describe how to translate a merchant-printed invoice. - -1. Download the [PrintableInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. -2. Modify the content by replacing variables with their desired translated value. - -| Variable | Value | -|:---------|:------| -| %%LNG_ShippingAddress%% | Shipping Address Translation | -|`%%LNG_Quantity%%`| Quantity Translation| -|`%%LNG_Code%%`| Code Translation | -|`%%LNG_ProdName%%`| Product Name Translation | - -3. Upload the edited templates via [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client). We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. -4. Review the merchant printable invoice via the control panel. - -## Customizing the customer printable invoice - -The customer printable invoice is the printable invoice that is available on a storefront's order page for shoppers that have registered accounts with your store. - -![Customer Printable Invoice](https://storage.googleapis.com/bigcommerce-production-dev-center/images/customer-printable-invoice.png "Customer Printable Invoice") - -This invoice becomes available in a shopper's orders after completing an order. A shopper can generate this invoice by clicking **Print Invoice** on the right-hand side of the page. - -As a developer, you can customize this invoice by editing your theme's `invoice.html` file that is present in your theme's files. This file is located in `templates/pages/account/orders/invoice.html`. - -## Customizing the detailed merchant printable invoice - -Use this invoice when a store receives an order from a shipping address in a country which supports PrintableDetailedInvoice. This invoice can be customized by performing the following steps: - -1. Download the [PrintableDetailedInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/PrintableDetailedInvoice.html) file, which contains the skeleton of the detailed printable invoice. -2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. -3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. - -## Resources - -### Related articles - -* [Email Templates Overview](/docs/store-operations/emails) -* [Email Templates Object Reference](/docs/store-operations/emails/object-reference) -* [Shrinking a Theme by Excluding Static Assets Using WebDAV](/docs/storefront/stencil/deployment/theme-size#shrinking-a-theme) -* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) -* [Uploading and Linking to a File in Your Store (Help Center)](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) -* [Editing and Printing Invoices (Help Center)](https://support.bigcommerce.com/s/article/Invoices#custom) -* [WebDAV File Access (Help Center)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) +# Customizing Invoices + +There are four editable invoices in BigCommerce: + +1. Email invoice +2. Merchant printable invoice +3. Customer printable invoice +4. Detailed merchant printable invoice (Supported by UK, France, and Poland) + +Merchants commonly request developers modify the default content of invoices in order to satisfy specific business requirements and industry demands. In order to assist developers in making these changes, this articles contains instructions on how to edit each invoice. + +## Email invoice template + +To define merchant-facing email invoice templates, see the [Email Templates Overview](/docs/store-operations/emails) and the reference for the [email invoice object](/docs/store-operations/emails/object-reference#invoice). + + +## Merchant printable invoice + +The merchant printable invoice is the invoice that can be printed from the control panel in **Orders** > **View**. Clicking the **...** in the **Action** column will generate a list of options, one option being **Print Invoice**. + +![Print Order Invoice](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/customizing_invoice_print_order_invoice.png "Order Invoice") + +The invoice that is generated by clicking **Print Invoice** relies on template files and variables from [BigCommerce's legacy Blueprint themes framework](/archive/storefront/blueprint/themes/email-templates). This invoice can be customized by performing the following steps: + +1. Download the [invoice_printable.zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. +2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. +3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. + +<Callout type="info"> + **Note** + For a list of available variables, see [Blueprint Email Templates](/archive/storefront/blueprint/themes/email-templates). +</Callout> + +### Localizing the merchant printable invoice + +Localization of the merchant-printed invoice is handled the same way as system and error storefront messages. `PrintableInvoice.html` relies on the Blueprint template that contains currently undecorated (untranslatable) strings. The following steps describe how to translate a merchant-printed invoice. + +1. Download the [PrintableInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/invoice_printable.zip) file, which contains the skeleton of a printable invoice. +2. Modify the content by replacing variables with their desired translated value. + +| Variable | Value | +|:---------|:------| +| %%LNG_ShippingAddress%% | Shipping Address Translation | +|`%%LNG_Quantity%%`| Quantity Translation| +|`%%LNG_Code%%`| Code Translation | +|`%%LNG_ProdName%%`| Product Name Translation | + +3. Upload the edited templates via [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client). We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. +4. Review the merchant printable invoice via the control panel. + +## Customizing the customer printable invoice + +The customer printable invoice is the printable invoice that is available on a storefront's order page for shoppers that have registered accounts with your store. + +![Customer Printable Invoice](https://storage.googleapis.com/bigcommerce-production-dev-center/images/customer-printable-invoice.png "Customer Printable Invoice") + +This invoice becomes available in a shopper's orders after completing an order. A shopper can generate this invoice by clicking **Print Invoice** on the right-hand side of the page. + +As a developer, you can customize this invoice by editing your theme's `invoice.html` file that is present in your theme's files. This file is located in `templates/pages/account/orders/invoice.html`. + +## Customizing the detailed merchant printable invoice + +Use this invoice when a store receives an order from a shipping address in a country which supports PrintableDetailedInvoice. This invoice can be customized by performing the following steps: + +1. Download the [PrintableDetailedInvoice.html](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/PrintableDetailedInvoice.html) file, which contains the skeleton of the detailed printable invoice. +2. Open the file in the text editor of your choice and edit the HTML file to match your desired customization. +3. Use WebDAV to upload your customized HTML file to WebDAV's /template/ folder. We recommend CyberDuck, the freeware [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV#webdav-client) client, available for Windows and Mac OS. Your store's control panel offers a downloadable connection file pre-filled with most store credentials. + +## Resources + +### Related articles + +* [Email Templates Overview](/docs/store-operations/emails) +* [Email Templates Object Reference](/docs/store-operations/emails/object-reference) +* [Shrinking a Theme by Excluding Static Assets Using WebDAV](/docs/storefront/stencil/deployment/theme-size#shrinking-a-theme) +* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) +* [Uploading and Linking to a File in Your Store (Help Center)](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) +* [Editing and Printing Invoices (Help Center)](https://support.bigcommerce.com/s/article/Invoices#custom) +* [WebDAV File Access (Help Center)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) diff --git a/docs/api-docs/orders/order-refunds.mdx b/docs/store-operations/orders/refunds.mdx similarity index 100% rename from docs/api-docs/orders/order-refunds.mdx rename to docs/store-operations/orders/refunds.mdx diff --git a/docs/api-docs/payments/payments-api-overview.mdx b/docs/store-operations/payments/index.mdx similarity index 99% rename from docs/api-docs/payments/payments-api-overview.mdx rename to docs/store-operations/payments/index.mdx index 866a385a5..5d71c86f9 100644 --- a/docs/api-docs/payments/payments-api-overview.mdx +++ b/docs/store-operations/payments/index.mdx @@ -45,7 +45,7 @@ The following table lists the payment gateways that are compatible with our publ |:------------------|:------------------:|:---------------:| | Adyen | | ✓ | | AdyenV2 | ✓ | | -| Adyen V3 oauth | ✓ | ✓ | +| Adyen V3 OAuth | ✓ | ✓ | | Authorize.net | ✓ | ✓ | | Barclaycard Fuse | ✓ | ✓ | | BlueSnap Direct | ✓ | ✓ | @@ -481,7 +481,7 @@ Content-Type: application/json ## Using the Orders API -It is possible to take payment for an order created using the [Orders API](/docs/store-operations/orders). When creating the order using the Orders API, make sure to set `status_id:0`. If you do not create an order with order status set to `0` or `Incomplete`, the Payments API will return an [error](#error-codes). Ensure customers enter their billing address and line items when creating the order. The customer can create the order as a guest by either setting the `customer_id:0` or leaving it blank. After the order is created, follow the steps to pay with a [credit card](#credit-cards), a [stored card, or a PayPal account](#stored-cards-and-paypal-accounts). +It is possible to take payment for an order created using the [Orders API](/docs/store-operations/orders). When creating the order using the Orders API, make sure to set `status_id:0`. If you do not create an order with order status set to `0` or `Incomplete`, the Payments API will return an [error](#error-codes). Ensure customers enter their billing address and line items when creating the order. The customer can create the order as a guest by either setting the `customer_id:0` or leaving it blank. After the order is created, follow the steps to pay with a [credit card](#credit-cards), a [stored card, or a PayPal account](#stored-cards-paypal-and-bank-accounts). ```http filename="Example request: Create an order" showLineNumbers copy diff --git a/docs/api-docs/catalog/pricing-order-operation.mdx b/docs/store-operations/pricing/calculations.mdx similarity index 98% rename from docs/api-docs/catalog/pricing-order-operation.mdx rename to docs/store-operations/pricing/calculations.mdx index a492528b8..80f82d6ec 100644 --- a/docs/api-docs/catalog/pricing-order-operation.mdx +++ b/docs/store-operations/pricing/calculations.mdx @@ -1,38 +1,38 @@ -# Price Order of Operations - -The table below lists each price type available on a product. The table is read from top to bottom, with the default price having the lowest weight and the tax having the highest weight when calculating price.   - -| Price Type | Description | -|:--|:--| -| Default product price | Product requirement | -| Product sale price | A product option that overrides the default price | -| Variant price | A product option that overrides the product sale price | -| Variant sale price | A product option that overrides the variant price | -| Customer group discount | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides the variant sale price. Might apply to one product, category, subcategory, or the entire store's products. | -| Product bulk pricing | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides the customer group discount. Dependent on the total quantity of products, including SKUs added to the cart. | -| Price list variants | A price list record requirement that overrides all previous pricing and excludes SKUs from the total number of items for product bulk pricing. -| Price list variant sale price | A product option that overrides price list pricing if variant pricing is set and selected. | -| Price list variant bulk pricing | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides price list sale price on variants. It is dependent on the quantity added to a cart. | -| Price list variant product pick list | The product pick list overrides price list bulk pricing and allows you to change the price when a pick list item is selected. | -| Product option set (**Deprecated**)| A set of product option facets that may alter the variant price. (This feature is deprecated.) | -| Product modifier | Available in fixed ($5) or percentage (%10) amount that is added or removed from the total product price and overrides the price list variant product pick list. A modifier includes choices such as adding $5 for insurance. | -| Product product pick list | If you configure the product pick list to change the price, it will update the price and override the product modifier when the option is selected. | -Discounts | When a shopper meets certain criteria or takes certain actions to automatically modify the final product or cart price depending on the discount type. | -| Coupons | Coupons require customer action to take effect and modify the final product or cart price depending on the coupon type. | -| Tax | You can assign products to different tax classes, which will change the final amount the shopper pays. Tax is the last to calculate after shipping and promotions are applied. | - -## Resources - -### Webhooks -* [Products](/docs/integrations/webhooks/events#products) -* [Cart](/docs/integrations/webhooks/events#carts) - -### Related endpoints -* [Storefront Cart API](/docs/rest-storefront/carts) -* [Server to Server Cart API](/docs/rest-management/carts) -* [Price Lists API](/docs/rest-management/price-lists) -* [Catalog API](/docs/rest-catalog) - -### Related resources -* [Price Lists](/docs/store-operations/pricing/price-lists) -* [Products Overview](/docs/store-operations/catalog#products-overview) +# Price Order of Operations + +The table below lists each price type available on a product. The table is read from top to bottom, with the default price having the lowest weight and the tax having the highest weight when calculating price.   + +| Price Type | Description | +|:--|:--| +| Default product price | Product requirement | +| Product sale price | A product option that overrides the default price | +| Variant price | A product option that overrides the product sale price | +| Variant sale price | A product option that overrides the variant price | +| Customer group discount | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides the variant sale price. Might apply to one product, category, subcategory, or the entire store's products. | +| Product bulk pricing | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides the customer group discount. Dependent on the total quantity of products, including SKUs added to the cart. | +| Price list variants | A price list record requirement that overrides all previous pricing and excludes SKUs from the total number of items for product bulk pricing. +| Price list variant sale price | A product option that overrides price list pricing if variant pricing is set and selected. | +| Price list variant bulk pricing | Available in fixed ($5), relative (-$2), or percentage (-25%) amount that overrides price list sale price on variants. It is dependent on the quantity added to a cart. | +| Price list variant product pick list | The product pick list overrides price list bulk pricing and allows you to change the price when a pick list item is selected. | +| Product option set (**Deprecated**)| A set of product option facets that may alter the variant price. (This feature is deprecated.) | +| Product modifier | Available in fixed ($5) or percentage (%10) amount that is added or removed from the total product price and overrides the price list variant product pick list. A modifier includes choices such as adding $5 for insurance. | +| Product product pick list | If you configure the product pick list to change the price, it will update the price and override the product modifier when the option is selected. | +Discounts | When a shopper meets certain criteria or takes certain actions to automatically modify the final product or cart price depending on the discount type. | +| Coupons | Coupons require customer action to take effect and modify the final product or cart price depending on the coupon type. | +| Tax | You can assign products to different tax classes, which will change the final amount the shopper pays. Tax is the last to calculate after shipping and promotions are applied. | + +## Resources + +### Webhooks +* [Products](/docs/integrations/webhooks/events#products) +* [Cart](/docs/integrations/webhooks/events#carts) + +### Related endpoints +* [Storefront Cart API](/docs/rest-storefront/carts) +* [Server to Server Cart API](/docs/rest-management/carts) +* [Price Lists API](/docs/rest-management/price-lists) +* [Catalog API](/docs/rest-catalog) + +### Related resources +* [Price Lists](/docs/store-operations/pricing/price-lists) +* [Products Overview](/docs/store-operations/catalog#products-overview) diff --git a/docs/api-docs/catalog/price-list-overview.mdx b/docs/store-operations/pricing/price-lists.mdx similarity index 98% rename from docs/api-docs/catalog/price-list-overview.mdx rename to docs/store-operations/pricing/price-lists.mdx index 4ca3eb338..294b4dc7f 100644 --- a/docs/api-docs/catalog/price-list-overview.mdx +++ b/docs/store-operations/pricing/price-lists.mdx @@ -1,108 +1,108 @@ -# Price List API - -Price lists allow you to populate different versions of catalog pricing and assign them to different [Customer Groups](/docs/rest-management/customers-v2/customer-groups). The prices are specified exclusively at the variant level. If an active price list doesn't contain prices for a variant, then the catalog pricing will be used. - -You can assign a price list to a specific sales channel, customer group, or customer group on a specific sales channel, using price list assignments in the [Price List Assignment API](/docs/rest-management/price-lists/price-lists-assignments#create-price-list-assignments). You can also associate a price list to a customer group in the Control Panel or the [Customer Groups API](/docs/rest-management/customers-v2/customer-groups). Price list assignments combined with a customer group assignment allows you to better target the signed-in customers shopping on that channel. - -Price lists will provide overridden price values to the Stencil storefront. You can further customize the final price displayed within the Stencil template. For more information, see [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config). - -### OAuth scopes -The following OAuth Scopes are required: -* [Products](/docs/start/authentication/api-accounts#oauth-scopes) - -## Price list definitions -* A **price list** is a collection of price records. Price records make up a price list. -* A **price record** is a price override for a particular variant. At a minimum, it contains a variant ID, a price, and a currency. - -```js filename="Price Record" showLineNumbers copy -{ - "variant_id": 3121, - "price": 10.0, - "sale_price": 8.0, - "retail_price": 12.0, - "map_price": 6.0, - "currency": "EUR" -} -``` - -- `PriceRecordBatch`: a way to update several price records in a price list at once. Using this bulk upsert endpoint, you can upsert up to 1000 price records in a single API call. - -- **Currency:** a price list can contain records for multiple currencies. If you use a [transactional currency](/docs/store-operations/currencies#display-vs-transactional), the customer group or channel will use price records in that currency. If a multi-currency price list is unavailable, BigCommerce auto converts the catalog price. The customer group or channel uses price records in the default currency and performs a currency conversion for [display-only currencies](/docs/store-operations/currencies#display-vs-transactional). - -```http filename="Example request: Get all price lists" showLineNumbers copy -GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/pricelists -X-Auth-Token: {{ACCESS_TOKEN}} -Accept: application/json -Content-Type: application/json - -{} -``` - -## Price list assignments - -The price list assignment assigns a price list to a specific sales channel. This association lets you define custom pricing for shoppers on storefront channels, but doesn't affect pricing in different omnichannel environments, such as Facebook, Amazon, Instagram, etc. - -See [Channels, Sites, and Routes](/docs/rest-management/channels) for further documentation. - -```http filename="Example request: Create a price list assignment" showLineNumbers copy -POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pricelists/assignments -X-Auth-Token: {{ACCESS_TOKEN}} -Accept: application/json -Content-Type: application/json - -[ - { - "customer_group_id": 3, - "price_list_id": 2, - "channel_id": 1 - } -] -``` - -## Price lists assigned to customer groups - -```http filename="Example request: Assign a price list to a customer group" showLineNumbers copy -PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/customer_groups/{{customer_group_id}} -X-Auth-Token: {{ACCESS_TOKEN}} -Accept: application/json -Content-Type: application/json - -[ - { - "id": 1, - "name": "VIP Price List", - "is_default": false, - "category_access": { - "type": "all" - }, - "discount_rules": [ - { - "type": "price_list", - "price_list_id": 2 - } - ] - } -] -``` - -Under `discount_rules` the `type` is set to `price_list`. The `price_list_id` is 1, which is the id of the price list assigned to the group. - -## Price list notes - -- Bulk pricing tiers may additionally be associated with a Price Record to indicate different pricing as the quantity in cart increases. - -- If a variant has a `Price Record`, any existing product-level bulk pricing will not apply in the cart. For variants without `Price Records`, any existing product bulk pricing will apply. - -- `Price Lists Records` accepts bulk upsert. You can only do one [Bulk upsert](/docs/rest-management/price-lists/price-lists-records#upsert-price-list-records) at a time. Running more than one in parallel on the **same store** will cause a `429` error, and the request will fail. - -## Related resources - -### Endpoints -* [Get Price List Collection](/docs/rest-management/price-lists#get-all-price-lists) - -### Webhooks -There are webhooks available for Price Lists assignments. The price list assignment webhook fires when a price list assignment is assigned, reassigned, or unassigned. Note that since Price Lists directly relate to products, neither product nor SKU webhooks will fire for corresponding changes, such as pricing. - -* [Price list assignments](/docs/integrations/webhooks/events/channels#price-list-assignments) -* [Products](/docs/integrations/webhooks/events#webhook-events_products) -* [SKU](/docs/integrations/webhooks/events#webhook-events_sku) +# Price List API + +Price lists allow you to populate different versions of catalog pricing and assign them to different [Customer Groups](/docs/rest-management/customers-v2/customer-groups). The prices are specified exclusively at the variant level. If an active price list doesn't contain prices for a variant, then the catalog pricing will be used. + +You can assign a price list to a specific sales channel, customer group, or customer group on a specific sales channel, using price list assignments in the [Price List Assignment API](/docs/rest-management/price-lists/price-lists-assignments#create-price-list-assignments). You can also associate a price list to a customer group in the Control Panel or the [Customer Groups API](/docs/rest-management/customers-v2/customer-groups). Price list assignments combined with a customer group assignment allows you to better target the signed-in customers shopping on that channel. + +Price lists will provide overridden price values to the Stencil storefront. You can further customize the final price displayed within the Stencil template. For more information, see [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config). + +### OAuth scopes +The following OAuth Scopes are required: +* [Products](/docs/start/authentication/api-accounts#oauth-scopes) + +## Price list definitions +* A **price list** is a collection of price records. Price records make up a price list. +* A **price record** is a price override for a particular variant. At a minimum, it contains a variant ID, a price, and a currency. + +```js filename="Price Record" showLineNumbers copy +{ + "variant_id": 3121, + "price": 10.0, + "sale_price": 8.0, + "retail_price": 12.0, + "map_price": 6.0, + "currency": "EUR" +} +``` + +- `PriceRecordBatch`: a way to update several price records in a price list at once. Using this bulk upsert endpoint, you can upsert up to 1000 price records in a single API call. + +- **Currency:** a price list can contain records for multiple currencies. If you use a [transactional currency](/docs/store-operations/currencies#display-vs-transactional), the customer group or channel will use price records in that currency. If a multi-currency price list is unavailable, BigCommerce auto converts the catalog price. The customer group or channel uses price records in the default currency and performs a currency conversion for [display-only currencies](/docs/store-operations/currencies#display-vs-transactional). + +```http filename="Example request: Get all price lists" showLineNumbers copy +GET https://api.bigcommerce.com/stores/{{store_hash}}/v3/pricelists +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +Content-Type: application/json + +{} +``` + +## Price list assignments + +The price list assignment assigns a price list to a specific sales channel. This association lets you define custom pricing for shoppers on storefront channels, but doesn't affect pricing in different omnichannel environments, such as Facebook, Amazon, Instagram, etc. + +See [Channels, Sites, and Routes](/docs/rest-management/channels) for further documentation. + +```http filename="Example request: Create a price list assignment" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/pricelists/assignments +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +Content-Type: application/json + +[ + { + "customer_group_id": 3, + "price_list_id": 2, + "channel_id": 1 + } +] +``` + +## Price lists assigned to customer groups + +```http filename="Example request: Assign a price list to a customer group" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{store_hash}}/v2/customer_groups/{{customer_group_id}} +X-Auth-Token: {{ACCESS_TOKEN}} +Accept: application/json +Content-Type: application/json + +[ + { + "id": 1, + "name": "VIP Price List", + "is_default": false, + "category_access": { + "type": "all" + }, + "discount_rules": [ + { + "type": "price_list", + "price_list_id": 2 + } + ] + } +] +``` + +Under `discount_rules` the `type` is set to `price_list`. The `price_list_id` is 1, which is the id of the price list assigned to the group. + +## Price list notes + +- Bulk pricing tiers may additionally be associated with a Price Record to indicate different pricing as the quantity in cart increases. + +- If a variant has a `Price Record`, any existing product-level bulk pricing will not apply in the cart. For variants without `Price Records`, any existing product bulk pricing will apply. + +- `Price Lists Records` accepts bulk upsert. You can only do one [Bulk upsert](/docs/rest-management/price-lists/price-lists-records#upsert-price-list-records) at a time. Running more than one in parallel on the **same store** will cause a `429` error, and the request will fail. + +## Related resources + +### Endpoints +* [Get Price List Collection](/docs/rest-management/price-lists#get-all-price-lists) + +### Webhooks +There are webhooks available for Price Lists assignments. The price list assignment webhook fires when a price list assignment is assigned, reassigned, or unassigned. Note that since Price Lists directly relate to products, neither product nor SKU webhooks will fire for corresponding changes, such as pricing. + +* [Price list assignments](/docs/integrations/webhooks/events/channels#price-list-assignments) +* [Products](/docs/integrations/webhooks/events#webhook-events_products) +* [SKU](/docs/integrations/webhooks/events#webhook-events_sku) diff --git a/docs/store-operations/promotions/api-ui-features.mdx b/docs/store-operations/promotions/api-ui-features.mdx new file mode 100644 index 000000000..aa388828d --- /dev/null +++ b/docs/store-operations/promotions/api-ui-features.mdx @@ -0,0 +1,14 @@ +# Feature Differences Between the Promotions API and UI + +The following table lists the differences between the Promotions API and the control panel UI. + +| Usage | API | UI | +|:---------------------------------------------------------|:------------------:|:---------------:| +| `AND` operator usage at the conditional level to create promotion conditions with multiple criteria.| Add multiple criteria on a promotion condition by using the `AND` operator. (e.g., "Buy 2 units of X AND 3 units of Y.") | N/A <br></br> Only one criterion is allowed on promotion conditions. | +| `AND`, `OR`, & `NOT` operators nested in the item matcher when creating promotion conditions and rewards.| Use all three operators for deep nesting. (e.g., "Buy 2 products from either categories X, Y OR branch C, or D.")| Only the AND operator is allowed. (e.g., "Buy products from categories X, Y AND brand C, and D.") | +| `AND`, `OR`, & `NOT` operators for Customer Segments targeted in Promotions.| Combine all three operators for deep nesting when targeting Customer Segments.| Only combine the `OR` operator with `NOT`. | +| Assign coupon codes to a coupon promotion.| Assign multiple codes to one coupon promotion.| Assign only one code to a coupon promotion. | +| Manage execution priorities for automatic promotions. | N/A <br></br> Updates for promotion priorities are not allowed with the API.| Manage execution priorities through the control panel. | +| View, edit, and manage promotions, including notifications (banner messages) on the control panel UI. | N/A <br></br> You can not view, edit, or manage promotions created with the API.| Only promotions created with the legacy editor can include banner messages. | +| Apply minimum total order count restrictions on promotion conditions.| Achievable through the `minimum_order_count` attribute during creation.| N/A <br></br> You cannot set the minimum total order count.| + diff --git a/docs/store-operations/promotions/currency-specific-promotions.mdx b/docs/store-operations/promotions/currency-specific-promotions.mdx new file mode 100644 index 000000000..1ed6bb209 --- /dev/null +++ b/docs/store-operations/promotions/currency-specific-promotions.mdx @@ -0,0 +1,34 @@ +# Currency-Specific Promotions + +You can configure the promotion to target a single currency when creating a promotion. The promotion will only run when the shopper selects the same transactional currency within the cart and checkout. + +Here is an example promotion that offers 20 USD off garden material. This promotion will only run if the shopper uses USD as a transactional currency. + +```http filename="Example request: Create a currency-specific promotion" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/promotions +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "name": "20 USD dollar off all Garden material", + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "items": { + "categories": [ + 19 + ] + } + } + } + } + ] +} +``` diff --git a/docs/store-operations/promotions/examples/brand.mdx b/docs/store-operations/promotions/examples/brand.mdx new file mode 100644 index 000000000..e60eb5e4d --- /dev/null +++ b/docs/store-operations/promotions/examples/brand.mdx @@ -0,0 +1,884 @@ +# Brand Promotion Code Samples + + +## Spend $X in brand X and get free shipping to X shipping zones + +<Tabs items={['Request', 'Response']}> + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "Order $100 of this common good brand and get free shipping", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 1, + 3 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 37 + ] + }, + "minimum_quantity": 1, + "minimum_spend": 100 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get Free Shipping for Common Good Upsell", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "On the Cart Page, Eligible", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Applied Cart Page", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 3, + "name": "Order $100 of this common good brand and get free shipping", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 1, + 3 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 37 + ] + }, + "minimum_spend": "100", + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get Free Shipping for Common Good Upsell", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "On the Cart Page, Eligible", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Applied Cart Page", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T19:59:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Apply a $ or % discount to each item in one or more brands (AND, NOT operators) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "Apply a $ or % discount to each item in one or more brands", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "15" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "items": { + "and": [ + { + "brands": [ + 38, + 37, + 36, + 35 + ] + }, + { + "not": { + "categories": [ + 19 + ] + } + } + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get 15% off in Common Good, Chemex, Barr-Co and Kinfolk.\r\n<div> </div>", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for 15% off!\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations you have earned 15% off.", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 4, + "name": "Apply a $ or % discount to each item in one or more brands", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "15" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "and": [ + { + "brands": [ + 38, + 37, + 36, + 35 + ] + }, + { + "not": { + "categories": [ + 36 + ] + } + } + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get 15% off in Common Good, Chemex, Barr-Co and Kinfolk.\r\n<div> </div>", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for 15% off!\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations you have earned 15% off.", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T20:16:53+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Spend X amount in brand Y, get X% off in brand Y + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Spend X amount in brand Y and get X% off in brand Y", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": true, + "include_items_considered_by_condition": true, + "items": { + "brands": [ + 36 + ] + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_spend": "200", + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 5, + "name": "Spend X amount in brand Y and get X% off in brand Y", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": true, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "brands": [ + 36 + ] + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_spend": "200", + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T20:26:29+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Buy two items in a brand and get the cheapest one free + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two items in brand and get the cheapest one free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_items": { + "strategy": "LEAST_EXPENSIVE", + "include_items_considered_by_condition": true, + "discount": { + "percentage_amount": "100" + }, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 6, + "name": "Buy two brand items and get the cheapest one free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T20:37:29+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Buy two brand items and get the most expensive one at 50% off + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two brand items and get the most expensive one at 50% off", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_items": { + "strategy": "MOST_EXPENSIVE", + "include_items_considered_by_condition": true, + "discount": { + "percentage_amount": "50" + }, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 7, + "name": "Buy two brand items and get the most expensive one at 50% off", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "50" + }, + "strategy": "MOST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T20:43:34+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Buy two brand items and get the most expensive one at $50 off + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two brand items and get the most expensive one at $50 off", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_items": { + "strategy": "MOST_EXPENSIVE", + "include_items_considered_by_condition": true, + "discount": { + "fixed_amount": "50" + }, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 8, + "name": "Buy two brand items and get the most expensive one at $50 off", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "50" + }, + "strategy": "MOST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "brands": [ + 36 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T21:01:36+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Spend $X on brand Y and get product Z for free + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Spend $X on brand Y and get product Z for free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "brands": [ + 38 + ] + }, + "minimum_spend": 200 + } + }, + "action": { + "gift_item": { + "product_id": 130, + "quantity": 1 + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 9, + "name": "Spend $X on brand Y and get product Z for free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "gift_item": { + "quantity": 1, + "product_id": 130 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "brands": [ + 38 + ] + }, + "minimum_spend": "10" + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-15T21:15:28+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/category.mdx b/docs/store-operations/promotions/examples/category.mdx new file mode 100644 index 000000000..dcdf36a00 --- /dev/null +++ b/docs/store-operations/promotions/examples/category.mdx @@ -0,0 +1,833 @@ +# Category Promotion Code Samples + + +## Apply a $ or % discount to each item in one or more categories + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "20 dollars off all garden material", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "items": { + "categories": [ + 24 + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-01-29T00:00:00+00:00", + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 10, + "name": "20 dollars off all garden material", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 24 + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-01-29T00:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Apply a $ or % discount to each item in one or more categories, exclude items on sale + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "20 dollars off all garden material, exclude items on sale", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": true, + "items": { + "categories": [ + 19 + ] + } + } + }, + "apply_once": true, + "stop": false + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 11, + "name": "20 dollars off all garden material, exclude items on sale", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "5" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": true, + "items": { + "categories": [ + 36 + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-18T18:43:58+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Buy X units in (category A) and get Y additional units in the same category free (must be of equal or lesser value) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy X units in (Category A) and get Y additional units in the same category free (must be of equal or lesser value)", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "items": { + "categories": [ + 23 + ] + }, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "categories": [ + 23 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-02-01T05:00:00+00:00", + "status": "ENABLED" + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 12, + "name": "Buy X units in (Category A) and get Y additional units in the same category free (must be of equal or lesser value)", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 36 + ] + }, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "categories": [ + 36 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Buy three items in a category for the price of two (lowest priced item discounted) + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy three items in a category for the price of two (lowest priced item discounted)", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "categories": [ + 21 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "items": { + "categories": [ + 21 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 13, + "name": "Buy three items in a category for the price of two (lowest priced item discounted)", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 36 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "categories": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-18T19:02:16+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Buy product X or items from category Y and get $10 off items from category Z + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy product X or items from category Y and get $10 off items from category Z", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": true, + "condition": { + "cart": { + "items": { + "or": [ + { + "categories": [ + 1 + ] + }, + { + "products": [ + 1 + ] + } + ] + }, + "minimum_quantity": 1 + } + }, + "action": { + "cart_items": { + "discount": { + "fixed_amount": 10 + }, + "items": { + "categories": [ + 31 + ] + } + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 14, + "name": "Buy product X or items from category Y and get $10 off items from category Z", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 36 + ] + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "or": [ + { + "categories": [ + 36 + ] + }, + { + "products": [ + 123 + ] + } + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-18T19:16:26+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Buy three from category X, and get one from category Y free + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy three from category X and get one from category Y free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "categories": [ + 24 + ] + }, + "minimum_quantity": 3 + } + }, + "action": { + "cart_items": { + "discount": { + "percentage_amount": 100 + }, + "items": { + "categories": [ + 24 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 15, + "name": "Buy three from category X and get one from category Y free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 24 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "categories": [ + 24 + ] + }, + "minimum_quantity": 3 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-18T19:57:54+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Spend $X from category X and get product Y free + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy $X from category X and get product Y free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "categories": [ + 19 + ] + }, + "minimum_spend": 300 + } + }, + "action": { + "cart_items": { + "discount": { + "percentage_amount": 100 + }, + "items": { + "products": [ + 81 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 16, + "name": "Buy $X from category X and get product Y free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "products": [ + 123 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "categories": [ + 24 + ] + }, + "minimum_spend": "300" + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-18T20:07:24+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/customer.mdx b/docs/store-operations/promotions/examples/customer.mdx new file mode 100644 index 000000000..41d0a96be --- /dev/null +++ b/docs/store-operations/promotions/examples/customer.mdx @@ -0,0 +1,679 @@ +# Customer Promotion Code Samples + + +## 10% off for VIP customers + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for VIP customers", + "redemption_type": "AUTOMATIC", + "customer": { + "group_ids": [ + 1 + ] + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 17, + "name": "10% off for VIP customers", + "created_from": "api", + "customer": { + "group_ids": [ + 1 + ], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-19T13:46:55+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## 5% off for non-VIP customers (including guest customers, and registered customers who are not assigned to any groups, and registered customers who are assigned to a non-VIP group) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "5% off for non-VIP customers", + "redemption_type": "AUTOMATIC", + "customer": { + "excluded_group_ids": [ + 1 + ] + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "5" + } + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 18, + "name": "5% off for non-VIP customers", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [ + 1 + ], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "5" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-19T13:55:11+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## 3% off for guest customers or customers not assigned to any group + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "3% off for guest customers or customers not assigned to any group", + "redemption_type": "AUTOMATIC", + "customer": { + "group_ids": [ + 0 + ] + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "3" + } + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 19, + "name": "3% off for guest customers or customers not assigned to any group", + "created_from": "api", + "customer": { + "group_ids": [ + 0 + ], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "3" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-19T14:02:33+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## 10% off for customers with total order count of 10 or more + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for customers with total order count of 10 or more", + "redemption_type": "AUTOMATIC", + "customer": { + "minimum_order_count": 10 + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 20, + "name": "10% off for customers with total order count of 10 or more", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 10, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-19T14:14:12+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## 10% off for customers who belong to segment 1 or segment 2 (Closed Beta) + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for customers who belong to segment 1 or segment 2", + "redemption_type": "AUTOMATIC", + "customer": { + "segments": { + "isd": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464", + "d52fb39d-6715-430e-a0bf-21a192d790f0" + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + // closed Beta + { + "data": { + "id": 48, + "name": "10% off for customers who belong to segment 1 or segment 2", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": { + "id": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464", + "d52fb39d-6715-430e-a0bf-21a192d790f0" + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-22T17:33:02+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## 10% off for customers who do NOT belong to segment 1, including those who do not belong to any segments(Closed Beta) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for customers who do not belong to segment 1", + "redemption_type": "AUTOMATIC", + "customer": { + "segments": { + "not": { + "id": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464" + ] + } + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + // closed Beta + { + "data": { + "id": 49, + "name": "10% off for customers who do not belong to segment 1", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": { + "not": { + "id": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464" + ] + } + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-22T17:41:30+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## 10% off for customers who belong to segment 1 and segment 2 (Closed Beta) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for customers who belong to segment 1 and segment 2", + "redemption_type": "AUTOMATIC", + "customer": { + "segments": { + "and": [ + { + "id": ["61fd72bc-7400-4a7b-ac64-96c0d315c464"] + }, + { + "id": ["d52fb39d-6715-430e-a0bf-21a192d790f0"] + } + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + // closed Beta + { + "data": { + "id": 50, + "name": "10% off for customers who belong to segment 1 and segment 2", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": { + "and": [ + { + "id": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464" + ] + }, + { + "id": [ + "d52fb39d-6715-430e-a0bf-21a192d790f0" + ] + } + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-22T17:44:16+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> + +## 10% off for customers who belong to segment 3 or customers who belong to segment 1 and segment 2 (Closed Beta) + + <Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off for customers who belong to segment 3 or customers who belong to segment 1 and segment 2", + "redemption_type": "AUTOMATIC", + "customer": { + "segments": { + "or": [ + { + "id": ["4d843892-d90c-4f01-a36e-ce810172c094"] + }, + { + "and": [ + { + "id": ["61fd72bc-7400-4a7b-ac64-96c0d315c464"] + }, + { + "id": ["d52fb39d-6715-430e-a0bf-21a192d790f0"] + } + ] + } + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + // closed Beta + { + "data": { + "id": 51, + "name": "10% off for customers who belong to segment 3 or customers who belong to segment 1 and segment 2", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": { + "or": [ + { + "id": [ + "4d843892-d90c-4f01-a36e-ce810172c094" + ] + }, + { + "and": [ + { + "id": [ + "61fd72bc-7400-4a7b-ac64-96c0d315c464" + ] + }, + { + "id": [ + "d52fb39d-6715-430e-a0bf-21a192d790f0" + ] + } + ] + } + ] + } + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-22T17:48:59+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> +</Tabs> diff --git a/docs/store-operations/promotions/examples/logical-operators.mdx b/docs/store-operations/promotions/examples/logical-operators.mdx new file mode 100644 index 000000000..5cf7e7a7f --- /dev/null +++ b/docs/store-operations/promotions/examples/logical-operators.mdx @@ -0,0 +1,531 @@ +# Code Samples for Promotions that Use Logical Operators + +## Buy two of product X or buy two of product Y (OR operator) + +The following promotion uses the logical `OR` operator at item matcher level. Each of the following combinations satisfies the condition: +* 1 product X + 1 product Y +* 2 product X +* 2 product Y + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two of product X or buy two of product Y", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "condition": { + "cart": { + "items": { + "or": [ + { + "products": [ + 118 + ] + }, + { + "variants": [ + 134 + ] + } + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "gift_item": { + "product_id": 130, + "quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-02-01T05:00:00+00:00", + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 47, + "name": "Buy two of product X or buy two of product Y", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "gift_item": { + "quantity": 1, + "product_id": 130 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "or": [ + { + "products": [ + 118 + ] + }, + { + "variants": [ + 134 + ] + } + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Get percentage off X category, excluding an item (AND, NOT operators) + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Get 20% off all kitchen items, excluding Able Brewing System", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "items": { + "and": [ + { + "categories": [ + 25 + ] + }, + { + "not": { + "products": [ + 129 + ] + } + } + ] + }, + "discount": { + "percentage_amount": "20" + } + } + }, + "apply_once": true + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 23, + "name": "Get 20% off all kitchen items, excluding Able Brewing System", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "and": [ + { + "categories": [ + 25 + ] + }, + { + "not": { + "products": [ + 129 + ] + } + } + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T14:00:11+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Get X% off all brand X, except X products in brand Y (OR, AND, NOT operators) + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Get 20% off all coffee makers except for those using new arrivals coffee filters", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "items": { + "or": [ + { + "and": [ + { + "brands": [ + 37 + ] + }, + { + "categories": [ + 25 + ] + } + ] + }, + { + "and": [ + { + "brands": [ + 38 + ] + }, + { + "categories": [ + 35 + ] + }, + { + "not": { + "categories": [ + 24 + ] + } + } + ] + } + ] + }, + "discount": { + "percentage_amount": "20" + } + } + }, + "apply_once": true, + "currency_code": "AUD" + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 22, + "name": "Get 20% off all coffee makers except for those using new arrivals coffee filters", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "or": [ + { + "and": [ + { + "brands": [ + 37 + ] + }, + { + "categories": [ + 25 + ] + } + ] + }, + { + "and": [ + { + "brands": [ + 38 + ] + }, + { + "categories": [ + 35 + ] + }, + { + "not": { + "categories": [ + 24 + ] + } + } + ] + } + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T13:55:35+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## X% off storewide except product Y or product Z or any items in category C + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off storewide except 'Able Brewing System' or 'Chemex Coffeemaker' or any garden products", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": 10 + }, + "items": { + "and": [ + { + "not": { + "products": [ + 129, + 130 ] + } + }, + { + "not": { + "categories": [ + 24 + ] + } + } + ] + } + } + }, + "apply_once": true + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 21, + "name": "10% off storewide except 'Able Brewing System' or 'Chemex Coffeemaker' or any garden products", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "and": [ + { + "not": { + "products": [ + 129, + 130 + ] + } + }, + { + "not": { + "categories": [ + 24 + ] + } + } + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T13:49:42+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/multiple-rules.mdx b/docs/store-operations/promotions/examples/multiple-rules.mdx new file mode 100644 index 000000000..f19d38594 --- /dev/null +++ b/docs/store-operations/promotions/examples/multiple-rules.mdx @@ -0,0 +1,730 @@ +# Code Samples for Multiple Rule Promotions + +## Tiered $ off order based on order value + + + +<Tabs items={['Request', 'Response']}> + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Tiered $ off order based on order value", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "45" + } + } + }, + "apply_once": true, + "stop": true, + "currency_code": "AUD", + "condition": { + "cart": { + "minimum_spend": "175" + } + } + }, + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "30" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "150" + } + } + }, + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "15" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "100" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-02-01T05:00:00+00:00", + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 24, + "name": "Tiered $ off order based on order value", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "45" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "175" + } + } + }, + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "30" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "150" + } + } + }, + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "15" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "100" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Apply a tiered discount to X products based on the quantity of items ordered within X + +<Tabs items={['Request', 'Response']}> + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "Apply a tiered discount to applicable products based on the quantity of items ordered within X ", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": true, + "include_items_considered_by_condition": true, + "items": { + "categories": [ + 24 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 35 + ] + }, + "minimum_quantity": 4 + } + } + }, + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "15" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": true, + "include_items_considered_by_condition": true, + "items": { + "categories": [ + 25 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 25 + ] + }, + "minimum_quantity": 3 + } + } + }, + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": true, + "include_items_considered_by_condition": true, + "items": { + "categories": [ + 30 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": true, + "start_date": "2019-02-01T05:00:00+00:00", + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 25, + "name": "Apply a tiered discount to applicable products based on the quantity of items ordered within X ", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": true, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 24 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 35 + ] + }, + "minimum_quantity": 4 + } + } + }, + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "15" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": true, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 25 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 25 + ] + }, + "minimum_quantity": 3 + } + } + }, + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": true, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 30 + ] + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "items": { + "categories": [ + 36 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": true, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Up to 50% off storewide (50% off category X items and 40% off everything else) + + +<Tabs items={['Request', 'Response']}> + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Up to 50% off storewide (50% off category X items and 40% off everything else)", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": 50 + }, + "items": { + "categories": [ + 36 + ] + } + } + }, + "apply_once": true + }, + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": 40 + }, + "items": { + "not": { + "categories": [ + 24 + ] + } + } + } + }, + "apply_once": true + } + ] + } + ``` + + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + { + "data": { + "id": 26, + "name": "Up to 50% off storewide (50% off category X items and 40% off everything else)", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "50" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "categories": [ + 36 + ] + } + } + }, + "apply_once": true, + "stop": false + }, + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "40" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "not": { + "categories": [ + 24 + ] + } + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T14:54:01+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + } + ``` + + + </Tab> +</Tabs> + +## Buy X products, get free shipping, and 10% off order + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two of product X, get free shipping to all zones, and 10% off order", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "condition": { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + } + }, + { + "condition": { + "cart": { + "items": { + "products": [ + 130 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_value": { + "discount": { + "percentage_amount": 10 + } + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 27, + "name": "Buy two of product X, get free shipping to all zones, and 10% off order", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + } + }, + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 130 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T16:17:01+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + diff --git a/docs/store-operations/promotions/examples/order.mdx b/docs/store-operations/promotions/examples/order.mdx new file mode 100644 index 000000000..4509ec5f4 --- /dev/null +++ b/docs/store-operations/promotions/examples/order.mdx @@ -0,0 +1,524 @@ +# Order Promotion Code Samples + +## $X off when you purchase two of X product or one of X product (OR operator) + + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "$50 off when you buy two tiered wire baskets or a small purple towel", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "condition": { + "or": [ + { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + }, + { + "cart": { + "items": { + "variants": [ + 134 + ] + }, + "minimum_quantity": 1 + } + } + ] + }, + "action": { + "cart_value": { + "discount": { + "fixed_amount": "50" + } + } + }, + "apply_once": true + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 53, + "name": "$50 off when you buy two tiered wire baskets or a small purple towel", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "50" + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "or": [ + { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + }, + { + "cart": { + "items": { + "variants": [ + 134 + ] + }, + "minimum_quantity": 1 + } + } + ] + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-22T18:12:50+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Spend $X and get $X off order + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "Spend $X and get $X off order", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "20" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "200" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 28, + "name": "Spend $X and get $X off order", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "20" + } + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "minimum_spend": "200" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T16:39:16+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + </Tab> +</Tabs> + +## Order at least $X and get X item free + + +<Tabs items={['Request', 'Response']}> + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Order at least $X and get X item free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 130, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false, + "currency_code": "AUD", + "condition": { + "cart": { + "minimum_spend": "200" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + + + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 29, + "name": "Order at least $X and get X item free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "gift_item": { + "quantity": 1, + "product_id": 130 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "minimum_spend": "200" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T16:49:32+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + </Tab> +</Tabs> + +## Take X% off items storewide except for X category (NOT operator) + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "15% off store except sale", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "15" + }, + "items": { + "not": { + "categories": [ + 24 + ] + } + } + } + }, + "apply_once": true, + "stop": true + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "15% off store except sale", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 30, + "name": "15% off store except sale", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "15" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "not": { + "categories": [ + 24 + ] + } + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "15% off store except sale", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T16:54:22+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/product.mdx b/docs/store-operations/promotions/examples/product.mdx new file mode 100644 index 000000000..236a4ab62 --- /dev/null +++ b/docs/store-operations/promotions/examples/product.mdx @@ -0,0 +1,1381 @@ +# Product Promotion Code Samples + +## Buy one and get one free + + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy one and get one free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 130, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "currency_code": "AUD", + "condition": { + "cart": { + "items": { + "products": [ + 130 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED", + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 31, + "name": "Buy one and get one free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "gift_item": { + "quantity": 1, + "product_id": 130 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 130 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00", + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Buy (X units) of product A and get (Y units) of product B for $ or % off per unit + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showlineNumbers copy + { + "name": "Buy two X and get 10% off Y", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 32, + "name": "Buy two X and get 10% off Y", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T17:15:06+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Get $ or % off product X + + + +<Tabs items={['Request', 'Response']}> + + <Tab> + ```json filename="Example request" showLineNumbers copy + { + "name": "Spend 100 dollars and get 10% off small orbit", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "as_total": false, + "include_items_considered_by_condition": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "minimum_spend": "100" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + + + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 33, + "name": "Spend 100 dollars and get 10% off small orbit", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "minimum_spend": "100" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T17:50:53+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + </Tab> +</Tabs> + +## Take X% off the most expensive item in the cart + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Apply 20% off most expensive cart item", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "quantity": 1, + "strategy": "MOST_EXPENSIVE", + "as_total": false + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-01-31T05:00:00+00:00", + "end_date": null, + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 34, + "name": "Apply 20% off most expensive cart item", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "strategy": "MOST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "quantity": 1 + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-01-31T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + + </Tab> +</Tabs> + +## Buy X product variant and get X product variant free + + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy X product variant and get X product variant free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "variant_id": 151, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "currency_code": "GBP", + "condition": { + "cart": { + "items": { + "variants": [ + 139 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 56, + "name": "Buy X product variant and get X product variant free", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "gift_item": { + "quantity": 1, + "variant_id": 151 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "variants": [ + 139 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-25T19:11:27+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Amount off + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "US $50 off a specific product", + "redemption_type": "AUTOMATIC", + "currency_code": "USD", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + }, + "action": { + "cart_items": { + "discount": { + "fixed_amount": "50" + }, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1, + "include_items_considered_by_condition": true + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 35, + "name": "US $50 off a specific product", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "fixed_amount": "50" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T18:21:18+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + + + </Tab> +</Tabs> + +## Percentage off + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "US 15% off a specific product", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + }, + "action": { + "cart_items": { + "discount": { + "percentage_amount": "75" + }, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1, + "include_items_considered_by_condition": true + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 37, + "name": "US 15% off a specific product", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "75" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": true, + "exclude_items_on_sale": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T19:05:02+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Buy three for the price of two + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy three for the price of two", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "apply_once": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 2 + } + }, + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + } + } + ] + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 36, + "name": "Buy three for the price of two", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "100" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "products": [ + 130 + ] + }, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T19:03:50+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + + + </Tab> +</Tabs> + +## Buy extra-small or medium item and get free shipping to zone id 1 (Product Options Item Matcher) + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy extra-small or medium item and get free shipping to zone id 1", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "condition":{ + "cart":{ + "items": { + "product_option": { + "type": "string_match", + "name": "Size", + "values": [ + "XS", + "M" + ] + } + }, + "minimum_quantity": 1 + } + }, + "action":{ + "shipping":{ + "free_shipping":true, + "zone_ids":[ + 1 + ] + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 38, + "name": "Buy extra-small or medium item and get free shipping to zone id 1", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 1 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "product_option": { + "type": "string_match", + "name": "Size", + "values": [ + "XS", + "M" + ] + } + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T19:11:08+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Buy extra-small blue or medium blue item and receive free shipping (Product Options Item Matcher) + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy extra-small blue or medium blue item and receive free shipping", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "condition": { + "cart": { + "items": { + { + "product_option": { + "type": "string_match", + "name": "Size", + "values": [ + "XS", + "M" + ] + } + }, + { + "product_option": { + "type": "string_match", + "name": "Color", + "values": [ + "Blue" + ] + } + } + }, + "minimum_quantity": 1 + } + }, + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 1 + ] + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 43, + "name": "Buy extra-small blue or medium blue item and receive free shipping", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 1 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + { + "product_option": { + "type": "string_match", + "name": "Size", + "values": [ + "XS", + "M" + ] + } + }, + { + "product_option": { + "type": "string_match", + "name": "Color", + "values": [ + "Blue" + ] + } + } + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T20:03:22+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Take 20% off all men's clothing (Product Custom Field Item Matcher) + + +<Tabs items={['Request', 'Response']}> + + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Apply 20% off all male clothing", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "items": { + "product_custom_field": { + "name": "Gender", + "values": [ + "Mens" + ] + } + } + } + } + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 260, + "name": "Apply 20% off all male clothing", + "channels": [], + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "20" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "product_custom_field": { + "name": "Gender", + "values": ["Mens"] + } + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2023-04-20T01:27:36+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/shipping.mdx b/docs/store-operations/promotions/examples/shipping.mdx new file mode 100644 index 000000000..b6c2e0682 --- /dev/null +++ b/docs/store-operations/promotions/examples/shipping.mdx @@ -0,0 +1,421 @@ +# Shipping Promotion Code Samples + +## Buy two of X and buy two of Y and get free shipping to all zones start/end times (AND operator) + + + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Buy two of X, buy two of Y and get free shipping to all zones", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + }, + "apply_once": true, + "stop": false, + "currency_code": "AUD", + "condition": { + "and": [ + { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + }, + { + "cart": { + "items": { + "variants": [ + 134 + ] + }, + "minimum_quantity": 2 + } + } + ] + } + } + ], + "notifications": [], + "stop": false, + "status": "ENABLED", + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00" + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 54, + "name": "Buy two of X, buy two of Y and get free shipping to all zones", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + }, + "apply_once": true, + "stop": false, + "condition": { + "and": [ + { + "cart": { + "items": { + "products": [ + 118 + ] + }, + "minimum_quantity": 2 + } + }, + { + "cart": { + "items": { + "variants": [ + 134 + ] + }, + "minimum_quantity": 2 + } + } + ] + } + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00", + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Order at least X units of product Y and get free shipping to specific shipping zones + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showlineNumbers copy + { + "name": "Order at least X units of product Y and get free shipping to specific shipping zones", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 2, + 3 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get free shipping for purchasing Twine Stand with Cutter. Limited to first 50 customers!\r\n<div> </div>", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE", + "CHECKOUT_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for free shipping.\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations you get free shipping!\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "max_uses": 50, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": "2019-02-05T04:59:59+00:00", + "status": "ENABLED" + } + ``` + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 44, + "name": "Order at least X units of product Y and get free shipping to specific shipping zones", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": [ + 2, + 3 + ] + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Get free shipping for purchasing Twine Stand with Cutter. Limited to first 50 customers!\r\n<div> </div>", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE", + "CHECKOUT_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for free shipping.\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations you get free shipping!\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": 50, + "start_date": "2019-02-01T05:00:00+00:00", + "end_date": "2019-02-05T04:59:59+00:00", + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> + +## Order at least 2X of product and get free shipping + + + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "Order at least 2X of product and get free shipping", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "status": "ENABLED", + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00" + } + ``` + + + + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 45, + "name": "Order at least 2X of product and get free shipping", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "shipping": { + "free_shipping": true, + "zone_ids": "*" + } + }, + "apply_once": true, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 129 + ] + }, + "minimum_quantity": 2 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2019-02-06T05:00:00+00:00", + "end_date": "2019-02-09T04:59:59+00:00", + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/examples/storewide.mdx b/docs/store-operations/promotions/examples/storewide.mdx new file mode 100644 index 000000000..0554ccabf --- /dev/null +++ b/docs/store-operations/promotions/examples/storewide.mdx @@ -0,0 +1,96 @@ +# Storewide Promotion Code Samples + +## 10% off storewide except 'Huggies', 'Munchkin', and 'Pampers' brand products (NOT operator) + + + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```json filename="Example request" showLineNumbers copy + { + "name": "10% off storewide except 'Huggies', 'Munchkin', and 'Pampers' brand products", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "items": { + "not": { + "brands": [ + 35, + 36, + 37 + ] + } + } + } + }, + "apply_once": true + } + ] + } + ``` + </Tab> + <Tab> + ```json filename="Example response" showLineNumbers copy + { + "data": { + "id": 46, + "name": "10% off storewide except 'Huggies', 'Munchkin', and 'Pampers' brand products", + "created_from": "api", + "customer": { + "group_ids": [], + "minimum_order_count": 0, + "excluded_group_ids": [], + "segments": null + }, + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "strategy": "LEAST_EXPENSIVE", + "add_free_item": true, + "as_total": false, + "include_items_considered_by_condition": false, + "exclude_items_on_sale": false, + "items": { + "not": { + "brands": [ + 35, + 36, + 37 + ] + } + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [], + "stop": false, + "currency_code": "USD", + "redemption_type": "AUTOMATIC", + "shipping_address": null, + "current_uses": 0, + "max_uses": null, + "start_date": "2022-07-21T20:21:08+00:00", + "end_date": null, + "status": "ENABLED", + "schedule": null, + "can_be_used_with_other_promotions": true + }, + "meta": {} + } + ``` + + </Tab> +</Tabs> diff --git a/docs/store-operations/promotions/index.mdx b/docs/store-operations/promotions/index.mdx new file mode 100644 index 000000000..3e0c08f88 --- /dev/null +++ b/docs/store-operations/promotions/index.mdx @@ -0,0 +1,940 @@ +# Promotions API + + +<Callout type="info"> + The following condition and actions are available: + * Cart **condition** evaluates against what’s in the shopping cart. + * Free shipping **action** gives free shipping. + * Cart item **action** applies discounts on each eligible line item in the cart. + * Cart value **action** applies to the promotion value of the entire cart. + * Gift item **action** gives a free gift item. + * Fixed price set **action** applies a fixed price for a set of items. +</Callout> + + +## Introduction +Promotions are a way to give discounts based on whether the shopper has met specific criteria such as ordering a certain amount, purchasing certain brands, or being a repeat customer. + +There are two ways to make a promotion. + +1. Create a [Rule](/docs/rest-management/promotions) that includes a [Condition](/docs/rest-management/promotions) on which to take an action. For example, buy one (condition) get one free (action). The shopper must meet the condition of having a certain item in the cart before getting another item free. + +2. Create a promotion with just an action. For example, take 20% off the most expensive item in the cart. The shopper does not need to satisfy any special conditions, and the promotion will apply automatically. + +You can set the priority or the order in which the promotions apply, their start and end times, and the banners that appear to alert the shopper to the promotion. + +## How to create a promotion + +In this section, we will walk you through creating a buy one get one free promotion. While creating the promotion, we will review basic information about the Promotions API. The following is an example of the final request. We will step through the promotion line by line and explain the details. + +Before starting, make sure you have: +* The [Promotions API Reference](/docs/rest-management/promotions) +* A `product_id` +* An API Account with an [OAuth scope](/docs/start/authentication#oauth-scopes) that includes `modify store_v2_marketing` +* Reviewed the [Recommended usage](#recommended-usage) + + +```json filename="Buy one get one: Example promotion" showLineNumbers copy +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 174 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Buy one Le Parfait Jar, Get One Free!", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations, you have received a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-01-28T00:00:00+00:00", + "status": "ENABLED" +} +``` + +First, give the promotion a name. This name will appear in the control panel for the merchant and as part of the response. Then we need to build the rule. Remember, a rule consists of a [Condition](/docs/rest-management/promotions) and an [Action](/docs/rest-management/promotions). To create the rule, you need the action, condition, and the remaining configuration fields. + +### Creating the action + +There are five possible actions for promotions: +* [Cart Items Action](/docs/rest-management/promotions) will apply to the individual items in the cart. +* [Cart Value Action](/docs/rest-management/promotions) will apply to the promotion value of the entire cart. +* [Shipping Action](/docs/rest-management/promotions) will give a discount on shipping, which can be limited to specific zones. +* [Gift Item Action](/docs/rest-management/promotions) will give a gift item for free. +* [Fixed Price Set Action](/docs/rest-management/promotions) will give a fixed price for a set of items. + +In this example, we will create a buy one, get one discount. We’ll use Cart Items Action, or `cart_items`, since the shopper will purchase an item, and the discount applies after the item is in the cart. + +#### Discount + +[Discount](/docs/rest-management/promotions) type can be a percentage amount or a fixed amount. You will use a fixed amount when the promotion offers X dollars off an item or items. Percentage discounts offer a percentage off an item or items. When the promotion is to buy one get one free, you will use the percentage discount because one item will be free or 100% off. Using the percent discount avoids having to calculate the item price every time. + +In this example, we will use the `percentage_amount` set to 100. + +#### Strategy + +[Strategy](/docs/rest-management/promotions) decides how the discount applies when multiple items are in the cart. `LEAST_EXPENSIVE` sorts the items in ascending order by price, and the discount applies to the cheapest item. You can also change the Strategy to apply to the `MOST_EXPENSIVE` item in the cart. + +In this example, we will use the `LEAST_EXPENSIVE` [Strategy](/docs/rest-management/promotions). + +#### As total + +`as_total` will distribute the discount across the items. For example, if the total discount is $10 on two items, setting `as_total` to `true` will apply a total of $5 to each item. If set to `false`, $10 will apply per item for a total discount of $20. + +In this example, we set `as_total` to false. + +#### Items object + +The items object includes a product array. You should apply action against this list of products. Quantity is the number of products that can use the discount. The shopper will continue to get the discount as long as the condition is satisfied. + +In this example, the product array only has one item available for a discount. Quantity is set to one since the promotion is to buy one get one. + +So far, the promotion should look like the following: + +```json filename="Buy one get one: Example promotion with action" showLineNumbers copy +// **This is an abbreviated code sample.** +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "currency_code": "USD", + "condition": { + "cart": { + "items": { + "products": [ + 174 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Buy one Le Parfait Jar, Get One Free!", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations, you have received a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-01-28T00:00:00+00:00", + "status": "ENABLED" +} +``` + +### Setting the rule configuration + +After the Action object, you will need to set two configurations within the rule. + +**Apply once** + +You can set `apply_once` to `true` or `false`. If set to `true`, the action will only happen once. If set to `false`, it will happen more than once. Set this carefully. In the promotion we are building, setting it to `false` means the shopper can add two products to the cart and get two of the same items for free. + +<Callout type="warning"> + #### Use care with `apply_once` + Set `apply_once` carefully to avoid giving a more generous discount than intended. +</Callout> + +**Stop** + +Stop determines whether the remaining rules apply. Promotions can have more than one rule. If you set stop to `true` on a rule and it is applied successfully, you will end the evaluation. If you set stop to `false` the following rule will be evaluated regardless of the outcome. + +If there is only one rule, you can set stop to either `true` or `false` without affecting the results. + +**Currency code** + +Promotions only apply to orders in the specified transactional currency. `currency_code` is optional and defaults to the store default currency if not supplied. + +The `currency_code` must be an uppercase three-letter string that corresponds with an [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. For example: +* USD +* GBP +* AUD + +BigCommerce supports both display and transactional currencies. Transactional currencies are the actual currency customers use to perform the transaction. Display currencies allow shoppers to see prices in a chosen currency; however, BigCommerce will convert to the default transactional currency for payment. + +Thus, promotions in the default currency will apply to all display currencies in addition to the default currency. + +Promotions that have a non-default transactional currency will only apply to that currency. For example: + +You have configured five currencies in your store. +1. USD - default transactional +2. AUD - transactional +3. GBP - transactional +4. NZD - display +5. CAD - display + +Promotions created in +1. USD will apply to orders in USD, NZD, CAD +2. AUD will only apply to orders in AUD +3. GBP will only apply to orders in GBP +4. NZD & CAD are not valid `currency_code` values as they are display only + +So far, the promotion should look like the following: + +```json filename="Buy one get one: Stop, apply_once" showLineNumbers copy +// **This is an abbreviated code sample.** +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "currency_code": "USD" + } + ] +} +``` + +### Creating the condition + +We can base the condition on one of the following condition types: +* [Cart Condition](/docs/rest-management/promotions) Uses the cart contents +* [And Condition](/docs/rest-management/promotions) Logical and operator +* [Or Condition](/docs/rest-management/promotions) Logical or operator +* [Not Condition](/docs/rest-management/promotions) Logical not operator + +Cart condition allows you to set the items (products), `minimum_quantity` and, `minimum_spend`. Setting the `minimum_quantity` determines how many items the shopper needs in the cart for the promotion to trigger. The promotion can buy one, buy two, etc. The `minimum_spend` is how much the shopper needs to spend for the discount to trigger. If left blank or not included, it assumes the shopper does not have a `minimum_spend`. In our buy one get one example, the number of products, not the amount purchased, triggers the discount, so you do not need to include it. + + +In this example, we will use cart condition. Then apply a discount against items added to our product array. The product should match the one set in the preceding action product array. If they do not match, the discount will be buy X product get Y product free. Set the `minimum_quantity` to one. + +So far, the promotion should look like the following: + +```json filename="Buy one get one: Example with condition" showLineNumbers copy +// **This is an abbreviated code sample.** +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 174 + ] + }, + "minimum_quantity": 1 + } + } + } + ] +} +``` + +### Create the notifications + +A notification represents a message you can display to a shopper depending on the state of an evaluated rule (for example, a “Congratulations! You’ve received free shipping!” message when the shopper receives free shipping). Due to the nature of cart-level discounts, they will not be apparent to the customer until they have added products to their cart. For this reason, we recommend advertising your discounts with a notification. + +There are four types of notifications: + +* **Promotion**: `PROMOTION` notifications are visible the entire time a promotion is active. (i.e., “Spend $50 and get free shipping!”). + +* **Upsell:** `UPSELL` notifications show when the user has made partial progress towards unlocking a discount. You can use this type of notification to increase the Average Order Value (AOV) or increase the quantity of items in the average order (example: “You’ve spent $40, add another $10 to your cart to receive free shipping!”, “You have 1 of Rebel Shoes, buy one more get 20% off your order total”). + + +* **Eligible:** `ELIGIBLE` notifications show when the user has met the conditions for a rule but hasn’t yet taken advantage of the discount it provides (i.e., “You’ve spent over $60 on bathroom accessories and are eligible to choose a free item from the ‘Towels’ category!”). + +<Callout type="info"> + #### Banners + Eligible banners display if the actions attached to the rule can’t be automatically applied, such as the shopper selecting a free product from a category. +</Callout> + +* **Applied:** `APPLIED` notifications show once the shopper has received the discount in their cart (i.e., “Congratulations! You’ve received a free bath towel!”). + +Each of these notifications can be attached to one or multiple locations. A location defines the context when these notifications are displayed. + +There are four locations: + +* **Home Page:** `HOME_PAGE` is the store's homepage. A good example of notification on this location could be an upsell or a promotional banner. + +* **Product Page:** `PRODUCT_PAGE` is a Product Detail Page(PDP) for a specific product. When you meet condition and notification criteria, a notification will appear on a PDP. Example: “Buy 2 of Rebel Shoes, get 10% off your order total” will appear on Rebel Shoes PDP only. + +* **Cart Page:** `CART_PAGE` is the cart page. + +* **Checkout Page:** `CHECKOUT_PAGE` is the checkout page. + +Notifications accept HTML as part of the formatting. In this example, we have set content for each type. The location array can have the content message appear in more than one location. + +So far, the promotion should look like the following: + +```json filename="Buy one get one: Example with notifications" showLineNumbers copy +// **This is an abbreviated code sample.** +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 174 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Buy one Le Parfait Jar, Get One Free!", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations, you have received a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + } + ] +} +``` + +<Callout type="info"> + #### Placeholders + You can use [Placeholders](https://support.bigcommerce.com/s/article/Automatic-Promotions?language=en_US#placeholders) to inject information into the banners. Some placeholders only apply to certain discount types. +</Callout> + +### Finishing the promotion + +**Priority** + +Priority determines the order in which you can apply promotions in your cart. A lower number means higher priority. You can use the sort query parameter of the Get All Promotions endpoint to sort promotions by priority. + +**Stop** + +Stop determines if you want to calculate any other promotions after this one. Setting it to `true` means no other promotions are taken into consideration after this one is applied. + +<Callout type="warning"> + #### Consider a stop + Considered setting the stop if there is more than one promotion active at a time. +</Callout> + +<Callout type="info"> + #### Two stops + There are two stops. One stop in the promotion to decide if the other promotions will execute. One stop in the rule determines if different rules in the same promotion will execute. +</Callout> + + +**Max Uses** + +The number of times you can use a promotion before the status changes to **DISABLED**. `max_uses` is optional; if not set, the promotion will be active until manually disabled. + +**Start Date** + +Time and date to start the promotion. If left blank, it will default to the current time. + +**End Date** + +Time and date to end the promotion. + +**Status** +Status is a way to enable and disable the promotion. You can set Status by start dates, end dates, and max uses. + +The following is the completed promotion for buy one, get one free. + +```json filename="Buy one get one: Example complete" showLineNumbers copy +// **Completed code sample.** +{ + "name": "Buy One Get One Free", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "gift_item": { + "product_id": 174, + "quantity": 1 + } + }, + "apply_once": false, + "stop": false, + "condition": { + "cart": { + "items": { + "products": [ + 174 + ] + }, + "minimum_quantity": 1 + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "Buy one Le Parfait Jar, Get One Free!", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "You are eligible for a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "Congratulations, you have received a free Le Parfait Jar.", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "start_date": "2019-01-28T00:00:00+00:00", + "status": "ENABLED" +} +``` + + +## How to create a coupon promotion + +1. To create a coupon promotion, create a promotion with the `redemption_type` as `COUPON`. +2. Send a request to the [Create a coupon code](/docs/rest-management/promotions/coupon-codes-single#create-a-coupon-code-beta) endpoint. Include `code` and `max_uses` in the request body. + +```http filename="Example request: Create coupon promotion" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/promotions/{{promotion_id}}/codes +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "code": "30off100", + "max_uses": 100 +} +``` + +<Callout type="warning"> + #### Redemption type + Once you set the redemption_type, you can not change it through a `PUT`. +</Callout> + +```json filename="Example response: Spend $100, get $30 off" showLineNumbers copy +{ + "name": "Get $30 off $100", + "customer": { + "group_ids": [], + "minimum_order_count": 0 + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "fixed_amount": "30" + } + } + }, + "apply_once": true, + "stop": true, + "condition": { + "cart": { + "minimum_spend": "100" + } + } + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "currency_code": "USD", + "current_uses": 0, + "max_uses": 100, + "start_date": "2019-07-26T05:00:00+00:00", + "end_date": null, + "status": "ENABLED", + "redemption_type": "COUPON" +} +``` + + +To see the list of codes attached to a promotion, send a request to the [Get coupon codes](/docs/rest-management/promotions/coupon-codes-bulk#get-coupon-codes-beta) endpoint. The promotion code is not available using the [Get a promotion](/docs/rest-management/promotions/promotions-single#get-promotion-beta) endpoint. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get promotion codes" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/promotions/{{promotion_id}}/codes + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + ``` + </Tab> + <Tab> + + ```json filename="Example response: Get promotion codes" showLineNumbers copy + { + "data": [ + { + "id": 1, + "code": "30off100", + "current_uses": 0, + "max_uses": 100, + "created": "2019-07-26T16:44:32+00:00" + } + ], + "meta": { + "pagination": { + "total": 1, + "count": 1, + "per_page": 50, + "current_page": 1, + "total_pages": 1, + "links": { + "current": "?page=1&limit=50" + } + } + } + } + ``` + </Tab> +</Tabs> + +## Merchant view +After you create the promotion, it will appear under **Marketing > Promotions > Automatic**. Promotions that are simple enough can be edited using the Promotions Manager. For information on what makes a promotion "too complex" to be edited, see the [Advanced Promotions FAQ (Help Center)](https://support.bigcommerce.com/s/article/Automatic-and-Coupon-Promotions-Standard-Editor#faq). Authorized control panel users can change the priority, set the end date, disable, and delete all promotions. + +<Callout type="info"> + #### Complex promotions + You can create more complex promotions using the Promotions API than with the Promotions Manager. +</Callout> + + +![Control Panel](https://storage.googleapis.com/bigcommerce-production-dev-center/images/promotions-control-panel.png "Control Panel") + + + +## Action-only promotions + +Rules do not need conditions (e.g., 10% off All Common Good Brand). Here, omit the rule and add the action part of the promotion. Condition is not necessary since the shopper does not need to take any additional actions to apply the discount. + +```json filename="Example request: Action-only promotion" showLineNumbers copy +{ + "name": "10% off Fog Linen Work", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "10" + }, + "items": { + "brands": [ + 40 + ] + } + } + }, + "apply_once": true, + "stop": false + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "<div> Get 10% off All Linen Fog Work.</div>\r\n<div> </div>", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE", + "CHECKOUT_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "<div>You are eligible for 10% off Linen Fog Work.</div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "<div> Congratulations! You saved 10% on Linen Fog Work.  %</div>\r\n<div> </div>", + "locations": [ + "CART_PAGE" + ] + } + ], + "stop": false, + "max_uses": 200, + "start_date": "2019-02-07T05:00:00+00:00", + "end_date": "2019-02-14T04:59:59+00:00", + "status": "ENABLED" +} +``` + + + +## Product level discount and order level discount + +Order level discount only comes from [Cart Value Action](/docs/rest-management/promotions); it does not allow for you to exclude line items. Product level discounts only come from [Cart Items Action](/docs/rest-management/promotions) which excludes line items while the discounts display on individual eligible items. + +### Actual discounting behavior + +[Cart Value Action](/docs/rest-management/promotions) only applies to order subtotal, that is, line items in the cart, but not shipping or handling fees. When applying order level discounts, all line items in the cart receive equal amounts -- this design allows you to attribute discounts to individual line items for correct tax calculation. + +Product level discounts display as discounts on each line item with a strikethrough. + +![Product Level Discount Display](https://storage.googleapis.com/bigcommerce-production-dev-center/images/promotions-product-level-discount-display.png "Product Level Discount Display") + +Order level discounts display as a separate line item on the order. + +![Order Level Discount Display](https://storage.googleapis.com/bigcommerce-production-dev-center/images/promotions-order-level-discount-display.png "Order Level Discount Display") + +### Weighting +Product level discounts always apply before order level discounts regardless of the execution sequence of the promotions. + + + +## Customer-specific promotions +Use the [Cart Value Action](/docs/rest-management/promotions) property to limit the number of customers eligible for a specific promotion. + +The following promotion will only apply to the customers in the VIP group (group ID 1) with a minimum total order count of 10. + +```json filename="Example request: 10% off with minimum order of 10 count" showLineNumbers copy +{ + "name": "10 % Off for VIP Customers With Minimum Total Order Count of 10", + "redemption_type": "AUTOMATIC", + "customer": { + "group_ids": [ + 1 + ], + "minimum_order_count": 10 + }, + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] +} +``` + + +## Free shipping + +At the moment, we offer a free shipping action that provides an additional shipping method called “free shipping” on the storefront checkout flow. This shipping method is not the same as 100% off shipping since the shopper has a choice of shipping options, including free shipping. + + +## Using logical operators + +Using logical operators allows you to create promotions that require a shopper to meet more than one condition before the discount applies. Customers can use logical operators to exclude brands, products, and categories from discounts. + +The following two examples demonstrate the flexibility of using logical operators in promotions. Each example shows two similar cart conditions and how to fulfill each condition. + +* Two items from brand X and two items from category Y +* Two items from either brand X and category Y + +```json filename="Example request: And operator" showLineNumbers copy +{ + ... + "and": [ + { + "cart": { + "minimum_quantity": 2, + "items": { + "brands": [x] + } + } + }, + { + "cart": { + "minimum_quantity": 2, + "items": { + "categories": [y] + } + } + } + ] +} +``` + +```json filename="Approximate schema: And condition" showLineNumbers copy +{ + "Rule": { + "Condition": { + "AndCondition": [{ + "CartCondition": { + "ItemMatcher": {}, + "minimum_quantity": "number" + }, + "CartCondition": { + "ItemMatcher": {}, + "minimum_quantity": "number" + } + }] + } + } +} +``` + +Two items that belong to both brand X and category Y: + +```json filename="Example request: Cart condition" showLineNumbers copy +{ + ... + "cart": { + "minimum_quantity": 2, + "items": { + "and": [ + { + "brands": [x] + }, + { + "categories": [y] + } + ] + } + } +} +``` + +```json filename="Approximate schema: And Item Matcher" showLineNumbers copy +{ + "Rule": { + "Condition": { + "CartCondition": { + "minimum_quantity": "number", + "ItemMatcher": { + "AndItemMatcher": [{ + "BrandItemMatcher(SimpleItemMatcher)": [], + "CategoriesItemMatcher(SimpleItemMatcher)": [] + }] + } + } + } + } +} +``` + +The following promotion uses [Cart Items Action > Item Matcher > Not Item Matcher > Categories Item Matcher](/docs/rest-management/promotions). This promotion gives all items in the cart 15% off except for items in the sale category. This promotion also does not have a condition. There is nothing the shopper needs to do to apply the discount. + +```json filename="Example request: 15% off except sale" showLineNumbers copy +{ + "name": "15% off store except sale items", + "redemption_type": "AUTOMATIC", + "rules": [ + { + "action": { + "cart_items": { + "discount": { + "percentage_amount": "15" + }, + "items": { + "not": { + "categories": [ + 18 + ] + } + } + } + }, + "apply_once": true, + "stop": true + } + ], + "notifications": [ + { + "type": "UPSELL", + "content": "15% off store except sale", + "locations": [ + "HOME_PAGE", + "PRODUCT_PAGE", + "CART_PAGE" + ] + }, + { + "type": "ELIGIBLE", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + }, + { + "type": "APPLIED", + "content": "15% off store except sale", + "locations": [ + "CART_PAGE" + ] + } + ] +} +``` + +## Recommended usage +BigCommerce recommends having less than 100 active promotions on storefronts, and there should be at most ten rules per promotion. This recommended usage helps to prevent a slowdown of the checkout process or contribute to an out-of-memory error. + + +## Definitions + +### Active and Inactive Promotions +If a promotion has reached its `max_uses`, the status will change to inactive, and the promotion will no longer be available to shoppers. The start and end date can also change the status of the promotion. + +### Multiple Promotions +If there are multiple promotions active on a store, set the priority attribute to control the order in which the promotions apply. A higher priority means the promotion will apply first. (e.g., priority 1 promotion runs before priority 2) + +### Promotion Stop +The stop attribute controls whether to skip all the promotions with lower priority than the current when the current promotion is applied successfully. + +<Callout type="warning"> + #### Consider a stop + If there is more than one promotion active at a time, consider setting the stop. + </Callout> + + +### Apply once +Apply once controls whether a promotion can run multiple times or just once. If you configure the promotion to repeat, we run a loop to check if a condition is satisfied, then apply action until a condition is no longer satisfied. Notice that under certain conditions/action combinations, this may result in an infinite loop that moves the promotion into “INVALID” status. This is part of the [Rule object](/docs/rest-management/promotions). + + +### As total +If set to `true`, the promotion is distributed among the items in the cart. For example, if the discount is $10 and two eligible items are in the cart, the discount is spread among the items. In this case, each item will get a $5 discount. + +If set to `false`, then the promotion will apply to each item. For example, if the discount is $10, each item will be discounted by $10, making the total discount $20. This is part of the [Cart Items Action](/docs/rest-management/promotions). + +### Include items considered by condition + +If set to `false`, items that used to satisfy the condition will no longer include the discount. For example, buy one get one 20% off. If the cart only contains one item, you can not use it for the discount. + +If set to `true`, the item used to satisfy the condition are included in the discount. For example, buy X get a discount. If there is only one item in the cart, you can use it to satisfy the discount. + +*Buy one from category X, get one free product from the same category*: + +When the cart only has one item, it will not discount the item in the cart. When the second item from the same category is added, the second item will be free. It is using the original item in the cart to satisfy the condition. + +*Buy two from category X, receive $10, buy three from category X, receive $15*: + +When the cart contains two items from category X, both items will get the $10 discount. This is part of the [Cart Items Action](/docs/rest-management/promotions). diff --git a/docs/store-operations/promotions/multi-currency.mdx b/docs/store-operations/promotions/multi-currency.mdx new file mode 100644 index 000000000..94b92708e --- /dev/null +++ b/docs/store-operations/promotions/multi-currency.mdx @@ -0,0 +1,43 @@ +# Multi-Currency Percentage Promotions + +You can configure the promotion to target all enabled transactional currencies when creating a promotion. The promotion will run regardless of what currency the shopper selects as transactional currency within the cart and checkout. + +Multi-currency promotions intentionally only support percentage-based discounts (not amount-based discounts). You will not be able to create an amount-based promotion in multiple currencies. This choice prevents discounting based on fluctuating currency rates as some currencies have broader foreign exchange rates than others (for example, a 10 USD discount is substantially different from 10 JPY). + +The following is an example of a coupon promotion offered to all international customers worldwide in their local transactional currency. The WELCOME10 coupon applies a 10% discount off the order, and you can digitally distribute the coupon through social media channels (e.g., Instagram, Facebook, TikTok) or email marketing. Use the [Create a promotion](/docs/rest-management/promotions/promotions-bulk#create-promotion-beta) endpoint followed by the [Create a coupon code](/docs/rest-management/promotions/coupon-codes-single#create-a-coupon-code-beta) endpoint. + +```http filename="Example request: Create a multi-currency promotion" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/promotions +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "name": "10% off entire order", + "currency_code": "*", + "redemption_type": "COUPON", + "rules": [ + { + "action": { + "cart_value": { + "discount": { + "percentage_amount": "10" + } + } + } + } + ] +} +``` + +```http filename="Example request: Create a coupon code" showLineNumbers copy +//use the promotion ID from the response to the preceding call +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/promotions/{{promotion_id}}/codes +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "code": "WELCOME10" +} +``` diff --git a/docs/msf/managing-store-configuration.mdx b/docs/store-operations/settings/configuration.mdx similarity index 100% rename from docs/msf/managing-store-configuration.mdx rename to docs/store-operations/settings/configuration.mdx diff --git a/docs/api-docs/analytics/data-layer-api.mdx b/docs/store-operations/settings/data.mdx similarity index 98% rename from docs/api-docs/analytics/data-layer-api.mdx rename to docs/store-operations/settings/data.mdx index 6505fac54..0e33a4e04 100644 --- a/docs/api-docs/analytics/data-layer-api.mdx +++ b/docs/store-operations/settings/data.mdx @@ -5,7 +5,7 @@ keywords: GA4, ga4, data, graphql, admin, google analytics 4, # Data Layer Settings in the GraphQL Admin API -The GraphQL Admin API's data layer setting allows BigCommerce to send data from BigCommerce-hosted storefronts to third-party analytics providers through [Big Open Data Layer](/docs/integrations/hosted-analytics). Bigcommerce can build native integrations to analytics providers, such as Google Analytics 4, using the data layer. Partners may also build their own integrations using the data layer. In each case, you must first enable the data layer using the GraphQL Admin API. The data layer is enabled at the global level. +The GraphQL Admin API's data layer setting allows BigCommerce to send data from BigCommerce-hosted storefronts to third-party analytics providers through [Big Open Data Layer](/docs/integrations/hosted-analytics). BigCommerce can build native integrations to analytics providers, such as Google Analytics 4, using the data layer. Partners may also build their own integrations using the data layer. In each case, you must first enable the data layer using the GraphQL Admin API. The data layer is enabled at the global level. This guide shows you how to use the GraphQL Admin API's data layer queries and mutations. For full schema, see the [GraphQL Admin API reference](/graphql-admin/reference). diff --git a/docs/api-docs/store-logs/store-logs.mdx b/docs/store-operations/settings/logs.mdx similarity index 100% rename from docs/api-docs/store-logs/store-logs.mdx rename to docs/store-operations/settings/logs.mdx diff --git a/docs/api-docs/store-management/shipping/shipping-overview.mdx b/docs/store-operations/shipping/index.mdx similarity index 100% rename from docs/api-docs/store-management/shipping/shipping-overview.mdx rename to docs/store-operations/shipping/index.mdx diff --git a/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx b/docs/store-operations/shipping/packing-slips.mdx similarity index 98% rename from docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx rename to docs/store-operations/shipping/packing-slips.mdx index 2fe93dea2..6125d45c4 100644 --- a/docs/stencil-docs/developing-further/customizing-printable-packing-slips.mdx +++ b/docs/store-operations/shipping/packing-slips.mdx @@ -1,104 +1,104 @@ -# Customizing Printable Packing Slips - -Developers frequently modify the default content of packing slips to satisfy specific business requirements and industry demands. This article contains instructions on how to edit the HTML file of a printable packing slip. - -## Customizing printable packing slips - -Customizing your Stencil theme’s printable packing slip relies on a template and variables from BigCommerce’s legacy Blueprint themes framework. To make changes to the packing slip file, follow these steps: - - -1. Download [printable packing slip .zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/packing_slip_printable.zip), which contains the HTML skeleton of a printable packing slip. - -2. Make your customizations to the HTML file. - -3. Upload your customized HTML file to the WebDAV’s `/template/` folder [using WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). Ensure it is named `packing_slip_print.html` and replaces the default file, or WebDAV will not save your changes. - -## Variables - -The following variables are available within the printable packing slip template: - -<Callout type="info"> -* Some variables might be an empty string. -* LNG variables are fixed strings. If different text is desired, the LNG variables can be removed from the file and replaced with manually entered text. However, removing the LNG variables will impact translation functionality. -</Callout> - -| Variable | Description | -|:----------------------------------|:--------------------| -| `%%GLOBAL_CustomerName%%` | Customer's name | -| `%%GLOBAL_CustomerEmail%%` | Customer's email address | -| `%%GLOBAL_CustomerId%%` | Customer's ID | -| `%%LNG_LabelPickupDetails%%` | Pickup details(if is pickup method) | -| `%%LNG_LabelPickupMethod%%` | Pickup method(if is pickup method) | -| `%%GLOBAL_LocationName%%` | Name of location(if is pickup method) | -| `%%GLOBAL_PickupAddress%%` | Pickup address(if is pickup method) | -| `%%GLOBAL_PickupPhone%%` | Pickup phone number(if is pickup method - pairs with HidePickupPhone) | -| `%%GLOBAL_PickupEmail%%` | Pickup email address(if is pickup method - pairs with HidePickupEmail) | -| `%%GLOBAL_StoreAddressFormatted%%`| Formatted store address | -| `%%GLOBAL_StorePhoneNumber%%` | Store phone number | -| `%%GLOBAL_StoreNameFormatted%%` | Formatted store name | -| `%%LNG_Order%%` | Order | -| `%%LNG_OrderDate%%` | Order date | -| `%%LNG_ShippedItems%%` | Shipped items | -| `%%LNG_ProdName%%` | Product name | -| `%%LNG_ShippingMethod%%` | Shipping method | -| `%%LNG_BinPackingInfo%%` | Bin packing info | -| `%%GLOBAL_HeaderLogo%%` | Will output the logo set in store settings. It can be an image or a string.| -| `%%GLOBAL_PackingSlipTitle%%` | Title of packing slip | -| `%%GLOBAL_OrderId%%` | Order ID number | -| `%%GLOBAL_OrderDate%%` | Order date | -| `%%GLOBAL_TrackingNo%%` | Shipment tracking number(if available otherwise `HideTrackingNo` is set)| -| `%%GLOBAL_Comments%%` | Your comments(pairs with `HideComments`) | -| `%%GLOBAL_DateShipped%%` | Shipment date(pairs with `HideShippingDate`) | -| `%%GLOBAL_BillingAddress%%` | Billing address | -| `%%GLOBAL_BillingPhone%%` | Billing phone(pairs with `HideBillingPhone`) | -| `%%GLOBAL_BillingEmail%%` | Billing email(pairs with `HideBillingEmail`) | -| `%%GLOBAL_PickupMethod%%` | Pickup method(pairs with `HidePickupMethod`) | -| `%%GLOBAL_ShippingAddress%%` | Shipping address | -| `%%GLOBAL_ShippingPhone%%` | Shipping phone number(pairs with `HideShippingPhone`) | -| `%%GLOBAL_ShippingEmail%%` | Shipping email address(pairs with `HideShippingEmail`) | -| `%%GLOBAL_ShippingMethod%%` | Shipping method(pairs with `HideShippingMethod`) | -| `%%GLOBAL_ProductsTable%%` | List of products | - -The following variables are available for HTML elements to alter CSS styling. - -<Callout type="info"> -The "Hide" variables are all used to selectively hide HTML elements depending on whether the content they have under them is available. You will need to wrap the "Hide" variables around specific variables, for example: -ShippingPhone (pairs with `HideShippingPhone`). -If you were to use `%%GLOBAL_ShippingPhone%%` somewhere, then it should be enclosed in an element that will hide it when not set, i.e., -```<div style=%%GLOBAL_HideShippingPhone%%>Phone number: %%GLOBAL_ShippingPhone%%</div>.``` -</Callout> - -| Variable | Description | -|:----------------------------------|:-------------------------------------------------------------| -| `%%GLOBAL_HideCustomerDetails%%` | Hidden customer details(works with the CustomerX variables) | -| `%%GLOBAL_HideTrackingNo%%` | Hidden shipment tracking number | -| `%%GLOBAL_HideComments%%` | Hidden comments | -| `%%GLOBAL_HideShippingDate%%` | Hidden shipment date | -| `%%GLOBAL_HideBillingPhone%%` | Hidden billing phone | -| `%%GLOBAL_HideBillingEmail%%` | Hidden billing email | -| `%%GLOBAL_HidePickupMethod%%` | Hidden pickup method | -| `%%GLOBAL_HideShippingMethod%%` | Hidden shipping method | -| `%%GLOBAL_HideShipping%%` | Hidden shipping(set when it is a pickup method) | -| `%%GLOBAL_HidePickup%%` | Hidden pickup method(set when it is not a pickup method) | -| `%%GLOBAL_HidePickupPhone%%` | Hidden pickup phone number | -| `%%GLOBAL_HidePickupEmail%%` | Hidden pickup email address | -| `%%GLOBAL_HideShippingPhone%%` | Hidden shipping phone number | - -The `packing_slip_print.html` page contains three snippets in separate template files. The three files are as follows: - -* LogoImage.html/LogoText.html -* PrintableInvoiceItemConfigurableField.html -* PrintablePackingSlipItem.html - -<Callout type="info"> -Stencil stores cannot modify these files without the assistance of Technical Support. -</Callout> - -## Resources - -### Related articles - -* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) -* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) -* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) (Knowledge Base) -* [Uploading and Linking to a File in Your Store](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) (Knowledge Base) +# Customizing Printable Packing Slips + +Developers frequently modify the default content of packing slips to satisfy specific business requirements and industry demands. This article contains instructions on how to edit the HTML file of a printable packing slip. + +## Customizing printable packing slips + +Customizing your Stencil theme’s printable packing slip relies on a template and variables from BigCommerce’s legacy Blueprint themes framework. To make changes to the packing slip file, follow these steps: + + +1. Download [printable packing slip .zip](https://storage.googleapis.com/bigcommerce-production-dev-center/template-files/packing_slip_printable.zip), which contains the HTML skeleton of a printable packing slip. + +2. Make your customizations to the HTML file. + +3. Upload your customized HTML file to the WebDAV’s `/template/` folder [using WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). Ensure it is named `packing_slip_print.html` and replaces the default file, or WebDAV will not save your changes. + +## Variables + +The following variables are available within the printable packing slip template: + +<Callout type="info"> +* Some variables might be an empty string. +* LNG variables are fixed strings. If different text is desired, the LNG variables can be removed from the file and replaced with manually entered text. However, removing the LNG variables will impact translation functionality. +</Callout> + +| Variable | Description | +|:----------------------------------|:--------------------| +| `%%GLOBAL_CustomerName%%` | Customer's name | +| `%%GLOBAL_CustomerEmail%%` | Customer's email address | +| `%%GLOBAL_CustomerId%%` | Customer's ID | +| `%%LNG_LabelPickupDetails%%` | Pickup details(if is pickup method) | +| `%%LNG_LabelPickupMethod%%` | Pickup method(if is pickup method) | +| `%%GLOBAL_LocationName%%` | Name of location(if is pickup method) | +| `%%GLOBAL_PickupAddress%%` | Pickup address(if is pickup method) | +| `%%GLOBAL_PickupPhone%%` | Pickup phone number(if is pickup method - pairs with HidePickupPhone) | +| `%%GLOBAL_PickupEmail%%` | Pickup email address(if is pickup method - pairs with HidePickupEmail) | +| `%%GLOBAL_StoreAddressFormatted%%`| Formatted store address | +| `%%GLOBAL_StorePhoneNumber%%` | Store phone number | +| `%%GLOBAL_StoreNameFormatted%%` | Formatted store name | +| `%%LNG_Order%%` | Order | +| `%%LNG_OrderDate%%` | Order date | +| `%%LNG_ShippedItems%%` | Shipped items | +| `%%LNG_ProdName%%` | Product name | +| `%%LNG_ShippingMethod%%` | Shipping method | +| `%%LNG_BinPackingInfo%%` | Bin packing info | +| `%%GLOBAL_HeaderLogo%%` | Will output the logo set in store settings. It can be an image or a string.| +| `%%GLOBAL_PackingSlipTitle%%` | Title of packing slip | +| `%%GLOBAL_OrderId%%` | Order ID number | +| `%%GLOBAL_OrderDate%%` | Order date | +| `%%GLOBAL_TrackingNo%%` | Shipment tracking number(if available otherwise `HideTrackingNo` is set)| +| `%%GLOBAL_Comments%%` | Your comments(pairs with `HideComments`) | +| `%%GLOBAL_DateShipped%%` | Shipment date(pairs with `HideShippingDate`) | +| `%%GLOBAL_BillingAddress%%` | Billing address | +| `%%GLOBAL_BillingPhone%%` | Billing phone(pairs with `HideBillingPhone`) | +| `%%GLOBAL_BillingEmail%%` | Billing email(pairs with `HideBillingEmail`) | +| `%%GLOBAL_PickupMethod%%` | Pickup method(pairs with `HidePickupMethod`) | +| `%%GLOBAL_ShippingAddress%%` | Shipping address | +| `%%GLOBAL_ShippingPhone%%` | Shipping phone number(pairs with `HideShippingPhone`) | +| `%%GLOBAL_ShippingEmail%%` | Shipping email address(pairs with `HideShippingEmail`) | +| `%%GLOBAL_ShippingMethod%%` | Shipping method(pairs with `HideShippingMethod`) | +| `%%GLOBAL_ProductsTable%%` | List of products | + +The following variables are available for HTML elements to alter CSS styling. + +<Callout type="info"> +The "Hide" variables are all used to selectively hide HTML elements depending on whether the content they have under them is available. You will need to wrap the "Hide" variables around specific variables, for example: +ShippingPhone (pairs with `HideShippingPhone`). +If you were to use `%%GLOBAL_ShippingPhone%%` somewhere, then it should be enclosed in an element that will hide it when not set, i.e., +```<div style=%%GLOBAL_HideShippingPhone%%>Phone number: %%GLOBAL_ShippingPhone%%</div>.``` +</Callout> + +| Variable | Description | +|:----------------------------------|:-------------------------------------------------------------| +| `%%GLOBAL_HideCustomerDetails%%` | Hidden customer details(works with the CustomerX variables) | +| `%%GLOBAL_HideTrackingNo%%` | Hidden shipment tracking number | +| `%%GLOBAL_HideComments%%` | Hidden comments | +| `%%GLOBAL_HideShippingDate%%` | Hidden shipment date | +| `%%GLOBAL_HideBillingPhone%%` | Hidden billing phone | +| `%%GLOBAL_HideBillingEmail%%` | Hidden billing email | +| `%%GLOBAL_HidePickupMethod%%` | Hidden pickup method | +| `%%GLOBAL_HideShippingMethod%%` | Hidden shipping method | +| `%%GLOBAL_HideShipping%%` | Hidden shipping(set when it is a pickup method) | +| `%%GLOBAL_HidePickup%%` | Hidden pickup method(set when it is not a pickup method) | +| `%%GLOBAL_HidePickupPhone%%` | Hidden pickup phone number | +| `%%GLOBAL_HidePickupEmail%%` | Hidden pickup email address | +| `%%GLOBAL_HideShippingPhone%%` | Hidden shipping phone number | + +The `packing_slip_print.html` page contains three snippets in separate template files. The three files are as follows: + +* LogoImage.html/LogoText.html +* PrintableInvoiceItemConfigurableField.html +* PrintablePackingSlipItem.html + +<Callout type="info"> +Stencil stores cannot modify these files without the assistance of Technical Support. +</Callout> + +## Resources + +### Related articles + +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Blueprint Theme Email Templates](/archive/storefront/blueprint/themes/email-templates) +* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV) (Knowledge Base) +* [Uploading and Linking to a File in Your Store](https://support.bigcommerce.com/s/article/How-do-I-add-and-link-to-a-file-in-my-store#upload-a-file) (Knowledge Base) diff --git a/docs/api-docs/store-management/shipping/shipper-hq.mdx b/docs/store-operations/shipping/shipper-hq.mdx similarity index 100% rename from docs/api-docs/store-management/shipping/shipper-hq.mdx rename to docs/store-operations/shipping/shipper-hq.mdx diff --git a/docs/api-docs/tax/tax-settings.mdx b/docs/store-operations/tax/index.mdx similarity index 100% rename from docs/api-docs/tax/tax-settings.mdx rename to docs/store-operations/tax/index.mdx diff --git a/docs/api-docs/tax/tax-properties.mdx b/docs/store-operations/tax/tax-properties.mdx similarity index 100% rename from docs/api-docs/tax/tax-properties.mdx rename to docs/store-operations/tax/tax-properties.mdx diff --git a/docs/api-docs/tax/tax-rates-zones.mdx b/docs/store-operations/tax/tax-rates-zones.mdx similarity index 100% rename from docs/api-docs/tax/tax-rates-zones.mdx rename to docs/store-operations/tax/tax-rates-zones.mdx diff --git a/docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx b/docs/storefront/cart-checkout/checkout-sdk/index.mdx similarity index 94% rename from docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx rename to docs/storefront/cart-checkout/checkout-sdk/index.mdx index 40d1e252e..678349192 100644 --- a/docs/stencil-docs/customizing-checkout/checkout-sdk-quickstart.mdx +++ b/docs/storefront/cart-checkout/checkout-sdk/index.mdx @@ -1,181 +1,181 @@ -# Getting Started with Checkout SDK - -The Checkout SDK is a JavaScript library of methods for performing actions related to checkout. It includes methods for logging in a customer, adding addresses to the checkout object, and surfacing the shipping and payment methods a merchant configures. It’s everything you need to build your own custom checkout page on BigCommerce. - -Our [reference implementation](https://github.com/bigcommerce/checkout-js) is a great place to start if you prefer to develop within a framework. However, the SDK, built with VanillaJS, is framework agnostic. - -This article will walk you through becoming familiar with Checkout SDK and experimenting with building checkouts using Cornerstone. At the end of the article, you will have installed the Checkout SDK, created a new JavaScript module for your custom checkout, and console-logged the checkout object. - -## Prerequisites -* This tutorial uses [Cornerstone](https://github.com/bigcommerce/cornerstone). Your theme may differ. -* The theme should be set up for [local development](/docs/storefront/stencil/cli/install). Use Stencil CLI to preview your local changes. - -## Installing the Checkout JS SDK - -1. Open your terminal and navigate to your theme's directory. - -For example, `cd cornerstone` - -2. Add the Checkout SDK loader script to your theme in `templates/pages/checkout.html` right after `{{#partial “page”}}`. - -```html copy -<script src="https://checkout-sdk.bigcommerce.com/v1/loader.js"></script> -``` - -3. Then, add an async function right after the Checkout SDK loader script in `templates/pages/checkout.html`. - -```html showLineNumbers copy -<script> - const initSdk = async () => { - window.module = await checkoutKitLoader.load('checkout-sdk'); - window.service = module.createCheckoutService(); - window.state = await service.loadCheckout('{{{ checkout.id }}}'); - }; - initSdk(); -</script> -``` -<Callout type="info"> -* `initSdk()` is in charge of loading checkout-sdk, creating the service, and loading checkout with our current cart/checkout id. - -* `checkout.content_head` contains information for rendering the template to initialize a checkout-js React app. -</Callout> - -The checkout.html page should look like this: - -```html showLineNumbers copy -{{#partial "head"}} - -{{{ checkout.checkout_head }}} -{{{ stylesheet '/assets/css/optimized-checkout.css' }}} -{{ getFontsCollection }} - -<script type="text/javascript"> - window.language = {{{langJson 'optimized_checkout'}}}; -</script> - -{{{head.scripts}}} - -{{/partial}} - -{{#partial "page"}} - -<script src="https://checkout-sdk.bigcommerce.com/v1/loader.js"></script> - -<script> - const initSdk = async () => { - window.module = await checkoutKitLoader.load('checkout-sdk'); - window.service = module.createCheckoutService(); - window.state = await service.loadCheckout('{{{ checkout.id }}}'); - }; - initSdk(); -</script> - -<header class="checkoutHeader optimizedCheckout-header"> - <div class="checkoutHeader-content"> - <h1 class="is-srOnly">{{lang 'checkout.title'}}</h1> - <h2 class="checkoutHeader-heading"> - <a class="checkoutHeader-link" href="{{urls.home}}"> - {{#if checkout.header_image}} - <img alt="{{settings.store_logo.title}}" class="checkoutHeader-logo" id="logoImage" src="{{ checkout.header_image }}"/> - {{ else }} - <span class="header-logo-text">{{settings.store_logo.title}}</span> - {{/if}} - </a> - </h2> - </div> -</header> - - -{{{ checkout.checkout_content }}} - -{{{ footer.scripts }}} - -{{/partial}} - -{{> layout/empty}} -``` -4. Run Stencil CLI to view your changes. -5. Before navigating to the checkout page, ensure you are logged in to collect cart and checkout information. -6. Navigate to the checkout page, and from your developer’s console, execute the following command to fetch cart content: - -```js copy -state.data.getCart(); -``` - -In the developer console, you can see the entire available cart object. The output will look like this: - -```json showLineNumbers copy -{ - "id": "78fbb9bd-0489-4f6f-aeb7-60a697ccb63a", - "customerId": 0, - "email": "", - "currency": { - "name": "US Dollar", - "code": "USD", - "symbol": "$", - "decimalPlaces": 2 - }, - "isTaxIncluded": true, - "baseAmount": 57, - "discountAmount": 0, - "cartAmount": 57, - "coupons": [], - "discounts": [ - { - "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", - "discountedAmount": 0 - } - ], - "lineItems": { - "physicalItems": [], - "digitalItems": [ - { - "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", - "parentId": null, - "variantId": 5851, - "productId": 5860, - "sku": "", - "name": "Handcrafted Rubber Table", - "url": "https://example.com/handcrafted-rubber-table", - "quantity": 1, - "brand": "", - "isTaxable": true, - "imageUrl": "https://cdn11.bigcommerce.com/s-xxxyyyzzz/products/5860/images/588/dzn_Handcrafted-Rubber-Table-7__57890.1685111102.220.290.jpg?c=1", - "discounts": [], - "discountAmount": 0, - "couponAmount": 0, - "originalPrice": 57, - "listPrice": 57, - "salePrice": 57, - "retailPrice": null, - "extendedListPrice": 57, - "extendedSalePrice": 57, - "comparisonPrice": 57, - "extendedComparisonPrice": 57, - "isShippingRequired": false, - "type": "digital", - "isMutable": true, - "options": [] - } - ], - "giftCertificates": [], - "customItems": [] - }, - "createdTime": "2023-07-12T13:59:48+00:00", - "updatedTime": "2023-07-12T13:59:48+00:00", - "locale": "en" -} -``` - -<Callout type="info"> -We can, for example, get or set shipping and billing addresses, sign in customers, apply coupons or gift certificates, initialize payment, or complete orders. -</Callout> - - -## Resources - -### Sample apps -* [Checkout SDK Source Code](https://github.com/bigcommerce/checkout-sdk-js) (BigCommerce GitHub) - -## Related articles -* [Installling Stencil CLI](/docs/storefront/stencil/cli/install) +# Getting Started with Checkout SDK + +The Checkout SDK is a JavaScript library of methods for performing actions related to checkout. It includes methods for logging in a customer, adding addresses to the checkout object, and surfacing the shipping and payment methods a merchant configures. It’s everything you need to build your own custom checkout page on BigCommerce. + +Our [reference implementation](https://github.com/bigcommerce/checkout-js) is a great place to start if you prefer to develop within a framework. However, the SDK, built with vanilla JavaScript, is framework agnostic. + +This article will walk you through becoming familiar with Checkout SDK and experimenting with building checkouts using Cornerstone. At the end of the article, you will have installed the Checkout SDK, created a new JavaScript module for your custom checkout, and console-logged the checkout object. + +## Prerequisites +* This tutorial uses [Cornerstone](https://github.com/bigcommerce/cornerstone). Your theme may differ. +* The theme should be set up for [local development](/docs/storefront/stencil/cli/install). Use Stencil CLI to preview your local changes. + +## Installing the Checkout JS SDK + +1. Open your terminal and navigate to your theme's directory. + +For example, `cd cornerstone` + +2. Add the Checkout SDK loader script to your theme in `templates/pages/checkout.html` right after `{{#partial “page”}}`. + +```html copy +<script src="https://checkout-sdk.bigcommerce.com/v1/loader.js"></script> +``` + +3. Then, add an async function right after the Checkout SDK loader script in `templates/pages/checkout.html`. + +```html showLineNumbers copy +<script> + const initSdk = async () => { + window.module = await checkoutKitLoader.load('checkout-sdk'); + window.service = module.createCheckoutService(); + window.state = await service.loadCheckout('{{{ checkout.id }}}'); + }; + initSdk(); +</script> +``` +<Callout type="info"> +* `initSdk()` is in charge of loading checkout-sdk, creating the service, and loading checkout with our current cart/checkout id. + +* `checkout.content_head` contains information for rendering the template to initialize a checkout-js React app. +</Callout> + +The checkout.html page should look like this: + +```html showLineNumbers copy +{{#partial "head"}} + +{{{ checkout.checkout_head }}} +{{{ stylesheet '/assets/css/optimized-checkout.css' }}} +{{ getFontsCollection }} + +<script type="text/javascript"> + window.language = {{{langJson 'optimized_checkout'}}}; +</script> + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} + +<script src="https://checkout-sdk.bigcommerce.com/v1/loader.js"></script> + +<script> + const initSdk = async () => { + window.module = await checkoutKitLoader.load('checkout-sdk'); + window.service = module.createCheckoutService(); + window.state = await service.loadCheckout('{{{ checkout.id }}}'); + }; + initSdk(); +</script> + +<header class="checkoutHeader optimizedCheckout-header"> + <div class="checkoutHeader-content"> + <h1 class="is-srOnly">{{lang 'checkout.title'}}</h1> + <h2 class="checkoutHeader-heading"> + <a class="checkoutHeader-link" href="{{urls.home}}"> + {{#if checkout.header_image}} + <img alt="{{settings.store_logo.title}}" class="checkoutHeader-logo" id="logoImage" src="{{ checkout.header_image }}"/> + {{ else }} + <span class="header-logo-text">{{settings.store_logo.title}}</span> + {{/if}} + </a> + </h2> + </div> +</header> + + +{{{ checkout.checkout_content }}} + +{{{ footer.scripts }}} + +{{/partial}} + +{{> layout/empty}} +``` +4. Run Stencil CLI to view your changes. +5. Before navigating to the checkout page, ensure you are logged in to collect cart and checkout information. +6. Navigate to the checkout page, and from your developer’s console, execute the following command to fetch cart content: + +```js copy +state.data.getCart(); +``` + +In the developer console, you can see the entire available cart object. The output will look like this: + +```json showLineNumbers copy +{ + "id": "78fbb9bd-0489-4f6f-aeb7-60a697ccb63a", + "customerId": 0, + "email": "", + "currency": { + "name": "US Dollar", + "code": "USD", + "symbol": "$", + "decimalPlaces": 2 + }, + "isTaxIncluded": true, + "baseAmount": 57, + "discountAmount": 0, + "cartAmount": 57, + "coupons": [], + "discounts": [ + { + "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", + "discountedAmount": 0 + } + ], + "lineItems": { + "physicalItems": [], + "digitalItems": [ + { + "id": "ce448bc8-2f35-40d1-a0a6-f5a7e2882c5c", + "parentId": null, + "variantId": 5851, + "productId": 5860, + "sku": "", + "name": "Handcrafted Rubber Table", + "url": "https://example.com/handcrafted-rubber-table", + "quantity": 1, + "brand": "", + "isTaxable": true, + "imageUrl": "https://cdn11.bigcommerce.com/s-xxxyyyzzz/products/5860/images/588/dzn_Handcrafted-Rubber-Table-7__57890.1685111102.220.290.jpg?c=1", + "discounts": [], + "discountAmount": 0, + "couponAmount": 0, + "originalPrice": 57, + "listPrice": 57, + "salePrice": 57, + "retailPrice": null, + "extendedListPrice": 57, + "extendedSalePrice": 57, + "comparisonPrice": 57, + "extendedComparisonPrice": 57, + "isShippingRequired": false, + "type": "digital", + "isMutable": true, + "options": [] + } + ], + "giftCertificates": [], + "customItems": [] + }, + "createdTime": "2023-07-12T13:59:48+00:00", + "updatedTime": "2023-07-12T13:59:48+00:00", + "locale": "en" +} +``` + +<Callout type="info"> +We can, for example, get or set shipping and billing addresses, sign in customers, apply coupons or gift certificates, initialize payment, or complete orders. +</Callout> + + +## Resources + +### Sample apps +* [Checkout SDK Source Code](https://github.com/bigcommerce/checkout-sdk-js) (BigCommerce GitHub) + +## Related articles +* [Installing Stencil CLI](/docs/storefront/stencil/cli/install) diff --git a/docs/stencil-docs/customizing-checkout/checkout-sdk-example.mdx b/docs/storefront/cart-checkout/checkout-sdk/tutorial.mdx similarity index 100% rename from docs/stencil-docs/customizing-checkout/checkout-sdk-example.mdx rename to docs/storefront/cart-checkout/checkout-sdk/tutorial.mdx diff --git a/docs/api-docs/cart-and-checkout/channels-sites-routes.mdx b/docs/storefront/cart-checkout/draft/channels-sites-routes.mdx similarity index 100% rename from docs/api-docs/cart-and-checkout/channels-sites-routes.mdx rename to docs/storefront/cart-checkout/draft/channels-sites-routes.mdx diff --git a/docs/api-docs/cart-and-checkout/checkout-sdk.mdx b/docs/storefront/cart-checkout/draft/checkout-sdk.mdx similarity index 100% rename from docs/api-docs/cart-and-checkout/checkout-sdk.mdx rename to docs/storefront/cart-checkout/draft/checkout-sdk.mdx diff --git a/docs/api-docs/cart-and-checkout/embedded-checkout-overview.mdx b/docs/storefront/cart-checkout/embedded-checkout/index.mdx similarity index 100% rename from docs/api-docs/cart-and-checkout/embedded-checkout-overview.mdx rename to docs/storefront/cart-checkout/embedded-checkout/index.mdx diff --git a/docs/api-docs/cart-and-checkout/embedded-checkout-tutorial.mdx b/docs/storefront/cart-checkout/embedded-checkout/tutorial.mdx similarity index 99% rename from docs/api-docs/cart-and-checkout/embedded-checkout-tutorial.mdx rename to docs/storefront/cart-checkout/embedded-checkout/tutorial.mdx index 7e6c53fae..a3af10305 100644 --- a/docs/api-docs/cart-and-checkout/embedded-checkout-tutorial.mdx +++ b/docs/storefront/cart-checkout/embedded-checkout/tutorial.mdx @@ -197,7 +197,7 @@ The following table clarifies where the data properties for the embedded checkou |:---------|:-----|:------------| | `operation` | string | The value is always `customer_login`. | | `customer_id` | integer | The ID of the customer who wants to check out. | -| `channel_id` | integer | The sales channel that the customer is signing in to. In a headless implemention, this is the storefront's channel ID. Required for embedded checkout. | +| `channel_id` | integer | The sales channel that the customer is signing in to. In a headless implementation, this is the storefront's channel ID. Required for embedded checkout. | | `redirect_to` | string, URL | The cart redirect URL you generated in a previous step. | ## Embedding the checkout diff --git a/docs/api-docs/cart-and-checkout/add-to-cart-url.mdx b/docs/storefront/cart-checkout/guide/add-to-cart-url.mdx similarity index 98% rename from docs/api-docs/cart-and-checkout/add-to-cart-url.mdx rename to docs/storefront/cart-checkout/guide/add-to-cart-url.mdx index cc0b1b461..a36f8d532 100644 --- a/docs/api-docs/cart-and-checkout/add-to-cart-url.mdx +++ b/docs/storefront/cart-checkout/guide/add-to-cart-url.mdx @@ -5,7 +5,7 @@ keywords: cors, carts, url # Add to Cart URLs -Query string parameters can be appended to Bigcommerce product and `/cart.php` urls in order to pre-select an SKU or add a product to cart. These parameters make it possible to build custom add to cart links and forms for use on BigCommerce storefronts and remote sites (such as WordPress, blog posts, and social media). +Query string parameters can be appended to BigCommerce product and `/cart.php` urls in order to pre-select an SKU or add a product to cart. These parameters make it possible to build custom add to cart links and forms for use on BigCommerce storefronts and remote sites (such as WordPress, blog posts, and social media). URLs constructed with these parameters allow you to: * Pre-select a specific SKU on a product detail page diff --git a/docs/api-docs/building-checkouts/checkout-consignment.mdx b/docs/storefront/cart-checkout/guide/consignments.mdx similarity index 100% rename from docs/api-docs/building-checkouts/checkout-consignment.mdx rename to docs/storefront/cart-checkout/guide/consignments.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx b/docs/storefront/cart-checkout/guide/graphql-storefront.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-carts-and-checkout.mdx rename to docs/storefront/cart-checkout/guide/graphql-storefront.mdx diff --git a/docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx b/docs/storefront/cart-checkout/guide/rest-management.mdx similarity index 100% rename from docs/api-docs/cart-and-checkout/cart-and-checkout-overview.mdx rename to docs/storefront/cart-checkout/guide/rest-management.mdx diff --git a/docs/api-docs/cart-and-checkout/working-sf-apis.mdx b/docs/storefront/cart-checkout/guide/rest-storefront.mdx similarity index 100% rename from docs/api-docs/cart-and-checkout/working-sf-apis.mdx rename to docs/storefront/cart-checkout/guide/rest-storefront.mdx diff --git a/docs/api-docs/building-checkouts/checkout-customizability.mdx b/docs/storefront/cart-checkout/index.mdx similarity index 100% rename from docs/api-docs/building-checkouts/checkout-customizability.mdx rename to docs/storefront/cart-checkout/index.mdx diff --git a/docs/stencil-docs/localization/multi-language-checkout.mdx b/docs/storefront/cart-checkout/localization.mdx similarity index 98% rename from docs/stencil-docs/localization/multi-language-checkout.mdx rename to docs/storefront/cart-checkout/localization.mdx index 4fe05999c..80a7c5edd 100644 --- a/docs/stencil-docs/localization/multi-language-checkout.mdx +++ b/docs/storefront/cart-checkout/localization.mdx @@ -103,4 +103,4 @@ BigCommerce's Optimized One-Page Checkout will translate displayed **Country/Sta ### Additional resources -* [Cornerstone Repository](https://github.com/bigcommerce/cornerstone) (Bigcommerce GitHub) +* [Cornerstone repository (GitHub)](https://github.com/bigcommerce/cornerstone) diff --git a/docs/stencil-docs/customizing-checkout/open-source-checkout.mdx b/docs/storefront/cart-checkout/open-checkouts/guide.mdx similarity index 100% rename from docs/stencil-docs/customizing-checkout/open-source-checkout.mdx rename to docs/storefront/cart-checkout/open-checkouts/guide.mdx diff --git a/docs/stencil-docs/customizing-checkout/open-checkout-quick-start.mdx b/docs/storefront/cart-checkout/open-checkouts/index.mdx similarity index 100% rename from docs/stencil-docs/customizing-checkout/open-checkout-quick-start.mdx rename to docs/storefront/cart-checkout/open-checkouts/index.mdx diff --git a/docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx b/docs/storefront/cart-checkout/optimized-one-page-checkout.mdx similarity index 98% rename from docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx rename to docs/storefront/cart-checkout/optimized-one-page-checkout.mdx index e33b5072c..cea7d6096 100644 --- a/docs/stencil-docs/customizing-checkout/optimized-one-page-checkout.mdx +++ b/docs/storefront/cart-checkout/optimized-one-page-checkout.mdx @@ -1,80 +1,80 @@ -# Optimized One-Page Checkout - -This article covers styling and display options for Optimized One-Page Checkout. - -## Working with the optimized checkout SCSS file - -Cornerstone includes a SCSS file that styles the Optimized Checkout page. In your local installation, this file is located at <span class="fn">`cornerstone/assets/scss/optimized-checkout.scss`</span>. - -You can access the most recent version of this file in the [Cornerstone repository](https://github.com/bigcommerce/cornerstone/blob/master/assets/scss/optimized-checkout.scss). All themes share the same stylesheet for the Optimized One-Page checkout, even those not based on Cornerstone, so this stylesheet applies universally across Stencil themes. - - -<Callout type="warning"> - #### Customizing checkout restrictions - When customizing the checkout page, you are free to change classes' contents; however, **do not** nest elements or change any class names. BigCommerce imposes these restrictions because each class here maps to multiple optimized checkout elements. Changing the structure or naming would break updates available in future optimized checkout enhancements. -</Callout> - - -## Configuring the desktop viewport - -To set up optimized checkout's responsive features within the `optimized-checkout.scss` file, you should configure the following breakpoint to define your preferred desktop viewport size: - - -```css showLineNumbers copy - // TODO: - // Configure media query to be 'desktop' breakpoint size - // -- - @media (min-width: 801px) { - text-align: stencilString("optimizedCheckout-logo-position"); - } -``` - -## Classes available for customization - -Below are the classes provided in Cornerstone's `optimized-checkout.scss`, with the corresponding page elements that they style. These class names and mappings are subject to change, so please check the inline comments in the `optimized-checkout.scss` file that you downloaded with your current Cornerstone release. - -| Class | Styles this Optimized One-Page Checkout element | -|:------|:------| -| `.optimizedCheckout-header` | Page header. | -| `.optimizedCheckout-headingPrimary` | Top-level headings. | -| `.optimizedCheckout-headingSecondary` | Certain lower-level elements, such as descriptions of cart items. | -| `.optimizedCheckout-overlay` | Shipping Method box. | -| `.optimizedCheckout-contentPrimary` | Body text in the desktop `Order Summary`/`Order Confirmation` (cart contents); drop-down-list items; and text that summarizes completed steps. | -| `.optimizedCheckout-contentSecondary` | Text labels on check boxes, and lower-level text in the desktop Order Summary. | -| `.optimizedCheckout-button--primary` | `CONTINUE` button and final `PAY` button. | -| `.optimizedCheckout-button--secondary` | `Edit` buttons. -| `.optimizedCheckout-orderSummary` | Colors in the `Order Summary` mobile drawer/modal. -| `.optimizedCheckout-step` | Large step-number indicators on the page's left side. | -| `.optimizedCheckout-form-label` | Styles form fields like `Email Address` – the field's text-label color. | -| `.optimizedCheckout-form-input` | Styles form fields like `Email Address` – the entry box's background and border colors. | - -## Providing customizable options in Page Builder - -You can determine which aspects of Optimized One-Page Checkout merchants will customize with the Page Builder tool. - -In Cornerstone's `optimized-checkout.scss`, each SCSS class and property available has a corresponding key/value pair in the `config.json` file, which can be used as the `id` value in schema.json when [creating customizable Page Builder options](https://github.com/bigcommerce/cornerstone/blob/master/schema.json). - -<a id="optimized_currency"></a> - -## Currency conversion options - -You can enable the display of alternate currencies on your Stencil theme's Optimized One-Page Checkout and order confirmation pages. - -<Callout type="warning"> - #### Restrictions - The options on this page require that you first enable Optimized One-Page Checkout. Find instructions on how to do this in [Optimized One-Page Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout). -</Callout> - -Note that regardless of the display options you set below, you will always process transactions in the store's single default currency. To change that setting, see [Changing Your Default Currency](https://support.bigcommerce.com/s/article/Managing-Currencies#default). - -To allow shoppers to view prices in multiple currencies, you will need to add the desired currencies in the store control panel. - -Shoppers will then be able to use the Currency drop-down list throughout the storefront to switch displayed prices among the enabled currencies. - -At checkout, the shopper still receives the bill in the store's default currency. As shown below, the checkout and cart templates will show an annotation about this while flagging any converted total (in a shopper's selected alternate currency) as an Estimated Total: - -![checkout template](https://storage.googleapis.com/bigcommerce-production-dev-center/images/checkout-template.png) - -## Related resources - -* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) +# Optimized One-Page Checkout + +This article covers styling and display options for Optimized One-Page Checkout. + +## Working with the optimized checkout SCSS file + +Cornerstone includes a SCSS file that styles the Optimized Checkout page. In your local installation, this file is located at <span class="fn">`cornerstone/assets/scss/optimized-checkout.scss`</span>. + +You can access the most recent version of this file in the [Cornerstone repository](https://github.com/bigcommerce/cornerstone/blob/master/assets/scss/optimized-checkout.scss). All themes share the same stylesheet for the Optimized One-Page checkout, even those not based on Cornerstone, so this stylesheet applies universally across Stencil themes. + + +<Callout type="warning"> + #### Customizing checkout restrictions + When customizing the checkout page, you are free to change classes' contents; however, **do not** nest elements or change any class names. BigCommerce imposes these restrictions because each class here maps to multiple optimized checkout elements. Changing the structure or naming would break updates available in future optimized checkout enhancements. +</Callout> + + +## Configuring the desktop viewport + +To set up optimized checkout's responsive features within the `optimized-checkout.scss` file, you should configure the following breakpoint to define your preferred desktop viewport size: + + +```css showLineNumbers copy + // TODO: + // Configure media query to be 'desktop' breakpoint size + // -- + @media (min-width: 801px) { + text-align: stencilString("optimizedCheckout-logo-position"); + } +``` + +## Classes available for customization + +Below are the classes provided in Cornerstone's `optimized-checkout.scss`, with the corresponding page elements that they style. These class names and mappings are subject to change, so please check the inline comments in the `optimized-checkout.scss` file that you downloaded with your current Cornerstone release. + +| Class | Styles this Optimized One-Page Checkout element | +|:------|:------| +| `.optimizedCheckout-header` | Page header. | +| `.optimizedCheckout-headingPrimary` | Top-level headings. | +| `.optimizedCheckout-headingSecondary` | Certain lower-level elements, such as descriptions of cart items. | +| `.optimizedCheckout-overlay` | Shipping Method box. | +| `.optimizedCheckout-contentPrimary` | Body text in the desktop `Order Summary`/`Order Confirmation` (cart contents); drop-down-list items; and text that summarizes completed steps. | +| `.optimizedCheckout-contentSecondary` | Text labels on check boxes, and lower-level text in the desktop Order Summary. | +| `.optimizedCheckout-button--primary` | `CONTINUE` button and final `PAY` button. | +| `.optimizedCheckout-button--secondary` | `Edit` buttons. +| `.optimizedCheckout-orderSummary` | Colors in the `Order Summary` mobile drawer/modal. +| `.optimizedCheckout-step` | Large step-number indicators on the page's left side. | +| `.optimizedCheckout-form-label` | Styles form fields like `Email Address` – the field's text-label color. | +| `.optimizedCheckout-form-input` | Styles form fields like `Email Address` – the entry box's background and border colors. | + +## Providing customizable options in Page Builder + +You can determine which aspects of Optimized One-Page Checkout merchants will customize with the Page Builder tool. + +In Cornerstone's `optimized-checkout.scss`, each SCSS class and property available has a corresponding key/value pair in the `config.json` file, which can be used as the `id` value in schema.json when [creating customizable Page Builder options](https://github.com/bigcommerce/cornerstone/blob/master/schema.json). + +<a id="optimized_currency"></a> + +## Currency conversion options + +You can enable the display of alternate currencies on your Stencil theme's Optimized One-Page Checkout and order confirmation pages. + +<Callout type="warning"> + #### Restrictions + The options on this page require that you first enable Optimized One-Page Checkout. Find instructions on how to do this in [Optimized One-Page Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout). +</Callout> + +Note that regardless of the display options you set below, you will always process transactions in the store's single default currency. To change that setting, see [Changing Your Default Currency](https://support.bigcommerce.com/s/article/Managing-Currencies#default). + +To allow shoppers to view prices in multiple currencies, you will need to add the desired currencies in the store control panel. + +Shoppers will then be able to use the Currency drop-down list throughout the storefront to switch displayed prices among the enabled currencies. + +At checkout, the shopper still receives the bill in the store's default currency. As shown below, the checkout and cart templates will show an annotation about this while flagging any converted total (in a shopper's selected alternate currency) as an Estimated Total: + +![checkout template](https://storage.googleapis.com/bigcommerce-production-dev-center/images/checkout-template.png) + +## Related resources + +* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) diff --git a/docs/storefront/graphql/customers.mdx b/docs/storefront/graphql/customers.mdx new file mode 100644 index 000000000..c6015cf99 --- /dev/null +++ b/docs/storefront/graphql/customers.mdx @@ -0,0 +1,601 @@ +# GraphQL Storefront API: Customers (Beta) + +<Callout type="info"> + This feature is currently in beta and is only available to participants. +</Callout> + +BigCommerce's GraphQL Storefront API Customers powers access to customer objects such as the ability to update a customer, get a customer address book, reset a password, and more. Developers can use GraphQL Storefront API to create an end-to-end shopper experience and manage some customer account use cases. + +Customer mutations and queries can do the following: + +* Register a customer +* Update a customer +* Add a customer address +* Update a customer address +* Delete a customer address +* Change a customer password +* Request a password reset +* Reset a password +* Get a customer address book + +## Tokens + +To make requests, create a [store-level](/docs/start/authentication/api-accounts#store-level-api-accounts) or [app-level](/docs/start/authentication/api-accounts#app-level-api-accounts) API account with one or more of the following token creation OAuth scopes: + +| UI Name | Permission | Parameter | Description | +| :--- | :--- | :--- | :--- | +| Storefront API tokens | modify | `store_storefront-api` | Create payment access tokens, process payments | +| Storefront API customer impersonation tokens | modify | `store_storefront_api_customer_impersonation` | Create GraphQL Storefront API bearer tokens that allow customer impersonation | + +No additional scopes are required to use the GraphQL Storefront API. For more information, see [token creation OAuth scopes](/docs/start/authentication/api-accounts#token-creation-scopes). + +To authenticate calls to the GraphQL Storefront API, your application can generate a bearer token. This can be done by using either the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) or the [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) REST endpoint. On a Stencil storefront, you can also access a token directly from the page context. Learn more about [Using auto-generated tokens in Stencil themes](/docs/storefront/graphql#using-auto-generated-tokens-in-stencil-themes). + +For more information, see [Creating a token](/docs/storefront/graphql#creating-a-token) in the GraphQL Storefront API Overview and [Dynamic tokens](/docs/start/authentication#bigcommerce-generated-jwts) in the Authentication and Example Requests article. + +## reCAPTCHA + +Captcha is not required when the reCAPTCHA is disabled in the control panel. Be sure to use a valid user verification response reCAPTCHA token if reCAPTCHA is enabled. + +Customer impersonation tokens do not require the use of reCAPTCHA even when the reCAPTCHA setting is enabled. You can bypass the reCAPTCHA and it will still function. Note, if reCAPTCHA is provided it must be valid, otherwise it will be rejected. + +## Example queries and mutations + +### Register a customer + +Register a customer using the form field configuration set up in the control panel for both the account signup and address fields. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Register a customer" showLineNumbers copy + mutation { + customer { + registerCustomer( + reCaptchaV2: { token: "" } + input: { + firstName: "Jon" + lastName: "Smith" + email: "jon@example.com" + password: "Password123!" + phone: "123-456-7890" + company: "BC" + address: { + firstName: "Jon" + lastName: "Smith" + address1: "1234 Fake Street" + address2: "" + city: "Austin" + company: "BC" + countryCode: "US" + stateOrProvince: "TX" + phone: "123-456-7890" + postalCode: "78610" + } + formFields: { + checkboxes: [{ fieldEntityId: 1, fieldValueEntityIds: [1, 2, 3] }] + multipleChoices: [{ fieldEntityId: 1, fieldValueEntityId: 2 }] + numbers: [{ fieldEntityId: 1, number: 1.0 }] + texts: [{ fieldEntityId: 1, text: "text" }] + passwords: [{ fieldEntityId: 1, password: "password" }] + } + } + ) { + customer { + firstName + lastName + } + errors { + __typename + ... on ValidationError { + message + } + ... on CustomerRegistrationError { + message + } + ... on EmailAlreadyInUseError { + message + } + ... on AccountCreationDisabledError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ```json filename="Example mutation: Register a customer" showLineNumbers copy + # Success + + { + "data": { + "customer": { + "registerCustomer": { + "customer": { + "firstName": "Jon", + "lastName": "Smith" + }, + "errors": [] + } + } + } + } + + + # Error - Email already in use + + { + "data": { + "customer": { + "registerCustomer": { + "customer": null, + "errors": [ + { + "__typename": "EmailAlreadyInUseError", + "message": "The email address is already in use." + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Update a customer + +Update customer information, except for password and address. Use either `resetPassword`, or `changePassword` to reset or update the user password. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Customer update" showLineNumbers copy + mutation { + customer { + updateCustomer( + reCaptchaV2: { token: "" } + input: { + firstName: "Jon" + lastName: "Smith" + email: "jon@test.com" + phone: "123-456-7890" + company: "BC" + formFields: { + # optional + checkboxes: [{ fieldEntityId: 1, fieldValueEntityIds: [1, 2, 3] }] + multipleChoices: [{ fieldEntityId: 1, fieldValueEntityId: 2 }] + numbers: [{ fieldEntityId: 1, number: 1.0 }] + texts: [{ fieldEntityId: 1, text: "text" }] + passwords: [{ fieldEntityId: 1, password: "password" }] + } + } + ) { + customer { + firstName + lastName + } + errors { + __typename + ... on ValidationError { + message + } + ... on CustomerDoesNotExistError { + message + } + ... on EmailAlreadyInUseError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ```json filename="Example mutation: Customer update" " showLineNumbers copy + { + "data": { + "customer": { + "updateCustomer": { + "customer": { + "firstName": "Jonathan", + "lastName": "Smith" + }, + "errors": [] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Add a customer address + +The BigCommerce platform can support and store plenty of addresses per customer. Use the `addCustomerAddress` to include multiple addresses to the customer account. Similar to `registerCustomer`, add `CustomerAddress` using the form field configuration set up in the control panel for address fields. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Add a customer address" showLineNumbers copy + mutation { + customer { + addCustomerAddress( + reCaptchaV2: { token: "" } + input: { + firstName: "Jon" + lastName: "Smith" + address1: "1234 Fake Street" + address2: "" + city: "Austin" + company: "BC" + countryCode: "US" + stateOrProvince: "TX" + phone: "123-456-7890" + postalCode: "78610" + formFields: { + checkboxes: [{ fieldEntityId: 1, fieldValueEntityIds: [1, 2, 3] }] + multipleChoices: [{ fieldEntityId: 1, fieldValueEntityId: 2 }] + numbers: [{ fieldEntityId: 1, number: 1.0 }] + texts: [{ fieldEntityId: 1, text: "text" }] + passwords: [{ fieldEntityId: 1, password: "password" }] + } + } + ) { + errors { + __typename + ... on ValidationError { + message + } + ... on CustomerNotLoggedInError { + message + } + ... on CustomerAddressCreationError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ```json filename="Example mutation: Add a customer address" showLineNumbers copy + { + "data": { + "customer": { + "addCustomerAddress": { + "errors": [] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Update a customer address + +Use this `updateCustomerAddress` mutation when a customer needs to make changes to an address associated with their account. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Update a customer address" showLineNumbers copy + mutation { + customer { + updateCustomerAddress( + reCaptchaV2: { token: "" }, + input: { + addressEntityId: 1, + data: { + firstName: "Jon", + lastName: "Smith", + address1: "1234 Fake Street", + address2: "", + city: "Austin", + company: "BC", + countryCode: "US", + stateOrProvince: "TX", + phone: "123-456-7890", + postalCode: "78610", + formFields: { + checkboxes: [ + { + fieldEntityId: 1, + fieldValueEntityIds: [1,2,3] + } + ], + multipleChoices: [ + { + fieldEntityId: 1, + fieldValueEntityId: 2 + } + ], + numbers: [ + { + fieldEntityId: 1, + number: 1.0 + } + ], + texts: [ + { + fieldEntityId: 1, + text: "text" + } + ], + passwords: [ + { + fieldEntityId: 1, + password: "password" + } + ], + } + } + } + ) { + errors { + __typename + ... on ValidationError { + message + } + ... on CustomerNotLoggedInError { + message + } + ... on AddressDoesNotExistError { + message + } + ... on CustomerAddressUpdateError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ``` json filename="Example mutation: Update a customer address" showLineNumbers copy + # Success + + { + "data": { + "customer": { + "updateCustomerAddress": { + "errors": [] + } + } + } + } + + # Error + # Address Does Not Exist + + { + "data": { + "customer": { + "updateCustomerAddress": { + "errors": [ + { + "__typename": "AddressDoesNotExistError", + "message": "An address with the supplied ID does not exist." + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Delete a customer address + +Use this `delete` mutation when a customer needs to delete an address associated with their account. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Delete a customer address" showLineNumbers copy + mutation { + customer { + deleteCustomerAddress( + reCaptchaV2: { token: "" } + input: { addressEntityId: 1 } + ) { + errors { + __typename + ... on CustomerNotLoggedInError { + message + } + ... on CustomerAddressDeletionError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ```json filename="Example mutation: Delete a customer address" showLineNumbers copy + { + "data": { + "customer": { + "deleteCustomerAddress": { + "errors": [] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Change a customer password + +Use the `changePassword` mutation in cases where the customer needs to update their password. The user must know their current password in order to complete the change. + +<Tabs items={[`Request`]}> + <Tab> + ```graphql filename="Example mutation: Change a user password" showLineNumbers copy + mutation { + customer { + changePassword( + input: { currentPassword: "Password1!", newPassword: "Password2!" } + ) { + errors { + ... on ValidationError { + path + message + } + ... on CustomerPasswordError { + message + } + ... on CustomerDoesNotExistError { + message + } + ... on CustomerNotLoggedInError { + message + } + } + } + } + } + ``` + </Tab> +</Tabs> + +### Request a password reset + +A customer can request a password reset using the `requestResetPassword` mutation example as seen below. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example mutation: Request a password reset" showLineNumbers copy + mutation { + customer { + requestResetPassword( + reCaptchaV2: { token: "" } + input: { email: "jon@test.com" } + ) { + errors { + ... on ValidationError { + message + } + } + } + } + } + ``` + </Tab> + <Tab> + ```json filename="Example mutation: Request a password reset" showLineNumbers copy + { + "data": { + "customer": { + "requestResetPassword": { + "errors": [] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Reset a password + +When a customer needs a password reset, use the `resetPassword` example mutation to complete the reset. + +<Tabs items={[`Request`]}> + <Tab> + ```graphql filename="Example mutation: Reset a password" showLineNumbers copy + mutation { + customer { + resetPassword( + input: { + customerEntityId: 1 # Provided in the link contained in the reset password email + token: "" # Provided in the link contained in the reset password email + newPassword: "NewPassword1234" + } + ) { + errors { + ... on ValidationError { + message + } + ... on ChangePasswordError { + message + } + } + } + } + } + ``` + </Tab> +</Tabs> + +### Get a customer address book + +Use this query to view all the addresses a customer has added to their account. + +<Tabs items={[`Request`]}> + <Tab> + ```graphql filename="Example query: Get a customer address book" showLineNumbers copy + query { + customer { + firstName + lastName + formFields { + entityId + name + } + addresses { + collectionInfo { + totalItems + } + edges { + node { + entityId + firstName + lastName + address1 + city + stateOrProvince + postalCode + formFields { + entityId + name + } + } + } + } + } + } + ``` + </Tab> +</Tabs> + +Join our [Developer community](/community) to share your feedback with us in the BigCommerceDevs Slack or on our Discord server. + +## Resources + +### Documentation + +* [GraphQL Storefront API overview](/docs/storefront/graphql) +* [Guide to API Accounts: Store-level API accounts](/docs/start/authentication/api-accounts#store-level-api-accounts) +* [Guide to API accounts: OAuth token creation scopes](/docs/start/authentication/api-accounts#token-creation-scopes) +* [Authentication and example requests: BigCommerce-generated JWTs](/docs/start/authentication#bigcommerce-generated-jwts) + +### API reference + +#### Storefront tokens + +* [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) +* [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) + +#### REST management API: customers + +* [Customers V3](/docs/rest-management/customers/) + +### Community + +* [Developer community](/community) diff --git a/docs/api-docs/storefront/graphql/graphql-api-examples.mdx b/docs/storefront/graphql/examples/index.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-api-examples.mdx rename to docs/storefront/graphql/examples/index.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-products.mdx b/docs/storefront/graphql/examples/products.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-products.mdx rename to docs/storefront/graphql/examples/products.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-variants.mdx b/docs/storefront/graphql/examples/variants.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-variants.mdx rename to docs/storefront/graphql/examples/variants.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-api-overview.mdx b/docs/storefront/graphql/index.mdx similarity index 99% rename from docs/api-docs/storefront/graphql/graphql-api-overview.mdx rename to docs/storefront/graphql/index.mdx index fc08d65f5..b2fa21af5 100644 --- a/docs/api-docs/storefront/graphql/graphql-api-overview.mdx +++ b/docs/storefront/graphql/index.mdx @@ -26,7 +26,7 @@ This article is a general overview of BigCommerce's GraphQL Storefront API; it i ## See it in action -To see a simple example of the GraphQL Storefront API in action, check out the [Bootstrap + Vanilla JS GraphQL Storefront API Example](https://bigcommerce.github.io/storefront-api-examples/html-bootstrap-vanillajs/) hosted on GitHub. This example shows how a static HTML site can render dynamic product information using the GraphQL Storefront API. +To see a simple example of the GraphQL Storefront API in action, check out the [Bootstrap + vanilla JS GraphQL Storefront API example](https://bigcommerce.github.io/storefront-api-examples/html-bootstrap-vanillajs/) hosted on GitHub. This example shows how a static HTML site can render dynamic product information using the GraphQL Storefront API. Open the link and click submit with the sample data in the form. To see the example page with your store's data, [create a GraphQL Storefront API token](/docs/rest-authentication/tokens#create-a-token) against your store and paste the token into the example form. Be sure to create a token valid for this origin: `https://bigcommerce.github.io`. diff --git a/docs/storefront/graphql/inventory/queries.mdx b/docs/storefront/graphql/inventory/queries.mdx new file mode 100644 index 000000000..a281f1954 --- /dev/null +++ b/docs/storefront/graphql/inventory/queries.mdx @@ -0,0 +1,728 @@ +# Query Inventory with the GraphQL Storefront API + +The GraphQL Storefront API allows you to fetch inventory for products and variants in your store location(s). +The queries can show online availability for products or availability at location(s). You can filter by product or variant when fetching inventory. + +**Default behavior:** By default, Stencil's native storefront and GraphQL's Get Stock by Locations queries support stock levels from only the _default_ location. Aggregated stock includes stock from only the default location; queries for stock at each location return stock from only the default location. + +**Alternate behavior:** Upon request, your store can have the following features: +- Stock _per location_ +- Stock aggregated, or summed, from _all locations_ + +[Contact the Support team](https://support.bigcommerce.com/s/contact?language=en_US) if you want the alternate behavior on your storefront. Stencil storefront pages will then reflect these features, including home, Category, and Product details pages. You will need to customize default themes to have these features on Elastic Search, Cart, Checkout, and Orders pages. For example, you can [build a custom checkout](/docs/storefront/cart-checkout/open-checkouts/guide) on a headless storefront. + +<Callout type="info"> + In the alternate behavior, aggregated stock calculations include only stock from _active_ locations. To check if a location is active, use the [Get locations](/docs/rest-management/locations#get-locations) endpoint. +</Callout> + +Below are examples of queries that allow you to fetch inventory for storefront location(s). + +For a general overview of the GraphQL Storefront API usage and capabilities, see [GraphQL Storefront API Overview](/docs/storefront/graphql). + +## Fetch aggregate inventory for products + +This query returns the aggregate inventory level for each product. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get aggregate inventory for a base product" showLineNumbers copy + query { + site { + products { + edges { + node { + entityId + name + inventory { + aggregated { // By default, includes inventory from only the default location + availableToSell + warningLevel + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get aggregate inventory for a base product" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": { + "availableToSell": 20, + "warningLevel": 5 + } + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +In the example response, Example Product 1 has an aggregate inventory of 11. + +<Callout type="info"> + You can filter by product so that only the inventory for certain products will be returned. To do so, use the entity IDs of the products you wish to return. + For example, in the example response, Example Product 1 has an entityId of 113. You can make a new request that filters for this product by using entityId 113. See GraphQL Playground for documentation. +</Callout> + +### How inventory settings affect product inventories returned + +The products returned depend on a store's inventory settings for out-of-stock products. If a merchant decides to hide out-of-stock products completely, out-of-stock products will not be returned. In the following example, Example Product 2s are out-of-stock and therefore, only (in-stock) Example Product 1 is returned: + +```json filename="Example JSON Response" showLineNumbers copy +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": { + "availableToSell": 20, + "warningLevel": 5 + } + } + } + } + ] + } + } + } +} +``` + +The inventory levels for products depend on a stores's inventory settings for displaying stock levels. If a merchant decides to not show stock levels, inventory levels will return `null` as shown here: + +```json filename="Example JSON Response" showLineNumbers copy +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": null + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": null + } + } + } + ] + } + } + } +} +``` + +Similarly, if a merchant decides to only show stock levels for a product when stock is low, inventory levels for products that aren't low or aren't out of stock will return `null`. In the following example, Example Product 1 returns `null` because it is not low or out of stock: + +```json filename="Example JSON Response" showLineNumbers copy +{ + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "inventory": { + "aggregated": null + } + } + }, + { + "node": { + "entityId": 115, + "name": "Example Product 2", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } +} +``` + +## Fetch aggregate inventory for variants + +This query returns the aggregate inventory level for each variant. In this example, the query returns data for only one product by specifying the product's entityId. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get aggregate inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants { + edges { + node { + entityId + sku + inventory { + aggregated { // By default, includes inventory from only the default location + availableToSell + warningLevel + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get aggregate inventory for a variant" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "aggregated": { + "availableToSell": 11, + "warningLevel": 20 + } + } + } + }, + { + "node": { + "entityId": 96, + "sku": "ABC-1111-PU", + "inventory": { + "aggregated": { + "availableToSell": 0, + "warningLevel": 0 + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Fetch inventory for variants at each location + +This query returns the inventory level for a specified variant. In this example, the query returns data for only one product and only one variant by specifying the product's entityId and the variant's entityId. + +<Callout type="info"> +* The `isInStock` field is calculated based on `is_in_stock` and `availableToSell` values. The `is_in_stock` value is set by the [Inventory API](/docs/rest-management/inventory/items#get-inventory-at-locations) or in the product section of the control panel. +* `isInStock` is TRUE if `is_in_stock` is TRUE and `available_to_sell` is more than zero. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get a location's inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95]) { + edges { + node { + entityId + sku + inventory { + byLocation { // By default, returns only the default location + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get a location's inventory for a variant" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 6, + "warningLevel": 20, + "isInStock": false + } + }, + + // By default, responses don't include non-default locations + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 5, + "warningLevel": 20, + "isInStock": false + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + As shown in the example response, locations are identified by a unique ID (`locationEntityId`) and code (`locationEntityCode`). + The location type ID (`locationEntityTypeId`) is the location type, either `PHYSICAL` or `VIRTUAL`. + The location's code and type can be customized using Locations API. +</Callout> + +### How inventory settings affect variant inventories returned + +The following examples show how variant inventories are affected when a merchant decides to hide out-of-stock options. + +The query returns variant inventories if a variant has stock in at least one location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds: [95]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { // By default, returns only the default location + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 95, + "sku": "ABC-1111-PI", + "inventory": { + "aggregated": { + "availableToSell": 10, + "warningLevel": 10 + }, + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 10, + "warningLevel": 5, + "isInStock": true + } + }, + + // By default, responses don't include non-default locations + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 0, + "warningLevel": 5, + "isInStock": false + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + + +If a variant is out of stock at all locations, the variant is not returned. In the following example, variant `entityId: 95` is out of stock at all locations, but variant `entityId: 96` has stock in at least one location. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95,96]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { // By default, returns only the default location + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [ + { + "node": { + "entityId": 96, + "sku": "ABC-1111-PU", + "inventory": { + "aggregated": { + "availableToSell": 10, + "warningLevel": 5 + }, + "byLocation": { + "edges": [ + { + "node": { + "locationEntityId": 1, + "locationEntityCode": "BC-LOCATION-1", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 10, + "warningLevel": 5, + "isInStock": true + } + }, + + // By default, responses don't include non-default locations + { + "node": { + "locationEntityId": 2, + "locationEntityCode": "BC-LOCATION-2", + "locationEntityTypeId": "PHYSICAL", + "locationDistance": null, + "availableToSell": 0, + "warningLevel": 0, + "isInStock": false + } + } + ] + } + } + } + } + ] + } + } + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + +The following example shows the returned response if you query for variants whose inventories are zero at all locations: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get inventory for a variant" showLineNumbers copy + query { + site { + products (entityIds:[113]) { + edges { + node { + entityId + name + variants (entityIds:[95,96]) { + edges { + node { + entityId + sku + inventory { + aggregated { + availableToSell + warningLevel + } + byLocation { + edges { + node { + locationEntityId + locationEntityCode + locationEntityTypeId + locationDistance { + value + lengthUnit + } + availableToSell + warningLevel + isInStock + } + } + } + } + } + } + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get inventory for a variant" showLineNumbers copy + { + "data": { + "site": { + "products": { + "edges": [ + { + "node": { + "entityId": 113, + "name": "Example Product 1", + "variants": { + "edges": [] + } + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> diff --git a/docs/storefront/graphql/inventory/settings.mdx b/docs/storefront/graphql/inventory/settings.mdx new file mode 100644 index 000000000..4ac5ab32f --- /dev/null +++ b/docs/storefront/graphql/inventory/settings.mdx @@ -0,0 +1,47 @@ +# Get Inventory + +You can query inventory information using the GraphQL Storefront API. The information accessible by any storefront API is controlled by the [inventory settings](#inventory-settings) for the store. + +For example queries, see [Query Inventory with the GraphQL Storefront API](/docs/storefront/graphql/inventory/queries). + +To work with inventory settings, the [API account](/docs/start/authentication/api-accounts) that generates [Storefront tokens](/docs/rest-authentication/tokens) must include one of the following [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes): + +| UI Name | Permission | Parameter | +|:--------|:-----------|:----------| +| Products | modify | `store_v2_products` | +| Products | read-only | `store_v2_products_read_only` | + +Use these scopes to read and change the following information: + +- The total inventory quantity of a particular product or variant that is available for shoppers across all visible locations +- The inventory quantity of a particular variant that is available at a specified location + +## Settings to retrieve inventories + +### Inventory Settings + +Regardless of physical stock levels, inventory quantities may return `null` depending on the store's inventory settings, accessible through the [Settings API](/docs/rest-management/settings/inventory) or the **Settings** > **Inventory** page in the store control panel. + +In the following cases, inventory-related storefront queries may return different responses than expected: + +| Case | Response | +|:-----|:---------| +| Out-of-stock products are hidden from the storefront | No responses will contain that product | +| Stock levels are hidden from the storefront | Inventory levels will always return `null` | +| Only products low in stock display inventory levels | Inventory levels for products with quantities above the low-stock threshold will always return `null` | + +A store's inventory settings also affect inventory levels for variants. To see examples of these responses, see [Query Inventory with the GraphQL Storefront API](/docs/storefront/graphql/inventory/queries). + +### Location settings + +- When a location is _enabled_, its inventory of products and variants is accessible to the storefront. This inventory is included in the aggregate stock for a product or variant. +- If a location is _enabled_ and _visible_, its inventory is fetched when you query the stock for a variant at each location. + +To enable locations and change location visibility, use the [Update locations](/docs/rest-management/locations#update-locations) endpoint. + +## Resources +* [GraphQL Storefront API Overview](/docs/storefront/graphql) +* [GraphQL Storefront API Reference](/docs/graphql-storefront) +* [GraphQL Storefront Playground](/graphql-playground) +* [GraphQL Storefront Explorer](/graphql-explorer) + diff --git a/docs/storefront/graphql/locations/queries.mdx b/docs/storefront/graphql/locations/queries.mdx new file mode 100644 index 000000000..e74fe3de6 --- /dev/null +++ b/docs/storefront/graphql/locations/queries.mdx @@ -0,0 +1,706 @@ +# Query Locations with the GraphQL Storefront API + +The GraphQL Storefront API allows you to fetch data for your store's locations. Below are examples of GraphQL Storefront queries that allow you to fetch location data for storefront locations. + +For a general overview of the GraphQL Storefront API usage and capabilities, see [GraphQL Storefront API Overview](/docs/storefront/graphql). See GraphQL Playground for documentation of the full schema. + +## How to get location data for stores + +You can retrieve location data for store locations that are _enabled_ and _visible_. Here is an example query that returns location data, for example, address and operating hours on the specified days. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data" showLineNumbers copy + query { + inventory { + locations { + edges { + node { + entityId + code + label + description + typeId + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL", + "timeZone": "Etc/UTC", + "address": { + "city": "Austin", + "address1": "103 Example Drive", + "address2": "", + "postalCode": "78726", + "stateOrProvince": "TX", + "email": "person@person.com", + "phone": "", + "latitude": 37.7749, + "longitude": 122.4194, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": true, + "opening": "09:30", + "closing": "20:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + }, + { + "node": { + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL", + "timeZone": "Etc/UTC", + "address": { + "city": "San Francisco", + "address1": "123 Example St", + "address2": "", + "postalCode": "94105", + "stateOrProvince": "CA", + "email": "email@example.com", + "phone": "", + "latitude": 37.7877, + "longitude": 122.4026, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +Locations are identified by a unique ID (`entityId`) and code (`code`). The location's type ID (`typeId`) is the location type, either PHYSICAL or VIRTUAL. The location's code and type can be customized using [Locations API](/docs/rest-management/locations). + +The location identities and data that are returned from the response can be used to filter the data returned for certain locations. See [How to Filter Location Data](#how-to-filter-location-data). + +When you query for metafields, only metafields with storefront access permissions will be returned. In other words, a metafield's `permission_set` field must be `write_and_sf_access` or `read_and_sf_access` when you create or update a metafield. The following example includes the metafields along with the location data that are returned. As shown, the `namespace` of the metafield you wish to query must be specified: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location metafields" showLineNumbers copy + query { + inventory { + locations { + edges { + node { + metafields(namespace: "examplespace") { + edges { + node { + entityId + key + value + } + } + } + entityId + code + label + description + typeId + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location metafields" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "metafields": { + "edges": [] + }, + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL" + } + }, + { + "node": { + "metafields": { + "edges": [ + { + "node": { + "entityId": 2, + "key": "example key", + "value": "new location" + } + } + ] + }, + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL" + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +<Callout type="info"> + A location's descriptions can be added using the [Create locations](/docs/rest-management/locations#create-locations) endpoint in the Locations API. + A location's metafields can be added using [Create a metafield](/docs/rest-management/locations/metafields#create-a-metafield) endpoint in the Locations API. +</Callout> + + +## How to filter location data + +You can filter by the identities of locations, as well as the data for locations, so that data for only some locations will be returned. To do so, specify a filter in the argument for `locations`. + +### Filter by location identity + +You can filter by the entityIds, codes, and typeIds of the locations you wish to return: + +```graphql filename="Filters for Location Identity" showLineNumbers copy +... +locations( + entityIds: [1, 2, 3] + codes: ["BC-LOCATION-2", "BC-LOCATION-1", "BC-LOCATION-3"] + typeIds: ["PHYSICAL", "VIRTUAL"] + ) +... +``` + +Here is an example query that returns the locations that have a specific entityId, code, and typeId: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data using ID filters" showLineNumbers copy + query { + inventory { + locations ( + entityIds: [2] + codes: ["BC-LOCATION-2"] + typeIds: ["PHYSICAL"] + ) { + edges { + node { + entityId + code + label + description + typeId + distance { + value + lengthUnit + } + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data using ID filters" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 2, + "code": "BC-LOCATION-2", + "label": "ExampleLocation", + "description": "Open only on weekdays", + "typeId": "PHYSICAL", + "distance": null, + "timeZone": "Etc/UTC", + "address": { + "city": "San Francisco", + "address1": "123 Example St", + "address2": "", + "postalCode": "94105", + "stateOrProvince": "CA", + "email": "email@example.com", + "phone": "", + "latitude": 37.7877, + "longitude": 122.4026, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +### Filter by location data + +You can also filter for locations by their data. For example, you can filter by location country, state, and city. You can also filter for locations that are within a specified distance from a shopper, specified by latitude and longitude coordinates. + +```graphql filename="Filters for Location Data" showLineNumbers copy +... +locations( + countryCodes: [US, AU] + states: ["TX", "CA"] + cities: ["Austin", "San Francisco"] + distanceFilter: { + radius: 1.0 + longitude: 122.4194 + latitude: 37.7749 + lengthUnit: Kilometres + } + ) +... +``` + +<Callout type="info"> + When filtering by country, use the country's two-letter code. For states, use the state abbreviation. + When filtering by distance, specify distance in terms of `Kilometres` or `Miles`. +</Callout> + +This example query returns the stores that are in the specified country, state, and city, and that are within one kilometer from the specified latitude and longitude: + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example request: Get location data using distance filters" showLineNumbers copy + query { + inventory { + locations ( + countryCodes: [US] + states: ["TX"] + cities: ["Austin"] + distanceFilter: { + radius: 1.0 + longitude: 122.4194 + latitude: 37.7749 + lengthUnit: Kilometres + } + ) { + edges { + node { + entityId + code + label + description + typeId + distance { + value + lengthUnit + } + timeZone + address { + city + address1 + address2 + postalCode + stateOrProvince + email + phone + latitude + longitude + countryCode + } + operatingHours { + sunday { + open + opening + closing + } + monday { + open + opening + closing + } + tuesday { + open + opening + closing + } + wednesday { + open + opening + closing + } + thursday { + open + opening + closing + } + friday { + open + opening + closing + } + saturday { + open + opening + closing + } + } + specialHours { + label + open + opening + closing + } + } + } + } + } + } + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get location data using distance filters" showLineNumbers copy + { + "data": { + "inventory": { + "locations": { + "edges": [ + { + "node": { + "entityId": 1, + "code": "BC-LOCATION-1", + "label": "Default location", + "description": "", + "typeId": "PHYSICAL", + "distance": { + "value": 0, + "lengthUnit": "Kilometres" + }, + "timeZone": "Etc/UTC", + "address": { + "city": "Austin", + "address1": "103 Example Drive", + "address2": "", + "postalCode": "78726", + "stateOrProvince": "TX", + "email": "person@person.com", + "phone": "", + "latitude": 37.7749, + "longitude": 122.4194, + "countryCode": "US" + }, + "operatingHours": { + "sunday": { + "open": true, + "opening": "09:30", + "closing": "20:00" + }, + "monday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "tuesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "wednesday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "thursday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "friday": { + "open": true, + "opening": "09:00", + "closing": "17:00" + }, + "saturday": { + "open": false, + "opening": "00:00", + "closing": "00:00" + } + }, + "specialHours": [] + } + } + ] + } + } + } + } + ``` + + </Tab> +</Tabs> + +The distance from the queried latitude and longitude is returned in the response. In this example, one store location was returned, in which the store was located 0 km from the queried latitude and longitude. diff --git a/docs/storefront/graphql/locations/settings.mdx b/docs/storefront/graphql/locations/settings.mdx new file mode 100644 index 000000000..eb9a78f97 --- /dev/null +++ b/docs/storefront/graphql/locations/settings.mdx @@ -0,0 +1,50 @@ +# Get Locations + +You can query location information using the GraphQL Storefront API. The information accessible by any storefront API is controlled by the [location settings](#location-settings) for the store. + +For example queries, see [Query Locations with the GraphQL Storefront API](/docs/storefront/graphql/locations/queries). + +To work with locations, the [API account](/docs/start/authentication/api-accounts) that generates [Storefront tokens](/docs/rest-authentication/tokens) must include one of the following [OAuth scopes](/docs/start/authentication/api-accounts#oauth-scopes): + +| UI Name | Permission | Parameter | +|:--------|:-----------|:----------| +| Information & Settings | modify | `store_v2_information` | +| Information & Settings | read-only | `store_v2_information_read_only` | + +Use these scopes to read and change the following information: + +- The storefront details for a location +- General store information +- Location addresses +- Contact details + +<Callout type="info"> + The _Buy Online, Pick up in Store_ pattern is designed to center a single online storefront. _Buy Online, Pick up in Store_ is not compatible with multi-storefront channels (MSF). +</Callout> + +## Location settings + +A location must be _enabled_ and _visible_ in order for the GraphQL Storefront API to storefront details for the location. + +If a location is not enabled or visible, send a request to the [Update Locations](/docs/rest-management/locations#update-locations) endpoint. + +```http filename="Example request: Update location" showLineNumbers copy +PUT https://api.bigcommerce.com/stores/{{store_hash}}/v3/inventory/locations +X-Auth-Token: {{access_token}} +Content-Type: application/json +Accept: application/json + +[ + { + "id": 2, + "enabled": true, + "storefront_visibility": true + } +] +``` + +## Resources +* [GraphQL Storefront API Overview](/docs/storefront/graphql) +* [GraphQL Storefront API Reference](/docs/graphql-storefront) +* [GraphQL Storefront Playground](/graphql-playground) +* [GraphQL Storefront Explorer](/graphql-explorer) diff --git a/docs/api-docs/storefront/graphql/graphql-product-reviews.mdx b/docs/storefront/graphql/product-reviews.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-product-reviews.mdx rename to docs/storefront/graphql/product-reviews.mdx diff --git a/docs/api-docs/building-storefronts/abandoned-carts.mdx b/docs/storefront/headless/cart-checkout/abandoned-carts.mdx similarity index 100% rename from docs/api-docs/building-storefronts/abandoned-carts.mdx rename to docs/storefront/headless/cart-checkout/abandoned-carts.mdx diff --git a/docs/api-docs/headless/carts.mdx b/docs/storefront/headless/cart-checkout/carts.mdx similarity index 100% rename from docs/api-docs/headless/carts.mdx rename to docs/storefront/headless/cart-checkout/carts.mdx diff --git a/docs/api-docs/headless/checkout.mdx b/docs/storefront/headless/cart-checkout/checkout.mdx similarity index 100% rename from docs/api-docs/headless/checkout.mdx rename to docs/storefront/headless/cart-checkout/checkout.mdx diff --git a/docs/api-docs/headless/channels.mdx b/docs/storefront/headless/channels.mdx similarity index 100% rename from docs/api-docs/headless/channels.mdx rename to docs/storefront/headless/channels.mdx diff --git a/docs/api-docs/headless/customers.mdx b/docs/storefront/headless/customers.mdx similarity index 100% rename from docs/api-docs/headless/customers.mdx rename to docs/storefront/headless/customers.mdx diff --git a/docs/api-docs/headless/end-to-end-guides/graphql-storefront.mdx b/docs/storefront/headless/end-to-end-guides/graphql-storefront.mdx similarity index 100% rename from docs/api-docs/headless/end-to-end-guides/graphql-storefront.mdx rename to docs/storefront/headless/end-to-end-guides/graphql-storefront.mdx diff --git a/docs/api-docs/headless/end-to-end-guides/rest-management.mdx b/docs/storefront/headless/end-to-end-guides/rest-management.mdx similarity index 99% rename from docs/api-docs/headless/end-to-end-guides/rest-management.mdx rename to docs/storefront/headless/end-to-end-guides/rest-management.mdx index 1cb82991f..1bb398fa4 100644 --- a/docs/api-docs/headless/end-to-end-guides/rest-management.mdx +++ b/docs/storefront/headless/end-to-end-guides/rest-management.mdx @@ -270,7 +270,7 @@ After you transform your headless cart into a proper checkout with a billing add ### Step 1: Add a new consignment to the checkout - Send a request to the [Add Consignment to Checkout](/docs/rest-management/checkouts/checkout-consignments#add-consignment-to-checkout) endpoint. Append the `include=consignments.available_shipping_options` query parameter to your request to return available shipping options. Use one of the available shipping options to update the consignment in [step 2](#step-2-update-the-consignment). + Send a request to the [Add Consignment to Checkout](/docs/rest-management/checkouts/checkout-consignments#add-consignment-to-checkout) endpoint. Append the `include=consignments.available_shipping_options` query parameter to your request to return available shipping options. Use one of the available shipping options to update the consignment in [step 2](#step-2-update-the-consignment-with-a-shipping-option). <Tabs items={['Request', 'Response']}> <Tab> diff --git a/docs/api-docs/headless/overview.mdx b/docs/storefront/headless/index.mdx similarity index 100% rename from docs/api-docs/headless/overview.mdx rename to docs/storefront/headless/index.mdx diff --git a/docs/api-docs/headless/orders.mdx b/docs/storefront/headless/orders.mdx similarity index 100% rename from docs/api-docs/headless/orders.mdx rename to docs/storefront/headless/orders.mdx diff --git a/docs/api-docs/headless/pci-compliance.mdx b/docs/storefront/headless/pci-compliance.mdx similarity index 100% rename from docs/api-docs/headless/pci-compliance.mdx rename to docs/storefront/headless/pci-compliance.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx b/docs/storefront/headless/products/faceted-textual-search.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-faceted-textual-search.mdx rename to docs/storefront/headless/products/faceted-textual-search.mdx diff --git a/docs/api-docs/headless/products.mdx b/docs/storefront/headless/products/index.mdx similarity index 100% rename from docs/api-docs/headless/products.mdx rename to docs/storefront/headless/products/index.mdx diff --git a/docs/api-docs/storefront/graphql/graphql-site-content.mdx b/docs/storefront/headless/site-content.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/graphql-site-content.mdx rename to docs/storefront/headless/site-content.mdx diff --git a/docs/msf/msf-api-guide.mdx b/docs/storefront/multi-storefront/guide.mdx similarity index 100% rename from docs/msf/msf-api-guide.mdx rename to docs/storefront/multi-storefront/guide.mdx diff --git a/docs/msf/msf-overview.mdx b/docs/storefront/multi-storefront/index.mdx similarity index 100% rename from docs/msf/msf-overview.mdx rename to docs/storefront/multi-storefront/index.mdx diff --git a/docs/api-docs/building-storefronts/nextjs-bigcommerce.mdx b/docs/storefront/next-commerce.mdx similarity index 100% rename from docs/api-docs/building-storefronts/nextjs-bigcommerce.mdx rename to docs/storefront/next-commerce.mdx diff --git a/docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx b/docs/storefront/stencil/cli/development-server.mdx similarity index 98% rename from docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx rename to docs/storefront/stencil/cli/development-server.mdx index 78aa7bebc..b74aa7392 100644 --- a/docs/stencil-docs/installing-stencil-cli/live-previewing-a-theme.mdx +++ b/docs/storefront/stencil/cli/development-server.mdx @@ -1,144 +1,144 @@ -# Live Previewing a Theme - -Once you've installed the Stencil CLI, the next steps are downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. This article walks you through the process of downloading a theme for development, installing theme modules, and serving a live preview using Stencil CLI's `stencil start` command. - -The steps in this article assume you've installed Stencil CLI on your system. If you haven't installed it yet, see [Installing Stencil CLI](/docs/storefront/stencil/cli/install) for detailed, system-specific instructions. - -<Callout type="warning"> - #### Theme access, copyright, and distribution -Developers may customize free and purchased marketplace themes; however, the original creator retains rights to the theme's design, which means derived themes may not be uploaded to a public theme marketplace (BigCommerce's or third-party) or sold privately. - </Callout> - -## Creating Stencil API credentials - -Stencil CLI uses various BigCommerce APIs to inject store-specific data, like carousel images and products, into the live theme preview it serves up. To do so, you must supply the Stencil CLI with a Stencil-specific access token. - -To automatically create an API account with the scopes and permissions required by Stencil CLI, apply the following settings as you [create a store-level API account](/docs/start/authentication/api-accounts#creating-store-level-api-accounts). - -Select **Create Stencil-CLI Token** in the **Create API Accounts** dropdown: - -![Create API Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-api-account.png "Create API Account") - -The **Stencil-CLI Access Level** can then be set by selecting **local development only** or **publish theme**: - -![Create Stencil-CLI Token](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-stencil-cli-token.png "Create Stencil-CLI Token") - -* **local development only** - can read theme related store data, but can not publish -* **publish theme** - can read theme related store data and push themes to the live storefront - -For detailed instructions, see [Store API Accounts](https://support.bigcommerce.com/s/article/Store-API-Accounts). - -## Downloading a theme - -To develop against BigCommerce's Cornerstone theme (which is the building block and starting point for rapidly developing themes for BigCommerce) clone [the repository](https://github.com/bigcommerce/cornerstone) from GitHub: - -```shell copy -git clone https://github.com/bigcommerce/cornerstone.git -``` - -<Callout type="warning"> - #### Distribution of Cornerstone-based themes - Distribution of Cornerstone-based themes is subject to BigCommerce's Cornerstone license, including the mandatory incorporation of BigCommerce's copyright statement. - </Callout> - -Cornerstone and other themes can also be downloaded from the BigCommerce control panel. For instructions on doing so, see [Downloading and Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) (BigCommerce Knowledge Base). - -<Callout type="info"> - #### Update themes after download - Downloading a theme does not include the current configuration of a theme. Run a [stencil pull](/docs/storefront/stencil/cli/options-and-commands#stencil-pull) command to obtain the theme's most recently saved version (appears only for themes customized for this store). -  - </Callout> - -## Installing theme modules - -<Callout type="warning"> - #### Back up before reinstalling - If you're re-installing an existing theme, be sure to back up the theme’s `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later). The files contain the store URL, username, access tokens, and other settings. If you would like to allow for complete rollback, back up your entire theme’s directory. - </Callout> - -For theme versions `1.10.0+`, modules can be installed with `npm`: - -```shell copy showLineNumbers -# move into the theme dir -cd ~/path/to/theme/dir - -# install modules using npm -npm install -``` - -This will install the `npm` modules required to properly leverage the Stencil event framework. - -## Serving a live preview - -Once Stencil CLI is installed and a theme is downloaded, a `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) can be initialized for the theme and development can begin. - -Stencil CLI uses [Browsersync](https://github.com/bigcommerce/browser-sync) to serve up a live preview of a theme in development. When the preview is opened on multiple devices or browser windows, scroll, click, refresh and form actions are mirrored across the browser instances. - -The Browsersync preview is launched by executing the `stencil start` command in a terminal window. When `stencil start` is executed, Stencil CLI checks for the required `.stencil` configuration file or `secrets.stencil.json` and `config.stencil.json` configuration files (if using Stencil V3.1 release or later), which contains the following information: -* the store's URL -* a store-level API account access token -* a local port number - - -<Callout type="info"> - The store's URL should be a vanity URL. - </Callout> - -This configuration file is created by running `stencil init` and entering the information listed above. Before doing so, be sure to [create Stencil API credentials](#creating-stencil-api-credentials). - -To initialize a new `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) and start live preview, run the following commands in a terminal: - -```shell showLineNumbers copy -# move into the theme's directory -cd ~/path/to/theme/dir - -# install theme modules (if you haven't already) -npm install - -# create `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) -stencil init --url https://yourstore.com/ --token 19d3ae6-dc15-4af9-bead-a2c703aa7b --port 3000 - -# serve a live preview of the theme: -stencil start -``` - -`stencil start` will output several URLs: - -```shell showLineNumbers copy -# ... -[Browsersync] Proxying: http://localhost:3001 -[Browsersync] Access URLs: - -- - Local: http://localhost:3000 # preview real-time changes on your local machine - External: http://10.4.10.71:3000 # preview real-time changes across multiple devices - -- - UI: http://localhost:3002 - UI External: http://10.4.10.71:3002 - -- -[Browsersync] Watching files... -``` - -Browse to the local URL to preview the theme and see changes updated in real-time. To preview the theme on multiple devices simultaneously, browse to the external URL on the desired devices. As you navigate through the site, Stencil CLI will use the Stencil API token supplied to make API calls to BigCommerce and populate the theme preview with live store data in order to mimic production as closely as possible. - -### Serving a live preview over HTTPS - -It is possible to serve a live preview over HTTPS using [ngrok](https://ngrok.com/docs). To get started with ngrok, follow the [Create an HTTPS Tunnel](/docs/integrations/apps/tutorial/nextjs-connect#create-an-https-tunnel) section of the sample app tutorial. If your app does not run on port 3000, replace 3000 with the port of your app server. - -## Debugging your theme - -<Callout type="info"> - #### BitBucket re-authentication - If you receive error messages about resolving BitBucket as an SSH host when running `stencil init`, enter the BitBucket password used to set up the BitBucket SSH Keys when prompted. - </Callout> - -The Stencil framework provides built-in debugging tools to aid in your custom front-end development. To see what data is available on the page you are working on, add the debug query string to your store's localhost URL. For example, `http://localhost:3000/product/sample-product?debug=context`. This string will return a list of all the objects on the page in JSON syntax. If you want to view the available JSON objects and rendered page simultaneously, change the debug value to `bar`. For example, `http://localhost:3000/product/sample-product?debug=bar`. - -For a full list of Stencil CLI commands, see [Stencil CLI Options and Commands](/docs/storefront/stencil/cli/options-and-commands). For help troubleshooting errors or installation issues, see [Troubleshooting Your Setup](/docs/storefront/stencil/cli/unexpected-behavior). - - - -## Resources - -### Additional resources -* [Demonstration of Stencil Installation and Launch](https://bigcommerce.wistia.com/medias/8camrxj76a) -* [Stencil CLI GitHub Repo](https://github.com/bigcommerce/stencil-cli) +# Live Previewing a Theme + +Once you've installed the Stencil CLI, the next steps are downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. This article walks you through the process of downloading a theme for development, installing theme modules, and serving a live preview using Stencil CLI's `stencil start` command. + +The steps in this article assume you've installed Stencil CLI on your system. If you haven't installed it yet, see [Installing Stencil CLI](/docs/storefront/stencil/cli/install) for detailed, system-specific instructions. + +<Callout type="warning"> + #### Theme access, copyright, and distribution +Developers may customize free and purchased marketplace themes; however, the original creator retains rights to the theme's design, which means derived themes may not be uploaded to a public theme marketplace (BigCommerce's or third-party) or sold privately. + </Callout> + +## Creating Stencil API credentials + +Stencil CLI uses various BigCommerce APIs to inject store-specific data, like carousel images and products, into the live theme preview it serves up. To do so, you must supply the Stencil CLI with a Stencil-specific access token. + +To automatically create an API account with the scopes and permissions required by Stencil CLI, apply the following settings as you [create a store-level API account](/docs/start/authentication/api-accounts#creating-store-level-api-accounts). + +Select **Create Stencil-CLI Token** in the **Create API Accounts** dropdown: + +![Create API Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-api-account.png "Create API Account") + +The **Stencil-CLI Access Level** can then be set by selecting **local development only** or **publish theme**: + +![Create Stencil-CLI Token](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/create-stencil-cli-token.png "Create Stencil-CLI Token") + +* **local development only** - can read theme related store data, but can not publish +* **publish theme** - can read theme related store data and push themes to the live storefront + +For detailed instructions, see [Store API Accounts](https://support.bigcommerce.com/s/article/Store-API-Accounts). + +## Downloading a theme + +To develop against BigCommerce's Cornerstone theme (which is the building block and starting point for rapidly developing themes for BigCommerce) clone [the repository](https://github.com/bigcommerce/cornerstone) from GitHub: + +```shell copy +git clone https://github.com/bigcommerce/cornerstone.git +``` + +<Callout type="warning"> + #### Distribution of Cornerstone-based themes + Distribution of Cornerstone-based themes is subject to BigCommerce's Cornerstone license, including the mandatory incorporation of BigCommerce's copyright statement. + </Callout> + +Cornerstone and other themes can also be downloaded from the BigCommerce control panel. For instructions on doing so, see [Downloading and Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) (BigCommerce Knowledge Base). + +<Callout type="info"> + #### Update themes after download + Downloading a theme does not include the current configuration of a theme. Run a [stencil pull](/docs/storefront/stencil/cli/options-and-commands#stencil-pull) command to obtain the theme's most recently saved version (appears only for themes customized for this store). +  + </Callout> + +## Installing theme modules + +<Callout type="warning"> + #### Back up before reinstalling + If you're re-installing an existing theme, be sure to back up the theme’s `.stencil` file or `secrets.stencil.json` and `config.stencil.json` files (if using Stencil V3.1 release or later). The files contain the store URL, username, access tokens, and other settings. If you would like to allow for complete rollback, back up your entire theme’s directory. + </Callout> + +For theme versions `1.10.0+`, modules can be installed with `npm`: + +```shell copy showLineNumbers +# move into the theme dir +cd ~/path/to/theme/dir + +# install modules using npm +npm install +``` + +This will install the `npm` modules required to properly leverage the Stencil event framework. + +## Serving a live preview + +Once Stencil CLI is installed and a theme is downloaded, a `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) can be initialized for the theme and development can begin. + +Stencil CLI uses [Browsersync](https://github.com/bigcommerce/browser-sync) to serve up a live preview of a theme in development. When the preview is opened on multiple devices or browser windows, scroll, click, refresh and form actions are mirrored across the browser instances. + +The Browsersync preview is launched by executing the `stencil start` command in a terminal window. When `stencil start` is executed, Stencil CLI checks for the required `.stencil` configuration file or `secrets.stencil.json` and `config.stencil.json` configuration files (if using Stencil V3.1 release or later), which contains the following information: +* the store's URL +* a store-level API account access token +* a local port number + + +<Callout type="info"> + The store's URL should be a vanity URL. + </Callout> + +This configuration file is created by running `stencil init` and entering the information listed above. Before doing so, be sure to [create Stencil API credentials](#creating-stencil-api-credentials). + +To initialize a new `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) and start live preview, run the following commands in a terminal: + +```shell showLineNumbers copy +# move into the theme's directory +cd ~/path/to/theme/dir + +# install theme modules (if you haven't already) +npm install + +# create `.stencil` or `config.stencil.json` configuration file (if using Stencil V3.1 release or later) +stencil init --url https://yourstore.com/ --token 19d3ae6-dc15-4af9-bead-a2c703aa7b --port 3000 + +# serve a live preview of the theme: +stencil start +``` + +`stencil start` will output several URLs: + +```shell showLineNumbers copy +# ... +[Browsersync] Proxying: http://localhost:3001 +[Browsersync] Access URLs: + -- + Local: http://localhost:3000 # preview real-time changes on your local machine + External: http://10.4.10.71:3000 # preview real-time changes across multiple devices + -- + UI: http://localhost:3002 + UI External: http://10.4.10.71:3002 + -- +[Browsersync] Watching files... +``` + +Browse to the local URL to preview the theme and see changes updated in real-time. To preview the theme on multiple devices simultaneously, browse to the external URL on the desired devices. As you navigate through the site, Stencil CLI will use the Stencil API token supplied to make API calls to BigCommerce and populate the theme preview with live store data in order to mimic production as closely as possible. + +### Serving a live preview over HTTPS + +It is possible to serve a live preview over HTTPS using [ngrok](https://ngrok.com/docs). To get started with ngrok, follow the [Create an HTTPS Tunnel](/docs/integrations/apps/tutorial/nextjs-connect#create-an-https-tunnel) section of the sample app tutorial. If your app does not run on port 3000, replace 3000 with the port of your app server. + +## Debugging your theme + +<Callout type="info"> + #### BitBucket re-authentication + If you receive error messages about resolving BitBucket as an SSH host when running `stencil init`, enter the BitBucket password used to set up the BitBucket SSH Keys when prompted. + </Callout> + +The Stencil framework provides built-in debugging tools to aid in your custom front-end development. To see what data is available on the page you are working on, add the debug query string to your store's localhost URL. For example, `http://localhost:3000/product/sample-product?debug=context`. This string will return a list of all the objects on the page in JSON syntax. If you want to view the available JSON objects and rendered page simultaneously, change the debug value to `bar`. For example, `http://localhost:3000/product/sample-product?debug=bar`. + +For a full list of Stencil CLI commands, see [Stencil CLI Options and Commands](/docs/storefront/stencil/cli/options-and-commands). For help troubleshooting errors or installation issues, see [Troubleshooting Your Setup](/docs/storefront/stencil/cli/unexpected-behavior). + + + +## Resources + +### Additional resources +* [Demonstration of Stencil Installation and Launch](https://bigcommerce.wistia.com/medias/8camrxj76a) +* [Stencil CLI GitHub Repo](https://github.com/bigcommerce/stencil-cli) diff --git a/docs/stencil-docs/installing-stencil-cli/incompatible-directives.mdx b/docs/storefront/stencil/cli/incompatible-directives.mdx similarity index 100% rename from docs/stencil-docs/installing-stencil-cli/incompatible-directives.mdx rename to docs/storefront/stencil/cli/incompatible-directives.mdx diff --git a/docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx b/docs/storefront/stencil/cli/install.mdx similarity index 97% rename from docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx rename to docs/storefront/stencil/cli/install.mdx index 907089fd0..d19ed3f2e 100644 --- a/docs/stencil-docs/installing-stencil-cli/installing-stencil.mdx +++ b/docs/storefront/stencil/cli/install.mdx @@ -1,164 +1,164 @@ -# Installing Stencil CLI - -<Callout type="warning"> -BigCommerce is currently sunsetting its node-sass fork in favor of the latest [sass/node-sass](https://github.com/sass/node-sass). To ensure that your storefront is up to date, use the latest active or maintenance node version in Stencil CLI and use the CLI command to resolve [incompatible SCSS directives](/docs/storefront/stencil/cli/unexpected-behavior#incompatible-scss-directives), which can cause issues with the styling of your storefront. Your current production site will continue to function as designed, but all future updates will require you to address any SCSS compatibility issues with Node.js 18. This upgrade is necessary to ensure the security of our platform and that you are not running out-of-date packages that may expose your projects to additional security vulnerabilities. - -</Callout> - - -Stencil CLI allows developers to locally edit and preview themes without impacting a merchant's live storefront, and its built-in [Browsersync](https://github.com/bigcommerce/browser-sync) capabilities make simultaneous testing across desktop, mobile, and tablet devices a breeze. Once work is complete, developers can push themes to BigCommerce storefronts and make them live using Stencil CLI's simple yet powerful commands. - - -This article contains detailed instructions on installing and configuring Stencil CLI, the first step towards developing Stencil themes for BigCommerce storefronts. - - - -## Installing on Mac - -To install Stencil CLI and its dependencies on Mac, open a terminal and run the following commands. Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. - - -```shell showLineNumbers copy -# For ARM based macs -arch -x86_64 /bin/zsh - -# Install Node Version Manager (nvm) -curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash - -# Install Stencil CLI supported version of Node.js -nvm install 18.15.0 - -# Switch to Stencil CLI supported version of Node.js: -nvm use 18.15.0 - -# Install Stencil CLI -npm install -g @bigcommerce/stencil-cli -``` - -## Installing on Windows -There are two methods for installing Stencil CLI and its dependencies on Windows. - - -### Method 1: Install dependencies using Chocolatey -If you prefer a streamlined installation option, use the [Chocolatey package manager](https://chocolatey.org/install) to install Stencil CLI's dependencies. To do so, [open PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/getting-started/starting-windows-powershell?view=powershell-6) as an administrator, and run the following commands: - - -```shell showLineNumbers copy -# Install Chocolatey -iex ((New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")) - -# Install git if you don't have it -choco install git - -# Install nvm windows and stencil-compatible node.js - -choco install nvm; nvm install 18.15.0; nvm use 18.15.0 - -# Install Stencil CLI -npm install -g @bigcommerce/stencil-cli -``` - -<Callout type="warning"> - #### Execution policy errors - If you receive an execution policy error while attempting to install chocolatey, refer to [Microsoft's Documentation](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6) and/or consult with your organization's system administrator to determine the appropriate course of action. -</Callout> - -<Callout type="warning"> - #### Chocolatey installation alternatives - For additional information on installing Chocolatey and alternative installation options, see [the installation page on chocolatey.org](https://chocolatey.org/install). - </Callout> - -### Method 2: Install dependencies manually - -If you're a pro at installing and configuring Python and Node.js environments on Windows, feel free to install the required dependencies using your preferred method. - -**Required Dependencies:** -* [Git](https://git-scm.com/downloads) - required to run npm install -* [Node.js 18.15.0 and npm](https://nodejs.org/en/download/releases/) - -Once they're installed and configured, use `npm` to install Stencil CLI: - -```shell copy -npm install -g @bigcommerce/stencil-cli -``` - -<Callout type="info"> - These instructions have been tested successfully on **Windows 10**. - Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. - </Callout> - -## Installing on Linux - -To install Stencil CLI and dependencies on debian-based distros, open a terminal and run the following commands: - -```shell showLineNumbers copy -# Download and install nvm if you don't have it. -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash - -# Reload .bashrc so nvm command works -source ~/.bashrc - -# Explicitly install and use supported node version -nvm install 18.15.0 - -nvm use 18.15.0 - -# Install stencil -npm install -g @bigcommerce/stencil-cli -``` - -**Depending on the distro, you may also need to install:** -* g++ -* [libsass](https://sass-lang.com/libsass) -* git - -<Callout type="info"> - * These instructions have been tested on **Ubuntu 18.04**. - * Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. - * Refer to [nvm](https://github.com/nvm-sh/nvm) for latest `nvm` install instructions. -</Callout> - -## Live previewing a theme - -Once you've installed Stencil CLI, the next step on the road to theme development is downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. For detailed instructions on doing so, see [Live Previewing a Theme](/docs/storefront/stencil/cli/development-server). Here's the gist: - - -```shell showLineNumbers copy -# move into theme dir -cd ~/path/to/theme/dir - -# install theme modules -npm install - -# initialize a new .stencil config for the theme -stencil init - -# serve a live, Browsersync enabled preview of the theme -stencil start -``` -## Troubleshooting - -### Chocolatey install error -If you receive an error installing Chocolatey, run the following command to enable scripts on your system. - -```powershell copy -Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -``` - -### Visual Studio not found error - -Stencil CLI's dependencies no longer require Visual C++ build tools to compile. - -If you receive the error "Could not find VS", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. - - -### Python npm configuration error - -Stencil CLI's dependencies no longer require Python to compile. - -If you receive "Error: Could not find any Python installation to use", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. - - -## Resources - -* [Dockerizing BigCommerce's Stencil CLI](https://medium.com/bigcommerce-developer-blog/dockerizing-bigcommerces-stencil-cli-f508ddc0c3c0) (medium.com) +# Installing Stencil CLI + +<Callout type="warning"> +BigCommerce is currently sunsetting its node-sass fork in favor of the latest [sass/node-sass](https://github.com/sass/node-sass). To ensure that your storefront is up to date, use the latest active or maintenance node version in Stencil CLI and use the CLI command to resolve [incompatible SCSS directives](/docs/storefront/stencil/cli/unexpected-behavior#incompatible-scss-directives), which can cause issues with the styling of your storefront. Your current production site will continue to function as designed, but all future updates will require you to address any SCSS compatibility issues with Node.js 18. This upgrade is necessary to ensure the security of our platform and that you are not running out-of-date packages that may expose your projects to additional security vulnerabilities. + +</Callout> + + +Stencil CLI allows developers to locally edit and preview themes without impacting a merchant's live storefront, and its built-in [Browsersync](https://github.com/bigcommerce/browser-sync) capabilities make simultaneous testing across desktop, mobile, and tablet devices a breeze. Once work is complete, developers can push themes to BigCommerce storefronts and make them live using Stencil CLI's simple yet powerful commands. + + +This article contains detailed instructions on installing and configuring Stencil CLI, the first step towards developing Stencil themes for BigCommerce storefronts. + + + +## Installing on Mac + +To install Stencil CLI and its dependencies on Mac, open a terminal and run the following commands. Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + + +```shell showLineNumbers copy +# For ARM based macs +arch -x86_64 /bin/zsh + +# Install Node Version Manager (nvm) +curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash + +# Install Stencil CLI supported version of Node.js +nvm install 18.15.0 + +# Switch to Stencil CLI supported version of Node.js: +nvm use 18.15.0 + +# Install Stencil CLI +npm install -g @bigcommerce/stencil-cli +``` + +## Installing on Windows +There are two methods for installing Stencil CLI and its dependencies on Windows. + + +### Method 1: Install dependencies using Chocolatey +If you prefer a streamlined installation option, use the [Chocolatey package manager](https://chocolatey.org/install) to install Stencil CLI's dependencies. To do so, [open PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/getting-started/starting-windows-powershell?view=powershell-6) as an administrator, and run the following commands: + + +```shell showLineNumbers copy +# Install Chocolatey +iex ((New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")) + +# Install git if you don't have it +choco install git + +# Install nvm windows and stencil-compatible node.js + +choco install nvm; nvm install 18.15.0; nvm use 18.15.0 + +# Install Stencil CLI +npm install -g @bigcommerce/stencil-cli +``` + +<Callout type="warning"> + #### Execution policy errors + If you receive an execution policy error while attempting to install chocolatey, refer to [Microsoft's Documentation](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6) and/or consult with your organization's system administrator to determine the appropriate course of action. +</Callout> + +<Callout type="warning"> + #### Chocolatey installation alternatives + For additional information on installing Chocolatey and alternative installation options, see [the installation page on chocolatey.org](https://chocolatey.org/install). + </Callout> + +### Method 2: Install dependencies manually + +If you're a pro at installing and configuring Python and Node.js environments on Windows, feel free to install the required dependencies using your preferred method. + +**Required Dependencies:** +* [Git](https://git-scm.com/downloads) - required to run npm install +* [Node.js 18.15.0 and npm](https://nodejs.org/en/download/releases/) + +Once they're installed and configured, use `npm` to install Stencil CLI: + +```shell copy +npm install -g @bigcommerce/stencil-cli +``` + +<Callout type="info"> + These instructions have been tested successfully on **Windows 10**. + Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + </Callout> + +## Installing on Linux + +To install Stencil CLI and dependencies on debian-based distros, open a terminal and run the following commands: + +```shell showLineNumbers copy +# Download and install nvm if you don't have it. +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash + +# Reload .bashrc so nvm command works +source ~/.bashrc + +# Explicitly install and use supported node version +nvm install 18.15.0 + +nvm use 18.15.0 + +# Install stencil +npm install -g @bigcommerce/stencil-cli +``` + +**Depending on the distro, you may also need to install:** +* g++ +* [libsass](https://sass-lang.com/libsass) +* git + +<Callout type="info"> + * These instructions have been tested on **Ubuntu 18.04**. + * Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. + * Refer to [nvm](https://github.com/nvm-sh/nvm) for latest `nvm` install instructions. +</Callout> + +## Live previewing a theme + +Once you've installed Stencil CLI, the next step on the road to theme development is downloading a theme to edit and previewing live changes using Stencil CLI's powerful Browsersync functionality. For detailed instructions on doing so, see [Live Previewing a Theme](/docs/storefront/stencil/cli/development-server). Here's the gist: + + +```shell showLineNumbers copy +# move into theme dir +cd ~/path/to/theme/dir + +# install theme modules +npm install + +# initialize a new .stencil config for the theme +stencil init + +# serve a live, Browsersync enabled preview of the theme +stencil start +``` +## Troubleshooting + +### Chocolatey install error +If you receive an error installing Chocolatey, run the following command to enable scripts on your system. + +```powershell copy +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned +``` + +### Visual Studio not found error + +Stencil CLI's dependencies no longer require Visual C++ build tools to compile. + +If you receive the error "Could not find VS", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. + + +### Python npm configuration error + +Stencil CLI's dependencies no longer require Python to compile. + +If you receive "Error: Could not find any Python installation to use", update to the most current version of Stencil CLI and run it using the version of Node.js indicated in this article. + + +## Resources + +* [Dockerizing BigCommerce's Stencil CLI](https://medium.com/bigcommerce-developer-blog/dockerizing-bigcommerces-stencil-cli-f508ddc0c3c0) (medium.com) diff --git a/docs/stencil-docs/installing-stencil-cli/node-sass.mdx b/docs/storefront/stencil/cli/node-sass.mdx similarity index 100% rename from docs/stencil-docs/installing-stencil-cli/node-sass.mdx rename to docs/storefront/stencil/cli/node-sass.mdx diff --git a/docs/stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx b/docs/storefront/stencil/cli/options-and-commands.mdx similarity index 100% rename from docs/stencil-docs/installing-stencil-cli/stencil-cli-options-and-commands.mdx rename to docs/storefront/stencil/cli/options-and-commands.mdx diff --git a/docs/stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx b/docs/storefront/stencil/cli/unexpected-behavior.mdx similarity index 100% rename from docs/stencil-docs/installing-stencil-cli/troubleshooting-your-setup.mdx rename to docs/storefront/stencil/cli/unexpected-behavior.mdx diff --git a/docs/stencil-docs/page-builder/page-builder-overview.mdx b/docs/storefront/stencil/content/page-builder.mdx similarity index 100% rename from docs/stencil-docs/page-builder/page-builder-overview.mdx rename to docs/storefront/stencil/content/page-builder.mdx diff --git a/docs/stencil-docs/developing-further/add-recaptcha-v2.mdx b/docs/storefront/stencil/content/recaptcha.mdx similarity index 98% rename from docs/stencil-docs/developing-further/add-recaptcha-v2.mdx rename to docs/storefront/stencil/content/recaptcha.mdx index 89f050895..ac8e2c195 100644 --- a/docs/stencil-docs/developing-further/add-recaptcha-v2.mdx +++ b/docs/storefront/stencil/content/recaptcha.mdx @@ -1,25 +1,25 @@ -# Adding reCAPTCHA V2 - - - -reCAPTCHA v1 was deprecated as of March 31, 2018. To deter spam submission through storefront forms, BigCommerce now supports Google reCAPTCHA v2 challenges, to distinguish human customers/visitors from automated bots. We recommend that all storefront themes take advantage of this upgraded bot detection. - -If you have based your theme on a theme/version that already incorporates reCAPTCHA v2, you do not need to take any further action. Compliant themes/versions currently are listed in [Updating Themes with reCAPTCHA V2](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2#updatingthemes) (Knowledge Base). - -## How to Upgrade - -To add reCAPTCHA v2 support to a theme, update script references in three template files. You can find them in the following subdirectories of the `{theme-name}/templates/` directory: - -- [pages/auth/create-account.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-ecbae6e2b7d5bbf5c950d68878e79d99) -- [components/products/modals/writeReview.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-945a5d7f1563068188ae39df568cfd43) -- [components/pages/contact-us-form.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-5351402159301e1c225752f03d9f1f8e) - -See [PR #951](https://github.com/bigcommerce/cornerstone/pull/951) in the Cornerstone GitHub Repository to see differentials for each file that needs to be modified. - -It is possible to add reCaptcha to the Login template. See the [Forms object](/docs/storefront/stencil/themes/context/object-reference/schemas#forms) for details. - -## Resources - -### Related Articles - -* [Enabling ReCAPTCHA](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) +# Adding reCAPTCHA V2 + + + +reCAPTCHA v1 was deprecated as of March 31, 2018. To deter spam submission through storefront forms, BigCommerce now supports Google reCAPTCHA v2 challenges, to distinguish human customers/visitors from automated bots. We recommend that all storefront themes take advantage of this upgraded bot detection. + +If you have based your theme on a theme/version that already incorporates reCAPTCHA v2, you do not need to take any further action. Compliant themes/versions currently are listed in [Updating Themes with reCAPTCHA V2](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2#updatingthemes) (Knowledge Base). + +## How to Upgrade + +To add reCAPTCHA v2 support to a theme, update script references in three template files. You can find them in the following subdirectories of the `{theme-name}/templates/` directory: + +- [pages/auth/create-account.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-ecbae6e2b7d5bbf5c950d68878e79d99) +- [components/products/modals/writeReview.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-945a5d7f1563068188ae39df568cfd43) +- [components/pages/contact-us-form.html](https://github.com/bigcommerce/cornerstone/pull/951/files#diff-5351402159301e1c225752f03d9f1f8e) + +See [PR #951](https://github.com/bigcommerce/cornerstone/pull/951) in the Cornerstone GitHub Repository to see differentials for each file that needs to be modified. + +It is possible to add reCaptcha to the Login template. See the [Forms object](/docs/storefront/stencil/themes/context/object-reference/schemas#forms) for details. + +## Resources + +### Related Articles + +* [Enabling ReCAPTCHA](https://support.bigcommerce.com/s/article/Updating-Themes-with-reCAPTCHA-v2) diff --git a/docs/stencil-docs/page-builder/third-party-widgets.mdx b/docs/storefront/stencil/content/widgets.mdx similarity index 100% rename from docs/stencil-docs/page-builder/third-party-widgets.mdx rename to docs/storefront/stencil/content/widgets.mdx diff --git a/docs/stencil-docs/storefront-customization/early-hints.mdx b/docs/storefront/stencil/deployment/early-hints.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/early-hints.mdx rename to docs/storefront/stencil/deployment/early-hints.mdx diff --git a/docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx b/docs/storefront/stencil/deployment/performance-optimization.mdx similarity index 97% rename from docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx rename to docs/storefront/stencil/deployment/performance-optimization.mdx index 94a33e69e..8a273aacc 100644 --- a/docs/stencil-docs/deploying-a-theme/theme-best-practices.mdx +++ b/docs/storefront/stencil/deployment/performance-optimization.mdx @@ -81,7 +81,7 @@ To improve FID: * Reduce JavaScript execution time. * Reduce the duration of your longest task. -Lighthouse does not display FID since measuring the response delay requires real user interaction. Instead, Lighthouse displays Total Blocking Time (TBT) to gauge how long a page takes to become useable. TBT is the sum of task loading time over 50ms measured between the first text or image rendering and the time it takes for a fully interactive page. Improvements to TBT will also improve your FID score. +Lighthouse does not display FID since measuring the response delay requires real user interaction. Instead, Lighthouse displays Total Blocking Time (TBT) to gauge how long a page takes to become usable. TBT is the sum of task loading time over 50ms measured between the first text or image rendering and the time it takes for a fully interactive page. Improvements to TBT will also improve your FID score. A good TBT score is 300 milliseconds or less. diff --git a/docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx b/docs/storefront/stencil/deployment/theme-images.mdx similarity index 97% rename from docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx rename to docs/storefront/stencil/deployment/theme-images.mdx index e41a47f1c..67eaac6cb 100644 --- a/docs/stencil-docs/deploying-a-theme/preparing-thumbnail-images.mdx +++ b/docs/storefront/stencil/deployment/theme-images.mdx @@ -1,101 +1,101 @@ -# Preparing Thumbnail Images - - - -## Displaying theme thumbnail images - - -A complete Stencil theme includes screenshots to display the theme on cards that appear in two locations within a non active MSF BigCommerce control panel: - - -* **Storefront** › **Themes**: Each individual card displays a composite which is an image that contains combination of screenshots of the theme's multiple variations. -* **Storefront** › **Themes Marketplace**: Each card displays one variation of your theme. The three variations of Cornerstone (Light, Warm, and Bold) are displayed across three separate cards. - -![Desktop View of My Themes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/my-themes-desktop.png "Desktop View of My Themes") - -![Desktop View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-desktop.png "Desktop View of Themes Marketplace") - -![Mobile View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-mobile.png "Mobile View of Themes Marketplace") - -## General image requirements - -All screenshots described below must meet the following specifications in order for the `stencil bundle` command to be able to process them: -* Must be saved to a supported image file type: .jpg, .jpeg, .png, or .gif. -* Must be stored in your [meta/](https://github.com/bigcommerce/cornerstone/tree/master/meta) subdirectory. -* Must be in **portrait aspect ratio**. - -## Theme-wide composite image - -The theme-wide composite image represents your theme in a non-active MSF BigCommerce control panel's **Storefront** › **Themes**, which shows merchants their currently available themes, including any custom uploaded themes. - - -This file will normally be a mosaic of screenshots from multiple variations within your theme. It must meet the following requirements, beyond the general specifications above: - -* Resolution of 600 x 760 pixels (horizontal x vertical). -* File size smaller than 2 MB. -* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `meta` object's `composed_image` key value. - -Here is an example of a compliant file type and location: - -`meta/composed.png` - -Here is how you would reference this file within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json). - -```js copy showLineNumbers -{ - // [...] - "meta": { - [...] - "composed_image": "composed.png", - // [...] -} -``` - -## Variations: desktop and mobile screenshots - -Each variation within your theme must be represented by two additional screenshots if you want that variation to appear in a non-active MSF control panel's **Storefront** › **Theme Marketplace**, which shows merchants the themes that are available for download. - -### Desktop screenshot - -The first screenshot, showing your theme on a desktop viewport, must meet the following requirements beyond the general specifications above: -* Resolution of 2048 x 2600 pixels. - -* File size smaller than 5 MB -* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `desktop_screenshot` key value. - -### Mobile screenshot - -The second screenshot, showing your theme on a mobile viewport, must meet the following requirements beyond the general specifications above: -* Resolution of 304 x 540 pixels. - -* File size smaller than 1 MB. -* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `mobile_screenshot` key value. - -Below is an example showing two files of compliant types and location. - -* `meta/desktop_bright.png` -* `meta/mobile_bright.png` - -Here is how you would reference these files within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json), for a variation named `Bright`: - -```js showLineNumbers copy -// [...] - "variations": [ - { - "name": "Bright", - "id": "bright", - "meta": { - "desktop_screenshot": "desktop_bright.png", - "mobile_screenshot": "mobile_bright.jpg", - // [...] - } - ] - -``` - -## Resources - -### Related articles -* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) -* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) -* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) +# Preparing Thumbnail Images + + + +## Displaying theme thumbnail images + + +A complete Stencil theme includes screenshots to display the theme on cards that appear in two locations within a non active MSF BigCommerce control panel: + + +* **Storefront** › **Themes**: Each individual card displays a composite which is an image that contains combination of screenshots of the theme's multiple variations. +* **Storefront** › **Themes Marketplace**: Each card displays one variation of your theme. The three variations of Cornerstone (Light, Warm, and Bold) are displayed across three separate cards. + +![Desktop View of My Themes](https://storage.googleapis.com/bigcommerce-production-dev-center/images/my-themes-desktop.png "Desktop View of My Themes") + +![Desktop View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-desktop.png "Desktop View of Themes Marketplace") + +![Mobile View of Themes Marketplace](https://storage.googleapis.com/bigcommerce-production-dev-center/images/themes-marketplace-mobile.png "Mobile View of Themes Marketplace") + +## General image requirements + +All screenshots described below must meet the following specifications in order for the `stencil bundle` command to be able to process them: +* Must be saved to a supported image file type: .jpg, .jpeg, .png, or .gif. +* Must be stored in your [meta/](https://github.com/bigcommerce/cornerstone/tree/master/meta) subdirectory. +* Must be in **portrait aspect ratio**. + +## Theme-wide composite image + +The theme-wide composite image represents your theme in a non-active MSF BigCommerce control panel's **Storefront** › **Themes**, which shows merchants their currently available themes, including any custom uploaded themes. + + +This file will normally be a mosaic of screenshots from multiple variations within your theme. It must meet the following requirements, beyond the general specifications above: + +* Resolution of 600 x 760 pixels (horizontal x vertical). +* File size smaller than 2 MB. +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `meta` object's `composed_image` key value. + +Here is an example of a compliant file type and location: + +`meta/composed.png` + +Here is how you would reference this file within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json). + +```js copy showLineNumbers +{ + // [...] + "meta": { + [...] + "composed_image": "composed.png", + // [...] +} +``` + +## Variations: desktop and mobile screenshots + +Each variation within your theme must be represented by two additional screenshots if you want that variation to appear in a non-active MSF control panel's **Storefront** › **Theme Marketplace**, which shows merchants the themes that are available for download. + +### Desktop screenshot + +The first screenshot, showing your theme on a desktop viewport, must meet the following requirements beyond the general specifications above: +* Resolution of 2048 x 2600 pixels. + +* File size smaller than 5 MB +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `desktop_screenshot` key value. + +### Mobile screenshot + +The second screenshot, showing your theme on a mobile viewport, must meet the following requirements beyond the general specifications above: +* Resolution of 304 x 540 pixels. + +* File size smaller than 1 MB. +* Arbitrary filename prefix, referenced in your [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json) file as the `variations` object's `mobile_screenshot` key value. + +Below is an example showing two files of compliant types and location. + +* `meta/desktop_bright.png` +* `meta/mobile_bright.png` + +Here is how you would reference these files within [config.json](https://github.com/bigcommerce/cornerstone/blob/master/config.json), for a variation named `Bright`: + +```js showLineNumbers copy +// [...] + "variations": [ + { + "name": "Bright", + "id": "bright", + "meta": { + "desktop_screenshot": "desktop_bright.png", + "mobile_screenshot": "mobile_bright.jpg", + // [...] + } + ] + +``` + +## Resources + +### Related articles +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) diff --git a/docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx b/docs/storefront/stencil/deployment/theme-size.mdx similarity index 98% rename from docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx rename to docs/storefront/stencil/deployment/theme-size.mdx index 15f4e1880..7a3862ddb 100644 --- a/docs/stencil-docs/deploying-a-theme/checking-a-themes-size.mdx +++ b/docs/storefront/stencil/deployment/theme-size.mdx @@ -1,95 +1,95 @@ -# Checking a Theme's Size - - - -Ideally, your theme should bundle into an archive of only a few megabytes (MB). BigCommerce imposes a hard limit of 50 MB, but most themes do not approach this limit unless they include many large static assets. If your theme does not exceed 50 MB, follow the steps outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) to process and package your theme for upload to BigCommerce. - - -If your theme exceeds the 50 MB limit, you have two options: - -* Shrink your theme with the help of WebDAV. -* Stage your theme for CDN delivery. - -## Shrinking a theme - -### Restructuring your theme - -In this section, you will first isolate static assets from your theme's local directory, then use WebDAV to cloud-host those assets, and finally reference those assets using Stencil's `{{cdn}}` Handlebars helper. For an existing theme, make a backup of your whole `theme‑name` directory before proceeding. - -Examine your theme's `assets` subdirectory and its intended contents. Check for large static assets like images, especially in `assets/img/`, and videos that are likely to cause a bundled ZIP file to exceed BigCommerce's 50 MB limit. - -Use WebDAV to upload these items to WebDAV's `remote /content/` directory. For more information on WebDAV, see [Connecting to WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). - -Throughout your theme, reference each of these assets using Stencil’s `{{cdn}}` Handlebars helper, prepending the `webdav:` option to the `assetPath` parameter. - -Prepending `webdav:` will build a URL in the remote WebDAV directory. This allows your theme's deployed topology to diverge from your local directory structure. The `{{cdn}}` helper will treat `content` as the root WebDAV directory. - -For example, this statement - - -``` -<img src="{{cdn "webdav:img/image.jpg"}}"> -``` - -will build the following URL: - -``` -<img src="https://cdn.bcapp/3dsf74g/content/img/image.jpg"> -``` - -On your local machine, move the large static assets to a location where the `stencil bundle` command will ignore them. This can be a location outside your theme's directory, or it can be the `assets/cdn/` subdirectory, which `stencil bundle` excludes from bundling. Separating these assets is necessary to exclude them from the next step. - -Run the `stencil bundle` command from inside your streamlined `theme‑name` directory. Once your resulting ZIP file is 50 MB or smaller, you are ready to upload it to BigCommerce. For more information, see [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). - -<Callout type="warning"> - - #### URL references to assets - Both in production and locally, subdirectories of your theme's `assets` directory, such as `img`,`js`, and `fonts`, are parallel to its `scss` subdirectory. Within your CSS, path references to such assets should reflect this parallel relationship, for example: `../img/test.jpg`. - </Callout> - -### WebDAV folders and Stencil themes - -If you have used WebDAV in developing BigCommerce's Blueprint generation of themes, you will see some differences when uploading Stencil themes. Depending on the type of theme that is active in the merchant's store, the directories accessible through WebDAV will change as shown in the table below. - -| Blueprint theme | Stencil theme | -| ----------- | ----------- | -| `content` | `content` | -| `product_images` | `product_images` | -| `product_downloads` | `product_downloads` | -| `import_files` | `import_files` | -| `exports` | `exports` | -| `template` | - | -| `mobile_template` | - | - -The overall difference is that the WebDAV `template` and `mobile_template` directories are **not** available for Stencil themes. These templates must reside and remain within your Stencil theme's local directory and file structure. - -## Organizing a theme - -For themes that would otherwise exceed BigCommerce's 50 MB limit on uploads, delivering your theme's large static assets using a CDN is an alternative to WebDAV. - -The advantage of this alternative is that all assets stay within your theme's directory, so your theme's local structure matches its deployed structure. The disadvantage is that the procedure outlined below requires the expense of a CDN. - -To stage your theme for CDN delivery, you would locally store your large static assets within your theme's -`assets/cdn/` subdirectory. By design, the `stencil bundle` command omits this subdirectory's contents. So those contents do not count against the 50 MB limit on the resulting ZIP file. - -As you develop your theme, reference each of these assets using Stencil's `{{cdn}}` custom Handlebars helper, for example: - -``` -<img src="{{cdn "webdav:img/image.jpg"}}"> -``` - -<Callout type="info"> - - The presumed WebDAV root directory is `content`. In this example, the `image.jpg` file had been uploaded to the WebDAV `content` directory. The presumed local directory for other CDNs is `assets`, so you can omit that path when referencing its contained files or subdirectories. - </Callout> - - -When you are ready to upload your theme to BigCommerce, follow the process outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). - -## Resources - -### Related articles -* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) -* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) -* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) -* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) (BigCommerce Knowledge Base) +# Checking a Theme's Size + + + +Ideally, your theme should bundle into an archive of only a few megabytes (MB). BigCommerce imposes a hard limit of 50 MB, but most themes do not approach this limit unless they include many large static assets. If your theme does not exceed 50 MB, follow the steps outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) to process and package your theme for upload to BigCommerce. + + +If your theme exceeds the 50 MB limit, you have two options: + +* Shrink your theme with the help of WebDAV. +* Stage your theme for CDN delivery. + +## Shrinking a theme + +### Restructuring your theme + +In this section, you will first isolate static assets from your theme's local directory, then use WebDAV to cloud-host those assets, and finally reference those assets using Stencil's `{{cdn}}` Handlebars helper. For an existing theme, make a backup of your whole `theme‑name` directory before proceeding. + +Examine your theme's `assets` subdirectory and its intended contents. Check for large static assets like images, especially in `assets/img/`, and videos that are likely to cause a bundled ZIP file to exceed BigCommerce's 50 MB limit. + +Use WebDAV to upload these items to WebDAV's `remote /content/` directory. For more information on WebDAV, see [Connecting to WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + +Throughout your theme, reference each of these assets using Stencil’s `{{cdn}}` Handlebars helper, prepending the `webdav:` option to the `assetPath` parameter. + +Prepending `webdav:` will build a URL in the remote WebDAV directory. This allows your theme's deployed topology to diverge from your local directory structure. The `{{cdn}}` helper will treat `content` as the root WebDAV directory. + +For example, this statement + + +``` +<img src="{{cdn "webdav:img/image.jpg"}}"> +``` + +will build the following URL: + +``` +<img src="https://cdn.bcapp/3dsf74g/content/img/image.jpg"> +``` + +On your local machine, move the large static assets to a location where the `stencil bundle` command will ignore them. This can be a location outside your theme's directory, or it can be the `assets/cdn/` subdirectory, which `stencil bundle` excludes from bundling. Separating these assets is necessary to exclude them from the next step. + +Run the `stencil bundle` command from inside your streamlined `theme‑name` directory. Once your resulting ZIP file is 50 MB or smaller, you are ready to upload it to BigCommerce. For more information, see [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). + +<Callout type="warning"> + + #### URL references to assets + Both in production and locally, subdirectories of your theme's `assets` directory, such as `img`,`js`, and `fonts`, are parallel to its `scss` subdirectory. Within your CSS, path references to such assets should reflect this parallel relationship, for example: `../img/test.jpg`. + </Callout> + +### WebDAV folders and Stencil themes + +If you have used WebDAV in developing BigCommerce's Blueprint generation of themes, you will see some differences when uploading Stencil themes. Depending on the type of theme that is active in the merchant's store, the directories accessible through WebDAV will change as shown in the table below. + +| Blueprint theme | Stencil theme | +| ----------- | ----------- | +| `content` | `content` | +| `product_images` | `product_images` | +| `product_downloads` | `product_downloads` | +| `import_files` | `import_files` | +| `exports` | `exports` | +| `template` | - | +| `mobile_template` | - | + +The overall difference is that the WebDAV `template` and `mobile_template` directories are **not** available for Stencil themes. These templates must reside and remain within your Stencil theme's local directory and file structure. + +## Organizing a theme + +For themes that would otherwise exceed BigCommerce's 50 MB limit on uploads, delivering your theme's large static assets using a CDN is an alternative to WebDAV. + +The advantage of this alternative is that all assets stay within your theme's directory, so your theme's local structure matches its deployed structure. The disadvantage is that the procedure outlined below requires the expense of a CDN. + +To stage your theme for CDN delivery, you would locally store your large static assets within your theme's +`assets/cdn/` subdirectory. By design, the `stencil bundle` command omits this subdirectory's contents. So those contents do not count against the 50 MB limit on the resulting ZIP file. + +As you develop your theme, reference each of these assets using Stencil's `{{cdn}}` custom Handlebars helper, for example: + +``` +<img src="{{cdn "webdav:img/image.jpg"}}"> +``` + +<Callout type="info"> + + The presumed WebDAV root directory is `content`. In this example, the `image.jpg` file had been uploaded to the WebDAV `content` directory. The presumed local directory for other CDNs is `assets`, so you can omit that path when referencing its contained files or subdirectories. + </Callout> + + +When you are ready to upload your theme to BigCommerce, follow the process outlined in [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload). + +## Resources + +### Related articles +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) +* [File Access (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx b/docs/storefront/stencil/deployment/updates-and-version-control.mdx similarity index 98% rename from docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx rename to docs/storefront/stencil/deployment/updates-and-version-control.mdx index e1e893cb3..1d8e65fa8 100644 --- a/docs/stencil-docs/developing-further/theme-updates-and-version-control.mdx +++ b/docs/storefront/stencil/deployment/updates-and-version-control.mdx @@ -1,32 +1,32 @@ -# Theme Updates and Version Control - - - -When developing BigCommerce themes, there are a few steps you can take to ensure your custom theme stays up to date with BigCommerce theme updates and version releases. - -## Version control - -A typical setup might include a base theme, with several custom themes branching from the base theme. The custom theme(s) will need to be kept up to date with any major changes while maintaining its own customizations. Version control systems such as Git can help ensure themes stay up-to-date. For example, you can place the parent theme on the master branch and keep each child theme on its own separate branch. Changes to the master theme can then be pushed to each child. - - -## Theme updates - -If you are using a Cornerstone theme as your base theme, update notifications are found in our [changelog](/release-notes). If you are using another theme, please see the theme creator for updates. - -Before updating your theme, review the following list items to ensure a successful update: - -* Create a backup of the custom theme. -* Keep a backup of `config.json`. This file contains all the configurations and many of the customizations for a theme. -* Never merge an update directly into your custom theme. -* Test any new updates before pushing the updates to production. A good way to do this is to keep a test theme that mirrors your theme in production and apply any new changes to the test theme. If there are no issues, apply your updates to production. - -## Maintaining customizations - -When creating customizations, it's important to create a new file to overwrite the original styles, as opposed to modifying the original existing file. For example, `{{{stylesheet ‘/assets/css/theme.css’}}}` is the file that has the CSS that already exists in the theme. Instead of making edits to this file, create a new `.css` file, such as `{{{stylesheet ‘/assets/css/my_custom_theme.css’}}}`. Place your new styles in this file, and reference this file in the layouts. - -Make sure to discuss with the merchant not to make any changes to the files. This can cause issues later on with updates. Having multiple editors to files could potentially cause issues later on with updates if a proper workflow is not established. - -## Resources -* [Version Control for Teams](https://medium.com/bigcommerce-developer-blog/version-control-for-teams-a186bd74ba7e?source=friends_link&sk=721c0fc073cbe5b729c1a2282377ca86) (BigCommerce Developer Blog) -* [Level Up Your Development Workflow with Continuous Delivery](https://medium.com/bigcommerce-developer-blog/how-to-level-up-your-development-workflow-with-continuous-delivery-3a6493cc1d13) (BigCommerce Developer Blog) -* [What is Version Control?](https://www.atlassian.com/git/tutorials/what-is-version-control) (Atlassian Blog) +# Theme Updates and Version Control + + + +When developing BigCommerce themes, there are a few steps you can take to ensure your custom theme stays up to date with BigCommerce theme updates and version releases. + +## Version control + +A typical setup might include a base theme, with several custom themes branching from the base theme. The custom theme(s) will need to be kept up to date with any major changes while maintaining its own customizations. Version control systems such as Git can help ensure themes stay up-to-date. For example, you can place the parent theme on the master branch and keep each child theme on its own separate branch. Changes to the master theme can then be pushed to each child. + + +## Theme updates + +If you are using a Cornerstone theme as your base theme, update notifications are found in our [changelog](/release-notes). If you are using another theme, please see the theme creator for updates. + +Before updating your theme, review the following list items to ensure a successful update: + +* Create a backup of the custom theme. +* Keep a backup of `config.json`. This file contains all the configurations and many of the customizations for a theme. +* Never merge an update directly into your custom theme. +* Test any new updates before pushing the updates to production. A good way to do this is to keep a test theme that mirrors your theme in production and apply any new changes to the test theme. If there are no issues, apply your updates to production. + +## Maintaining customizations + +When creating customizations, it's important to create a new file to overwrite the original styles, as opposed to modifying the original existing file. For example, `{{{stylesheet ‘/assets/css/theme.css’}}}` is the file that has the CSS that already exists in the theme. Instead of making edits to this file, create a new `.css` file, such as `{{{stylesheet ‘/assets/css/my_custom_theme.css’}}}`. Place your new styles in this file, and reference this file in the layouts. + +Make sure to discuss with the merchant not to make any changes to the files. This can cause issues later on with updates. Having multiple editors to files could potentially cause issues later on with updates if a proper workflow is not established. + +## Resources +* [Version Control for Teams](https://medium.com/bigcommerce-developer-blog/version-control-for-teams-a186bd74ba7e?source=friends_link&sk=721c0fc073cbe5b729c1a2282377ca86) (BigCommerce Developer Blog) +* [Level Up Your Development Workflow with Continuous Delivery](https://medium.com/bigcommerce-developer-blog/how-to-level-up-your-development-workflow-with-continuous-delivery-3a6493cc1d13) (BigCommerce Developer Blog) +* [What is Version Control?](https://www.atlassian.com/git/tutorials/what-is-version-control) (Atlassian Blog) diff --git a/docs/stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx b/docs/storefront/stencil/deployment/upload-errors.mdx similarity index 100% rename from docs/stencil-docs/deploying-a-theme/troubleshooting-theme-uploads.mdx rename to docs/storefront/stencil/deployment/upload-errors.mdx diff --git a/docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx b/docs/storefront/stencil/deployment/upload.mdx similarity index 98% rename from docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx rename to docs/storefront/stencil/deployment/upload.mdx index 74abae835..5fda69784 100644 --- a/docs/stencil-docs/deploying-a-theme/bundling-and-pushing.mdx +++ b/docs/storefront/stencil/deployment/upload.mdx @@ -1,160 +1,160 @@ -# Bundling and Pushing a Theme - - - -## Confirm dependencies - -If you have customized a theme originally downloaded from the BigCommerce Theme Marketplace: Before you package your theme, make sure your theme directory includes all the dependencies that BigCommerce requires for submission. - - -Follow the link for your scenario: - -If you downloaded a refreshed version of Stencil's default Cornerstone theme: Run `npm install` in the theme directory to install refreshed JavaScript dependencies, as outlined in [Installing Stencil](/docs/storefront/stencil/cli/install#installing_installing-stencils-js-utilities). - - -<Callout type="warning"> - -#### No automatic check for dependencies -The `stencil bundle` and `stencil push` commands do not check for the dependencies that these build systems install. So if those dependencies are missing, these commands will not immediately report errors. However, your resulting .zip file will not properly upload to BigCommerce, and will not run properly on a storefront. - </Callout> - -## Verify directory and file permissions - -If you have added any new subdirectories or files to your base theme, verify that you have: - -* Set newly added directories to permission `755` (`drwxr-xr-x`). -* Set newly added files to permission `644` (`rw-r--r--`). - -<Callout type="warning"> - -#### Writable permissions are required -Without these writable permissions, bundling your theme will fail, blocking its upload to BigCommerce. -</Callout> - -## Bundling your theme - -Once you have verified the requirements above, you are ready to process and package your theme for upload to BigCommerce. Stencil CLI provides two options for creating a zip file that contains all of your theme's essentials while excluding redundant components. The options are either only bundling your theme, or bundling and pushing your theme. These options are available depending on how you've [authorized](/docs/storefront/stencil/cli/unexpected-behavior#stencil-start-errors) your theme: - - -### Bundle only - -The `stencil bundle` command bundles your theme into a zip file which may be uploaded to a BigCommerce store. - - -The `bundle` command will notify you of its progress and completion, as well as any errors that prevent bundling. - -#### Check/Adjust zipfile's size - -Check the resulting zip file's size before you proceed. The zipped bundle should be only a few megabytes. BigCommerce imposes a hard limit of 50 MB, and any file size approaching that is problematic. If your zip file fits comfortably within the size limit above, jump directly to [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme). However, if your zip file approaches or exceeds 50 MB, you must first use one of these procedures to restructure your theme to a manageable size for upload to BigCommerce: - - -* [Shrinking Your Theme by Excluding Static Assets (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) -* [Staging a Theme for CDN Delivery](https://support.bigcommerce.com/s/article/Optimizing-Your-Images#imageop-cdn) - -### Bundle and push - -The `stencil push` command is available only for themes that you have successfully initialized using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) (with `Themes: modify scope`). This command bundles your theme and uploads it to the associated store, in one continuous process. - -For further requirements and usage details, please see the _Command-Line Upload_ in [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme) below. - -For file-size error diagnostics and workarounds, please _Check/Adjust Zipfile's Size_ above. - -### Software requirements / resolving lint errors - -* Only use the `stencil bundle` or the `stencil push` command to process and package themes for submission. These commands generate `.zip` files that match BigCommerce's expected structure. They also generate metadata required for your theme to function properly. - -* Do not create `.zip` files using general-purpose archiving software. The resulting files will trigger errors upon upload to BigCommerce. - -* Do not open a bundled theme zip file to add, delete, rename, or update files. Doing so will make your theme unusable in the production store. - - -* If bundling your theme triggers multiple lint errors related to the `bundle.js` file, then your theme is missing the `.eslintignore` file. Please retrieve this file from the [Stencil Cornerstone repo](https://github.com/bigcommerce/cornerstone/blob/master/.eslintignore), then re-run `stencil bundle` or `stencil push`. - -## Pushing your theme - -BigCommerce provides two alternatives for uploading a theme to its associated BigCommerce store. You can perform either a control panel upload, or a command line upload. These options are available depending on how you've authorized your theme: - -### Control Panel upload - -To upload your theme to a store using the BigCommerce Control Panel, first use `stencil bundle` to package your theme into a zip file. Prepare your file according to the instructions in the [Bundle only](#bundle-only) section. - -For the Control Panel's upload steps, see the [Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) article in our Knowledge Base. - -For error codes that you might encounter when uploading a theme – and corresponding workarounds, see [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). - -### Command line upload - -The `stencil push` command allows you to bundle your theme and upload it to the store, with a single terminal command. To run `stencil push`, you must first: - -Successfully initialize your theme using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) that you created with the `Themes: modify scope`. - -Install Stencil CLI version 1.12.0 or higher. - -To check your current Stencil CLI version, enter `stencil --version` or `stencil -V` on the command line. If you need to update an earlier version, reinstall Stencil CLI. - -### Pushing a theme - -To initiate bundling and pushing, enter the following on the command line: - -`stencil push` - -Stencil CLI displays the same notifications, prompts, and selection options you would receive when using the control panel's GUI. The following sections will describe the notifications and interactions you might see. - -To push a theme and activate a particular variation without being prompted, use `stencil push -a VARIATION_NAME` with the name of the variation. For example, `stencil push -a Light` will activate the "Light" variation. If you simply use `stencil push -a` without a variation name, the first variation will be applied. - -To push a theme and apply it to selected channels, use `stencil push -a -c 123 456`. To apply a theme to all available channels, use `stencil push -a -allc`. - -If you are already at your theme limit, you can automatically delete the oldest theme on your store using `stencil push -d`. You can use the combination, `stencil push -a -d`, to give the best chance of the upload working without any interaction, which is desirable for automated deployments of Stencil CLI. - -### Successful bundling - -Stencil CLI will display `ok` confirmations, or `not ok` errors, or `warnings` for individual substeps in bundling and uploading your theme. If bundling is successful, you will next see a `Processing` progress bar to track the upload. - -![bundling](https://storage.googleapis.com/bigcommerce-production-dev-center/images/bundling.png) - -### Successful upload - -Upon successful upload, you will receive the prompt, `Would you like to apply your theme to your store at <storehash>? (y/N)`. Any response except `y` or `Y` processes as "No." You can always apply the theme later through the control panel. - -### Apply which variation? - -If you chose to apply the newly uploaded theme, you will receive the prompt: "Which variation would you like to apply? (Use arrow keys)" - -![which variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/which-variation.png) - -Use your arrow keys to move the selection caret/highlight to the variation you want, and then press `Enter`. - -Stencil CLI will then confirm which variation is active on the storefront. - -![select variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/select-variation.png) - -## Theme quota warning - -If you run `stencil push` when your store's **My Themes** section has reached its maximum of 20 themes, you will receive a prompt to select at least one existing theme for deletion. - -![theme quota warning](https://storage.googleapis.com/bigcommerce-production-dev-center/images/theme-quota-warning.png) - -Custom themes – which are available for selection – will have a circle to their left. Marketplace themes and the store's active theme – all of which are protected from deletion – will be flagged `(Disabled)`. - -Use your arrow keys to move the selection caret to each theme/version that you want to select. Then press the spacebar to select it. (Filled circles will indicate your selected themes/versions.) - -If you are certain of your selections, you can press **Enter** to delete the themes. - - -<Callout type="warning"> - - #### Select carefully – no confirmation - Once you press `Enter`, the selected themes will be deleted immediately, with no further confirmation. - If you have any doubts – especially about deleting multiple themes/versions – it is safest to delete them through the control panel GUI. This GUI allows you to compare uploaded versions and to inspect their metadata. -</Callout> - -## Other bundling or upload errors - -For any other `not ok` bundling or upload errors that you receive, please refer to these debugging guidelines Theme setup and sizing diagnostics in preceding sections throughout this page, or the following article titled [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). - -## Resources - -### Related articles -* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) -* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) -* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) +# Bundling and Pushing a Theme + + + +## Confirm dependencies + +If you have customized a theme originally downloaded from the BigCommerce Theme Marketplace: Before you package your theme, make sure your theme directory includes all the dependencies that BigCommerce requires for submission. + + +Follow the link for your scenario: + +If you downloaded a refreshed version of Stencil's default Cornerstone theme: Run `npm install` in the theme directory to install refreshed JavaScript dependencies, as outlined in [Installing Stencil](/docs/storefront/stencil/cli/install#installing_installing-stencils-js-utilities). + + +<Callout type="warning"> + +#### No automatic check for dependencies +The `stencil bundle` and `stencil push` commands do not check for the dependencies that these build systems install. So if those dependencies are missing, these commands will not immediately report errors. However, your resulting .zip file will not properly upload to BigCommerce, and will not run properly on a storefront. + </Callout> + +## Verify directory and file permissions + +If you have added any new subdirectories or files to your base theme, verify that you have: + +* Set newly added directories to permission `755` (`drwxr-xr-x`). +* Set newly added files to permission `644` (`rw-r--r--`). + +<Callout type="warning"> + +#### Writable permissions are required +Without these writable permissions, bundling your theme will fail, blocking its upload to BigCommerce. +</Callout> + +## Bundling your theme + +Once you have verified the requirements above, you are ready to process and package your theme for upload to BigCommerce. Stencil CLI provides two options for creating a zip file that contains all of your theme's essentials while excluding redundant components. The options are either only bundling your theme, or bundling and pushing your theme. These options are available depending on how you've [authorized](/docs/storefront/stencil/cli/unexpected-behavior#stencil-start-errors) your theme: + + +### Bundle only + +The `stencil bundle` command bundles your theme into a zip file which may be uploaded to a BigCommerce store. + + +The `bundle` command will notify you of its progress and completion, as well as any errors that prevent bundling. + +#### Check/Adjust zipfile's size + +Check the resulting zip file's size before you proceed. The zipped bundle should be only a few megabytes. BigCommerce imposes a hard limit of 50 MB, and any file size approaching that is problematic. If your zip file fits comfortably within the size limit above, jump directly to [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme). However, if your zip file approaches or exceeds 50 MB, you must first use one of these procedures to restructure your theme to a manageable size for upload to BigCommerce: + + +* [Shrinking Your Theme by Excluding Static Assets (WebDAV)](https://support.bigcommerce.com/s/article/File-Access-WebDAV#manual) +* [Staging a Theme for CDN Delivery](https://support.bigcommerce.com/s/article/Optimizing-Your-Images#imageop-cdn) + +### Bundle and push + +The `stencil push` command is available only for themes that you have successfully initialized using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) (with `Themes: modify scope`). This command bundles your theme and uploads it to the associated store, in one continuous process. + +For further requirements and usage details, please see the _Command-Line Upload_ in [Pushing Your Theme](/docs/storefront/stencil/deployment/upload#pushing-your-theme) below. + +For file-size error diagnostics and workarounds, please _Check/Adjust Zipfile's Size_ above. + +### Software requirements / resolving lint errors + +* Only use the `stencil bundle` or the `stencil push` command to process and package themes for submission. These commands generate `.zip` files that match BigCommerce's expected structure. They also generate metadata required for your theme to function properly. + +* Do not create `.zip` files using general-purpose archiving software. The resulting files will trigger errors upon upload to BigCommerce. + +* Do not open a bundled theme zip file to add, delete, rename, or update files. Doing so will make your theme unusable in the production store. + + +* If bundling your theme triggers multiple lint errors related to the `bundle.js` file, then your theme is missing the `.eslintignore` file. Please retrieve this file from the [Stencil Cornerstone repo](https://github.com/bigcommerce/cornerstone/blob/master/.eslintignore), then re-run `stencil bundle` or `stencil push`. + +## Pushing your theme + +BigCommerce provides two alternatives for uploading a theme to its associated BigCommerce store. You can perform either a control panel upload, or a command line upload. These options are available depending on how you've authorized your theme: + +### Control Panel upload + +To upload your theme to a store using the BigCommerce Control Panel, first use `stencil bundle` to package your theme into a zip file. Prepare your file according to the instructions in the [Bundle only](#bundle-only) section. + +For the Control Panel's upload steps, see the [Uploading Custom Themes](https://support.bigcommerce.com/s/article/Stencil-Themes#download-upload) article in our Knowledge Base. + +For error codes that you might encounter when uploading a theme – and corresponding workarounds, see [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). + +### Command line upload + +The `stencil push` command allows you to bundle your theme and upload it to the store, with a single terminal command. To run `stencil push`, you must first: + +Successfully initialize your theme using a [Stencil CLI token](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) that you created with the `Themes: modify scope`. + +Install Stencil CLI version 1.12.0 or higher. + +To check your current Stencil CLI version, enter `stencil --version` or `stencil -V` on the command line. If you need to update an earlier version, reinstall Stencil CLI. + +### Pushing a theme + +To initiate bundling and pushing, enter the following on the command line: + +`stencil push` + +Stencil CLI displays the same notifications, prompts, and selection options you would receive when using the control panel's GUI. The following sections will describe the notifications and interactions you might see. + +To push a theme and activate a particular variation without being prompted, use `stencil push -a VARIATION_NAME` with the name of the variation. For example, `stencil push -a Light` will activate the "Light" variation. If you simply use `stencil push -a` without a variation name, the first variation will be applied. + +To push a theme and apply it to selected channels, use `stencil push -a -c 123 456`. To apply a theme to all available channels, use `stencil push -a -allc`. + +If you are already at your theme limit, you can automatically delete the oldest theme on your store using `stencil push -d`. You can use the combination, `stencil push -a -d`, to give the best chance of the upload working without any interaction, which is desirable for automated deployments of Stencil CLI. + +### Successful bundling + +Stencil CLI will display `ok` confirmations, or `not ok` errors, or `warnings` for individual substeps in bundling and uploading your theme. If bundling is successful, you will next see a `Processing` progress bar to track the upload. + +![bundling](https://storage.googleapis.com/bigcommerce-production-dev-center/images/bundling.png) + +### Successful upload + +Upon successful upload, you will receive the prompt, `Would you like to apply your theme to your store at <storehash>? (y/N)`. Any response except `y` or `Y` processes as "No." You can always apply the theme later through the control panel. + +### Apply which variation? + +If you chose to apply the newly uploaded theme, you will receive the prompt: "Which variation would you like to apply? (Use arrow keys)" + +![which variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/which-variation.png) + +Use your arrow keys to move the selection caret/highlight to the variation you want, and then press `Enter`. + +Stencil CLI will then confirm which variation is active on the storefront. + +![select variation](https://storage.googleapis.com/bigcommerce-production-dev-center/images/select-variation.png) + +## Theme quota warning + +If you run `stencil push` when your store's **My Themes** section has reached its maximum of 20 themes, you will receive a prompt to select at least one existing theme for deletion. + +![theme quota warning](https://storage.googleapis.com/bigcommerce-production-dev-center/images/theme-quota-warning.png) + +Custom themes – which are available for selection – will have a circle to their left. Marketplace themes and the store's active theme – all of which are protected from deletion – will be flagged `(Disabled)`. + +Use your arrow keys to move the selection caret to each theme/version that you want to select. Then press the spacebar to select it. (Filled circles will indicate your selected themes/versions.) + +If you are certain of your selections, you can press **Enter** to delete the themes. + + +<Callout type="warning"> + + #### Select carefully – no confirmation + Once you press `Enter`, the selected themes will be deleted immediately, with no further confirmation. + If you have any doubts – especially about deleting multiple themes/versions – it is safest to delete them through the control panel GUI. This GUI allows you to compare uploaded versions and to inspect their metadata. +</Callout> + +## Other bundling or upload errors + +For any other `not ok` bundling or upload errors that you receive, please refer to these debugging guidelines Theme setup and sizing diagnostics in preceding sections throughout this page, or the following article titled [Troubleshooting Theme Uploads](/docs/storefront/stencil/cli/unexpected-behavior). + +## Resources + +### Related articles +* [Naming Your Theme and Theme Variations](/docs/storefront/stencil/themes/foundations/variations) +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) diff --git a/docs/stencil-docs/developing-further/customizing-emails.mdx b/docs/storefront/stencil/draft/customizing-emails.mdx similarity index 100% rename from docs/stencil-docs/developing-further/customizing-emails.mdx rename to docs/storefront/stencil/draft/customizing-emails.mdx diff --git a/docs/stencil-docs/configure-store-design-ui/defining-ui-options.mdx b/docs/storefront/stencil/draft/defining-ui-options.mdx similarity index 100% rename from docs/stencil-docs/configure-store-design-ui/defining-ui-options.mdx rename to docs/storefront/stencil/draft/defining-ui-options.mdx diff --git a/docs/stencil-docs/javascript-and-event-hooks/dynamic-content-rendering.mdx b/docs/storefront/stencil/draft/dynamic-content-rendering.mdx similarity index 100% rename from docs/stencil-docs/javascript-and-event-hooks/dynamic-content-rendering.mdx rename to docs/storefront/stencil/draft/dynamic-content-rendering.mdx diff --git a/docs/stencil-docs/reference-docs/common-objects.mdx b/docs/storefront/stencil/draft/reference-docs/common-objects.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/common-objects.mdx rename to docs/storefront/stencil/draft/reference-docs/common-objects.mdx diff --git a/docs/stencil-docs/reference-docs/global-objects-and-properties.mdx b/docs/storefront/stencil/draft/reference-docs/global-objects-and-properties.mdx similarity index 98% rename from docs/stencil-docs/reference-docs/global-objects-and-properties.mdx rename to docs/storefront/stencil/draft/reference-docs/global-objects-and-properties.mdx index 1ca6e50b1..844e9b8e1 100644 --- a/docs/stencil-docs/reference-docs/global-objects-and-properties.mdx +++ b/docs/storefront/stencil/draft/reference-docs/global-objects-and-properties.mdx @@ -1,702 +1,702 @@ ---- -title: Global Objects and Properties -keywords: stencil, currency, currencies, sort, ---- - -# Global Objects and Properties - -Global objects and properties are common components shared across the entire BigCommerce storefront. - -<Callout type="info"> - #### Debugging Your Theme - The Stencil framework provides built-in debugging tools to aid in your custom front-end development. When you want to see what data is available on the page you are working on, you can simply add the debug query string to your store’s localhost URL. For example: - `http://localhost:3000/product/this-is-a-sample-product?debug=context` will return a list of all the objects available on the page, in JSON syntax. - If you want to view the available JSON objects and rendered page at the same time, simply change the debug value to "bar": `http://localhost:3000/product/this-is-a-sample-product?debug=bar` -</Callout> - -## Banner - -**Description:** Elements of marketing banners at page’s top and/or bottom - -**Handlebars Expressions:** `{{banner}}`, `{{{banner}}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `banners` | Blocks of static HTML content to define banners. | -| `top` | Array of HTML content/strings, for custom top-banner content; banners are populated from the BigCommerce control panel. | -| `bottom` | Array of HTML content/strings, for custom bottom-banner content; banners are populated from the BigCommerce control panel. | - -<Callout type="warning"> - #### Handlebars Formatting Exception - Where a banner contains HTML, the banner helper must be placed in triple braces, as in this example: `{{{banner}}}`. (Double braces would escape the HTML.) -</Callout> - -## Breadcrumbs - -**Description:** Defines a page's breadcrumbs – available on virtually all pages that have a breadcrumb trail. - -**Handlebars Expression:** `{{breadcrumbs}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `name` | Displayed name of this breadcrumb element. | -| `url` | URL of this breadcrumb element. | - -## Carousel - -**Description:** A list of images, text, and style assets for a storefront’s image slide show. - -**Handlebars Expression:** `{{carousel}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `swap_frequency` | Indicates how often (in seconds) the slides will change; the value must be between 1 and 90,000 seconds. | -| `slides` | Object containing properties for each slide in the slideshow. | -| `image` | Path to the image file used on this slide. | -| `alt_text` | Alt text for the image. | -| `url` | URL to which the image will link. | -| `heading` | Heading message defined by the merchant. | -| `heading_color` | Color of the heading text. | -| `text` | Subheading defined by the merchant. | -| `text_color` | Color of the subheading text. | -| `button_text` | Text displayed on a call-to-action button defined by the merchant. | -| `button_text_color` | Color of the button. | - -## Cart - -**Description:** Returns the ID of the cart if one exists. To return more cart information use the [Storefront Cart API](/docs/rest-storefront/carts). - -**Handlebars Expression:** `{{cart_id}}` - -**Object Properties:** - -|Property|Description| -|:-- |:-- | -| `cart_id`| ID of the shopper's cart. String | - -## Currency Selector - -**Description:** A list of all supported currencies, and the currency that is actively in use in the storefront. - -**Handlebars Expression:** `{{currency_selector}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `active_currency_id` | ID of the currency actively in use in the storefront. | -| `active_currency_flag` | Country flag used to represent the active currency. | -| `active_currency_name` | Name of the active currency. | -| `active_currency_code` | Code for the active currency. | -| `currencies` | List of all the currencies supported for this storefront. | -| `is_active` | Boolean that indicates whether this currency is active for use in the storefront. | -| `switch_url` | The URL to invoke a switch to this currency. | -| `id` | ID of the currency. | -| `name` | Name of the currency. | -| `flag` | Country flag used to visually represent the currency. | - - - ## Categories - - **Description:** A array of category objects filled with all categories shown in the current page context; default sorting is by category ID, from lowest to highest. - -**Handlebars Expression:** `{{categories}}` - -```handlebars filename="Example: Categories usage" showLineNumbers -<!-- renders a UL of categories for the current page context --> -<ul class="people_list"> - {{#each categories}} - <li>{{this.name}}</li> - {{/each}} -</ul> -``` - -**Object Properties:** - -The table below displays properties for the individual category objects within the array. - -| Property | Description | -|:----|:----| -| `id` | ID of the top-level category listed. | -| `image` | Path to the image file used on this slide. | -| `alt` | The image alt name. Defaults to category name. | -| `data` | Public category image url. | -| `name` | Name of the top-level category. | -| `description` | Description of the top-level category (optional – when requested in front matter). | -| `url` | URL to the category page. | -| `count` | Number of products in this category. | -| `children` | List of child categories for this top-level category. | -| `id` | ID of the child category. | -| `name` | Name of the child category. | -| `description` | Description of the child category (optional – when requested in front matter). | -| `url` | URL of the child category. | -| `is_active` | Boolean that indicates which category is your “breadcrumb” category on an item's product display page (PDP). For example, an emerald necklace may be in the _Jewelry_ and _Accessories_ categories. If you navigated to the product from the _Jewelry_ category, `is_active: true` will be present on the _Jewelry_ object. | -| `count` | Number of products in this child category. | -| `image` | Path to the image file used on this slide. | -| `alt` | The image alt name. Defaults to category name. | -| `data` | Public category image URL. | - -## Faceted Search - -**Description:** Faceted-search object for searching globally, by category, or by brand. - -**Handlebars Expression:** `{{faceted_search}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `facets` | List of all search facets available. | -| `**selected**` | Container for the selected search facets (selected facets contain properties below). | -| `remove_all_url` | URL to remove all selected search restrictions. | -| `items` | Currently enabled search facets. | - -## Featured Products - -**Description:** Renders a list of all the featured products for the BigCommerce storefront. - -**Handlebars Expression:** `{{products.featured}}` - -**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). - -**Usage Example:** - -The code example below displays the global `{{products.featured}}` object on the `cornerstone/templates/pages/home.html` page template from [Stencil's base Cornerstone theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L5) (GitHub). - -`{{products.featured}}` returns 10 products by default. - -First, you must declare the object using Front Matter. To declare the object, the following front matter must be placed at the top of the template HTML page. This following declaration also limits the number of featured products to be displayed: - -```yml filename="Example: Frontmatter declaration" showLineNumbers -products: - [...] - featured: - limit: {{theme_settings.homepage_featured_products_count}} //limits the number of featured products to be displayed. -``` - -The `homepage_featured_products_count` limit is one of two relevant variables defined in [Cornerstone's `config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L45) (GitHub). - -```json filename="homepage_featured_products_count" showLineNumbers -"settings": { - // ... - "homepage_featured_products_count": 8, - // ... - "homepage_featured_products_column_count": 4, - // ... -} -``` - -In the body of [Cornerstone's `home.html` template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L27) (GitHub), the below Handlebars conditional statement is responsible for displaying the `{{products.featured}}` object. This is the object that we declared above using front matter. - -```handlebars filename="home.html" showLineNumbers -{{#if products.featured}} - {{> components/products/featured products=products.featured columns=theme_settings.homepage_featured_products_column_count}} -{{/if}} -``` - -This above statement formats the _Featured Products_ display according to the `homepage_featured_products_column_count` variable, which is the second relevant variable defined in [Cornerstone's `config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L53) (GitHub). - -## Footer - -**Description:** The footer content for each storefront page - -**Handlebars Expression:** `{{footer}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `sitemap_url` | The URL to the sitemap, based on store’s SEO setting. | -| `scripts` | Scripts to be loaded after the HTML has loaded; includes performance metrics. | - -## HTML Head - -**Description:** Data to be included in the HTML `<head>` element<br /> - -**Handlebars Expression:**`{{head}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `character_set` | The character set to specify. | -| `meta_tags` | Meta tags to improve store SEO. | -| `title` | Current page’s title. | -| `stylesheets` | CSS files to be included. | -| `scripts` | Scripts to be loaded in the <head> tag. | -| `favicon` | The store’s favicon (Favorite icon). | -| `rsslinks` | RSS feeds to improve SEO. | - -## Is_Ajax - -**Description:** Boolean; returns `true` if the current executing request is an Ajax request - -**Handlebars Expression:** `{{is_ajax}}` - -No properties available for this object. - -## New Products - -**Description:** A list of new products for the BigCommerce storefront - -**Handlebars Expression:**`{{products.new}}` - -**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). - -**Usage Example:** - -To access the global `{{products.new}}` object on your page, you must first use front matter to declare the object at the top of your page template. - -`{{products.new}}` returns 10 products by default. - -The code example below declares the global `{{products.new}}` object on the `cornerstone/templates/pages/home.html` page template from [Stencil's base Cornerstone Theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L3) (GitHub). - -```yml filename="Example: Frontmatter declaration" showLineNumbers -products: - new: - limit: {{theme_settings.homepage_new_products_count}} -``` - -The `homepage_featured_products_count` limit is one of two relevant variables defined in Cornerstone's `config.json` file (GitHub). - -```json filename="config.json" showLineNumbers -"settings": { - "homepage_new_products_count": 5, - // ... - "homepage_new_products_column_count": 4, - // ... -} -``` - -In the body of [Cornerstone's home.html template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L36) (GitHub), the below Handlebars conditional statement is responsible for displaying the `{{products.featured}}` object. This is the object that we declared above using front matter. - -```handlebars filename="home.html" showLineNumbers -{{#if products.new}} - {{> components/products/new products=products.new columns=theme_settings.homepage_new_products_column_count}} -{{/if}} -``` - -This above statement formats the _New Products_ display according to the `homepage_new_products_column_count` variable, which is the second relevant variable defined in [Cornerstone's config.json file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L46) (GitHub - -## Page Content - -**Description:** Defines elements of merchant’s store page - -**Handlebars Expression:** `{{page}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `title` | Page title, to be used as the HTML `title` tag. | -| `description` | Description for the page, to be used as the HTML `meta > description` tag. | -| `content` | HTML content of the page. | -| `sub_pages` | Array of child pages. | -| `title` | Title of this child page. | -| `url` | URL of this child page. | - -## Pages - -**Description:** A list of all web content pages for the BigCommerce storefront - -**Handlebars Expression:** `{{pages}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `name` | Name of the page. | -| `url` | URL of the page. | -| `children` | List of child pages for this page. | -| `name` | Name of the child page. | -| `url` | URL of the child page. | - -## Page Type Property - -**Description:** A string representing the type of page currently displayed. <br /> - -**Handlebars Expression:** `{{page_type}}` - -**Values:** The four most-commonly-used values for `{{page_type}}` are: - -* default (for a home page) -* product (for a product page) -* category (for a category page) -* page (for a Web [static] page) - -All possible values for `{{page_type}}` are: - -| account | shippingaddressform | account_new_return | -|:----|:----|:----| -| account_addressbook | account_downloaditem | account_inbox | -| editaccount | account_orderstatus | account_orders | -| invoice_print | account_order | account_recentitems | -| account_saved_return | account_returns | wishlists | -| add-wishlist | wishlist | createaccount_thanks | -| createaccount | forgotpassword | login | -| getnewpassword | blog | blog_post | -| brand | brands | cart | -| category | compare | 403 | -| 404 | error | giftcertificates_balance | -| giftcertificates | giftcertificates_redeem | default | -| page | page_contact_form | product | -| rss | search | sitemap | -| newsletter_subscribe | unsubscribe | hibernation | -| maintenance | - -## Pagination - -**Description:** Defines pagination of storefront pages - -**Handlebars Expression:** `{{pagination}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `next` | Link to next page, if any. | -| `previous` | Link to previous page, if any. | -| `sort` | Field to sort by. | -| `current` | Number representing which page (in the current collection) the customer is viewing. | -| `total` | Total number of results, across all pages. | -| `links` | Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number. | -| `url` | URL to this page of results. | -| `number` | The page number of this link, based on an index starting at 1. | - -## Search - -**Description:** Defines search parameters for the merchant’s site - -**Handlebars Expression:** `{{forms.search}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `query` | Active search query, if available. | -| `section` | Active search-results section: either content or product. | -| `content_url` | URL to the content section. | -| `product_url` | URL to the product section. | -| `name` | Brand name. | -| `suggested_query` | An alternative query – related to the current query – that can be offered to substitute for misspelled entries. | -| `has_suggestions` | Boolean – true if there is at least one of brand results, category results, or a (non-null) suggested_query. | -| `brand_results` | Array of brands that match the search query; default sorting is by brand id, from lowest to highest. | -| `url` | URL of the brand. | -| `name` | Displayed name for the brand. | -| `category_results` | An array of category paths matching the search query; used to populate category suggestions. | -| `url` | URL of the category. | -| `name` | Displayed name for the category. | -| `values` | Values of the submitted search form. | -| `brand` | Any brand ID that the customer has selected from drop-down list. | -| `price_from` | Any minimum price the customer has specified. | -| `price_to` | Any maximum price the customer has specified. | -| `featured_products` | Whether customer has chosen to view featured products: null = no preference; 1 = only featured products; 2 = only non-featured products. | -| `free_shipping` | Value indicating customer’s preference for free shipping within search results: null = no preference; 1 = free shipping only; 2 = paid shipping only. | -| `result_count` | Combined number of returned results for product and content search. | -| `category_options` | Array of options to present to customer as search-by-category fields. | -| `id` | Category ID. | -| `name` | Displayed name of the category. | -| `state` | If category contains children, and customer selects a child category: Whether that category’s display will default to closed (collapsed) or opened (expanded). | -| `children` | Array of objects representing a child category; recursively replicates the structure of its parent. | -| `content_results` | Search results across blog posts and storefront pages (not products or categories). | -| `title` | Title of the result (title embedded in blog post or page). | -| `content` | Summary of text from the blog post or page (first 200 characters). | -| `url` | URL to the result. | -| `type` | Either post (for blog posts) or page (for storefront pages). | -| `product_results` | Results of customer’s last search by product (each result contains the below properties). | -| `products` | List of search results for a product; points to [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). | -| `show_compare` | Boolean corresponding to merchant’s control-panel selection whether or not to enable product comparisons. | -| `faceted_search_enabled` | Boolean that defines whether product-filtering search is enabled for the store. | -| `facets` | All available search filters. | -| `pagination` | References pagination model. | -| `selected` | Currently selected filters. | - -## Settings - -**Description:** Common settings shared across every BigCommerce storefront - -**Handlebars Expression:** `{{settings}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `account_creation_enabled` | Site-wide boolean value that indicates whether to allow customers to create accounts. | -| `show_product_rating` | Site-wide boolean value that indicates whether to display product ratings (in numeric or star format) to visitors. | -| `show_product_reviews` | Site-wide boolean value that indicates whether to display full-text product reviews to visitors. | -| `show_newsletter_box` | Site-wide boolean value that indicates whether to display a mailing-list invite to visitors. | -| `gift_certificates_enabled` | Site-wide boolean value that indicates whether to enable the gift certificate system for this store. | -| `blog_enabled` | Site-wide boolean value that indicates whether the blog is visible for this store. | -| `data_tag_enabled` | Site-wide boolean that indicates whether GAEE is enabled in a theme. For `{{settings.data_tag_enabled}}` to be true, the enhanced_ecommerce key must be present in config.json and a GAEE experiment must be enabled along with GA property value set in Analytics > GA in an active MSF-enabled BigCommerce control panel. | -| `show_wishlist` | Site-wide boolean value that indicates whether to allow customers to create wishlists. | -| `base_url` | The normal shop URL. | -| `client_ip_address` | IP address of the customer browsing the store. | -| `country_code` |The country code corresponding to the IP.| -| `request` | The object that contains details about the HTTP request. | -| `referer`| The refer of the request. | -| `host` | The hostname of the request.| -| `origin` |The origin of the request. | -| `user_agent` | The user agent string of the request.| -| `is_crawler`| Renders "true" if user angent is known crawler; "false" otherwise. | -| `absolute_path` |The absolute URL requested. **Never** use request.path in the actual body of the page<sup>1</sup>. | -| `locale` |The browser's locale. Allows for varying experience based on shopper locale. | -| `secure_base_url` | The SSL-enabled, secure, shop URL. | -| `address` | Store’s complete physical address, as entered by merchant in the [Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings).| -| `store_name` | Name of the BigCommerce store. | -| `store_logo` | The store’s logo. | -| `title` | Title for the logo – the text configured in the control panel under **Storefront > Logo**. | -| `image` | Optional image file, as a Stencil image object. To access the store_logo use: `{{settings.store_logo.image.data}}` and `{{settings.store_logo.image.alt}}` to access the alt tag. These are pulled from the Stencil image object. | -| `privacy_cookie` | If enabled, a string containing merchant-customizable text for (European Union–required) cookie-setting notification; if disabled, a boolean with a value of false. | -| `urls` | Global URLs that the template can access – for example, the template could link to the cart page using `{{urls.cart}}`. | -| `home` | Store’s home page. | -| `account` | Collection of (customer and storefront) account-related URLs:| -| `index` | Account index page `/account.php`. | -| `orders` | Collection of orders-related URLs: | -| `all` | List of all orders `/account.php?action=order_status`. | -| `completed`| URL to view completed orders `/account.php?action=view_orders`. | -| `save_new_return` | URL to submit a New Return form `/account.php?action=save_new_return`. | -| `update_action` | URL to submit an Edit Account form `/account.php?action=update_account`. | -| `returns` | List of returns `/account.php?action=view_returns`. | -| `addresses` | List of addresses; default sorting is by address id, from lowest to highest `/account.php?action=address_book`. | -| `inbox` | List of messages in customer’s inbox `/account.php?action=inbox`. | -| `send_message` | URL to submit a message to the merchant `/account.php?action=send_message`. | -| `add_address` | Link to add shipping address form `/account.php?action=add_shipping_address`. | -| `wishlists` | Collection of wishlist-related URLs: | -| `add` | URL to the Add Wishlist form `/wishlist.php?action=addwishlist`. | -| `edit` | URL to the Edit Wishlist form `/wishlist.php?action=editwishlist`. | -| `delete` | URL to delete a wishlist `/wishlist.php?action=deletewishlist`. | -| `all` | URL to view all wishlists `/wishlist.php`. | -| `details` | URL to the Edit Account form `/account.php?action=account_details`. | -| `recent_items` | URL to a list of recently viewed items `/account.php?action=recent_items`.| -| `brands` | URL to view all brands; default sorting is by brand id, from lowest to highest. | -| `gift_certificate` | Collection of gift-certificate–related URLs: | -| `purchase` | URL to a form for purchasing a gift certificate `/giftcertificates.php`. | -| `redeem` | URL to view redemption information `/giftcertificates.php?action=redeem`. | -| `balance` | URL to check the balance of a gift certificate `/giftcertificates.php?action=balance`. | -| `auth` | Collection of authorization-related URLs: | -| `login` | URL to the login form `/login.php`. | -| `check_login` | URL to which to submit the login form `/login.php?action=check_login`. | -| `create_account` | URL to the Create Account form page `/login.php?action=create_account`. | -| `save_new_account` | URL to which to submit the Create Account form `/login.php?action=save_new_account`. | -| `forgot_password` | URL to the Forgot Password form `/login.php?action=reset_password`. | -| `send_password_email` | Submission URL for the Forgot Password form `/login.php?action=send_password_email`. | -| `save_new_password` | Submission URL for saving a new password `/login.php?action=save_new_password`. | -| `logout` | URL for customer to log out of their account `/login.php?action=logout`. | -| `product` | Collection of product-related URLs: | -| `post_review` | URL to submit a Write Review form `/postreview.php`. | -| `cart` | URL to the cart page `/cart.php`. | -| `checkout` | Collection of checkout related URLs: | -| `single_address` | URL for the customer to check out with a single shipping address `/checkout.php`.| -| `multiple_address` | URL for the customer to check out with multiple shipping addresses `/checkout.php?action=multiple`. | -| `rss` | Collection of RSS-related URLs: | -| `products` | Collection of product-feed–related URLs: | -| `new` | RSS feed of new products `/rss.php?type=rss`. | -| `new_atom` | RSS feed of new products, in Atom format `/rss.php?type=atom`. | -| `popular` | RSS feed of popular products `/rss.php?action=popularproducts&type=rss`. | -| `popular_atom` | RSS feed of popular products, in Atom format `/rss.php?action=popularproducts&type=atom`. | -| `featured` | RSS feed of featured products `/rss.php?action=featuredproducts&type=rss';` .| -| `featured_atom` | RSS feed of featured products, in Atom format `/rss.php?action=featuredproducts&type=atom`. | -| `search` | RSS feed of products matching the active search query. | -| `search_atom` | RSS feed of products matching the active search query, in Atom format. | -| `blog` | RSS feed of recent blog posts `/rss.php?action=newblogs&type=rss`. | -| `blog_atom` | RSS feed of recent blog posts, in Atom format `/rss.php?action=newblogs&type=atom`. | -| `contact_us_submit` | URL to submit the Contact Us form `/pages.php?action=sendContactForm`.| -| `search` | URL to submit a search request `/search.php`. | -| `compare` | A string containing the URL to the products comparison page `/compare`. | -| `sitemap` | URL to the sitemap `/sitemap.php`. | -| `subscribe` | Collection of subscription-related URLs. | -| `action` | URL to which the newsletter subscription will be submitted `/subscribe.php`. | -| `money` | List of child items that define the store’s default currency formatting. | -| `currency_token` | Symbol for the currency. | -| `currency_location` | Whether currency symbol appears at left or right of the quantity. | -| `decimal_token` | Symbol for decimal separator. | -| `decimal_places` | Number of decimal places to display. | -| `thousands_token` | Symbol for thousands separator. | -| `returns_enabled` | Boolean that indicates whether the control-panel setting for the returns system is enabled. | -| `tax_label` | Defines the Tax Label (VAT, Sales Tax, etc.) that a merchant can set in an active MSF-enabled control panel’s **Settings > Tax** page for display to customers. | -| `add_this` | Object that defines links for the AddThis social sharing component. | -| `buttons` | Array of buttons to display for AddThis social sharing `{{#each settings.add_this.buttons}}{{service}}{{/each}}` `{{#each settings.add_this.buttons}}{{annotations}}{{/each}}`. | -| `service` | String containing the name of this button's social-media service (facebook, email, print, twitter, linkedin, google, etc.). | -| `annotation` | String containing HTML attributes associated with this button. | -| `maintenance` | Object that manages information about the store when in maintenance (offline) mode. | -| `header` | If store is in maintenance mode, string containing header text for the "Down for Maintenance" window displayed to visitors; otherwise, null. | -| `message` | If store is in maintenance mode, string containing merchant-customizable body text (and optionally, HTML) for the "Down for Maintenance" window displayed to visitors; otherwise, null. | -| `notice` | If store is in maintenance mode, one of three strings identifying the store's status, and generating a corresponding text notice to merchants about how to proceed: AdminPrelaunchNotice for preview stores, AdminMaintenanceNotice for active stores taken down for maintenance, or AdminHibernationModeNotice for deactivated stores; otherwise, null. | -| `phone_number` | The contact phone number for the store located in the [stores profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings). | -| `rss_item_limit` | An integer that sets a limit on the number of RSS items to display. | -| `password_requirements` | Collection of properties representing BigCommerce requirements for customer-account passwords: | -| `alpha` | Regular expression representing required/acceptable alphabetic characters. | -| `numeric` | Regular expression representing required/acceptable numeric characters. | -| `minlength` | Integer representing minimum acceptable password length. | -| `error` | String that passes a standard error message for noncompliant passwords. | -| `measurements` | Collection of units-of-measure definitions, to be used when displaying product details: | -| `length` | Units of measure for product length. | -| `weight` | Units of measure for product weight. | -| `Time and date settings` | The four settings below are configured in an active MSF-enabled control panel under **Settings > General > Date & Timezone**. Date formats follow php conventions. | -| `store_time_zone` | Store's time zone, as selected in the control panel's Your Timezone drop-down list. | -| `store_dst_correction` | Whether or not this time zone observes Daylight Saving Time (boolean), as set by the control panel's Enable DST Correction check box. | -| `display_date_format` | Brief display format/pattern for dates, as configured in the control panel's Display Date Format field. | -| `extended_display_date_format` | Extended display format/pattern for dates, as configured in the control panel's Extended Display Date Format field. | -| `show_payment_methods` | A boolean value. If true available payment methods on a store will be shown. If false they are hidden. | -| `as payments_url`| Exposes the BigCommerce payments URL. `https://payments.bigcommerce.com`.| -| `secure_host` | Returns the SSL url for a store. Example: `https://www.bigcommerce.com`. | -| `store_hash` | Returns the store hash as a string. | -| `is_eu_ip_address`| A boolean value. Return true if the shoppers ip address is in the EU. | -| `show_newsletter_box` | Returns `1` if customers are allowed to subscribe to the [store newsletter](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter). Returns `0` if customers are not able to subscribe. | -| `show_newsletter_summary` | Returns a `1` if the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter) is shown. Returns `0` if it is now shown. If `show_newsletter_box` is `0` then `show_newsletter_summary` will also be `0`. | -| `newsletter_summary` | Returns the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter). | -| `amp_analytics_id` | Returns Google AMP analytics ID. | -| `bulk_discount_enabled` | Boolean that return `true` if bulk discount is enabled on products. | - - -## Sitemap - -**Description:** A list of all sitemap properties for this BigCommerce storefront: pages, categories, and brands. - -**Handlebars Expression:** `{{sitemap}}` - -**Object Properties:** - -| Property | Description | -|:----|:----| -| `subsection_url` | URL to subsection content (pages, categories, brands) of the sitemap. | -| `label` | Subsection title (pages, categories, brands.) | -| `body` | List of all sitemap subsections. | -| `url` | URL to the page, category, or brand. | -| `label` | Label of the page, category, or brand. | -| `children` | Nested list of children within pages or categories; will be null for brands. | -| `url` | URL to the child page or category. | -| `label` | Label for the child page or category. | - -## Social Links - -**Description:** Array of all social-media site links for the storefront.<br /> - -**Handlebars Expression:** `{{social_media}}` - -**Object Properties:**<br /><br /> - -| Property | Description | -|:----|:----| -| `name` | Internal name of this social-media platform (e.g., "googleplus"). | -| `url` | URL to point to, set by merchant in control panel (https://www.facebook.com/BigCommerce, etc.). | -| `position` | Display sort order for this platform within the social-media list. | -| `display_name` | Displayed/formatted name of this social-media platform (e.g., "Google+"). | - -## Template Property - -**Description:** A string containing the name of the root template currently being rendered in the page context. <br /> - -**Handlebars Expression:** `{{template}}` - -**Values:** Values will reflect each theme's specific directory structure. Possible values include: - -* `pages/home` -* `pages/brand` (for brand pages) -* `pages/brands` -* `pages/cart` -* `pages/category` (for category pages) -* `pages/contact-us` -* `pages/page` (for Web [static] pages) -* `pages/product` (for product pages) -* `pages/errors/404` -* `pages/auth/login` -* `pages/custom/product/<some_page_name>` (for a custom product page) -(etc.) - -## Top Sellers - -**Description:** Object to display a sidebar of top-selling products.<br /> - -**Handlebars Expression:** `{{products.top_sellers}}` - -**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). - -**Usage Example:** - -`{{products.top_sellers}}` returns 10 products by default. - -To access the global `{{products.top_sellers}}` object on your page, you must first use [front matter](/stencil-docs/front-matter/front-matter-attributes-reference) to declare the object at the top of your page template. For example, you would place this front-matter declaration at the top of your template file: - -```yml filename="Template frontmatter" showLineNumbers -products: - top_sellers: -``` - -## Urls - -**Description:** Object containing a collection of storefront pages and their sub-pages<br /> - -**Handlebars Expression:** `{{urls}}` - -**Object Properties:** - -| Property | Description | -| :--- | :--- | -| `urls` | Global URLs that the template can access. For example, the template could link to the cart page using `{{urls.cart}}`. | -| `home` | Store's home page. | -| `account` | Collection of (customer and storefront) account-related URLs:| -| `index` | Account index page `/account.php`. | -| `orders` | Collection of orders-related URLs: | -| `all` | List of all orders. `/account.php?action=order_status`. | -| `completed` | URL to view completed orders. `/account.php?action=view_orders`. | -| `save_new_return` | URL to submit a New Return form. `/account.php?action=save_new_return`. | -| `update_action` | URL to submit an Edit Account form. `/account.php?action=update_account`. | -| `returns` | List of returns `/account.php?action=view_returns`. | -| `addresses` | List of addresses; default sorting is by address id, from lowest to highest `/account.php?action=address_book`. | -| `inbox` | List of messages in customer’s inbox `/account.php?action=inbox`. | -| `send_message` | URL to submit a message to the merchant `/account.php?action=send_message`. | -| `add_address` | Link to add shipping address form `/account.php?action=add_shipping_address`. | -| `wishlists` | Collection of wishlist-related URLs: | -| `add` | URL to the Add Wishlist form `/wishlist.php?action=addwishlist`. | -| `edit` | URL to the Edit Wishlist form `/wishlist.php?action=editwishlist`. | -| `delete` | URL to delete a wishlist `/wishlist.php?action=deletewishlist`. | -| `all` | URL to view all wishlists `/wishlist.php`. | -| `details` | URL to the Edit Account form `/account.php?action=account_details`. | -| `recent_items` | URL to a list of recently viewed items `/account.php?action=recent_items`. | -| `payment_methods` | Collection of payment methods available on a store, visible when [stored payment methods](https://support.bigcommerce.com/s/article/Enabling-Stored-Payment-Methods?language=en_US) are enabled: | -| `all` | URL to a form for payment methods `/account.php?action=payment_methods`. | -| `brands` | URL to view all brands; default sorting is by brand ID, from lowest to highest. | -| `gift_certificate` | Collection of gift-certificate–related URLs: | -| `purchase` | URL to a form for purchasing a gift certificate `/giftcertificates.php`. | -| `redeem` | URL to view redemption information `/giftcertificates.php?action=redeem`. | -| `balance` | URL to check the balance of a gift certificate `/giftcertificates.php?action=balance`. | -| `auth` | Collection of authorization-related URLs: | -| `login` | URL to the login form `/login.php`. | -| `check_login` | URL to which to submit the login form `/login.php?action=check_login`. | -| `create_account` | URL to the Create Account form page `/login.php?action=create_account`. | -| `save_new_account` | URL to which to submit the Create Account form `/login.php?action=save_new_account`. | -| `forgot_password` | URL to the Forgot Password form `/login.php?action=reset_password`. | -| `send_password_email` | Submission URL for the Forgot Password form `/login.php?action=send_password_email`. | -| `save_new_password` | Submission URL for saving a new password `/login.php?action=save_new_password`. | -| `logout` | URL for customer to log out of their account `/login.php?action=logout`. | -| `product` | Collection of product-related URLs: | -| `post_review` | URL to submit a Write Review form `/postreview.php`. | -| `cart` | URL to the cart page `/cart.php`. | -| `checkout` | Collection of checkout related URLs: | -| `single_address` | URL for the customer to check out with a single shipping address `/checkout.php`. | -| `multiple_address` | URL for the customer to check out with multiple shipping addresses `/checkout.php?action=multiple`. | -| `rss` | Collection of RSS-related URLs: | -| `products` | Collection of product-feed–related URLs: | -| `new`| RSS feed of new products `/rss.php?type=rss`. | -| `new_atom` | RSS feed of new products, in Atom format `/rss.php?type=atom`. | -| `popular` | RSS feed of popular products `/rss.php?action=popularproducts&type=rss`. | -| `popular_atom` | RSS feed of popular products, in Atom format `/rss.php?action=popularproducts&type=atom`. | -| `featured` | RSS feed of featured products `/rss.php?action=featuredproducts&type=rss';`. | -| `featured_atom` | RSS feed of featured products, in Atom format `/rss.php?action=featuredproducts&type=atom`. | -| `search` | RSS feed of products matching the active search query. | -| `search_atom` | RSS feed of products matching the active search query, in Atom format. | -| `blog` | RSS feed of recent blog posts `/rss.php?action=newblogs&type=rss`. | -| `blog_atom` | RSS feed of recent blog posts, in Atom format `/rss.php?action=newblogs&type=atom`. | -| `contact_us_submit` | URL to submit the Contact Us form `/pages.php?action=sendContactForm`. | -| `search` | URL to submit a search request `/search.php`. | -| `compare` | A string containing the URL to the products comparison page `/compare`. | -| `sitemap` | URL to the sitemap `/sitemap.php`. | -| `subscribe` | Collection of subscription-related URLs. | -| `action` | URL to which the newsletter subscription will be submitted `/subscribe.php`. | +--- +title: Global Objects and Properties +keywords: stencil, currency, currencies, sort, +--- + +# Global Objects and Properties + +Global objects and properties are common components shared across the entire BigCommerce storefront. + +<Callout type="info"> + #### Debugging Your Theme + The Stencil framework provides built-in debugging tools to aid in your custom front-end development. When you want to see what data is available on the page you are working on, you can simply add the debug query string to your store’s localhost URL. For example: + `http://localhost:3000/product/this-is-a-sample-product?debug=context` will return a list of all the objects available on the page, in JSON syntax. + If you want to view the available JSON objects and rendered page at the same time, simply change the debug value to "bar": `http://localhost:3000/product/this-is-a-sample-product?debug=bar` +</Callout> + +## Banner + +**Description:** Elements of marketing banners at page’s top and/or bottom + +**Handlebars Expressions:** `{{banner}}`, `{{{banner}}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `banners` | Blocks of static HTML content to define banners. | +| `top` | Array of HTML content/strings, for custom top-banner content; banners are populated from the BigCommerce control panel. | +| `bottom` | Array of HTML content/strings, for custom bottom-banner content; banners are populated from the BigCommerce control panel. | + +<Callout type="warning"> + #### Handlebars Formatting Exception + Where a banner contains HTML, the banner helper must be placed in triple braces, as in this example: `{{{banner}}}`. (Double braces would escape the HTML.) +</Callout> + +## Breadcrumbs + +**Description:** Defines a page's breadcrumbs – available on virtually all pages that have a breadcrumb trail. + +**Handlebars Expression:** `{{breadcrumbs}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `name` | Displayed name of this breadcrumb element. | +| `url` | URL of this breadcrumb element. | + +## Carousel + +**Description:** A list of images, text, and style assets for a storefront’s image slide show. + +**Handlebars Expression:** `{{carousel}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `swap_frequency` | Indicates how often (in seconds) the slides will change; the value must be between 1 and 90,000 seconds. | +| `slides` | Object containing properties for each slide in the slideshow. | +| `image` | Path to the image file used on this slide. | +| `alt_text` | Alt text for the image. | +| `url` | URL to which the image will link. | +| `heading` | Heading message defined by the merchant. | +| `heading_color` | Color of the heading text. | +| `text` | Subheading defined by the merchant. | +| `text_color` | Color of the subheading text. | +| `button_text` | Text displayed on a call-to-action button defined by the merchant. | +| `button_text_color` | Color of the button. | + +## Cart + +**Description:** Returns the ID of the cart if one exists. To return more cart information use the [Storefront Cart API](/docs/rest-storefront/carts). + +**Handlebars Expression:** `{{cart_id}}` + +**Object Properties:** + +|Property|Description| +|:-- |:-- | +| `cart_id`| ID of the shopper's cart. String | + +## Currency Selector + +**Description:** A list of all supported currencies, and the currency that is actively in use in the storefront. + +**Handlebars Expression:** `{{currency_selector}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `active_currency_id` | ID of the currency actively in use in the storefront. | +| `active_currency_flag` | Country flag used to represent the active currency. | +| `active_currency_name` | Name of the active currency. | +| `active_currency_code` | Code for the active currency. | +| `currencies` | List of all the currencies supported for this storefront. | +| `is_active` | Boolean that indicates whether this currency is active for use in the storefront. | +| `switch_url` | The URL to invoke a switch to this currency. | +| `id` | ID of the currency. | +| `name` | Name of the currency. | +| `flag` | Country flag used to visually represent the currency. | + + + ## Categories + + **Description:** A array of category objects filled with all categories shown in the current page context; default sorting is by category ID, from lowest to highest. + +**Handlebars Expression:** `{{categories}}` + +```handlebars filename="Example: Categories usage" showLineNumbers +<!-- renders a UL of categories for the current page context --> +<ul class="people_list"> + {{#each categories}} + <li>{{this.name}}</li> + {{/each}} +</ul> +``` + +**Object Properties:** + +The table below displays properties for the individual category objects within the array. + +| Property | Description | +|:----|:----| +| `id` | ID of the top-level category listed. | +| `image` | Path to the image file used on this slide. | +| `alt` | The image alt name. Defaults to category name. | +| `data` | Public category image url. | +| `name` | Name of the top-level category. | +| `description` | Description of the top-level category (optional – when requested in front matter). | +| `url` | URL to the category page. | +| `count` | Number of products in this category. | +| `children` | List of child categories for this top-level category. | +| `id` | ID of the child category. | +| `name` | Name of the child category. | +| `description` | Description of the child category (optional – when requested in front matter). | +| `url` | URL of the child category. | +| `is_active` | Boolean that indicates which category is your “breadcrumb” category on an item's product display page (PDP). For example, an emerald necklace may be in the _Jewelry_ and _Accessories_ categories. If you navigated to the product from the _Jewelry_ category, `is_active: true` will be present on the _Jewelry_ object. | +| `count` | Number of products in this child category. | +| `image` | Path to the image file used on this slide. | +| `alt` | The image alt name. Defaults to category name. | +| `data` | Public category image URL. | + +## Faceted Search + +**Description:** Faceted-search object for searching globally, by category, or by brand. + +**Handlebars Expression:** `{{faceted_search}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `facets` | List of all search facets available. | +| `**selected**` | Container for the selected search facets (selected facets contain properties below). | +| `remove_all_url` | URL to remove all selected search restrictions. | +| `items` | Currently enabled search facets. | + +## Featured Products + +**Description:** Renders a list of all the featured products for the BigCommerce storefront. + +**Handlebars Expression:** `{{products.featured}}` + +**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). + +**Usage Example:** + +The code example below displays the global `{{products.featured}}` object on the `cornerstone/templates/pages/home.html` page template from [Stencil's base Cornerstone theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L5) (GitHub). + +`{{products.featured}}` returns 10 products by default. + +First, you must declare the object using Front Matter. To declare the object, the following front matter must be placed at the top of the template HTML page. This following declaration also limits the number of featured products to be displayed: + +```yml filename="Example: Frontmatter declaration" showLineNumbers +products: + [...] + featured: + limit: {{theme_settings.homepage_featured_products_count}} //limits the number of featured products to be displayed. +``` + +The `homepage_featured_products_count` limit is one of two relevant variables defined in [Cornerstone's `config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L45) (GitHub). + +```json filename="homepage_featured_products_count" showLineNumbers +"settings": { + // ... + "homepage_featured_products_count": 8, + // ... + "homepage_featured_products_column_count": 4, + // ... +} +``` + +In the body of [Cornerstone's `home.html` template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L27) (GitHub), the below Handlebars conditional statement is responsible for displaying the `{{products.featured}}` object. This is the object that we declared above using front matter. + +```handlebars filename="home.html" showLineNumbers +{{#if products.featured}} + {{> components/products/featured products=products.featured columns=theme_settings.homepage_featured_products_column_count}} +{{/if}} +``` + +This above statement formats the _Featured Products_ display according to the `homepage_featured_products_column_count` variable, which is the second relevant variable defined in [Cornerstone's `config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L53) (GitHub). + +## Footer + +**Description:** The footer content for each storefront page + +**Handlebars Expression:** `{{footer}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `sitemap_url` | The URL to the sitemap, based on store’s SEO setting. | +| `scripts` | Scripts to be loaded after the HTML has loaded; includes performance metrics. | + +## HTML Head + +**Description:** Data to be included in the HTML `<head>` element<br /> + +**Handlebars Expression:**`{{head}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `character_set` | The character set to specify. | +| `meta_tags` | Meta tags to improve store SEO. | +| `title` | Current page’s title. | +| `stylesheets` | CSS files to be included. | +| `scripts` | Scripts to be loaded in the <head> tag. | +| `favicon` | The store’s favicon (Favorite icon). | +| `rsslinks` | RSS feeds to improve SEO. | + +## Is_Ajax + +**Description:** Boolean; returns `true` if the current executing request is an Ajax request + +**Handlebars Expression:** `{{is_ajax}}` + +No properties available for this object. + +## New Products + +**Description:** A list of new products for the BigCommerce storefront + +**Handlebars Expression:**`{{products.new}}` + +**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). + +**Usage Example:** + +To access the global `{{products.new}}` object on your page, you must first use front matter to declare the object at the top of your page template. + +`{{products.new}}` returns 10 products by default. + +The code example below declares the global `{{products.new}}` object on the `cornerstone/templates/pages/home.html` page template from [Stencil's base Cornerstone Theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L3) (GitHub). + +```yml filename="Example: Frontmatter declaration" showLineNumbers +products: + new: + limit: {{theme_settings.homepage_new_products_count}} +``` + +The `homepage_featured_products_count` limit is one of two relevant variables defined in Cornerstone's `config.json` file (GitHub). + +```json filename="config.json" showLineNumbers +"settings": { + "homepage_new_products_count": 5, + // ... + "homepage_new_products_column_count": 4, + // ... +} +``` + +In the body of [Cornerstone's home.html template](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/home.html#L36) (GitHub), the below Handlebars conditional statement is responsible for displaying the `{{products.featured}}` object. This is the object that we declared above using front matter. + +```handlebars filename="home.html" showLineNumbers +{{#if products.new}} + {{> components/products/new products=products.new columns=theme_settings.homepage_new_products_column_count}} +{{/if}} +``` + +This above statement formats the _New Products_ display according to the `homepage_new_products_column_count` variable, which is the second relevant variable defined in [Cornerstone's config.json file](https://github.com/bigcommerce/cornerstone/blob/master/config.json#L46) (GitHub + +## Page Content + +**Description:** Defines elements of merchant’s store page + +**Handlebars Expression:** `{{page}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `title` | Page title, to be used as the HTML `title` tag. | +| `description` | Description for the page, to be used as the HTML `meta > description` tag. | +| `content` | HTML content of the page. | +| `sub_pages` | Array of child pages. | +| `title` | Title of this child page. | +| `url` | URL of this child page. | + +## Pages + +**Description:** A list of all web content pages for the BigCommerce storefront + +**Handlebars Expression:** `{{pages}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `name` | Name of the page. | +| `url` | URL of the page. | +| `children` | List of child pages for this page. | +| `name` | Name of the child page. | +| `url` | URL of the child page. | + +## Page Type Property + +**Description:** A string representing the type of page currently displayed. <br /> + +**Handlebars Expression:** `{{page_type}}` + +**Values:** The four most-commonly-used values for `{{page_type}}` are: + +* default (for a home page) +* product (for a product page) +* category (for a category page) +* page (for a Web [static] page) + +All possible values for `{{page_type}}` are: + +| account | shippingaddressform | account_new_return | +|:----|:----|:----| +| account_addressbook | account_downloaditem | account_inbox | +| editaccount | account_orderstatus | account_orders | +| invoice_print | account_order | account_recentitems | +| account_saved_return | account_returns | wishlists | +| add-wishlist | wishlist | createaccount_thanks | +| createaccount | forgotpassword | login | +| getnewpassword | blog | blog_post | +| brand | brands | cart | +| category | compare | 403 | +| 404 | error | giftcertificates_balance | +| giftcertificates | giftcertificates_redeem | default | +| page | page_contact_form | product | +| rss | search | sitemap | +| newsletter_subscribe | unsubscribe | hibernation | +| maintenance | + +## Pagination + +**Description:** Defines pagination of storefront pages + +**Handlebars Expression:** `{{pagination}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `next` | Link to next page, if any. | +| `previous` | Link to previous page, if any. | +| `sort` | Field to sort by. | +| `current` | Number representing which page (in the current collection) the customer is viewing. | +| `total` | Total number of results, across all pages. | +| `links` | Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number. | +| `url` | URL to this page of results. | +| `number` | The page number of this link, based on an index starting at 1. | + +## Search + +**Description:** Defines search parameters for the merchant’s site + +**Handlebars Expression:** `{{forms.search}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `query` | Active search query, if available. | +| `section` | Active search-results section: either content or product. | +| `content_url` | URL to the content section. | +| `product_url` | URL to the product section. | +| `name` | Brand name. | +| `suggested_query` | An alternative query – related to the current query – that can be offered to substitute for misspelled entries. | +| `has_suggestions` | Boolean – true if there is at least one of brand results, category results, or a (non-null) suggested_query. | +| `brand_results` | Array of brands that match the search query; default sorting is by brand id, from lowest to highest. | +| `url` | URL of the brand. | +| `name` | Displayed name for the brand. | +| `category_results` | An array of category paths matching the search query; used to populate category suggestions. | +| `url` | URL of the category. | +| `name` | Displayed name for the category. | +| `values` | Values of the submitted search form. | +| `brand` | Any brand ID that the customer has selected from drop-down list. | +| `price_from` | Any minimum price the customer has specified. | +| `price_to` | Any maximum price the customer has specified. | +| `featured_products` | Whether customer has chosen to view featured products: null = no preference; 1 = only featured products; 2 = only non-featured products. | +| `free_shipping` | Value indicating customer’s preference for free shipping within search results: null = no preference; 1 = free shipping only; 2 = paid shipping only. | +| `result_count` | Combined number of returned results for product and content search. | +| `category_options` | Array of options to present to customer as search-by-category fields. | +| `id` | Category ID. | +| `name` | Displayed name of the category. | +| `state` | If category contains children, and customer selects a child category: Whether that category’s display will default to closed (collapsed) or opened (expanded). | +| `children` | Array of objects representing a child category; recursively replicates the structure of its parent. | +| `content_results` | Search results across blog posts and storefront pages (not products or categories). | +| `title` | Title of the result (title embedded in blog post or page). | +| `content` | Summary of text from the blog post or page (first 200 characters). | +| `url` | URL to the result. | +| `type` | Either post (for blog posts) or page (for storefront pages). | +| `product_results` | Results of customer’s last search by product (each result contains the below properties). | +| `products` | List of search results for a product; points to [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). | +| `show_compare` | Boolean corresponding to merchant’s control-panel selection whether or not to enable product comparisons. | +| `faceted_search_enabled` | Boolean that defines whether product-filtering search is enabled for the store. | +| `facets` | All available search filters. | +| `pagination` | References pagination model. | +| `selected` | Currently selected filters. | + +## Settings + +**Description:** Common settings shared across every BigCommerce storefront + +**Handlebars Expression:** `{{settings}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `account_creation_enabled` | Site-wide boolean value that indicates whether to allow customers to create accounts. | +| `show_product_rating` | Site-wide boolean value that indicates whether to display product ratings (in numeric or star format) to visitors. | +| `show_product_reviews` | Site-wide boolean value that indicates whether to display full-text product reviews to visitors. | +| `show_newsletter_box` | Site-wide boolean value that indicates whether to display a mailing-list invite to visitors. | +| `gift_certificates_enabled` | Site-wide boolean value that indicates whether to enable the gift certificate system for this store. | +| `blog_enabled` | Site-wide boolean value that indicates whether the blog is visible for this store. | +| `data_tag_enabled` | Site-wide boolean that indicates whether GAEE is enabled in a theme. For `{{settings.data_tag_enabled}}` to be true, the enhanced_ecommerce key must be present in config.json and a GAEE experiment must be enabled along with GA property value set in Analytics > GA in an active MSF-enabled BigCommerce control panel. | +| `show_wishlist` | Site-wide boolean value that indicates whether to allow customers to create wishlists. | +| `base_url` | The normal shop URL. | +| `client_ip_address` | IP address of the customer browsing the store. | +| `country_code` |The country code corresponding to the IP.| +| `request` | The object that contains details about the HTTP request. | +| `referer`| The refer of the request. | +| `host` | The hostname of the request.| +| `origin` |The origin of the request. | +| `user_agent` | The user agent string of the request.| +| `is_crawler`| Renders "true" if user angent is known crawler; "false" otherwise. | +| `absolute_path` |The absolute URL requested. **Never** use request.path in the actual body of the page<sup>1</sup>. | +| `locale` |The browser's locale. Allows for varying experience based on shopper locale. | +| `secure_base_url` | The SSL-enabled, secure, shop URL. | +| `address` | Store’s complete physical address, as entered by merchant in the [Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings).| +| `store_name` | Name of the BigCommerce store. | +| `store_logo` | The store’s logo. | +| `title` | Title for the logo – the text configured in the control panel under **Storefront > Logo**. | +| `image` | Optional image file, as a Stencil image object. To access the store_logo use: `{{settings.store_logo.image.data}}` and `{{settings.store_logo.image.alt}}` to access the alt tag. These are pulled from the Stencil image object. | +| `privacy_cookie` | If enabled, a string containing merchant-customizable text for (European Union–required) cookie-setting notification; if disabled, a boolean with a value of false. | +| `urls` | Global URLs that the template can access – for example, the template could link to the cart page using `{{urls.cart}}`. | +| `home` | Store’s home page. | +| `account` | Collection of (customer and storefront) account-related URLs:| +| `index` | Account index page `/account.php`. | +| `orders` | Collection of orders-related URLs: | +| `all` | List of all orders `/account.php?action=order_status`. | +| `completed`| URL to view completed orders `/account.php?action=view_orders`. | +| `save_new_return` | URL to submit a New Return form `/account.php?action=save_new_return`. | +| `update_action` | URL to submit an Edit Account form `/account.php?action=update_account`. | +| `returns` | List of returns `/account.php?action=view_returns`. | +| `addresses` | List of addresses; default sorting is by address id, from lowest to highest `/account.php?action=address_book`. | +| `inbox` | List of messages in customer’s inbox `/account.php?action=inbox`. | +| `send_message` | URL to submit a message to the merchant `/account.php?action=send_message`. | +| `add_address` | Link to add shipping address form `/account.php?action=add_shipping_address`. | +| `wishlists` | Collection of wishlist-related URLs: | +| `add` | URL to the Add Wishlist form `/wishlist.php?action=addwishlist`. | +| `edit` | URL to the Edit Wishlist form `/wishlist.php?action=editwishlist`. | +| `delete` | URL to delete a wishlist `/wishlist.php?action=deletewishlist`. | +| `all` | URL to view all wishlists `/wishlist.php`. | +| `details` | URL to the Edit Account form `/account.php?action=account_details`. | +| `recent_items` | URL to a list of recently viewed items `/account.php?action=recent_items`.| +| `brands` | URL to view all brands; default sorting is by brand id, from lowest to highest. | +| `gift_certificate` | Collection of gift-certificate–related URLs: | +| `purchase` | URL to a form for purchasing a gift certificate `/giftcertificates.php`. | +| `redeem` | URL to view redemption information `/giftcertificates.php?action=redeem`. | +| `balance` | URL to check the balance of a gift certificate `/giftcertificates.php?action=balance`. | +| `auth` | Collection of authorization-related URLs: | +| `login` | URL to the login form `/login.php`. | +| `check_login` | URL to which to submit the login form `/login.php?action=check_login`. | +| `create_account` | URL to the Create Account form page `/login.php?action=create_account`. | +| `save_new_account` | URL to which to submit the Create Account form `/login.php?action=save_new_account`. | +| `forgot_password` | URL to the Forgot Password form `/login.php?action=reset_password`. | +| `send_password_email` | Submission URL for the Forgot Password form `/login.php?action=send_password_email`. | +| `save_new_password` | Submission URL for saving a new password `/login.php?action=save_new_password`. | +| `logout` | URL for customer to log out of their account `/login.php?action=logout`. | +| `product` | Collection of product-related URLs: | +| `post_review` | URL to submit a Write Review form `/postreview.php`. | +| `cart` | URL to the cart page `/cart.php`. | +| `checkout` | Collection of checkout related URLs: | +| `single_address` | URL for the customer to check out with a single shipping address `/checkout.php`.| +| `multiple_address` | URL for the customer to check out with multiple shipping addresses `/checkout.php?action=multiple`. | +| `rss` | Collection of RSS-related URLs: | +| `products` | Collection of product-feed–related URLs: | +| `new` | RSS feed of new products `/rss.php?type=rss`. | +| `new_atom` | RSS feed of new products, in Atom format `/rss.php?type=atom`. | +| `popular` | RSS feed of popular products `/rss.php?action=popularproducts&type=rss`. | +| `popular_atom` | RSS feed of popular products, in Atom format `/rss.php?action=popularproducts&type=atom`. | +| `featured` | RSS feed of featured products `/rss.php?action=featuredproducts&type=rss';` .| +| `featured_atom` | RSS feed of featured products, in Atom format `/rss.php?action=featuredproducts&type=atom`. | +| `search` | RSS feed of products matching the active search query. | +| `search_atom` | RSS feed of products matching the active search query, in Atom format. | +| `blog` | RSS feed of recent blog posts `/rss.php?action=newblogs&type=rss`. | +| `blog_atom` | RSS feed of recent blog posts, in Atom format `/rss.php?action=newblogs&type=atom`. | +| `contact_us_submit` | URL to submit the Contact Us form `/pages.php?action=sendContactForm`.| +| `search` | URL to submit a search request `/search.php`. | +| `compare` | A string containing the URL to the products comparison page `/compare`. | +| `sitemap` | URL to the sitemap `/sitemap.php`. | +| `subscribe` | Collection of subscription-related URLs. | +| `action` | URL to which the newsletter subscription will be submitted `/subscribe.php`. | +| `money` | List of child items that define the store’s default currency formatting. | +| `currency_token` | Symbol for the currency. | +| `currency_location` | Whether currency symbol appears at left or right of the quantity. | +| `decimal_token` | Symbol for decimal separator. | +| `decimal_places` | Number of decimal places to display. | +| `thousands_token` | Symbol for thousands separator. | +| `returns_enabled` | Boolean that indicates whether the control-panel setting for the returns system is enabled. | +| `tax_label` | Defines the Tax Label (VAT, Sales Tax, etc.) that a merchant can set in an active MSF-enabled control panel’s **Settings > Tax** page for display to customers. | +| `add_this` | Object that defines links for the AddThis social sharing component. | +| `buttons` | Array of buttons to display for AddThis social sharing `{{#each settings.add_this.buttons}}{{service}}{{/each}}` `{{#each settings.add_this.buttons}}{{annotations}}{{/each}}`. | +| `service` | String containing the name of this button's social-media service (facebook, email, print, twitter, linkedin, google, etc.). | +| `annotation` | String containing HTML attributes associated with this button. | +| `maintenance` | Object that manages information about the store when in maintenance (offline) mode. | +| `header` | If store is in maintenance mode, string containing header text for the "Down for Maintenance" window displayed to visitors; otherwise, null. | +| `message` | If store is in maintenance mode, string containing merchant-customizable body text (and optionally, HTML) for the "Down for Maintenance" window displayed to visitors; otherwise, null. | +| `notice` | If store is in maintenance mode, one of three strings identifying the store's status, and generating a corresponding text notice to merchants about how to proceed: AdminPrelaunchNotice for preview stores, AdminMaintenanceNotice for active stores taken down for maintenance, or AdminHibernationModeNotice for deactivated stores; otherwise, null. | +| `phone_number` | The contact phone number for the store located in the [stores profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings). | +| `rss_item_limit` | An integer that sets a limit on the number of RSS items to display. | +| `password_requirements` | Collection of properties representing BigCommerce requirements for customer-account passwords: | +| `alpha` | Regular expression representing required/acceptable alphabetic characters. | +| `numeric` | Regular expression representing required/acceptable numeric characters. | +| `minlength` | Integer representing minimum acceptable password length. | +| `error` | String that passes a standard error message for noncompliant passwords. | +| `measurements` | Collection of units-of-measure definitions, to be used when displaying product details: | +| `length` | Units of measure for product length. | +| `weight` | Units of measure for product weight. | +| `Time and date settings` | The four settings below are configured in an active MSF-enabled control panel under **Settings > General > Date & Timezone**. Date formats follow php conventions. | +| `store_time_zone` | Store's time zone, as selected in the control panel's Your Timezone drop-down list. | +| `store_dst_correction` | Whether or not this time zone observes Daylight Saving Time (boolean), as set by the control panel's Enable DST Correction check box. | +| `display_date_format` | Brief display format/pattern for dates, as configured in the control panel's Display Date Format field. | +| `extended_display_date_format` | Extended display format/pattern for dates, as configured in the control panel's Extended Display Date Format field. | +| `show_payment_methods` | A boolean value. If true available payment methods on a store will be shown. If false they are hidden. | +| `as payments_url`| Exposes the BigCommerce payments URL. `https://payments.bigcommerce.com`.| +| `secure_host` | Returns the SSL url for a store. Example: `https://www.bigcommerce.com`. | +| `store_hash` | Returns the store hash as a string. | +| `is_eu_ip_address`| A boolean value. Return true if the shoppers ip address is in the EU. | +| `show_newsletter_box` | Returns `1` if customers are allowed to subscribe to the [store newsletter](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter). Returns `0` if customers are not able to subscribe. | +| `show_newsletter_summary` | Returns a `1` if the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter) is shown. Returns `0` if it is now shown. If `show_newsletter_box` is `0` then `show_newsletter_summary` will also be `0`. | +| `newsletter_summary` | Returns the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter). | +| `amp_analytics_id` | Returns Google AMP analytics ID. | +| `bulk_discount_enabled` | Boolean that return `true` if bulk discount is enabled on products. | + + +## Sitemap + +**Description:** A list of all sitemap properties for this BigCommerce storefront: pages, categories, and brands. + +**Handlebars Expression:** `{{sitemap}}` + +**Object Properties:** + +| Property | Description | +|:----|:----| +| `subsection_url` | URL to subsection content (pages, categories, brands) of the sitemap. | +| `label` | Subsection title (pages, categories, brands.) | +| `body` | List of all sitemap subsections. | +| `url` | URL to the page, category, or brand. | +| `label` | Label of the page, category, or brand. | +| `children` | Nested list of children within pages or categories; will be null for brands. | +| `url` | URL to the child page or category. | +| `label` | Label for the child page or category. | + +## Social Links + +**Description:** Array of all social-media site links for the storefront.<br /> + +**Handlebars Expression:** `{{social_media}}` + +**Object Properties:**<br /><br /> + +| Property | Description | +|:----|:----| +| `name` | Internal name of this social-media platform (e.g., "googleplus"). | +| `url` | URL to point to, set by merchant in control panel (https://www.facebook.com/BigCommerce, etc.). | +| `position` | Display sort order for this platform within the social-media list. | +| `display_name` | Displayed/formatted name of this social-media platform (e.g., "Google+"). | + +## Template Property + +**Description:** A string containing the name of the root template currently being rendered in the page context. <br /> + +**Handlebars Expression:** `{{template}}` + +**Values:** Values will reflect each theme's specific directory structure. Possible values include: + +* `pages/home` +* `pages/brand` (for brand pages) +* `pages/brands` +* `pages/cart` +* `pages/category` (for category pages) +* `pages/contact-us` +* `pages/page` (for Web [static] pages) +* `pages/product` (for product pages) +* `pages/errors/404` +* `pages/auth/login` +* `pages/custom/product/<some_page_name>` (for a custom product page) +(etc.) + +## Top Sellers + +**Description:** Object to display a sidebar of top-selling products.<br /> + +**Handlebars Expression:** `{{products.top_sellers}}` + +**Object Properties:** References the [product card model](/stencil-docs/stencil-object-model-reference/stencil-objects/common-objects/common-product-card-model). + +**Usage Example:** + +`{{products.top_sellers}}` returns 10 products by default. + +To access the global `{{products.top_sellers}}` object on your page, you must first use [front matter](/stencil-docs/front-matter/front-matter-attributes-reference) to declare the object at the top of your page template. For example, you would place this front-matter declaration at the top of your template file: + +```yml filename="Template frontmatter" showLineNumbers +products: + top_sellers: +``` + +## Urls + +**Description:** Object containing a collection of storefront pages and their sub-pages<br /> + +**Handlebars Expression:** `{{urls}}` + +**Object Properties:** + +| Property | Description | +| :--- | :--- | +| `urls` | Global URLs that the template can access. For example, the template could link to the cart page using `{{urls.cart}}`. | +| `home` | Store's home page. | +| `account` | Collection of (customer and storefront) account-related URLs:| +| `index` | Account index page `/account.php`. | +| `orders` | Collection of orders-related URLs: | +| `all` | List of all orders. `/account.php?action=order_status`. | +| `completed` | URL to view completed orders. `/account.php?action=view_orders`. | +| `save_new_return` | URL to submit a New Return form. `/account.php?action=save_new_return`. | +| `update_action` | URL to submit an Edit Account form. `/account.php?action=update_account`. | +| `returns` | List of returns `/account.php?action=view_returns`. | +| `addresses` | List of addresses; default sorting is by address id, from lowest to highest `/account.php?action=address_book`. | +| `inbox` | List of messages in customer’s inbox `/account.php?action=inbox`. | +| `send_message` | URL to submit a message to the merchant `/account.php?action=send_message`. | +| `add_address` | Link to add shipping address form `/account.php?action=add_shipping_address`. | +| `wishlists` | Collection of wishlist-related URLs: | +| `add` | URL to the Add Wishlist form `/wishlist.php?action=addwishlist`. | +| `edit` | URL to the Edit Wishlist form `/wishlist.php?action=editwishlist`. | +| `delete` | URL to delete a wishlist `/wishlist.php?action=deletewishlist`. | +| `all` | URL to view all wishlists `/wishlist.php`. | +| `details` | URL to the Edit Account form `/account.php?action=account_details`. | +| `recent_items` | URL to a list of recently viewed items `/account.php?action=recent_items`. | +| `payment_methods` | Collection of payment methods available on a store, visible when [stored payment methods](https://support.bigcommerce.com/s/article/Enabling-Stored-Payment-Methods?language=en_US) are enabled: | +| `all` | URL to a form for payment methods `/account.php?action=payment_methods`. | +| `brands` | URL to view all brands; default sorting is by brand ID, from lowest to highest. | +| `gift_certificate` | Collection of gift-certificate–related URLs: | +| `purchase` | URL to a form for purchasing a gift certificate `/giftcertificates.php`. | +| `redeem` | URL to view redemption information `/giftcertificates.php?action=redeem`. | +| `balance` | URL to check the balance of a gift certificate `/giftcertificates.php?action=balance`. | +| `auth` | Collection of authorization-related URLs: | +| `login` | URL to the login form `/login.php`. | +| `check_login` | URL to which to submit the login form `/login.php?action=check_login`. | +| `create_account` | URL to the Create Account form page `/login.php?action=create_account`. | +| `save_new_account` | URL to which to submit the Create Account form `/login.php?action=save_new_account`. | +| `forgot_password` | URL to the Forgot Password form `/login.php?action=reset_password`. | +| `send_password_email` | Submission URL for the Forgot Password form `/login.php?action=send_password_email`. | +| `save_new_password` | Submission URL for saving a new password `/login.php?action=save_new_password`. | +| `logout` | URL for customer to log out of their account `/login.php?action=logout`. | +| `product` | Collection of product-related URLs: | +| `post_review` | URL to submit a Write Review form `/postreview.php`. | +| `cart` | URL to the cart page `/cart.php`. | +| `checkout` | Collection of checkout related URLs: | +| `single_address` | URL for the customer to check out with a single shipping address `/checkout.php`. | +| `multiple_address` | URL for the customer to check out with multiple shipping addresses `/checkout.php?action=multiple`. | +| `rss` | Collection of RSS-related URLs: | +| `products` | Collection of product-feed–related URLs: | +| `new`| RSS feed of new products `/rss.php?type=rss`. | +| `new_atom` | RSS feed of new products, in Atom format `/rss.php?type=atom`. | +| `popular` | RSS feed of popular products `/rss.php?action=popularproducts&type=rss`. | +| `popular_atom` | RSS feed of popular products, in Atom format `/rss.php?action=popularproducts&type=atom`. | +| `featured` | RSS feed of featured products `/rss.php?action=featuredproducts&type=rss';`. | +| `featured_atom` | RSS feed of featured products, in Atom format `/rss.php?action=featuredproducts&type=atom`. | +| `search` | RSS feed of products matching the active search query. | +| `search_atom` | RSS feed of products matching the active search query, in Atom format. | +| `blog` | RSS feed of recent blog posts `/rss.php?action=newblogs&type=rss`. | +| `blog_atom` | RSS feed of recent blog posts, in Atom format `/rss.php?action=newblogs&type=atom`. | +| `contact_us_submit` | URL to submit the Contact Us form `/pages.php?action=sendContactForm`. | +| `search` | URL to submit a search request `/search.php`. | +| `compare` | A string containing the URL to the products comparison page `/compare`. | +| `sitemap` | URL to the sitemap `/sitemap.php`. | +| `subscribe` | Collection of subscription-related URLs. | +| `action` | URL to which the newsletter subscription will be submitted `/subscribe.php`. | diff --git a/docs/stencil-docs/reference-docs/other-objects-and-properties-overview.mdx b/docs/storefront/stencil/draft/reference-docs/other-objects-and-properties-overview.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/other-objects-and-properties-overview.mdx rename to docs/storefront/stencil/draft/reference-docs/other-objects-and-properties-overview.mdx diff --git a/docs/stencil-docs/reference-docs/styles-and-properties.mdx b/docs/storefront/stencil/draft/reference-docs/styles-and-properties.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/styles-and-properties.mdx rename to docs/storefront/stencil/draft/reference-docs/styles-and-properties.mdx diff --git a/docs/stencil-docs/reference-docs/theme-objects.mdx b/docs/storefront/stencil/draft/reference-docs/theme-objects.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/theme-objects.mdx rename to docs/storefront/stencil/draft/reference-docs/theme-objects.mdx diff --git a/docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx b/docs/storefront/stencil/draft/store-design-overview.mdx similarity index 94% rename from docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx rename to docs/storefront/stencil/draft/store-design-overview.mdx index 72938237a..a4fa38c20 100644 --- a/docs/stencil-docs/configure-store-design-ui/store-design-overview.mdx +++ b/docs/storefront/stencil/draft/store-design-overview.mdx @@ -19,7 +19,7 @@ For documentation on the principal keys included in Stencil's reference Cornerst ## Managing Keys between Versions -To make sure revisions to your theme are backward-compatibile, we generally recommend that you manage keys in both your <span class="fn">config.json</span> and <span class="fn">schema.json</span> files in an additive way. Specific recommendations: +To make sure revisions to your theme are backward-compatible, we generally recommend that you manage keys in both your <span class="fn">config.json</span> and <span class="fn">schema.json</span> files in an additive way. Specific recommendations: Adding new keys is generally fine. (However, each key in <span class="fn">schema.json</span> must have a matching default in <span class="fn">config.json</span>.) diff --git a/docs/stencil-docs/getting-started/about-stencil.mdx b/docs/storefront/stencil/start/index.mdx similarity index 98% rename from docs/stencil-docs/getting-started/about-stencil.mdx rename to docs/storefront/stencil/start/index.mdx index 401c676c7..29438731c 100644 --- a/docs/stencil-docs/getting-started/about-stencil.mdx +++ b/docs/storefront/stencil/start/index.mdx @@ -1,83 +1,83 @@ -# About Stencil - - - -Stencil is BigCommerce's theme engine. It incorporates industry best practices in technology, design standards, SEO, and allows developers to build a stunning storefront that engages shoppers and encourages checkouts on any device. Stencil themes are supported on the [following browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers). Stencil is responsible for powering the BigCommerce [Cornerstone theme](#cornerstone). - -The [Page Builder](/docs/storefront/stencil/content/page-builder) tool available on Stencil themes allows merchants to customize a storefront's look and feel with no coding, making customizations possible by a wide range of users. Page Builder enables quick and easy customization of a theme's colors, typography, banners, headings, carousel, and footer. It also enables customization of a storefront's layout characteristics, such as the number of products displayed in various panels, category pages, and brand pages. For details, see [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US). - - -BigCommerce Stencil themes are responsive, mobile friendly themes, allowing shoppers to have a first class experience across any device. Each Stencil theme can contain one to four variations. You can optimize individual variations for specific markets, audiences, and styles, while still managing and distributing all of these variations as one theme. - -## Cornerstone - -BigCommerce's [Cornerstone](https://github.com/bigcommerce/cornerstone) theme is the building block and starting point for rapidly developing themes for BigCommerce. Cornerstone is available open source on [GitHub](https://github.com/bigcommerce/cornerstone). - -Cornerstone comes in three, fully-responsive variations: - -* Cornerstone Light -* Cornerstone Warm -* Cornerstone Bold - -See the [Cornerstone Light theme demo](http://cornerstone-light-demo.mybigcommerce.com/) to experience a Stencil theme's capabilities. - -As the default theme on new stores, Cornerstone is typically the first theme to support new theme-related features and improvements. See the [BigCommerce Developer Changelog](/release-notes) for the latest Cornerstone news and release notes. - -## Stencil CLI - -The Stencil CLI enables developers to locally develop and customize on any Stencil theme with no impact on a merchant's live storefront during the development process. When developing locally, developers have access to real-time Browsersync preview and testing across desktop, mobile, and tablet devices/viewports. - -Stencil CLI runs on the [Node.js](https://nodejs.org/en/) runtime environment. Installing Node.js also provides the required [npm package manager](https://www.npmjs.com/package/npm). - -## Flexible templates - -Stencil's logic based templates allow BigCommerce developers to customize storefront pages efficiently with the lightweight templating language, [Handlebars.js](https://handlebarsjs.com/). Handlebars.js allows you to efficiently embed dynamic and conditional logic onto your storefront pages. - -## Powerful CSS stack - -Stencil themes support both **Sass** and **SCSS**. Developers can use these popular CSS pre-processors to nest CSS properties, variables, and mix-ins. - -Cornerstone uses a BigCommerce SCSS Framework [Citadel](https://www.npmjs.com/package/@bigcommerce/citadel), which is built on top of [Foundation](https://foundation.zurb.com/sites/docs/) `v5.5.3` (Foundation `v6.x` not currently supported). - -Foundation assets are located in the following directories: -* <span class="fp">assets/scss/settings/foundation/</span> -* <span class="fp">assets/scss/components/foundation/</span> - -## Front Matter - -Stencil's use of **YAML Front Matter** allows developers to request only the objects needed on the storefront, increasing page speed and allowing developers to define the content to render with just a few keystrokes. - -## JavaScript event hooks - -Stencil themes can access remote objects through event hook and use the hooks to trigger defined events based on shopper behavior. This will allow you to collect product data and optimize a shopper's experience. To facilitate theme-building, BigCommerce provides [stencil-utils](/docs/storefront/stencil/utils/reference) -- a client-side library for managing event hooks. - -## Blueprint (Legacy framework) - - -For information on Blueprint, BigCommerce's legacy theme framework, see [Blueprint Themes](https://support.bigcommerce.com/s/article/Blueprint-Themes?language=en_US). - -## Support - -### [Developer Community](/community) -This is a great place to get help from other developers who work on the BigCommerce platform. If you have BigCommerce specific questions this is the best place to ask. It’s also great for beginners to get assistance. - -### [Stack Overflow](https://stackoverflow.com/questions/tagged/bigcommerce) -Are you a more experienced developer or have a programming language specific question? This is a good place to ask questions and get help. The developer community is the best place to get answers about the BigCommerce platform specifically. - -If you need direct assistance, you can contact BigCommerce Support through [Live Chat, Phone Support, or Email Support](https://support.bigcommerce.com/s/contact). - -## Resources - -### Related Articles - -* [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) (BigCommerce Knowledge Base) -* [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) (BigCommerce Knowledge Base) - -### Sample Apps - -* [Cornerstone Theme Demo](http://cornerstone-light-demo.mybigcommerce.com/) - -### Additional Resources -* [stencil-cli Repository](https://github.com/bigcommerce/stencil-cli) (BigCommerce GitHub) -* [Cornerstone Repository](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) -* [Cornerstone Theme Manual](https://support.bigcommerce.com/s/article/Cornerstone-Theme-Manual) (BigCommerce Knowledge Base) +# About Stencil + + + +Stencil is BigCommerce's theme engine. It incorporates industry best practices in technology, design standards, SEO, and allows developers to build a stunning storefront that engages shoppers and encourages checkouts on any device. Stencil themes are supported on the [following browsers](https://support.bigcommerce.com/s/article/Themes-Supported-Browsers). Stencil is responsible for powering the BigCommerce [Cornerstone theme](#cornerstone). + +The [Page Builder](/docs/storefront/stencil/content/page-builder) tool available on Stencil themes allows merchants to customize a storefront's look and feel with no coding, making customizations possible by a wide range of users. Page Builder enables quick and easy customization of a theme's colors, typography, banners, headings, carousel, and footer. It also enables customization of a storefront's layout characteristics, such as the number of products displayed in various panels, category pages, and brand pages. For details, see [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US). + + +BigCommerce Stencil themes are responsive, mobile friendly themes, allowing shoppers to have a first class experience across any device. Each Stencil theme can contain one to four variations. You can optimize individual variations for specific markets, audiences, and styles, while still managing and distributing all of these variations as one theme. + +## Cornerstone + +BigCommerce's [Cornerstone](https://github.com/bigcommerce/cornerstone) theme is the building block and starting point for rapidly developing themes for BigCommerce. Cornerstone is available open source on [GitHub](https://github.com/bigcommerce/cornerstone). + +Cornerstone comes in three, fully-responsive variations: + +* Cornerstone Light +* Cornerstone Warm +* Cornerstone Bold + +See the [Cornerstone Light theme demo](http://cornerstone-light-demo.mybigcommerce.com/) to experience a Stencil theme's capabilities. + +As the default theme on new stores, Cornerstone is typically the first theme to support new theme-related features and improvements. See the [BigCommerce Developer Changelog](/release-notes) for the latest Cornerstone news and release notes. + +## Stencil CLI + +The Stencil CLI enables developers to locally develop and customize on any Stencil theme with no impact on a merchant's live storefront during the development process. When developing locally, developers have access to real-time Browsersync preview and testing across desktop, mobile, and tablet devices/viewports. + +Stencil CLI runs on the [Node.js](https://nodejs.org/en/) runtime environment. Installing Node.js also provides the required [npm package manager](https://www.npmjs.com/package/npm). + +## Flexible templates + +Stencil's logic based templates allow BigCommerce developers to customize storefront pages efficiently with the lightweight templating language, [Handlebars.js](https://handlebarsjs.com/). Handlebars.js allows you to efficiently embed dynamic and conditional logic onto your storefront pages. + +## Powerful CSS stack + +Stencil themes support both **Sass** and **SCSS**. Developers can use these popular CSS pre-processors to nest CSS properties, variables, and mix-ins. + +Cornerstone uses a BigCommerce SCSS Framework [Citadel](https://www.npmjs.com/package/@bigcommerce/citadel), which is built on top of [Foundation](https://foundation.zurb.com/sites/docs/) `v5.5.3` (Foundation `v6.x` not currently supported). + +Foundation assets are located in the following directories: +* <span class="fp">assets/scss/settings/foundation/</span> +* <span class="fp">assets/scss/components/foundation/</span> + +## Front Matter + +Stencil's use of **YAML Front Matter** allows developers to request only the objects needed on the storefront, increasing page speed and allowing developers to define the content to render with just a few keystrokes. + +## JavaScript event hooks + +Stencil themes can access remote objects through event hook and use the hooks to trigger defined events based on shopper behavior. This will allow you to collect product data and optimize a shopper's experience. To facilitate theme-building, BigCommerce provides [stencil-utils](/docs/storefront/stencil/utils/reference) -- a client-side library for managing event hooks. + +## Blueprint (Legacy framework) + + +For information on Blueprint, BigCommerce's legacy theme framework, see [Blueprint Themes](https://support.bigcommerce.com/s/article/Blueprint-Themes?language=en_US). + +## Support + +### [Developer Community](/community) +This is a great place to get help from other developers who work on the BigCommerce platform. If you have BigCommerce specific questions this is the best place to ask. It’s also great for beginners to get assistance. + +### [Stack Overflow](https://stackoverflow.com/questions/tagged/bigcommerce) +Are you a more experienced developer or have a programming language specific question? This is a good place to ask questions and get help. The developer community is the best place to get answers about the BigCommerce platform specifically. + +If you need direct assistance, you can contact BigCommerce Support through [Live Chat, Phone Support, or Email Support](https://support.bigcommerce.com/s/contact). + +## Resources + +### Related Articles + +* [Page Builder](https://support.bigcommerce.com/s/article/Page-Builder) (BigCommerce Knowledge Base) +* [Personalizing Your Theme](https://support.bigcommerce.com/s/article/Stencil-Themes?language=en_US) (BigCommerce Knowledge Base) + +### Sample Apps + +* [Cornerstone Theme Demo](http://cornerstone-light-demo.mybigcommerce.com/) + +### Additional Resources +* [stencil-cli Repository](https://github.com/bigcommerce/stencil-cli) (BigCommerce GitHub) +* [Cornerstone Repository](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) +* [Cornerstone Theme Manual](https://support.bigcommerce.com/s/article/Cornerstone-Theme-Manual) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/getting-started/stencil-technology-stack.mdx b/docs/storefront/stencil/start/tech-stack.mdx similarity index 98% rename from docs/stencil-docs/getting-started/stencil-technology-stack.mdx rename to docs/storefront/stencil/start/tech-stack.mdx index 8d711166d..7fb30b99e 100644 --- a/docs/stencil-docs/getting-started/stencil-technology-stack.mdx +++ b/docs/storefront/stencil/start/tech-stack.mdx @@ -1,89 +1,89 @@ -# Stencil Technology Stack - - - -Stencil's use of Handlebars.js, JavaScript, and YAML Front Matter on the front end allows developers to create dynamic, templated customizations across a BigCommerce storefront. - -## Handlebars overview - -[Handlebars.js](https://handlebarsjs.com/) is a minimal templating language that allows developers to create dynamic and robust templates for any BigCommerce Stencil storefront. A Handlebars template looks like an HTML file, with the addition of Handlebars.js expressions for dynamic logic that can be embedded into the page. - -A Handlebars expression begins and end with curly braces. Below is a basic example. - -```handlebars filename="Using handlebars to access the {{title}} variable" showLineNumbers copy -<div class="entry"> - <h1>{{title}}</h1> - <div class="body"></div> -</div> -``` - -In production, Handlebars statements run on the server side, generating HTML received by the shopper’s browser. - -View the [full Handlebars Helpers Reference](/docs/storefront/stencil/themes/context/handlebars-reference) to learn about the helpers available on a Stencil storefront. - -## Stencil objects overview - -Stencil objects are the individual JavaScript objects that are rendered onto a Stencil storefront. The following example is the JavaScript Object Notation (JSON) for a [Banner object](/docs/storefront/stencil/themes/context/object-reference/config#global-objects_banner) rendered on a category page of a storefront. - -```json filename="Example banners object JSON for a banner object, accessible through Handlebars.js " showLineNumbers copy - "banners": { - "top": [ - "For the week of May 20th, all apparel available at the online store will be 25% off the standard store price." - ], - "bottom": [ ], - "top_metadata": [ - { - "id": "3", - "banner-name": "All Apparel 25% off for a limited time!", - "content": "<p>For the week of May 20th, all apparel available at the online store will be 25% off the standard store price.</p>", - "location": "top" - } - ] - } -``` - -![Banners Object (rendered)](https://storage.googleapis.com/bigcommerce-production-dev-center/images/banners-object-rendered.png "Banners Object (rendered)") - -As a developer, you can use Handlebars.js syntax to access objects and use them to customize your Stencil theme. - -Stencil objects are categorized as either Global, Common, or Other, which is representative of the object's scope or where in the theme it can be accessed. For example, Global Objects are components shared across the entire BigCommerce storefront. - -### Migration handlebars v3 to v4 -Depthed paths are now conditionally pushed onto the stack. If the helper uses the same context, then a new stack is not created. Any instances of ../ in templates must be checked for the correct behavior. See [handlebars.js](https://github.com/handlebars-lang/handlebars.js/issues/1028) documentation for more information. - - -## YAML front matter overview - -BigCommerce Stencil themes utilize YAML front matter on template pages. Front matter allows developers to request objects on the storefront, allowing developers to define each page's design and layout details. - - -When utilized, Front Matter must be the opening text of a file and must take the form of valid YAML set between triple-dashed lines. - -See our [Front Matter Reference](/docs/storefront/stencil/themes/context/frontmatter-reference) to see what Front Matter attributes are available on a Stencil storefront. Below is a snippet from the base Cornerstone theme's <span class="fn">home.html</span> file, showing how Front Matter can be used in a theme. - - -```yml filename="YAML Front Matter home.html, Cornerstone theme" showLineNumbers copy -products: - new: - limit: {{theme_settings.homepage_new_products_count}} - featured: - limit: {{theme_settings.homepage_featured_products_count}} - top_sellers: - limit: {{theme_settings.homepage_top_products_count}} -carousel: {{theme_settings.homepage_show_carousel}} -blog: - recent_posts: - limit: {{theme_settings.homepage_blog_posts_count}} -``` - -## Resources - -### Related Articles - -* [Handlebars.js documentation](https://handlebarsjs.com/) (Handlebars) - -### Additional Resources - -* [Stencil Technology Stack Video](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) -* [Cornerstone Components Subdirectory](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) - +# Stencil Technology Stack + + + +Stencil's use of Handlebars.js, JavaScript, and YAML Front Matter on the front end allows developers to create dynamic, templated customizations across a BigCommerce storefront. + +## Handlebars overview + +[Handlebars.js](https://handlebarsjs.com/) is a minimal templating language that allows developers to create dynamic and robust templates for any BigCommerce Stencil storefront. A Handlebars template looks like an HTML file, with the addition of Handlebars.js expressions for dynamic logic that can be embedded into the page. + +A Handlebars expression begins and end with curly braces. Below is a basic example. + +```handlebars filename="Using handlebars to access the {{title}} variable" showLineNumbers copy +<div class="entry"> + <h1>{{title}}</h1> + <div class="body"></div> +</div> +``` + +In production, Handlebars statements run on the server side, generating HTML received by the shopper’s browser. + +View the [full Handlebars Helpers Reference](/docs/storefront/stencil/themes/context/handlebars-reference) to learn about the helpers available on a Stencil storefront. + +## Stencil objects overview + +Stencil objects are the individual JavaScript objects that are rendered onto a Stencil storefront. The following example is the JavaScript Object Notation (JSON) for a [Banner object](/docs/storefront/stencil/themes/context/object-reference/config#global-objects_banner) rendered on a category page of a storefront. + +```json filename="Example banners object JSON for a banner object, accessible through Handlebars.js " showLineNumbers copy + "banners": { + "top": [ + "For the week of May 20th, all apparel available at the online store will be 25% off the standard store price." + ], + "bottom": [ ], + "top_metadata": [ + { + "id": "3", + "banner-name": "All Apparel 25% off for a limited time!", + "content": "<p>For the week of May 20th, all apparel available at the online store will be 25% off the standard store price.</p>", + "location": "top" + } + ] + } +``` + +![Banners Object (rendered)](https://storage.googleapis.com/bigcommerce-production-dev-center/images/banners-object-rendered.png "Banners Object (rendered)") + +As a developer, you can use Handlebars.js syntax to access objects and use them to customize your Stencil theme. + +Stencil objects are categorized as either Global, Common, or Other, which is representative of the object's scope or where in the theme it can be accessed. For example, Global Objects are components shared across the entire BigCommerce storefront. + +### Migration handlebars v3 to v4 +Depthed paths are now conditionally pushed onto the stack. If the helper uses the same context, then a new stack is not created. Any instances of ../ in templates must be checked for the correct behavior. See [handlebars.js](https://github.com/handlebars-lang/handlebars.js/issues/1028) documentation for more information. + + +## YAML front matter overview + +BigCommerce Stencil themes utilize YAML front matter on template pages. Front matter allows developers to request objects on the storefront, allowing developers to define each page's design and layout details. + + +When utilized, Front Matter must be the opening text of a file and must take the form of valid YAML set between triple-dashed lines. + +See our [Front Matter Reference](/docs/storefront/stencil/themes/context/frontmatter-reference) to see what Front Matter attributes are available on a Stencil storefront. Below is a snippet from the base Cornerstone theme's <span class="fn">home.html</span> file, showing how Front Matter can be used in a theme. + + +```yml filename="YAML Front Matter home.html, Cornerstone theme" showLineNumbers copy +products: + new: + limit: {{theme_settings.homepage_new_products_count}} + featured: + limit: {{theme_settings.homepage_featured_products_count}} + top_sellers: + limit: {{theme_settings.homepage_top_products_count}} +carousel: {{theme_settings.homepage_show_carousel}} +blog: + recent_posts: + limit: {{theme_settings.homepage_blog_posts_count}} +``` + +## Resources + +### Related Articles + +* [Handlebars.js documentation](https://handlebarsjs.com/) (Handlebars) + +### Additional Resources + +* [Stencil Technology Stack Video](https://bigcommerce.wistia.com/medias/9g0qjdhs8t) +* [Cornerstone Components Subdirectory](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) + diff --git a/docs/stencil-docs/storefront-customization/implementing-WCAG-guidelines.mdx b/docs/storefront/stencil/themes/accessibility/implementing-wcag-guidelines.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/implementing-WCAG-guidelines.mdx rename to docs/storefront/stencil/themes/accessibility/implementing-wcag-guidelines.mdx diff --git a/docs/stencil-docs/storefront-customization/theme-accessibility.mdx b/docs/storefront/stencil/themes/accessibility/index.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/theme-accessibility.mdx rename to docs/storefront/stencil/themes/accessibility/index.mdx diff --git a/docs/stencil-docs/storefront-customization/WCAG-compliance-levels.mdx b/docs/storefront/stencil/themes/accessibility/wcag-compliance-levels.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/WCAG-compliance-levels.mdx rename to docs/storefront/stencil/themes/accessibility/wcag-compliance-levels.mdx diff --git a/docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx b/docs/storefront/stencil/themes/checkout-enhancements/paypal-smart-buttons.mdx similarity index 97% rename from docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx rename to docs/storefront/stencil/themes/checkout-enhancements/paypal-smart-buttons.mdx index ce050c42a..e8ae50d10 100644 --- a/docs/stencil-docs/customizing-checkout/paypal-smart-buttons.mdx +++ b/docs/storefront/stencil/themes/checkout-enhancements/paypal-smart-buttons.mdx @@ -1,193 +1,193 @@ -# PayPal Smart Buttons - - -PayPal Smart Buttons are available on Cornerstone versions 2.6.0+ for merchants who have **PayPal powered by Braintree** or **PayPal Express Checkout** enabled on their store. - -Theme developers can enable Smart Buttons on a custom Stencil theme by adding the required settings to the <span class="fn">config.json</span> file. - -Merchants will have the ability to customize some style aspects of the PayPal payment buttons at checkout using Page Builder for stores that have PayPal powered by Braintree or PayPal Express Checkout enabled. To make PayPal Smart Buttons customizable with Page Builder, a theme developer will need to make its customization properties available by adding its schema to the <span class="fn">schema.json</span> file. - -## Enable Smart Buttons on Your Stencil Theme - -Smart Buttons are included on Cornerstone versions 2.6.0+. If your theme does not already include Smart Buttons, append the `paymentbuttons` settings to the _Settings_ object within your <span class="fn">config.json</span> file. See the code sample below. - -```json filename="Addition of paymentbuttons to 'settings' object config.json" showlineNumbers copy - "settings": { - "..." - "color_badge_product_sale_badges": "#007dc6", - "color_text_product_sale_badges": "#ffffff", - "color_hover_product_sale_badges": "#000000", - "restrict_to_login": false, - "swatch_option_size": "22x22", - "social_icon_placement_top": false, - "social_icon_placement_bottom": "bottom_none", - "geotrust_ssl_common_name": "", - "geotrust_ssl_seal_size": "M", - "navigation_design": "simple", - "price_ranges": true, - "pdp-price-label": "", - "pdp-sale-price-label": "Now:", - "pdp-non-sale-price-label": "Was:", - "pdp-retail-price-label": "MSRP:", - "paymentbuttons-paypal-layout": "horizontal", - "paymentbuttons-paypal-color": "gold", - "paymentbuttons-paypal-shape": "pill", - "paymentbuttons-paypal-size": "small", - "paymentbuttons-paypal-label": "checkout", - "paymentbuttons-paypal-tagline": true, - "paymentbuttons-paypal-fundingicons": false - }, -``` - -<Callout type="warning"> - -#### Page Builder Customization -Adding the above keys to the `config.json` file will enable Smart Buttons on a Stencil theme, however, the merchant will **not** be able to customize button styles with Page Builder unless setting configurations are added to the `schema.json` file. -</Callout> - - -<a id="page-builder"></a> - -## Enabling Smart Buttons Customization via Page Builder - -Merchants who enable PayPal powered by Braintree and PayPal Express Checkout can also customize PayPal Smart Buttons via Page Builder. As a theme developer, you can enable PayPal Smart Buttons customization via [Page Builder](https://github.com/bigcommerce/cornerstone/blob/master/schema.json), by appending the following object to the <span class="fn">schema.json</span> file: - - -```json Filename="Addition to schema.json file in order to enable Page Builder customization schema.json" showLineNumbers copy -{ - "name": "Payment Buttons", - "enable": "smartButtons", - "settings": [ - { - "type": "checkbox", - "label": "Show Paypal tagline", - "force_reload": true, - "id": "paymentbuttons-paypal-tagline" - }, - { - "type": "checkbox", - "label": "Show funding icons", - "force_reload": true, - "id": "paymentbuttons-paypal-fundingicons" - }, - { - "type": "select", - "label": "Button color", - "id": "paymentbuttons-paypal-color", - "force_reload": true, - "options": [ - { - "value": "gold", - "label": "Gold" - }, - { - "value": "blue", - "label": "Blue" - }, - { - "value": "silver", - "label": "Silver" - }, - { - "value": "black", - "label": "Black" - } - ] - }, - { - "type": "select", - "label": "Button shape", - "id": "paymentbuttons-paypal-shape", - "force_reload": true, - "options": [ - { - "value": "pill", - "label": "Pill" - }, - { - "value": "rect", - "label": "Rectangle" - } - ] - }, - { - "type": "select", - "label": "Button size", - "id": "paymentbuttons-paypal-size", - "force_reload": true, - "options": [ - { - "value": "small", - "label": "Small" - }, - { - "value": "medium", - "label": "Medium" - }, - { - "value": "large", - "label": "Large" - }, - { - "value": "responsive", - "label": "Responsive" - } - ] - }, - { - "type": "select", - "label": "Button content", - "id": "paymentbuttons-paypal-label", - "force_reload": true, - "options": [ - { - "value": "checkout", - "label": "Paypal Checkout" - }, - { - "value": "pay", - "label": "Pay with Paypal" - }, - { - "value": "buynow", - "label": "Buy Now" - }, - { - "value": "paypal", - "label": "Paypal" - } - ] - }, - { - "type": "select", - "label": "Display style", - "id": "paymentbuttons-paypal-layout", - "force_reload": true, - "options": [ - { - "value": "horizontal", - "label": "Show buttons horizontally" - }, - { - "value": "vertical", - "label": "Show buttons vertically" - } - ] -``` - -<Callout type="warning"> - -#### Mutually exclusive options -Some customization options are mutually exclusive, meaning when used in combination with other customization options, the smart button will completely fail to render on the page. -All mutually exclusive options are tied to the layout setting `vertical.` If your layout setting is `vertical,` take note of the following customization **restrictions**: - * If you have a layout setting of `vertical`, you **can not** have a button size of `small`. - * If you have a layout setting of `vertical`, you **can not** customize the `branding` of the button. - * If you have a layout setting of `vertical`, you **can not** customize the `tagline` of the button. - * If you have a layout setting of `vertical`, you **can not** customize the `funding icons` settings. -</Callout> - -## Resources - -### Related Articles - -* [PayPal Checkout Customization](https://developer.paypal.com/demo/checkout/#/pattern/checkout) (PayPal) +# PayPal Smart Buttons + + +PayPal Smart Buttons are available on Cornerstone versions 2.6.0+ for merchants who have **PayPal powered by Braintree** or **PayPal Express Checkout** enabled on their store. + +Theme developers can enable Smart Buttons on a custom Stencil theme by adding the required settings to the <span class="fn">config.json</span> file. + +Merchants will have the ability to customize some style aspects of the PayPal payment buttons at checkout using Page Builder for stores that have PayPal powered by Braintree or PayPal Express Checkout enabled. To make PayPal Smart Buttons customizable with Page Builder, a theme developer will need to make its customization properties available by adding its schema to the <span class="fn">schema.json</span> file. + +## Enable Smart Buttons on Your Stencil Theme + +Smart Buttons are included on Cornerstone versions 2.6.0+. If your theme does not already include Smart Buttons, append the `paymentbuttons` settings to the _Settings_ object within your <span class="fn">config.json</span> file. See the code sample below. + +```json filename="Addition of paymentbuttons to 'settings' object config.json" showlineNumbers copy + "settings": { + "..." + "color_badge_product_sale_badges": "#007dc6", + "color_text_product_sale_badges": "#ffffff", + "color_hover_product_sale_badges": "#000000", + "restrict_to_login": false, + "swatch_option_size": "22x22", + "social_icon_placement_top": false, + "social_icon_placement_bottom": "bottom_none", + "geotrust_ssl_common_name": "", + "geotrust_ssl_seal_size": "M", + "navigation_design": "simple", + "price_ranges": true, + "pdp-price-label": "", + "pdp-sale-price-label": "Now:", + "pdp-non-sale-price-label": "Was:", + "pdp-retail-price-label": "MSRP:", + "paymentbuttons-paypal-layout": "horizontal", + "paymentbuttons-paypal-color": "gold", + "paymentbuttons-paypal-shape": "pill", + "paymentbuttons-paypal-size": "small", + "paymentbuttons-paypal-label": "checkout", + "paymentbuttons-paypal-tagline": true, + "paymentbuttons-paypal-fundingicons": false + }, +``` + +<Callout type="warning"> + +#### Page Builder Customization +Adding the above keys to the `config.json` file will enable Smart Buttons on a Stencil theme, however, the merchant will **not** be able to customize button styles with Page Builder unless setting configurations are added to the `schema.json` file. +</Callout> + + +<a id="page-builder"></a> + +## Enabling Smart Buttons Customization via Page Builder + +Merchants who enable PayPal powered by Braintree and PayPal Express Checkout can also customize PayPal Smart Buttons via Page Builder. As a theme developer, you can enable PayPal Smart Buttons customization via [Page Builder](https://github.com/bigcommerce/cornerstone/blob/master/schema.json), by appending the following object to the <span class="fn">schema.json</span> file: + + +```json Filename="Addition to schema.json file in order to enable Page Builder customization schema.json" showLineNumbers copy +{ + "name": "Payment Buttons", + "enable": "smartButtons", + "settings": [ + { + "type": "checkbox", + "label": "Show Paypal tagline", + "force_reload": true, + "id": "paymentbuttons-paypal-tagline" + }, + { + "type": "checkbox", + "label": "Show funding icons", + "force_reload": true, + "id": "paymentbuttons-paypal-fundingicons" + }, + { + "type": "select", + "label": "Button color", + "id": "paymentbuttons-paypal-color", + "force_reload": true, + "options": [ + { + "value": "gold", + "label": "Gold" + }, + { + "value": "blue", + "label": "Blue" + }, + { + "value": "silver", + "label": "Silver" + }, + { + "value": "black", + "label": "Black" + } + ] + }, + { + "type": "select", + "label": "Button shape", + "id": "paymentbuttons-paypal-shape", + "force_reload": true, + "options": [ + { + "value": "pill", + "label": "Pill" + }, + { + "value": "rect", + "label": "Rectangle" + } + ] + }, + { + "type": "select", + "label": "Button size", + "id": "paymentbuttons-paypal-size", + "force_reload": true, + "options": [ + { + "value": "small", + "label": "Small" + }, + { + "value": "medium", + "label": "Medium" + }, + { + "value": "large", + "label": "Large" + }, + { + "value": "responsive", + "label": "Responsive" + } + ] + }, + { + "type": "select", + "label": "Button content", + "id": "paymentbuttons-paypal-label", + "force_reload": true, + "options": [ + { + "value": "checkout", + "label": "Paypal Checkout" + }, + { + "value": "pay", + "label": "Pay with Paypal" + }, + { + "value": "buynow", + "label": "Buy Now" + }, + { + "value": "paypal", + "label": "Paypal" + } + ] + }, + { + "type": "select", + "label": "Display style", + "id": "paymentbuttons-paypal-layout", + "force_reload": true, + "options": [ + { + "value": "horizontal", + "label": "Show buttons horizontally" + }, + { + "value": "vertical", + "label": "Show buttons vertically" + } + ] +``` + +<Callout type="warning"> + +#### Mutually exclusive options +Some customization options are mutually exclusive, meaning when used in combination with other customization options, the smart button will completely fail to render on the page. +All mutually exclusive options are tied to the layout setting `vertical.` If your layout setting is `vertical,` take note of the following customization **restrictions**: + * If you have a layout setting of `vertical`, you **can not** have a button size of `small`. + * If you have a layout setting of `vertical`, you **can not** customize the `branding` of the button. + * If you have a layout setting of `vertical`, you **can not** customize the `tagline` of the button. + * If you have a layout setting of `vertical`, you **can not** customize the `funding icons` settings. +</Callout> + +## Resources + +### Related Articles + +* [PayPal Checkout Customization](https://developer.paypal.com/demo/checkout/#/pattern/checkout) (PayPal) diff --git a/docs/stencil-docs/developing-further/stored-credit-card-management.mdx b/docs/storefront/stencil/themes/checkout-enhancements/stored-payment-methods.mdx similarity index 97% rename from docs/stencil-docs/developing-further/stored-credit-card-management.mdx rename to docs/storefront/stencil/themes/checkout-enhancements/stored-payment-methods.mdx index 588965808..13964a103 100644 --- a/docs/stencil-docs/developing-further/stored-credit-card-management.mdx +++ b/docs/storefront/stencil/themes/checkout-enhancements/stored-payment-methods.mdx @@ -1,228 +1,228 @@ -# Adding Stored Payment Methods - -The [Cornerstone 2.6.0 release](/release-notes#posts/cornerstone-2-6-0-release) added stored payment method management for saved credit cards to the customer `account.php` page. The [Cornerstone 4.4.0 release](/release-notes#posts/cornerstone-4-4-0-release) expanded this functionality to include saving PayPal accounts using [PayPal Powered by Braintree](https://support.bigcommerce.com/s/article/Connecting-with-PayPal-Powered-by-Braintree). - -This article contains instructions for manually applying the changes made in `4.4.0` to themes version `2.6.0 ` to `4.3.1`. For a full diff of the files to change, see [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files). If you're developing on a theme older than version `2.6.0` you'll first need to apply the changes made in `2.6.0`; to do so, see [Stored Credit Card Management](/archive/storefront/stencil/stored-credit-card-management). For theme update best practices, see [Theme Updates and Version Control](/docs/storefront/stencil/deployment/updates-and-version-control). - -![Save PayPal Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management02.png "Save PayPal Account") - -## Update `config.json` - -In `config.json`, replace `account_payment_methods` in the `features` array with `account_payment_methods_v2` and add `csrf_protection`: - -```json filename="config.json" showLineNumbers copy -{ - "name": "Cornerstone", - "version": "4.3.1", - "meta": { - ... - "features": [ - "fully_responsive", - "mega_navigation", - ... - "csrf_protection", // add csrf_protection - "account_payment_methods" // replace with account_payment_methods_v2 - ] - } -} -``` - -To enable saving PayPal accounts, credit cards, and other non-credit card payment methods using the theme, [add the supported_payment_methods array (GitHub)](https://github.com/leeBigCommerce/cornerstone/blob/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/config.json#L325) and append `card` and `paypal` to it: - -```json filename="config.json" showLineNumbers copy -{ - ... - "supported_card_type_icons": [ - ... - ], - "supported_payment_methods": [ // Add supported_payment_methods array - "card", // allowlist card and paypal - "paypal" - ], - "lazyload_mode": "lazyload+lqip" - ... -} -``` - -To see the full diff, refer to [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-06b2d3b23dce96e1619d2b53d6c947ec). - -## Update payment-methods-list.html - -After you make the preceding config changes, you can pass a new version of the `payment_methods` object to the template. - -To use the updated object, apply the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to `payment-methods-list.html`. - -The updated object shows saved PayPal accounts in the payment method list. - -![Payment Method List](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management01.png "Payment Method List") - -## Update edit-payment-method.html - -The `customer.edit_stored_instrument` object has been lightly extended to include a `type` attribute. - -Using `type`, you can show or hide fields based on whether the current instrument is a `stored_card` or `stored_paypal_account`. The type is also passed to the form handler in a hidden input so the handler can update the instrument accordingly. - -Modify `edit-payment-method.html` to include changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to add the new user interface elements and behavior. - -## Update `_paymentMethods.scss` - -To style the newly added UI elements, update `_paymentMethods.scss` with the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=#diff-1c33ed0c69f228483a39fce2616e1942). - -## Add PayPal Logo - -The changes to `payment-methods-list.html` include a PayPal logo that's displayed on the payment method cards: - -```handlebars showLineNumbers copy -<img class="methodHeader-icon" src="{{cdn 'img/payment-methods/paypal.svg'}}" alt="{{lang 'account.payment_methods.paypal'}}" title="{{lang 'account.payment_methods.paypal'}}"> -``` - -Use the command line to download the `.svg` and save it to `assets/img/payment-methods`: - -```bash showLineNumbers copy -cd assets/img/payment-methods/paypal.svg -curl -O https://raw.githubusercontent.com/leeBigCommerce/cornerstone/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/assets/img/payment-methods/paypal.svg -``` - -## Update en.json - -At minimum, an English translation needs to be added to `lang/en.json`: [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-b0d4c1fc9d8d2a5a213b27a72cf6c9fe). Add translations for other locales as needed. - - -## Manage stored account payments - -After adding a [stored payment method](https://support.bigcommerce.com/s/article/Enabling-Stored-Payment-Methods?language=en_US), shoppers can use the Storefront account payments microapp to manage their stored payment instruments. The microapp provides a payment method form with billing address fields. Currently, the microapp works with Adyen. Plans include expanding the number of supported payment processors. - -### Install the microapp - -To install the Storefront account payments microapp to your theme, inject the `account_payments` variable into the `add-payment-method.html` template. - -```handlebars showLineNumbers copy -{{#if account_payments}} - {{{ account_payments }}} - <script> - window.BigCommerce = window.BigCommerce || {}; - </script> -{{/if}} -``` - -The `account_payments` variable includes the `<div>` element that renders the microapp and a script tag containing the microapp URL. If the `window.BigCommerce` object does not yet exist, insert a script to create it. - -If the selected payment provider already has an integration with the Storefront account payments microapp, [initializing window.BigCommerce.renderAccountPayments](#initialize-the-microapp) renders the microapp automatically. - -If the selected payment provider does not have an integration with the microapp, the `account_payments` variable is undefined and the fallback payment form renders. See an example of a fallback payment form and the conditional rendering logic from the [Cornerstone theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L45). - -### Initialize the microapp - -Initialize the microapp by calling the `renderAccountPayments()` method of the storefront browser's `window.BigCommerce` object. The Cornerstore theme initializes the microapp in the `account.js` file. - -The `renderAccountPayments()` method takes the following three parameters: - -* `style` - an options **object** for customizing the look of the microapp form. May be empty. -* `storeContextData` - an **object** that supplies store context. -* `errorHandler` - a **function** that the microapp calls if the payments form submission fails. - -```js filename="Example renderAccountPayments() wrapper function" copy -const initializeMicroapp = (style, storeContextData, errorHandler) => window.BigCommerce.renderAccountPayments(style, storeContextData, errorHandler); -``` - -This [Cornerstone example (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/account.js#L102) initializes `window.BigCommerce.renderAccountPayments` using JavaScript. - -The following example expresses the method's parameters as a TypeScript interface: - -```ts filename="Example interface for renderAccountPayments()" showLineNumbers copy -interface AppConfigInterface { - styles?: AppStyles; - storeContextData: StoreContextDataInterface; - errorHandler(error: string): void; -} -``` - -The following TypeScript interfaces express the data structures and types that `renderAccountPayments()` expects: - -```ts showLineNumbers copy -interface AppStyles { - inputBase?: CSSProperties; - inputValidationError?: CSSProperties; - inputValidationSuccess?: CSSProperties; - submitButton?: CSSProperties; - cancelButton?: CSSProperties; - label?: CSSProperties; - inputWrapper?: CSSProperties; - validationError?: CSSProperties; - heading?: CSSProperties; - formRow?: CSSProperties; - formActions?: CSSProperties; -} - -interface StoreContextDataInterface { - countries: Country[]; - paymentsUrl: string; - storeHash: string; - storeLocale: string; - vaultToken: string; - shopperId: string; - customerEmail: string; - providerId: PaymentProviders; - currencyCode: string; - paymentMethodsUrl: string; - paymentProviderInitializationData: PaymentProviderInitializationData; -} - -type PaymentProviderInitializationData = - AdyenV2InitializationData - | AdyenV3InitializationData; - -interface AdyenV2InitializationData { - clientKey?: string; - environment: string; - gateway: string; - originKey: string; -} - -interface AdyenV3InitializationData { - clientKey: string; - environment: string; - gateway: string; - originKey?: string; -} - -interface Country { - code: string; - label: string; - states?: State[]; - value: string; -} - -interface State { - code: string; - name: string; - value: string; -} - -enum PaymentProviders { - Adyenv2 = 'adyenv2', - Adyenv3 = 'adyenv3', -} -``` - -## FAQ - -**Where is the card data stored?** - -Card data is stored securely with the payment gateway. - -**Is storing credit cards PCI compliant?** - -Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. - -**Can shoppers modify their stored card?** - -After adding a card, shoppers can modify the billing address. To modify other the other details, shoppers will need to delete and re-add the card. - -## Resources - -### Related articles - -* [Payments API](/docs/store-operations/payments) -* [Enabling Stored Cards (Help Center)](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) -* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) +# Adding Stored Payment Methods + +The [Cornerstone 2.6.0 release](/release-notes#posts/cornerstone-2-6-0-release) added stored payment method management for saved credit cards to the customer `account.php` page. The [Cornerstone 4.4.0 release](/release-notes#posts/cornerstone-4-4-0-release) expanded this functionality to include saving PayPal accounts using [PayPal Powered by Braintree](https://support.bigcommerce.com/s/article/Connecting-with-PayPal-Powered-by-Braintree). + +This article contains instructions for manually applying the changes made in `4.4.0` to themes version `2.6.0 ` to `4.3.1`. For a full diff of the files to change, see [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files). If you're developing on a theme older than version `2.6.0` you'll first need to apply the changes made in `2.6.0`; to do so, see [Stored Credit Card Management](/archive/storefront/stencil/stored-credit-card-management). For theme update best practices, see [Theme Updates and Version Control](/docs/storefront/stencil/deployment/updates-and-version-control). + +![Save PayPal Account](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management02.png "Save PayPal Account") + +## Update `config.json` + +In `config.json`, replace `account_payment_methods` in the `features` array with `account_payment_methods_v2` and add `csrf_protection`: + +```json filename="config.json" showLineNumbers copy +{ + "name": "Cornerstone", + "version": "4.3.1", + "meta": { + ... + "features": [ + "fully_responsive", + "mega_navigation", + ... + "csrf_protection", // add csrf_protection + "account_payment_methods" // replace with account_payment_methods_v2 + ] + } +} +``` + +To enable saving PayPal accounts, credit cards, and other non-credit card payment methods using the theme, [add the supported_payment_methods array (GitHub)](https://github.com/leeBigCommerce/cornerstone/blob/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/config.json#L325) and append `card` and `paypal` to it: + +```json filename="config.json" showLineNumbers copy +{ + ... + "supported_card_type_icons": [ + ... + ], + "supported_payment_methods": [ // Add supported_payment_methods array + "card", // allowlist card and paypal + "paypal" + ], + "lazyload_mode": "lazyload+lqip" + ... +} +``` + +To see the full diff, refer to [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-06b2d3b23dce96e1619d2b53d6c947ec). + +## Update payment-methods-list.html + +After you make the preceding config changes, you can pass a new version of the `payment_methods` object to the template. + +To use the updated object, apply the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to `payment-methods-list.html`. + +The updated object shows saved PayPal accounts in the payment method list. + +![Payment Method List](https://raw.githubusercontent.com/bigcommerce/dev-docs/master/assets/images/stored-credit-card-management01.png "Payment Method List") + +## Update edit-payment-method.html + +The `customer.edit_stored_instrument` object has been lightly extended to include a `type` attribute. + +Using `type`, you can show or hide fields based on whether the current instrument is a `stored_card` or `stored_paypal_account`. The type is also passed to the form handler in a hidden input so the handler can update the instrument accordingly. + +Modify `edit-payment-method.html` to include changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html) to add the new user interface elements and behavior. + +## Update `_paymentMethods.scss` + +To style the newly added UI elements, update `_paymentMethods.scss` with the changes from [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=#diff-1c33ed0c69f228483a39fce2616e1942). + +## Add PayPal Logo + +The changes to `payment-methods-list.html` include a PayPal logo that's displayed on the payment method cards: + +```handlebars showLineNumbers copy +<img class="methodHeader-icon" src="{{cdn 'img/payment-methods/paypal.svg'}}" alt="{{lang 'account.payment_methods.paypal'}}" title="{{lang 'account.payment_methods.paypal'}}"> +``` + +Use the command line to download the `.svg` and save it to `assets/img/payment-methods`: + +```bash showLineNumbers copy +cd assets/img/payment-methods/paypal.svg +curl -O https://raw.githubusercontent.com/leeBigCommerce/cornerstone/54f5681a6a15cd8477c51c6db9eb54ea3eb40972/assets/img/payment-methods/paypal.svg +``` + +## Update en.json + +At minimum, an English translation needs to be added to `lang/en.json`: [Cornerstone pull request 1603 (GitHub)](https://github.com/bigcommerce/cornerstone/pull/1603/files?file-filters%5B%5D=.html&file-filters%5B%5D=.json&file-filters%5B%5D=.md#diff-b0d4c1fc9d8d2a5a213b27a72cf6c9fe). Add translations for other locales as needed. + + +## Manage stored account payments + +After adding a [stored payment method](https://support.bigcommerce.com/s/article/Enabling-Stored-Payment-Methods?language=en_US), shoppers can use the Storefront account payments microapp to manage their stored payment instruments. The microapp provides a payment method form with billing address fields. Currently, the microapp works with Adyen. Plans include expanding the number of supported payment processors. + +### Install the microapp + +To install the Storefront account payments microapp to your theme, inject the `account_payments` variable into the `add-payment-method.html` template. + +```handlebars showLineNumbers copy +{{#if account_payments}} + {{{ account_payments }}} + <script> + window.BigCommerce = window.BigCommerce || {}; + </script> +{{/if}} +``` + +The `account_payments` variable includes the `<div>` element that renders the microapp and a script tag containing the microapp URL. If the `window.BigCommerce` object does not yet exist, insert a script to create it. + +If the selected payment provider already has an integration with the Storefront account payments microapp, [initializing window.BigCommerce.renderAccountPayments](#initialize-the-microapp) renders the microapp automatically. + +If the selected payment provider does not have an integration with the microapp, the `account_payments` variable is undefined and the fallback payment form renders. See an example of a fallback payment form and the conditional rendering logic from the [Cornerstone theme](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/account/add-payment-method.html#L45). + +### Initialize the microapp + +Initialize the microapp by calling the `renderAccountPayments()` method of the storefront browser's `window.BigCommerce` object. The Cornerstone theme initializes the microapp in the `account.js` file. + +The `renderAccountPayments()` method takes the following three parameters: + +* `style` - an options **object** for customizing the look of the microapp form. May be empty. +* `storeContextData` - an **object** that supplies store context. +* `errorHandler` - a **function** that the microapp calls if the payments form submission fails. + +```js filename="Example renderAccountPayments() wrapper function" copy +const initializeMicroapp = (style, storeContextData, errorHandler) => window.BigCommerce.renderAccountPayments(style, storeContextData, errorHandler); +``` + +This [Cornerstone example (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/assets/js/theme/account.js#L102) initializes `window.BigCommerce.renderAccountPayments` using JavaScript. + +The following example expresses the method's parameters as a TypeScript interface: + +```ts filename="Example interface for renderAccountPayments()" showLineNumbers copy +interface AppConfigInterface { + styles?: AppStyles; + storeContextData: StoreContextDataInterface; + errorHandler(error: string): void; +} +``` + +The following TypeScript interfaces express the data structures and types that `renderAccountPayments()` expects: + +```ts showLineNumbers copy +interface AppStyles { + inputBase?: CSSProperties; + inputValidationError?: CSSProperties; + inputValidationSuccess?: CSSProperties; + submitButton?: CSSProperties; + cancelButton?: CSSProperties; + label?: CSSProperties; + inputWrapper?: CSSProperties; + validationError?: CSSProperties; + heading?: CSSProperties; + formRow?: CSSProperties; + formActions?: CSSProperties; +} + +interface StoreContextDataInterface { + countries: Country[]; + paymentsUrl: string; + storeHash: string; + storeLocale: string; + vaultToken: string; + shopperId: string; + customerEmail: string; + providerId: PaymentProviders; + currencyCode: string; + paymentMethodsUrl: string; + paymentProviderInitializationData: PaymentProviderInitializationData; +} + +type PaymentProviderInitializationData = + AdyenV2InitializationData + | AdyenV3InitializationData; + +interface AdyenV2InitializationData { + clientKey?: string; + environment: string; + gateway: string; + originKey: string; +} + +interface AdyenV3InitializationData { + clientKey: string; + environment: string; + gateway: string; + originKey?: string; +} + +interface Country { + code: string; + label: string; + states?: State[]; + value: string; +} + +interface State { + code: string; + name: string; + value: string; +} + +enum PaymentProviders { + Adyenv2 = 'adyenv2', + Adyenv3 = 'adyenv3', +} +``` + +## FAQ + +**Where is the card data stored?** + +Card data is stored securely with the payment gateway. + +**Is storing credit cards PCI compliant?** + +Card data is stored securely with the payment gateway. The BigCommerce store is NOT storing the payment data. + +**Can shoppers modify their stored card?** + +After adding a card, shoppers can modify the billing address. To modify other the other details, shoppers will need to delete and re-add the card. + +## Resources + +### Related articles + +* [Payments API](/docs/store-operations/payments) +* [Enabling Stored Cards (Help Center)](https://support.bigcommerce.com/s/article/Enabling-Stored-Credit-Cards) +* [The Complete Guide to Checkout Customization on BigCommerce (Developer Blog)](https://medium.com/bigcommerce-developer-blog/the-complete-guide-to-checkout-customization-on-bigcommerce-6b566bc36fa9) diff --git a/docs/stencil-docs/page-builder/wallet-buttons.mdx b/docs/storefront/stencil/themes/checkout-enhancements/wallet-buttons.mdx similarity index 100% rename from docs/stencil-docs/page-builder/wallet-buttons.mdx rename to docs/storefront/stencil/themes/checkout-enhancements/wallet-buttons.mdx diff --git a/docs/stencil-docs/developing-further/catalog-price-object.mdx b/docs/storefront/stencil/themes/context/catalog-price-object.mdx similarity index 97% rename from docs/stencil-docs/developing-further/catalog-price-object.mdx rename to docs/storefront/stencil/themes/context/catalog-price-object.mdx index 004306eb8..64e1712ce 100644 --- a/docs/stencil-docs/developing-further/catalog-price-object.mdx +++ b/docs/storefront/stencil/themes/context/catalog-price-object.mdx @@ -1,305 +1,305 @@ -# Using Catalog Price Objects - - - -As a theme developer, you can use the catalog price object to highlight the savings that a merchant is offering over the MSRP directly on the storefront by referencing the product's `price` object and the correct property for the product. - -Merchants can use control panel options to set the following prices for a catalog product: - -| Field | Description | -| ----------- | ----------- | -| Default Price | This is the product’s standard store price. The **Excluding/Including Tax** indicator to the right of the **Default Price** field is applicable to all price fields (**Cost**, **MSRP**, **Sale Price**).| -| Cost | The product's `cost` property is never returned to the storefront by design. Generally, merchants would not want to reveal the true cost of goods to shoppers. The **Cost** field is meant for reports and third-party accounting integrations.| -| MSRP | This field contains the manufacturer's suggested retail price, a price recommended for the sale of an item in all retail outlets. | -| Sale Price | This field is the product's reduced store price. A sale price set to zero will result in no charge to the shopper. | - - -These options and assigned values are each represented in the catalog price object, allowing theme developers to pull the information and render it onto the storefront to highlight the savings offered by a merchant. - -## Catalog price object examples excluding tax - -### No sale price defined in control panel - -Assume that a merchant has defined the following for a product in the control panel: - -* **Default Price** -* **Cost** -* **MSRP** - -A corresponding catalog price object for the product will be structured as shown below: - -```json filename="Catalog price object, no sale price defined" showLineNumbers copy -{ - "product": { - // ... - }, - "price": { - "without_tax": { - "formatted": "$20.00", - "value": 20 - }, - "tax_label": "Sales Tax", - "rrp_without_tax": { - "formatted": "$25.00", - "value": 25 - }, - "saved": { - "formatted": "$5.00", - "value": 5 - }, - "retail_price_range": { - "min": { - "without_tax": { - "formatted": "$25.00", - "value": 25 - } - }, - "max": { - "without_tax": { - "formatted": "$25.00", - "value": 25 - } - } - } - } -} -``` - -In this example: - -| Property | Description | -| ----------- | ----------- | -| `without_tax` | This property maps to the control panel’s **Default Price** field.| -| `rrp_without_tax` | `rrp` stands for "regular retail price." This property maps to the control panel's **MSRP** field.| -| `saved` | This value is the difference between the existing values for `without_tax` (**Default Price**) and `rrp_without_tax` (**MSRP**).| - -### Sale price defined in control panel - -Assume that a merchant has defined the following for a product in the control panel: - -* **Default Price** -* **Cost** -* **MSRP** -* **Sale Price** - -A corresponding catalog price object for the product will be structured as shown below: - - -```json filename="Catalog price object, sale price defined" showLineNumbers copy -{ - "product": { - // ... - "price": { - "without_tax": { - "formatted": "$15.00", - "value": 15 - }, - "tax_label": "Sales Tax", - "sale_price_without_tax": { - "formatted": "$15.00", - "value": 15 - }, - "non_sale_price_without_tax": { - "formatted": "$20.00", - "value": 20 - }, - "rrp_without_tax": { - "formatted": "$25.00", - "value": 25 - }, - "saved": { - "formatted": "$10.00", - "value": 10 - }, - "retail_price_range": { - "min": { - "without_tax": { - "formatted": "$25.00", - "value": 25 - } - }, - "max": { - "without_tax": { - "formatted": "$25.00", - "value": 25 - } - } - } - } - } -} -``` - -In this example: - -| Property | Description | -| ----------- | ----------- | -| `sale_price_without_tax` | This property maps to the product’s effective price in the control panel's **Sale Price** field. The `sale_price_without_tax` property will directly expose the sale price set on a base product, variant, or price record.| -| `non_sale_price_without_tax` | This property displays the regular store price.| - -Properties noted will only be displayed if a sale price is set on the product. - -### Prices and conditional logic example - -Stencil structures product prices for backward compatibility with the BigCommerce platform's traditional treatment of prices. This behavior enables you to add logic that determines whether to display a strikeout price on the storefront. - -The example below tests for the presence of the `sale_price_without_tax` property. (You could also look for the `sale_price_with_tax` property.) The presence of the `sale_price_without_tax` property means that the product has been given a sale price. - -With the logic below, the page will display a strikeout standard price next to the **Sale Price** field, indicating the current selling price of the product. - - -```handlebars filename="Conditional logic" showLineNumbers copy - {{#or price.sale_price_without_tax price.sale_price_with_tax}} - ... [code to display on-sale strikeout pricing or content for a discounted product] ... - {{/or}} -``` - -## Catalog price object examples including and excluding tax - -Depending on the store’s [**Tax Display Settings**](https://login.bigcommerce.com/deep-links/manage/settings/tax/settings), the `price` object will display prices in one of the following ways: - -* **Including tax** -* **Excluding tax** -* **Including and excluding tax** - -This display setting affects how values are returned in the catalog price object and how the values appear on storefront pages. - -![Configure tax display settings](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Tax-Settings.png "Configure tax display settings.") - -### No sale price defined in control panel - -Assume that a merchant has defined the following tax configurations for a product in the control panel: - -* Show prices on product pages including and excluding tax -* Use a flat rate of 10% tax - -There is no defined sale price for the product. - -A corresponding catalog price object will be structured as shown below: - -```json filename="Product including and excluding tax, no sale price defined" showLineNumbers copy -{ - "product": { - "price": { - "with_tax": { - "formatted": "$165.00", - "value": 165 - }, - "without_tax": { - "formatted": "$150.00", - "value": 150 - }, - "rrp_with_tax": { - "formatted": "$275.00", - "value": 275 - }, - "rrp_without_tax": { - "formatted": "$250.00", - "value": 250 - }, - "saved": { - "formatted": "$110.00", - "value": 110 - }, - "tax_label": "Tax" - } - } -} -``` - -In this example: - -| Property | Description | -| ----------- | ----------- | -| `with_tax` | This property represents the `without_tax` value plus a 10% tax markup.| -| `rrp_with_tax` | This property represents the `rrp_without_tax` value plus a 10% tax markup.| - -<Callout type="warning"> - - #### Tax display configurations - The same properties and values are returned for **Including tax** and **Including and excluding tax** display settings. These properties and values are not available for a control panel setting of **Excluding tax**. - </Callout> - -### Sale price defined in control panel - -Assume that a merchant has defined the following tax configurations for a product in the control panel, alongside a defined sale price: - -* Show prices on product pages including and excluding tax -* Use a flat rate of 10% tax - -```json filename="Product including and excluding tax, sale price defined" showLineNumbers copy -{ - "product": { - "price": { - "with_tax": { - "formatted": "$135.30", - "value": 135.3 - }, - "without_tax": { - "formatted": "$123.00", - "value": 123 - }, - "sale_price_without_tax": { - "formatted": "123.00", - "value": 123 - }, - "sale_price_with_tax": { - "formatted": "135.30", - "value": 135.3 - }, - "rrp_with_tax": { - "formatted": "$275.00", - "value": 275 - }, - "rrp_without_tax": { - "formatted": "$250.00", - "value": 250 - }, - "saved": { - "formatted": "$139.70", - "value": 139.7 - }, - "non_sale_price_without_tax": { - "formatted": "$150.00", - "value": 150 - }, - "non_sale_price_with_tax": { - "formatted": "$165.00", - "value": 165 - }, - "tax_label": "Tax" - } - } -} -``` - -In this example: - -| Property | Description | -| ----------- | ----------- | -| `non_sale_price_with_tax` | This property represents the standard store price with tax.| -| `non_sale_price_without_tax` | This property represents the standard store price without tax.| -| `sale_price_with_tax` and `sale_price_without_tax` | These properties represent the product's defined sale price.| -| `saved` | This value is based on the difference between the `with_tax` and `non_sale_price_with_tax` values.| - -## Control panel quick reference - -The table below explains the mapping between the control panel fields and the catalog price object properties and values. - -| Field | Catalog Price Object Property | Description | -| ----------- | ----------- | ----------- | -| Default Price (excluding tax) |<ul><li>**Sale Price** is defined:</li> `{{ product.price.non_sale_price_without_tax }}`<li>**Sale Price** is not defined:</li> `{{ product.price.without_tax }}`</ul>| The standard store price for the product. | - Default Price (including tax) |<ul><li>**Sale Price** is defined:</li> `{{ product.price.non_sale_price_with_tax }}`<li>**Sale Price** is not defined:</li> `{{ product.price.with_tax }}`</ul>| The standard store price for the product, with tax. | - Cost |Cost is not returned in the catalog price object.| This field represents true cost of goods, and is typically meant for reports and third-party accounting integrations. | -MSRP (excluding tax)|`{{ product.price.rrp_without_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price. | -MSRP (including tax)|`{{ product.price.rrp_with_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price, including tax. | -Sale Price (excluding tax)|`{{product.price.sale_price_without_tax}}`| This product’s discounted/sale price. | -Sale Price (including tax)|`{{ product.sale_price_with_tax }}`| This product’s discounted/sale price, with tax. | -Difference between Default Price and MSRP (*Default Price - MSRP)*|`{{ product.price.saved }}`| The customer’s savings on the effective price versus list price. | - -## Resources - -### Related Articles - -* [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config) -* [Adding a Product](https://support.bigcommerce.com/s/article/Adding-Products-v3#product-details) (BigCommerce Knowledge Base) +# Using Catalog Price Objects + + + +As a theme developer, you can use the catalog price object to highlight the savings that a merchant is offering over the MSRP directly on the storefront by referencing the product's `price` object and the correct property for the product. + +Merchants can use control panel options to set the following prices for a catalog product: + +| Field | Description | +| ----------- | ----------- | +| Default Price | This is the product’s standard store price. The **Excluding/Including Tax** indicator to the right of the **Default Price** field is applicable to all price fields (**Cost**, **MSRP**, **Sale Price**).| +| Cost | The product's `cost` property is never returned to the storefront by design. Generally, merchants would not want to reveal the true cost of goods to shoppers. The **Cost** field is meant for reports and third-party accounting integrations.| +| MSRP | This field contains the manufacturer's suggested retail price, a price recommended for the sale of an item in all retail outlets. | +| Sale Price | This field is the product's reduced store price. A sale price set to zero will result in no charge to the shopper. | + + +These options and assigned values are each represented in the catalog price object, allowing theme developers to pull the information and render it onto the storefront to highlight the savings offered by a merchant. + +## Catalog price object examples excluding tax + +### No sale price defined in control panel + +Assume that a merchant has defined the following for a product in the control panel: + +* **Default Price** +* **Cost** +* **MSRP** + +A corresponding catalog price object for the product will be structured as shown below: + +```json filename="Catalog price object, no sale price defined" showLineNumbers copy +{ + "product": { + // ... + }, + "price": { + "without_tax": { + "formatted": "$20.00", + "value": 20 + }, + "tax_label": "Sales Tax", + "rrp_without_tax": { + "formatted": "$25.00", + "value": 25 + }, + "saved": { + "formatted": "$5.00", + "value": 5 + }, + "retail_price_range": { + "min": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + }, + "max": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + } + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `without_tax` | This property maps to the control panel’s **Default Price** field.| +| `rrp_without_tax` | `rrp` stands for "regular retail price." This property maps to the control panel's **MSRP** field.| +| `saved` | This value is the difference between the existing values for `without_tax` (**Default Price**) and `rrp_without_tax` (**MSRP**).| + +### Sale price defined in control panel + +Assume that a merchant has defined the following for a product in the control panel: + +* **Default Price** +* **Cost** +* **MSRP** +* **Sale Price** + +A corresponding catalog price object for the product will be structured as shown below: + + +```json filename="Catalog price object, sale price defined" showLineNumbers copy +{ + "product": { + // ... + "price": { + "without_tax": { + "formatted": "$15.00", + "value": 15 + }, + "tax_label": "Sales Tax", + "sale_price_without_tax": { + "formatted": "$15.00", + "value": 15 + }, + "non_sale_price_without_tax": { + "formatted": "$20.00", + "value": 20 + }, + "rrp_without_tax": { + "formatted": "$25.00", + "value": 25 + }, + "saved": { + "formatted": "$10.00", + "value": 10 + }, + "retail_price_range": { + "min": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + }, + "max": { + "without_tax": { + "formatted": "$25.00", + "value": 25 + } + } + } + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `sale_price_without_tax` | This property maps to the product’s effective price in the control panel's **Sale Price** field. The `sale_price_without_tax` property will directly expose the sale price set on a base product, variant, or price record.| +| `non_sale_price_without_tax` | This property displays the regular store price.| + +Properties noted will only be displayed if a sale price is set on the product. + +### Prices and conditional logic example + +Stencil structures product prices for backward compatibility with the BigCommerce platform's traditional treatment of prices. This behavior enables you to add logic that determines whether to display a strikeout price on the storefront. + +The example below tests for the presence of the `sale_price_without_tax` property. (You could also look for the `sale_price_with_tax` property.) The presence of the `sale_price_without_tax` property means that the product has been given a sale price. + +With the logic below, the page will display a strikeout standard price next to the **Sale Price** field, indicating the current selling price of the product. + + +```handlebars filename="Conditional logic" showLineNumbers copy + {{#or price.sale_price_without_tax price.sale_price_with_tax}} + ... [code to display on-sale strikeout pricing or content for a discounted product] ... + {{/or}} +``` + +## Catalog price object examples including and excluding tax + +Depending on the store’s [**Tax Display Settings**](https://login.bigcommerce.com/deep-links/manage/settings/tax/settings), the `price` object will display prices in one of the following ways: + +* **Including tax** +* **Excluding tax** +* **Including and excluding tax** + +This display setting affects how values are returned in the catalog price object and how the values appear on storefront pages. + +![Configure tax display settings](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Tax-Settings.png "Configure tax display settings.") + +### No sale price defined in control panel + +Assume that a merchant has defined the following tax configurations for a product in the control panel: + +* Show prices on product pages including and excluding tax +* Use a flat rate of 10% tax + +There is no defined sale price for the product. + +A corresponding catalog price object will be structured as shown below: + +```json filename="Product including and excluding tax, no sale price defined" showLineNumbers copy +{ + "product": { + "price": { + "with_tax": { + "formatted": "$165.00", + "value": 165 + }, + "without_tax": { + "formatted": "$150.00", + "value": 150 + }, + "rrp_with_tax": { + "formatted": "$275.00", + "value": 275 + }, + "rrp_without_tax": { + "formatted": "$250.00", + "value": 250 + }, + "saved": { + "formatted": "$110.00", + "value": 110 + }, + "tax_label": "Tax" + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `with_tax` | This property represents the `without_tax` value plus a 10% tax markup.| +| `rrp_with_tax` | This property represents the `rrp_without_tax` value plus a 10% tax markup.| + +<Callout type="warning"> + + #### Tax display configurations + The same properties and values are returned for **Including tax** and **Including and excluding tax** display settings. These properties and values are not available for a control panel setting of **Excluding tax**. + </Callout> + +### Sale price defined in control panel + +Assume that a merchant has defined the following tax configurations for a product in the control panel, alongside a defined sale price: + +* Show prices on product pages including and excluding tax +* Use a flat rate of 10% tax + +```json filename="Product including and excluding tax, sale price defined" showLineNumbers copy +{ + "product": { + "price": { + "with_tax": { + "formatted": "$135.30", + "value": 135.3 + }, + "without_tax": { + "formatted": "$123.00", + "value": 123 + }, + "sale_price_without_tax": { + "formatted": "123.00", + "value": 123 + }, + "sale_price_with_tax": { + "formatted": "135.30", + "value": 135.3 + }, + "rrp_with_tax": { + "formatted": "$275.00", + "value": 275 + }, + "rrp_without_tax": { + "formatted": "$250.00", + "value": 250 + }, + "saved": { + "formatted": "$139.70", + "value": 139.7 + }, + "non_sale_price_without_tax": { + "formatted": "$150.00", + "value": 150 + }, + "non_sale_price_with_tax": { + "formatted": "$165.00", + "value": 165 + }, + "tax_label": "Tax" + } + } +} +``` + +In this example: + +| Property | Description | +| ----------- | ----------- | +| `non_sale_price_with_tax` | This property represents the standard store price with tax.| +| `non_sale_price_without_tax` | This property represents the standard store price without tax.| +| `sale_price_with_tax` and `sale_price_without_tax` | These properties represent the product's defined sale price.| +| `saved` | This value is based on the difference between the `with_tax` and `non_sale_price_with_tax` values.| + +## Control panel quick reference + +The table below explains the mapping between the control panel fields and the catalog price object properties and values. + +| Field | Catalog Price Object Property | Description | +| ----------- | ----------- | ----------- | +| Default Price (excluding tax) |<ul><li>**Sale Price** is defined:</li> `{{ product.price.non_sale_price_without_tax }}`<li>**Sale Price** is not defined:</li> `{{ product.price.without_tax }}`</ul>| The standard store price for the product. | + Default Price (including tax) |<ul><li>**Sale Price** is defined:</li> `{{ product.price.non_sale_price_with_tax }}`<li>**Sale Price** is not defined:</li> `{{ product.price.with_tax }}`</ul>| The standard store price for the product, with tax. | + Cost |Cost is not returned in the catalog price object.| This field represents true cost of goods, and is typically meant for reports and third-party accounting integrations. | +MSRP (excluding tax)|`{{ product.price.rrp_without_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price. | +MSRP (including tax)|`{{ product.price.rrp_with_tax }}`| This field represents the product’s list price, or the manufacturer's suggested retail price, including tax. | +Sale Price (excluding tax)|`{{product.price.sale_price_without_tax}}`| This product’s discounted/sale price. | +Sale Price (including tax)|`{{ product.sale_price_with_tax }}`| This product’s discounted/sale price, with tax. | +Difference between Default Price and MSRP (*Default Price - MSRP)*|`{{ product.price.saved }}`| The customer’s savings on the effective price versus list price. | + +## Resources + +### Related Articles + +* [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config) +* [Adding a Product](https://support.bigcommerce.com/s/article/Adding-Products-v3#product-details) (BigCommerce Knowledge Base) diff --git a/docs/stencil-docs/reference-docs/front-matter-reference.mdx b/docs/storefront/stencil/themes/context/frontmatter-reference.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/front-matter-reference.mdx rename to docs/storefront/stencil/themes/context/frontmatter-reference.mdx diff --git a/docs/stencil-docs/storefront-customization/using-front-matter.mdx b/docs/storefront/stencil/themes/context/frontmatter.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/using-front-matter.mdx rename to docs/storefront/stencil/themes/context/frontmatter.mdx diff --git a/docs/stencil-docs/reference-docs/handlebars-helpers-reference.mdx b/docs/storefront/stencil/themes/context/handlebars-reference.mdx similarity index 97% rename from docs/stencil-docs/reference-docs/handlebars-helpers-reference.mdx rename to docs/storefront/stencil/themes/context/handlebars-reference.mdx index b44ad01da..040c73051 100644 --- a/docs/stencil-docs/reference-docs/handlebars-helpers-reference.mdx +++ b/docs/storefront/stencil/themes/context/handlebars-reference.mdx @@ -1,1777 +1,1777 @@ -# Handlebars Helpers Reference - -This article is a reference for [Stencil](/docs/storefront/stencil/start) supported [Handlebars](https://handlebarsjs.com/) helpers. It includes [custom helpers](#custom-helpers) documentation and a list of acceptlisted [standard helpers](#standard-helpers). - -## Custom helpers - -The following table contains BigCommerce's open source [Handlebars helpers](https://github.com/bigcommerce/paper-handlebars/tree/master/helpers). - -| Helper | Category | Description | -|:-------|:---------|:------------| -| [limit](#limit) | array | Limits array to second argument. | -| [pluck](#pluck) | array | Uses search key to get values from collections. | -| [cdn](#cdn) | assets | A URL transformer for content delivery networks. | -| [earlyHint](#earlyhint) | assets | Reduces page load time and perceived latency. | -| [money](#money) | currency | Formats number length, thousands delimiter, and decimal delimiter. | -| [moment](#moment) | date | Use [momentjs](https://momentjs.com/) to format and calculate dates. | -| [getFontLoaderConfig](#getfontloaderconfig) | fonts | Returns font-loader config as a JSON string. | -| [getFontsCollection](#getfontscollection) | fonts | Returns `<link>` elements for configured fonts. | -| [encodeHtmlEntities](#encodehtmlentities) | html | Encodes HTML entities. | -| [nl2br](#nl2br) | html | Converts newline characters to `<br>` tags. | -| [pre](#pre) | html | Renders preformatted text. | -| [resourceHints](#resourcehints) | html | Pre-fetches Google fonts. | -| [stylesheet](#stylesheet) | html | Renders a `<link>` tag for inserting a stylesheet. | -| [lang](#lang) | i18n | Maps keys to translation files. | -| [langJson](#langjson) | i18n | Returns language translation keys as a JSON string. | -| [getContentImage](#getcontentimage) | images | Returns sized image URL from store's `/content` directory. | -| [getContentImageSrcset](#getcontentimagesrcset) | images | Returns source set of URLs for images in `/content`. | -| [getImage](#getimage) | images | Returns image URL for specified size. | -| [getImageManagerImage](#getimagemanagerimage) | images | Returns sized image URL for images in `/product_images/uploaded_images`. | -| [getImageManagerImageSrcset](#getimagemanagerimagesrcset) | images | Returns image srcset for images in `/product_images/uploaded_images`. | -| [getImageSrcset](#getimagesrcset) | images | Returns single image URL or list of URLs for different sizes. | -| [any](#any) | logic | Renders block if **any** params are true. | -| [all](#all) | logic | Renders block if **all** params are true. | -| [compare](#compare) | logic | Compares values with JavaScript operators, including `typeof`. | -| [contains](#contains) | logic | Renders block if first param is in second param. | -| [for](#for) | logic | Iterates for range `a` to `b`, inclusive of `b`. | -| [if](#if) | logic | Renders block if statement is true. | -| [or](#or) | logic | Renders block if one or more parameters evaluate to true. | -| [unless](#unless) | logic | Renders block if a statement evaluates to false. | -| [option](#option) | misc | Returns the given value of `prop` from `this.options`. | -| [get](#get) | object| Use property paths (`a.b.c`) to get a value or nested value from the context. | -| [getObject](#getobject) | object| Use property paths (`a.b.c`) to get an object from the context. | -| [concat](#concat) | string | Concatenates two strings. | -| [join](#join) | string | Joins an array of string elements into one string. | -| [json](#json) | string | Converts a JavaScript object into a JSON string. | -| [occurrences](#occurrences) | string | Returns the number of occurrences of substring within the given string. | -| [replace](#replace) | string | Replaces all instances of the first parameter in the second parameter. | -| [setURLQueryParam](#seturlqueryparam) | string | Appends keys values to a URL. | -| [stripQuerystring](#stripquerystring) | string | Removes a query string. | -| [strReplace](#strreplace) | string | Replaces some or all occurrences of a target substring within a subject string. | -| [toLowerCase](#tolowercase) | string | Converts a string to lowercase. | -| [truncate](#truncate) | string | Truncates a string. | -| [block](#block) | template | Defines a content block. | -| [dynamicComponent](#dynamiccomponent) | template | Inserts a dynamic partial in the specified path. | -| [inject](#inject) | template | Injects key values into `{{jsContext}}`. | -| [jsContext](#jscontext) | template | Returns JSON for all data injected by `{{inject}}`. | -| [partial](#partial) | template | Overrides content defined by `{{block}}`. | -| [region](#region) | template | Specifies a widget region. | -| [assignVar](#assignvar) | variables | Saves value to a variable. | -| [getVar](#getvar) | variables| Returns a variable value. | -| [decrementVar](#decrementvar) | variables | Decrements a variable by 1. | -| [incrementVar](#incrementvar) | variables | Increments a variable by 1. | - -### limit - -```handlebars showLineNumbers -{{limit data limit}} -``` - -Limits the number of items returned from an array; returns a new array. - -#### Parameters - -- `data` (Array): Collection. -- `limit` (Number): Index specifying the number of items to exclude. - - -#### Example - -Assume that `{{cart.items}}` returns 10 items. You can use this helper to limit that behavior to only the first four items. - -```handlebars showLineNumbers -<!-- context = {var: 'This is longer than the chosen limit'} --> -{{limit var 10}} -<!-- => This is lo --> -``` - -```handlebars showLineNumbers -<!-- context = {var: 'This is longer than the chosen limit'} --> -{{limit var 10}} -<!-- results in: 'This is lo' --> -``` - -```handlebars showLineNumbers -{{#each (limit cart.items 4)}} - <li class="previewCartItem"> - <div class="previewCartItem-image"> - {{#if type '==' 'GiftCertificate'}} - <img src="{{cdn ../../theme_settings.default_image_gift_certificate}}" alt="GiftCertificate" title="GiftCertificate"> - {{else}} - {{> components/common/responsive-img - image=image - fallback_size=../../theme_settings.productthumb_size - lazyload=../../theme_settings.lazyload_mode - default_image=../../theme_settings.default_image_product - }} - {{/if}} - </div> - </li> -{{/each}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/limit.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=limit) - -### pluck - -```handlebars showLineNumbers -{{pluck limit collection path}} -``` - -Retrieves corresponding values from some or all elements in a collection using specified search key(s). Returns retrieved values in a comma-separated string. When used in conjunction with the built-in `{{each}}` helper, returns retrieved values in an array. - -#### Parameters - -- `limit`, `limit-value`: Optional parameters to limit the number of results returned. -- `collection` (Object|Array): Collection. -- `path` (String): The string to search for. - -#### Examples - -```handlebars showLineNumbers -{{pluck ([limit] <collection> [<limit-value>]) '<path>'}} -``` - -If each category in `categories` contains an image object, use dot notation to access the image's children: - - -```json showLineNumbers -categories: [ - { "id": 1, "name": "Bakeware", "image": { "data": "http://...", "alt": "Bakeware image"} }, - { "id": 2, "name": "Cookware", "image": { "data": "http://...", "alt": "Cookware image"} }, - { "id": 3, "name": "Cutlery", "image": { "data": "http://...", "alt": "Cutlery image"} } -] -``` -```handlebars showLineNumbers -{{pluck (limit categories 2) 'image.data'}} -<!-- Returns a comma-separated list of image URLs. --> -``` - -```json showLineNumbers -users: [ - { "user": "barney", "age": 36, "image": { "url": "barney.jpg" } }, - { "user": "fred", "age": 40, "image": { "url": "fred.jpg" } } -] -``` - -```handlebars showLineNumbers -{{pluck users "age"}} -<!-- => 36,40 --> - -{{pluck users "image.url"}}' -<!-- => barney.jpg,fred.jpg --> - -Standard pluck helper example: -// {{pluck items "data.title"}} -results in: '["aa", "bb", "cc"]' -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/pluck.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=pluck) - - -### cdn - -```handlebars showLineNumbers -{{cdn assetPath}} -``` - -A URL transformer for content delivery networks. - -#### Parameters - -- `assetPath` (String): Path to the file containing static assets. - - -#### Example - -```handlebars showLineNumbers -{{cdn "assets/img/image.jpg"}} -<!-- => https://cdn.bcapp/3dsf74g/stencil/123/img/image.jpg --> -``` - -To reference static assets staged locally outside your `<theme-name>` directory and uploaded using WebDAV, place the `webdav:` prefix before each corresponding `assetPath` parameter. For example, the following link: - -```handlebars showLineNumbers -<img src="{{cdn 'webdav:img/image.jpg'}}"> -``` - -will be transformed to a result like this: - - -```handlebars showLineNumbers -<img src="https://cdn.bcapp/3dsf74g/content/img/image.jpg"> -``` - -In this example, the `image.jpg` file was uploaded to the WebDAV `/content/` directory making `/content` the WebDAV root directory. Because our presumed local directory is `assets/`, we can omit that path when referencing its contained files or subdirectories. - -#### CDN custom endpoints - -You can define custom CDN endpoints to use with the `{{cdn}}` helper. By doing so you can include large, high-resolution image assets in themes without exceeding BigCommerce's [50 MB limit](/docs/storefront/stencil/deployment/upload) when bundling the theme for upload to BigCommerce. - -You can also use a local version of the image in development and a remote version on a CDN such as Imgix in production. To do so, define custom CDN endpoints in your theme's [`config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json). - -For example: - -```json showLineNumbers -{ - "name": "Cornerstone", - "version": "1.3.5", - "settings": { - "homepage_new_products_count": 12, - "homepage_featured_products_count": 8, - "cdn": { - "customcdn": "https://bigcommerce.customcdn.net" - } - } -} -``` - -After defining the endpoint, you can use the short name in the same way as you use a `webdav:` protocol: - -```handlebars showLineNumbers -<img src="{{cdn 'customcdn:img/image.jpg'}}" /> -``` - -In local development, the helper returns the following: - -```handlebars showLineNumbers -<img src="/assets/cdn/customcdn/img/image.jpg"/> -``` - -In production environment, the helper returns the following: - -```handlebars showLineNumbers -<img src="https://bigcommerce.customcdn.net/img/image.jpg" /> -``` - -As highlighted above, the helper is configured to rewrite *local* URLs to an `assets/cdn/` subfolder. The `stencil bundle` command will exclude this local `assets/cdn/` subfolder from the bundle that it creates. This filtering circumvents the 50 MB size limit on the resulting ZIP file. - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/cdn.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=cdn) - -#### Early Hint and cdn - -Early Hints reduce page load time and perceived latency by allowing browsers to download critical assets earlier in the request lifecycle. For more information, see [Early Hint](#earlyhint). - - - -##### Parameters - -- `resourceHint` - (String) - - Corresponds to the `rel` attribute in `<link>`. - - Value can be any of `preload`, `preconnect`, `prerender`, `dns-prefetch`. - - For more information, see [rel](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel) on MDN Web Docs. -- `as` - (String) - - Corresponds to the `as` attribute in `<link>`. - - Value can be any of `style`, `font`, `script`, `document`. - - If an invalid value is provided, `as` won't be included. - - This parameter is optional. - - - For more information, see [as](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-as) on MDN Web Docs. -- `crossorigin` - (String) - - Value can be any of `no`, `anonymous`, `use-credentials`. - - Defaults to `no` when no value is provided. - - This parameter is optional. - - - For more information, see [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-crossorigin) on MDN Web Docs. - -##### Example - -The following script is an example of Early Hints usage in the Cornerstone theme: - -```javascript showLineNumbers -<script async src="{{cdn 'assets/dist/theme-bundle.head_async.js' resourceHint='preload' as='script'}}"></script> -``` - -You can view more Early Hints usage in Cornerstone's `templates/layout/base.html` file by visiting the [Cornerstone Repository](https://github.com/bigcommerce/cornerstone/commit/f70fcd502343503969c2e475b777a85347137542#). - -### EarlyHint - -```handlebars showLineNumbers -{{ earlyHint '{path}' '{rel}' [as='{script|style|font}'] [crossorigin='{no|anonymous|use-credentials}'] }} - -``` - -Retrieves the provided URL and produces an early hint to communicate important web page resources. The server indicates which site assets (such as CSS files, JS scripts, and fonts) a browser needs to render a page fully. When used in conjunction with the `{{cdn}}` helper, load times can improve by 30%. - -#### Parameters - -- `path` (String): The URL that hosts the resource being hinted. - -- `rel` (String): Valid arguments are `preload`, `preconnect`, `prerender`, and `dns-prefetch`. - -- `as` (String): Optional. Valid arguments are `script`, `style`, `font`. - -- `crossorigin` (String): Optional. Valid arguments are `no` (default), `anonymous`, and `use-credentials`. - -#### Examples - -```handlebars showLineNumbers -{{earlyHint 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js' 'preload' as='script' crossorigin='anonymous'}} -``` - -This example produces an early hint in a `Link` header that looks like: - -```handlebars showLineNumbers -<https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js>; rel=preload; as=script; crossorigin=anonymous -``` - -The following example uses the `getFontsCollection` and `stylesheet` helpers. These helpers produce early hints by default, without using the `earlyHint` helper directly. - -```handlebars showLineNumbers -<script async src="{{cdn 'assets/dist/theme-bundle.head_async.js' resourceHint='preload' as='script'}}"></script> - -{{getFontsCollection font-display='block'}} - -<script async src="{{cdn 'assets/dist/theme-bundle.font.js' resourceHint='preload' as='script'}}"></script> - -{{{stylesheet '/assets/css/theme.css'}}} -``` - -The output displays in a `Link` header that looks like: - -``` showLineNumbers -Link: <https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/dist/theme-bundle.head_async.js>; rel=preload; as=script; crossorigin=anonymous, -<https://fonts.googleapis.com/css?family=Montserrat:700,500,400%7CKarla:400&display=block>; rel=preload; as=style, <https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/dist/theme-bundle.font.js>; rel=preload; as=script -<https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/css/theme-6bec0d40-d17a-013b-e9d8-02ea0e5c37ab.css>; rel=preload; as=style -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/earlyHint.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/commit/f70fcd502343503969c2e475b777a85347137542#) - -### moment - -```handlebars showLineNumbers -{{moment date format}} -``` - -Use [momentjs](https://momentjs.com/) to format and calculate dates. - -#### Examples - -```handlebars showLineNumbers -{{moment "5 hours ago" "MM/DD/YYYY HH:mm"}} -<!-- example calculation --> -``` - -If you encounter an issue with the last day of the month, use one of the following fixes: - -```handlebars showLineNumbers -{{moment date format datejs=false}} -<!-- To disable date.js --> -``` - -```handlebars showLineNumbers -{{moment "January 1, 2022" format="YYYY-MM-DD"}} -<!-- To call moment.js functions --> -``` - -### money - -```handlebars showLineNumbers -{{money value n s c}} -``` - -Formats number length, thousands delimiter, and decimal delimiter. - -#### Parameters - -- `value` (Number): The number to format. -- `n` (Integer): Length of decimal. -- `s` (Mixed): Thousands delimiter. -- `c` (Mixed): Decimal delimiter. - -#### Example - -```handlebars showLineNumbers -{{money 1000 2 ',' '.'}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/money.js) - -### getFontLoaderConfig - -```handlebars showLineNumbers -{{getFontLoaderConfig fontConfig}} -``` - -Returns font-loader config as a JSON string. - -#### Parameters - -- `fontConfig` (String): Font config in the `Google_FontName_Weight` format. - -#### Example - -```handlebars showLineNumbers -{{getFontLoaderConfig 'Google_Karla_700'}} -<!-- => Karla:700 --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getFontLoaderConfig.js) - -### getFontsCollection - -```handlebars showLineNumbers -{{getFontsCollection}} -``` - -Returns `<link>` elements for configured fonts. - -#### Example - -```handlebars showLineNumbers -{{getFontsCollection}} -<!-- => <link href="https://fonts.googleapis.com/css?family=Open+Sans:,400italic,700|Karla:700|Lora:400|Volkron:|Droid:400,700|Crimson+Text:400,700&display=swap" rel="stylesheet"> --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getFontsCollection.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getFontsCollection) - - -### encodeHtmlEntities - -```handlebars showLineNumbers -{{encodeHtmlEntities string args}} -``` - -Returns a string with HTML entities encoded. You may optionally pass additional encoding arguments. - -#### Parameters - -- `string` (String): String to encode with HTML entities. -- `args` (Boolean): Acceptlist of allowed named arguments. Allowed arguments: `useNamedReferences`, `decimal`, `encodeEverything`, `allowUnsafeSymbols`. Specify `arg='true'` to use. For example, `decimal='true'`. - -#### Examples - -```handlebars showLineNumbers -{{encodeHtmlEntities 'foo © bar ≠ baz 𝌆 qux'}} -<!-- => foo © bar ≠ baz 𝌆 qux --> - -{{encodeHtmlEntities 'an ampersand: &'}} -<!-- => an ampersand: & --> - -{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" useNamedReferences="true"}} -<!-- Returns a string with HTML entities encoded with named references. --> -<!-- => foo © bar ≠ baz 𝌆 qux --> - -{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" decimal="true"}} -<!-- Returns a string with HTML entities encoded with decimal option. --> -<!-- => foo © bar ≠ baz 𝌆 qux --> - -{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" encodeEverything="true"}} -<!-- Returns a string with HTML entities encoded with encodeEverything option. --> -<!-- => foo © bar ≠ baz 𝌆 qux --> - -{{encodeHtmlEntities "foo © and & ampersand" allowUnsafeSymbols="true"}} -<!-- Returns a string with HTML entities encoded with allowUnsafeSymbols option. --> -<!-- => foo © and & ampersand --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/encodeHtmlEntities.js) - -### nl2br - -```handlebars showLineNumbers -{{nl2br text}} -``` - -Converts newline characters to `<br>` tags. - -#### Parameters - -- `text` (String): Text to convert. - -#### Example - -```handlebars showLineNumbers -{{nl2br settings.address}} -<!-- => <br>685 Market St<br>San Francisco<br>94105<br>CA<br> --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/nl2br.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=nl2br) - -### pre - -```handlebars showLineNumbers -{{pre value}} -``` - -Renders preformatted text. This helper will escape text. - -#### Parameters - -- `value` (String): Text to format. - -#### Example - -```handlebars showLineNumbers -<!-- context = {var: {}} --> -{{pre var}} -<!-- => <pre>{}</pre> --> - -<!-- context = {var: "<div>&\"500\"</div>"} --> -{{pre var}} -<!-- => <pre>"<div>&\\"500\\"</div>"</pre> --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/pre.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=pre) - -### resourceHints - -```handlebars showLineNumbers -{{resourceHints}} -``` - -Pre-fetches Google fonts. Outputs a formatted `<link>` tag for DNS-prefetch. - -#### Example - -```handlebars showLineNumbers -{{resourceHints}} -<!-- => <link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com" crossorigin> --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/resourceHints.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=resourceHints) - -### stylesheet - -```handlebars showLineNumbers -{{stylesheet assetPath}} -``` - -Renders a link tag to insert a stylesheet into a theme; returns an HTML string. (This is required if you want Theme Editor to rewrite the stylesheet file when a merchant customizes their theme.) - -#### Parameters - -- `assetPath` (String): Filepath to the theme's CSS stylesheet file. -- `options`: You can append optional parameters as key/value pairs. - -#### Example - -```handlebars showLineNumbers -{{stylesheet "assets/css/style.scss" class="myStylesheet"}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/stylesheet.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=stylesheet) - -### lang - -```handlebars showLineNumbers -{{lang translationKey}} -``` - -Maps keys to translation files based on the locale indicated by the visitor’s browser. - -#### Parameters - -- `translationKey`(String) -- `options`: You can append optional parameters as key/value pairs. - -#### Examples - -```handlebars showLineNumbers -<label class="form-label" for="search_query_adv"> - {{lang 'forms.search.query' }} - <small>{{lang 'common.required' }}</small> -</label> -``` - -```handlebars showLineNumbers -<!-- context = {name: 'BigCommerce'} --> -{{lang 'powered_by' name=name}} -<!-- => Powered By BigCommerce --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/lang.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=lang) - -### langJson - -```handlebars showLineNumbers -{{langJson keyFilter}} -``` - -Returns language translation keys as a JSON string. - -#### Parameters - -- `keyFilter` (String): The language translation keys to render for the storefront locale/language. - -#### Example - -```handlebars showLineNumbers -{{langJson 'validation_messages'}} -<!-- This will load validation messages in JSON format for the storefront locale/language. --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/langJson.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=langJson) - -### getContentImage - -```handlebars showLineNumbers -{{getContentImage path width height}} -``` - -Returns a URL for an image uploaded to `/dav/content/`. To learn more about uploading files to your store's server, see [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). - -#### Parameters - -- `path` (String): Image path relative to `/dav/content/`. -- `width` (Integer): Width in pixels. -- `height` (Integer): Height in pixels. - -#### Example - -```handlebars showLineNumbers -<!-- Original image URL returned if no size or invalid size is passed in --> -{{getContentImage "asset.jpg"}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/content/asset.jpg --> - -{{getContentImage "asset.jpg" width="a" height="a"}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/content/asset.jpg --> - -<!-- Sized image URL returned if valid height and/or width passed in --> -{{getContentImage "asset.jpg" width=123 height=321}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123x321/content/asset.jpg --> - -{{getContentImage "asset.jpg" width=123}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123w/content/folder/asset.jpg --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getContentImage.js) - -### getContentImageSrcset - -```handlebars showLineNumbers -{{getContentImageSrcset path}} -``` - -Returns a `srcset` for an image uploaded to `/dav/content/`. - -#### Parameters - -- `path` (String): Image path relative to `/dav/content/`. - -#### Example - -```handlebars showLineNumbers -{{getContentImageSrcset "asset.jpg"}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/80w/content/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/content/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/content/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/content/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/content/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/content/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/content/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/content/asset.jpg 2560w --> - -{{getContentImageSrcset "folder/asset.jpg" width=123}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/80w/content/folder/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/content/folder/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/content/folder/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/content/folder/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/content/folder/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/content/folder/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/content/folder/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/content/folder/asset.jpg 2560w --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getContentImageSrcset.js) - -### getImage - -```handlebars showLineNumbers -{{getImage stencilImage size}} -``` - -Returns `<img>` tag `src` value for images of a specified size. Values for the size parameter are defined in the `settings` array in [`config.json`](https://github.com/bigcommerce/cornerstone/blob/master/config.json). - -#### Parameters - -- `stencilImage` (String): A Stencil image. -- `size` (String): A key in the `theme_settings` object. -- `defaultImage` (String): Optional default image URL to use if the `stencilImage` is undefined. - -#### Example - -```handlebars showLineNumbers -{{getImage image "logo"}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImage.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getImage) - -### getImageManagerImage - -```handlebars showLineNumbers -{{getImageManagerImage path width height}} -``` - -Returns an [Image Manager](https://support.bigcommerce.com/s/article/Using-the-Image-Manager) image URL for an image uploaded to `/dav/product_images/uploaded_images`. To learn more about uploading files to your store's server, see [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). - -#### Parameters - -- `path` (String): Image path relative to `/dav/product_images/uploaded_images`. -- `width` (Integer): Width in pixels. -- `height` (Integer): Height in pixels. - -#### Example - -```handlebars showLineNumbers -<!-- Original image URL returned if no size or invalid size is passed in --> -{{getImageManagerImage "asset.jpg"}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/image-manager/asset.jpg --> - -<!-- height must be accompanied by width --> -{{getImageManagerImage "folder/asset.jpg" height=123}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/image-manager/folder/asset.jpg --> - -<!-- Sized image URL returned if valid height and/or width passed in --> -{{getImageManagerImage "asset.jpg" width=123}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123w/image-manager/asset.jpg --> - -{{getImageManagerImage "folder/asset.jpg" width=123 height=321}} -<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123x321/image-manager/folder/asset.jpg --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageManagerImage.js) - -### getImageManagerImageSrcset - -```handlebars showLineNumbers -{{getImageManagerImageSrcset path}} -``` - -Returns an [Image Manager](https://support.bigcommerce.com/s/article/Using-the-Image-Manager) image `srcset` for an image uploaded to `/dav/product_images/uploaded_images`. To return an image with a specified image width and height size, we recommend using the `getImageManagerImage` helper. - -#### Parameters - -- `path` (String): Image path relative to `/dav/product_images/uploaded_images`. - -#### Example - -```handlebars showLineNumbers -{{getImageManagerImageSrcset "asset.jpg"}} -<!-- => -https://cdn.bcapp/3dsf74g/images/stencil/80w/image-manager/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/image-manager/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/image-manager/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/image-manager/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/image-manager/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/image-manager/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/image-manager/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/image-manager/asset.jpg 2560w --> - -{{getImageManagerImageSrcset "folder/asset.jpg"}} - <!-- => -https://cdn.bcapp/3dsf74g/images/stencil/80w/image-manager/folder/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/image-manager/folder/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/image-manager/folder/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/image-manager/folder/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/image-manager/folder/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/image-manager/folder/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/image-manager/folder/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/image-manager/folder/asset.jpg 2560w --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageManagerImageSrcset.js). - -### getImageSrcset - -```handlebars showLineNumbers -{{getImageSrcset stencilImage size}} -``` - -The `getImageSrcset` helper is a replacement for [`getImage`](#getImage) which allows you to generate either a single image URL (for an `<img>` `src`) or a list of image sizes for `srcset`. Using the [srcset](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-srcset) attribute, you can specify a list of image sizes for the browser to choose from based on the expected size of the image on the page, the device's pixel density, and other factors. - -#### Parameters - -- `stencilImage` (String): A Stencil image. -- `size` (String): A key in the `theme_settings` object. -- `defaultImage` (String): Optional default image URL to use if the `stencilImage` is undefined. - -You can specify what sizes you want as named arguments on the helper. - -#### Example - -**Default sizes** - -By specifying `use_default_sizes=true` on the helper, a `srcset` string will be constructed with a set of sizes chosen by BigCommerce to be optimal for most uses. - -```handlebars showLineNumbers -{{getImageSrcset image use_default_sizes=true}} -{{getImageSrcset image "https://place-hold.it/500x300" use_default_sizes=true}} -``` - -Default sizes: - -```html showLineNumbers -'80w': '80w', -'160w': '160w', -'320w': '320w', -'640w': '640w', -'960w': '960w', -'1280w': '1280w', -'1920w': '1920w', -'2560w': '2560w', -``` - -**Single 1x size** - -```handlebars showLineNumbers -{{getImageSrcset image 1x=theme_settings.zoom_size}} -{{getImageSrcset image 1x="1280x800"}} -{{getImageSrcset image 1x="1280w"}} -``` - -By specifying a single size as `1x`, you can choose any image resolution. You can reference a value from the `theme_settings` object (similar to `getImage`), or you can specify your own size inline. `getImageSrcset` does not require `theme_settings` keys to be wrapped in quotes; they should be referenced directly. - -**Pixel density** - -```handlebars showLineNumbers -{{getImageSrcset image 1x="1280w" 2x="2560w"}} -{{getImageSrcset image 1x="800w" 1.5x="1200w" 2x="1600w"}} -{{getImageSrcset image 1x="640x640" 2x="1280x1280"}} -``` - -By specifying several sizes using the pixel density descriptor, you can generate a `srcset` of different image resolutions for different pixel density screens as described in [Resolution switching: Same size, different resolutions](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#Resolution_switching_Same_size_different_resolutions). For example, you can specify a `2x` image for Retina screens, and a `1x` image for normal screens. - -As above, you can reference `theme_settings` keys or specify your own size inline. - -**Inherent width** - -```handlebars showLineNumbers -<img src="{{getImage image 'default'}}" srcset="{{getImageSrcset image 100w='100w' 200w='200w' 300w='300w'}}" /> - -<!-- => -<img src="https://cdn11.bigcommerce.com/s-abc123/images/stencil/640x640/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2" srcset="https://cdn11.bigcommerce.com/s-abc123/images/stencil/100w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 100w, https://cdn11.bigcommerce.com/s-abc123/images/stencil/200w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 200w,https://cdn11.bigcommerce.com/s-abc123/images/stencil/300w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 300w" /> --> - -<img src="{{getImageSrcSet image 1x='1000x1000'}}" srcset="{{getImageSrcset image 1x='1000x1000' 2x='2000x2000'}}" /> - -<!-- => -<img src="https://cdn11.bigcommerce.com/s-abc123/images/stencil/640x640/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2" srcset="https://cdn11.bigcommerce.com/s-abc123/images/stencil/100w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 100w, https://cdn11.bigcommerce.com/s-abc123/images/stencil/200w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 200w,https://cdn11.bigcommerce.com/s-abc123/images/stencil/300w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 300w" /> --> -``` - -By specifying several sizes using the inherent width descriptor, you can generate a `srcset` of different image resolutions based on width, which can in turn be selected by the browser based on the expected size of the image when the page is painted. It is recommended to use this together with a `sizes` attribute on the `<img>` element as described in [Resolution switching: Different sizes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#Resolution_switching_Different_sizes). In Cornerstone, this is handled automatically via JavaScript. - -As above, you can reference `theme_settings` keys or specify your own size inline. - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageSrcset.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getImageSrcset) - -### any - -```handlebars showLineNumbers -{{any arg}} -``` - -Renders block if one or more parameters are true. - -#### Parameters - -- `arg` (String|Number|Array|Object) - -#### Example - -```handlebars showLineNumbers -{{#any items selected=true}} - <!-- block to display if any items have selected=true --> -{{/any}} -``` - -A usage example is [`templates/components/category/shop-by-price.html`](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/category/shop-by-price.html), a category page in Stencil's Cornerstone base theme that does _not_ have faceted search turned on. Shoppers will see **Shop by price** filters instead of product filters. - -In this component, the `{{any}}` helper is used to determine whether a shopper has selected one of the filters, and whether a "reset" button needs to be displayed: - -```handlebars showLineNumbers -{{#any shop_by_price selected=true}} - <li class="navList-item"> - <a href="{{category_url}}" class="navList-action"> - {{lang 'category.reset'}} - </a> - </li> -{{/any}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/any.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=any) - -### all - -```handlebars showLineNumbers -{{all arg}} -``` - -Renders block if all parameters are true. - -#### Parameters - -- `arg` (String|Number|Array|Object) - -#### Example - -```handlebars showLineNumbers -{{#all items theme_settings.optionA theme_settings.optionB}} - <!-- block to display if all items evaluate to true --> -{{/all}} -``` - -```handlebars showLineNumbers -{{#all product.custom_fields theme_settings.show_custom_fields_tabs}} - <li class="tab"> - <a class="tab-title" href="#tab-{{dashcase (lowercase (sanitize theme_settings.pdp-custom-fields-tab-label))}}">{{sanitize theme_settings.pdp-custom-fields-tab-label}}</a> - </li> -{{/all}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/all.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=all) - -### compare - -```handlebars showLineNumbers -{{compare a operator b}} -``` - -Compares values with JavaScript operators. Renders block if comparison of the first and third parameters returns true. - -#### Parameters - -- `a` () -- `operator` (): The operator to use. Operators must be enclosed in quotes: `>`, `=`, `<=`, and so on. - * `==` - * `===` - * `!=` - * `!===` - * `<` - * `>` - * `<=` - * `>=` - * `typeof` -- `b` () -- `options` (Object): Options object. -- `returns` (String): Block, or if specified the inverse block is rendered if falsy. - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/compare.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=compare) - -### contains - -```handlebars showLineNumbers -{{contains collection value}} -``` - -Renders block if `collection` has the given `value`, using strict equality (`===`) for comparison, otherwise the inverse block is rendered (if specified). If a `startIndex` is specified and is negative, it is used as the offset from the end of the collection. - -#### Parameters - -- `collection` (Array|Object|String): The collection to iterate over. -- `value` (String|Number|Array|Object): The value to check for. - -#### Example - -```handlebars showLineNumbers -<!-- array = ['a', 'b', 'c'] --> -{{#contains array "d"}} - This will not be rendered. -{{else}} - This will be rendered. -{{/contains}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/contains.js) - -### for - -```handlebars showLineNumbers -{{for a b}} -``` - -Repeats block for a specified range from index `a` to index `b`. To protect against infinite loops, this helper is limited to 100 iterations. - -#### Parameters - -- `a` (Number): Starting number. -- `b` (Number): Ending number. (Inclusive) - -#### Example - -```handlebars showLineNumbers -{{#for 1 12}} - {{lang (concat 'common.short_months.' $index)}} -{{/for}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/for.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=for) - -### if - -```handlebars showLineNumbers -{{if arg}} -``` - -Renders `if` block when if-statement evaluates to true; otherwise renders `else` block. - -#### Parameters - -- `arg` (String|Number|Array|Object) - -#### Example - -```handlebars showLineNumbers -{{#if page_type '===' 'account_order'}} - <li class="navBar-item is-active"> - <a class="navBar-action" href="{{urls.account.orders.all}}">{{lang 'account.nav.orders'}}</a> - </li> -{{else}} - <li class="navBar-item is-active">{{lang 'account.nav.orders'}}</li> -{{/if}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/if.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=if) - -### or - -```handlebars showLineNumbers -{{or arg}} -``` - -Renders block if one or more parameters evaluates to true. - -#### Parameters - -- `arg` (String|Number|Array|Object): Parameters can be of mixed types. - -#### Example - -```handlebars showLineNumbers -{{#or 1 0 0 0 0 0 0}} -<!-- 1 evaluates to true, so block is rendered--> -{{/or}} -``` - -```handlebars showLineNumbers -{{#or options configurable_fields}} - <a href="#" data-item-edit="{{id}}">{{lang 'cart.checkout.change'}}</a> -{{/or}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/or.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=or) - -### unless - -```handlebars showLineNumbers -{{unless arg}} -``` - -Renders a block if a statement is false; does not support operators for comparison expressions. - -#### Parameters - -- `arg` (String|Number|Array|Object) - -#### Example - -```handlebars showLineNumbers -{{#each category_results}} -<li class="category-suggestion"> - {{#each this}} - <a href="{{url}}">{{name}}</a> - {{#unless @last}} > {{/unless}} - {{/each}} -</li> -{{/each}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/unless.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=unless) - - -### option - -```handlebars showLineNumbers -<!-- context = {options: {a: {b: {c: 'ddd'}}}} --> - * {{option "a.b.c"}} - * <!-- results => `ddd` --> -``` -Returns the given value of prop from `this.options`. - -#### Example - -```js showLineNumbers -context = { - "options": { - "a": { - "b": { - "c": "ddd" - } - } - } -} -``` - -`{{option "a.b.c"}}` returns "ddd" - - -### get -```handlebars showLineNumbers -{{get (concat “a.b.c.d”) someObject}} -``` -Use property paths (`a.b.c`) to get a value or nested value from the context. Works as a regular helper or block helper. You can use return values from the `concat` helper as property paths. - -#### Example - -```handlebars showLineNumbers -{{#get "posts" blog}}{{/get}} -``` - -### getObject - -```handlebars showLineNumbers -{{#with (getObject "a.b.c" someObject)}}...{{/with}} -``` -Use property paths (`a.b.c`) to get an object from the context. Differs from the `get` helper in that this helper will return the actual object including the given property key. This helper does not work as a block helper. - -### concat - -```handlebars showLineNumbers -{{concat value otherValue}} -``` - -Concatenates two strings. - -#### Parameters - -- `value` (String) -- `otherValue` (String) - -#### Example - -```handlebars showLineNumbers -{{concat 'hello' 'world'}} -<!-- => helloworld --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/concat.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=concat) - -### join - -```handlebars showLineNumbers -{{join values separator}} -``` - -Joins an array of string elements into a single string. - -#### Parameters - -- `values` (Array) -- `separator` (String) -- `limit=<number>`: An optional limit. - -#### Example - -```handlebars showLineNumbers -<!-- context = { - list: ['Mario', 'Chris', 'Mick', 'Hau', 'Cody'] -} --> -{{join list " "}} -<!-- => 'Mario Chris Mick Hau Cody' --> - -{{join list ", "}} -<!-- => 'Mario, Chris, Mick, Hau, Cody' --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/join.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=join) - -### json - -```handlebars showLineNumbers -{{json object}} -``` - -Converts a JavaScript object into a JSON string. - -#### Parameters - -- `object` (Object): A JavaScript object. - -#### Example - -```handlebars showLineNumbers -<!-- context = { - object: { a: 1, b: "hello" } -} --> -{{json object}} -<!-- => '{"a":1,"b":"hello"}' --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/json.js) - -### occurrences - -```handlebars showLineNumbers -{{occurrences str substring}} -``` - -Returns the number of occurrences of substring within the given string. - -#### Parameters - -- `str` (String) -- `substring` (String) - -#### Example - -```handlebars showLineNumbers -{{occurrences "foo bar foo bar baz" "foo"}} -<!-- => 2 --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/occurrences.js) - -### replace - -```handlebars showLineNumbers -{{replace firstParam secondParam string}} -``` - -Replaces all instances of the first parameter in the second parameter with the child block. - -#### Parameters - -- `firstParam` (?) -- `secondParam` (?) -- `string` (String) - -#### Example - -```handlebars showLineNumbers -<!-- Replace all instances of `%%Syndicate%%` in `page.content` with `{{> components/page/rss_feed}}`. --> -{{#replace '%%Syndicate%%' page.content}} - {{> components/page/rss_feed}} -{{else}} - <p>{{{page.content}}}</p> -{{/replace}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/replace.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=replace) - -### setURLQueryParam - -```handlebars showLineNumbers -{{setURLQueryParam url key value}} -``` - -Appends key values to a URL. - -#### Parameters - -- `url` (String): The URL of the query parameter. -- `key` (String): The query parameter key. -- `value` (Number): The query parameter value of the stated key. - -#### Example - -```handlebars showLineNumbers -{{setURLQueryParam "http://example.com/image.jpg" "c" "2"}} -<!-- results in: http://example.com/image.jpg?c=2 --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/setURLQueryParam.js). - -### stripQuerystring - -```handlebars showLineNumbers -{{stripQuerystring url}} -``` - -Strips query string from a URL. - -#### Parameters - -- `url` (String): The URL containing the query parameter. - -#### Example - -```handlebars showLineNumbers -{{stripQuerystring "http://example.com?tests=true"}} -<!-- results in: http://example.com --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/stripQuerystring.js) - -### strReplace - -```handlebars showLineNumbers -{{strReplace subjectString targetSubstring newSubstring occurrenceSelection}} -``` - -Replaces some or all occurrences of a target substring within the subject string. - - -#### Parameters - -- `subjectString` (String): The original string to modify. -- `targetSubstring` (String): The substring in `subjectString` to be replaced. -- `newSubstring` (String): The substring to insert in place of `targetSubstring`. -- `occurenceSelection` (Integer): Optional. The number of occurrences of `targetSubstring` to replace with `newSubstring`. If you pass no argument or the supplied integer is greater than the number of `targetSubstring` occurrences, `newSubstring` will replace all instances of `targetSubstring`. A positive integer `n` will replace `n` instances of `targetSubstring`, starting from the left side of the string. Arguments of zero or less will replace no instances. Non-integer arguments may have unpredictable results. - -#### Example - -```handlebars showLineNumbers -<!-- Replace all instances --> -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two"}} -<!-- output: Buy two, get two half price. Limit two per customer. --> - -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 3}} -<!-- output: Buy two, get two half price. Limit two per customer. --> - -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 100}} -<!-- output: Buy two, get two half price. Limit two per customer. --> - - -<!-- Replace some instances --> -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 2}} -<!-- output: Buy two, get two half price. Limit one per customer. --> - - -<!-- Replace no instances --> -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 0}} -<!-- output: Buy one, get one half price. Limit one per customer. --> - -{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" -2}} -<!-- output: Buy one, get one half price. Limit one per customer. --> -``` - -- [See the strReplace helper (GitHub)](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/strReplace.js) - -### toLowerCase - -```handlebars showLineNumbers -{{toLowerCase string}} -``` - -Converts a string to lowercase. - -#### Parameters - -- `string` (String): String you want to convert. - -#### Example - -```handlebars showLineNumbers -{{toLowerCase 'I Love PIZZA'}} -<!-- => i love pizza --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/toLowerCase.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=toLowerCase) - -### truncate - -```handlebars showLineNumbers -{{truncate string length}} -``` - -Truncates a string. - -#### Parameters - -- `string` (String): The string you want to truncate. -- `length` (Number): The desired length of the returned truncated string. - -#### Example - -```handlebars showLineNumbers -{{truncate "This will be truncated to only the first part of the sentence." 22}} -<!-- results in: 'This will be truncated' --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/truncate.js) - -### block - -```handlebars showLineNumbers -{{block string}} -``` - -Defines a block of content. You can overwrite it using the [partial](#partial) helper. - -#### Parameters - -- `string` (String) - -#### Example - -```handlebars showLineNumbers -<div class="container"> - {{#block "page"}} {{/block}} -</div> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/block.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=block) - -### dynamicComponent - -```handlebars showLineNumbers -{{dynamicComponent path}} -``` - -Inserts a dynamic partial in the specified path. - -#### Parameters - -- `path` (String): The path to insert a dynamic component in. - -#### Example - -```handlebars showLineNumbers -{{#each forms.create_account.address_fields }} - {{{dynamicComponent 'components/common/forms'}}} -{{/each}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/dynamicComponent.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=dynamicComponent) - -### inject - -```handlebars showLineNumbers -{{inject value object}} -``` - -Injects key values into the [jsContext](#jscontext) helper. - -#### Parameters - -- `value` (String): The value to inject. -- `object` (Object) - -#### Example - -```handlebars showLineNumbers -{{inject "myProductName" product.title}} - -<script> -var jsContext = JSON.parse({{jsContext}}); -console.log(jsContext.myProductName); -// results in: "BigCommerce Coffee Mug" -</script> -``` - -```handlebars showLineNumbers -{{inject 'productSize' theme_settings.product_size}} -<!-- Returns a JSON representation of an object of all the keys injected. --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/inject.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?q=inject) - -### jsContext - -```handlebars showLineNumbers -{{jsContext}} -``` - -Returns a JSON representation of the data injected by the [inject](#inject) helper. - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/jsContext.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=jsContext) - -### partial - -```handlebars showLineNumbers -{{partial string}} -``` - -Overrides content defined by the [block](#block) helper. - -#### Parameters - -- `string` (String) - -#### Example - -```handlebars showLineNumbers -{{#partial "head"}} - {{#if pagination.category.previous}} - <link rel="prev" href="{{pagination.category.previous}}"> - {{/if}} - {{#if pagination.category.next}} - <link rel="next" href="{{pagination.category.next}}"> - {{/if}} -{{/partial}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/partial.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=jsContext) - -### region - -```handlebars showLineNumbers -{{region name}} -``` - -Specifies a [widget](/docs/storefront/widgets#widgets) region. - -#### Parameters - -- `name` (String): The name of the region. - -#### Example - -```handlebars showLineNumbers -<!-- context = { - banner-top: "hello world" - } --> -{{region name="banner-top"}} -<!-- => <div data-content-region="banner-top">hello world</div> --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/region.js) -- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=region) - -### assignVar - -```handlebars showLineNumbers -{{assignVar key value}} -``` - -Assigns a variable for later use in the template and has a limit of 50 variables in storage. - -#### Parameters - -- `key` (String) -- `value` (String|Number) - -#### Example - -```handlebars showLineNumbers -{{assignVar "foo" 10}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/assignVar.js) - -### getVar - -```handlebars showLineNumbers -{{getVar key}} -``` - -Returns the variable set by [assignVar](#assignVar). - -#### Parameters - -- `key` (String) - -#### Example - -```handlebars showLineNumbers -{{getVar "foo"}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getVar.js) - -### decrementVar - -```handlebars showLineNumbers -{{decrementVar key}} -``` - -Decrements the variable set by [assignVar](#assignVar) by 1. - -#### Parameters - -- `key` (String) - -#### Example - -```handlebars showLineNumbers -{{decrementVar "foo"}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/decrementVar.js) - -### incrementVar - -```handlebars showLineNumbers -{{incrementVar key}} -``` - -Increments the variable set by [assignVar](#assignVar) by 1. - -#### Parameters - -- `key` (String) - -#### Example - -```handlebars showLineNumbers -{{incrementVar "foo"}} -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/incrementVar.js) - -### JSONparse - -Parse data with JSONparse. - -#### Parameters - -- `json` (String) - -#### Example - -```handlebars showLineNumbers -{{#JSONparse '{"foo": "bar"}'}} - {{foo}} -{{/JSONparse}} -<!-- output: bar --> -``` - -### JSONparseSafe - -Parse data safely with JSONparseSafe. This helper is similar to the JSONparse helper, but allows handling of incorrect JSON data. Returns `parsed data` when JSON is correct; otherwise, renders an `else` block. - - -#### Parameters - -- `json` (String): The data parsed by the helper. - - -#### Example - -```handlebars -{{#JSONparseSafe '{"foo": "bar"}'}} - {{foo}} -{{/JSONparseSafe}} -<!-- output: bar --> -``` - -```handlebars -{{#JSONparseSafe 'foo'}} - {{foo}} -{{else}} - John Doe -{{/JSONparseSafe}} -<!-- output: John Doe --> -``` - -- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/jsonParseSafe.js) - -## Standard helpers - - -The following table contains acceptlisted standard Handlebars helpers available to all Stencil themes. Each helper is linked to its GitHub documentation including parameters and examples. - -| Helper | Category | Description | -|:-------|:---------|:------------| -| [after](https://github.com/helpers/handlebars-helpers#after) | array | Returns all of the items in an array after the specified index. | -| [arrayify](https://github.com/helpers/handlebars-helpers#arrayify)| array | Casts the given value to an array. | -| [before](https://github.com/helpers/handlebars-helpers#before) | array | Returns all of the items in the collection before the specified count. | -| [each](https://handlebarsjs.com/guide/builtin-helpers.html#each) | array | Block helper that iterates over the items in a given array. | -| [eachIndex](https://github.com/helpers/handlebars-helpers#eachIndex) | array | | -| [filter](https://github.com/helpers/handlebars-helpers#filter) | array | Block helper that filters the given array and renders the block for values that evaluate to `true`, otherwise the inverse block is returned. | -| [first](https://github.com/helpers/handlebars-helpers#first) | array | Returns the first item or first `n` items of an array. | -| [forEach](https://github.com/helpers/handlebars-helpers#forEach) | array | Iterates over each item in an array and exposes the current item in the array as context to the inner block. | -| [inArray](https://github.com/helpers/handlebars-helpers#inArray) | array | Block helper that renders the block if an array has the given `value`. | -| [isArray](https://github.com/helpers/handlebars-helpers#isArray) | array | Returns `true` if value is an es5 array. | -| [last](https://github.com/helpers/handlebars-helpers#last) | array | Returns the last item, or last `n` items of an array or string. | -| [length](https://github.com/helpers/handlebars-helpers#length) | array | Returns the length of the given string or array. | -| [lengthEqual](https://github.com/helpers/handlebars-helpers#lengthEqual)| array | Returns true if the length of the given value is equal to the given `length`. | -| [map](https://github.com/helpers/handlebars-helpers#map) | array | Returns a new array created by calling `function` on each element of the given array. | -| [some](https://github.com/helpers/handlebars-helpers#some) | array | Block helper that returns the block if the callback returns `true` for some value in the given array. | -| [sort](https://github.com/helpers/handlebars-helpers#sort) | array | Sorts the given array. If an array of objects is passed, you may optionally pass a `key` to sort on as the second argument. | -| [sortBy](https://github.com/helpers/handlebars-helpers#sortBy) | array | Sorts an array. If an array of objects is passed, you may optionally pass a `key` to sort on as the second argument. | -| [withAfter](https://github.com/helpers/handlebars-helpers#withAfter) | array | Uses the items in the array *after* the specified index as context inside a block. | -| [withBefore](https://github.com/helpers/handlebars-helpers#withBefore) | array | Uses the items in the array *before* the specified index as context inside a block. | -| [withFirst](https://github.com/helpers/handlebars-helpers#withFirst) | array | Uses the first item in a collection inside a handlebars block expression. | -| [withLast](https://github.com/helpers/handlebars-helpers#withLast) | array | Uses the last item or `n` items in an array as context inside a block. | -| [withSort](https://github.com/helpers/handlebars-helpers#withSort) | array | Block helper that sorts a collection and exposes the sorted collection as context inside the block. | -| [isEmpty](https://github.com/helpers/handlebars-helpers#isEmpty)| collection | Inline, subexpression, or block helper that returns `true` (or the block) if the given collection is empty, or `false` (or the inverse block, if supplied) if the collection is not empty. | -| [iterate](https://github.com/helpers/handlebars-helpers#iterate) | collection | Block helper that iterates over an array or object. If an array is given, `.forEach` is called, or if an object is given, `.forOwn` is called, otherwise the inverse block is returned. | -| [and](https://github.com/helpers/handlebars-helpers#and) | comparison | Helper that renders the block if both of the given values are truthy. If an inverse block is specified it will be rendered when falsy. | -| [default](https://github.com/helpers/handlebars-helpers#default) | comparison | Returns the first value that is not undefined, otherwise the default value is returned. | -| [eq](https://github.com/helpers/handlebars-helpers#eq) | comparison | Block helper that renders a block if `a` is equal to `b`. If an inverse block is specified it will be rendered when falsy. | -| [gt](https://github.com/helpers/handlebars-helpers#gt) | comparison | Block helper that renders a block if `a` is greater than `b`. If an inverse block is specified, it will be rendered when false. | -| [gte](https://github.com/helpers/handlebars-helpers#gte) | comparison | Block helper that renders a block if `a` is greater than or equal to `b`. If an inverse block is specified it will be rendered when falsy. | -| [has](https://github.com/helpers/handlebars-helpers#has) | comparison | Block helper that renders a block if value has pattern. If an inverse block is specified it will be rendered when falsy. | -| [ifEven](https://github.com/helpers/handlebars-helpers#ifEven) | comparison | Returns `true` if the given value is an even number. | -| [ifNth](https://github.com/helpers/handlebars-helpers#ifNth) | comparison | Conditionally renders a block if the remainder is zero when `a` operand is divided by `b`. If an inverse block is specified it will be rendered when the remainder is not zero. | -| [ifOdd](https://github.com/helpers/handlebars-helpers#ifOdd) | comparison | Block helper that renders a block if value is an odd number. If an inverse block is specified it will be rendered when falsy. | -| [is](https://github.com/helpers/handlebars-helpers#is) | comparison | Block helper that renders a block if `a` is equal to `b`. If an inverse block is specified it will be rendered when falsy. Similar to eq but does not do strict equality.| -| [isnt](https://github.com/helpers/handlebars-helpers#isnt) | comparison | Block helper that renders a block if `a` is not equal to `b`. If an inverse block is specified it will be rendered when falsy. Similar to unlessEq but does not use strict equality for comparisons. | -| [lt](https://github.com/helpers/handlebars-helpers#lt) | comparison | Block helper that renders a block if `a` is less than `b`. If an inverse block is specified it will be rendered when falsy. | -| [lte](https://github.com/helpers/handlebars-helpers#lte) | comparison | Block helper that renders a block if `a` is less than or equal to `b`. If an inverse block is specified it will be rendered when falsy.| -| [neither](https://github.com/helpers/handlebars-helpers#neither) | comparison | Block helper that renders a block if neither of the given values are truthy. If an inverse block is specified it will be rendered when falsy. | -| [unlessEq](https://github.com/helpers/handlebars-helpers#unlessEq) | comparison | Block helper that always renders the inverse block unless `a` is equal to `b`.| -| [unlessGt](https://github.com/helpers/handlebars-helpers#unlessGt) | comparison | Block helper that always renders the inverse block unless `a` is greater than `b`.| -| [unlessLt](https://github.com/helpers/handlebars-helpers#unlessLt) | comparison | Block helper that always renders the inverse block unless `a` is less than `b`. | -| [unlessGteq](https://github.com/helpers/handlebars-helpers#unlessGteq) | comparison | Block helper that always renders the inverse block unless `a` is greater than or equal to `b`. | -| [unlessLteq](https://github.com/helpers/handlebars-helpers#unlessLteq) | comparison | Block helper that always renders the inverse block unless `a` is less than or equal to `b`.| -| [sanitize](https://github.com/helpers/handlebars-helpers#sanitize) | html | Strips HTML tags from a string, so that only the text nodes are preserved.| -| [ul](https://github.com/helpers/handlebars-helpers#ul) | html | Block helper for creating unordered lists (`<ul></ul>`). | -| [ol](https://github.com/helpers/handlebars-helpers#ol) | html | Block helper for creating ordered lists (`<ol></ol>`). | -| [thumbnailImage](https://github.com/helpers/handlebars-helpers#thumbnailImage) | html | Returns a `<figure>` with a thumbnail linked to a full picture. | -| [inflect](https://github.com/helpers/handlebars-helpers#inflect) | inflection | Returns either the singular or plural inflection of a word based on the given count. | -| [ordinalize](https://github.com/helpers/handlebars-helpers#ordinalize) | inflection | Returns an ordinalized number as a string. | -| [markdown](https://github.com/helpers/handlebars-helpers#markdown) | markdown | Block helper that converts a string of inline markdown to HTML. | -| [add](https://github.com/helpers/handlebars-helpers#add) | math | Returns the sum of `a` plus `b`. | -| [avg](https://github.com/helpers/handlebars-helpers#avg) | math| Returns the average of all numbers in the given array. | -| [ceil](https://github.com/helpers/handlebars-helpers#ceil) | math| Returns the `Math.ceil()` of the given value. | -| [divide](https://github.com/helpers/handlebars-helpers#divide)| math| Divides `a` by `b`. | -| [floor](https://github.com/helpers/handlebars-helpers#floor) | math | Returns the `Math.floor()` of the given value. | -| [multiply](https://github.com/helpers/handlebars-helpers#multiply) | math | Returns the product of `a` times `b`. | -| [random](https://github.com/helpers/handlebars-helpers#random) | math | Generates a random number between two values. | -| [round](https://github.com/helpers/handlebars-helpers#round) | math | Rounds the given number. | -| [subtract](https://github.com/helpers/handlebars-helpers#subtract) | math | Returns the product of `a` minus `b`. | -| [sum](https://github.com/helpers/handlebars-helpers#sum) | math | Returns the sum of all numbers in the given array. | -| [noop](https://github.com/helpers/handlebars-helpers#noop) | misc | Block helper that renders the block without taking any arguments. | -| [withHash](https://github.com/helpers/handlebars-helpers#withHash) | misc| Block helper that builds the context for the block from the options hash. | -| [addCommas](https://github.com/helpers/handlebars-helpers#addCommas) | number | Adds commas to numbers. | -| [phoneNumber](https://github.com/helpers/handlebars-helpers#phoneNumber) | number | Converts a string or number to a formatted phone number. | -| [toAbbr](https://github.com/helpers/handlebars-helpers#toAbbr) | number | Abbreviates numbers to the given number of precision. This is for general numbers, not size in bytes. | -| [toExponential](https://github.com/helpers/handlebars-helpers#toExponential) | number | Returns a string representing the given number in exponential notation. | -| [toFixed](https://github.com/helpers/handlebars-helpers#toFixed)|number| Formats the given number using fixed-point notation. | -| [toFloat](https://github.com/helpers/handlebars-helpers#toFloat) | number | | -| [toInt](https://github.com/helpers/handlebars-helpers#toInt) | number | | -| [toPrecision](https://github.com/helpers/handlebars-helpers#toPrecision) |number| Returns a string representing the `Number` object to the specified precision. | -| [extend](https://github.com/helpers/handlebars-helpers#extend) | object | Extends the context with the properties of other objects. A shallow merge is performed to avoid mutating the context. | -| [forIn](https://github.com/helpers/handlebars-helpers#forIn) | object | Block helper that iterates over the properties of an object exposing each key and value on the context. | -| [forOwn](https://github.com/helpers/handlebars-helpers#forOwn) |object| Block helper that iterates over the own properties of an object, exposing each key and value on the context. | -| [toPath](https://github.com/helpers/handlebars-helpers#toPath) | object | Takes arguments and, if they are string or number, converts them to a dot-delineated object property path. | -| [hasOwn](https://github.com/helpers/handlebars-helpers#hasOwn) | object | Returns `true` if `key` is an own, enumerable property of the given context object. | -| [isObject](https://github.com/helpers/handlebars-helpers#isObject) | object | Returns `true` if value is an object. | -| [JSONparse](#jsonparse) | object | Parses the given string using `JSON.parse`. | -| [JSONparseSafe](#jsonparsesafe) | object | Parses the given string safely using `JSON.parseSafe`. | -| [JSONstringify](https://github.com/helpers/handlebars-helpers#JSONstringify) | object | Stringifies an object using `JSON.stringify`. | -| [merge](https://github.com/helpers/handlebars-helpers#merge) |object| Deeply merges the properties of the given objects with the context object. | -| [pick](https://github.com/helpers/handlebars-helpers#pick) | object | Picks properties from the context object. | -| [camelcase](https://github.com/helpers/handlebars-helpers#camelcase) |string| camelCase the characters in the given string. | -| [capitalize](https://github.com/helpers/handlebars-helpers#capitalize) | string | Capitalizes the first word in a sentence. | -| [capitalizeAll](https://github.com/helpers/handlebars-helpers#capitalizeAll) | string | Capitalizes all words in a string. | -| [center](https://github.com/helpers/handlebars-helpers#center) |string| Centers a string using non-breaking spaces. | -| [chop](https://github.com/helpers/handlebars-helpers#chop) | string | Like trim, but removes both extraneous whitespace and non-word characters from the beginning and end of a string. | -| [dashcase](https://github.com/helpers/handlebars-helpers#dashcase) | string | Replaces non-word characters and periods with hyphens. | -| [dotcase](https://github.com/helpers/handlebars-helpers#dotcase) | string | `dot.case` the characters in a string. | -| [ellipsis](https://github.com/helpers/handlebars-helpers#ellipsis) | string | Truncates a string to the specified length, and appends it with an elipsis, `…`. | -| [hyphenate](https://github.com/helpers/handlebars-helpers#hyphenate) | string | Replaces spaces in a string with hyphens. | -| [isString](https://github.com/helpers/handlebars-helpers#isString) | string | Returns `true` if value is a string. | -| [lowercase](https://github.com/helpers/handlebars-helpers#lowercase) | string | Lowercase all characters in the given string. | -| [occurrences](https://github.com/helpers/handlebars-helpers#occurrences) | string | Returns the number of occurrences of `substring` within the given string. | -| [pascalcase](https://github.com/helpers/handlebars-helpers#pascalcase) | string | PascalCase the characters in a string. | -| [pathcase](https://github.com/helpers/handlebars-helpers#pathcase) | string | `path/case` the characters in a string. | -| [plusify](https://github.com/helpers/handlebars-helpers#plusify) | string | Replaces spaces in the given string with pluses. | -| [reverse](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/3p/string.js#L280) | string | Reverses a string. | -| [sentence](https://github.com/helpers/handlebars-helpers#sentence) | string | Sentence case the given string. | -| [snakecase](https://github.com/helpers/handlebars-helpers#snakecase) | string | `snake_case` the characters in the given string. | -| [split](https://github.com/helpers/handlebars-helpers#split) | string | Splits a string by the given character. | -| [startsWith](https://github.com/helpers/handlebars-helpers#startsWith) | string | Tests whether a string begins with the given prefix. | -| [titleize](https://github.com/helpers/handlebars-helpers#titleize) | string | Title case the given string. | -| [trim](https://github.com/helpers/handlebars-helpers#trim) | string | Removes extraneous whitespace from the beginning and end of a string. | -| [uppercase](https://github.com/helpers/handlebars-helpers#uppercase) | string | Uppercase all of the characters in the given string. If used as a block helper it will uppercase the entire block. This helper does not support inverse blocks. | -| [encodeURI](https://github.com/helpers/handlebars-helpers#encodeURI) | url | Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character. | -| [decodeURI](https://github.com/helpers/handlebars-helpers#decodeURI) | url | Decodes a Uniform Resource Identifier (URI) component. | -| [urlResolve](https://github.com/helpers/handlebars-helpers#urlResolve) | url | Takes a `base` URL and a `href` URL and resolves them as a browser would for an anchor tag. | -| [urlParse](https://github.com/helpers/handlebars-helpers#urlParse) | url | Parses a URL string into an object. | -| [stripProtocol](https://github.com/helpers/handlebars-helpers#stripProtocol) | url | Strips protocol from a URL. Useful for displaying media that may have an 'http' protocol on secure connections. | - -## Contributing to helpers - -BigCommerce's custom Handlebars helpers are open source. To contribute, make a pull request to [bigcommerce/paper-handlebars](https://github.com/bigcommerce/paper-handlebars). - -## Resources - -* [Widgets](/docs/storefront/widgets) -* [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config) -* [Cornerstone](https://github.com/bigcommerce/cornerstone) -* [Paper Handlebars](https://github.com/bigcommerce/paper-handlebars/tree/master/helpers) -* [Handlebars.js](https://handlebarsjs.com/) - +# Handlebars Helpers Reference + +This article is a reference for [Stencil](/docs/storefront/stencil/start) supported [Handlebars](https://handlebarsjs.com/) helpers. It includes [custom helpers](#custom-helpers) documentation and a list of acceptlisted [standard helpers](#standard-helpers). + +## Custom helpers + +The following table contains BigCommerce's open source [Handlebars helpers](https://github.com/bigcommerce/paper-handlebars/tree/master/helpers). + +| Helper | Category | Description | +|:-------|:---------|:------------| +| [limit](#limit) | array | Limits array to second argument. | +| [pluck](#pluck) | array | Uses search key to get values from collections. | +| [cdn](#cdn) | assets | A URL transformer for content delivery networks. | +| [earlyHint](#earlyhint) | assets | Reduces page load time and perceived latency. | +| [money](#money) | currency | Formats number length, thousands delimiter, and decimal delimiter. | +| [moment](#moment) | date | Use [momentjs](https://momentjs.com/) to format and calculate dates. | +| [getFontLoaderConfig](#getfontloaderconfig) | fonts | Returns font-loader config as a JSON string. | +| [getFontsCollection](#getfontscollection) | fonts | Returns `<link>` elements for configured fonts. | +| [encodeHtmlEntities](#encodehtmlentities) | html | Encodes HTML entities. | +| [nl2br](#nl2br) | html | Converts newline characters to `<br>` tags. | +| [pre](#pre) | html | Renders preformatted text. | +| [resourceHints](#resourcehints) | html | Pre-fetches Google fonts. | +| [stylesheet](#stylesheet) | html | Renders a `<link>` tag for inserting a stylesheet. | +| [lang](#lang) | i18n | Maps keys to translation files. | +| [langJson](#langjson) | i18n | Returns language translation keys as a JSON string. | +| [getContentImage](#getcontentimage) | images | Returns sized image URL from store's `/content` directory. | +| [getContentImageSrcset](#getcontentimagesrcset) | images | Returns source set of URLs for images in `/content`. | +| [getImage](#getimage) | images | Returns image URL for specified size. | +| [getImageManagerImage](#getimagemanagerimage) | images | Returns sized image URL for images in `/product_images/uploaded_images`. | +| [getImageManagerImageSrcset](#getimagemanagerimagesrcset) | images | Returns image srcset for images in `/product_images/uploaded_images`. | +| [getImageSrcset](#getimagesrcset) | images | Returns single image URL or list of URLs for different sizes. | +| [any](#any) | logic | Renders block if **any** params are true. | +| [all](#all) | logic | Renders block if **all** params are true. | +| [compare](#compare) | logic | Compares values with JavaScript operators, including `typeof`. | +| [contains](#contains) | logic | Renders block if first param is in second param. | +| [for](#for) | logic | Iterates for range `a` to `b`, inclusive of `b`. | +| [if](#if) | logic | Renders block if statement is true. | +| [or](#or) | logic | Renders block if one or more parameters evaluate to true. | +| [unless](#unless) | logic | Renders block if a statement evaluates to false. | +| [option](#option) | misc | Returns the given value of `prop` from `this.options`. | +| [get](#get) | object| Use property paths (`a.b.c`) to get a value or nested value from the context. | +| [getObject](#getobject) | object| Use property paths (`a.b.c`) to get an object from the context. | +| [concat](#concat) | string | Concatenates two strings. | +| [join](#join) | string | Joins an array of string elements into one string. | +| [json](#json) | string | Converts a JavaScript object into a JSON string. | +| [occurrences](#occurrences) | string | Returns the number of occurrences of substring within the given string. | +| [replace](#replace) | string | Replaces all instances of the first parameter in the second parameter. | +| [setURLQueryParam](#seturlqueryparam) | string | Appends keys values to a URL. | +| [stripQuerystring](#stripquerystring) | string | Removes a query string. | +| [strReplace](#strreplace) | string | Replaces some or all occurrences of a target substring within a subject string. | +| [toLowerCase](#tolowercase) | string | Converts a string to lowercase. | +| [truncate](#truncate) | string | Truncates a string. | +| [block](#block) | template | Defines a content block. | +| [dynamicComponent](#dynamiccomponent) | template | Inserts a dynamic partial in the specified path. | +| [inject](#inject) | template | Injects key values into `{{jsContext}}`. | +| [jsContext](#jscontext) | template | Returns JSON for all data injected by `{{inject}}`. | +| [partial](#partial) | template | Overrides content defined by `{{block}}`. | +| [region](#region) | template | Specifies a widget region. | +| [assignVar](#assignvar) | variables | Saves value to a variable. | +| [getVar](#getvar) | variables| Returns a variable value. | +| [decrementVar](#decrementvar) | variables | Decrements a variable by 1. | +| [incrementVar](#incrementvar) | variables | Increments a variable by 1. | + +### limit + +```handlebars showLineNumbers +{{limit data limit}} +``` + +Limits the number of items returned from an array; returns a new array. + +#### Parameters + +- `data` (Array): Collection. +- `limit` (Number): Index specifying the number of items to exclude. + + +#### Example + +Assume that `{{cart.items}}` returns 10 items. You can use this helper to limit that behavior to only the first four items. + +```handlebars showLineNumbers +<!-- context = {var: 'This is longer than the chosen limit'} --> +{{limit var 10}} +<!-- => This is lo --> +``` + +```handlebars showLineNumbers +<!-- context = {var: 'This is longer than the chosen limit'} --> +{{limit var 10}} +<!-- results in: 'This is lo' --> +``` + +```handlebars showLineNumbers +{{#each (limit cart.items 4)}} + <li class="previewCartItem"> + <div class="previewCartItem-image"> + {{#if type '==' 'GiftCertificate'}} + <img src="{{cdn ../../theme_settings.default_image_gift_certificate}}" alt="GiftCertificate" title="GiftCertificate"> + {{else}} + {{> components/common/responsive-img + image=image + fallback_size=../../theme_settings.productthumb_size + lazyload=../../theme_settings.lazyload_mode + default_image=../../theme_settings.default_image_product + }} + {{/if}} + </div> + </li> +{{/each}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/limit.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=limit) + +### pluck + +```handlebars showLineNumbers +{{pluck limit collection path}} +``` + +Retrieves corresponding values from some or all elements in a collection using specified search key(s). Returns retrieved values in a comma-separated string. When used in conjunction with the built-in `{{each}}` helper, returns retrieved values in an array. + +#### Parameters + +- `limit`, `limit-value`: Optional parameters to limit the number of results returned. +- `collection` (Object|Array): Collection. +- `path` (String): The string to search for. + +#### Examples + +```handlebars showLineNumbers +{{pluck ([limit] <collection> [<limit-value>]) '<path>'}} +``` + +If each category in `categories` contains an image object, use dot notation to access the image's children: + + +```json showLineNumbers +categories: [ + { "id": 1, "name": "Bakeware", "image": { "data": "http://...", "alt": "Bakeware image"} }, + { "id": 2, "name": "Cookware", "image": { "data": "http://...", "alt": "Cookware image"} }, + { "id": 3, "name": "Cutlery", "image": { "data": "http://...", "alt": "Cutlery image"} } +] +``` +```handlebars showLineNumbers +{{pluck (limit categories 2) 'image.data'}} +<!-- Returns a comma-separated list of image URLs. --> +``` + +```json showLineNumbers +users: [ + { "user": "barney", "age": 36, "image": { "url": "barney.jpg" } }, + { "user": "fred", "age": 40, "image": { "url": "fred.jpg" } } +] +``` + +```handlebars showLineNumbers +{{pluck users "age"}} +<!-- => 36,40 --> + +{{pluck users "image.url"}}' +<!-- => barney.jpg,fred.jpg --> + +Standard pluck helper example: +// {{pluck items "data.title"}} +results in: '["aa", "bb", "cc"]' +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/pluck.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=pluck) + + +### cdn + +```handlebars showLineNumbers +{{cdn assetPath}} +``` + +A URL transformer for content delivery networks. + +#### Parameters + +- `assetPath` (String): Path to the file containing static assets. + + +#### Example + +```handlebars showLineNumbers +{{cdn "assets/img/image.jpg"}} +<!-- => https://cdn.bcapp/3dsf74g/stencil/123/img/image.jpg --> +``` + +To reference static assets staged locally outside your `<theme-name>` directory and uploaded using WebDAV, place the `webdav:` prefix before each corresponding `assetPath` parameter. For example, the following link: + +```handlebars showLineNumbers +<img src="{{cdn 'webdav:img/image.jpg'}}"> +``` + +will be transformed to a result like this: + + +```handlebars showLineNumbers +<img src="https://cdn.bcapp/3dsf74g/content/img/image.jpg"> +``` + +In this example, the `image.jpg` file was uploaded to the WebDAV `/content/` directory making `/content` the WebDAV root directory. Because our presumed local directory is `assets/`, we can omit that path when referencing its contained files or subdirectories. + +#### CDN custom endpoints + +You can define custom CDN endpoints to use with the `{{cdn}}` helper. By doing so you can include large, high-resolution image assets in themes without exceeding BigCommerce's [50 MB limit](/docs/storefront/stencil/deployment/upload) when bundling the theme for upload to BigCommerce. + +You can also use a local version of the image in development and a remote version on a CDN such as Imgix in production. To do so, define custom CDN endpoints in your theme's [`config.json` file](https://github.com/bigcommerce/cornerstone/blob/master/config.json). + +For example: + +```json showLineNumbers +{ + "name": "Cornerstone", + "version": "1.3.5", + "settings": { + "homepage_new_products_count": 12, + "homepage_featured_products_count": 8, + "cdn": { + "customcdn": "https://bigcommerce.customcdn.net" + } + } +} +``` + +After defining the endpoint, you can use the short name in the same way as you use a `webdav:` protocol: + +```handlebars showLineNumbers +<img src="{{cdn 'customcdn:img/image.jpg'}}" /> +``` + +In local development, the helper returns the following: + +```handlebars showLineNumbers +<img src="/assets/cdn/customcdn/img/image.jpg"/> +``` + +In production environment, the helper returns the following: + +```handlebars showLineNumbers +<img src="https://bigcommerce.customcdn.net/img/image.jpg" /> +``` + +As highlighted above, the helper is configured to rewrite *local* URLs to an `assets/cdn/` subfolder. The `stencil bundle` command will exclude this local `assets/cdn/` subfolder from the bundle that it creates. This filtering circumvents the 50 MB size limit on the resulting ZIP file. + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/cdn.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=cdn) + +#### Early Hint and cdn + +Early Hints reduce page load time and perceived latency by allowing browsers to download critical assets earlier in the request lifecycle. For more information, see [Early Hint](#earlyhint). + + + +##### Parameters + +- `resourceHint` - (String) + - Corresponds to the `rel` attribute in `<link>`. + - Value can be any of `preload`, `preconnect`, `prerender`, `dns-prefetch`. + - For more information, see [rel](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel) on MDN Web Docs. +- `as` - (String) + - Corresponds to the `as` attribute in `<link>`. + - Value can be any of `style`, `font`, `script`, `document`. + - If an invalid value is provided, `as` won't be included. + - This parameter is optional. + + - For more information, see [as](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-as) on MDN Web Docs. +- `crossorigin` - (String) + - Value can be any of `no`, `anonymous`, `use-credentials`. + - Defaults to `no` when no value is provided. + - This parameter is optional. + + - For more information, see [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-crossorigin) on MDN Web Docs. + +##### Example + +The following script is an example of Early Hints usage in the Cornerstone theme: + +```javascript showLineNumbers +<script async src="{{cdn 'assets/dist/theme-bundle.head_async.js' resourceHint='preload' as='script'}}"></script> +``` + +You can view more Early Hints usage in Cornerstone's `templates/layout/base.html` file by visiting the [Cornerstone Repository](https://github.com/bigcommerce/cornerstone/commit/f70fcd502343503969c2e475b777a85347137542#). + +### EarlyHint + +```handlebars showLineNumbers +{{ earlyHint '{path}' '{rel}' [as='{script|style|font}'] [crossorigin='{no|anonymous|use-credentials}'] }} + +``` + +Retrieves the provided URL and produces an early hint to communicate important web page resources. The server indicates which site assets (such as CSS files, JS scripts, and fonts) a browser needs to render a page fully. When used in conjunction with the `{{cdn}}` helper, load times can improve by 30%. + +#### Parameters + +- `path` (String): The URL that hosts the resource being hinted. + +- `rel` (String): Valid arguments are `preload`, `preconnect`, `prerender`, and `dns-prefetch`. + +- `as` (String): Optional. Valid arguments are `script`, `style`, `font`. + +- `crossorigin` (String): Optional. Valid arguments are `no` (default), `anonymous`, and `use-credentials`. + +#### Examples + +```handlebars showLineNumbers +{{earlyHint 'https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js' 'preload' as='script' crossorigin='anonymous'}} +``` + +This example produces an early hint in a `Link` header that looks like: + +```handlebars showLineNumbers +<https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js>; rel=preload; as=script; crossorigin=anonymous +``` + +The following example uses the `getFontsCollection` and `stylesheet` helpers. These helpers produce early hints by default, without using the `earlyHint` helper directly. + +```handlebars showLineNumbers +<script async src="{{cdn 'assets/dist/theme-bundle.head_async.js' resourceHint='preload' as='script'}}"></script> + +{{getFontsCollection font-display='block'}} + +<script async src="{{cdn 'assets/dist/theme-bundle.font.js' resourceHint='preload' as='script'}}"></script> + +{{{stylesheet '/assets/css/theme.css'}}} +``` + +The output displays in a `Link` header that looks like: + +``` showLineNumbers +Link: <https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/dist/theme-bundle.head_async.js>; rel=preload; as=script; crossorigin=anonymous, +<https://fonts.googleapis.com/css?family=Montserrat:700,500,400%7CKarla:400&display=block>; rel=preload; as=style, <https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/dist/theme-bundle.font.js>; rel=preload; as=script +<https://cdn.staging.zone/s-cq2iowdr0q/stencil/94e324f0-d179-013b-2a85-0ac13303cc0f/css/theme-6bec0d40-d17a-013b-e9d8-02ea0e5c37ab.css>; rel=preload; as=style +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/earlyHint.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/commit/f70fcd502343503969c2e475b777a85347137542#) + +### moment + +```handlebars showLineNumbers +{{moment date format}} +``` + +Use [momentjs](https://momentjs.com/) to format and calculate dates. + +#### Examples + +```handlebars showLineNumbers +{{moment "5 hours ago" "MM/DD/YYYY HH:mm"}} +<!-- example calculation --> +``` + +If you encounter an issue with the last day of the month, use one of the following fixes: + +```handlebars showLineNumbers +{{moment date format datejs=false}} +<!-- To disable date.js --> +``` + +```handlebars showLineNumbers +{{moment "January 1, 2022" format="YYYY-MM-DD"}} +<!-- To call moment.js functions --> +``` + +### money + +```handlebars showLineNumbers +{{money value n s c}} +``` + +Formats number length, thousands delimiter, and decimal delimiter. + +#### Parameters + +- `value` (Number): The number to format. +- `n` (Integer): Length of decimal. +- `s` (Mixed): Thousands delimiter. +- `c` (Mixed): Decimal delimiter. + +#### Example + +```handlebars showLineNumbers +{{money 1000 2 ',' '.'}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/money.js) + +### getFontLoaderConfig + +```handlebars showLineNumbers +{{getFontLoaderConfig fontConfig}} +``` + +Returns font-loader config as a JSON string. + +#### Parameters + +- `fontConfig` (String): Font config in the `Google_FontName_Weight` format. + +#### Example + +```handlebars showLineNumbers +{{getFontLoaderConfig 'Google_Karla_700'}} +<!-- => Karla:700 --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getFontLoaderConfig.js) + +### getFontsCollection + +```handlebars showLineNumbers +{{getFontsCollection}} +``` + +Returns `<link>` elements for configured fonts. + +#### Example + +```handlebars showLineNumbers +{{getFontsCollection}} +<!-- => <link href="https://fonts.googleapis.com/css?family=Open+Sans:,400italic,700|Karla:700|Lora:400|Volkron:|Droid:400,700|Crimson+Text:400,700&display=swap" rel="stylesheet"> --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getFontsCollection.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getFontsCollection) + + +### encodeHtmlEntities + +```handlebars showLineNumbers +{{encodeHtmlEntities string args}} +``` + +Returns a string with HTML entities encoded. You may optionally pass additional encoding arguments. + +#### Parameters + +- `string` (String): String to encode with HTML entities. +- `args` (Boolean): Acceptlist of allowed named arguments. Allowed arguments: `useNamedReferences`, `decimal`, `encodeEverything`, `allowUnsafeSymbols`. Specify `arg='true'` to use. For example, `decimal='true'`. + +#### Examples + +```handlebars showLineNumbers +{{encodeHtmlEntities 'foo © bar ≠ baz 𝌆 qux'}} +<!-- => foo © bar ≠ baz 𝌆 qux --> + +{{encodeHtmlEntities 'an ampersand: &'}} +<!-- => an ampersand: & --> + +{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" useNamedReferences="true"}} +<!-- Returns a string with HTML entities encoded with named references. --> +<!-- => foo © bar ≠ baz 𝌆 qux --> + +{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" decimal="true"}} +<!-- Returns a string with HTML entities encoded with decimal option. --> +<!-- => foo © bar ≠ baz 𝌆 qux --> + +{{encodeHtmlEntities "foo © bar ≠ baz 𝌆 qux" encodeEverything="true"}} +<!-- Returns a string with HTML entities encoded with encodeEverything option. --> +<!-- => foo © bar ≠ baz 𝌆 qux --> + +{{encodeHtmlEntities "foo © and & ampersand" allowUnsafeSymbols="true"}} +<!-- Returns a string with HTML entities encoded with allowUnsafeSymbols option. --> +<!-- => foo © and & ampersand --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/encodeHtmlEntities.js) + +### nl2br + +```handlebars showLineNumbers +{{nl2br text}} +``` + +Converts newline characters to `<br>` tags. + +#### Parameters + +- `text` (String): Text to convert. + +#### Example + +```handlebars showLineNumbers +{{nl2br settings.address}} +<!-- => <br>685 Market St<br>San Francisco<br>94105<br>CA<br> --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/nl2br.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=nl2br) + +### pre + +```handlebars showLineNumbers +{{pre value}} +``` + +Renders preformatted text. This helper will escape text. + +#### Parameters + +- `value` (String): Text to format. + +#### Example + +```handlebars showLineNumbers +<!-- context = {var: {}} --> +{{pre var}} +<!-- => <pre>{}</pre> --> + +<!-- context = {var: "<div>&\"500\"</div>"} --> +{{pre var}} +<!-- => <pre>"<div>&\\"500\\"</div>"</pre> --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/pre.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=pre) + +### resourceHints + +```handlebars showLineNumbers +{{resourceHints}} +``` + +Pre-fetches Google fonts. Outputs a formatted `<link>` tag for DNS-prefetch. + +#### Example + +```handlebars showLineNumbers +{{resourceHints}} +<!-- => <link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com" crossorigin><link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com" crossorigin> --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/resourceHints.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=resourceHints) + +### stylesheet + +```handlebars showLineNumbers +{{stylesheet assetPath}} +``` + +Renders a link tag to insert a stylesheet into a theme; returns an HTML string. (This is required if you want Theme Editor to rewrite the stylesheet file when a merchant customizes their theme.) + +#### Parameters + +- `assetPath` (String): Filepath to the theme's CSS stylesheet file. +- `options`: You can append optional parameters as key/value pairs. + +#### Example + +```handlebars showLineNumbers +{{stylesheet "assets/css/style.scss" class="myStylesheet"}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/stylesheet.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=stylesheet) + +### lang + +```handlebars showLineNumbers +{{lang translationKey}} +``` + +Maps keys to translation files based on the locale indicated by the visitor’s browser. + +#### Parameters + +- `translationKey`(String) +- `options`: You can append optional parameters as key/value pairs. + +#### Examples + +```handlebars showLineNumbers +<label class="form-label" for="search_query_adv"> + {{lang 'forms.search.query' }} + <small>{{lang 'common.required' }}</small> +</label> +``` + +```handlebars showLineNumbers +<!-- context = {name: 'BigCommerce'} --> +{{lang 'powered_by' name=name}} +<!-- => Powered By BigCommerce --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/lang.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=lang) + +### langJson + +```handlebars showLineNumbers +{{langJson keyFilter}} +``` + +Returns language translation keys as a JSON string. + +#### Parameters + +- `keyFilter` (String): The language translation keys to render for the storefront locale/language. + +#### Example + +```handlebars showLineNumbers +{{langJson 'validation_messages'}} +<!-- This will load validation messages in JSON format for the storefront locale/language. --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/langJson.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=langJson) + +### getContentImage + +```handlebars showLineNumbers +{{getContentImage path width height}} +``` + +Returns a URL for an image uploaded to `/dav/content/`. To learn more about uploading files to your store's server, see [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + +#### Parameters + +- `path` (String): Image path relative to `/dav/content/`. +- `width` (Integer): Width in pixels. +- `height` (Integer): Height in pixels. + +#### Example + +```handlebars showLineNumbers +<!-- Original image URL returned if no size or invalid size is passed in --> +{{getContentImage "asset.jpg"}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/content/asset.jpg --> + +{{getContentImage "asset.jpg" width="a" height="a"}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/content/asset.jpg --> + +<!-- Sized image URL returned if valid height and/or width passed in --> +{{getContentImage "asset.jpg" width=123 height=321}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123x321/content/asset.jpg --> + +{{getContentImage "asset.jpg" width=123}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123w/content/folder/asset.jpg --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getContentImage.js) + +### getContentImageSrcset + +```handlebars showLineNumbers +{{getContentImageSrcset path}} +``` + +Returns a `srcset` for an image uploaded to `/dav/content/`. + +#### Parameters + +- `path` (String): Image path relative to `/dav/content/`. + +#### Example + +```handlebars showLineNumbers +{{getContentImageSrcset "asset.jpg"}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/80w/content/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/content/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/content/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/content/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/content/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/content/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/content/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/content/asset.jpg 2560w --> + +{{getContentImageSrcset "folder/asset.jpg" width=123}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/80w/content/folder/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/content/folder/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/content/folder/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/content/folder/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/content/folder/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/content/folder/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/content/folder/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/content/folder/asset.jpg 2560w --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getContentImageSrcset.js) + +### getImage + +```handlebars showLineNumbers +{{getImage stencilImage size}} +``` + +Returns `<img>` tag `src` value for images of a specified size. Values for the size parameter are defined in the `settings` array in [`config.json`](https://github.com/bigcommerce/cornerstone/blob/master/config.json). + +#### Parameters + +- `stencilImage` (String): A Stencil image. +- `size` (String): A key in the `theme_settings` object. +- `defaultImage` (String): Optional default image URL to use if the `stencilImage` is undefined. + +#### Example + +```handlebars showLineNumbers +{{getImage image "logo"}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImage.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getImage) + +### getImageManagerImage + +```handlebars showLineNumbers +{{getImageManagerImage path width height}} +``` + +Returns an [Image Manager](https://support.bigcommerce.com/s/article/Using-the-Image-Manager) image URL for an image uploaded to `/dav/product_images/uploaded_images`. To learn more about uploading files to your store's server, see [WebDAV](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + +#### Parameters + +- `path` (String): Image path relative to `/dav/product_images/uploaded_images`. +- `width` (Integer): Width in pixels. +- `height` (Integer): Height in pixels. + +#### Example + +```handlebars showLineNumbers +<!-- Original image URL returned if no size or invalid size is passed in --> +{{getImageManagerImage "asset.jpg"}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/image-manager/asset.jpg --> + +<!-- height must be accompanied by width --> +{{getImageManagerImage "folder/asset.jpg" height=123}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/original/image-manager/folder/asset.jpg --> + +<!-- Sized image URL returned if valid height and/or width passed in --> +{{getImageManagerImage "asset.jpg" width=123}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123w/image-manager/asset.jpg --> + +{{getImageManagerImage "folder/asset.jpg" width=123 height=321}} +<!-- => https://cdn.bcapp/3dsf74g/images/stencil/123x321/image-manager/folder/asset.jpg --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageManagerImage.js) + +### getImageManagerImageSrcset + +```handlebars showLineNumbers +{{getImageManagerImageSrcset path}} +``` + +Returns an [Image Manager](https://support.bigcommerce.com/s/article/Using-the-Image-Manager) image `srcset` for an image uploaded to `/dav/product_images/uploaded_images`. To return an image with a specified image width and height size, we recommend using the `getImageManagerImage` helper. + +#### Parameters + +- `path` (String): Image path relative to `/dav/product_images/uploaded_images`. + +#### Example + +```handlebars showLineNumbers +{{getImageManagerImageSrcset "asset.jpg"}} +<!-- => +https://cdn.bcapp/3dsf74g/images/stencil/80w/image-manager/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/image-manager/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/image-manager/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/image-manager/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/image-manager/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/image-manager/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/image-manager/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/image-manager/asset.jpg 2560w --> + +{{getImageManagerImageSrcset "folder/asset.jpg"}} + <!-- => +https://cdn.bcapp/3dsf74g/images/stencil/80w/image-manager/folder/asset.jpg 80w, https://cdn.bcapp/3dsf74g/images/stencil/160w/image-manager/folder/asset.jpg 160w, https://cdn.bcapp/3dsf74g/images/stencil/320w/image-manager/folder/asset.jpg 320w, https://cdn.bcapp/3dsf74g/images/stencil/640w/image-manager/folder/asset.jpg 640w, https://cdn.bcapp/3dsf74g/images/stencil/960w/image-manager/folder/asset.jpg 960w, https://cdn.bcapp/3dsf74g/images/stencil/1280w/image-manager/folder/asset.jpg 1280w, https://cdn.bcapp/3dsf74g/images/stencil/1920w/image-manager/folder/asset.jpg 1920w, https://cdn.bcapp/3dsf74g/images/stencil/2560w/image-manager/folder/asset.jpg 2560w --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageManagerImageSrcset.js). + +### getImageSrcset + +```handlebars showLineNumbers +{{getImageSrcset stencilImage size}} +``` + +The `getImageSrcset` helper is a replacement for [`getImage`](#getImage) which allows you to generate either a single image URL (for an `<img>` `src`) or a list of image sizes for `srcset`. Using the [srcset](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-srcset) attribute, you can specify a list of image sizes for the browser to choose from based on the expected size of the image on the page, the device's pixel density, and other factors. + +#### Parameters + +- `stencilImage` (String): A Stencil image. +- `size` (String): A key in the `theme_settings` object. +- `defaultImage` (String): Optional default image URL to use if the `stencilImage` is undefined. + +You can specify what sizes you want as named arguments on the helper. + +#### Example + +**Default sizes** + +By specifying `use_default_sizes=true` on the helper, a `srcset` string will be constructed with a set of sizes chosen by BigCommerce to be optimal for most uses. + +```handlebars showLineNumbers +{{getImageSrcset image use_default_sizes=true}} +{{getImageSrcset image "https://place-hold.it/500x300" use_default_sizes=true}} +``` + +Default sizes: + +```html showLineNumbers +'80w': '80w', +'160w': '160w', +'320w': '320w', +'640w': '640w', +'960w': '960w', +'1280w': '1280w', +'1920w': '1920w', +'2560w': '2560w', +``` + +**Single 1x size** + +```handlebars showLineNumbers +{{getImageSrcset image 1x=theme_settings.zoom_size}} +{{getImageSrcset image 1x="1280x800"}} +{{getImageSrcset image 1x="1280w"}} +``` + +By specifying a single size as `1x`, you can choose any image resolution. You can reference a value from the `theme_settings` object (similar to `getImage`), or you can specify your own size inline. `getImageSrcset` does not require `theme_settings` keys to be wrapped in quotes; they should be referenced directly. + +**Pixel density** + +```handlebars showLineNumbers +{{getImageSrcset image 1x="1280w" 2x="2560w"}} +{{getImageSrcset image 1x="800w" 1.5x="1200w" 2x="1600w"}} +{{getImageSrcset image 1x="640x640" 2x="1280x1280"}} +``` + +By specifying several sizes using the pixel density descriptor, you can generate a `srcset` of different image resolutions for different pixel density screens as described in [Resolution switching: Same size, different resolutions](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#Resolution_switching_Same_size_different_resolutions). For example, you can specify a `2x` image for Retina screens, and a `1x` image for normal screens. + +As above, you can reference `theme_settings` keys or specify your own size inline. + +**Inherent width** + +```handlebars showLineNumbers +<img src="{{getImage image 'default'}}" srcset="{{getImageSrcset image 100w='100w' 200w='200w' 300w='300w'}}" /> + +<!-- => +<img src="https://cdn11.bigcommerce.com/s-abc123/images/stencil/640x640/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2" srcset="https://cdn11.bigcommerce.com/s-abc123/images/stencil/100w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 100w, https://cdn11.bigcommerce.com/s-abc123/images/stencil/200w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 200w,https://cdn11.bigcommerce.com/s-abc123/images/stencil/300w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 300w" /> --> + +<img src="{{getImageSrcSet image 1x='1000x1000'}}" srcset="{{getImageSrcset image 1x='1000x1000' 2x='2000x2000'}}" /> + +<!-- => +<img src="https://cdn11.bigcommerce.com/s-abc123/images/stencil/640x640/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2" srcset="https://cdn11.bigcommerce.com/s-abc123/images/stencil/100w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 100w, https://cdn11.bigcommerce.com/s-abc123/images/stencil/200w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 200w,https://cdn11.bigcommerce.com/s-abc123/images/stencil/300w/products/86/286/ablebrewingsystem4_1024x1024__07155.1456436672.jpg?c=2 300w" /> --> +``` + +By specifying several sizes using the inherent width descriptor, you can generate a `srcset` of different image resolutions based on width, which can in turn be selected by the browser based on the expected size of the image when the page is painted. It is recommended to use this together with a `sizes` attribute on the `<img>` element as described in [Resolution switching: Different sizes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images#Resolution_switching_Different_sizes). In Cornerstone, this is handled automatically via JavaScript. + +As above, you can reference `theme_settings` keys or specify your own size inline. + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getImageSrcset.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=getImageSrcset) + +### any + +```handlebars showLineNumbers +{{any arg}} +``` + +Renders block if one or more parameters are true. + +#### Parameters + +- `arg` (String|Number|Array|Object) + +#### Example + +```handlebars showLineNumbers +{{#any items selected=true}} + <!-- block to display if any items have selected=true --> +{{/any}} +``` + +A usage example is [`templates/components/category/shop-by-price.html`](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/category/shop-by-price.html), a category page in Stencil's Cornerstone base theme that does _not_ have faceted search turned on. Shoppers will see **Shop by price** filters instead of product filters. + +In this component, the `{{any}}` helper is used to determine whether a shopper has selected one of the filters, and whether a "reset" button needs to be displayed: + +```handlebars showLineNumbers +{{#any shop_by_price selected=true}} + <li class="navList-item"> + <a href="{{category_url}}" class="navList-action"> + {{lang 'category.reset'}} + </a> + </li> +{{/any}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/any.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=any) + +### all + +```handlebars showLineNumbers +{{all arg}} +``` + +Renders block if all parameters are true. + +#### Parameters + +- `arg` (String|Number|Array|Object) + +#### Example + +```handlebars showLineNumbers +{{#all items theme_settings.optionA theme_settings.optionB}} + <!-- block to display if all items evaluate to true --> +{{/all}} +``` + +```handlebars showLineNumbers +{{#all product.custom_fields theme_settings.show_custom_fields_tabs}} + <li class="tab"> + <a class="tab-title" href="#tab-{{dashcase (lowercase (sanitize theme_settings.pdp-custom-fields-tab-label))}}">{{sanitize theme_settings.pdp-custom-fields-tab-label}}</a> + </li> +{{/all}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/all.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=all) + +### compare + +```handlebars showLineNumbers +{{compare a operator b}} +``` + +Compares values with JavaScript operators. Renders block if comparison of the first and third parameters returns true. + +#### Parameters + +- `a` () +- `operator` (): The operator to use. Operators must be enclosed in quotes: `>`, `=`, `<=`, and so on. + * `==` + * `===` + * `!=` + * `!===` + * `<` + * `>` + * `<=` + * `>=` + * `typeof` +- `b` () +- `options` (Object): Options object. +- `returns` (String): Block, or if specified the inverse block is rendered if falsy. + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/compare.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=compare) + +### contains + +```handlebars showLineNumbers +{{contains collection value}} +``` + +Renders block if `collection` has the given `value`, using strict equality (`===`) for comparison, otherwise the inverse block is rendered (if specified). If a `startIndex` is specified and is negative, it is used as the offset from the end of the collection. + +#### Parameters + +- `collection` (Array|Object|String): The collection to iterate over. +- `value` (String|Number|Array|Object): The value to check for. + +#### Example + +```handlebars showLineNumbers +<!-- array = ['a', 'b', 'c'] --> +{{#contains array "d"}} + This will not be rendered. +{{else}} + This will be rendered. +{{/contains}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/contains.js) + +### for + +```handlebars showLineNumbers +{{for a b}} +``` + +Repeats block for a specified range from index `a` to index `b`. To protect against infinite loops, this helper is limited to 100 iterations. + +#### Parameters + +- `a` (Number): Starting number. +- `b` (Number): Ending number. (Inclusive) + +#### Example + +```handlebars showLineNumbers +{{#for 1 12}} + {{lang (concat 'common.short_months.' $index)}} +{{/for}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/for.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=for) + +### if + +```handlebars showLineNumbers +{{if arg}} +``` + +Renders `if` block when if-statement evaluates to true; otherwise renders `else` block. + +#### Parameters + +- `arg` (String|Number|Array|Object) + +#### Example + +```handlebars showLineNumbers +{{#if page_type '===' 'account_order'}} + <li class="navBar-item is-active"> + <a class="navBar-action" href="{{urls.account.orders.all}}">{{lang 'account.nav.orders'}}</a> + </li> +{{else}} + <li class="navBar-item is-active">{{lang 'account.nav.orders'}}</li> +{{/if}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/if.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=if) + +### or + +```handlebars showLineNumbers +{{or arg}} +``` + +Renders block if one or more parameters evaluates to true. + +#### Parameters + +- `arg` (String|Number|Array|Object): Parameters can be of mixed types. + +#### Example + +```handlebars showLineNumbers +{{#or 1 0 0 0 0 0 0}} +<!-- 1 evaluates to true, so block is rendered--> +{{/or}} +``` + +```handlebars showLineNumbers +{{#or options configurable_fields}} + <a href="#" data-item-edit="{{id}}">{{lang 'cart.checkout.change'}}</a> +{{/or}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/or.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=or) + +### unless + +```handlebars showLineNumbers +{{unless arg}} +``` + +Renders a block if a statement is false; does not support operators for comparison expressions. + +#### Parameters + +- `arg` (String|Number|Array|Object) + +#### Example + +```handlebars showLineNumbers +{{#each category_results}} +<li class="category-suggestion"> + {{#each this}} + <a href="{{url}}">{{name}}</a> + {{#unless @last}} > {{/unless}} + {{/each}} +</li> +{{/each}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/unless.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=unless) + + +### option + +```handlebars showLineNumbers +<!-- context = {options: {a: {b: {c: 'ddd'}}}} --> + * {{option "a.b.c"}} + * <!-- results => `ddd` --> +``` +Returns the given value of prop from `this.options`. + +#### Example + +```js showLineNumbers +context = { + "options": { + "a": { + "b": { + "c": "ddd" + } + } + } +} +``` + +`{{option "a.b.c"}}` returns "ddd" + + +### get +```handlebars showLineNumbers +{{get (concat “a.b.c.d”) someObject}} +``` +Use property paths (`a.b.c`) to get a value or nested value from the context. Works as a regular helper or block helper. You can use return values from the `concat` helper as property paths. + +#### Example + +```handlebars showLineNumbers +{{#get "posts" blog}}{{/get}} +``` + +### getObject + +```handlebars showLineNumbers +{{#with (getObject "a.b.c" someObject)}}...{{/with}} +``` +Use property paths (`a.b.c`) to get an object from the context. Differs from the `get` helper in that this helper will return the actual object including the given property key. This helper does not work as a block helper. + +### concat + +```handlebars showLineNumbers +{{concat value otherValue}} +``` + +Concatenates two strings. + +#### Parameters + +- `value` (String) +- `otherValue` (String) + +#### Example + +```handlebars showLineNumbers +{{concat 'hello' 'world'}} +<!-- => helloworld --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/concat.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=concat) + +### join + +```handlebars showLineNumbers +{{join values separator}} +``` + +Joins an array of string elements into a single string. + +#### Parameters + +- `values` (Array) +- `separator` (String) +- `limit=<number>`: An optional limit. + +#### Example + +```handlebars showLineNumbers +<!-- context = { + list: ['Mario', 'Chris', 'Mick', 'Hau', 'Cody'] +} --> +{{join list " "}} +<!-- => 'Mario Chris Mick Hau Cody' --> + +{{join list ", "}} +<!-- => 'Mario, Chris, Mick, Hau, Cody' --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/join.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=join) + +### json + +```handlebars showLineNumbers +{{json object}} +``` + +Converts a JavaScript object into a JSON string. + +#### Parameters + +- `object` (Object): A JavaScript object. + +#### Example + +```handlebars showLineNumbers +<!-- context = { + object: { a: 1, b: "hello" } +} --> +{{json object}} +<!-- => '{"a":1,"b":"hello"}' --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/json.js) + +### occurrences + +```handlebars showLineNumbers +{{occurrences str substring}} +``` + +Returns the number of occurrences of substring within the given string. + +#### Parameters + +- `str` (String) +- `substring` (String) + +#### Example + +```handlebars showLineNumbers +{{occurrences "foo bar foo bar baz" "foo"}} +<!-- => 2 --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/occurrences.js) + +### replace + +```handlebars showLineNumbers +{{replace firstParam secondParam string}} +``` + +Replaces all instances of the first parameter in the second parameter with the child block. + +#### Parameters + +- `firstParam` (?) +- `secondParam` (?) +- `string` (String) + +#### Example + +```handlebars showLineNumbers +<!-- Replace all instances of `%%Syndicate%%` in `page.content` with `{{> components/page/rss_feed}}`. --> +{{#replace '%%Syndicate%%' page.content}} + {{> components/page/rss_feed}} +{{else}} + <p>{{{page.content}}}</p> +{{/replace}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/replace.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=replace) + +### setURLQueryParam + +```handlebars showLineNumbers +{{setURLQueryParam url key value}} +``` + +Appends key values to a URL. + +#### Parameters + +- `url` (String): The URL of the query parameter. +- `key` (String): The query parameter key. +- `value` (Number): The query parameter value of the stated key. + +#### Example + +```handlebars showLineNumbers +{{setURLQueryParam "http://example.com/image.jpg" "c" "2"}} +<!-- results in: http://example.com/image.jpg?c=2 --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/setURLQueryParam.js). + +### stripQuerystring + +```handlebars showLineNumbers +{{stripQuerystring url}} +``` + +Strips query string from a URL. + +#### Parameters + +- `url` (String): The URL containing the query parameter. + +#### Example + +```handlebars showLineNumbers +{{stripQuerystring "http://example.com?tests=true"}} +<!-- results in: http://example.com --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/stripQuerystring.js) + +### strReplace + +```handlebars showLineNumbers +{{strReplace subjectString targetSubstring newSubstring occurrenceSelection}} +``` + +Replaces some or all occurrences of a target substring within the subject string. + + +#### Parameters + +- `subjectString` (String): The original string to modify. +- `targetSubstring` (String): The substring in `subjectString` to be replaced. +- `newSubstring` (String): The substring to insert in place of `targetSubstring`. +- `occurenceSelection` (Integer): Optional. The number of occurrences of `targetSubstring` to replace with `newSubstring`. If you pass no argument or the supplied integer is greater than the number of `targetSubstring` occurrences, `newSubstring` will replace all instances of `targetSubstring`. A positive integer `n` will replace `n` instances of `targetSubstring`, starting from the left side of the string. Arguments of zero or less will replace no instances. Non-integer arguments may have unpredictable results. + +#### Example + +```handlebars showLineNumbers +<!-- Replace all instances --> +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two"}} +<!-- output: Buy two, get two half price. Limit two per customer. --> + +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 3}} +<!-- output: Buy two, get two half price. Limit two per customer. --> + +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 100}} +<!-- output: Buy two, get two half price. Limit two per customer. --> + + +<!-- Replace some instances --> +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 2}} +<!-- output: Buy two, get two half price. Limit one per customer. --> + + +<!-- Replace no instances --> +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" 0}} +<!-- output: Buy one, get one half price. Limit one per customer. --> + +{{strReplace "Buy one, get one half price. Limit one per customer." "one" "two" -2}} +<!-- output: Buy one, get one half price. Limit one per customer. --> +``` + +- [See the strReplace helper (GitHub)](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/strReplace.js) + +### toLowerCase + +```handlebars showLineNumbers +{{toLowerCase string}} +``` + +Converts a string to lowercase. + +#### Parameters + +- `string` (String): String you want to convert. + +#### Example + +```handlebars showLineNumbers +{{toLowerCase 'I Love PIZZA'}} +<!-- => i love pizza --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/toLowerCase.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=toLowerCase) + +### truncate + +```handlebars showLineNumbers +{{truncate string length}} +``` + +Truncates a string. + +#### Parameters + +- `string` (String): The string you want to truncate. +- `length` (Number): The desired length of the returned truncated string. + +#### Example + +```handlebars showLineNumbers +{{truncate "This will be truncated to only the first part of the sentence." 22}} +<!-- results in: 'This will be truncated' --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/truncate.js) + +### block + +```handlebars showLineNumbers +{{block string}} +``` + +Defines a block of content. You can overwrite it using the [partial](#partial) helper. + +#### Parameters + +- `string` (String) + +#### Example + +```handlebars showLineNumbers +<div class="container"> + {{#block "page"}} {{/block}} +</div> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/block.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=block) + +### dynamicComponent + +```handlebars showLineNumbers +{{dynamicComponent path}} +``` + +Inserts a dynamic partial in the specified path. + +#### Parameters + +- `path` (String): The path to insert a dynamic component in. + +#### Example + +```handlebars showLineNumbers +{{#each forms.create_account.address_fields }} + {{{dynamicComponent 'components/common/forms'}}} +{{/each}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/dynamicComponent.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=dynamicComponent) + +### inject + +```handlebars showLineNumbers +{{inject value object}} +``` + +Injects key values into the [jsContext](#jscontext) helper. + +#### Parameters + +- `value` (String): The value to inject. +- `object` (Object) + +#### Example + +```handlebars showLineNumbers +{{inject "myProductName" product.title}} + +<script> +var jsContext = JSON.parse({{jsContext}}); +console.log(jsContext.myProductName); +// results in: "BigCommerce Coffee Mug" +</script> +``` + +```handlebars showLineNumbers +{{inject 'productSize' theme_settings.product_size}} +<!-- Returns a JSON representation of an object of all the keys injected. --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/inject.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?q=inject) + +### jsContext + +```handlebars showLineNumbers +{{jsContext}} +``` + +Returns a JSON representation of the data injected by the [inject](#inject) helper. + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/jsContext.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=jsContext) + +### partial + +```handlebars showLineNumbers +{{partial string}} +``` + +Overrides content defined by the [block](#block) helper. + +#### Parameters + +- `string` (String) + +#### Example + +```handlebars showLineNumbers +{{#partial "head"}} + {{#if pagination.category.previous}} + <link rel="prev" href="{{pagination.category.previous}}"> + {{/if}} + {{#if pagination.category.next}} + <link rel="next" href="{{pagination.category.next}}"> + {{/if}} +{{/partial}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/partial.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=jsContext) + +### region + +```handlebars showLineNumbers +{{region name}} +``` + +Specifies a [widget](/docs/storefront/widgets#widgets) region. + +#### Parameters + +- `name` (String): The name of the region. + +#### Example + +```handlebars showLineNumbers +<!-- context = { + banner-top: "hello world" + } --> +{{region name="banner-top"}} +<!-- => <div data-content-region="banner-top">hello world</div> --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/region.js) +- [See it in Cornerstone](https://github.com/bigcommerce/cornerstone/search?l=HTML&q=region) + +### assignVar + +```handlebars showLineNumbers +{{assignVar key value}} +``` + +Assigns a variable for later use in the template and has a limit of 50 variables in storage. + +#### Parameters + +- `key` (String) +- `value` (String|Number) + +#### Example + +```handlebars showLineNumbers +{{assignVar "foo" 10}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/assignVar.js) + +### getVar + +```handlebars showLineNumbers +{{getVar key}} +``` + +Returns the variable set by [assignVar](#assignVar). + +#### Parameters + +- `key` (String) + +#### Example + +```handlebars showLineNumbers +{{getVar "foo"}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/getVar.js) + +### decrementVar + +```handlebars showLineNumbers +{{decrementVar key}} +``` + +Decrements the variable set by [assignVar](#assignVar) by 1. + +#### Parameters + +- `key` (String) + +#### Example + +```handlebars showLineNumbers +{{decrementVar "foo"}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/decrementVar.js) + +### incrementVar + +```handlebars showLineNumbers +{{incrementVar key}} +``` + +Increments the variable set by [assignVar](#assignVar) by 1. + +#### Parameters + +- `key` (String) + +#### Example + +```handlebars showLineNumbers +{{incrementVar "foo"}} +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/incrementVar.js) + +### JSONparse + +Parse data with JSONparse. + +#### Parameters + +- `json` (String) + +#### Example + +```handlebars showLineNumbers +{{#JSONparse '{"foo": "bar"}'}} + {{foo}} +{{/JSONparse}} +<!-- output: bar --> +``` + +### JSONparseSafe + +Parse data safely with JSONparseSafe. This helper is similar to the JSONparse helper, but allows handling of incorrect JSON data. Returns `parsed data` when JSON is correct; otherwise, renders an `else` block. + + +#### Parameters + +- `json` (String): The data parsed by the helper. + + +#### Example + +```handlebars +{{#JSONparseSafe '{"foo": "bar"}'}} + {{foo}} +{{/JSONparseSafe}} +<!-- output: bar --> +``` + +```handlebars +{{#JSONparseSafe 'foo'}} + {{foo}} +{{else}} + John Doe +{{/JSONparseSafe}} +<!-- output: John Doe --> +``` + +- [See it in GitHub](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/jsonParseSafe.js) + +## Standard helpers + + +The following table contains acceptlisted standard Handlebars helpers available to all Stencil themes. Each helper is linked to its GitHub documentation including parameters and examples. + +| Helper | Category | Description | +|:-------|:---------|:------------| +| [after](https://github.com/helpers/handlebars-helpers#after) | array | Returns all of the items in an array after the specified index. | +| [arrayify](https://github.com/helpers/handlebars-helpers#arrayify)| array | Casts the given value to an array. | +| [before](https://github.com/helpers/handlebars-helpers#before) | array | Returns all of the items in the collection before the specified count. | +| [each](https://handlebarsjs.com/guide/builtin-helpers.html#each) | array | Block helper that iterates over the items in a given array. | +| [eachIndex](https://github.com/helpers/handlebars-helpers#eachIndex) | array | | +| [filter](https://github.com/helpers/handlebars-helpers#filter) | array | Block helper that filters the given array and renders the block for values that evaluate to `true`, otherwise the inverse block is returned. | +| [first](https://github.com/helpers/handlebars-helpers#first) | array | Returns the first item or first `n` items of an array. | +| [forEach](https://github.com/helpers/handlebars-helpers#forEach) | array | Iterates over each item in an array and exposes the current item in the array as context to the inner block. | +| [inArray](https://github.com/helpers/handlebars-helpers#inArray) | array | Block helper that renders the block if an array has the given `value`. | +| [isArray](https://github.com/helpers/handlebars-helpers#isArray) | array | Returns `true` if value is an es5 array. | +| [last](https://github.com/helpers/handlebars-helpers#last) | array | Returns the last item, or last `n` items of an array or string. | +| [length](https://github.com/helpers/handlebars-helpers#length) | array | Returns the length of the given string or array. | +| [lengthEqual](https://github.com/helpers/handlebars-helpers#lengthEqual)| array | Returns true if the length of the given value is equal to the given `length`. | +| [map](https://github.com/helpers/handlebars-helpers#map) | array | Returns a new array created by calling `function` on each element of the given array. | +| [some](https://github.com/helpers/handlebars-helpers#some) | array | Block helper that returns the block if the callback returns `true` for some value in the given array. | +| [sort](https://github.com/helpers/handlebars-helpers#sort) | array | Sorts the given array. If an array of objects is passed, you may optionally pass a `key` to sort on as the second argument. | +| [sortBy](https://github.com/helpers/handlebars-helpers#sortBy) | array | Sorts an array. If an array of objects is passed, you may optionally pass a `key` to sort on as the second argument. | +| [withAfter](https://github.com/helpers/handlebars-helpers#withAfter) | array | Uses the items in the array *after* the specified index as context inside a block. | +| [withBefore](https://github.com/helpers/handlebars-helpers#withBefore) | array | Uses the items in the array *before* the specified index as context inside a block. | +| [withFirst](https://github.com/helpers/handlebars-helpers#withFirst) | array | Uses the first item in a collection inside a handlebars block expression. | +| [withLast](https://github.com/helpers/handlebars-helpers#withLast) | array | Uses the last item or `n` items in an array as context inside a block. | +| [withSort](https://github.com/helpers/handlebars-helpers#withSort) | array | Block helper that sorts a collection and exposes the sorted collection as context inside the block. | +| [isEmpty](https://github.com/helpers/handlebars-helpers#isEmpty)| collection | Inline, subexpression, or block helper that returns `true` (or the block) if the given collection is empty, or `false` (or the inverse block, if supplied) if the collection is not empty. | +| [iterate](https://github.com/helpers/handlebars-helpers#iterate) | collection | Block helper that iterates over an array or object. If an array is given, `.forEach` is called, or if an object is given, `.forOwn` is called, otherwise the inverse block is returned. | +| [and](https://github.com/helpers/handlebars-helpers#and) | comparison | Helper that renders the block if both of the given values are truthy. If an inverse block is specified it will be rendered when falsy. | +| [default](https://github.com/helpers/handlebars-helpers#default) | comparison | Returns the first value that is not undefined, otherwise the default value is returned. | +| [eq](https://github.com/helpers/handlebars-helpers#eq) | comparison | Block helper that renders a block if `a` is equal to `b`. If an inverse block is specified it will be rendered when falsy. | +| [gt](https://github.com/helpers/handlebars-helpers#gt) | comparison | Block helper that renders a block if `a` is greater than `b`. If an inverse block is specified, it will be rendered when false. | +| [gte](https://github.com/helpers/handlebars-helpers#gte) | comparison | Block helper that renders a block if `a` is greater than or equal to `b`. If an inverse block is specified it will be rendered when falsy. | +| [has](https://github.com/helpers/handlebars-helpers#has) | comparison | Block helper that renders a block if value has pattern. If an inverse block is specified it will be rendered when falsy. | +| [ifEven](https://github.com/helpers/handlebars-helpers#ifEven) | comparison | Returns `true` if the given value is an even number. | +| [ifNth](https://github.com/helpers/handlebars-helpers#ifNth) | comparison | Conditionally renders a block if the remainder is zero when `a` operand is divided by `b`. If an inverse block is specified it will be rendered when the remainder is not zero. | +| [ifOdd](https://github.com/helpers/handlebars-helpers#ifOdd) | comparison | Block helper that renders a block if value is an odd number. If an inverse block is specified it will be rendered when falsy. | +| [is](https://github.com/helpers/handlebars-helpers#is) | comparison | Block helper that renders a block if `a` is equal to `b`. If an inverse block is specified it will be rendered when falsy. Similar to eq but does not do strict equality.| +| [isnt](https://github.com/helpers/handlebars-helpers#isnt) | comparison | Block helper that renders a block if `a` is not equal to `b`. If an inverse block is specified it will be rendered when falsy. Similar to unlessEq but does not use strict equality for comparisons. | +| [lt](https://github.com/helpers/handlebars-helpers#lt) | comparison | Block helper that renders a block if `a` is less than `b`. If an inverse block is specified it will be rendered when falsy. | +| [lte](https://github.com/helpers/handlebars-helpers#lte) | comparison | Block helper that renders a block if `a` is less than or equal to `b`. If an inverse block is specified it will be rendered when falsy.| +| [neither](https://github.com/helpers/handlebars-helpers#neither) | comparison | Block helper that renders a block if neither of the given values are truthy. If an inverse block is specified it will be rendered when falsy. | +| [unlessEq](https://github.com/helpers/handlebars-helpers#unlessEq) | comparison | Block helper that always renders the inverse block unless `a` is equal to `b`.| +| [unlessGt](https://github.com/helpers/handlebars-helpers#unlessGt) | comparison | Block helper that always renders the inverse block unless `a` is greater than `b`.| +| [unlessLt](https://github.com/helpers/handlebars-helpers#unlessLt) | comparison | Block helper that always renders the inverse block unless `a` is less than `b`. | +| [unlessGteq](https://github.com/helpers/handlebars-helpers#unlessGteq) | comparison | Block helper that always renders the inverse block unless `a` is greater than or equal to `b`. | +| [unlessLteq](https://github.com/helpers/handlebars-helpers#unlessLteq) | comparison | Block helper that always renders the inverse block unless `a` is less than or equal to `b`.| +| [sanitize](https://github.com/helpers/handlebars-helpers#sanitize) | html | Strips HTML tags from a string, so that only the text nodes are preserved.| +| [ul](https://github.com/helpers/handlebars-helpers#ul) | html | Block helper for creating unordered lists (`<ul></ul>`). | +| [ol](https://github.com/helpers/handlebars-helpers#ol) | html | Block helper for creating ordered lists (`<ol></ol>`). | +| [thumbnailImage](https://github.com/helpers/handlebars-helpers#thumbnailImage) | html | Returns a `<figure>` with a thumbnail linked to a full picture. | +| [inflect](https://github.com/helpers/handlebars-helpers#inflect) | inflection | Returns either the singular or plural inflection of a word based on the given count. | +| [ordinalize](https://github.com/helpers/handlebars-helpers#ordinalize) | inflection | Returns an ordinalized number as a string. | +| [markdown](https://github.com/helpers/handlebars-helpers#markdown) | markdown | Block helper that converts a string of inline markdown to HTML. | +| [add](https://github.com/helpers/handlebars-helpers#add) | math | Returns the sum of `a` plus `b`. | +| [avg](https://github.com/helpers/handlebars-helpers#avg) | math| Returns the average of all numbers in the given array. | +| [ceil](https://github.com/helpers/handlebars-helpers#ceil) | math| Returns the `Math.ceil()` of the given value. | +| [divide](https://github.com/helpers/handlebars-helpers#divide)| math| Divides `a` by `b`. | +| [floor](https://github.com/helpers/handlebars-helpers#floor) | math | Returns the `Math.floor()` of the given value. | +| [multiply](https://github.com/helpers/handlebars-helpers#multiply) | math | Returns the product of `a` times `b`. | +| [random](https://github.com/helpers/handlebars-helpers#random) | math | Generates a random number between two values. | +| [round](https://github.com/helpers/handlebars-helpers#round) | math | Rounds the given number. | +| [subtract](https://github.com/helpers/handlebars-helpers#subtract) | math | Returns the product of `a` minus `b`. | +| [sum](https://github.com/helpers/handlebars-helpers#sum) | math | Returns the sum of all numbers in the given array. | +| [noop](https://github.com/helpers/handlebars-helpers#noop) | misc | Block helper that renders the block without taking any arguments. | +| [withHash](https://github.com/helpers/handlebars-helpers#withHash) | misc| Block helper that builds the context for the block from the options hash. | +| [addCommas](https://github.com/helpers/handlebars-helpers#addCommas) | number | Adds commas to numbers. | +| [phoneNumber](https://github.com/helpers/handlebars-helpers#phoneNumber) | number | Converts a string or number to a formatted phone number. | +| [toAbbr](https://github.com/helpers/handlebars-helpers#toAbbr) | number | Abbreviates numbers to the given number of precision. This is for general numbers, not size in bytes. | +| [toExponential](https://github.com/helpers/handlebars-helpers#toExponential) | number | Returns a string representing the given number in exponential notation. | +| [toFixed](https://github.com/helpers/handlebars-helpers#toFixed)|number| Formats the given number using fixed-point notation. | +| [toFloat](https://github.com/helpers/handlebars-helpers#toFloat) | number | | +| [toInt](https://github.com/helpers/handlebars-helpers#toInt) | number | | +| [toPrecision](https://github.com/helpers/handlebars-helpers#toPrecision) |number| Returns a string representing the `Number` object to the specified precision. | +| [extend](https://github.com/helpers/handlebars-helpers#extend) | object | Extends the context with the properties of other objects. A shallow merge is performed to avoid mutating the context. | +| [forIn](https://github.com/helpers/handlebars-helpers#forIn) | object | Block helper that iterates over the properties of an object exposing each key and value on the context. | +| [forOwn](https://github.com/helpers/handlebars-helpers#forOwn) |object| Block helper that iterates over the own properties of an object, exposing each key and value on the context. | +| [toPath](https://github.com/helpers/handlebars-helpers#toPath) | object | Takes arguments and, if they are string or number, converts them to a dot-delineated object property path. | +| [hasOwn](https://github.com/helpers/handlebars-helpers#hasOwn) | object | Returns `true` if `key` is an own, enumerable property of the given context object. | +| [isObject](https://github.com/helpers/handlebars-helpers#isObject) | object | Returns `true` if value is an object. | +| [JSONparse](#jsonparse) | object | Parses the given string using `JSON.parse`. | +| [JSONparseSafe](#jsonparsesafe) | object | Parses the given string safely using `JSON.parseSafe`. | +| [JSONstringify](https://github.com/helpers/handlebars-helpers#JSONstringify) | object | Stringifies an object using `JSON.stringify`. | +| [merge](https://github.com/helpers/handlebars-helpers#merge) |object| Deeply merges the properties of the given objects with the context object. | +| [pick](https://github.com/helpers/handlebars-helpers#pick) | object | Picks properties from the context object. | +| [camelcase](https://github.com/helpers/handlebars-helpers#camelcase) |string| camelCase the characters in the given string. | +| [capitalize](https://github.com/helpers/handlebars-helpers#capitalize) | string | Capitalizes the first word in a sentence. | +| [capitalizeAll](https://github.com/helpers/handlebars-helpers#capitalizeAll) | string | Capitalizes all words in a string. | +| [center](https://github.com/helpers/handlebars-helpers#center) |string| Centers a string using non-breaking spaces. | +| [chop](https://github.com/helpers/handlebars-helpers#chop) | string | Like trim, but removes both extraneous whitespace and non-word characters from the beginning and end of a string. | +| [dashcase](https://github.com/helpers/handlebars-helpers#dashcase) | string | Replaces non-word characters and periods with hyphens. | +| [dotcase](https://github.com/helpers/handlebars-helpers#dotcase) | string | `dot.case` the characters in a string. | +| [ellipsis](https://github.com/helpers/handlebars-helpers#ellipsis) | string | Truncates a string to the specified length, and appends it with an elipsis, `…`. | +| [hyphenate](https://github.com/helpers/handlebars-helpers#hyphenate) | string | Replaces spaces in a string with hyphens. | +| [isString](https://github.com/helpers/handlebars-helpers#isString) | string | Returns `true` if value is a string. | +| [lowercase](https://github.com/helpers/handlebars-helpers#lowercase) | string | Lowercase all characters in the given string. | +| [occurrences](https://github.com/helpers/handlebars-helpers#occurrences) | string | Returns the number of occurrences of `substring` within the given string. | +| [pascalcase](https://github.com/helpers/handlebars-helpers#pascalcase) | string | PascalCase the characters in a string. | +| [pathcase](https://github.com/helpers/handlebars-helpers#pathcase) | string | `path/case` the characters in a string. | +| [plusify](https://github.com/helpers/handlebars-helpers#plusify) | string | Replaces spaces in the given string with pluses. | +| [reverse](https://github.com/bigcommerce/paper-handlebars/blob/master/helpers/3p/string.js#L280) | string | Reverses a string. | +| [sentence](https://github.com/helpers/handlebars-helpers#sentence) | string | Sentence case the given string. | +| [snakecase](https://github.com/helpers/handlebars-helpers#snakecase) | string | `snake_case` the characters in the given string. | +| [split](https://github.com/helpers/handlebars-helpers#split) | string | Splits a string by the given character. | +| [startsWith](https://github.com/helpers/handlebars-helpers#startsWith) | string | Tests whether a string begins with the given prefix. | +| [titleize](https://github.com/helpers/handlebars-helpers#titleize) | string | Title case the given string. | +| [trim](https://github.com/helpers/handlebars-helpers#trim) | string | Removes extraneous whitespace from the beginning and end of a string. | +| [uppercase](https://github.com/helpers/handlebars-helpers#uppercase) | string | Uppercase all of the characters in the given string. If used as a block helper it will uppercase the entire block. This helper does not support inverse blocks. | +| [encodeURI](https://github.com/helpers/handlebars-helpers#encodeURI) | url | Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character. | +| [decodeURI](https://github.com/helpers/handlebars-helpers#decodeURI) | url | Decodes a Uniform Resource Identifier (URI) component. | +| [urlResolve](https://github.com/helpers/handlebars-helpers#urlResolve) | url | Takes a `base` URL and a `href` URL and resolves them as a browser would for an anchor tag. | +| [urlParse](https://github.com/helpers/handlebars-helpers#urlParse) | url | Parses a URL string into an object. | +| [stripProtocol](https://github.com/helpers/handlebars-helpers#stripProtocol) | url | Strips protocol from a URL. Useful for displaying media that may have an 'http' protocol on secure connections. | + +## Contributing to helpers + +BigCommerce's custom Handlebars helpers are open source. To contribute, make a pull request to [bigcommerce/paper-handlebars](https://github.com/bigcommerce/paper-handlebars). + +## Resources + +* [Widgets](/docs/storefront/widgets) +* [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config) +* [Cornerstone](https://github.com/bigcommerce/cornerstone) +* [Paper Handlebars](https://github.com/bigcommerce/paper-handlebars/tree/master/helpers) +* [Handlebars.js](https://handlebarsjs.com/) + diff --git a/configuration/config.yml b/docs/storefront/stencil/themes/context/object-reference/config.yml similarity index 100% rename from configuration/config.yml rename to docs/storefront/stencil/themes/context/object-reference/config.yml diff --git a/theme-styles/_root/checkbox.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/checkbox.mdx similarity index 100% rename from theme-styles/_root/checkbox.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/checkbox.mdx diff --git a/theme-styles/_root/color.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/color.mdx similarity index 100% rename from theme-styles/_root/color.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/color.mdx diff --git a/theme-styles/_root/font.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/font.mdx similarity index 100% rename from theme-styles/_root/font.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/font.mdx diff --git a/theme-styles/_root/heading.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/heading.mdx similarity index 100% rename from theme-styles/_root/heading.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/heading.mdx diff --git a/theme-styles/_root/imageDimension.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/imageDimension.mdx similarity index 100% rename from theme-styles/_root/imageDimension.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/imageDimension.mdx diff --git a/theme-styles/_root/optimizedCheckout-image.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/optimizedCheckout-image.mdx similarity index 100% rename from theme-styles/_root/optimizedCheckout-image.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/optimizedCheckout-image.mdx diff --git a/theme-styles/_root/reference.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/reference.mdx similarity index 100% rename from theme-styles/_root/reference.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/reference.mdx diff --git a/theme-styles/_root/select.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/select.mdx similarity index 100% rename from theme-styles/_root/select.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/select.mdx diff --git a/theme-styles/_root/text.mdx b/docs/storefront/stencil/themes/context/object-reference/elements/text.mdx similarity index 100% rename from theme-styles/_root/text.mdx rename to docs/storefront/stencil/themes/context/object-reference/elements/text.mdx diff --git a/models/blog/posts.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/blog/posts.yml similarity index 89% rename from models/blog/posts.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/blog/posts.yml index e93b3efd7..25fa03091 100644 --- a/models/blog/posts.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/blog/posts.yml @@ -1,37 +1,37 @@ -type: array -description: An array of blog posts. -items: - type: object - description: Individual blog post object. - properties: - author: - type: string - description: Author of the blog post. - date_published: - type: string - description: Date the blog entry was published - show_read_more: - type: boolean - description: Show readmore. - summary: - type: string - description: Blog post summary. - tags: - type: array - description: Tags for the blog. - items: - type: object - properties: - name: - type: string - description: Name of the tag. - url: - type: string - description: URL for the tag. - thumbnail: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - title: - type: string - description: Title of the blog post. - url: - type: string \ No newline at end of file +type: array +description: An array of blog posts. +items: + type: object + description: Individual blog post object. + properties: + author: + type: string + description: Author of the blog post. + date_published: + type: string + description: Date the blog entry was published + show_read_more: + type: boolean + description: Show readmore. + summary: + type: string + description: Blog post summary. + tags: + type: array + description: Tags for the blog. + items: + type: object + properties: + name: + type: string + description: Name of the tag. + url: + type: string + description: URL for the tag. + thumbnail: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + title: + type: string + description: Title of the blog post. + url: + type: string diff --git a/models/cart/cartItems.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartItems.yml similarity index 94% rename from models/cart/cartItems.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartItems.yml index 1e347b800..4a0303668 100644 --- a/models/cart/cartItems.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartItems.yml @@ -1,90 +1,90 @@ -type: array -items: - type: object - properties: - availability: - type: string - brand: - type: object - properties: - name: - type: string - can_modify: - type: boolean - configurable_fields: - type: array - items: - type: object - properties: {} - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - name: - type: string - value: - type: string - id: - type: string - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - max_purchase_quantity: - type: 'null' - min_purchase_quantity: - type: 'null' - name: - type: string - options: - type: array - items: - type: object - properties: {} - price: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - product_id: - type: integer - quantity: - type: integer - release_date: - type: string - remove_url: - type: string - description: URL to remove gift certificate from the cart. - rrp: - type: object - description: Price object that defines the cart itemʼs list price (MSRP); can be used to display struck-out list prices. - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - show_gift_wrapping: - type: boolean - description: Boolean indicating whether the wrapping options are shown. - sku: - type: string - total: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - type: - type: string - url: - type: string +type: array +items: + type: object + properties: + availability: + type: string + brand: + type: object + properties: + name: + type: string + can_modify: + type: boolean + configurable_fields: + type: array + items: + type: object + properties: {} + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + value: + type: string + id: + type: string + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + max_purchase_quantity: + type: 'null' + min_purchase_quantity: + type: 'null' + name: + type: string + options: + type: array + items: + type: object + properties: {} + price: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + product_id: + type: integer + quantity: + type: integer + release_date: + type: string + remove_url: + type: string + description: URL to remove gift certificate from the cart. + rrp: + type: object + description: Price object that defines the cart itemʼs list price (MSRP); can be used to display struck-out list prices. + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + show_gift_wrapping: + type: boolean + description: Boolean indicating whether the wrapping options are shown. + sku: + type: string + total: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + type: + type: string + url: + type: string diff --git a/models/cart/cartStatusMessage.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartStatusMessage.yml similarity index 94% rename from models/cart/cartStatusMessage.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartStatusMessage.yml index 44ccf047b..aa789bd3e 100644 --- a/models/cart/cartStatusMessage.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/cart/cartStatusMessage.yml @@ -1,8 +1,8 @@ -type: object -properties: - message: - type: string - example: Example congrats banner message - type: - type: number - example: 2 +type: object +properties: + message: + type: string + example: Example congrats banner message + type: + type: number + example: 2 diff --git a/models/category/shop_by_price.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/category/shop_by_price.yml similarity index 96% rename from models/category/shop_by_price.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/category/shop_by_price.yml index 8ed8eac82..b6ac74615 100644 --- a/models/category/shop_by_price.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/category/shop_by_price.yml @@ -1,31 +1,31 @@ -type: array -description: 'Exposes price- and currency-related properties in raw numeric and formatted string formats. It will return empty for stores with faceted search enabled who are not explicitly requesting this information in their front matter.' -items: - type: object - properties: - high: - type: object - description: Price object that defines the maximum price boundary. - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - low: - type: object - description: Price object that defines the minimum price boundary - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - selected: - type: boolean - description: Price object that defines the currently selected price range. - url: - type: string - description: URL of price-filtered product results for this category. +type: array +description: 'Exposes price- and currency-related properties in raw numeric and formatted string formats. It will return empty for stores with faceted search enabled who are not explicitly requesting this information in their front matter.' +items: + type: object + properties: + high: + type: object + description: Price object that defines the maximum price boundary. + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + low: + type: object + description: Price object that defines the minimum price boundary + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + selected: + type: boolean + description: Price object that defines the currently selected price range. + url: + type: string + description: URL of price-filtered product results for this category. diff --git a/models/common/amount.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml similarity index 96% rename from models/common/amount.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml index a0e5ae9d2..b25a72103 100644 --- a/models/common/amount.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml @@ -1,12 +1,12 @@ -description: Common price amount object -type: object -properties: - currency: - type: string - description: currency code - formatted: - type: string - description: string representation of the price, including currency formatting - value: - type: number - description: numeric value of the price +description: Common price amount object +type: object +properties: + currency: + type: string + description: currency code + formatted: + type: string + description: string representation of the price, including currency formatting + value: + type: number + description: numeric value of the price diff --git a/models/common/image.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml similarity index 97% rename from models/common/image.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml index fd9529cef..8141d04aa 100644 --- a/models/common/image.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml @@ -1,9 +1,9 @@ -description: '`{{*.image}}` object used by various objects such as `{{category.image}}` and `{{product.images[*]}}.`' -type: object -properties: - alt: - type: string - description: Corresponding text to display for missing images, accessible screen readers, etc. - data: - type: string - description: Internal URL to the image. +description: '`{{*.image}}` object used by various objects such as `{{category.image}}` and `{{product.images[*]}}.`' +type: object +properties: + alt: + type: string + description: Corresponding text to display for missing images, accessible screen readers, etc. + data: + type: string + description: Internal URL to the image. diff --git a/models/common/price.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml similarity index 77% rename from models/common/price.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml index 30b0e9c82..cabd6b479 100644 --- a/models/common/price.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml @@ -1,8 +1,8 @@ -type: object -description: properties common to `product.price` and `product.price.price_range` -properties: - tax_label: - type: string - description: Tax label (VAT, sales tax, etc.) displayed to customers. - without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml +type: object +description: properties common to `product.price` and `product.price.price_range` +properties: + tax_label: + type: string + description: Tax label (VAT, sales tax, etc.) displayed to customers. + without_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml diff --git a/models/common/product.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml similarity index 87% rename from models/common/product.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml index 194a83de6..67a652bcb 100644 --- a/models/common/product.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml @@ -1,73 +1,73 @@ -description: 'Product object for product card arrays like `{{products.new}}`, `{{products.featured}}`, and `{{products.top_sellers}}`.' -type: object -properties: - add_to_cart_url: - type: string - availability: - type: string - brand: - type: 'null' - category: - type: array - items: - type: string - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - name: - type: string - value: - type: string - date_added: - type: string - demo: - type: boolean - has_options: - type: boolean - id: - type: integer - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - images: - type: array - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - low_stock_level: - type: 'null' - description: |- - If inventory tracking is turned on: Sets a threshold low-stock level. You can use conditional logic to display a “limited availability” badge if the stock_level propertyʼs value falls below this threshold. If inventory tracking is turned off: A “null” string. - name: - type: string - num_reviews: - type: integer - pre_order: - type: boolean - price: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml - qty_in_cart: - type: integer - rating: - type: integer - show_cart_action: - type: boolean - sku: - type: 'null' - stock_level: - type: 'null' - description: |- - If inventory tracking is turned on: The number of items available for sale (0 or more). If inventory tracking is turned off: A “null” string. - summary: - type: string - url: - type: string - weight: - type: object - properties: - formatted: - type: string - value: - type: integer +description: 'Product object for product card arrays like `{{products.new}}`, `{{products.featured}}`, and `{{products.top_sellers}}`.' +type: object +properties: + add_to_cart_url: + type: string + availability: + type: string + brand: + type: 'null' + category: + type: array + items: + type: string + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + value: + type: string + date_added: + type: string + demo: + type: boolean + has_options: + type: boolean + id: + type: integer + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + images: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + low_stock_level: + type: 'null' + description: |- + If inventory tracking is turned on: Sets a threshold low-stock level. You can use conditional logic to display a “limited availability” badge if the stock_level propertyʼs value falls below this threshold. If inventory tracking is turned off: A “null” string. + name: + type: string + num_reviews: + type: integer + pre_order: + type: boolean + price: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml + qty_in_cart: + type: integer + rating: + type: integer + show_cart_action: + type: boolean + sku: + type: 'null' + stock_level: + type: 'null' + description: |- + If inventory tracking is turned on: The number of items available for sale (0 or more). If inventory tracking is turned off: A “null” string. + summary: + type: string + url: + type: string + weight: + type: object + properties: + formatted: + type: string + value: + type: integer diff --git a/models/customer/addresses.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/addresses.yml similarity index 95% rename from models/customer/addresses.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/addresses.yml index 14454acd2..e8a42b8c8 100644 --- a/models/customer/addresses.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/addresses.yml @@ -1,46 +1,46 @@ -description: The customer.addresses object available to `templates/pages/account/addresses.html` and other account address templates. -type: array -items: - type: object - properties: - address1: - type: string - address2: - type: string - city: - type: string - company: - type: string - country: - type: string - country_id: - type: string - customer_id: - type: string - delete_url: - type: string - destination: - type: string - edit_url: - type: string - first_name: - type: string - form_session_id: - type: string - full_name: - type: string - id: - type: string - description: The ID of the shipping address. - last_name: - type: string - last_used: - type: - phone: - type: string - state: - type: string - state_id: - type: string - zip: - type: string +description: The customer.addresses object available to `templates/pages/account/addresses.html` and other account address templates. +type: array +items: + type: object + properties: + address1: + type: string + address2: + type: string + city: + type: string + company: + type: string + country: + type: string + country_id: + type: string + customer_id: + type: string + delete_url: + type: string + destination: + type: string + edit_url: + type: string + first_name: + type: string + form_session_id: + type: string + full_name: + type: string + id: + type: string + description: The ID of the shipping address. + last_name: + type: string + last_used: + type: + phone: + type: string + state: + type: string + state_id: + type: string + zip: + type: string diff --git a/models/customer/orders.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/orders.yml similarity index 84% rename from models/customer/orders.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/orders.yml index 7df9ea900..5f89e3369 100644 --- a/models/customer/orders.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/orders.yml @@ -1,53 +1,53 @@ -type: array -items: - type: object - properties: - date: - type: string - details_url: - type: string - id: - type: string - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - items: - type: array - items: - type: object - properties: - expected_release_date: - type: string - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - name: - type: string - options: - type: array - items: - type: object - properties: {} - quantity: - type: string - refunded: - type: string - type: - type: string - last_update_date: - type: string - payment_instructions: - type: string - reorder_url: - type: string - return_url: - type: string - status: - type: string - total: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number \ No newline at end of file +type: array +items: + type: object + properties: + date: + type: string + details_url: + type: string + id: + type: string + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + items: + type: array + items: + type: object + properties: + expected_release_date: + type: string + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + name: + type: string + options: + type: array + items: + type: object + properties: {} + quantity: + type: string + refunded: + type: string + type: + type: string + last_update_date: + type: string + payment_instructions: + type: string + reorder_url: + type: string + return_url: + type: string + status: + type: string + total: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number diff --git a/models/customer/payment_methods.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/payment_methods.yml similarity index 96% rename from models/customer/payment_methods.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/payment_methods.yml index 73c1fad48..257a262e4 100644 --- a/models/customer/payment_methods.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/payment_methods.yml @@ -1,119 +1,119 @@ -type: object -description: customer.payment_methods object available to `templates/pages/account/payment-methods.html`. -oneOf: - - type: array - description: Replaces `customerPaymentMethods` object used in payment_methods.html templates when `account_payment_methods_v2` is enabled in **config.json** > **meta** > **features**. - items: - type: object - properties: - display_name: - type: string - description: value from the name provided by merchants - add_url: - type: - - 'null' - - string - type: - type: string - enum: - - CARD - - PAYPAL - stored_instruments: - type: array - items: - type: object - properties: - type: - type: string - brand: - type: string - expiry_month: - type: integer - expiry_year: - type: integer - last_4: - type: string - email: - type: 'null' - is_default: - type: boolean - edit_url: - type: string - delete_url: - type: string - billing_address: - type: object - properties: - address1: - type: string - address2: - type: string - city: - type: string - country_code: - type: string - country: - type: string - first_name: - type: string - last_name: - type: string - phone: - type: string - zip: - type: string - state: - type: string - state_code: - type: string - required: - - type - - is_default - - delete_url - instruments: - type: array - items: - type: object - properties: - type: - type: string - expiry_month: - type: 'null' - expiry_year: - type: 'null' - last_4: - type: 'null' - email: - type: string - is_default: - type: boolean - edit_url: - type: string - delete_url: - type: string - billing_address: - type: 'null' - required: - - type - - expiry_month - - is_default - - edit_url - - delete_url - required: - - type - - type: object - properties: - payment_method_name_key: - type: object - properties: - add_url: - type: string - display_name: - type: string - methods: - type: array - items: - type: object - selected_payment_method: - type: 'null' - description: Object to view stored customer payment methods +type: object +description: customer.payment_methods object available to `templates/pages/account/payment-methods.html`. +oneOf: + - type: array + description: Replaces `customerPaymentMethods` object used in payment_methods.html templates when `account_payment_methods_v2` is enabled in **config.json** > **meta** > **features**. + items: + type: object + properties: + display_name: + type: string + description: value from the name provided by merchants + add_url: + type: + - 'null' + - string + type: + type: string + enum: + - CARD + - PAYPAL + stored_instruments: + type: array + items: + type: object + properties: + type: + type: string + brand: + type: string + expiry_month: + type: integer + expiry_year: + type: integer + last_4: + type: string + email: + type: 'null' + is_default: + type: boolean + edit_url: + type: string + delete_url: + type: string + billing_address: + type: object + properties: + address1: + type: string + address2: + type: string + city: + type: string + country_code: + type: string + country: + type: string + first_name: + type: string + last_name: + type: string + phone: + type: string + zip: + type: string + state: + type: string + state_code: + type: string + required: + - type + - is_default + - delete_url + instruments: + type: array + items: + type: object + properties: + type: + type: string + expiry_month: + type: 'null' + expiry_year: + type: 'null' + last_4: + type: 'null' + email: + type: string + is_default: + type: boolean + edit_url: + type: string + delete_url: + type: string + billing_address: + type: 'null' + required: + - type + - expiry_month + - is_default + - edit_url + - delete_url + required: + - type + - type: object + properties: + payment_method_name_key: + type: object + properties: + add_url: + type: string + display_name: + type: string + methods: + type: array + items: + type: object + selected_payment_method: + type: 'null' + description: Object to view stored customer payment methods diff --git a/models/customer/returns.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/returns.yml similarity index 95% rename from models/customer/returns.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/returns.yml index c61092154..38ea45a80 100644 --- a/models/customer/returns.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/returns.yml @@ -1,31 +1,31 @@ -type: array -description: customer.returns object available to `templates/pages/account/returns.html`. -items: - type: object - properties: - action: - type: string - comments: - type: string - date_requested: - type: string - id: - type: string - product: - type: object - properties: - image: - type: object - properties: - name: - type: string - options: - type: array - items: - type: object - quantity: - type: number - reason: - type: string - status: - type: string +type: array +description: customer.returns object available to `templates/pages/account/returns.html`. +items: + type: object + properties: + action: + type: string + comments: + type: string + date_requested: + type: string + id: + type: string + product: + type: object + properties: + image: + type: object + properties: + name: + type: string + options: + type: array + items: + type: object + quantity: + type: number + reason: + type: string + status: + type: string diff --git a/models/customer/shipping_addresses.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/shipping_addresses.yml similarity index 96% rename from models/customer/shipping_addresses.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/shipping_addresses.yml index 6204bc210..3c7768b87 100644 --- a/models/customer/shipping_addresses.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/shipping_addresses.yml @@ -1,52 +1,52 @@ -type: object -description: customer.shipping_addresses object available to customer account templates and components. -properties: - address1: - type: string - description: Customerʼs shipping address, first line. - address2: - type: string - description: Customerʼs shipping address, second line. - city: - type: string - description: Customerʼs shipping city - company: - type: string - description: Customerʼs shipping company name - country: - type: string - description: Customerʼs shipping country - country_id: - type: string - description: ID for customerʼs shipping country - destination: - type: string - description: 'Type of delivery destination: residential or business/commercial' - first_name: - type: string - description: Customer’s shipping (first) name - form_session_id: - type: string - description: Used for custom shipping forms - id: - type: string - description: 'Unique, system-generated ID' - last_name: - type: string - description: Customer’s shipping (last) name - last_used: - type: string - description: Timestamp when this address was last used as a shipping address - phone: - type: string - description: Customer’s shipping phone number - state: - type: string - description: Customerʼs shipping state - state_id: - type: string - description: ID for customerʼs shipping state/province/region - zip: - type: string - description: Customerʼs shipping zip - +type: object +description: customer.shipping_addresses object available to customer account templates and components. +properties: + address1: + type: string + description: Customerʼs shipping address, first line. + address2: + type: string + description: Customerʼs shipping address, second line. + city: + type: string + description: Customerʼs shipping city + company: + type: string + description: Customerʼs shipping company name + country: + type: string + description: Customerʼs shipping country + country_id: + type: string + description: ID for customerʼs shipping country + destination: + type: string + description: 'Type of delivery destination: residential or business/commercial' + first_name: + type: string + description: Customer’s shipping (first) name + form_session_id: + type: string + description: Used for custom shipping forms + id: + type: string + description: 'Unique, system-generated ID' + last_name: + type: string + description: Customer’s shipping (last) name + last_used: + type: string + description: Timestamp when this address was last used as a shipping address + phone: + type: string + description: Customer’s shipping phone number + state: + type: string + description: Customerʼs shipping state + state_id: + type: string + description: ID for customerʼs shipping state/province/region + zip: + type: string + description: Customerʼs shipping zip + diff --git a/models/customer/wishlists.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/wishlists.yml similarity index 95% rename from models/customer/wishlists.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/customer/wishlists.yml index 4725b6637..734493502 100644 --- a/models/customer/wishlists.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/customer/wishlists.yml @@ -1,25 +1,25 @@ -type: array -description: customer.wishlists objects available to `templates/components/account/wishlist-list.html` and components. -items: - type: object - properties: - add_url: - type: string - delete_url: - type: string - edit_url: - type: string - id: - type: number - is_public: - type: boolean - name: - type: string - num_items: - type: number - share_url: - type: string - token: - type: string - view_url: - type: string +type: array +description: customer.wishlists objects available to `templates/components/account/wishlist-list.html` and components. +items: + type: object + properties: + add_url: + type: string + delete_url: + type: string + edit_url: + type: string + id: + type: number + is_public: + type: boolean + name: + type: string + num_items: + type: number + share_url: + type: string + token: + type: string + view_url: + type: string diff --git a/models/forms/address.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/address.yml similarity index 97% rename from models/forms/address.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/address.yml index e3c2ca9b2..6d516a76d 100644 --- a/models/forms/address.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/address.yml @@ -1,20 +1,20 @@ -description: "`{{forms.address}}` object available to `templates/pages/account/add-address.html`" -type: object -title: Address -properties: - address: - type: object - properties: - address_id: - type: string - description: ID for this shipping address - shipping_fields: - type: array - description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo](https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms)' - items: {} - action: - type: string - description: URL to the proper handler (Update Address versus Save New Address). - error: - type: string - description: Message to display when form entry fails (defined by the BigCommerce App). +description: "`{{forms.address}}` object available to `templates/pages/account/add-address.html`" +type: object +title: Address +properties: + address: + type: object + properties: + address_id: + type: string + description: ID for this shipping address + shipping_fields: + type: array + description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo](https://github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms)' + items: {} + action: + type: string + description: URL to the proper handler (Update Address versus Save New Address). + error: + type: string + description: Message to display when form entry fails (defined by the BigCommerce App). diff --git a/models/forms/contact.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/contact.yml similarity index 95% rename from models/forms/contact.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/contact.yml index 241989c1e..818e0eabb 100644 --- a/models/forms/contact.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/contact.yml @@ -1,22 +1,22 @@ -description: "`{{forms.contact}}` object available to `templates/pages/account/add-address.html`" -type: object -title: Contact -properties: - contact: - type: object - properties: - captcha_url: - type: string - page_id: - type: string - recaptcha: - type: object - properties: - enabled: - type: number - markup: - type: string - public_key: - type: string - text: +description: "`{{forms.contact}}` object available to `templates/pages/account/add-address.html`" +type: object +title: Contact +properties: + contact: + type: object + properties: + captcha_url: + type: string + page_id: + type: string + recaptcha: + type: object + properties: + enabled: + type: number + markup: + type: string + public_key: + type: string + text: type: string \ No newline at end of file diff --git a/models/forms/create_account.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/create_account.yml similarity index 98% rename from models/forms/create_account.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/create_account.yml index fc2a25d92..4dc893e84 100644 --- a/models/forms/create_account.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/create_account.yml @@ -1,32 +1,32 @@ -description: "`{{forms.create_account}}` object available to `templates/pages/auth/create-account.html`" -type: object -title: Create Account -properties: - create_account: - type: object - properties: - recaptcha: - type: string - description: Objects for integrating the Google reCAPTCHA service to distinguish human visitors from ’bots (automated agents). - enabled: - type: boolean - description: Boolean indicating whether reCAPTCHA is enabled for this store. - public_key: - type: string - description: Public key (site key) that reCAPTCHA returns upon merchant’s enabling CAPTCHA security in Store Settings > Display Settings. - address_fields: - type: array - description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo] (https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms):' - items: {} - class_name: - type: string - description: 'Specifies a CSS class to apply to a field within the array; for corresponding control-panel steps, [see](https: //support.bigcommerce.com/articles/Public/Editing-Form-Fields#advanced-settings):' - account_fields: - type: string - description: 'Object of form fields; for details, see this repo: https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms' - error: - type: string - description: BCApp generated message to display when customer’s account creation fails. - checking_out: - type: boolean +description: "`{{forms.create_account}}` object available to `templates/pages/auth/create-account.html`" +type: object +title: Create Account +properties: + create_account: + type: object + properties: + recaptcha: + type: string + description: Objects for integrating the Google reCAPTCHA service to distinguish human visitors from ’bots (automated agents). + enabled: + type: boolean + description: Boolean indicating whether reCAPTCHA is enabled for this store. + public_key: + type: string + description: Public key (site key) that reCAPTCHA returns upon merchant’s enabling CAPTCHA security in Store Settings > Display Settings. + address_fields: + type: array + description: 'Array of form fields that define each shipping address for this customer; for details, see this [repo] (https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms):' + items: {} + class_name: + type: string + description: 'Specifies a CSS class to apply to a field within the array; for corresponding control-panel steps, [see](https: //support.bigcommerce.com/articles/Public/Editing-Form-Fields#advanced-settings):' + account_fields: + type: string + description: 'Object of form fields; for details, see this repo: https: //github.com/bigcommerce/cornerstone/tree/master/templates/components/common/forms' + error: + type: string + description: BCApp generated message to display when customer’s account creation fails. + checking_out: + type: boolean description: Boolean indicating whether customer created the account during a purchase checkout. \ No newline at end of file diff --git a/models/forms/edit_account.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/edit_account.yml similarity index 97% rename from models/forms/edit_account.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/edit_account.yml index 0c750f31b..0ed083baa 100644 --- a/models/forms/edit_account.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/edit_account.yml @@ -1,25 +1,25 @@ -description: "`{{forms.edit_account}}` object available to `templates/pages/account/edit.html`" -type: object -title: Edit Account -properties: - edit_account: - type: object - properties: - first_name: - type: string - description: First name of the customer being edited - last_name: - type: string - description: Last name of the customer being edited - company_name: - type: string - description: Company of the customer being edited. - phone: - type: string - description: Phone number of the customer being edited - error: - type: string - description: Message to display (generated by the BigCommerce App) when customer’s account edit fails. - success: - type: string +description: "`{{forms.edit_account}}` object available to `templates/pages/account/edit.html`" +type: object +title: Edit Account +properties: + edit_account: + type: object + properties: + first_name: + type: string + description: First name of the customer being edited + last_name: + type: string + description: Last name of the customer being edited + company_name: + type: string + description: Company of the customer being edited. + phone: + type: string + description: Phone number of the customer being edited + error: + type: string + description: Message to display (generated by the BigCommerce App) when customer’s account edit fails. + success: + type: string description: Message to display (generated by the BigCommerce App) when customer’s account edit succeeds \ No newline at end of file diff --git a/models/forms/gift_certificate.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/gift_certificate.yml similarity index 95% rename from models/forms/gift_certificate.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/gift_certificate.yml index 5352a0c68..434f84a8a 100644 --- a/models/forms/gift_certificate.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/gift_certificate.yml @@ -1,52 +1,52 @@ -description: "`{{forms.gift_certicate}}` object available to `templates/pages/gift-certificate/purchase.html`" -type: object -title: Gift Certificate -properties: - gift_certificate: - type: object - properties: - action: - type: string - amount_options: - type: array - items: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - can_use_custom_amount: - type: boolean - editing: - type: boolean - expires_in_days: - type: boolean - preview: - type: string - themes: - type: array - items: - type: object - properties: - display: - type: string - value: - type: string - values: - type: object - properties: - amount: - type: string - from_email: - type: string - from_name: - type: string - message: - type: string - to_email: - type: string - to_name: +description: "`{{forms.gift_certicate}}` object available to `templates/pages/gift-certificate/purchase.html`" +type: object +title: Gift Certificate +properties: + gift_certificate: + type: object + properties: + action: + type: string + amount_options: + type: array + items: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + can_use_custom_amount: + type: boolean + editing: + type: boolean + expires_in_days: + type: boolean + preview: + type: string + themes: + type: array + items: + type: object + properties: + display: + type: string + value: + type: string + values: + type: object + properties: + amount: + type: string + from_email: + type: string + from_name: + type: string + message: + type: string + to_email: + type: string + to_name: type: string \ No newline at end of file diff --git a/models/forms/login.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/login.yml similarity index 97% rename from models/forms/login.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/login.yml index 7ddd4fc84..7634dba48 100644 --- a/models/forms/login.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/login.yml @@ -1,24 +1,24 @@ -description: "`{{forms.login}}` object available to `templates/pages/create-login.html`" -type: object -title: Login -properties: - login: - type: object - properties: - error: - type: string - description: BigCommerce defined message to display when customer’s login action fails. - success: - type: string - description: BigCommerce defined message to display when customer’s login action succeeds. - reCAPTCHA: - type: string - enabled: - type: string - description: Returns 1 when reCAPTCHA is enabled and 0 when itʼs disabled within the BigCommerce control panel. - public_key: - type: string - description: Optional key used for all reCAPTCHA in your store if specified in the BigCommerce control panel. - markup: - type: string +description: "`{{forms.login}}` object available to `templates/pages/create-login.html`" +type: object +title: Login +properties: + login: + type: object + properties: + error: + type: string + description: BigCommerce defined message to display when customer’s login action fails. + success: + type: string + description: BigCommerce defined message to display when customer’s login action succeeds. + reCAPTCHA: + type: string + enabled: + type: string + description: Returns 1 when reCAPTCHA is enabled and 0 when itʼs disabled within the BigCommerce control panel. + public_key: + type: string + description: Optional key used for all reCAPTCHA in your store if specified in the BigCommerce control panel. + markup: + type: string description: HTML that adds reCAPTCHA V2. \ No newline at end of file diff --git a/models/forms/provider.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/provider.yml similarity index 97% rename from models/forms/provider.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/provider.yml index fde82236b..3f2476b42 100644 --- a/models/forms/provider.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/provider.yml @@ -1,7 +1,7 @@ -description: "`{{forms.provider}}` object available to `templates/pages/account/payment-methods.html`" -type: object -title: Provider -properties: - provider: - type: string +description: "`{{forms.provider}}` object available to `templates/pages/account/payment-methods.html`" +type: object +title: Provider +properties: + provider: + type: string example: authorize.net \ No newline at end of file diff --git a/models/forms/return.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/return.yml similarity index 95% rename from models/forms/return.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/return.yml index b8abce2e9..dc0a83778 100644 --- a/models/forms/return.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/return.yml @@ -1,21 +1,21 @@ -description: "`{{forms.return}}` object available to `templates/pages/account/add-return.html`" -type: object -title: Return -properties: - return: - type: object - properties: - actions: - type: array - items: - type: string - order_id: - type: string - order_products: - type: array - items: - type: object - reasons: - type: array - items: +description: "`{{forms.return}}` object available to `templates/pages/account/add-return.html`" +type: object +title: Return +properties: + return: + type: object + properties: + actions: + type: array + items: + type: string + order_id: + type: string + order_products: + type: array + items: + type: object + reasons: + type: array + items: type: string \ No newline at end of file diff --git a/models/forms/wishlist.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/wishlist.yml similarity index 97% rename from models/forms/wishlist.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/forms/wishlist.yml index 8f2d1d696..eda739932 100644 --- a/models/forms/wishlist.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/forms/wishlist.yml @@ -1,22 +1,22 @@ -description: "`{{forms.wishlist}}` object available to `templates/pages/account/add-wishlist.html`" -type: object -title: Wishlist -properties: - wishlist: - type: object - properties: - name: - type: string - description: "Displayed name for this wishlist" - id: - type: string - description: "ID for this wishlist." - is_public: - type: boolean - description: "Boolean indicating whether this wishlist is displayed to other store visitors." - errors: - type: string - description: "Message to display when form entry fails (generated by the BigCommerce App)." - actions: - type: string +description: "`{{forms.wishlist}}` object available to `templates/pages/account/add-wishlist.html`" +type: object +title: Wishlist +properties: + wishlist: + type: object + properties: + name: + type: string + description: "Displayed name for this wishlist" + id: + type: string + description: "ID for this wishlist." + is_public: + type: boolean + description: "Boolean indicating whether this wishlist is displayed to other store visitors." + errors: + type: string + description: "Message to display when form entry fails (generated by the BigCommerce App)." + actions: + type: string description: "URL to the proper handler (Update Wish List versus Save New Wish List)." \ No newline at end of file diff --git a/models/product/custom_fields.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/custom_fields.yml similarity index 100% rename from models/product/custom_fields.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/custom_fields.yml diff --git a/models/product/options.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/options.yml similarity index 100% rename from models/product/options.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/options.yml diff --git a/models/product/price.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/price.yml similarity index 55% rename from models/product/price.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/price.yml index bfc5573ee..c4e6cf37b 100644 --- a/models/product/price.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/product/price.yml @@ -1,25 +1,25 @@ -type: object -allOf: - - type: object - description: 'product.price and products[*].price object available to various product templates and components.' - properties: - non_sale_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - map_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - map_price_with_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - price_range: - type: object - properties: - max: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml - min: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml - rrp_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - sale_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - saved: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml +type: object +allOf: + - type: object + description: 'product.price and products[*].price object available to various product templates and components.' + properties: + non_sale_price_without_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + map_price_without_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + map_price_with_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + price_range: + type: object + properties: + max: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml + min: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml + rrp_without_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + sale_price_without_tax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + saved: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml diff --git a/models/product/related_products.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/related_products.yml similarity index 95% rename from models/product/related_products.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/related_products.yml index 212ba1c5f..73fa20e7a 100644 --- a/models/product/related_products.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/product/related_products.yml @@ -1,98 +1,98 @@ -type: array -items: - type: object - description: 'Product object used for list components that show multiple products, each in its own "card" or panel.' - properties: - add_to_cart_url: - type: string - availability: - type: string - brand: - type: 'null' - category: - type: array - items: - type: string - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - name: - type: string - value: - type: string - date_added: - type: string - demo: - type: boolean - has_options: - type: boolean - id: - type: integer - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - images: - type: array - items: - type: object - description: 'Common image object; ex: `{{category.image}}`, `{{product.images.image}}' - properties: - alt: - type: string - description: | - Corresponding text to display for missing images, accessible screen readers, etc. - data: - type: string - description: Internal URL to product or category image. - low_stock_level: - type: 'null' - description: |- - If inventory tracking is turned on: Sets a threshold low-stock level. You can use conditional logic to display a “limited availability” badge if the stock_level propertyʼs value falls below this threshold. If inventory tracking is turned off: A “null” string. - name: - type: string - num_reviews: - type: integer - pre_order: - type: boolean - price: - type: object - properties: - tax_label: - type: string - without_tax: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - qty_in_cart: - type: integer - rating: - type: integer - show_cart_action: - type: boolean - sku: - type: 'null' - stock_level: - type: 'null' - description: 'If inventory tracking is turned on: The number of items available for sale (0 or more). If inventory tracking is turned off: A "null" string.' - summary: - type: string - url: - type: string - weight: - type: object - properties: - formatted: - type: string - value: - type: integer - add_to_wishlist_url: - type: string - example: /wishlist.php?action=add&product_id=104 +type: array +items: + type: object + description: 'Product object used for list components that show multiple products, each in its own "card" or panel.' + properties: + add_to_cart_url: + type: string + availability: + type: string + brand: + type: 'null' + category: + type: array + items: + type: string + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + value: + type: string + date_added: + type: string + demo: + type: boolean + has_options: + type: boolean + id: + type: integer + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + images: + type: array + items: + type: object + description: 'Common image object; ex: `{{category.image}}`, `{{product.images.image}}' + properties: + alt: + type: string + description: | + Corresponding text to display for missing images, accessible screen readers, etc. + data: + type: string + description: Internal URL to product or category image. + low_stock_level: + type: 'null' + description: |- + If inventory tracking is turned on: Sets a threshold low-stock level. You can use conditional logic to display a “limited availability” badge if the stock_level propertyʼs value falls below this threshold. If inventory tracking is turned off: A “null” string. + name: + type: string + num_reviews: + type: integer + pre_order: + type: boolean + price: + type: object + properties: + tax_label: + type: string + without_tax: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + qty_in_cart: + type: integer + rating: + type: integer + show_cart_action: + type: boolean + sku: + type: 'null' + stock_level: + type: 'null' + description: 'If inventory tracking is turned on: The number of items available for sale (0 or more). If inventory tracking is turned off: A "null" string.' + summary: + type: string + url: + type: string + weight: + type: object + properties: + formatted: + type: string + value: + type: integer + add_to_wishlist_url: + type: string + example: /wishlist.php?action=add&product_id=104 diff --git a/models/product/reviews.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/reviews.yml similarity index 94% rename from models/product/reviews.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/reviews.yml index a0bf4ca2f..f7c58ed4c 100644 --- a/models/product/reviews.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/product/reviews.yml @@ -1,21 +1,21 @@ -type: object -properties: - messages: - type: array - items: - type: object - total: - type: integer - captcha: - type: string - recaptcha: - type: object - properties: - enabled: - type: integer - public_key: - type: string - markup: - type: string - show_review_email: +type: object +properties: + messages: + type: array + items: + type: object + total: + type: integer + captcha: + type: string + recaptcha: + type: object + properties: + enabled: + type: integer + public_key: + type: string + markup: + type: string + show_review_email: type: boolean \ No newline at end of file diff --git a/models/product/similar_by_views.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/similar_by_views.yml similarity index 100% rename from models/product/similar_by_views.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/similar_by_views.yml diff --git a/models/product/videos.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/product/videos.yml similarity index 95% rename from models/product/videos.yml rename to docs/storefront/stencil/themes/context/object-reference/helpers/product/videos.yml index dce7f3aff..d9336a21e 100644 --- a/models/product/videos.yml +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/product/videos.yml @@ -1,35 +1,35 @@ -type: object -description: Available if product has videos. -properties: - featured: - type: object - properties: - description_long: - type: string - description_short: - type: string - id: - type: string - length: - type: string - title_long: - type: string - title_short: - type: string - list: - type: array - items: - type: object - properties: - description_long: - type: string - description_short: - type: string - id: - type: string - length: - type: string - title_long: - type: string - title_short: +type: object +description: Available if product has videos. +properties: + featured: + type: object + properties: + description_long: + type: string + description_short: + type: string + id: + type: string + length: + type: string + title_long: + type: string + title_short: + type: string + list: + type: array + items: + type: object + properties: + description_long: + type: string + description_short: + type: string + id: + type: string + length: + type: string + title_long: + type: string + title_short: type: string \ No newline at end of file diff --git a/docs/storefront/stencil/themes/context/object-reference/helpers/theme_objects/_all.yml b/docs/storefront/stencil/themes/context/object-reference/helpers/theme_objects/_all.yml new file mode 100644 index 000000000..ea888c934 --- /dev/null +++ b/docs/storefront/stencil/themes/context/object-reference/helpers/theme_objects/_all.yml @@ -0,0 +1,98 @@ +title: _all.yml +description: Theme objects +banners: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/banners.yml +blog: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/blog.yml +brand_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/brand_results.yaml +brand: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/brand.yml +brands: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/brands.yml +breadcrumbs: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/breadcrumbs.yml +carousel: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/carousel.yml +cart_id: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/cart_id.yml +cart: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/cart.yml +categories: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/categories.yml +category_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/category_results.yaml +category: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/category.yml +checkout: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/checkout.yml +comparisons: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/comparisons.yml +content_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/content_results.yaml +countries: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/countries.yml +create_account: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/create_account.yml +currency_selector: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/currency_selector.yml +customer_group_id: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/customer_group_id.yml +customer_group_name: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/customer_group_name.yml +customer: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/customer.yml +downloads: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/downloads.yml +faceted_search: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/faceted_search.yml +footer: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/footer.yml +forms_contact: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/forms_contact.yaml +forms: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/forms.yml +head: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/head.yml +is_ajax: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/is_ajax.yml +order: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/order.yml +page_type: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/page_type.yml +page: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/page.yml +pages: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/pages.yml +pagination: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/pagination.yml +price: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/price.yml +product_results: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/product_results.yaml +product: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/product.yml +products: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/products.yml +settings: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/settings.yml +shipments: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/shipments.yml +shipping_messages: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/shipping_messages.yml +shop_by_brand: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/shop_by_brand.yml +sitemap: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/sitemap.yml +social_media: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/social_media.yml +template_file: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/template_file.yml +template_settings: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/theme_settings.yml +urls: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/urls.yml +vault: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/vault.yml +wishlist: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/_root/wishlist.yml diff --git a/models/_root/banners.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/banners.yml similarity index 96% rename from models/_root/banners.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/banners.yml index ea811b9ea..0792bc935 100644 --- a/models/_root/banners.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/banners.yml @@ -1,28 +1,28 @@ -description: |- - Elements of marketing banners at pageʼs top and/or bottom. - - `global` `{{banners}}` object - - **Handlebars Expressions** - * `{{banners}}`, - * `{{{banners}}}` - - **Handlebars Formatting Exception** - Where a banner contains HTML, the banner helper must be placed in triple braces, as in this example `{{{banners}}}`. - (Double braces would escape the HTML.) - - **Limits** - * `{{banners}}` will only return the first 50 banners on each page. - -type: object -properties: - bottom: - type: array - description: 'Array of HTML content/strings, for custom bottom-banner content; banners are populated from the BigCommerce control panel' - items: - type: string - top: - type: array - description: 'Array of HTML content/strings, for custom top-banner content; banners are populated from the BigCommerce control panel' - items: - type: string +description: |- + Elements of marketing banners at pageʼs top and/or bottom. + + `global` `{{banners}}` object + + **Handlebars Expressions** + * `{{banners}}`, + * `{{{banners}}}` + + **Handlebars Formatting Exception** + Where a banner contains HTML, the banner helper must be placed in triple braces, as in this example `{{{banners}}}`. + (Double braces would escape the HTML.) + + **Limits** + * `{{banners}}` will only return the first 50 banners on each page. + +type: object +properties: + bottom: + type: array + description: 'Array of HTML content/strings, for custom bottom-banner content; banners are populated from the BigCommerce control panel' + items: + type: string + top: + type: array + description: 'Array of HTML content/strings, for custom top-banner content; banners are populated from the BigCommerce control panel' + items: + type: string diff --git a/models/_root/blog.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/blog.yml similarity index 87% rename from models/_root/blog.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/blog.yml index 47ae61c1c..deb957f54 100644 --- a/models/_root/blog.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/blog.yml @@ -1,39 +1,39 @@ -description: | - Blog-specific properties for the blog feature within BigCommerce storefronts. These objects are called on the default `templates/components/blog/post.html` partial. - - `global` and template `{{blog}}` objects - - **Handlebars Expression** - `{{blog}}` -type: object -oneOf: - - type: object - description: '`{{blog}}` object available to blog and blog post templates and components' - title: blog (blog page) - properties: - description: - type: string - description: Blog description. - name: - type: string - description: Blog name. - posts: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/blog/posts.yml - tag: - type: 'null' - description: The blogʼs tag. - url: - type: string - description: URL to the blog page. - - type: object - description: '`global` `{{blog}} object' - title: blog (blog page) - properties: - name: - type: string - description: Blog name. - recent_posts: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/blog/posts.yml - url: - type: string - description: URL to the blog page. +description: | + Blog-specific properties for the blog feature within BigCommerce storefronts. These objects are called on the default `templates/components/blog/post.html` partial. + + `global` and template `{{blog}}` objects + + **Handlebars Expression** + `{{blog}}` +type: object +oneOf: + - type: object + description: '`{{blog}}` object available to blog and blog post templates and components' + title: blog (blog page) + properties: + description: + type: string + description: Blog description. + name: + type: string + description: Blog name. + posts: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/blog/posts.yml + tag: + type: 'null' + description: The blogʼs tag. + url: + type: string + description: URL to the blog page. + - type: object + description: '`global` `{{blog}} object' + title: blog (blog page) + properties: + name: + type: string + description: Blog name. + recent_posts: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/blog/posts.yml + url: + type: string + description: URL to the blog page. diff --git a/models/_root/brand_results.yaml b/docs/storefront/stencil/themes/context/object-reference/schemas/brand-results.yaml similarity index 100% rename from models/_root/brand_results.yaml rename to docs/storefront/stencil/themes/context/object-reference/schemas/brand-results.yaml diff --git a/models/_root/brand.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/brand.yml similarity index 89% rename from models/_root/brand.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/brand.yml index ea96754d9..0dea758c8 100644 --- a/models/_root/brand.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/brand.yml @@ -1,56 +1,56 @@ -description: |- - The brand object for the page calling the object. - - `{{brand}}` object available to `templates/pages/brand.html` - - **Handlebars Expression:** `{{brand}}` -type: object -properties: - config: - type: array - items: - type: object - faceted_search_enabled: - type: boolean - description: Boolean that defines whether product-filtering search is enabled for the store. - facets: - type: array - description: A list of all possible search filters for this brand. - items: - type: object - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - meta: - type: array - items: - type: object - name: - type: string - description: Name of the brand - products: - type: array - description: An array of product card models. - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml - search_error: - type: boolean - selected: - type: object - description: An array of selected facets. - properties: - items: - type: array - items: - type: object - remove_all_url: - type: string - show_compare: - type: boolean - description: Boolean corresponding to merchant’s control panel selection whether or not to enable product comparisons. - state: - type: array - items: - type: object - url: - type: string - description: URL of the brand page +description: |- + The brand object for the page calling the object. + + `{{brand}}` object available to `templates/pages/brand.html` + + **Handlebars Expression:** `{{brand}}` +type: object +properties: + config: + type: array + items: + type: object + faceted_search_enabled: + type: boolean + description: Boolean that defines whether product-filtering search is enabled for the store. + facets: + type: array + description: A list of all possible search filters for this brand. + items: + type: object + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + meta: + type: array + items: + type: object + name: + type: string + description: Name of the brand + products: + type: array + description: An array of product card models. + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml + search_error: + type: boolean + selected: + type: object + description: An array of selected facets. + properties: + items: + type: array + items: + type: object + remove_all_url: + type: string + show_compare: + type: boolean + description: Boolean corresponding to merchant’s control panel selection whether or not to enable product comparisons. + state: + type: array + items: + type: object + url: + type: string + description: URL of the brand page diff --git a/models/_root/brands.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/brands.yml similarity index 77% rename from models/_root/brands.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/brands.yml index f499897f0..f683ed7db 100644 --- a/models/_root/brands.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/brands.yml @@ -1,14 +1,14 @@ -description: '`{{brands}}` object available to `templates/pages/brands.html`' -type: array -items: - type: object - properties: - id: - type: integer - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - name: - type: string - url: - type: string -title: brands +description: '`{{brands}}` object available to `templates/pages/brands.html`' +type: array +items: + type: object + properties: + id: + type: integer + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + name: + type: string + url: + type: string +title: brands diff --git a/models/_root/breadcrumbs.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/breadcrumbs.yml similarity index 96% rename from models/_root/breadcrumbs.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/breadcrumbs.yml index 001663d2f..84ef80e65 100644 --- a/models/_root/breadcrumbs.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/breadcrumbs.yml @@ -1,16 +1,16 @@ -description: |- - Defines a pageʼs breadcrumbs. Available on virtually all pages that have a breadcrumb trail. - - `global` `{{breadcrumbs}}` array - - **Handlebars Expression** `{{breadcrumbs}}` -type: array -items: - type: object - properties: - name: - type: string - description: Displayed name of this breadcrumb element. - url: - type: string - description: URL of this breadcrumb element. +description: |- + Defines a pageʼs breadcrumbs. Available on virtually all pages that have a breadcrumb trail. + + `global` `{{breadcrumbs}}` array + + **Handlebars Expression** `{{breadcrumbs}}` +type: array +items: + type: object + properties: + name: + type: string + description: Displayed name of this breadcrumb element. + url: + type: string + description: URL of this breadcrumb element. diff --git a/models/_root/carousel.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/carousel.yml similarity index 96% rename from models/_root/carousel.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/carousel.yml index e84ddd881..f9fbfccc6 100644 --- a/models/_root/carousel.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/carousel.yml @@ -1,59 +1,59 @@ -description: |- - A list of images, text, and style assets for a storefront’s image slide show. - - `{{carousel}}` array - - **Handlebars Expression** `{{carousel}}` -type: object -properties: - slides: - type: array - description: Object containing properties for each slide in the slideshow. - items: - type: object - properties: - alt_text: - type: string - description: Alt text for the image. - button_text: - type: string - description: Text displayed on a call-to-action button defined by the merchant. - button_text_color: - type: string - description: Color of the button. - heading: - type: string - description: Heading message defined by the merchant. - heading_color: - type: string - description: Color of the heading text. - image: - type: string - description: Path to the image file used on this slide. - image_height: - type: string - image_width: - type: string - stencil_image: - type: object - properties: - alt: - type: string - data: - type: string - height: - type: integer - width: - type: integer - text: - type: string - description: Subheading defined by the merchant. - text_color: - type: string - description: Color of the subheading text - url: - type: string - description: URL to which the image will link. - swap_frequency: - type: integer - description: 'Indicates how often (in seconds) the slides will change; the value must be between 1 and 90,000 seconds.' +description: |- + A list of images, text, and style assets for a storefront’s image slide show. + + `{{carousel}}` array + + **Handlebars Expression** `{{carousel}}` +type: object +properties: + slides: + type: array + description: Object containing properties for each slide in the slideshow. + items: + type: object + properties: + alt_text: + type: string + description: Alt text for the image. + button_text: + type: string + description: Text displayed on a call-to-action button defined by the merchant. + button_text_color: + type: string + description: Color of the button. + heading: + type: string + description: Heading message defined by the merchant. + heading_color: + type: string + description: Color of the heading text. + image: + type: string + description: Path to the image file used on this slide. + image_height: + type: string + image_width: + type: string + stencil_image: + type: object + properties: + alt: + type: string + data: + type: string + height: + type: integer + width: + type: integer + text: + type: string + description: Subheading defined by the merchant. + text_color: + type: string + description: Color of the subheading text + url: + type: string + description: URL to which the image will link. + swap_frequency: + type: integer + description: 'Indicates how often (in seconds) the slides will change; the value must be between 1 and 90,000 seconds.' diff --git a/models/_root/cart_id.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/cart-id.yml similarity index 97% rename from models/_root/cart_id.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/cart-id.yml index c6252317e..48cb6ce19 100644 --- a/models/_root/cart_id.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/cart-id.yml @@ -1,8 +1,8 @@ -description: |- - Returns the cart ID if one exists. To return more cart information use the [Storefront Cart API](/docs/rest-storefront/carts). - - `global` `{{cart_id}}` - - **Handlebars Expression**: `{{cart_id}}` -type: string -example: '`2343eb66-3c41-4966-a539-d8af36d3fc47`' +description: |- + Returns the cart ID if one exists. To return more cart information use the [Storefront Cart API](/docs/rest-storefront/carts). + + `global` `{{cart_id}}` + + **Handlebars Expression**: `{{cart_id}}` +type: string +example: '`2343eb66-3c41-4966-a539-d8af36d3fc47`' diff --git a/models/_root/cart.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/cart.yml similarity index 96% rename from models/_root/cart.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/cart.yml index 1886009e1..332dd7486 100644 --- a/models/_root/cart.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/cart.yml @@ -1,345 +1,345 @@ -description: |- - The cart-specific properties for the current session. - - `{{cart}}` object available to `templates/pages/cart.html`; contains `cart_id` if one exists. - - **Handlebars Expression**: `{{cart}}` -type: object -properties: - additional_checkout_buttons: - type: array - description: 'Generates checkout buttons for third-party payments (PayPal, Google Checkout, etc.)' - items: - type: string - coupons: - type: array - description: List of coupons applied to the cart; default sorting is by coupon ID, from lowest to highest. - items: - type: object - properties: - id: - type: number - code: - type: string - displayName: - type: string - couponType: - type: string - discountedAmount: - type: number - discount: - type: object - description: Discount being applied to the cart in the current session. - properties: - formatted: - type: string - value: - type: integer - currency: - string - gift_certificates: - type: array - description: List of gift certificates applied to the cart. - items: - type: object - properties: - id: - type: string - name: - type: string - theme: - type: string - amount: - type: number - taxable: - type: boolean - sender: - type: array - items: - type: object - properties: - name: - type: string - email: - type: string - recipient: - type: array - items: - type: object - properties: - name: - type: string - email: - type: string - message: - type: string - gift_wrapping_cost: - type: object - description: Price object that defines the cost associated with adding gift wrapping to the items in the cart. - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - grand_total: - type: object - description: Price object that defines the total cost of all the items in the cart. Incorporates estimated shipping, discounts, taxes, and gift wrapping. - properties: - currency: - type: string - formatted: - type: string - value: - type: number - items: - type: array - items: - type: object - properties: - availability: - type: string - base_price: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - brand: - type: object - properties: - name: - type: string - can_modify: - type: boolean - category_names: - type: array - items: - type: string - configurable_fields: - type: array - items: - type: object - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - name: - type: string - value: - type: string - id: - type: string - description: Unique ID of the coupon. - image: - type: object - properties: - alt: - type: string - description: Corresponding text to display for missing images, accessible screen readers, etc. - data: - type: string - description: Internal URL to the image. - max_purchase_quantity: - type: integer - min_purchase_quantity: - type: integer - name: - type: string - options: - type: array - items: - type: object - properties: - id: - type: string - name: - type: string - value: - type: string - is_file: - type: boolean - price: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - price_discounted: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - product_id: - type: integer - quantity: - type: integer - description: Total number of items in the cart. - release_date: - type: string - remove_url: - type: string - description: URL to remove gift certificate from the cart. - rrp: - type: object - description: Price object that defines the cart itemʼs list price (MSRP); can be used to display struck-out list prices. - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - sale_price: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - show_gift_wrapping: - type: boolean - description: Boolean indicating whether the wrapping options are shown. - sku: - type: string - total: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - total_discounted: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - type: - type: string - url: - type: string - variant_id: - type: integer - quantity: - type: integer - shipping_handling: - type: object - description: Current configuration of the shipping estimator for this session’s current cart; will be null/undefined if the cart contains no physical products. - properties: - countries: - type: array - description: Countries available to ship to. - items: - type: object - properties: - currency: - type: object - properties: - code: - type: string - name: - type: string - symbol: - type: string - id: - type: integer - iso2: - type: string - iso3: - type: string - name: - type: string - selected: - type: boolean - selected_city: - type: string - description: The city/town that the customer selected for the shipping estimate. - selected_country: - type: string - selected_state: - type: string - description: The state/province/region that the customer selected for the shipping estimate. - selected_zip: - type: string - description: The ZIP/postal code that the customer selected for the shipping estimate. - show_estimator: - type: boolean - description: Boolean indicating whether the merchant wants to show the shipping estimator to customers. - states: - type: array - description: List of states/provinces/regions for the country. - items: - type: object - properties: - id: - type: string - name: - type: string - show_multiple_address_shipping: - type: boolean - description: 'Boolean: If > 1 physical items are in the cart, and checkout button is displayed: whether to also display the "Ship to multiple addresses" / "Multiple Shipping Addresses" user option.' - show_primary_checkout_button: - type: boolean - description: Boolean that determines whether to show a checkout button. - status_messages: - type: array - items: - type: object - properties: - message: - type: string - type: - type: number - sub_total: - type: object - description: Price object that defines the total cost of all the items in the cart. Might or might not include tax, based on the tax display settings the merchant has configured. Excludes shipping, discounts, and gift wrapping. - properties: - currency: - type: string - formatted: - type: string - value: - type: number - taxes: - type: array - description: List of all applicable taxes for the cart. - items: - type: object - properties: - cost: - type: object - description: Price object that defines the cost of the applied tax. - properties: - currency: - type: string - formatted: - type: string - value: - type: number - included: - type: boolean - description: Boolean that indicates whether taxes are included in the total price for the cart’s contents. - name: - type: string +description: |- + The cart-specific properties for the current session. + + `{{cart}}` object available to `templates/pages/cart.html`; contains `cart_id` if one exists. + + **Handlebars Expression**: `{{cart}}` +type: object +properties: + additional_checkout_buttons: + type: array + description: 'Generates checkout buttons for third-party payments (PayPal, Google Checkout, etc.)' + items: + type: string + coupons: + type: array + description: List of coupons applied to the cart; default sorting is by coupon ID, from lowest to highest. + items: + type: object + properties: + id: + type: number + code: + type: string + displayName: + type: string + couponType: + type: string + discountedAmount: + type: number + discount: + type: object + description: Discount being applied to the cart in the current session. + properties: + formatted: + type: string + value: + type: integer + currency: + string + gift_certificates: + type: array + description: List of gift certificates applied to the cart. + items: + type: object + properties: + id: + type: string + name: + type: string + theme: + type: string + amount: + type: number + taxable: + type: boolean + sender: + type: array + items: + type: object + properties: + name: + type: string + email: + type: string + recipient: + type: array + items: + type: object + properties: + name: + type: string + email: + type: string + message: + type: string + gift_wrapping_cost: + type: object + description: Price object that defines the cost associated with adding gift wrapping to the items in the cart. + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + grand_total: + type: object + description: Price object that defines the total cost of all the items in the cart. Incorporates estimated shipping, discounts, taxes, and gift wrapping. + properties: + currency: + type: string + formatted: + type: string + value: + type: number + items: + type: array + items: + type: object + properties: + availability: + type: string + base_price: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + brand: + type: object + properties: + name: + type: string + can_modify: + type: boolean + category_names: + type: array + items: + type: string + configurable_fields: + type: array + items: + type: object + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + name: + type: string + value: + type: string + id: + type: string + description: Unique ID of the coupon. + image: + type: object + properties: + alt: + type: string + description: Corresponding text to display for missing images, accessible screen readers, etc. + data: + type: string + description: Internal URL to the image. + max_purchase_quantity: + type: integer + min_purchase_quantity: + type: integer + name: + type: string + options: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + value: + type: string + is_file: + type: boolean + price: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + price_discounted: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + product_id: + type: integer + quantity: + type: integer + description: Total number of items in the cart. + release_date: + type: string + remove_url: + type: string + description: URL to remove gift certificate from the cart. + rrp: + type: object + description: Price object that defines the cart itemʼs list price (MSRP); can be used to display struck-out list prices. + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + sale_price: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + show_gift_wrapping: + type: boolean + description: Boolean indicating whether the wrapping options are shown. + sku: + type: string + total: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + total_discounted: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + type: + type: string + url: + type: string + variant_id: + type: integer + quantity: + type: integer + shipping_handling: + type: object + description: Current configuration of the shipping estimator for this session’s current cart; will be null/undefined if the cart contains no physical products. + properties: + countries: + type: array + description: Countries available to ship to. + items: + type: object + properties: + currency: + type: object + properties: + code: + type: string + name: + type: string + symbol: + type: string + id: + type: integer + iso2: + type: string + iso3: + type: string + name: + type: string + selected: + type: boolean + selected_city: + type: string + description: The city/town that the customer selected for the shipping estimate. + selected_country: + type: string + selected_state: + type: string + description: The state/province/region that the customer selected for the shipping estimate. + selected_zip: + type: string + description: The ZIP/postal code that the customer selected for the shipping estimate. + show_estimator: + type: boolean + description: Boolean indicating whether the merchant wants to show the shipping estimator to customers. + states: + type: array + description: List of states/provinces/regions for the country. + items: + type: object + properties: + id: + type: string + name: + type: string + show_multiple_address_shipping: + type: boolean + description: 'Boolean: If > 1 physical items are in the cart, and checkout button is displayed: whether to also display the "Ship to multiple addresses" / "Multiple Shipping Addresses" user option.' + show_primary_checkout_button: + type: boolean + description: Boolean that determines whether to show a checkout button. + status_messages: + type: array + items: + type: object + properties: + message: + type: string + type: + type: number + sub_total: + type: object + description: Price object that defines the total cost of all the items in the cart. Might or might not include tax, based on the tax display settings the merchant has configured. Excludes shipping, discounts, and gift wrapping. + properties: + currency: + type: string + formatted: + type: string + value: + type: number + taxes: + type: array + description: List of all applicable taxes for the cart. + items: + type: object + properties: + cost: + type: object + description: Price object that defines the cost of the applied tax. + properties: + currency: + type: string + formatted: + type: string + value: + type: number + included: + type: boolean + description: Boolean that indicates whether taxes are included in the total price for the cart’s contents. + name: + type: string diff --git a/models/_root/categories.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/categories.yml similarity index 90% rename from models/_root/categories.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/categories.yml index df580b13e..0628ff190 100644 --- a/models/_root/categories.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/categories.yml @@ -1,50 +1,50 @@ -type: array -description: |- - A array of category objects filled with all categories shown in the current page context; default sorting is by category ID, from lowest to highest - - `global` `{{categories}}` array - - **Handlebars Expression**: `{{categories}}` -items: - type: object - properties: - count: - type: string - description: Number of products in this category. - id: - type: string - description: ID of the top-level category listed. - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - name: - type: string - description: Name of the top-level category - url: - type: string - description: URL to the category page. - children: - type: array - description: List of child categories for this top-level category. - items: - type: object - properties: - count: - type: string - description: Number of products in this category. - id: - type: string - description: ID of the top-level category listed. - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - name: - type: string - description: Name of the top-level category - url: - type: string - description: URL to the category page. - children: - type: array - description: List of child categories. -examples: - - '<!-- renders a UL of categories for the current page context --> <ul class="people_list"> {{#each categories}} <li>{{this.name}}</li> {{/each}} </ul>' -title: '' +type: array +description: |- + A array of category objects filled with all categories shown in the current page context; default sorting is by category ID, from lowest to highest + + `global` `{{categories}}` array + + **Handlebars Expression**: `{{categories}}` +items: + type: object + properties: + count: + type: string + description: Number of products in this category. + id: + type: string + description: ID of the top-level category listed. + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + name: + type: string + description: Name of the top-level category + url: + type: string + description: URL to the category page. + children: + type: array + description: List of child categories for this top-level category. + items: + type: object + properties: + count: + type: string + description: Number of products in this category. + id: + type: string + description: ID of the top-level category listed. + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + name: + type: string + description: Name of the top-level category + url: + type: string + description: URL to the category page. + children: + type: array + description: List of child categories. +examples: + - '<!-- renders a UL of categories for the current page context --> <ul class="people_list"> {{#each categories}} <li>{{this.name}}</li> {{/each}} </ul>' +title: '' diff --git a/models/_root/category_results.yaml b/docs/storefront/stencil/themes/context/object-reference/schemas/category-results.yaml similarity index 100% rename from models/_root/category_results.yaml rename to docs/storefront/stencil/themes/context/object-reference/schemas/category-results.yaml diff --git a/models/_root/category.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/category.yml similarity index 95% rename from models/_root/category.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/category.yml index c5ca62248..78f99a3a7 100644 --- a/models/_root/category.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/category.yml @@ -1,124 +1,124 @@ -type: object -description: |- - The category object for the page calling the object. When retrieving a collection of categories, default sorting is by category id, from lowest to highest. Called on the default `templates/pages/category.html` template, and on several partials in the `<theme-name>/templates/components/` subdirectory: `category/shop-by-price.html` and `category/sidebar.html`. - - - **Handlebars Expression**: `{{category}}` - -title: category -properties: - config: - type: array - items: - type: object - properties: {} - description: - type: string - description: Merchant-defined description of the category. - detail_messages: - type: array - description: 'Message displayed when a product is out of stock, and inventory settings are configured to redirect to a category: "Sorry, the product you tried to view is currently out of stock, here are some similar products we have available." (This phrasing is set by the BigCommerce App.)' - items: - type: object - properties: {} - faceted_search_enabled: - type: boolean - description: Boolean that defines whether product-filtering search is enabled for the store. - facets: - type: array - description: Available search facets. - items: - type: object - properties: {} - id: - type: integer - description: Unique ID for the category. - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - meta: - type: array - items: - type: object - properties: {} - name: - type: string - description: Merchant-defined category name. - products: - type: array - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml - selected: - type: array - description: Selected search facets. - items: - type: object - properties: {} - shop_by_price: - type: array - description: 'Exposes price- and currency-related properties in both raw numeric, and formatted string, formats. It will return empty for stores with faceted search enabled who are not explicitly requesting this information in their front matter.' - items: - type: object - properties: - high: - type: object - description: Price object that defines the maximum price boundary. - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - low: - type: object - description: Price object that defines the minimum price boundary - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - selected: - type: boolean - description: Price object that defines the currently selected price range. - url: - type: string - description: URL of price-filtered product results for this category. - show_compare: - type: integer - description: Boolean that defines whether to show controls for product comparison - state: - type: array - items: - type: object - properties: {} - subcategories: - type: array - description: List of any child categories. - items: - type: object - properties: - description: - type: string - description: Merchant-defined description of the subcategory. - id: - type: integer - description: Unique ID for the subcategory. - image: - type: 'null' - description: 'Image representing this subcategory, in Stencil image format.' - name: - type: string - description: Name of the subcategory - product_count: - type: integer - description: Number of products in the subcategory. (Counts at the current level only – not recursive to deeper levels.) - url: - type: string - description: URL to the subcategory. - total_products: - type: integer - description: Count of the number of products in the category. - url: - type: string +type: object +description: |- + The category object for the page calling the object. When retrieving a collection of categories, default sorting is by category id, from lowest to highest. Called on the default `templates/pages/category.html` template, and on several partials in the `<theme-name>/templates/components/` subdirectory: `category/shop-by-price.html` and `category/sidebar.html`. + + + **Handlebars Expression**: `{{category}}` + +title: category +properties: + config: + type: array + items: + type: object + properties: {} + description: + type: string + description: Merchant-defined description of the category. + detail_messages: + type: array + description: 'Message displayed when a product is out of stock, and inventory settings are configured to redirect to a category: "Sorry, the product you tried to view is currently out of stock, here are some similar products we have available." (This phrasing is set by the BigCommerce App.)' + items: + type: object + properties: {} + faceted_search_enabled: + type: boolean + description: Boolean that defines whether product-filtering search is enabled for the store. + facets: + type: array + description: Available search facets. + items: + type: object + properties: {} + id: + type: integer + description: Unique ID for the category. + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + meta: + type: array + items: + type: object + properties: {} + name: + type: string + description: Merchant-defined category name. + products: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml + selected: + type: array + description: Selected search facets. + items: + type: object + properties: {} + shop_by_price: + type: array + description: 'Exposes price- and currency-related properties in both raw numeric, and formatted string, formats. It will return empty for stores with faceted search enabled who are not explicitly requesting this information in their front matter.' + items: + type: object + properties: + high: + type: object + description: Price object that defines the maximum price boundary. + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + low: + type: object + description: Price object that defines the minimum price boundary + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + selected: + type: boolean + description: Price object that defines the currently selected price range. + url: + type: string + description: URL of price-filtered product results for this category. + show_compare: + type: integer + description: Boolean that defines whether to show controls for product comparison + state: + type: array + items: + type: object + properties: {} + subcategories: + type: array + description: List of any child categories. + items: + type: object + properties: + description: + type: string + description: Merchant-defined description of the subcategory. + id: + type: integer + description: Unique ID for the subcategory. + image: + type: 'null' + description: 'Image representing this subcategory, in Stencil image format.' + name: + type: string + description: Name of the subcategory + product_count: + type: integer + description: Number of products in the subcategory. (Counts at the current level only – not recursive to deeper levels.) + url: + type: string + description: URL to the subcategory. + total_products: + type: integer + description: Count of the number of products in the category. + url: + type: string diff --git a/docs/storefront/stencil/themes/context/object-reference/schemas/checkout.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/checkout.yml new file mode 100644 index 000000000..106541b1d --- /dev/null +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/checkout.yml @@ -0,0 +1,33 @@ +description: |- + Used to access checkout content and data in `templates\pages\order-confirmation.html`. + + The `{{checkout}}` object is available to checkout and order confirmation templates and components. + + **Handlebars Expression**: `{{checkout.*}}` +type: object +properties: + order_confirmation_content: + type: string + description: Default content from checkout template. + example: |- + " <script>\n window.checkoutVariantIdentificationToken = '{{Token}}';\n </script>\n\n <script>\n document.body.style.display = 'none';\n </script>\n\n <script src=\"https://cdn11.bigcommerce.com/shared/microapp/checkout/dist/loader-1.122.1.js\"></script>\n\n <script>\n checkoutLoader.loadFiles({ publicPath: 'https://cdn11.bigcommerce.com/shared/microapp/checkout/dist' })\n .then(function(app) {\n document.body.style.display = '';\n\n app.renderOrderConfirmation({\n orderId: '1836',\n containerId: 'checkout-app',\n sentryConfig: {\"release\":\"checkout-js@1.122.1\",\"whitelistUrls\":[\"https:\\/\\/cdn11.bigcommerce.com\\/shared\\/microapp\\/checkout\\/dist\"],\"dsn\":\"https:\\/\\/418e8e81a209403e9c8740c4fdbff5a6@sentry.io\\/1542560\",\"environment\":\"production\",\"tags\":{\"environment\":\"production\",\"tier\":1}},\n });\n });\n </script>\n\n <div id=\"checkout-app\"></div>\n\n<script type=\"text/javascript\" src=\"https://cdn11.bigcommerce.com/shared/js/datatags-a6c27a4dafebddd5845000c8abc99b2096434171.js\" defer></script>\n<script type=\"text/javascript\">\nwindow.addEventListener('DOMContentLoaded', function () { window.initDataTags([], [], window.analytics, {\"channel\":{\"id\":0,\"name\":\"default\",\"type\":\"default\"}}); })\n</script>\n<script type=\"text/javascript\" src=\"https://cdn11.bigcommerce.com/shared/js/csrf-protection-header-b572e5526f6854c73a5e080ef15a771f963740ae.js\"></script>\n\n" + checkout_head: + type: string + description: Default content from checkout `<head>`. + example: |- + "<base href=\"/\" target=\"_top\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n<link href=\"https://cdn11.bigcommerce.com/shared/css/open_sans-5ec63c5b7015207649f715d5bf81d7d45e5a5496.css\" rel=\"stylesheet\" type=\"text/css\">\n\n\n <link href=\"https://cdn11.bigcommerce.com/shared/microapp/checkout/dist/checkout-ffd3ba3c.css\" rel=\"stylesheet\" type=\"text/css\">\n\n<!-- Start Tracking Code for analytics_facebook -->\n\n<script>\n!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');\n\nfbq('set', 'autoConfig', 'false', '419172936004242');\nfbq('dataProcessingOptions', ['LDU'], 0, 0);\nfbq('init', '419172936004242', {\"em\":\"patrick.p@ecommerce.com\",\"fn\":\"Updated via v3 API\",\"ln\":\"Puente\"});\nfbq('set', 'agent', 'plbigcommerce1.2', '419172936004242');\n\nwindow.onload = function() {\n var productIdMap = {},\n productIdsOnPage = getUniqueProductIdsOnPage(),\n pathName = window.location.pathname;\n\n fbq('track', 'PageView', {}, \"\");\n\n // Search events start -- only fire if the shopper lands on the /search.php page\n if (pathName.indexOf('/search.php') === 0 && getUrlParameter('search_query')) {\n fbq('track', 'Search', {\n content_ids: productIdsOnPage,\n search_string: getUrlParameter('search_query')\n });\n }\n // Search events end\n\n // Wishlist events start -- only fire if the shopper attempts to add an item to their wishlist\n if (pathName.indexOf('/wishlist.php') === 0 && getUrlParameter('added_product_id')) {\n fbq('track', 'AddToWishlist', {\n content_ids: [getUrlParameter('added_product_id')]\n });\n }\n // Wishlist events end\n\n // Lead events start -- only fire if the shopper subscribes to newsletter\n if (pathName.indexOf('/subscribe.php') === 0 && getUrlParameter('result') === 'success') {\n fbq('track', 'Lead', {});\n }\n // Lead events end\n\n // Registration events start -- only fire if the shopper registers an account\n if (pathName.indexOf('/login.php') === 0 && getUrlParameter('action') === 'account_created') {\n fbq('track', 'CompleteRegistration', {}, \"\");\n }\n // Registration events end\n\n // Checkout events start -- only fire if the shopper lands on a /checkout* page\n if (pathName === '/checkout.php' || /^\\/(embedded-)?checkout$/.test(pathName)) {\n window.sessionStorage.setItem('fb_conversion_key_7bc711f7-0ac8-4fa8-9a43-9c72c4324faf', 'true');\n\n if (getUrlParameter('action') === 'process_payment') {\n fbq('track', 'AddPaymentInfo');\n } else {\n fbq('track', 'InitiateCheckout');\n }\n }\n // Checkout events end\n\n function getUniqueProductIdsOnPage() {\n return Array.prototype.reduce.call(document.querySelectorAll('[data-product], [data-product-id]'), function(acc, obj) {\n var productId = obj.getAttribute('data-product') || obj.getAttribute('data-product-id');\n\n if (!productIdMap[productId]) {\n productIdMap[productId] = true;\n acc.push(productId);\n }\n\n return acc;\n }, []);\n }\n\n function getUrlParameter(name) {\n var cleanName = name.replace(/[\\[]/, '\\[').replace(/[\\]]/, '\\]');\n var regex = new RegExp('[\\?&]' + cleanName + '=([^&#]*)');\n var results = regex.exec(window.location.search);\n return results === null ? '' : decodeURIComponent(results[1].replace(/\\+/g, ' '));\n }\n}\n</script>\n<noscript><img height=\"1\" width=\"1\" style=\"display:none\" alt=\"null\" src=\"https://www.facebook.com/tr?id=419172936004242&ev=PageView&noscript=1&a=plbigcommerce1.2&eid=\"/></noscript>\n\n<!-- End Tracking Code for analytics_facebook -->\n\n<!-- Start Tracking Code for analytics_googleanalytics -->\n\n<script>\n !function(){var analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error(\"Segment snippet included twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"debug\",\"page\",\"once\",\"off\",\"on\"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.loadPlatform=function(t,e,a,o){window[o||\"analytics\"]=analytics;window._analytics_js_global_name=o;analytics.platformSettings=e;analytics.platformPlan=a;var r=document.createElement(\"script\");r.type=\"text/javascript\";r.defer=!0;r.src=\"https://cdn11.bigcommerce.com/shared/js/storefront/analytics-c7af4d4e323cc1137c45f692e81cae05fd2a3986.js\";var i=document.getElementsByTagName(\"script\")[0];i.parentNode.insertBefore(r,i)};analytics.SNIPPET_VERSION=\"4.0.0_platform\";\n analytics.loadPlatform(\"\", { \"Google Analytics\": {\"enhancedLinkAttribution\":true,\"enhancedEcommerce\":true,\"includeSearch\":true,\"sendUserId\":true,\"trackingId\":\"UA-42625534-3\",\"dimensions\":[],\"metrics\":[]} }, {}, \"analytics\");\n analytics.identify('1');\n analytics.page();\n \n analytics.ready(function () {\n ga('require', 'ec');\n ga('require', 'linker');\n ga('linker:autoLink', [\"hatertron.ninja\",\"ad.buybutton.store\",\"store-iu88q6epfh.mybigcommerce.com\",\"www.store-iu88q6epfh.mybigcommerce.com\"]);\n });\n }}();\n</script>\n\n<!-- End Tracking Code for analytics_googleanalytics -->\n\n<!-- Start Tracking Code for analytics_segment -->\n\n<script>\n!function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error(\"Segment snippet included twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"debug\",\"page\",\"once\",\"off\",\"on\"];analytics.factory=function(t){return function(){var e=Array.prototype.slice.call(arguments);e.unshift(t);analytics.push(e);return analytics}};for(var t=0;t<analytics.methods.length;t++){var e=analytics.methods[t];analytics[e]=analytics.factory(e)}analytics.load=function(t,e){var n=document.createElement(\"script\");n.type=\"text/javascript\";n.async=!0;n.src=\"https://cdn.segment.com/analytics.js/v1/\"+t+\"/analytics.min.js\";var a=document.getElementsByTagName(\"script\")[0];a.parentNode.insertBefore(n,a);analytics._loadOptions=e};analytics.SNIPPET_VERSION=\"4.1.0\";\nanalytics.load(\"BWE8IJKQWfh59kKY6FyICCnX0Uz8qMto\");\nanalytics.identify('1');\nanalytics.page();\n}}();\n</script>\n\n<!-- End Tracking Code for analytics_segment -->\n\n<!-- Start Tracking Code for analytics_siteverification -->\n\n<!-- SITE VERIFICATION TAGS -->\n\n<!-- End Tracking Code for analytics_siteverification -->\n\n\n\n <!-- Start conversion code for analytics_affiliate -->\n <!-- testing conversion tracking -->\n<script>\n// window.location = \"https://example.org?order_id=1836&email=patrick.p@ecommerce.com\"\n</script>\n <!-- End conversion code for analytics_affiliate -->\n \n\n <!-- Start conversion code for analytics_googleanalytics -->\n \n <script type=\"text/javascript\">\n if(typeof(pageTracker) != 'undefined') {\n pageTracker._addTrans(\n '1836',\n 'My Sandbox',\n '9.7400',\n '0.7400',\n '0.0000',\n 'Austin',\n 'Texas',\n 'United States',\n 'USD',\n {id: '0', name: 'default', type: 'storefront'}\n );\n \n pageTracker._addItem(\n '1836',\n '50920',\n 'replacement digital product',\n '',\n '10.8222',\n '1'\n );\n \n pageTracker._trackTrans();\n }\n </script>\n <!-- End conversion code for analytics_googleanalytics -->\n \n<script type=\"text/javascript\">\nvar BCData = {\"csrf_token\":\"{{token}}\"};\n</script>\n\n\n" + order: + description: '`{{checkout.order}}` object available to order confirmation templates and components.' + type: object + properties: + id: + type: number + description: The `id` of the order. To access `checkout.order.id` from `order-confirmation.html`, use Script Manager or the Stencil themeʼs page context to assign the value of `checkout.order.id` to a variable. For more information, see the example in [Using the Fetch API](/docs/storefront/cart-checkout/guide/rest-management#using-the-fetch-api). + example: 1836 + header_image: + type: string + description: The image `src` of the header. + id: + type: string + description: the cart and checkout `id` + example: 2343eb66-3c41-4966-a539-d8af36d3fc47 diff --git a/models/_root/comparisons.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/comparisons.yml similarity index 95% rename from models/_root/comparisons.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/comparisons.yml index 2f468847c..fd3bb133d 100644 --- a/models/_root/comparisons.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/comparisons.yml @@ -1,133 +1,133 @@ -description: |- - Property to display an array of products on product comparison pages. (Called on the default `<theme-name>/templates/pages/compare.html` template.) - - `{{comparisons}}` array - - **Handlebars Expression**: `{{comparisons}}` -type: array -title: comparisons -items: - type: object - properties: - availability: - type: string - description: How long this product usually takes to ship. - brand: - type: object - description: Object containing brand data for this product. - properties: - url: - type: string - description: Brand URL for this product. - name: - type: string - description: Brand name for this product. - category: - type: array - items: - type: string - custom_fields: - type: array - description: Array of additional product details as name-value pairs. For example, size, color, bookʼs ISBN, DVDʼs release date, etc. - items: - type: object - properties: - name: - type: string - value: - type: string - date_added: - type: string - demo: - type: boolean - has_options: - type: boolean - id: - type: number - image: - type: object - properties: - alt: - type: string - data: - type: string - images: - type: array - items: - type: object - properties: - alt: - type: string - data: - type: string - low_stock_level: - type: 'null' - name: - type: string - num_reviews: - type: number - pre_order: - type: boolean - price: - type: object - properties: - rrp_without_tax: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - sale_price_without_tax: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - saved: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - tax_label: - type: string - without_tax: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - qty_in_cart: - type: number - rating: - type: number - show_cart_action: - type: boolean - sku: - type: string - stock_level: - type: 'null' - summary: - type: string - url: - type: string - weight: - type: object - description: URL to remove this product/column from the comparison. - properties: - formatted: - type: string - value: - type: number +description: |- + Property to display an array of products on product comparison pages. (Called on the default `<theme-name>/templates/pages/compare.html` template.) + + `{{comparisons}}` array + + **Handlebars Expression**: `{{comparisons}}` +type: array +title: comparisons +items: + type: object + properties: + availability: + type: string + description: How long this product usually takes to ship. + brand: + type: object + description: Object containing brand data for this product. + properties: + url: + type: string + description: Brand URL for this product. + name: + type: string + description: Brand name for this product. + category: + type: array + items: + type: string + custom_fields: + type: array + description: Array of additional product details as name-value pairs. For example, size, color, bookʼs ISBN, DVDʼs release date, etc. + items: + type: object + properties: + name: + type: string + value: + type: string + date_added: + type: string + demo: + type: boolean + has_options: + type: boolean + id: + type: number + image: + type: object + properties: + alt: + type: string + data: + type: string + images: + type: array + items: + type: object + properties: + alt: + type: string + data: + type: string + low_stock_level: + type: 'null' + name: + type: string + num_reviews: + type: number + pre_order: + type: boolean + price: + type: object + properties: + rrp_without_tax: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + sale_price_without_tax: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + saved: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + tax_label: + type: string + without_tax: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + qty_in_cart: + type: number + rating: + type: number + show_cart_action: + type: boolean + sku: + type: string + stock_level: + type: 'null' + summary: + type: string + url: + type: string + weight: + type: object + description: URL to remove this product/column from the comparison. + properties: + formatted: + type: string + value: + type: number diff --git a/models/_root/content_results.yaml b/docs/storefront/stencil/themes/context/object-reference/schemas/content-results.yaml similarity index 100% rename from models/_root/content_results.yaml rename to docs/storefront/stencil/themes/context/object-reference/schemas/content-results.yaml diff --git a/models/_root/countries.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/countries.yml similarity index 96% rename from models/_root/countries.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/countries.yml index 09675037c..b5391c8ea 100644 --- a/models/_root/countries.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/countries.yml @@ -1,45 +1,45 @@ -description: |- - The `{{countries}}` array available to `templates/pages/account/payment-methods.html`; used in country and state dropdowns when submitting add payment form. - - **Handlebars Expression**: `{{countries}}` -type: array -items: - type: object - properties: - currency: - description: Details about the currency associated with the country. - type: array - items: - type: object - properties: - code: - type: string - description: The [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. - length: 3 - example: GBP - name: - type: string - description: Name of the currency. - example: Pound Sterling - symbol: - type: string - description: The symbol for the currencyʼs primary display unit. - example: £ - id: - type: integer - description: The country ID; BigCommerce-generated. - example: 2 - iso2: - type: string - description: The countryʼs [ISO 3166 Alpha-2](https://www.iso.org/iso-3166-country-codes.html) code. - example: GB - iso3: - type: string - description: The countryʼs [ISO 3166 Alpha-3](https://www.iso.org/iso-3166-country-codes.html) code. - example: GBR - name: - type: string - description: The countryʼs display name. - example: United Kingdom - selected: - type: boolean +description: |- + The `{{countries}}` array available to `templates/pages/account/payment-methods.html`; used in country and state dropdowns when submitting add payment form. + + **Handlebars Expression**: `{{countries}}` +type: array +items: + type: object + properties: + currency: + description: Details about the currency associated with the country. + type: array + items: + type: object + properties: + code: + type: string + description: The [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) currency code. + length: 3 + example: GBP + name: + type: string + description: Name of the currency. + example: Pound Sterling + symbol: + type: string + description: The symbol for the currencyʼs primary display unit. + example: £ + id: + type: integer + description: The country ID; BigCommerce-generated. + example: 2 + iso2: + type: string + description: The countryʼs [ISO 3166 Alpha-2](https://www.iso.org/iso-3166-country-codes.html) code. + example: GB + iso3: + type: string + description: The countryʼs [ISO 3166 Alpha-3](https://www.iso.org/iso-3166-country-codes.html) code. + example: GBR + name: + type: string + description: The countryʼs display name. + example: United Kingdom + selected: + type: boolean diff --git a/models/_root/create_account.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/create-account.yml similarity index 97% rename from models/_root/create_account.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/create-account.yml index 8ea589a32..68340a99d 100644 --- a/models/_root/create_account.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/create-account.yml @@ -1,8 +1,8 @@ -type: object -properties: - continue_url: - type: string -description: |- - Object to enable the current customer to create a store account. (Called on the default `<theme-name>/templates/pages/auth/create-account.html` template.) - - **Handlebars Expression**: `{{forms.create_account}}` +type: object +properties: + continue_url: + type: string +description: |- + Object to enable the current customer to create a store account. (Called on the default `<theme-name>/templates/pages/auth/create-account.html` template.) + + **Handlebars Expression**: `{{forms.create_account}}` diff --git a/models/_root/currency_selector.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/currency-selector.yml similarity index 96% rename from models/_root/currency_selector.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/currency-selector.yml index f0e9b526d..128e4a39c 100644 --- a/models/_root/currency_selector.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/currency-selector.yml @@ -1,41 +1,41 @@ -description: |- - A list of all supported currencies, and the currency that is actively in use in the storefront. - - `global` `{{currency_selector}}` - - **Handlebars Expression**: `{{currency_selector}}` -type: object -properties: - active_currency_id: - type: string - description: ID of the currency actively in use in the storefront. - active_currency_flag: - type: string - description: Country flag used to represent the active currency. - active_currency_name: - type: string - description: Name of the active currency. - active_currency_code: - type: string - description: Code for the active currency. - currencies: - type: array - description: List of all the currencies supported for this storefront. - items: - type: object - properties: - is_active: - type: boolean - description: Boolean that indicates whether this currency is active for use in the storefront - switch_url: - type: string - description: The URL to invoke a switch to this currency. - id: - type: string - description: ID of the currency. - name: - type: string - description: Name of the currency. - flag: - type: string - description: Country flag used to visually represent the currency. +description: |- + A list of all supported currencies, and the currency that is actively in use in the storefront. + + `global` `{{currency_selector}}` + + **Handlebars Expression**: `{{currency_selector}}` +type: object +properties: + active_currency_id: + type: string + description: ID of the currency actively in use in the storefront. + active_currency_flag: + type: string + description: Country flag used to represent the active currency. + active_currency_name: + type: string + description: Name of the active currency. + active_currency_code: + type: string + description: Code for the active currency. + currencies: + type: array + description: List of all the currencies supported for this storefront. + items: + type: object + properties: + is_active: + type: boolean + description: Boolean that indicates whether this currency is active for use in the storefront + switch_url: + type: string + description: The URL to invoke a switch to this currency. + id: + type: string + description: ID of the currency. + name: + type: string + description: Name of the currency. + flag: + type: string + description: Country flag used to visually represent the currency. diff --git a/models/_root/customer_group_id.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-id.yml similarity index 97% rename from models/_root/customer_group_id.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-id.yml index 149160ab6..d07f06793 100644 --- a/models/_root/customer_group_id.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-id.yml @@ -1,3 +1,3 @@ -description: '`global` `{{customer_group_id}}`' -type: integer +description: '`global` `{{customer_group_id}}`' +type: integer example: 42 \ No newline at end of file diff --git a/models/_root/customer_group_name.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-name.yml similarity index 97% rename from models/_root/customer_group_name.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-name.yml index 4f8aaf091..b6301fc65 100644 --- a/models/_root/customer_group_name.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/customer-group-name.yml @@ -1,3 +1,3 @@ -description: '`global` `{{customer_group_name}}`' -type: string +description: '`global` `{{customer_group_name}}`' +type: string example: Retail \ No newline at end of file diff --git a/models/_root/customer.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/customer.yml similarity index 84% rename from models/_root/customer.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/customer.yml index 7d5db028d..7b9805a97 100644 --- a/models/_root/customer.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/customer.yml @@ -1,110 +1,110 @@ -description: |- - `{{customer}}` object available to templates and components with customer context such as `page/contact-us-form.html`, `common/subscription-form.html`, `account/address-list.html`, `account/messages-form.html`, and `account/wishlist-list.html`. - - **Handlebars Expression**: `{{customer}}` -type: object -properties: - addresses: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/addresses.yml - customer_group_id: - type: number - description: ID of this customerʼs group. - customer_group_name: - type: string - description: Name of this customerʼs group. - edit_stored_instrument: - type: string - email: - type: string - description: Customer’s email address. - id: - description: Customerʼs ID. - type: integer - name: - description: Customerʼs name. - type: string - num_new_messages: - description: Number of unread messages for this customer. - type: integer - num_wishlists: - description: Number of wishlists for this customer. - type: string - orders: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/orders.yml - payment_methods: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/payment_methods.yml - phone: - description: Customerʼs phone number. - type: string - recently_viewed_products: - type: array - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml - returns: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/returns.yml - shipping_address: - description: Shipping address used for the order. - type: object - properties: - address1: - description: Customerʼs shipping address, first line. - type: string - address2: - description: Customerʼs shipping address, second line. - type: string - city: - description: Customerʼs shipping city. - type: string - company: - description: Customerʼs shipping company name. - type: string - country: - description: Customerʼs shipping country. - type: string - country_id: - description: ID for customerʼs shipping country. - type: string - destination: - description: 'Type of delivery destination: residential or business/commercial.' - type: string - first_name: - description: Customerʼs shipping (first) name. - type: string - form_session_id: - description: Used for custom shipping forms. - type: string - id: - description: 'Unique, system-generated ID.' - type: string - last_name: - description: Customerʼs shipping (last) name. - type: string - last_used: - description: Timestamp when this address was last used as a shipping address. - type: string - phone: - description: Customerʼs shipping phone number. - type: string - state: - description: Customerʼs shipping state. - type: string - state_id: - description: ID for customerʼs shipping state/province/region. - type: string - zip: - description: Customerʼs shipping postal code. - type: string - shipping_addresses: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/orders.yml - store_credit: - description: Customerʼs store credit. - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - wishlists: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/customer/wishlists.yml +description: |- + `{{customer}}` object available to templates and components with customer context such as `page/contact-us-form.html`, `common/subscription-form.html`, `account/address-list.html`, `account/messages-form.html`, and `account/wishlist-list.html`. + + **Handlebars Expression**: `{{customer}}` +type: object +properties: + addresses: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/addresses.yml + customer_group_id: + type: number + description: ID of this customerʼs group. + customer_group_name: + type: string + description: Name of this customerʼs group. + edit_stored_instrument: + type: string + email: + type: string + description: Customer’s email address. + id: + description: Customerʼs ID. + type: integer + name: + description: Customerʼs name. + type: string + num_new_messages: + description: Number of unread messages for this customer. + type: integer + num_wishlists: + description: Number of wishlists for this customer. + type: string + orders: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/orders.yml + payment_methods: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/payment_methods.yml + phone: + description: Customerʼs phone number. + type: string + recently_viewed_products: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml + returns: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/returns.yml + shipping_address: + description: Shipping address used for the order. + type: object + properties: + address1: + description: Customerʼs shipping address, first line. + type: string + address2: + description: Customerʼs shipping address, second line. + type: string + city: + description: Customerʼs shipping city. + type: string + company: + description: Customerʼs shipping company name. + type: string + country: + description: Customerʼs shipping country. + type: string + country_id: + description: ID for customerʼs shipping country. + type: string + destination: + description: 'Type of delivery destination: residential or business/commercial.' + type: string + first_name: + description: Customerʼs shipping (first) name. + type: string + form_session_id: + description: Used for custom shipping forms. + type: string + id: + description: 'Unique, system-generated ID.' + type: string + last_name: + description: Customerʼs shipping (last) name. + type: string + last_used: + description: Timestamp when this address was last used as a shipping address. + type: string + phone: + description: Customerʼs shipping phone number. + type: string + state: + description: Customerʼs shipping state. + type: string + state_id: + description: ID for customerʼs shipping state/province/region. + type: string + zip: + description: Customerʼs shipping postal code. + type: string + shipping_addresses: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/orders.yml + store_credit: + description: Customerʼs store credit. + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + wishlists: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/customer/wishlists.yml diff --git a/models/_root/downloads.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/downloads.yml similarity index 96% rename from models/_root/downloads.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/downloads.yml index 16148ff4f..ea61a3be6 100644 --- a/models/_root/downloads.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/downloads.yml @@ -1,28 +1,28 @@ -type: array -description: |- - Property for digital (non-physical) products. Exposed on the default `<theme-name>/templates/pages/account/download-item.html` template. - - **Handlebars Expression**: `{{downloads}}` -items: - type: object - properties: - description: - type: string - example: screenshot_video - downloads_remaining: - type: number - example: 10 - expired: - type: boolean - id: - type: string - example: '184' - name: - type: string - example: screenshot.mp3 - size: - type: string - example: 16.53 KB - url: - type: string - example: '"/account.php?action=download_item&data=OTcsMTE5LDE4NCw0N2VjZTkyM2NlNDkzOTBiOGQ0MmZlZWMwYWQ1OTEzMSwxLDE0ODA5MTMwNTcwMDM1NjQ2OTQwNDc2ODIzMTA3NzU1ODg="' +type: array +description: |- + Property for digital (non-physical) products. Exposed on the default `<theme-name>/templates/pages/account/download-item.html` template. + + **Handlebars Expression**: `{{downloads}}` +items: + type: object + properties: + description: + type: string + example: screenshot_video + downloads_remaining: + type: number + example: 10 + expired: + type: boolean + id: + type: string + example: '184' + name: + type: string + example: screenshot.mp3 + size: + type: string + example: 16.53 KB + url: + type: string + example: '"/account.php?action=download_item&data=OTcsMTE5LDE4NCw0N2VjZTkyM2NlNDkzOTBiOGQ0MmZlZWMwYWQ1OTEzMSwxLDE0ODA5MTMwNTcwMDM1NjQ2OTQwNDc2ODIzMTA3NzU1ODg="' diff --git a/models/_root/faceted_search.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/faceted-search.yml similarity index 96% rename from models/_root/faceted_search.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/faceted-search.yml index 492b3926a..6ab665ccc 100644 --- a/models/_root/faceted_search.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/faceted-search.yml @@ -1,21 +1,21 @@ -description: |- - `global` `{{faceted_search}}`; provides data for searching by category or brand. - - **Handlebars Expression**: `{{faceted_search}}` -type: object -properties: - facets: - type: string - description: List of all search facets available. - selected: - type: array - description: Container for the selected search facets (selected facets contain properties below) - items: - type: object - properties: - remove_all_url: - type: string - description: URL to remove all selected search restrictions. - items: - type: string - description: Currently enabled search facets +description: |- + `global` `{{faceted_search}}`; provides data for searching by category or brand. + + **Handlebars Expression**: `{{faceted_search}}` +type: object +properties: + facets: + type: string + description: List of all search facets available. + selected: + type: array + description: Container for the selected search facets (selected facets contain properties below) + items: + type: object + properties: + remove_all_url: + type: string + description: URL to remove all selected search restrictions. + items: + type: string + description: Currently enabled search facets diff --git a/models/_root/footer.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/footer.yml similarity index 96% rename from models/_root/footer.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/footer.yml index 226f7ea99..072b7d278 100644 --- a/models/_root/footer.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/footer.yml @@ -1,15 +1,15 @@ -type: object -title: footer -description: |- - The footer content for each storefront page. - - `global` `{{footer}}` object - - **Handlebars Expression**: `{{footer}}` -properties: - sitemap_url: - type: string - description: 'The URL to the sitemap, based on store’s SEO setting.' - scripts: - type: string - description: Scripts to be loaded after the HTML has loaded; includes performance metrics. +type: object +title: footer +description: |- + The footer content for each storefront page. + + `global` `{{footer}}` object + + **Handlebars Expression**: `{{footer}}` +properties: + sitemap_url: + type: string + description: 'The URL to the sitemap, based on store’s SEO setting.' + scripts: + type: string + description: Scripts to be loaded after the HTML has loaded; includes performance metrics. diff --git a/models/_root/forms_contact.yaml b/docs/storefront/stencil/themes/context/object-reference/schemas/forms-contact.yaml similarity index 100% rename from models/_root/forms_contact.yaml rename to docs/storefront/stencil/themes/context/object-reference/schemas/forms-contact.yaml diff --git a/docs/storefront/stencil/themes/context/object-reference/schemas/forms.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/forms.yml new file mode 100644 index 000000000..2ec96a081 --- /dev/null +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/forms.yml @@ -0,0 +1,15 @@ +description: |- + `{{forms}}` object available to pages and components with forms + + **Handlebars Expression**: `{{forms.edit_account}}` +type: object +anyOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/address.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/contact.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/create_account.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/edit_account.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/gift_certificate.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/login.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/provider.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/return.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/forms/wishlist.yml diff --git a/models/_root/head.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/head.yml similarity index 96% rename from models/_root/head.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/head.yml index 97f3bbc38..0f7ee70f5 100644 --- a/models/_root/head.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/head.yml @@ -1,21 +1,21 @@ -description: | - `global` `{{head}}` object containing data configured for the HTML `<head>` element. - - **Handlebars Expression**: `{{head}}` -type: object -properties: - favicon: - description: The storeʼs favicon. - type: string - meta_tags: - description: Meta tags to improve store SEO. - type: string - scripts: - description: Scripts to be loaded in the `<head>` tag. - type: string - stylesheets: - description: CSS files to be included. - type: string - title: - description: Current pageʼs title. - type: string +description: | + `global` `{{head}}` object containing data configured for the HTML `<head>` element. + + **Handlebars Expression**: `{{head}}` +type: object +properties: + favicon: + description: The storeʼs favicon. + type: string + meta_tags: + description: Meta tags to improve store SEO. + type: string + scripts: + description: Scripts to be loaded in the `<head>` tag. + type: string + stylesheets: + description: CSS files to be included. + type: string + title: + description: Current pageʼs title. + type: string diff --git a/models/_root/is_ajax.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/is-ajax.yml similarity index 96% rename from models/_root/is_ajax.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/is-ajax.yml index 71b610d76..50b97a4cc 100644 --- a/models/_root/is_ajax.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/is-ajax.yml @@ -1,7 +1,7 @@ -description: |- - `global` `{{is_ajax}}` boolean; returns true if the current request is an AJAX request - - **Handlebars Expression**: `{{is_ajax}}` - - No properties available for this object. -type: boolean +description: |- + `global` `{{is_ajax}}` boolean; returns true if the current request is an AJAX request + + **Handlebars Expression**: `{{is_ajax}}` + + No properties available for this object. +type: boolean diff --git a/models/_root/order.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/order.yml similarity index 95% rename from models/_root/order.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/order.yml index 24a6b2f6f..423c60226 100644 --- a/models/_root/order.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/order.yml @@ -1,429 +1,429 @@ -description: |- - The `{{order}}` object available to templates and components with order context. - - **Handlebars Expression**: `{{order}}` -type: object -examples: - - billing_address: - address_lines: - - string - city: string - company: string - country: string - email: string - full_name: string - phone: string - state: string - zip: string - comments: string - date: string - has_multiple_shipping_addresses: true - id: 0 - invoice_url: string - is_complete: true - is_digital: string - items: - - gift_wrapping_name: string - image: - alt: string - data: string - name: string - options: - - name: string - value: string - order_product_id: string - price: - currency: string - formatted: string - value: 0 - quantity: 0 - refunded: true - refunded_qty: 0 - reorder_message: string - return_url: string - shipping_rows: - - {} - show_reorder: true - sku: string - total: - currency: string - formatted: string - value: 0 - type: string - last_updated: string - order_instructions: string - payment_method: string - reorder_url: string - return_url: string - returns_enabled: 0 - shipping_address: - address_lines: - - string - city: string - company: string - country: string - email: string - full_name: string - phone: string - state: string - zip: string - shipping_address_count: string - shipping_method: string - status: string - status_messages: - - {} - status_text: string - total: - currency: string - formatted: string - value: 0 - total_rows: - - label: string - value: - currency: string - formatted: string - value: 0 - - billing_address: - address_lines: - - string - city: string - company: string - country: string - email: string - full_name: string - phone: string - state: string - zip: string - comments: string - date: string - has_multiple_shipping_addresses: true - id: 0 - invoice_url: string - is_complete: true - is_digital: string - items: - - gift_wrapping_name: string - image: - alt: string - data: string - name: string - options: - - name: string - value: string - order_product_id: string - price: - currency: string - formatted: string - value: 0 - quantity: 0 - refunded: true - refunded_qty: 0 - reorder_message: string - return_url: string - shipping_rows: - - {} - show_reorder: true - sku: string - total: - currency: string - formatted: string - value: 0 - type: string - last_updated: string - order_instructions: string - payment_method: string - reorder_url: string - return_url: string - returns_enabled: 0 - shipping_address: - address_lines: - - string - city: string - company: string - country: string - email: string - full_name: string - phone: string - state: string - zip: string - shipping_address_count: string - shipping_method: string - status: string - status_messages: - - {} - status_text: string - total: - currency: string - formatted: string - value: 0 - total_rows: - - label: string - value: - currency: string - formatted: string - value: 0 -properties: - billing_address: - type: object - description: Billing address used for the order. - properties: - address_lines: - type: array - description: Customerʼs billing address - items: - type: string - city: - type: string - description: Customerʼs billing city - company: - type: string - description: Customerʼs billing company name - country: - type: string - description: Customer billing country - email: - type: string - description: Customerʼs billing email - full_name: - type: string - description: Customerʼs billing name - phone: - type: string - description: Customer billing phone number - state: - type: string - description: Customerʼs billing state - zip: - type: string - description: Customer billing ZIP - comments: - type: string - date: - type: string - description: Date of the order - has_multiple_shipping_addresses: - type: boolean - id: - type: integer - description: 'Unique, system-generated ID' - invoice_url: - type: string - is_complete: - type: boolean - description: Boolean indicating that the order has been completed - is_digital: - type: string - items: - type: array - description: List of items for the order. - items: - type: object - properties: - gift_wrapping_name: - type: string - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - name: - type: string - description: Product Name - options: - type: array - items: - type: object - properties: - name: - type: string - value: - type: string - order_product_id: - type: string - description: Product ID - price: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - quantity: - type: integer - description: Quantity Ordered - refunded: - type: boolean - description: Price object that defines the value of this product that has been refunded. - refunded_qty: - type: integer - reorder_message: - type: string - description: An error message to be displayed when the customer attempts to reorder items that can’t be reordered. - return_url: - type: string - shipping_rows: - type: array - description: 'Array of shipping addresses, for each item in the order' - items: - type: object - show_reorder: - type: boolean - description: Boolean indicating whether the customer should see a button for reordering items on the Account Order Details page. - sku: - type: string - total: - type: object - description: Price object that defines the order’s total value - properties: - currency: - type: string - formatted: - type: string - value: - type: integer - type: - type: string - last_updated: - type: string - order_instructions: - type: string - payment_method: - type: string - description: Customer’s payment method for this order (payment gateway) - reorder_url: - type: string - description: URL to place reorders for items in this order. - return_url: - type: string - returns_enabled: - type: integer - description: Boolean that indicates whether merchant allows products from the order to be returned. - shipping_address: - type: object - description: Shipping address used for the order. - properties: - address_lines: - type: array - description: Customerʼs shipping address - items: - type: string - city: - type: string - description: Customerʼs shipping city - company: - type: string - description: Customerʼs shipping company name - country: - type: string - description: Customerʼs shipping country - email: - type: string - description: Customerʼs email - full_name: - type: string - description: Customerʼs shipping name - phone: - type: string - description: Customerʼs shipping phone number - state: - type: string - description: Customerʼs shipping state - zip: - type: string - description: Customerʼs shipping zip - shipping_address_count: - type: string - description: Number of shipping addresses the customer has specified for this order. - shipping_method: - type: string - status: - type: string - description: Order status code - status_messages: - type: array - description: Status message associated with the status code for the order - items: - type: object - status_text: - type: string - description: Status text associated with the status code for the order. - total: - type: object - description: Price object that defines the order’s total value - properties: - currency: - type: string - formatted: - type: string - value: - type: number - total_rows: - type: array - description: A list of “total” rows containing total pricing information - items: - type: object - properties: - label: - type: string - description: 'The label of the total row (Subtotal, Tax, Grand Total, etc.).' - value: - type: object - description: Value that customer selected for the option. - properties: - currency: - type: string - formatted: - type: string - value: - type: - - integer - - number - pickup_address: - type: object - properties: - location: - type: object - properties: - name: - type: string - example: Location 1 - override - code: - type: string - example: LOCATION-1 - override - address_line_1: - type: string - example: 123 Main Street - override - address_line_2: - type: string - example: Suite 101 - override - city: - type: string - example: Austin - override - state: - type: string - example: Texas - override - postal_code: - type: string - example: 78726 - override - country_alpha2: - type: string - example: US - email: - type: string - example: location1@example.com - override - phone: - type: string - example: +1 111-111-1111 - override - collection_time_description: - type: string - example: 9am - 6pm - override - collection_instructions: - type: string - example: Bring your ID - override - pickup_method_display_name: - type: string - example: Pick Up - override - pickup_method_id: - type: number - example: 1 - brand: - type: string +description: |- + The `{{order}}` object available to templates and components with order context. + + **Handlebars Expression**: `{{order}}` +type: object +examples: + - billing_address: + address_lines: + - string + city: string + company: string + country: string + email: string + full_name: string + phone: string + state: string + zip: string + comments: string + date: string + has_multiple_shipping_addresses: true + id: 0 + invoice_url: string + is_complete: true + is_digital: string + items: + - gift_wrapping_name: string + image: + alt: string + data: string + name: string + options: + - name: string + value: string + order_product_id: string + price: + currency: string + formatted: string + value: 0 + quantity: 0 + refunded: true + refunded_qty: 0 + reorder_message: string + return_url: string + shipping_rows: + - {} + show_reorder: true + sku: string + total: + currency: string + formatted: string + value: 0 + type: string + last_updated: string + order_instructions: string + payment_method: string + reorder_url: string + return_url: string + returns_enabled: 0 + shipping_address: + address_lines: + - string + city: string + company: string + country: string + email: string + full_name: string + phone: string + state: string + zip: string + shipping_address_count: string + shipping_method: string + status: string + status_messages: + - {} + status_text: string + total: + currency: string + formatted: string + value: 0 + total_rows: + - label: string + value: + currency: string + formatted: string + value: 0 + - billing_address: + address_lines: + - string + city: string + company: string + country: string + email: string + full_name: string + phone: string + state: string + zip: string + comments: string + date: string + has_multiple_shipping_addresses: true + id: 0 + invoice_url: string + is_complete: true + is_digital: string + items: + - gift_wrapping_name: string + image: + alt: string + data: string + name: string + options: + - name: string + value: string + order_product_id: string + price: + currency: string + formatted: string + value: 0 + quantity: 0 + refunded: true + refunded_qty: 0 + reorder_message: string + return_url: string + shipping_rows: + - {} + show_reorder: true + sku: string + total: + currency: string + formatted: string + value: 0 + type: string + last_updated: string + order_instructions: string + payment_method: string + reorder_url: string + return_url: string + returns_enabled: 0 + shipping_address: + address_lines: + - string + city: string + company: string + country: string + email: string + full_name: string + phone: string + state: string + zip: string + shipping_address_count: string + shipping_method: string + status: string + status_messages: + - {} + status_text: string + total: + currency: string + formatted: string + value: 0 + total_rows: + - label: string + value: + currency: string + formatted: string + value: 0 +properties: + billing_address: + type: object + description: Billing address used for the order. + properties: + address_lines: + type: array + description: Customerʼs billing address + items: + type: string + city: + type: string + description: Customerʼs billing city + company: + type: string + description: Customerʼs billing company name + country: + type: string + description: Customer billing country + email: + type: string + description: Customerʼs billing email + full_name: + type: string + description: Customerʼs billing name + phone: + type: string + description: Customer billing phone number + state: + type: string + description: Customerʼs billing state + zip: + type: string + description: Customer billing ZIP + comments: + type: string + date: + type: string + description: Date of the order + has_multiple_shipping_addresses: + type: boolean + id: + type: integer + description: 'Unique, system-generated ID' + invoice_url: + type: string + is_complete: + type: boolean + description: Boolean indicating that the order has been completed + is_digital: + type: string + items: + type: array + description: List of items for the order. + items: + type: object + properties: + gift_wrapping_name: + type: string + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + name: + type: string + description: Product Name + options: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + order_product_id: + type: string + description: Product ID + price: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + quantity: + type: integer + description: Quantity Ordered + refunded: + type: boolean + description: Price object that defines the value of this product that has been refunded. + refunded_qty: + type: integer + reorder_message: + type: string + description: An error message to be displayed when the customer attempts to reorder items that can’t be reordered. + return_url: + type: string + shipping_rows: + type: array + description: 'Array of shipping addresses, for each item in the order' + items: + type: object + show_reorder: + type: boolean + description: Boolean indicating whether the customer should see a button for reordering items on the Account Order Details page. + sku: + type: string + total: + type: object + description: Price object that defines the order’s total value + properties: + currency: + type: string + formatted: + type: string + value: + type: integer + type: + type: string + last_updated: + type: string + order_instructions: + type: string + payment_method: + type: string + description: Customer’s payment method for this order (payment gateway) + reorder_url: + type: string + description: URL to place reorders for items in this order. + return_url: + type: string + returns_enabled: + type: integer + description: Boolean that indicates whether merchant allows products from the order to be returned. + shipping_address: + type: object + description: Shipping address used for the order. + properties: + address_lines: + type: array + description: Customerʼs shipping address + items: + type: string + city: + type: string + description: Customerʼs shipping city + company: + type: string + description: Customerʼs shipping company name + country: + type: string + description: Customerʼs shipping country + email: + type: string + description: Customerʼs email + full_name: + type: string + description: Customerʼs shipping name + phone: + type: string + description: Customerʼs shipping phone number + state: + type: string + description: Customerʼs shipping state + zip: + type: string + description: Customerʼs shipping zip + shipping_address_count: + type: string + description: Number of shipping addresses the customer has specified for this order. + shipping_method: + type: string + status: + type: string + description: Order status code + status_messages: + type: array + description: Status message associated with the status code for the order + items: + type: object + status_text: + type: string + description: Status text associated with the status code for the order. + total: + type: object + description: Price object that defines the order’s total value + properties: + currency: + type: string + formatted: + type: string + value: + type: number + total_rows: + type: array + description: A list of “total” rows containing total pricing information + items: + type: object + properties: + label: + type: string + description: 'The label of the total row (Subtotal, Tax, Grand Total, etc.).' + value: + type: object + description: Value that customer selected for the option. + properties: + currency: + type: string + formatted: + type: string + value: + type: + - integer + - number + pickup_address: + type: object + properties: + location: + type: object + properties: + name: + type: string + example: Location 1 - override + code: + type: string + example: LOCATION-1 - override + address_line_1: + type: string + example: 123 Main Street - override + address_line_2: + type: string + example: Suite 101 - override + city: + type: string + example: Austin - override + state: + type: string + example: Texas - override + postal_code: + type: string + example: 78726 - override + country_alpha2: + type: string + example: US + email: + type: string + example: location1@example.com - override + phone: + type: string + example: +1 111-111-1111 - override + collection_time_description: + type: string + example: 9am - 6pm - override + collection_instructions: + type: string + example: Bring your ID - override + pickup_method_display_name: + type: string + example: Pick Up - override + pickup_method_id: + type: number + example: 1 + brand: + type: string diff --git a/models/_root/page_type.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/page-type.yml similarity index 95% rename from models/_root/page_type.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/page-type.yml index b32fb963b..c0d82e123 100644 --- a/models/_root/page_type.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/page-type.yml @@ -1,57 +1,57 @@ -type: string -description: |- - A string representing the type of page currently displayed. - - `global` `{{page_type}}` string. - - **Handlebars Expression**: `{{page_type}}` - - All possible values for `{{page-type}}` are: - - * account_orderstatus - * account_order - * account_addressbook - * shippingaddressform - * account_new_return - * add-wishlist - * account_recentitems - * account_downloaditem - * editaccount - * account_inbox - * account_saved_return - * account_returns - * account_paymentmethods - * account_addpaymentmethod - * account_editpaymentmethod - * login - * createaccount_thanks - * createaccount - * getnewpassword - * forgotpassword - * blog - * blog_post - * brand - * brands - * cart - * checkout - * category* - * compare - * page_contact_form - * error - * 404 - * giftcertificates - * giftcertificates_balance - * giftcertificates_redeem - * default* - * orderconfirmation - * page* - * product* - * amp_product_options - * search - * rss - * sitemap - * newsletter_subscribe - * wishlist - * wishlists - - The four most-commonly-used values for `{{page_type}}` are marked with asterisks. +type: string +description: |- + A string representing the type of page currently displayed. + + `global` `{{page_type}}` string. + + **Handlebars Expression**: `{{page_type}}` + + All possible values for `{{page-type}}` are: + + * account_orderstatus + * account_order + * account_addressbook + * shippingaddressform + * account_new_return + * add-wishlist + * account_recentitems + * account_downloaditem + * editaccount + * account_inbox + * account_saved_return + * account_returns + * account_paymentmethods + * account_addpaymentmethod + * account_editpaymentmethod + * login + * createaccount_thanks + * createaccount + * getnewpassword + * forgotpassword + * blog + * blog_post + * brand + * brands + * cart + * checkout + * category* + * compare + * page_contact_form + * error + * 404 + * giftcertificates + * giftcertificates_balance + * giftcertificates_redeem + * default* + * orderconfirmation + * page* + * product* + * amp_product_options + * search + * rss + * sitemap + * newsletter_subscribe + * wishlist + * wishlists + + The four most-commonly-used values for `{{page_type}}` are marked with asterisks. diff --git a/models/_root/page.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/page.yml similarity index 95% rename from models/_root/page.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/page.yml index 830fcc2ab..598eb0a6f 100644 --- a/models/_root/page.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/page.yml @@ -1,40 +1,40 @@ -description: |- - `{{page}}` object present on content pages, forms, and RSS feeds. - - **Handlebars Expression**: `{{page}}` -type: object -properties: - breadcrumbs: - description: Present if page has ancestors. - type: array - items: {} - content: - type: string - description: HTML content of the page - feed: - description: Present if page is an RSS feed page. - type: array - items: - type: object - properties: - content: - type: string - title: - type: string - url: - type: string - id: - type: integer - sub_pages: - type: array - description: Array of child pages - items: - type: object - properties: - title: - type: string - url: - type: string - title: - type: string - description: Title of this child page +description: |- + `{{page}}` object present on content pages, forms, and RSS feeds. + + **Handlebars Expression**: `{{page}}` +type: object +properties: + breadcrumbs: + description: Present if page has ancestors. + type: array + items: {} + content: + type: string + description: HTML content of the page + feed: + description: Present if page is an RSS feed page. + type: array + items: + type: object + properties: + content: + type: string + title: + type: string + url: + type: string + id: + type: integer + sub_pages: + type: array + description: Array of child pages + items: + type: object + properties: + title: + type: string + url: + type: string + title: + type: string + description: Title of this child page diff --git a/models/_root/pages.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/pages.yml similarity index 95% rename from models/_root/pages.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/pages.yml index e9c596ba2..e372041ff 100644 --- a/models/_root/pages.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/pages.yml @@ -1,24 +1,24 @@ -description: |- - `global` `{{pages}}` object containing storefront content page data - - **Handlebars Expression**: `{{pages}}` -type: object -properties: - URL: - description: URL of the page. - type: string - children: - description: List of child pages for this page. - items: - properties: - URL: - description: URL of the child page. - type: string - name: - description: Name of the child page. - type: string - type: object - type: array - name: - description: Name of the page. - type: string +description: |- + `global` `{{pages}}` object containing storefront content page data + + **Handlebars Expression**: `{{pages}}` +type: object +properties: + URL: + description: URL of the page. + type: string + children: + description: List of child pages for this page. + items: + properties: + URL: + description: URL of the child page. + type: string + name: + description: Name of the child page. + type: string + type: object + type: array + name: + description: Name of the page. + type: string diff --git a/models/_root/pagination.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/pagination.yml similarity index 96% rename from models/_root/pagination.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/pagination.yml index ab375e23b..22ef4a0bf 100644 --- a/models/_root/pagination.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/pagination.yml @@ -1,37 +1,37 @@ -type: object -description: | - `{{pagination}}` object available to templates containing paginated lists, such as `templates/pages/category.html` and `templates/pages/brands.html`. - - **Handlebars Expression**: `{{pagination}}` -anyOf: - - title: Category - type: object - properties: - category: - $ref: '#/definitions/PaginationObject' - - title: Brand - type: object - properties: - brand: - $ref: '#/definitions/PaginationObject' - - title: Blog - type: object - properties: - blog: - $ref: '#/definitions/PaginationObject' - -definitions: - PaginationObject: - type: object - properties: - current: - type: number - description: Number representing which page (in the current collection) the customer is viewing. - links: - type: array - description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' - items: - type: object - sort: - type: string - description: Field to sort by +type: object +description: | + `{{pagination}}` object available to templates containing paginated lists, such as `templates/pages/category.html` and `templates/pages/brands.html`. + + **Handlebars Expression**: `{{pagination}}` +anyOf: + - title: Category + type: object + properties: + category: + $ref: '#/definitions/PaginationObject' + - title: Brand + type: object + properties: + brand: + $ref: '#/definitions/PaginationObject' + - title: Blog + type: object + properties: + blog: + $ref: '#/definitions/PaginationObject' + +definitions: + PaginationObject: + type: object + properties: + current: + type: number + description: Number representing which page (in the current collection) the customer is viewing. + links: + type: array + description: 'Array of pages that surround the current page; displayed as a set of links, dynamically sized based on the current page number.' + items: + type: object + sort: + type: string + description: Field to sort by diff --git a/models/_root/price.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/price.yml similarity index 55% rename from models/_root/price.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/price.yml index 32ec63e6e..465e3f589 100644 --- a/models/_root/price.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/price.yml @@ -4,22 +4,22 @@ allOf: description: 'product.price and products[*].price object available to various product templates and components.' properties: non_sale_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml map_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml map_price_with_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml price_range: type: object properties: max: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml min: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml rrp_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml sale_price_without_tax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml saved: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/amount.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/price.yml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/amount.yml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/price.yml diff --git a/models/_root/product_results.yaml b/docs/storefront/stencil/themes/context/object-reference/schemas/product-results.yaml similarity index 100% rename from models/_root/product_results.yaml rename to docs/storefront/stencil/themes/context/object-reference/schemas/product-results.yaml diff --git a/models/_root/product.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml similarity index 93% rename from models/_root/product.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/product.yml index a019e1b99..b9d7064e2 100644 --- a/models/_root/product.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml @@ -1,208 +1,208 @@ -description: |- - Default property that provides detailed product data. Called on the default `templates/pages/product.html` template, and on several partials in the `templates/components/` subdirectory: - - *`account/returns-list.html` - *`cart/item-options.html`, - *`products/add-to-cart.html` - *`products/event-date.html` - *`products/modals/writeReview.html` - *`products/price.html` - *`products/product-view.html` - - **Handlebars Expression**: `{{product}}` - -type: object -properties: - AddThisServiceButtonMeta: - type: string - add_this: - type: array - items: - type: object - properties: - annotation: - type: string - service: - type: string - add_to_wishlist_url: - description: URL to add the product to the customer's wishlist - type: string - availability: - type: string - brand: - description: 'The company, product line, or trademark associated with the product.' - type: array - items: - type: object - properties: - name: - type: string - description: 'The name of the company, product line, or trademark.' - url: - type: string - description: The store's internal page with all the products from that brand. - bulk_discount_rates: - description: List of discount rates for the current product - type: array - items: - type: object - can_purchase: - description: Boolean that indicates whether the product is available for purchase - type: boolean - cart_url: - description: URL to the customer's shopping cart - type: string - category: - type: array - items: - type: string - condition: - description: Product condition - type: string - customizations: - description: 'Product customizations (for example, a T-shirt size); these correspond to configurable fields and numeric-text product options in the BigCommerce control panel' - type: array - items: - type: object - depth: - description: The product's physical depth measurement. - type: string - description: - description: (HTML) description of the product - type: string - detail_messages: - description: Status messages for display at the top of the product page - type: string - gift_wrapping_available: - description: Whether or not gift wrapping is enabled - type: boolean - gtin: - description: 'Global Trade Item Number. An identifier for trade items that is incorporated into several product identification standards, such as ISBN, UPC, and EAN.' - type: string - height: - description: The product's physical height measurement. - type: string - id: - description: Unique ID for the product - type: string - images: - description: 'List of all images for this product, in Stencil image format (as configured in config.json; used with the getImage Handlebars helper)' - type: array - items: - type: object - properties: - alt: - type: string - data: - type: string - main_image: - description: Primary image to display when the product details page loads - type: object - properties: - alt: - type: string - data: - type: string - max_purchase_quantity: - description: Maximum quantity that can be purchased at once - type: integer - meta_description: - type: string - meta_keywords: - description: 'Optional search keywords that merchants may enter in the control panelʼs "Add a Product" or "Edit a Product" page, to characterize the product in meta tags and storefront searches.' - type: string - min_purchase_quantity: - description: Minimum quantity that can be purchased at once - type: integer - mpn: - description: Manufacturer Part Number. It is used to reference and identify a product. - type: string - num_reviews: - description: Number of reviews the product has - type: integer - options: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/options.yml - out_of_stock: - type: boolean - description: 'Boolean that indicates whether the product is out of stock. Out of stock only applies to the default selection on page load. For example, if Product A is out of the "Small" size, but "Small" is selected by default, `out_of_stock` will return true, even if the product is not out of stock as a whole.' - out_of_stock_message: - type: string - example: Out of stock - description: Out of stock messages for display on the product page - page_title: - type: string - price: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/price.yml - rating: - description: Rating for the product - type: integer - related_products: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/related_products.yml - reviews: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/reviews.yml - shipping: - type: object - properties: - calculated: - type: boolean - price: - type: object - properties: - formatted: - type: string - value: - type: number - currency: - type: string - free: - type: boolean - fixed: - type: boolean - shipping_messages: - type: array - items: - type: object - show_quantity_input: - type: integer - sku: - description: Default product variant when no options are selected. - type: string - stock_level: - description: Indicates the number of items available for sale. Visible only when inventory tracking is turned on. - type: string - tags: - description: Keywords by which this product can also be identified. - type: array - items: - type: object - title: - description: Displayed name of the product - type: string - upc: - description: Optional UPC code for the product - type: string - url: - description: URL to the product detail page - type: string - videos: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/product/videos.yml - warranty: - description: Optional warranty text set by the merchant - type: string - width: - description: The product's physical width measurement. - type: string - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - example: 61 - name: - type: string - example: unavailable_for - value: - type: string - example: CAD +description: |- + Default property that provides detailed product data. Called on the default `templates/pages/product.html` template, and on several partials in the `templates/components/` subdirectory: + + *`account/returns-list.html` + *`cart/item-options.html`, + *`products/add-to-cart.html` + *`products/event-date.html` + *`products/modals/writeReview.html` + *`products/price.html` + *`products/product-view.html` + + **Handlebars Expression**: `{{product}}` + +type: object +properties: + AddThisServiceButtonMeta: + type: string + add_this: + type: array + items: + type: object + properties: + annotation: + type: string + service: + type: string + add_to_wishlist_url: + description: URL to add the product to the customer's wishlist + type: string + availability: + type: string + brand: + description: 'The company, product line, or trademark associated with the product.' + type: array + items: + type: object + properties: + name: + type: string + description: 'The name of the company, product line, or trademark.' + url: + type: string + description: The store's internal page with all the products from that brand. + bulk_discount_rates: + description: List of discount rates for the current product + type: array + items: + type: object + can_purchase: + description: Boolean that indicates whether the product is available for purchase + type: boolean + cart_url: + description: URL to the customer's shopping cart + type: string + category: + type: array + items: + type: string + condition: + description: Product condition + type: string + customizations: + description: 'Product customizations (for example, a T-shirt size); these correspond to configurable fields and numeric-text product options in the BigCommerce control panel' + type: array + items: + type: object + depth: + description: The product's physical depth measurement. + type: string + description: + description: (HTML) description of the product + type: string + detail_messages: + description: Status messages for display at the top of the product page + type: string + gift_wrapping_available: + description: Whether or not gift wrapping is enabled + type: boolean + gtin: + description: 'Global Trade Item Number. An identifier for trade items that is incorporated into several product identification standards, such as ISBN, UPC, and EAN.' + type: string + height: + description: The product's physical height measurement. + type: string + id: + description: Unique ID for the product + type: string + images: + description: 'List of all images for this product, in Stencil image format (as configured in config.json; used with the getImage Handlebars helper)' + type: array + items: + type: object + properties: + alt: + type: string + data: + type: string + main_image: + description: Primary image to display when the product details page loads + type: object + properties: + alt: + type: string + data: + type: string + max_purchase_quantity: + description: Maximum quantity that can be purchased at once + type: integer + meta_description: + type: string + meta_keywords: + description: 'Optional search keywords that merchants may enter in the control panelʼs "Add a Product" or "Edit a Product" page, to characterize the product in meta tags and storefront searches.' + type: string + min_purchase_quantity: + description: Minimum quantity that can be purchased at once + type: integer + mpn: + description: Manufacturer Part Number. It is used to reference and identify a product. + type: string + num_reviews: + description: Number of reviews the product has + type: integer + options: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/product/options.yml + out_of_stock: + type: boolean + description: 'Boolean that indicates whether the product is out of stock. Out of stock only applies to the default selection on page load. For example, if Product A is out of the "Small" size, but "Small" is selected by default, `out_of_stock` will return true, even if the product is not out of stock as a whole.' + out_of_stock_message: + type: string + example: Out of stock + description: Out of stock messages for display on the product page + page_title: + type: string + price: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/product/price.yml + rating: + description: Rating for the product + type: integer + related_products: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/product/related_products.yml + reviews: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/product/reviews.yml + shipping: + type: object + properties: + calculated: + type: boolean + price: + type: object + properties: + formatted: + type: string + value: + type: number + currency: + type: string + free: + type: boolean + fixed: + type: boolean + shipping_messages: + type: array + items: + type: object + show_quantity_input: + type: integer + sku: + description: Default product variant when no options are selected. + type: string + stock_level: + description: Indicates the number of items available for sale. Visible only when inventory tracking is turned on. + type: string + tags: + description: Keywords by which this product can also be identified. + type: array + items: + type: object + title: + description: Displayed name of the product + type: string + upc: + description: Optional UPC code for the product + type: string + url: + description: URL to the product detail page + type: string + videos: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/product/videos.yml + warranty: + description: Optional warranty text set by the merchant + type: string + width: + description: The product's physical width measurement. + type: string + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + example: 61 + name: + type: string + example: unavailable_for + value: + type: string + example: CAD diff --git a/models/_root/products.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/products.yml similarity index 71% rename from models/_root/products.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/products.yml index ee4ee0a96..4182e6ff8 100644 --- a/models/_root/products.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/products.yml @@ -1,17 +1,17 @@ -description: 'The `{{products}}` object available on pages with product cards like `templates/pages/home.html`; contains `new`, `featured`, and `top_sellers`.' -type: object -properties: - new: - type: array - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml - featured: - type: array - description: Renders a list of all the featured products for the BigCommerce storefront. - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml - top_sellers: - type: array - description: Object to display a sidebar of top-selling products. - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/product.yml +description: 'The `{{products}}` object available on pages with product cards like `templates/pages/home.html`; contains `new`, `featured`, and `top_sellers`.' +type: object +properties: + new: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml + featured: + type: array + description: Renders a list of all the featured products for the BigCommerce storefront. + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml + top_sellers: + type: array + description: Object to display a sidebar of top-selling products. + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/product.yml diff --git a/models/_root/remote_api_scripts.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/remote-api-scripts.yml similarity index 100% rename from models/_root/remote_api_scripts.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/remote-api-scripts.yml diff --git a/models/_root/settings.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml similarity index 97% rename from models/_root/settings.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml index ff4f4849d..7202e4a3b 100644 --- a/models/_root/settings.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml @@ -1,248 +1,248 @@ -description: |- - Common settings shared across every BigCommerce storefront. - - `global` `{{settings}}` object - - **Handlebars Expression**: `{{settings}}` -type: object -title: settings -properties: - account_creation_enabled: - type: boolean - description: Site-wide boolean value that indicates whether to allow customers to create accounts. - add_this: - type: object - description: Object that defines links for the AddThis social sharing component. - properties: - buttons: - type: array - description: 'Array of buttons to display for AddThis social sharing `{{#each settings.add_this.buttons}}{{service}}{{/each}} {{#each settings.add_this.buttons}}{{annotations}}{{/each}}`.' - items: - type: object - properties: - annotation: - type: string - description: String containing HTML attributes associated with this button. - service: - type: string - description: 'String containing the name of this buttonʼs social-media service (facebook, email, print, twitter, linkedin, google, etc.)' - address: - type: string - description: 'Store’s complete physical address, as entered by merchant in the store profile.' - base_url: - type: string - description: The normal shop URL. - blog_enabled: - type: boolean - description: Site-wide boolean value that indicates whether the blog is visible for this storefront. - bulk_discount_enabled: - type: boolean - description: Boolean that return true if bulk discount is enabled on products. - cdn_url: - type: string - client_ip_address: - type: string - description: IP address of the customer browsing the storefront. - country_code: - type: string - description: The country code corresponding to the IP. - data_tag_enabled: - type: boolean - description: 'Site-wide boolean that indicates whether GAEE is enabled in a theme. For `{{settings.data_tag_enabled}}` to be true, the enhanced_ecommerce key must be present in config.json and a GAEE experiment must be enabled along with GA property value set in Advanced Settings > Analytics > GA in the store control panel.' - display_date_format: - type: string - description: 'Brief display format/pattern for dates, as configured in the control panelʼs Display Date Format field.' - extended_display_date_format: - type: string - description: 'Extended display format/pattern for dates, as configured in the control panelʼs Extended Display Date Format field.' - facebook_like_button: - type: object - properties: - enabled: - type: boolean - href: - type: string - verb: - type: string - general: - type: object - properties: - fastCart: - type: boolean - storeId: - type: integer - gift_certificates_enabled: - type: boolean - description: Site-wide boolean value that indicates whether to enable the gift certificate system for this store. - is_eu_ip_address: - type: boolean - description: A boolean value. Return true if the shoppers ip address is in the EU. - maintenance: - type: object - description: Object that manages information about the store when in maintenance (offline) mode. - properties: - header: - type: 'null' - description: 'If store is in maintenance mode, string containing header text for the **Down for Maintenance** window displayed to visitors; otherwise, null.' - message: - type: 'null' - description: 'If store is in maintenance mode, string containing merchant-customizable body text (and optionally, HTML) for the **Down for Maintenance** window displayed to visitors; otherwise, null.' - notice: - type: 'null' - description: 'If store is in maintenance mode, one of three strings identifying the storeʼs status, and generating a corresponding text notice to merchants about how to proceed: AdminPrelaunchNotice for preview stores, AdminMaintenanceNotice for active stores taken down for maintenance, or AdminHibernationModeNotice for deactivated stores; otherwise, null.' - password: - type: 'null' - securePath: - type: string - measurements: - type: object - description: 'Collection of units-of-measure definitions, to be used when displaying product details:' - properties: - length: - type: string - description: Units of measure for product length - weight: - type: string - description: Units of measure for product weight - money: - type: object - description: List of child items that define the store’s default currency formatting. - properties: - currency_location: - type: string - description: Whether currency symbol appears at left or right of the quantity - currency_token: - type: string - description: Symbol for the currency - decimal_places: - type: integer - description: Number of decimal places to display - decimal_token: - type: string - description: Symbol for decimal separator - thousands_token: - type: string - description: Symbol for thousands separator - newsletter_summary: - type: string - description: 'Returns the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter).' - password_requirements: - type: object - description: 'Collection of properties representing BigCommerce requirements for customer-account passwords:' - properties: - alpha: - type: string - description: Regular expression representing required/acceptable alphabetic characters. - error: - type: string - description: String that passes a standard error message for noncompliant password. - minlength: - type: integer - description: Integer representing minimum acceptable password length. - numeric: - type: string - description: Regular expression representing required/acceptable numeric characters. - payments_url: - type: string - description: 'Exposes the BigCommerce payments URL. `https://payments.bigcommerce.com.`' - phone_number: - type: string - description: 'The contact phone number for the store located in the [stores profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings).' - privacy_cookie: - type: boolean - description: 'If enabled, a string containing merchant-customizable text for (European Union–required) cookie-setting notification; if disabled, a boolean with a value of false.' - region_code: - type: string - description: The [ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code is an international standard denomination for country subdivisions. The first part is the country's ISO 3166-1 alpha-2 code, and the second part is a string of up to three alphanumeric characters representing the country's subdivision (province or state). For example, Texas's ISO 3166-2 code is US-TX; therefore, the region code is TX. - request: - type: object - description: Object that contains details about the HTTP request. - properties: - absolute_path: - type: string - description: The absolute URL requested. Never use request.path in the actual body of the page. - host: - type: string - description: Hostname of the request. - is_crawler: - type: boolean - description: Renders `true` if user agent is known crawler; otherwise, `false`. - locale: - type: string - description: The browserʼs locale. Allows for varying experience based on shopper locale. - origin: - type: string - description: Origin of the request. - referer: - type: boolean - description: Refer of the request. - user_agent: - type: string - description: User agent string of the request. - returns_enabled: - type: integer - description: Boolean that indicates whether the control-panel setting for the returns system is enabled. - rss_item_limit: - type: integer - description: An integer that sets a limit on the number of RSS items to display. - secure_base_url: - type: string - description: 'The SSL-enabled, secure, shop URL.' - secure_host: - type: string - description: 'Returns the SSL url for a store. Example: `https://www.bigcommerce.com`.' - shopper_consent_tracking_enabled: - type: boolean - show_newsletter_box: - type: integer - description: Site-wide boolean value that indicates whether to display a mailing-list invite to visitors. - show_newsletter_summary: - type: integer - description: 'Returns a 1 if the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter is shown. Returns 0 if it is now shown. If show_newsletter_box is 0 then show_newsletter_summary will also be 0.' - show_payment_methods: - type: boolean - description: A boolean value. If true available payment methods on a store will be shown. If false they are hidden. - show_product_rating: - type: boolean - description: Site-wide boolean value that indicates whether to display product ratings (in numeric or star format) to visitors. - show_product_reviews: - type: boolean - description: Site-wide boolean value that indicates whether to display full-text product reviews to visitors. - show_wishlist: - type: boolean - description: Site-wide boolean value that indicates whether to allow customers to create wishlists. - store_dst_correction: - type: integer - description: 'Whether or not this time zone observes Daylight Saving Time (boolean), as set by the control panelʼs Enable DST Correction check box.' - store_hash: - type: string - description: Returns the store hash as a string. - store_logo: - type: object - description: The store’s logo. - properties: - title: - type: string - description: Title for the logo. Configure the text in the control panel under Storefront Design Design Options Logo. - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - store_name: - type: string - description: Name of the BigCommerce store. - store_time_zone: - type: string - description: 'Storeʼs time zone, as selected in the control panelʼs Your Timezone dropdown list.' - storefront_api: - type: object - properties: - token: - type: string - tax_label: - type: string - description: 'Defines the Tax Label (VAT, Sales Tax, etc.) that a merchant can set in the control panel’s Settings > Tax page for display to customers.' - theme_config_id: - type: string - theme_session_id: - type: string - theme_version_id: - type: string +description: |- + Common settings shared across every BigCommerce storefront. + + `global` `{{settings}}` object + + **Handlebars Expression**: `{{settings}}` +type: object +title: settings +properties: + account_creation_enabled: + type: boolean + description: Site-wide boolean value that indicates whether to allow customers to create accounts. + add_this: + type: object + description: Object that defines links for the AddThis social sharing component. + properties: + buttons: + type: array + description: 'Array of buttons to display for AddThis social sharing `{{#each settings.add_this.buttons}}{{service}}{{/each}} {{#each settings.add_this.buttons}}{{annotations}}{{/each}}`.' + items: + type: object + properties: + annotation: + type: string + description: String containing HTML attributes associated with this button. + service: + type: string + description: 'String containing the name of this buttonʼs social-media service (facebook, email, print, twitter, linkedin, google, etc.)' + address: + type: string + description: 'Store’s complete physical address, as entered by merchant in the store profile.' + base_url: + type: string + description: The normal shop URL. + blog_enabled: + type: boolean + description: Site-wide boolean value that indicates whether the blog is visible for this storefront. + bulk_discount_enabled: + type: boolean + description: Boolean that return true if bulk discount is enabled on products. + cdn_url: + type: string + client_ip_address: + type: string + description: IP address of the customer browsing the storefront. + country_code: + type: string + description: The country code corresponding to the IP. + data_tag_enabled: + type: boolean + description: 'Site-wide boolean that indicates whether GAEE is enabled in a theme. For `{{settings.data_tag_enabled}}` to be true, the enhanced_ecommerce key must be present in config.json and a GAEE experiment must be enabled along with GA property value set in Advanced Settings > Analytics > GA in the store control panel.' + display_date_format: + type: string + description: 'Brief display format/pattern for dates, as configured in the control panelʼs Display Date Format field.' + extended_display_date_format: + type: string + description: 'Extended display format/pattern for dates, as configured in the control panelʼs Extended Display Date Format field.' + facebook_like_button: + type: object + properties: + enabled: + type: boolean + href: + type: string + verb: + type: string + general: + type: object + properties: + fastCart: + type: boolean + storeId: + type: integer + gift_certificates_enabled: + type: boolean + description: Site-wide boolean value that indicates whether to enable the gift certificate system for this store. + is_eu_ip_address: + type: boolean + description: A boolean value. Return true if the shoppers ip address is in the EU. + maintenance: + type: object + description: Object that manages information about the store when in maintenance (offline) mode. + properties: + header: + type: 'null' + description: 'If store is in maintenance mode, string containing header text for the **Down for Maintenance** window displayed to visitors; otherwise, null.' + message: + type: 'null' + description: 'If store is in maintenance mode, string containing merchant-customizable body text (and optionally, HTML) for the **Down for Maintenance** window displayed to visitors; otherwise, null.' + notice: + type: 'null' + description: 'If store is in maintenance mode, one of three strings identifying the storeʼs status, and generating a corresponding text notice to merchants about how to proceed: AdminPrelaunchNotice for preview stores, AdminMaintenanceNotice for active stores taken down for maintenance, or AdminHibernationModeNotice for deactivated stores; otherwise, null.' + password: + type: 'null' + securePath: + type: string + measurements: + type: object + description: 'Collection of units-of-measure definitions, to be used when displaying product details:' + properties: + length: + type: string + description: Units of measure for product length + weight: + type: string + description: Units of measure for product weight + money: + type: object + description: List of child items that define the store’s default currency formatting. + properties: + currency_location: + type: string + description: Whether currency symbol appears at left or right of the quantity + currency_token: + type: string + description: Symbol for the currency + decimal_places: + type: integer + description: Number of decimal places to display + decimal_token: + type: string + description: Symbol for decimal separator + thousands_token: + type: string + description: Symbol for thousands separator + newsletter_summary: + type: string + description: 'Returns the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter).' + password_requirements: + type: object + description: 'Collection of properties representing BigCommerce requirements for customer-account passwords:' + properties: + alpha: + type: string + description: Regular expression representing required/acceptable alphabetic characters. + error: + type: string + description: String that passes a standard error message for noncompliant password. + minlength: + type: integer + description: Integer representing minimum acceptable password length. + numeric: + type: string + description: Regular expression representing required/acceptable numeric characters. + payments_url: + type: string + description: 'Exposes the BigCommerce payments URL. `https://payments.bigcommerce.com.`' + phone_number: + type: string + description: 'The contact phone number for the store located in the [stores profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings).' + privacy_cookie: + type: boolean + description: 'If enabled, a string containing merchant-customizable text for (European Union–required) cookie-setting notification; if disabled, a boolean with a value of false.' + region_code: + type: string + description: The [ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code is an international standard denomination for country subdivisions. The first part is the country's ISO 3166-1 alpha-2 code, and the second part is a string of up to three alphanumeric characters representing the country's subdivision (province or state). For example, Texas's ISO 3166-2 code is US-TX; therefore, the region code is TX. + request: + type: object + description: Object that contains details about the HTTP request. + properties: + absolute_path: + type: string + description: The absolute URL requested. Never use request.path in the actual body of the page. + host: + type: string + description: Hostname of the request. + is_crawler: + type: boolean + description: Renders `true` if user agent is known crawler; otherwise, `false`. + locale: + type: string + description: The browserʼs locale. Allows for varying experience based on shopper locale. + origin: + type: string + description: Origin of the request. + referer: + type: boolean + description: Refer of the request. + user_agent: + type: string + description: User agent string of the request. + returns_enabled: + type: integer + description: Boolean that indicates whether the control-panel setting for the returns system is enabled. + rss_item_limit: + type: integer + description: An integer that sets a limit on the number of RSS items to display. + secure_base_url: + type: string + description: 'The SSL-enabled, secure, shop URL.' + secure_host: + type: string + description: 'Returns the SSL url for a store. Example: `https://www.bigcommerce.com`.' + shopper_consent_tracking_enabled: + type: boolean + show_newsletter_box: + type: integer + description: Site-wide boolean value that indicates whether to display a mailing-list invite to visitors. + show_newsletter_summary: + type: integer + description: 'Returns a 1 if the [newsletter summary](https://support.bigcommerce.com/s/article/Collecting-Newsletter-Subscriptions#newsletter is shown. Returns 0 if it is now shown. If show_newsletter_box is 0 then show_newsletter_summary will also be 0.' + show_payment_methods: + type: boolean + description: A boolean value. If true available payment methods on a store will be shown. If false they are hidden. + show_product_rating: + type: boolean + description: Site-wide boolean value that indicates whether to display product ratings (in numeric or star format) to visitors. + show_product_reviews: + type: boolean + description: Site-wide boolean value that indicates whether to display full-text product reviews to visitors. + show_wishlist: + type: boolean + description: Site-wide boolean value that indicates whether to allow customers to create wishlists. + store_dst_correction: + type: integer + description: 'Whether or not this time zone observes Daylight Saving Time (boolean), as set by the control panelʼs Enable DST Correction check box.' + store_hash: + type: string + description: Returns the store hash as a string. + store_logo: + type: object + description: The store’s logo. + properties: + title: + type: string + description: Title for the logo. Configure the text in the control panel under Storefront Design Design Options Logo. + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + store_name: + type: string + description: Name of the BigCommerce store. + store_time_zone: + type: string + description: 'Storeʼs time zone, as selected in the control panelʼs Your Timezone dropdown list.' + storefront_api: + type: object + properties: + token: + type: string + tax_label: + type: string + description: 'Defines the Tax Label (VAT, Sales Tax, etc.) that a merchant can set in the control panel’s Settings > Tax page for display to customers.' + theme_config_id: + type: string + theme_session_id: + type: string + theme_version_id: + type: string diff --git a/models/_root/shipments.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/shipments.yml similarity index 96% rename from models/_root/shipments.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/shipments.yml index a8d367196..83c927198 100644 --- a/models/_root/shipments.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/shipments.yml @@ -1,27 +1,27 @@ -description: '`{{shipments}}` array available to `templates/pages/account/orders/details.html`' -type: array -items: - type: object - properties: - date_shipped: - description: shipping date for this shipment - type: string - shipping_method: - description: shipping method for this shipment - type: string - shipping_provider: - description: shipping carrier for this shipment - type: string - shipping_track: - description: tracking information for this shipment - type: object - properties: - number: - description: tracking number for this shipment - type: string - url: - description: tracking URL for this shipment - type: string - show_shipping_method: - description: boolean indicating whether shipping method should be displayed to customer or not - type: boolean +description: '`{{shipments}}` array available to `templates/pages/account/orders/details.html`' +type: array +items: + type: object + properties: + date_shipped: + description: shipping date for this shipment + type: string + shipping_method: + description: shipping method for this shipment + type: string + shipping_provider: + description: shipping carrier for this shipment + type: string + shipping_track: + description: tracking information for this shipment + type: object + properties: + number: + description: tracking number for this shipment + type: string + url: + description: tracking URL for this shipment + type: string + show_shipping_method: + description: boolean indicating whether shipping method should be displayed to customer or not + type: boolean diff --git a/models/_root/shipping_messages.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/shipping-messages.yml similarity index 97% rename from models/_root/shipping_messages.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/shipping-messages.yml index 580e15198..0b3441d2a 100644 --- a/models/_root/shipping_messages.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/shipping-messages.yml @@ -1,5 +1,5 @@ -description: '`{{shipping_messages}}` object available to `templates/pages/home.html`' -type: array -items: - type: string +description: '`{{shipping_messages}}` object available to `templates/pages/home.html`' +type: array +items: + type: string example: free shipping \ No newline at end of file diff --git a/models/_root/shop_by_brand.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/shop-by-brand.yml similarity index 96% rename from models/_root/shop_by_brand.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/shop-by-brand.yml index 8822183a4..f8cc560be 100644 --- a/models/_root/shop_by_brand.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/shop-by-brand.yml @@ -1,23 +1,23 @@ -description: |- - Objects to enable customers to shop by brand. Returns top 10 brands, by product count. (Called on the default `templates/components/brand/sidebar.html` and `templates/components/common/footer.html` partials.) - - `global` `{{shop_by_brand}}` array of top 10 brands by product count. - - **Handlebars Expression**: `{{shop_by_brand}}` -type: array -title: shop_by_brand -items: - type: object - properties: - count: - type: string - description: Number of products matching this brand. - id: - type: string - description: ID for this brand. - name: - type: string - description: Name of this brand. - url: - type: string - description: URL for this brand. +description: |- + Objects to enable customers to shop by brand. Returns top 10 brands, by product count. (Called on the default `templates/components/brand/sidebar.html` and `templates/components/common/footer.html` partials.) + + `global` `{{shop_by_brand}}` array of top 10 brands by product count. + + **Handlebars Expression**: `{{shop_by_brand}}` +type: array +title: shop_by_brand +items: + type: object + properties: + count: + type: string + description: Number of products matching this brand. + id: + type: string + description: ID for this brand. + name: + type: string + description: Name of this brand. + url: + type: string + description: URL for this brand. diff --git a/models/_root/sitemap.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/sitemap.yml similarity index 96% rename from models/_root/sitemap.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/sitemap.yml index ad7cf442d..f301e54f0 100644 --- a/models/_root/sitemap.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/sitemap.yml @@ -1,32 +1,32 @@ -description: |- - A list of all sitemap properties for this BigCommerce storefront: pages, categories, and brands. - - `{{sitemap}}` object available to `templates/pages/sitemap.html`. - - **Handlebars Expression**: `{{sitemap}}` -type: array -items: - type: object - properties: - body: - type: array - description: List of all sitemap subsections - items: - type: object - properties: - label: - type: string - description: Label of the page, category, or brand. - url: - type: string - description: URL of the page, category, or brand. - label: - type: string - description: 'Subsection title (pages, categories, brands).' - show_all_link: - type: boolean - subsection_url: - type: string - description: 'URL to subsection content (pages, categories, brands) of the sitemap.' - title: - type: string +description: |- + A list of all sitemap properties for this BigCommerce storefront: pages, categories, and brands. + + `{{sitemap}}` object available to `templates/pages/sitemap.html`. + + **Handlebars Expression**: `{{sitemap}}` +type: array +items: + type: object + properties: + body: + type: array + description: List of all sitemap subsections + items: + type: object + properties: + label: + type: string + description: Label of the page, category, or brand. + url: + type: string + description: URL of the page, category, or brand. + label: + type: string + description: 'Subsection title (pages, categories, brands).' + show_all_link: + type: boolean + subsection_url: + type: string + description: 'URL to subsection content (pages, categories, brands) of the sitemap.' + title: + type: string diff --git a/models/_root/social_media.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/social-media.yml similarity index 97% rename from models/_root/social_media.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/social-media.yml index 8602bb018..18ff8d273 100644 --- a/models/_root/social_media.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/social-media.yml @@ -1,20 +1,20 @@ -description: |- - `global` `{{social_media}}` array of all social-media site links for the storefront. - - **Handlebars Expression**: `{{social_media}}` -type: array -items: - type: object - properties: - name: - type: string - description: 'Internal name of this social-media platform. For example, `instagram`.' - url: - type: string - description: 'URL to point to, set by merchant in control panel ([https://www.facebook.com/BigCommerce](https://www.facebook.com/BigCommerce), etc.)' - position: - type: integer - description: Display sort order for this platform within the social-media list - display_name: - type: string - description: 'Displayed/formatted name of this social-media platform. For example, “Instagram”.' +description: |- + `global` `{{social_media}}` array of all social-media site links for the storefront. + + **Handlebars Expression**: `{{social_media}}` +type: array +items: + type: object + properties: + name: + type: string + description: 'Internal name of this social-media platform. For example, `instagram`.' + url: + type: string + description: 'URL to point to, set by merchant in control panel ([https://www.facebook.com/BigCommerce](https://www.facebook.com/BigCommerce), etc.)' + position: + type: integer + description: Display sort order for this platform within the social-media list + display_name: + type: string + description: 'Displayed/formatted name of this social-media platform. For example, “Instagram”.' diff --git a/models/_root/template_file.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/template-file.yml similarity index 97% rename from models/_root/template_file.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/template-file.yml index 995b3f448..ef721f513 100644 --- a/models/_root/template_file.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/template-file.yml @@ -1,3 +1,3 @@ -description: "`global` `{{template_file}}` string" -type: string +description: "`global` `{{template_file}}` string" +type: string example: pages/home \ No newline at end of file diff --git a/models/_root/theme_settings.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/theme-settings.yml similarity index 95% rename from models/_root/theme_settings.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/theme-settings.yml index b576d3151..96aa0a24c 100644 --- a/models/_root/theme_settings.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/theme-settings.yml @@ -1,545 +1,545 @@ -description: '`global` `{{theme_settings}}` object' -type: object -properties: - alert-backgroundColor: - type: string - alert-color: - type: string - alert-color-alt: - type: string - applePay-button: - type: string - blockquote-cite-font-color: - type: string - blog_size: - type: string - body-bg: - type: string - body-font: - type: string - brand_size: - type: string - brandpage_products_per_page: - type: integer - button--default-borderColor: - type: string - button--default-borderColorActive: - type: string - button--default-borderColorHover: - type: string - button--default-color: - type: string - button--default-colorActive: - type: string - button--default-colorHover: - type: string - button--disabled-backgroundColor: - type: string - button--disabled-borderColor: - type: string - button--disabled-color: - type: string - button--icon-svg-color: - type: string - button--primary-backgroundColor: - type: string - button--primary-backgroundColorActive: - type: string - button--primary-backgroundColorHover: - type: string - button--primary-color: - type: string - button--primary-colorActive: - type: string - button--primary-colorHover: - type: string - card--alternate-backgroundColor: - type: string - card--alternate-borderColor: - type: string - card--alternate-color--hover: - type: string - card-figcaption-button-background: - type: string - card-figcaption-button-color: - type: string - card-title-color: - type: string - card-title-color-hover: - type: string - carousel-arrow-bgColor: - type: string - carousel-arrow-borderColor: - type: string - carousel-arrow-color: - type: string - carousel-bgColor: - type: string - carousel-description-color: - type: string - carousel-dot-bgColor: - type: string - carousel-dot-color: - type: string - carousel-dot-color-active: - type: string - carousel-title-color: - type: string - categorypage_products_per_page: - type: integer - checkRadio-backgroundColor: - type: string - checkRadio-borderColor: - type: string - checkRadio-color: - type: string - color-black: - type: string - color-error: - type: string - color-errorLight: - type: string - color-grey: - type: string - color-greyDark: - type: string - color-greyDarker: - type: string - color-greyDarkest: - type: string - color-greyLight: - type: string - color-greyLighter: - type: string - color-greyLightest: - type: string - color-greyMedium: - type: string - color-info: - type: string - color-infoLight: - type: string - color-primary: - type: string - color-primaryDark: - type: string - color-primaryDarker: - type: string - color-primaryLight: - type: string - color-secondary: - type: string - color-secondaryDark: - type: string - color-secondaryDarker: - type: string - color-success: - type: string - color-successLight: - type: string - color-textBase: - type: string - color-textBase--active: - type: string - color-textBase--hover: - type: string - color-textHeading: - type: string - color-textLink: - type: string - color-textLink--active: - type: string - color-textLink--hover: - type: string - color-textSecondary: - type: string - color-textSecondary--active: - type: string - color-textSecondary--hover: - type: string - color-warning: - type: string - color-warningLight: - type: string - color-white: - type: string - color-whitesBase: - type: string - color_badge_product_sale_badges: - type: string - color_hover_product_sale_badges: - type: string - color_text_product_sale_badges: - type: string - container-border-global-color-base: - type: string - container-fill-base: - type: string - container-fill-dark: - type: string - default_image_brand: - type: string - default_image_gift_certificate: - type: string - default_image_product: - type: string - dropdown--quickSearch-backgroundColor: - type: string - dropdown--wishList-backgroundColor: - type: string - fontSize-h1: - type: integer - fontSize-h2: - type: integer - fontSize-h3: - type: integer - fontSize-h4: - type: integer - fontSize-h5: - type: integer - fontSize-h6: - type: integer - fontSize-root: - type: integer - footer-backgroundColor: - type: string - form-label-font-color: - type: string - gallery_size: - type: string - geotrust_ssl_common_name: - type: string - geotrust_ssl_seal_size: - type: string - header-backgroundColor: - type: string - headings-font: - type: string - hide_blog_page_heading: - type: boolean - hide_breadcrumbs: - type: boolean - hide_category_page_heading: - type: boolean - hide_contact_us_page_heading: - type: boolean - hide_content_navigation: - type: boolean - hide_page_heading: - type: boolean - homepage_blog_posts_count: - type: integer - homepage_featured_products_column_count: - type: integer - homepage_featured_products_count: - type: integer - homepage_new_products_column_count: - type: integer - homepage_new_products_count: - type: integer - homepage_show_carousel: - type: boolean - homepage_show_carousel_arrows: - type: boolean - homepage_stretch_carousel_images: - type: boolean - homepage_top_products_column_count: - type: integer - homepage_top_products_count: - type: integer - icon-color: - type: string - icon-color-hover: - type: string - icon-ratingEmpty: - type: string - icon-ratingFull: - type: string - input-bg-color: - type: string - input-border-color: - type: string - input-border-color-active: - type: string - input-disabled-bg: - type: string - input-font-color: - type: string - label-backgroundColor: - type: string - label-color: - type: string - loadingOverlay-backgroundColor: - type: string - logo-position: - type: string - logo_fontSize: - type: integer - logo_size: - type: string - navPages-color: - type: string - navPages-color-hover: - type: string - navPages-subMenu-backgroundColor: - type: string - navPages-subMenu-separatorColor: - type: string - navUser-color: - type: string - navUser-color-hover: - type: string - navUser-dropdown-backgroundColor: - type: string - navUser-dropdown-borderColor: - type: string - navUser-indicator-backgroundColor: - type: string - navigation_design: - type: string - optimizedCheckout-backgroundImage: - type: string - optimizedCheckout-backgroundImage-size: - type: string - optimizedCheckout-body-backgroundColor: - type: string - optimizedCheckout-buttonPrimary-backgroundColor: - type: string - optimizedCheckout-buttonPrimary-backgroundColorActive: - type: string - optimizedCheckout-buttonPrimary-backgroundColorDisabled: - type: string - optimizedCheckout-buttonPrimary-backgroundColorHover: - type: string - optimizedCheckout-buttonPrimary-borderColor: - type: string - optimizedCheckout-buttonPrimary-borderColorActive: - type: string - optimizedCheckout-buttonPrimary-borderColorDisabled: - type: string - optimizedCheckout-buttonPrimary-borderColorHover: - type: string - optimizedCheckout-buttonPrimary-color: - type: string - optimizedCheckout-buttonPrimary-colorActive: - type: string - optimizedCheckout-buttonPrimary-colorDisabled: - type: string - optimizedCheckout-buttonPrimary-colorHover: - type: string - optimizedCheckout-buttonPrimary-font: - type: string - optimizedCheckout-buttonSecondary-backgroundColor: - type: string - optimizedCheckout-buttonSecondary-backgroundColorActive: - type: string - optimizedCheckout-buttonSecondary-backgroundColorHover: - type: string - optimizedCheckout-buttonSecondary-borderColor: - type: string - optimizedCheckout-buttonSecondary-borderColorActive: - type: string - optimizedCheckout-buttonSecondary-borderColorHover: - type: string - optimizedCheckout-buttonSecondary-color: - type: string - optimizedCheckout-buttonSecondary-colorActive: - type: string - optimizedCheckout-buttonSecondary-colorHover: - type: string - optimizedCheckout-buttonSecondary-font: - type: string - optimizedCheckout-colorFocus: - type: string - optimizedCheckout-contentPrimary-color: - type: string - optimizedCheckout-contentPrimary-font: - type: string - optimizedCheckout-contentSecondary-color: - type: string - optimizedCheckout-contentSecondary-font: - type: string - optimizedCheckout-discountBanner-backgroundColor: - type: string - optimizedCheckout-discountBanner-iconColor: - type: string - optimizedCheckout-discountBanner-textColor: - type: string - optimizedCheckout-form-textColor: - type: string - optimizedCheckout-formChecklist-backgroundColor: - type: string - optimizedCheckout-formChecklist-backgroundColorSelected: - type: string - optimizedCheckout-formChecklist-borderColor: - type: string - optimizedCheckout-formChecklist-color: - type: string - optimizedCheckout-formField-backgroundColor: - type: string - optimizedCheckout-formField-borderColor: - type: string - optimizedCheckout-formField-errorColor: - type: string - optimizedCheckout-formField-inputControlColor: - type: string - optimizedCheckout-formField-placeholderColor: - type: string - optimizedCheckout-formField-shadowColor: - type: string - optimizedCheckout-formField-textColor: - type: string - optimizedCheckout-header-backgroundColor: - type: string - optimizedCheckout-header-borderColor: - type: string - optimizedCheckout-header-textColor: - type: string - optimizedCheckout-headingPrimary-color: - type: string - optimizedCheckout-headingPrimary-font: - type: string - optimizedCheckout-headingSecondary-color: - type: string - optimizedCheckout-headingSecondary-font: - type: string - optimizedCheckout-link-color: - type: string - optimizedCheckout-link-font: - type: string - optimizedCheckout-link-hoverColor: - type: string - optimizedCheckout-loadingToaster-backgroundColor: - type: string - optimizedCheckout-loadingToaster-textColor: - type: string - optimizedCheckout-logo: - type: string - optimizedCheckout-logo-position: - type: string - optimizedCheckout-logo-size: - type: string - optimizedCheckout-orderSummary-backgroundColor: - type: string - optimizedCheckout-orderSummary-borderColor: - type: string - optimizedCheckout-show-backgroundImage: - type: boolean - optimizedCheckout-show-logo: - type: string - optimizedCheckout-step-backgroundColor: - type: string - optimizedCheckout-step-borderColor: - type: string - optimizedCheckout-step-textColor: - type: string - overlay-backgroundColor: - type: string - pace-progress-backgroundColor: - type: string - paymentbuttons-paypal-color: - type: string - paymentbuttons-paypal-fundingicons: - type: boolean - paymentbuttons-paypal-label: - type: string - paymentbuttons-paypal-layout: - type: string - paymentbuttons-paypal-shape: - type: string - paymentbuttons-paypal-size: - type: string - paymentbuttons-paypal-tagline: - type: boolean - pdp-custom-fields-tab-label: - type: string - pdp-non-sale-price-label: - type: string - pdp-price-label: - type: string - pdp-retail-price-label: - type: string - pdp-sale-price-label: - type: string - price_ranges: - type: boolean - product_list_display_mode: - type: string - product_sale_badges: - type: string - product_size: - type: string - productgallery_size: - type: string - productpage_related_products_count: - type: integer - productpage_reviews_count: - type: integer - productpage_similar_by_views_count: - type: integer - productpage_videos_count: - type: integer - productthumb_size: - type: string - productview_thumb_size: - type: string - restrict_to_login: - type: boolean - searchpage_products_per_page: - type: integer - select-arrow-color: - type: string - select-bg-color: - type: string - shop_by_brand_show_footer: - type: boolean - shop_by_price_visibility: - type: boolean - show_accept_amex: - type: boolean - show_accept_discover: - type: boolean - show_accept_mastercard: - type: boolean - show_accept_paypal: - type: boolean - show_accept_visa: - type: boolean - show_copyright_footer: - type: boolean - show_custom_fields_tabs: - type: boolean - show_powered_by: - type: boolean - show_product_details_tabs: - type: boolean - show_product_dimensions: - type: boolean - show_product_quantity_box: - type: boolean - show_product_quick_view: - type: boolean - show_product_reviews: - type: boolean - show_product_weight: - type: boolean - social_icon_placement_bottom: - type: string - social_icon_placement_top: - type: boolean - spinner-borderColor-dark: - type: string - spinner-borderColor-light: - type: string - storeName-color: - type: string - supported_card_type_icons: - type: array - items: - type: string - swatch_option_size: - type: string - thumb_size: - type: string - zoom_size: - type: string +description: '`global` `{{theme_settings}}` object' +type: object +properties: + alert-backgroundColor: + type: string + alert-color: + type: string + alert-color-alt: + type: string + applePay-button: + type: string + blockquote-cite-font-color: + type: string + blog_size: + type: string + body-bg: + type: string + body-font: + type: string + brand_size: + type: string + brandpage_products_per_page: + type: integer + button--default-borderColor: + type: string + button--default-borderColorActive: + type: string + button--default-borderColorHover: + type: string + button--default-color: + type: string + button--default-colorActive: + type: string + button--default-colorHover: + type: string + button--disabled-backgroundColor: + type: string + button--disabled-borderColor: + type: string + button--disabled-color: + type: string + button--icon-svg-color: + type: string + button--primary-backgroundColor: + type: string + button--primary-backgroundColorActive: + type: string + button--primary-backgroundColorHover: + type: string + button--primary-color: + type: string + button--primary-colorActive: + type: string + button--primary-colorHover: + type: string + card--alternate-backgroundColor: + type: string + card--alternate-borderColor: + type: string + card--alternate-color--hover: + type: string + card-figcaption-button-background: + type: string + card-figcaption-button-color: + type: string + card-title-color: + type: string + card-title-color-hover: + type: string + carousel-arrow-bgColor: + type: string + carousel-arrow-borderColor: + type: string + carousel-arrow-color: + type: string + carousel-bgColor: + type: string + carousel-description-color: + type: string + carousel-dot-bgColor: + type: string + carousel-dot-color: + type: string + carousel-dot-color-active: + type: string + carousel-title-color: + type: string + categorypage_products_per_page: + type: integer + checkRadio-backgroundColor: + type: string + checkRadio-borderColor: + type: string + checkRadio-color: + type: string + color-black: + type: string + color-error: + type: string + color-errorLight: + type: string + color-grey: + type: string + color-greyDark: + type: string + color-greyDarker: + type: string + color-greyDarkest: + type: string + color-greyLight: + type: string + color-greyLighter: + type: string + color-greyLightest: + type: string + color-greyMedium: + type: string + color-info: + type: string + color-infoLight: + type: string + color-primary: + type: string + color-primaryDark: + type: string + color-primaryDarker: + type: string + color-primaryLight: + type: string + color-secondary: + type: string + color-secondaryDark: + type: string + color-secondaryDarker: + type: string + color-success: + type: string + color-successLight: + type: string + color-textBase: + type: string + color-textBase--active: + type: string + color-textBase--hover: + type: string + color-textHeading: + type: string + color-textLink: + type: string + color-textLink--active: + type: string + color-textLink--hover: + type: string + color-textSecondary: + type: string + color-textSecondary--active: + type: string + color-textSecondary--hover: + type: string + color-warning: + type: string + color-warningLight: + type: string + color-white: + type: string + color-whitesBase: + type: string + color_badge_product_sale_badges: + type: string + color_hover_product_sale_badges: + type: string + color_text_product_sale_badges: + type: string + container-border-global-color-base: + type: string + container-fill-base: + type: string + container-fill-dark: + type: string + default_image_brand: + type: string + default_image_gift_certificate: + type: string + default_image_product: + type: string + dropdown--quickSearch-backgroundColor: + type: string + dropdown--wishList-backgroundColor: + type: string + fontSize-h1: + type: integer + fontSize-h2: + type: integer + fontSize-h3: + type: integer + fontSize-h4: + type: integer + fontSize-h5: + type: integer + fontSize-h6: + type: integer + fontSize-root: + type: integer + footer-backgroundColor: + type: string + form-label-font-color: + type: string + gallery_size: + type: string + geotrust_ssl_common_name: + type: string + geotrust_ssl_seal_size: + type: string + header-backgroundColor: + type: string + headings-font: + type: string + hide_blog_page_heading: + type: boolean + hide_breadcrumbs: + type: boolean + hide_category_page_heading: + type: boolean + hide_contact_us_page_heading: + type: boolean + hide_content_navigation: + type: boolean + hide_page_heading: + type: boolean + homepage_blog_posts_count: + type: integer + homepage_featured_products_column_count: + type: integer + homepage_featured_products_count: + type: integer + homepage_new_products_column_count: + type: integer + homepage_new_products_count: + type: integer + homepage_show_carousel: + type: boolean + homepage_show_carousel_arrows: + type: boolean + homepage_stretch_carousel_images: + type: boolean + homepage_top_products_column_count: + type: integer + homepage_top_products_count: + type: integer + icon-color: + type: string + icon-color-hover: + type: string + icon-ratingEmpty: + type: string + icon-ratingFull: + type: string + input-bg-color: + type: string + input-border-color: + type: string + input-border-color-active: + type: string + input-disabled-bg: + type: string + input-font-color: + type: string + label-backgroundColor: + type: string + label-color: + type: string + loadingOverlay-backgroundColor: + type: string + logo-position: + type: string + logo_fontSize: + type: integer + logo_size: + type: string + navPages-color: + type: string + navPages-color-hover: + type: string + navPages-subMenu-backgroundColor: + type: string + navPages-subMenu-separatorColor: + type: string + navUser-color: + type: string + navUser-color-hover: + type: string + navUser-dropdown-backgroundColor: + type: string + navUser-dropdown-borderColor: + type: string + navUser-indicator-backgroundColor: + type: string + navigation_design: + type: string + optimizedCheckout-backgroundImage: + type: string + optimizedCheckout-backgroundImage-size: + type: string + optimizedCheckout-body-backgroundColor: + type: string + optimizedCheckout-buttonPrimary-backgroundColor: + type: string + optimizedCheckout-buttonPrimary-backgroundColorActive: + type: string + optimizedCheckout-buttonPrimary-backgroundColorDisabled: + type: string + optimizedCheckout-buttonPrimary-backgroundColorHover: + type: string + optimizedCheckout-buttonPrimary-borderColor: + type: string + optimizedCheckout-buttonPrimary-borderColorActive: + type: string + optimizedCheckout-buttonPrimary-borderColorDisabled: + type: string + optimizedCheckout-buttonPrimary-borderColorHover: + type: string + optimizedCheckout-buttonPrimary-color: + type: string + optimizedCheckout-buttonPrimary-colorActive: + type: string + optimizedCheckout-buttonPrimary-colorDisabled: + type: string + optimizedCheckout-buttonPrimary-colorHover: + type: string + optimizedCheckout-buttonPrimary-font: + type: string + optimizedCheckout-buttonSecondary-backgroundColor: + type: string + optimizedCheckout-buttonSecondary-backgroundColorActive: + type: string + optimizedCheckout-buttonSecondary-backgroundColorHover: + type: string + optimizedCheckout-buttonSecondary-borderColor: + type: string + optimizedCheckout-buttonSecondary-borderColorActive: + type: string + optimizedCheckout-buttonSecondary-borderColorHover: + type: string + optimizedCheckout-buttonSecondary-color: + type: string + optimizedCheckout-buttonSecondary-colorActive: + type: string + optimizedCheckout-buttonSecondary-colorHover: + type: string + optimizedCheckout-buttonSecondary-font: + type: string + optimizedCheckout-colorFocus: + type: string + optimizedCheckout-contentPrimary-color: + type: string + optimizedCheckout-contentPrimary-font: + type: string + optimizedCheckout-contentSecondary-color: + type: string + optimizedCheckout-contentSecondary-font: + type: string + optimizedCheckout-discountBanner-backgroundColor: + type: string + optimizedCheckout-discountBanner-iconColor: + type: string + optimizedCheckout-discountBanner-textColor: + type: string + optimizedCheckout-form-textColor: + type: string + optimizedCheckout-formChecklist-backgroundColor: + type: string + optimizedCheckout-formChecklist-backgroundColorSelected: + type: string + optimizedCheckout-formChecklist-borderColor: + type: string + optimizedCheckout-formChecklist-color: + type: string + optimizedCheckout-formField-backgroundColor: + type: string + optimizedCheckout-formField-borderColor: + type: string + optimizedCheckout-formField-errorColor: + type: string + optimizedCheckout-formField-inputControlColor: + type: string + optimizedCheckout-formField-placeholderColor: + type: string + optimizedCheckout-formField-shadowColor: + type: string + optimizedCheckout-formField-textColor: + type: string + optimizedCheckout-header-backgroundColor: + type: string + optimizedCheckout-header-borderColor: + type: string + optimizedCheckout-header-textColor: + type: string + optimizedCheckout-headingPrimary-color: + type: string + optimizedCheckout-headingPrimary-font: + type: string + optimizedCheckout-headingSecondary-color: + type: string + optimizedCheckout-headingSecondary-font: + type: string + optimizedCheckout-link-color: + type: string + optimizedCheckout-link-font: + type: string + optimizedCheckout-link-hoverColor: + type: string + optimizedCheckout-loadingToaster-backgroundColor: + type: string + optimizedCheckout-loadingToaster-textColor: + type: string + optimizedCheckout-logo: + type: string + optimizedCheckout-logo-position: + type: string + optimizedCheckout-logo-size: + type: string + optimizedCheckout-orderSummary-backgroundColor: + type: string + optimizedCheckout-orderSummary-borderColor: + type: string + optimizedCheckout-show-backgroundImage: + type: boolean + optimizedCheckout-show-logo: + type: string + optimizedCheckout-step-backgroundColor: + type: string + optimizedCheckout-step-borderColor: + type: string + optimizedCheckout-step-textColor: + type: string + overlay-backgroundColor: + type: string + pace-progress-backgroundColor: + type: string + paymentbuttons-paypal-color: + type: string + paymentbuttons-paypal-fundingicons: + type: boolean + paymentbuttons-paypal-label: + type: string + paymentbuttons-paypal-layout: + type: string + paymentbuttons-paypal-shape: + type: string + paymentbuttons-paypal-size: + type: string + paymentbuttons-paypal-tagline: + type: boolean + pdp-custom-fields-tab-label: + type: string + pdp-non-sale-price-label: + type: string + pdp-price-label: + type: string + pdp-retail-price-label: + type: string + pdp-sale-price-label: + type: string + price_ranges: + type: boolean + product_list_display_mode: + type: string + product_sale_badges: + type: string + product_size: + type: string + productgallery_size: + type: string + productpage_related_products_count: + type: integer + productpage_reviews_count: + type: integer + productpage_similar_by_views_count: + type: integer + productpage_videos_count: + type: integer + productthumb_size: + type: string + productview_thumb_size: + type: string + restrict_to_login: + type: boolean + searchpage_products_per_page: + type: integer + select-arrow-color: + type: string + select-bg-color: + type: string + shop_by_brand_show_footer: + type: boolean + shop_by_price_visibility: + type: boolean + show_accept_amex: + type: boolean + show_accept_discover: + type: boolean + show_accept_mastercard: + type: boolean + show_accept_paypal: + type: boolean + show_accept_visa: + type: boolean + show_copyright_footer: + type: boolean + show_custom_fields_tabs: + type: boolean + show_powered_by: + type: boolean + show_product_details_tabs: + type: boolean + show_product_dimensions: + type: boolean + show_product_quantity_box: + type: boolean + show_product_quick_view: + type: boolean + show_product_reviews: + type: boolean + show_product_weight: + type: boolean + social_icon_placement_bottom: + type: string + social_icon_placement_top: + type: boolean + spinner-borderColor-dark: + type: string + spinner-borderColor-light: + type: string + storeName-color: + type: string + supported_card_type_icons: + type: array + items: + type: string + swatch_option_size: + type: string + thumb_size: + type: string + zoom_size: + type: string diff --git a/models/_root/urls.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/urls.yml similarity index 95% rename from models/_root/urls.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/urls.yml index e2670dad6..b42cbbada 100644 --- a/models/_root/urls.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/urls.yml @@ -1,131 +1,131 @@ -description: | - `global` `{{urls}}` object containing a collection of storefront pages and their sub-pages -type: object -properties: - account: - type: object - properties: - add_address: - type: string - addresses: - type: string - details: - type: string - inbox: - type: string - index: - type: string - orders: - type: object - properties: - all: - type: string - completed: - type: string - save_new_return: - type: string - payment_methods: - type: object - properties: - all: - type: string - recent_items: - type: string - returns: - type: string - send_message: - type: string - update_action: - type: string - wishlists: - type: object - properties: - add: - type: string - all: - type: string - delete: - type: string - edit: - type: string - auth: - type: object - properties: - check_login: - type: string - create_account: - type: string - forgot_password: - type: string - login: - type: string - logout: - type: string - save_new_account: - type: string - save_new_password: - type: string - send_password_email: - type: string - brands: - type: string - cart: - type: string - checkout: - type: object - properties: - multiple_address: - type: string - single_address: - type: string - compare: - type: string - contact_us_submit: - type: string - gift_certificate: - type: object - properties: - balance: - type: string - purchase: - type: string - redeem: - type: string - home: - type: string - product: - type: object - properties: - post_review: - type: string - rss: - type: object - properties: - products: - type: object - properties: - new: - type: string - new_atom: - type: string - popular: - type: string - popular_atom: - type: string - featured: - type: string - featured_atom: - type: string - search: - type: string - search_atom: - type: string - search: - type: string - sitemap: - type: string - subscribe: - type: object - properties: - action: - type: string +description: | + `global` `{{urls}}` object containing a collection of storefront pages and their sub-pages +type: object +properties: + account: + type: object + properties: + add_address: + type: string + addresses: + type: string + details: + type: string + inbox: + type: string + index: + type: string + orders: + type: object + properties: + all: + type: string + completed: + type: string + save_new_return: + type: string + payment_methods: + type: object + properties: + all: + type: string + recent_items: + type: string + returns: + type: string + send_message: + type: string + update_action: + type: string + wishlists: + type: object + properties: + add: + type: string + all: + type: string + delete: + type: string + edit: + type: string + auth: + type: object + properties: + check_login: + type: string + create_account: + type: string + forgot_password: + type: string + login: + type: string + logout: + type: string + save_new_account: + type: string + save_new_password: + type: string + send_password_email: + type: string + brands: + type: string + cart: + type: string + checkout: + type: object + properties: + multiple_address: + type: string + single_address: + type: string + compare: + type: string + contact_us_submit: + type: string + gift_certificate: + type: object + properties: + balance: + type: string + purchase: + type: string + redeem: + type: string + home: + type: string + product: + type: object + properties: + post_review: + type: string + rss: + type: object + properties: + products: + type: object + properties: + new: + type: string + new_atom: + type: string + popular: + type: string + popular_atom: + type: string + featured: + type: string + featured_atom: + type: string + search: + type: string + search_atom: + type: string + search: + type: string + sitemap: + type: string + subscribe: + type: object + properties: + action: + type: string diff --git a/models/_root/vault.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/vault.yml similarity index 96% rename from models/_root/vault.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/vault.yml index 20ff06f48..e8d641b18 100644 --- a/models/_root/vault.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/vault.yml @@ -1,14 +1,14 @@ -description: |- - `{{vault}}` object available to `templates/pages/account/payment-methods.html`. - - **Handlebars Expression**: `{{vault}}` -type: object -properties: - access_token: - type: string - description: 'Required to submit add payment method form; otherwise, submission will fail with `401` Unauthorized.' - example: '{{token}}' - expires_at: - type: number - description: Expiration Date in Unix Timestamp. - example: 1616614163 +description: |- + `{{vault}}` object available to `templates/pages/account/payment-methods.html`. + + **Handlebars Expression**: `{{vault}}` +type: object +properties: + access_token: + type: string + description: 'Required to submit add payment method form; otherwise, submission will fail with `401` Unauthorized.' + example: '{{token}}' + expires_at: + type: number + description: Expiration Date in Unix Timestamp. + example: 1616614163 diff --git a/models/_root/wishlist.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/wishlist.yml similarity index 94% rename from models/_root/wishlist.yml rename to docs/storefront/stencil/themes/context/object-reference/schemas/wishlist.yml index 16ef73149..359a2bbfb 100644 --- a/models/_root/wishlist.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/wishlist.yml @@ -1,130 +1,130 @@ -description: |- - Wishlist information for a specific wishlist. (Called on the default `templates/pages/account/wishlist-details.html` template and the `templates/components/account/wishlist-item-list.html` partial.) - - **Handlebars Expression**: `{{wishlist}}` -type: object -properties: - id: - type: number - description: Unique system ID for the wishlist. - is_editable: - type: boolean - is_public: - type: boolean - description: Boolean value indicating whether the wishlist is publicly available. - items: - type: array - items: - type: object - properties: - add_to_cart_url: - type: string - add_to_wishlist_url: - type: string - availability: - type: object - brand: - type: object - properties: - name: - type: object - custom_fields: - type: array - items: - type: object - properties: - id: - type: number - name: - type: string - value: - type: string - date_added: - type: string - demo: - type: boolean - has_options: - type: boolean - id: - type: number - image: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - images: - type: array - items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/common/image.yml - low_stock_level: - type: object - name: - type: string - num_reviews: - type: object - pre_order: - type: boolean - price: - type: object - properties: - tax_label: - type: string - without_tax: - type: object - properties: - currency: - type: string - formatted: - type: string - value: - type: number - product_id: - type: number - qty_in_cart: - type: number - rating: - type: object - remove_url: - type: string - description: URL to remove the product from the wishlist. - show_cart_action: - type: boolean - sku: - type: object - stock_level: - type: object - summary: - type: string - url: - type: string - weight: - type: object - properties: - formatted: - type: object - value: - type: object - name: - type: string - description: Customer-defined name of the wishlist. - pagination: - type: object - properties: - current: - type: number - links: - type: array - items: - type: object - properties: - number: - type: number - url: - type: string - next: - type: object - previous: - type: object - share_url: - type: string - description: URL used to share the wishlist. - token: - type: string - description: Unique public token for the wishlist. +description: |- + Wishlist information for a specific wishlist. (Called on the default `templates/pages/account/wishlist-details.html` template and the `templates/components/account/wishlist-item-list.html` partial.) + + **Handlebars Expression**: `{{wishlist}}` +type: object +properties: + id: + type: number + description: Unique system ID for the wishlist. + is_editable: + type: boolean + is_public: + type: boolean + description: Boolean value indicating whether the wishlist is publicly available. + items: + type: array + items: + type: object + properties: + add_to_cart_url: + type: string + add_to_wishlist_url: + type: string + availability: + type: object + brand: + type: object + properties: + name: + type: object + custom_fields: + type: array + items: + type: object + properties: + id: + type: number + name: + type: string + value: + type: string + date_added: + type: string + demo: + type: boolean + has_options: + type: boolean + id: + type: number + image: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + images: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/storefront/stencil/themes/context/object-reference/helpers/common/image.yml + low_stock_level: + type: object + name: + type: string + num_reviews: + type: object + pre_order: + type: boolean + price: + type: object + properties: + tax_label: + type: string + without_tax: + type: object + properties: + currency: + type: string + formatted: + type: string + value: + type: number + product_id: + type: number + qty_in_cart: + type: number + rating: + type: object + remove_url: + type: string + description: URL to remove the product from the wishlist. + show_cart_action: + type: boolean + sku: + type: object + stock_level: + type: object + summary: + type: string + url: + type: string + weight: + type: object + properties: + formatted: + type: object + value: + type: object + name: + type: string + description: Customer-defined name of the wishlist. + pagination: + type: object + properties: + current: + type: number + links: + type: array + items: + type: object + properties: + number: + type: number + url: + type: string + next: + type: object + previous: + type: object + share_url: + type: string + description: URL used to share the wishlist. + token: + type: string + description: Unique public token for the wishlist. diff --git a/docs/stencil-docs/page-builder/configuration.mdx b/docs/storefront/stencil/themes/foundations/customizability.mdx similarity index 100% rename from docs/stencil-docs/page-builder/configuration.mdx rename to docs/storefront/stencil/themes/foundations/customizability.mdx diff --git a/docs/stencil-docs/storefront-customization/directory-structure.mdx b/docs/storefront/stencil/themes/foundations/directory-structure.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/directory-structure.mdx rename to docs/storefront/stencil/themes/foundations/directory-structure.mdx diff --git a/docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx b/docs/storefront/stencil/themes/foundations/global-styles.mdx similarity index 97% rename from docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx rename to docs/storefront/stencil/themes/foundations/global-styles.mdx index 2aaf52b89..2453b78ea 100644 --- a/docs/stencil-docs/configure-store-design-ui/defining-global-styles.mdx +++ b/docs/storefront/stencil/themes/foundations/global-styles.mdx @@ -1,258 +1,258 @@ -# Defining Themes Styles - - - -## Configuration file - -You can manage your theme's front-end components by configuring its `config.json` file. This file is made up of different keys and values that define your theme's global styles. - -`config.json` performs the following functions: - -* Provides global context for Stencil's CSS and Handlebars resources. -* Provides values for the Page Builder UI to manage. -* Provides metadata for your theme's listing in the Theme Marketplace. -* Defines variations included in your theme. - -For a list of all available keys and values in `config.json`, see [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config). - -## Requirements and restrictions - -The `config.json` file must meet the following requirements: - -* It must be named `config.json` and reside in the root of your `<theme-name>` top-level subdirectory (for example, `/cornerstone/config.json`), and must contain valid JSON. -* The maximum allowable size for a theme's `config.json` file is 64 KB. Exceeding this limit will trigger an error upon uploading the theme to BigCommerce. -* Each key's value is restricted to 64 characters. Exceeding this limit will similarly trigger an upload error. - -Apart from the aforementioned size constraints, there is no limit on the number of keys and values you can place in a theme's `config.json`. - -<Callout type="warning" emoji="⚠️"> -Carefully check your theme against all the listed requirements – including the required keys within the `meta` object and `variations` array. While some requirements are not enforced in local development, they will be validated when you upload your theme to BigCommerce. -</Callout> - - -### Required config.json keys - -The `config.json` file must contain the following keys: - -* `name` -* `version` -* `settings` -* `variations` -* `meta` (see specific requirements below) - -### Required meta keys - -The `meta` object must contain the following keys: - -* `price` -* `author_name` -* `author_email` -* `author_support_url` -* `documentation_url` -* `composed_image` -* `features` - -For illustration, below is a commented excerpt. - -```json -{ - ... - "meta": { - "price": 15000, // in cents; non-negative integer, minimum 0 - "author_name": "eCommerce Themes, Inc.", // Must be a string, not null - "author_email": "support@example.com", // Must be a string, should be a valid email address, not null - "author_support_url": "http://example.com/contactus", // Must be a string, should be a valid URL, not null - "documentation_url": "http://example.com/guide", // Must be a string, limit of 255 characters, not null - "composed_image": "path/to/composed.png", // Must be a string path to the composed-image file - "features": [ - // Array of feature strings, all of which must be in the list enumerated here: - // https://github.com/bigcommerce/theme-registry/blob/master/app/schemas/theme_config.json#L33 - "fully_responsive" // Must include at least one feature, and no duplicate entries - ] - }, - ... -} -``` - -### Required variation keys - -A theme requires at least one variation. For each variation that you choose to include in your theme, you must provide the following keys: - -* `name` -* `id` -* `meta` - -For illustration, consider the following code sample from Cornerstone: - -```json showLineNumbers -{ - "variations": [ - { - "name": "Light", - "id": "light", - "meta": { - "desktop_screenshot": "desktop_light.png", - "mobile_screenshot": "mobile_light.png", - "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. ...", - ... - } - } - ], - ... -} -``` - -## New products example - -The values that you define in the `config.json` file interact with local resources making it possible to customize your theme's appearance globally. Your `config.json` definitions set global defaults for templates, front matter attributes, and Handlebars resources throughout your theme. You can also define custom variables in `config.json`, named according to your needs. -To see how interactions with `config.json` values work, first note the default values in `config.json` for the `homepage_new_products_count` and `product_list_display_mode` keys. - -```json -{ - "settings": { - "homepage_new_products_count": 5, - "product_list_display_mode": "grid", - } -} -``` - -Next, open your `templates/pages/home.html` file. -Note the reference to the `homepage_new_products_count` key in the file's front matter. If your current theme's `home.html` front matter omits `products:new:limit`, paste it in for this demonstration. - -```html -products: - new: - limit: {{theme_settings.homepage_new_products_count}} - featured: - limit: {{theme_settings.homepage_featured_products_count}} - top_sellers: - limit: {{theme_settings.homepage_top_products_count}} -carousel: {{theme_settings.homepage_show_carousel}} -blog: - recent_posts: - limit: {{theme_settings.homepage_blog_posts_count}} -{{#partial "hero"}} -<!-- [...] --> -{{/partial}} -{{> layout/base}} -``` - -You should see five products displayed in a grid in the New Products section of your homepage. - -## Changing page layout using local front matter - -In the `home.html` front matter, `products:featured:limit` controls how many products appear on the home page. The number of products is set by the `config.json` file's `homepage_featured_products_count`. - -```html -products: - featured: - limit: {{theme_settings.homepage_featured_products_count}} -<!-- [...] --> -``` - -To set theme-wide configurations in the front matter using `config.json`, replace the `{{theme_settings.homepage_featured_products_count}}` statement in `home.html` with a hard-coded `2`. For reference, see the following example. - -```html -products: - <!-- [...] --> - featured: - limit: 2 - <!-- [...] --> -<!-- [...] --> -{{#partial "page"}} -<!-- [...] --> -<div class="main full"> - {{#if products.featured}} - {{> components/products/featured products=products.featured columns=2}} - {{/if}} -</div> -{{/partial}} -{{> layout/base}} -``` - -Reload the page. You should see the number of products displayed in Featured Products change to two. -## Retrieving specific config.json values through Sass -In `config.json`, global variables bring dynamic values into the framework. Sass imports these global variables' values to handle data, such as colors hexadecimal values, and to make the data available to Page Builder. - -The following is a snippet of color variables from `config.json`. - -```json -{ - ... - "color-highlight": "#00abc9", - "color-highlightDark": "#f2f2f2", - "color-highlightDarker": "#dfdfdf", - ... -} -``` - -Below are the corresponding references in the theme's `assets/scss/settings/global/color/_color.scss` file. - -```scss -// ... -$color-highlight: stencilColor("color-highlight"); -$color-highlightDarker: stencilColor("color-highlightDarker"); -$color-highlightDark: stencilColor("color-highlightDark"); -// ... -``` - -In `config.json`, try redefining one or more color variables to hex values of your choice. Reload the page to see the effects. -## Adding and removing components -The properties that Stencil abstracts as Handlebars resources are portable between HTML files. To see this in action, open any storefront page in a browser and navigate to the page's footer where you should see the Categories section. -Open your theme's `footer.html` file located in `templates/components/common/footer.html`, navigate to the `footer-info` section, and remove the following `footer-categories` component: - -```handlebars -<article class="footer-info-col footer-info-col--small" data-section-type="footer-categories"> - <h3 class="footer-info-heading">{{lang 'footer.categories'}}</h3> - <ul class="footer-info-list"> - {{#each categories}} - <li> - <a href="{{url}}">{{name}}</a> - </li> - {{/each}} - </ul> -</article> -``` - -Refresh the page. The Categories section should disappear from the footer. -Next, add a `footer` directory to `templates/components` and create a new `categories.html` template (for example, `templates/components/footer/categories.html`). Paste the code block from the previous step into `categories.html`. - -```handlebars -<article class="footer-info-col footer-info-col--small" data-section-type="footer-categories"> - <h3 class="footer-info-heading">{{lang 'footer.categories'}}</h3> - <ul class="footer-info-list"> - {{#each categories}} - <li> - <a href="{{url}}">{{name}}</a> - </li> - {{/each}} - </ul> -</article> -``` - -In `templates/components/common/footer.html`, add a reference to the new template as shown below. - -```handlebars -<footer class="footer" role="contentinfo"> - <div class="container"> - <section class="footer-info"> - <!-- [...] --> - {{> components/footer/categories}} - <!-- [...] --> - </section> - </div> -</footer> -``` -Refresh the page. The Categories list should reappear in the footer. - -## Resources - -### Additional resources - -- [Edit config.json file](https://bigcommerce.wistia.com/medias/rmsz7xfan1) -- [Customize Components](https://bigcommerce.wistia.com/medias/sv3qsdehcw) -- [Customize Layout and Pages](https://bigcommerce.wistia.com/medias/jlv5fbr954) -- [Customize Assets](https://bigcommerce.wistia.com/medias/xtjm0ebnar) -- [Language File](https://bigcommerce.wistia.com/medias/ovx95ctbb0) -- [Theme Editor Text Fields](https://bigcommerce.wistia.com/medias/phggd7og8u) -- [Debugging Your Stencil Theme](https://bigcommerce.wistia.com/medias/3fhjpgpvun) +# Defining Themes Styles + + + +## Configuration file + +You can manage your theme's front-end components by configuring its `config.json` file. This file is made up of different keys and values that define your theme's global styles. + +`config.json` performs the following functions: + +* Provides global context for Stencil's CSS and Handlebars resources. +* Provides values for the Page Builder UI to manage. +* Provides metadata for your theme's listing in the Theme Marketplace. +* Defines variations included in your theme. + +For a list of all available keys and values in `config.json`, see [Theme Objects](/docs/storefront/stencil/themes/context/object-reference/config). + +## Requirements and restrictions + +The `config.json` file must meet the following requirements: + +* It must be named `config.json` and reside in the root of your `<theme-name>` top-level subdirectory (for example, `/cornerstone/config.json`), and must contain valid JSON. +* The maximum allowable size for a theme's `config.json` file is 64 KB. Exceeding this limit will trigger an error upon uploading the theme to BigCommerce. +* Each key's value is restricted to 64 characters. Exceeding this limit will similarly trigger an upload error. + +Apart from the aforementioned size constraints, there is no limit on the number of keys and values you can place in a theme's `config.json`. + +<Callout type="warning" emoji="⚠️"> +Carefully check your theme against all the listed requirements – including the required keys within the `meta` object and `variations` array. While some requirements are not enforced in local development, they will be validated when you upload your theme to BigCommerce. +</Callout> + + +### Required config.json keys + +The `config.json` file must contain the following keys: + +* `name` +* `version` +* `settings` +* `variations` +* `meta` (see specific requirements below) + +### Required meta keys + +The `meta` object must contain the following keys: + +* `price` +* `author_name` +* `author_email` +* `author_support_url` +* `documentation_url` +* `composed_image` +* `features` + +For illustration, below is a commented excerpt. + +```json +{ + ... + "meta": { + "price": 15000, // in cents; non-negative integer, minimum 0 + "author_name": "eCommerce Themes, Inc.", // Must be a string, not null + "author_email": "support@example.com", // Must be a string, should be a valid email address, not null + "author_support_url": "http://example.com/contactus", // Must be a string, should be a valid URL, not null + "documentation_url": "http://example.com/guide", // Must be a string, limit of 255 characters, not null + "composed_image": "path/to/composed.png", // Must be a string path to the composed-image file + "features": [ + // Array of feature strings, all of which must be in the list enumerated here: + // https://github.com/bigcommerce/theme-registry/blob/master/app/schemas/theme_config.json#L33 + "fully_responsive" // Must include at least one feature, and no duplicate entries + ] + }, + ... +} +``` + +### Required variation keys + +A theme requires at least one variation. For each variation that you choose to include in your theme, you must provide the following keys: + +* `name` +* `id` +* `meta` + +For illustration, consider the following code sample from Cornerstone: + +```json showLineNumbers +{ + "variations": [ + { + "name": "Light", + "id": "light", + "meta": { + "desktop_screenshot": "desktop_light.png", + "mobile_screenshot": "mobile_light.png", + "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. ...", + ... + } + } + ], + ... +} +``` + +## New products example + +The values that you define in the `config.json` file interact with local resources making it possible to customize your theme's appearance globally. Your `config.json` definitions set global defaults for templates, front matter attributes, and Handlebars resources throughout your theme. You can also define custom variables in `config.json`, named according to your needs. +To see how interactions with `config.json` values work, first note the default values in `config.json` for the `homepage_new_products_count` and `product_list_display_mode` keys. + +```json +{ + "settings": { + "homepage_new_products_count": 5, + "product_list_display_mode": "grid", + } +} +``` + +Next, open your `templates/pages/home.html` file. +Note the reference to the `homepage_new_products_count` key in the file's front matter. If your current theme's `home.html` front matter omits `products:new:limit`, paste it in for this demonstration. + +```html +products: + new: + limit: {{theme_settings.homepage_new_products_count}} + featured: + limit: {{theme_settings.homepage_featured_products_count}} + top_sellers: + limit: {{theme_settings.homepage_top_products_count}} +carousel: {{theme_settings.homepage_show_carousel}} +blog: + recent_posts: + limit: {{theme_settings.homepage_blog_posts_count}} +{{#partial "hero"}} +<!-- [...] --> +{{/partial}} +{{> layout/base}} +``` + +You should see five products displayed in a grid in the New Products section of your homepage. + +## Changing page layout using local front matter + +In the `home.html` front matter, `products:featured:limit` controls how many products appear on the home page. The number of products is set by the `config.json` file's `homepage_featured_products_count`. + +```html +products: + featured: + limit: {{theme_settings.homepage_featured_products_count}} +<!-- [...] --> +``` + +To set theme-wide configurations in the front matter using `config.json`, replace the `{{theme_settings.homepage_featured_products_count}}` statement in `home.html` with a hard-coded `2`. For reference, see the following example. + +```html +products: + <!-- [...] --> + featured: + limit: 2 + <!-- [...] --> +<!-- [...] --> +{{#partial "page"}} +<!-- [...] --> +<div class="main full"> + {{#if products.featured}} + {{> components/products/featured products=products.featured columns=2}} + {{/if}} +</div> +{{/partial}} +{{> layout/base}} +``` + +Reload the page. You should see the number of products displayed in Featured Products change to two. +## Retrieving specific config.json values through Sass +In `config.json`, global variables bring dynamic values into the framework. Sass imports these global variables' values to handle data, such as colors hexadecimal values, and to make the data available to Page Builder. + +The following is a snippet of color variables from `config.json`. + +```json +{ + ... + "color-highlight": "#00abc9", + "color-highlightDark": "#f2f2f2", + "color-highlightDarker": "#dfdfdf", + ... +} +``` + +Below are the corresponding references in the theme's `assets/scss/settings/global/color/_color.scss` file. + +```scss +// ... +$color-highlight: stencilColor("color-highlight"); +$color-highlightDarker: stencilColor("color-highlightDarker"); +$color-highlightDark: stencilColor("color-highlightDark"); +// ... +``` + +In `config.json`, try redefining one or more color variables to hex values of your choice. Reload the page to see the effects. +## Adding and removing components +The properties that Stencil abstracts as Handlebars resources are portable between HTML files. To see this in action, open any storefront page in a browser and navigate to the page's footer where you should see the Categories section. +Open your theme's `footer.html` file located in `templates/components/common/footer.html`, navigate to the `footer-info` section, and remove the following `footer-categories` component: + +```handlebars +<article class="footer-info-col footer-info-col--small" data-section-type="footer-categories"> + <h3 class="footer-info-heading">{{lang 'footer.categories'}}</h3> + <ul class="footer-info-list"> + {{#each categories}} + <li> + <a href="{{url}}">{{name}}</a> + </li> + {{/each}} + </ul> +</article> +``` + +Refresh the page. The Categories section should disappear from the footer. +Next, add a `footer` directory to `templates/components` and create a new `categories.html` template (for example, `templates/components/footer/categories.html`). Paste the code block from the previous step into `categories.html`. + +```handlebars +<article class="footer-info-col footer-info-col--small" data-section-type="footer-categories"> + <h3 class="footer-info-heading">{{lang 'footer.categories'}}</h3> + <ul class="footer-info-list"> + {{#each categories}} + <li> + <a href="{{url}}">{{name}}</a> + </li> + {{/each}} + </ul> +</article> +``` + +In `templates/components/common/footer.html`, add a reference to the new template as shown below. + +```handlebars +<footer class="footer" role="contentinfo"> + <div class="container"> + <section class="footer-info"> + <!-- [...] --> + {{> components/footer/categories}} + <!-- [...] --> + </section> + </div> +</footer> +``` +Refresh the page. The Categories list should reappear in the footer. + +## Resources + +### Additional resources + +- [Edit config.json file](https://bigcommerce.wistia.com/medias/rmsz7xfan1) +- [Customize Components](https://bigcommerce.wistia.com/medias/sv3qsdehcw) +- [Customize Layout and Pages](https://bigcommerce.wistia.com/medias/jlv5fbr954) +- [Customize Assets](https://bigcommerce.wistia.com/medias/xtjm0ebnar) +- [Language File](https://bigcommerce.wistia.com/medias/ovx95ctbb0) +- [Theme Editor Text Fields](https://bigcommerce.wistia.com/medias/phggd7og8u) +- [Debugging Your Stencil Theme](https://bigcommerce.wistia.com/medias/3fhjpgpvun) diff --git a/docs/stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx b/docs/storefront/stencil/themes/foundations/react.mdx similarity index 100% rename from docs/stencil-docs/javascript-and-event-hooks/npm-tutorials.mdx rename to docs/storefront/stencil/themes/foundations/react.mdx diff --git a/docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx b/docs/storefront/stencil/themes/foundations/variations.mdx similarity index 97% rename from docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx rename to docs/storefront/stencil/themes/foundations/variations.mdx index 00dec6047..b9854aadb 100644 --- a/docs/stencil-docs/deploying-a-theme/naming-your-theme.mdx +++ b/docs/storefront/stencil/themes/foundations/variations.mdx @@ -1,123 +1,123 @@ -# Working with Theme Variations - - - -## Naming your theme - -The basic details of the Cornerstone theme are outlined in the theme's configuration file, [`config.json`](https://github.com/bigcommerce/cornerstone/blob/master/config.json). You can update the Cornerstone's `config.json` file to reflect your theme's values, such as name, version number, and documentation URL. - - -Here are the first key-value sets in Cornerstone's `config.json`: - -```json filename="Cornerstone settings config.json" showLineNumbers copy -{ - "name": "Cornerstone", - "version": "4.9.0", - "meta": { - "price": 0, - "documentation_url": "https://support.bigcommerce.com/articles/Public/Cornerstone-Theme-Manual", - // ... - } -} -``` - -The following example shows how to change Cornerstone's configurations to reflect your own theme's name, version number, price on Theme Marketplace, and documentation URL: - - -```json filename="Cornerstone settings config.json" showLineNumbers copy -{ -"name": "MyTheme", -"version": "1.1.2", -"meta": { - "price": 10000, - "documentation_url": "https://www.mywebsite.com/theme-docs/my-theme.html", - // ... - } -} -``` - -## Creating and naming a new theme variation - -You define variations in your theme's `config.json` file. Below is the Cornerstone Light variation's definition from Cornerstone's `config.json`: - - -```json filename="Cornerstone Light theme variation settings config.json" showLineNumbers copy - "variations": [ - { - "name": "Light", - "id": "light", - "meta": { - "desktop_screenshot": "desktop_light.png", - "mobile_screenshot": "mobile_light.png", - "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. It comes ready to build a clean looking and beautiful store with features such as homepage carousel, social media icons, featured and top selling products, and faceted search (which is available on select BigCommerce plans). Fully express your brand by using our Theme Editor to quickly and easily style your site's fonts and colors, all without the need to write code.", - "demo_url": "https://cornerstone-light-demo.mybigcommerce.com", - "optimized_for": [ - "multi_purpose", - "mobile_tablet_desktop", - "sales_discounts", - "large_catalog" - ], - //... - }, - //.. - }, -``` - -Try inserting your custom variation into the `variations` object of Cornerstone's `config.json`. Your variation's definition might look something like this: - - -```json filename="Example theme variation definition config.json" showLineNumbers copy -"variations": [ -// ... - { - "name": "MyCustomVariation", - "id": "my_custom_variation", - "meta": { - "desktop_screenshot": "my_custom_desktop_screenshot.jpg", - "mobile_screenshot": "my_custom_mobile_screenshot.png", - "description": "This is a really cool custom style of the Stencil Theme", - "demo_url": "https://stencil-custom.mybigcommerce.com", - "optimized_for": ["fashion", "image_heavy", "etc"], - "industries": [] - }, - }, - // ... -``` - -## Changing a theme variation's font family - - -To learn more about defining variations, see [Defining Global Styles](/docs/storefront/stencil/themes/foundations/global-styles). In particular, note the option to configure settings and variables that are scoped to each variation. - -The following example shows how to set the body font of a theme variation to a specific typeface/family by inserting the `body-font-family` key into the `settings` object: - -```json Filename="Example body font variation config.json" showLineNumbers copy -{ - "name": "MyCustomVariation", - "id": "my_custom_variation", - "settings": { - // ... - "body-font-family": "MyCoolFont, AnotherFont, sans-serif", - // ... - } -} -``` - -## Preparing a variation's thumbnails - - -For details on preparing screenshots that enable merchants to preview each variation, and to preview your theme as a whole in the BigCommerce control panel and Theme Marketplace, see [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images). - -<Callout type="info"> - - #### Using Stencil CLI to change variations - To locally test/debug a specific variation of your theme, launch it by invoking the Stencil CLI's `stencil start -v` switch. Enter the following code into the terminal, replacing `variation-name` with your theme's variation name as listed in `config.json`: - `stencil start -v variation-name` - </Callout> - -## Resources - -### Related articles -* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) -* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) -* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) +# Working with Theme Variations + + + +## Naming your theme + +The basic details of the Cornerstone theme are outlined in the theme's configuration file, [`config.json`](https://github.com/bigcommerce/cornerstone/blob/master/config.json). You can update the Cornerstone's `config.json` file to reflect your theme's values, such as name, version number, and documentation URL. + + +Here are the first key-value sets in Cornerstone's `config.json`: + +```json filename="Cornerstone settings config.json" showLineNumbers copy +{ + "name": "Cornerstone", + "version": "4.9.0", + "meta": { + "price": 0, + "documentation_url": "https://support.bigcommerce.com/articles/Public/Cornerstone-Theme-Manual", + // ... + } +} +``` + +The following example shows how to change Cornerstone's configurations to reflect your own theme's name, version number, price on Theme Marketplace, and documentation URL: + + +```json filename="Cornerstone settings config.json" showLineNumbers copy +{ +"name": "MyTheme", +"version": "1.1.2", +"meta": { + "price": 10000, + "documentation_url": "https://www.mywebsite.com/theme-docs/my-theme.html", + // ... + } +} +``` + +## Creating and naming a new theme variation + +You define variations in your theme's `config.json` file. Below is the Cornerstone Light variation's definition from Cornerstone's `config.json`: + + +```json filename="Cornerstone Light theme variation settings config.json" showLineNumbers copy + "variations": [ + { + "name": "Light", + "id": "light", + "meta": { + "desktop_screenshot": "desktop_light.png", + "mobile_screenshot": "mobile_light.png", + "description": "Ideal for a wide range of businesses and brands, this design is fully responsive, simple, and ready for you to add your branding, logo, and products. It comes ready to build a clean looking and beautiful store with features such as homepage carousel, social media icons, featured and top selling products, and faceted search (which is available on select BigCommerce plans). Fully express your brand by using our Theme Editor to quickly and easily style your site's fonts and colors, all without the need to write code.", + "demo_url": "https://cornerstone-light-demo.mybigcommerce.com", + "optimized_for": [ + "multi_purpose", + "mobile_tablet_desktop", + "sales_discounts", + "large_catalog" + ], + //... + }, + //.. + }, +``` + +Try inserting your custom variation into the `variations` object of Cornerstone's `config.json`. Your variation's definition might look something like this: + + +```json filename="Example theme variation definition config.json" showLineNumbers copy +"variations": [ +// ... + { + "name": "MyCustomVariation", + "id": "my_custom_variation", + "meta": { + "desktop_screenshot": "my_custom_desktop_screenshot.jpg", + "mobile_screenshot": "my_custom_mobile_screenshot.png", + "description": "This is a really cool custom style of the Stencil Theme", + "demo_url": "https://stencil-custom.mybigcommerce.com", + "optimized_for": ["fashion", "image_heavy", "etc"], + "industries": [] + }, + }, + // ... +``` + +## Changing a theme variation's font family + + +To learn more about defining variations, see [Defining Global Styles](/docs/storefront/stencil/themes/foundations/global-styles). In particular, note the option to configure settings and variables that are scoped to each variation. + +The following example shows how to set the body font of a theme variation to a specific typeface/family by inserting the `body-font-family` key into the `settings` object: + +```json Filename="Example body font variation config.json" showLineNumbers copy +{ + "name": "MyCustomVariation", + "id": "my_custom_variation", + "settings": { + // ... + "body-font-family": "MyCoolFont, AnotherFont, sans-serif", + // ... + } +} +``` + +## Preparing a variation's thumbnails + + +For details on preparing screenshots that enable merchants to preview each variation, and to preview your theme as a whole in the BigCommerce control panel and Theme Marketplace, see [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images). + +<Callout type="info"> + + #### Using Stencil CLI to change variations + To locally test/debug a specific variation of your theme, launch it by invoking the Stencil CLI's `stencil start -v` switch. Enter the following code into the terminal, replacing `variation-name` with your theme's variation name as listed in `config.json`: + `stencil start -v variation-name` + </Callout> + +## Resources + +### Related articles +* [Checking a Theme's Size](/docs/storefront/stencil/deployment/theme-size) +* [Preparing Thumbnail Images](/docs/storefront/stencil/deployment/theme-images) +* [Bundling and Pushing a Theme](/docs/storefront/stencil/deployment/upload) diff --git a/docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx b/docs/storefront/stencil/themes/javascript/extend.mdx similarity index 99% rename from docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx rename to docs/storefront/stencil/themes/javascript/extend.mdx index 15474a546..9a8b54073 100644 --- a/docs/stencil-docs/javascript-and-event-hooks/adding-javascript.mdx +++ b/docs/storefront/stencil/themes/javascript/extend.mdx @@ -271,7 +271,7 @@ Some custom content! <script>window.stencilBootstrap("{{page_type}}", {{jsContext}}).load();</script> ``` -In order to successully map your custom module to a custom template file, that file must do the following: +In order to successfully map your custom module to a custom template file, that file must do the following: * Inject the custom template * Load webpack * Load the main theme bundle diff --git a/docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx b/docs/storefront/stencil/themes/javascript/index.mdx similarity index 97% rename from docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx rename to docs/storefront/stencil/themes/javascript/index.mdx index ed606d288..a8176695b 100644 --- a/docs/stencil-docs/javascript-and-event-hooks/customizing-javascript.mdx +++ b/docs/storefront/stencil/themes/javascript/index.mdx @@ -1,155 +1,155 @@ -# Customizing JavaScript - - - -Most [Cornerstone theme](https://github.com/bigcommerce/cornerstone) page template files located in `templates/pages/` have a corresponding `.js` file in `assets/js/theme/`. These JavaScript files contain event handlers and logic for managing page specific elements and actions. - -For example, `assets/js/theme/product.js` corresponds to `templates/pages/product.html` and contains a `productReviewHandler()` and `bulkPricingHandler()`. These functions are implemented within a derived `Product` class which extends an abstract class called `PageManager`. This same pattern is repeated in all `assets/js/theme/*.js` files. - - -By default, all derived `PageManager` classes contain an `onReady` method functionally similar to `JQuery.ready()`. Additionally, certain pages have unique event handlers. For example, the `cartUpdate` handler in `assets/js/cart.js` runs each time certain cart elements are changed. Developers can customize and enhance page behavior and functionality by editing code within these event handlers or by creating their own event handlers. - - -To demonstrate, this article describes how to add some very simple JavaScript to `product.js`. - -## Modifying a page's JavaScript - -In this example, we will add some "Hello World!" text to the product page's `onReady` event. We'll first add a call to the function. Then, we will implement the function itself. - - -In `assets/js/theme/product.js` file, add a call to `this.helloWorld()` to the bottom of the `onReady()` method, which we'll implement in the next step. - - -```js showLineNumbers copy -export default class Product extends PageManager { - constructor(context) { - super(context); - this.url = window.location.href; - this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); - this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); - } - - onReady() { - // ... - // Example Code - this.helloWorld(); - } - // ... -} -``` - -Next, implement the `helloWorld()` function by adding it to the `Product` class just after the closing `onReady()` bracket. - -```javascript showLineNumbers copy -export default class Product extends PageManager { - constructor(context) { - super(context); - this.url = window.location.href; - this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); - this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); - } - - onReady() { - // ... - - // Example Code - this.helloWorld(); - } - - // Example Code - helloWorld() { - console.log("[assets/js/theme/product.js]: Hello World!"); - } - // ... -} -``` - -In your browser, refresh any product details pop-up or page to see your new "Hello World" message. If you are using the Stencil CLI and browsing to localhost, you may need to restart for the most recent changes to be reflected. - - -## Bringing in Handlebars context - - -You can inject any variables from the Handlebars context into your client-side JavaScript by using the `{{inject...}}` expression. - -```html copy -{{inject 'productThumbSize' theme_settings.productthumb_size}} -``` - -To inject `theme_settings.productthumb_size` into the product page's context, add `{{inject 'productThumbSize' theme_settings.productthumb_size}}` just under `{{#partial "page"}}` in `templates/pages/product.html<`: - -```html showLineNumbers copy -product: - videos: - limit: {{theme_settings.productpage_videos_count}} - reviews: - limit: {{theme_settings.productpage_reviews_count}} - related_products: - limit: {{theme_settings.productpage_related_products_count}} - similar_by_views: - limit: {{theme_settings.productpage_similar_by_views_count}} - -{{#partial "page"}} - <!-- Context Injection Example: --> - {{inject 'productThumbSize' theme_settings.productthumb_size}} - <!-- End Context Injection Example --> - <!-- ... --> -{{/partial}} -{{> layout/base}} -``` - -The injected `productThumbSize` property can then be accessed from `product.js` by calling `this.context.productThumbSize`. - -```js showLineNumbers copy -export default class Product extends PageManager { - constructor(context) { - super(context); - this.url = window.location.href; - this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); - this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); - } - - onReady() { - //... - // Example Code - this.helloWorld(); - } - - // Example Code - helloWorld() { - console.log("[assets/js/theme/product.js]: Hello World!"); - console.log("[assets/js/theme/product.js]: " + this.context.productThumbSize); - } - // ... -} -``` - -Note that the `console.log(this.context.themeImageSizes);` statement will report the configured image size, following the "Hello World!" message previously defined in [Modifying a Page's JavaScript](#modifying-a-pages-javascript) above. - - - -``` showLineNumbers copy -[/assets/js/theme/product.js]: Hello World! -product.js:63 [/assets/js/theme/product.js]: 100x100 -``` - -## Installing libraries - -Once you have installed the default Stencil theme, you can add custom JavaScript libraries with npm. - - -```shell copy -npm install jquery -``` - -Next, you would open `assets/js/theme/product.js`, and insert the statements excerpted below: - -```js showLineNumbers copy -import $ from 'jquery'; - -$('.myElement').click(() => { - alert("You clicked myElement"); -}); -``` - -For additional installation instructions, refer to your chosen library's documentation. +# Customizing JavaScript + + + +Most [Cornerstone theme](https://github.com/bigcommerce/cornerstone) page template files located in `templates/pages/` have a corresponding `.js` file in `assets/js/theme/`. These JavaScript files contain event handlers and logic for managing page specific elements and actions. + +For example, `assets/js/theme/product.js` corresponds to `templates/pages/product.html` and contains a `productReviewHandler()` and `bulkPricingHandler()`. These functions are implemented within a derived `Product` class which extends an abstract class called `PageManager`. This same pattern is repeated in all `assets/js/theme/*.js` files. + + +By default, all derived `PageManager` classes contain an `onReady` method functionally similar to `JQuery.ready()`. Additionally, certain pages have unique event handlers. For example, the `cartUpdate` handler in `assets/js/cart.js` runs each time certain cart elements are changed. Developers can customize and enhance page behavior and functionality by editing code within these event handlers or by creating their own event handlers. + + +To demonstrate, this article describes how to add some very simple JavaScript to `product.js`. + +## Modifying a page's JavaScript + +In this example, we will add some "Hello World!" text to the product page's `onReady` event. We'll first add a call to the function. Then, we will implement the function itself. + + +In `assets/js/theme/product.js` file, add a call to `this.helloWorld()` to the bottom of the `onReady()` method, which we'll implement in the next step. + + +```js showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + // ... + // Example Code + this.helloWorld(); + } + // ... +} +``` + +Next, implement the `helloWorld()` function by adding it to the `Product` class just after the closing `onReady()` bracket. + +```javascript showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + // ... + + // Example Code + this.helloWorld(); + } + + // Example Code + helloWorld() { + console.log("[assets/js/theme/product.js]: Hello World!"); + } + // ... +} +``` + +In your browser, refresh any product details pop-up or page to see your new "Hello World" message. If you are using the Stencil CLI and browsing to localhost, you may need to restart for the most recent changes to be reflected. + + +## Bringing in Handlebars context + + +You can inject any variables from the Handlebars context into your client-side JavaScript by using the `{{inject...}}` expression. + +```html copy +{{inject 'productThumbSize' theme_settings.productthumb_size}} +``` + +To inject `theme_settings.productthumb_size` into the product page's context, add `{{inject 'productThumbSize' theme_settings.productthumb_size}}` just under `{{#partial "page"}}` in `templates/pages/product.html<`: + +```html showLineNumbers copy +product: + videos: + limit: {{theme_settings.productpage_videos_count}} + reviews: + limit: {{theme_settings.productpage_reviews_count}} + related_products: + limit: {{theme_settings.productpage_related_products_count}} + similar_by_views: + limit: {{theme_settings.productpage_similar_by_views_count}} + +{{#partial "page"}} + <!-- Context Injection Example: --> + {{inject 'productThumbSize' theme_settings.productthumb_size}} + <!-- End Context Injection Example --> + <!-- ... --> +{{/partial}} +{{> layout/base}} +``` + +The injected `productThumbSize` property can then be accessed from `product.js` by calling `this.context.productThumbSize`. + +```js showLineNumbers copy +export default class Product extends PageManager { + constructor(context) { + super(context); + this.url = window.location.href; + this.$reviewLink = $('[data-reveal-id="modal-review-form"]'); + this.$bulkPricingLink = $('[data-reveal-id="modal-bulk-pricing"]'); + } + + onReady() { + //... + // Example Code + this.helloWorld(); + } + + // Example Code + helloWorld() { + console.log("[assets/js/theme/product.js]: Hello World!"); + console.log("[assets/js/theme/product.js]: " + this.context.productThumbSize); + } + // ... +} +``` + +Note that the `console.log(this.context.themeImageSizes);` statement will report the configured image size, following the "Hello World!" message previously defined in [Modifying a Page's JavaScript](#modifying-a-pages-javascript) above. + + + +``` showLineNumbers copy +[/assets/js/theme/product.js]: Hello World! +product.js:63 [/assets/js/theme/product.js]: 100x100 +``` + +## Installing libraries + +Once you have installed the default Stencil theme, you can add custom JavaScript libraries with npm. + + +```shell copy +npm install jquery +``` + +Next, you would open `assets/js/theme/product.js`, and insert the statements excerpted below: + +```js showLineNumbers copy +import $ from 'jquery'; + +$('.myElement').click(() => { + alert("You clicked myElement"); +}); +``` + +For additional installation instructions, refer to your chosen library's documentation. diff --git a/docs/stencil-docs/localization/translating-regions.mdx b/docs/storefront/stencil/themes/localization/page-regions.mdx similarity index 100% rename from docs/stencil-docs/localization/translating-regions.mdx rename to docs/storefront/stencil/themes/localization/page-regions.mdx diff --git a/docs/stencil-docs/localization/msf-storefront-selector.mdx b/docs/storefront/stencil/themes/localization/storefront-selector.mdx similarity index 99% rename from docs/stencil-docs/localization/msf-storefront-selector.mdx rename to docs/storefront/stencil/themes/localization/storefront-selector.mdx index 7eb343daf..db89827d0 100644 --- a/docs/stencil-docs/localization/msf-storefront-selector.mdx +++ b/docs/storefront/stencil/themes/localization/storefront-selector.mdx @@ -1,4 +1,4 @@ -# Storefront Selector for Multi-Storefronts +# Storefront selector for multi-storefront To localize shopping experiences, you can have [multiple storefronts](/docs/storefront/multi-storefront) that target specific shopper segments, regions, or brands. You can add a selector to a theme so shoppers can select the storefront they want to browse from a list of options. diff --git a/docs/stencil-docs/localization/localizing-stores.mdx b/docs/storefront/stencil/themes/localization/stores.mdx similarity index 97% rename from docs/stencil-docs/localization/localizing-stores.mdx rename to docs/storefront/stencil/themes/localization/stores.mdx index f87288237..d5f42a7b3 100644 --- a/docs/stencil-docs/localization/localizing-stores.mdx +++ b/docs/storefront/stencil/themes/localization/stores.mdx @@ -1,133 +1,133 @@ -# Localizing Stores - -A BigCommerce storefront can be customized to display in any one language of your choice. To fully localize a store for a language or region, you will need to customize three areas: - - -* **[Storefront theme pages.](#translating-theme-files-by-stencil-cli)** Translate static strings by adding translation files for your chosen languages via Stencil CLI. - -* **[Checkout.](#localizing-checkout)** Localize checkout by modifying theme files in Stencil CLI and settings in the BigCommerce control panel. - -* **[Storefront content.](#localizing-your-storefront-content)** Adjust other localization details in the BigCommerce control panel. - - -<Callout type="info"> - #### Storefront language support - Each storefront can only support a single language. To display multiple languages, we recommend setting up a separate store for each language. -</Callout> - - - -## Localizing theme files - -Localize your theme by adding translation files via Stencil CLI. - -### Translating theme files by Stencil CLI - -The bulk of localizing a store is translating content on your theme's page templates. You will need to abstract these templates' literal text strings into `{{lang}}` variables, then provide per-language JSON files that define these variables in corresponding key/value pairs. - -### Multiple language strings by BigCommerce - -Currently, you cannot edit strings such as "This promotion cannot be applied with the selected currency" in BigCommerce. The language settings for these strings are not defined by the shopper's browser language settings. Rather, you select your storefront's display language using the default language setting found in the control panel's [Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings#locale). This language setting determines the language of your storefront content. - - -BigCommerce's Cornerstone Stencil theme supports these uneditable strings in the following languages: - -* Danish -* Dutch -* English -* French -* German -* Italian -* Japanese -* Norwegian -* Polish -* Portuguese -* Portuguese (Brazil) -* Spanish (Argentina) -* Spanish (Chile) -* Spanish (Columbia) -* Spanish (Latin America & Caribbean) -* Spanish (Mexico) -* Spanish (Peru) -* Spanish (Spain) -* Swedish - - -## Localizing checkout - -Localizing your theme's checkout and order confirmation pages requires customizations within the default checkout page and the order confirmation HTML file. See [Multi-language setup](/docs/storefront/cart-checkout/localization) for details. - - -<Callout type="warning"> - #### Checkout localization - Checkout localization is only available for [Optimized One-Page Checkout](/docs/storefront/cart-checkout/optimized-one-page-checkout). -</Callout> - - -## Localizing your storefront content - -Localize the control panel and options outside your theme by accessing the [Default Language setting, found in the control panel's Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings#locale). The Store Profile allows localization of the following items: - -* [Product catalog](#localizing-the-product-catalog) -* [Currency](#localizing-currency) -* [Date format](#localizing-date-format) -* [Order statuses](#localizing-order-statuses) -* [Blog](#localizing-the-blog) -* [Static web pages](#localizing-static-web-pages) -* [Transactional emails](#managing-transactional-emails) -* [Gift certificates](#managing-gift-certificates) -* [System messages](#managing-system-messages) - -### Localizing the product catalog - -You must localize the store's product catalog separately from its theme. Each entry within a catalog can be set up in only one language, so you will need to localize a separate version of your catalog for each single-language store. - -For an overview of how to populate the store catalog, including options for bulk-importing content that you can localize outside the BigCommerce platform, see [Adding Products](https://support.bigcommerce.com/s/article/Adding-Products-v3). - -### Localizing currency -You can configure each store's default currency in the BigCommerce control panel. For details, see [Changing Your Default Currency](https://support.bigcommerce.com/s/article/Managing-Currencies#default). - -### Localizing date format -You can set the appropriate date format for your store's language/region in the BigCommerce control panel: **Settings > General > [Date & Timezone](http://login.bigcommerce.com/deep-links/manage/settings/store)**. For details, see [Date & Timezone Settings](https://support.bigcommerce.com/s/article/Store-Settings#date-time). - -### Localizing order statuses -You can configure the `order-status` labels displayed on a BigCommerce storefront outside your theme. You can translate each of these strings in the BigCommerce control panel under **Orders > [Order Statuses](http://login.bigcommerce.com/deep-links/manage/orders/order-statuses)**. For instructions, see [Customizing an Order Status Label](https://support.bigcommerce.com/s/article/Order-Statuses#rename). - -### Localizing the blog -Blog entries are managed through the BigCommerce control panel under **Storefront > [Blog](https://login.mybigcommerce.com/manage/content/blog)**. You can add blog content in any language you choose. For details, see [Creating a Blog Post](https://support.bigcommerce.com/s/article/Using-the-Built-In-Blog#creating-post). - -### Localizing static web pages -If you create static pages as Stencil custom templates, you can localize their content just like other theme pages' content. However, if you create custom pages in the BigCommerce control panel under **Storefront > Web Pages**, (if MSF is active on your store go to **Channel Manager > Channels > Storefronts > Quick links > Web Pages**), you must also enter their localized content in the control panel. - -### Managing transactional emails - -To fully localize a store into a language other than English, disable the sending of BigCommerce native emails. To disable native emails, go to **Marketing > [Transactional Emails](http://login.bigcommerce.com/deep-links/manage/transactional-emails)**. Uncheck each email type that you prefer to customize. - -You can localize transactional emails by using compatible third-party apps such as [CM Commerce](https://www.bigcommerce.com/apps/cm-commerce/). - -### Managing gift certificates - -To fully localize your store, disable gift certificates in the BigCommerce control panel. - -### Managing system messages -You can localize a store's payment and checkout error messages via checkout-js in the BigCommerce control panel. For a list of error messages and supported languages, see [Verbose Error Messages at Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout#verbose). - -To customize payment and checkout messages, define these variables in the theme language files. For details, see [Multi-language setup](/docs/storefront/cart-checkout/localization#multi-language-setup). - - -## Resources - -### Related articles - -* [Translation Keys](/docs/storefront/stencil/themes/localization/translation-keys) -* [Restyle Optimized One-Page Checkout](/docs/storefront/cart-checkout/optimized-one-page-checkout) -* [Multi-Language Checkout](/docs/storefront/cart-checkout/localization) -* [Adding Products (Help Center)](https://support.bigcommerce.com/s/article/Adding-Products-v3) -* [Changing Your Default Currency (Help Center)](https://support.bigcommerce.com/s/article/Managing-Currencies#default) - -### Additional resources - -* [Cornerstore - checkout.html (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/checkout.html) -* [Cornerstone - order-confirmation.html (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/order-confirmation.html) -* [Cornerstone - JSON translation file (GitHub)](https://github.com/bigcommerce/cornerstone/tree/master/lang) - +# Localizing Stores + +A BigCommerce storefront can be customized to display in any one language of your choice. To fully localize a store for a language or region, you will need to customize three areas: + + +* **[Storefront theme pages.](#translating-theme-files-by-stencil-cli)** Translate static strings by adding translation files for your chosen languages via Stencil CLI. + +* **[Checkout.](#localizing-checkout)** Localize checkout by modifying theme files in Stencil CLI and settings in the BigCommerce control panel. + +* **[Storefront content.](#localizing-your-storefront-content)** Adjust other localization details in the BigCommerce control panel. + + +<Callout type="info"> + #### Storefront language support + Each storefront can only support a single language. To display multiple languages, we recommend setting up a separate store for each language. +</Callout> + + + +## Localizing theme files + +Localize your theme by adding translation files via Stencil CLI. + +### Translating theme files by Stencil CLI + +The bulk of localizing a store is translating content on your theme's page templates. You will need to abstract these templates' literal text strings into `{{lang}}` variables, then provide per-language JSON files that define these variables in corresponding key/value pairs. + +### Multiple language strings by BigCommerce + +Currently, you cannot edit strings such as "This promotion cannot be applied with the selected currency" in BigCommerce. The language settings for these strings are not defined by the shopper's browser language settings. Rather, you select your storefront's display language using the default language setting found in the control panel's [Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings#locale). This language setting determines the language of your storefront content. + + +BigCommerce's Cornerstone Stencil theme supports these uneditable strings in the following languages: + +* Danish +* Dutch +* English +* French +* German +* Italian +* Japanese +* Norwegian +* Polish +* Portuguese +* Portuguese (Brazil) +* Spanish (Argentina) +* Spanish (Chile) +* Spanish (Columbia) +* Spanish (Latin America & Caribbean) +* Spanish (Mexico) +* Spanish (Peru) +* Spanish (Spain) +* Swedish + + +## Localizing checkout + +Localizing your theme's checkout and order confirmation pages requires customizations within the default checkout page and the order confirmation HTML file. See [Multi-language setup](/docs/storefront/cart-checkout/localization) for details. + + +<Callout type="warning"> + #### Checkout localization + Checkout localization is only available for [Optimized One-Page Checkout](/docs/storefront/cart-checkout/optimized-one-page-checkout). +</Callout> + + +## Localizing your storefront content + +Localize the control panel and options outside your theme by accessing the [Default Language setting, found in the control panel's Store Profile](https://support.bigcommerce.com/s/article/Store-Profile-Settings#locale). The Store Profile allows localization of the following items: + +* [Product catalog](#localizing-the-product-catalog) +* [Currency](#localizing-currency) +* [Date format](#localizing-date-format) +* [Order statuses](#localizing-order-statuses) +* [Blog](#localizing-the-blog) +* [Static web pages](#localizing-static-web-pages) +* [Transactional emails](#managing-transactional-emails) +* [Gift certificates](#managing-gift-certificates) +* [System messages](#managing-system-messages) + +### Localizing the product catalog + +You must localize the store's product catalog separately from its theme. Each entry within a catalog can be set up in only one language, so you will need to localize a separate version of your catalog for each single-language store. + +For an overview of how to populate the store catalog, including options for bulk-importing content that you can localize outside the BigCommerce platform, see [Adding Products](https://support.bigcommerce.com/s/article/Adding-Products-v3). + +### Localizing currency +You can configure each store's default currency in the BigCommerce control panel. For details, see [Changing Your Default Currency](https://support.bigcommerce.com/s/article/Managing-Currencies#default). + +### Localizing date format +You can set the appropriate date format for your store's language/region in the BigCommerce control panel: **Settings > General > [Date & Timezone](http://login.bigcommerce.com/deep-links/manage/settings/store)**. For details, see [Date & Timezone Settings](https://support.bigcommerce.com/s/article/Store-Settings#date-time). + +### Localizing order statuses +You can configure the `order-status` labels displayed on a BigCommerce storefront outside your theme. You can translate each of these strings in the BigCommerce control panel under **Orders > [Order Statuses](http://login.bigcommerce.com/deep-links/manage/orders/order-statuses)**. For instructions, see [Customizing an Order Status Label](https://support.bigcommerce.com/s/article/Order-Statuses#rename). + +### Localizing the blog +Blog entries are managed through the BigCommerce control panel under **Storefront > [Blog](https://login.mybigcommerce.com/manage/content/blog)**. You can add blog content in any language you choose. For details, see [Creating a Blog Post](https://support.bigcommerce.com/s/article/Using-the-Built-In-Blog#creating-post). + +### Localizing static web pages +If you create static pages as Stencil custom templates, you can localize their content just like other theme pages' content. However, if you create custom pages in the BigCommerce control panel under **Storefront > Web Pages**, (if MSF is active on your store go to **Channel Manager > Channels > Storefronts > Quick links > Web Pages**), you must also enter their localized content in the control panel. + +### Managing transactional emails + +To fully localize a store into a language other than English, disable the sending of BigCommerce native emails. To disable native emails, go to **Marketing > [Transactional Emails](http://login.bigcommerce.com/deep-links/manage/transactional-emails)**. Uncheck each email type that you prefer to customize. + +You can localize transactional emails by using compatible third-party apps such as [CM Commerce](https://www.bigcommerce.com/apps/cm-commerce/). + +### Managing gift certificates + +To fully localize your store, disable gift certificates in the BigCommerce control panel. + +### Managing system messages +You can localize a store's payment and checkout error messages via checkout-js in the BigCommerce control panel. For a list of error messages and supported languages, see [Verbose Error Messages at Checkout](https://support.bigcommerce.com/s/article/Optimized-Single-Page-Checkout#verbose). + +To customize payment and checkout messages, define these variables in the theme language files. For details, see [Multi-language setup](/docs/storefront/cart-checkout/localization#multi-language-setup). + + +## Resources + +### Related articles + +* [Translation Keys](/docs/storefront/stencil/themes/localization/translation-keys) +* [Restyle Optimized One-Page Checkout](/docs/storefront/cart-checkout/optimized-one-page-checkout) +* [Multi-Language Checkout](/docs/storefront/cart-checkout/localization) +* [Adding Products (Help Center)](https://support.bigcommerce.com/s/article/Adding-Products-v3) +* [Changing Your Default Currency (Help Center)](https://support.bigcommerce.com/s/article/Managing-Currencies#default) + +### Additional resources + +* [Cornerstone - checkout.html (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/checkout.html) +* [Cornerstone - order-confirmation.html (GitHub)](https://github.com/bigcommerce/cornerstone/blob/master/templates/pages/order-confirmation.html) +* [Cornerstone - JSON translation file (GitHub)](https://github.com/bigcommerce/cornerstone/tree/master/lang) + diff --git a/docs/stencil-docs/localization/translation-keys.mdx b/docs/storefront/stencil/themes/localization/translation-keys.mdx similarity index 100% rename from docs/stencil-docs/localization/translation-keys.mdx rename to docs/storefront/stencil/themes/localization/translation-keys.mdx diff --git a/docs/stencil-docs/storefront-customization/localizing-variation-descriptions.mdx b/docs/storefront/stencil/themes/localization/translations.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/localizing-variation-descriptions.mdx rename to docs/storefront/stencil/themes/localization/translations.mdx diff --git a/docs/stencil-docs/localization/localization-tutorial.mdx b/docs/storefront/stencil/themes/localization/tutorial.mdx similarity index 100% rename from docs/stencil-docs/localization/localization-tutorial.mdx rename to docs/storefront/stencil/themes/localization/tutorial.mdx diff --git a/docs/stencil-docs/storefront-customization/theme-assets.mdx b/docs/storefront/stencil/themes/style/assets.mdx similarity index 99% rename from docs/stencil-docs/storefront-customization/theme-assets.mdx rename to docs/storefront/stencil/themes/style/assets.mdx index 06ad0166d..d83b4d11c 100644 --- a/docs/stencil-docs/storefront-customization/theme-assets.mdx +++ b/docs/storefront/stencil/themes/style/assets.mdx @@ -116,7 +116,7 @@ This subdirectory’s children contain CSS for the following page elements. ### Sample apps * [Cornerstone GitHub Repository](https://github.com/bigcommerce/cornerstone) (BigCommerce GitHub) -### Additonal resources +### Additional resources * [Getting Started With Foundation 5](https://get.foundation/sites/docs-v5/) (Zurb) * [BEM](http://getbem.com/) (Get BEM) * [SUIT CSS](https://suitcss.github.io/) (GitHub) diff --git a/docs/stencil-docs/storefront-customization/page-composition-and-styling.mdx b/docs/storefront/stencil/themes/style/composition-and-styling.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/page-composition-and-styling.mdx rename to docs/storefront/stencil/themes/style/composition-and-styling.mdx diff --git a/docs/stencil-docs/storefront-customization/using-custom-fonts-and-icons.mdx b/docs/storefront/stencil/themes/style/fonts-and-icons.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/using-custom-fonts-and-icons.mdx rename to docs/storefront/stencil/themes/style/fonts-and-icons.mdx diff --git a/docs/stencil-docs/storefront-customization/custom-sass-functions.mdx b/docs/storefront/stencil/themes/style/sass.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/custom-sass-functions.mdx rename to docs/storefront/stencil/themes/style/sass.mdx diff --git a/docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx b/docs/storefront/stencil/themes/templates/checkout-confirmation.mdx similarity index 96% rename from docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx rename to docs/storefront/stencil/themes/templates/checkout-confirmation.mdx index 603ac0123..fa47d4a73 100644 --- a/docs/stencil-docs/customizing-checkout/checkout-confirmation-injection.mdx +++ b/docs/storefront/stencil/themes/templates/checkout-confirmation.mdx @@ -1,248 +1,248 @@ -# Checkout/Confirmation Injection - -This article covers styling, scripting, and extending the functionality of the checkout confirmation page. - -## Adding Storewide Styles - -A prerequisite for the next two options is to add themewide styles to your Checkout or Order Confirmation page. To do so, add this statement: - -`{{{stylesheet '/assets/css/theme.css'}}}` - -...before this statement, which is already present at the head of each template: - -`{{{ checkout.checkout_head }}}` - -## Applying Storewide Header - -You can replace each page's predefined header with your storewide header. To do so, first add themewide styles as described above. Next, replace the following code block (if present): - -```html showLineNumbers copy -<header class="checkoutHeader optimizedCheckout-header"> - <div class="checkoutHeader-content"> - <h1 class="is-srOnly">{{lang 'checkout.title'}} - <h2 class="checkoutHeader-heading"> - <a class="checkoutHeader-link" href="{{urls.home}}"> - {{#if checkout.header_image}} - <img alt="{{settings.store_logo.title}}" class="checkoutHeader-logo" id="logoImage" src="{{ checkout.header_image }}"/> - {{ else }} - <span class="header-logo-text">{{settings.store_logo.title}}</span> - {{/if}} - </a> - </h2> - </div> -</header> -``` - -with this Handlebars partial reference: - -`{{> components/common/header }}` - -Ensure that you paste it before this **existing** statement: - -`{{{ checkout.checkout_head }}}` - -## Applying Storewide Scripts - -You have the following options to add and customize headers and footers, on either or both templates: - -* Adding your themewide header/footer. -* Adding themewide scripts (for analytics, etc.). -* Adding both. - -If you are working on a theme that does not have the scripts already enabled, here are the steps to enable these options: - -1. Add themewide styles, as described above. - -2. Towards the top of the checkout template (`checkout.html`), add this Handlebars statement to enable header scripts: - -`{{{ head.scripts }}}` - -Add it between these existing statements, so it will ultimately read as shown below. - -```html showLineNumbers copy -<script type="text/javascript"> - window.language = {{{langJson 'optimized_checkout'}}}; -</script> - -{{{head.scripts}}} - -{{/partial}} - -{{#partial "page"}} -``` - -Additionally, at the bottom of the checkout template (`checkout.html`), add this Handlebars statement to enable footer scripts: - -`{{{ footer.scripts }}}` - -Add it between these existing statements, so it will ultimately read as shown below. - -```html showLineNumbers copy - {{{ checkout.checkout_content }}} - - {{{ footer.scripts }}} - - {{/partial}} -``` - -3. Towards the top of the order confirmation template (`order-confirmation.html`), add this Handlebars statement to enable header scripts: - -`{{{ head.scripts }}}` - -Add it between these existing statements, so it will ultimately read as shown below. - -```html showLineNumbers copy -<script type="text/javascript"> - window.language = {{{langJson 'optimized_checkout'}}}; -</script> - -{{{head.scripts}}} - -{{/partial}} - -{{#partial "page"}} -``` - -Additionally, at the bottom of the order confirmation template (`order-confirmation.html`), insert this Handlebars statement: - -`{{{ footer.scripts }}}` - -Insert it between these existing statements, so it will ultimately read as shown below. - -```html showLineNumbers copy -{{{ checkout.order_confirmation_content }}} - -{{{ footer.scripts }}} - -{{/partial}} -``` - -4. In your store's BigCommerce control panel, ensure that you have inserted any desired script text in the `Storefront` > `Script Manager` field. - -## Adding Trust Seals - -To add a trust seal to either template: - -1. Generate a code snippet (seal script) from your trust-seal provider. You can find instructions for GeoTrust seals in [this BigCommerce KB article](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer). (Instructions for other providers will vary.) - -2. Copy and paste the seal script into your checkout or order confirmation template, before or after the `{{{ checkout.checkout_content }}}` Handlebars statement. - -## Checkout App Injection - -With BigCommerce's extensible software, there are a variety of ways to add scripts to your store. The steps above outline only one method of adding header and footer scripts to your store, which is by directly editing the theme files. - -As mentioned in the App Injection Script Examples, you can use BigCommerce's Script Manager and Script API to inject scripts to your store. The Script Manager user interface is available to store owners and other users via granted permission directly in the Control Panel, or scripts can be programmatically injected into the store by developers using the Scripts API. These are the recommended methods as they allow seamless and intuitive injection of scripts. - -The following sections present examples of scripts that inject popular apps into the checkout/order confirmation sequence. - -### Olark Live Chat - -As an example of injecting an app from the BigCommerce App Marketplace, you could enable the Olark Live Chat app on either page by using the script manager or our new Scripts API: - -```html showLineNumbers copy -<!-- begin olark code --> -<script type="text/javascript" async> - ;(function(o,l,a,r,k,y){if(o.olark)return; - r="script";y=l.createElement(r);r=l.getElementsByTagName(r)[0]; - y.async=1;y.src="//"+a;r.parentNode.insertBefore(y,r); - y=o.olark=function(){k.s.push(arguments);k.t.push(+new Date)}; - y.extend=function(i,j){y("extend",i,j)}; - y.identify=function(i){y("identifyv",k.i=i)}; - y.configure=function(i,j){y("configure",i,j);k.c[i]=j}; - k=y._={s:[],t:[+new Date],c:{},l:a}; - })(window,document,"static.olark.com/jsclient/loader.js"); - /* Add configuration calls bellow this comment */ - olark.identify('4080-493-10-1035'); -</script> -<!-- end olark code --> -``` - -### Bluecheck Age Verification - -Similarly, you could enable the Bluecheck age-verification app by using the script manager or our new Scripts API: - -```html showLineNumbers copy -<!-- Bluecheck AV Start Here --> -<script src="https://api.bluecheck.me/modal/latest/custom/bigcommerce.js"></script> -<script src='//api.bluecheck.me/age-gate/v2/loader.js.php?domain_token=[user-token-value]'></script> -<span style='display:none' id='bc_selected_shipping_info'>%%GLOBAL_ShippingAddress%%</span> -<span style='display:none' id='bc_selected_billing_info'>%%GLOBAL_BillingAddress%%</span> -<span style='display:none' id='bc_customer_acct_email'>%%GLOBAL_CurrentCustomerEmail%%</span> -<span style='display:none' id='bc_customer_acct_id'>%%GLOBAL_CurrentCustomerID%%</span> -<span style='display:none' id='bc_customer_acct_fname'>%%GLOBAL_CurrentCustomerFirstName%%</span> -<span style='display:none' id='bc_customer_acct_lname'>%%GLOBAL_CurrentCustomerLastName%%</span> -<!-- Bluecheck AV End Here --> -``` - -### Rebillia Recurring Billing - -To add the Rebillia app, you could add the following tags by using the script manager or our new Scripts API: - -```html showLineNumbers copy -<div id='rebillia_overlay'></div> - -<script src="https://js.braintreegateway.com/v2/braintree.js"></script> - -<script type="text/javascript" src="https://js.stripe.com/v2/"></script> - -<script type="text/javascript"> -function customerJWT(a){var b="r1sc6nvnnhed377cozp2bfwfa69cfz5",c=new XMLHttpRequest;c.onreadystatechange=function(){if(4==c.readyState)if(200==c.status){var b=new XMLHttpRequest;b.open("GET","https://demo.rebillia.com/storefront/login/"+c.responseText,!0),b.withCredentials=!0,b.send()}else if(404==c.status){var d=new XMLHttpRequest;params="bc_email="+a,d.open("POST","https://demo.rebillia.com/storefront/login/guest",!0),d.setRequestHeader("Content-type","application/x-www-form-urlencoded"),d.withCredentials=!0,d.send(params)}else console.log("Something went wrong")},c.open("GET","/customer/current.jwt?app_client_id="+b,!0),c.send()}var currentcustomeremail="%%GLOBAL_CurrentCustomerEmail%%",shopPath="%%GLOBAL_ShopPathSSL%%",domainName="https://demo.rebillia.com",domainURL="https://demo.rebillia.com/";$(document).ready(function(){$.getScript(domainName+"/js/embed-common.js");var a=window.location.href.match(/[^\/]+$/);if(a&&a.length){var b=a[0].split(".");"account"!=b[0]&&"checkout"!=b[0]&&"finishorder"!=b[0]||$.getScript(domainName+"/js/embed-"+b[0]+".js"),"account"==b[0]&&customerJWT()}}); -</script> -``` - -### Conversion Tracking: Conversions on Demand - -Here is one final example of an app that you could enable by using the script manager or our new Scripts API. This example enables Conversions on Demand: - -```html showLineNumbers copy -<script type='text/javascript'>// <![CDATA[ - var cod_page_guid = 'CHECKOUT'; - var COD_CONFIG = {'platform':'bigcommerce', 'stoken':'as2_bcmarket_org'}; - (function(){ - var divCOD = document.createElement('div'); - divCOD.id = 'codScripts'; - var bodytag = document.getElementsByTagName('body')[0]; - bodytag.appendChild(divCOD); - var cod = document.createElement('script'); - cod.type = 'text/javascript'; - cod.src = 'https://www.conversionsondemand.com/codadmin2/framework/cod-scripts-loader.js'; - var s = document.getElementById('codScripts'); - s.parentNode.insertBefore(cod, s); - })(COD_CONFIG); -// ]]></script> -``` - -### Google Analytics: Addrexx Address Verification - -The Addrexx app is integrated to the Checkout or Order Confirmation page via the BigCommerce control panel's Google Analytics box, rather than through injection directly into either Stencil template file. Here is the corresponding script to enter into the control panel: - -```html showLineNumbers copy -<!-- START Addrexx --> -<script type="text/javascript"> - wwPage = window.location.href; - if (wwPage.indexOf("billing_address") >= 0 || wwPage.indexOf("create_account") >= 0 || wwPage.indexOf("shipping_address") >= 0 || wwPage.indexOf("checkout") >= 0) { - function loadaddrexx() { - var _cc_url = "xxredda.s3.amazonaws.com/bcmarket/loader.js"; - var _cc_s = document.createElement('script'); - _cc_s.type = 'text/javascript'; - _cc_s.src = (("http:" === document.location.protocol) ? "http:" : "https:") + "//" + _cc_url; - document.getElementsByTagName("head")[0].appendChild(_cc_s); - }; - loadaddrexx(); - } -</script> -<!-- END Addrexx --> -``` - -## Resources - -* [Scripts API](/docs/rest-management/scripts) - -### Related Articles -* [Adding a GeoTrust SSL Seal to Your Store's Footer (Help Center)](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer) - -### Additonal Resources -* [Olark (Olark)](https://www.olark.com/integrations/bigcommerce) -* [Rebilla (Rebilla)](https://www.rebillia.com/documentation/stencil-or-blueprint) -* [Set up conversion tracking for your website (Google)](https://support.google.com/google-ads/answer/6095821) -* [Addrexx (BigCommerce App Marketplace)](https://www.bigcommerce.com/apps/addrexx/) +# Checkout/Confirmation Injection + +This article covers styling, scripting, and extending the functionality of the checkout confirmation page. + +## Adding Storewide Styles + +A prerequisite for the next two options is to add themewide styles to your Checkout or Order Confirmation page. To do so, add this statement: + +`{{{stylesheet '/assets/css/theme.css'}}}` + +...before this statement, which is already present at the head of each template: + +`{{{ checkout.checkout_head }}}` + +## Applying Storewide Header + +You can replace each page's predefined header with your storewide header. To do so, first add themewide styles as described above. Next, replace the following code block (if present): + +```html showLineNumbers copy +<header class="checkoutHeader optimizedCheckout-header"> + <div class="checkoutHeader-content"> + <h1 class="is-srOnly">{{lang 'checkout.title'}} + <h2 class="checkoutHeader-heading"> + <a class="checkoutHeader-link" href="{{urls.home}}"> + {{#if checkout.header_image}} + <img alt="{{settings.store_logo.title}}" class="checkoutHeader-logo" id="logoImage" src="{{ checkout.header_image }}"/> + {{ else }} + <span class="header-logo-text">{{settings.store_logo.title}}</span> + {{/if}} + </a> + </h2> + </div> +</header> +``` + +with this Handlebars partial reference: + +`{{> components/common/header }}` + +Ensure that you paste it before this **existing** statement: + +`{{{ checkout.checkout_head }}}` + +## Applying Storewide Scripts + +You have the following options to add and customize headers and footers, on either or both templates: + +* Adding your themewide header/footer. +* Adding themewide scripts (for analytics, etc.). +* Adding both. + +If you are working on a theme that does not have the scripts already enabled, here are the steps to enable these options: + +1. Add themewide styles, as described above. + +2. Towards the top of the checkout template (`checkout.html`), add this Handlebars statement to enable header scripts: + +`{{{ head.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy +<script type="text/javascript"> + window.language = {{{langJson 'optimized_checkout'}}}; +</script> + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} +``` + +Additionally, at the bottom of the checkout template (`checkout.html`), add this Handlebars statement to enable footer scripts: + +`{{{ footer.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy + {{{ checkout.checkout_content }}} + + {{{ footer.scripts }}} + + {{/partial}} +``` + +3. Towards the top of the order confirmation template (`order-confirmation.html`), add this Handlebars statement to enable header scripts: + +`{{{ head.scripts }}}` + +Add it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy +<script type="text/javascript"> + window.language = {{{langJson 'optimized_checkout'}}}; +</script> + +{{{head.scripts}}} + +{{/partial}} + +{{#partial "page"}} +``` + +Additionally, at the bottom of the order confirmation template (`order-confirmation.html`), insert this Handlebars statement: + +`{{{ footer.scripts }}}` + +Insert it between these existing statements, so it will ultimately read as shown below. + +```html showLineNumbers copy +{{{ checkout.order_confirmation_content }}} + +{{{ footer.scripts }}} + +{{/partial}} +``` + +4. In your store's BigCommerce control panel, ensure that you have inserted any desired script text in the `Storefront` > `Script Manager` field. + +## Adding Trust Seals + +To add a trust seal to either template: + +1. Generate a code snippet (seal script) from your trust-seal provider. You can find instructions for GeoTrust seals in [this BigCommerce KB article](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer). (Instructions for other providers will vary.) + +2. Copy and paste the seal script into your checkout or order confirmation template, before or after the `{{{ checkout.checkout_content }}}` Handlebars statement. + +## Checkout App Injection + +With BigCommerce's extensible software, there are a variety of ways to add scripts to your store. The steps above outline only one method of adding header and footer scripts to your store, which is by directly editing the theme files. + +As mentioned in the App Injection Script Examples, you can use BigCommerce's Script Manager and Script API to inject scripts to your store. The Script Manager user interface is available to store owners and other users via granted permission directly in the Control Panel, or scripts can be programmatically injected into the store by developers using the Scripts API. These are the recommended methods as they allow seamless and intuitive injection of scripts. + +The following sections present examples of scripts that inject popular apps into the checkout/order confirmation sequence. + +### Olark Live Chat + +As an example of injecting an app from the BigCommerce App Marketplace, you could enable the Olark Live Chat app on either page by using the script manager or our new Scripts API: + +```html showLineNumbers copy +<!-- begin olark code --> +<script type="text/javascript" async> + ;(function(o,l,a,r,k,y){if(o.olark)return; + r="script";y=l.createElement(r);r=l.getElementsByTagName(r)[0]; + y.async=1;y.src="//"+a;r.parentNode.insertBefore(y,r); + y=o.olark=function(){k.s.push(arguments);k.t.push(+new Date)}; + y.extend=function(i,j){y("extend",i,j)}; + y.identify=function(i){y("identifyv",k.i=i)}; + y.configure=function(i,j){y("configure",i,j);k.c[i]=j}; + k=y._={s:[],t:[+new Date],c:{},l:a}; + })(window,document,"static.olark.com/jsclient/loader.js"); + /* Add configuration calls bellow this comment */ + olark.identify('4080-493-10-1035'); +</script> +<!-- end olark code --> +``` + +### Bluecheck Age Verification + +Similarly, you could enable the Bluecheck age-verification app by using the script manager or our new Scripts API: + +```html showLineNumbers copy +<!-- Bluecheck AV Start Here --> +<script src="https://api.bluecheck.me/modal/latest/custom/bigcommerce.js"></script> +<script src='//api.bluecheck.me/age-gate/v2/loader.js.php?domain_token=[user-token-value]'></script> +<span style='display:none' id='bc_selected_shipping_info'>%%GLOBAL_ShippingAddress%%</span> +<span style='display:none' id='bc_selected_billing_info'>%%GLOBAL_BillingAddress%%</span> +<span style='display:none' id='bc_customer_acct_email'>%%GLOBAL_CurrentCustomerEmail%%</span> +<span style='display:none' id='bc_customer_acct_id'>%%GLOBAL_CurrentCustomerID%%</span> +<span style='display:none' id='bc_customer_acct_fname'>%%GLOBAL_CurrentCustomerFirstName%%</span> +<span style='display:none' id='bc_customer_acct_lname'>%%GLOBAL_CurrentCustomerLastName%%</span> +<!-- Bluecheck AV End Here --> +``` + +### Rebillia Recurring Billing + +To add the Rebillia app, you could add the following tags by using the script manager or our new Scripts API: + +```html showLineNumbers copy +<div id='rebillia_overlay'></div> + +<script src="https://js.braintreegateway.com/v2/braintree.js"></script> + +<script type="text/javascript" src="https://js.stripe.com/v2/"></script> + +<script type="text/javascript"> +function customerJWT(a){var b="r1sc6nvnnhed377cozp2bfwfa69cfz5",c=new XMLHttpRequest;c.onreadystatechange=function(){if(4==c.readyState)if(200==c.status){var b=new XMLHttpRequest;b.open("GET","https://demo.rebillia.com/storefront/login/"+c.responseText,!0),b.withCredentials=!0,b.send()}else if(404==c.status){var d=new XMLHttpRequest;params="bc_email="+a,d.open("POST","https://demo.rebillia.com/storefront/login/guest",!0),d.setRequestHeader("Content-type","application/x-www-form-urlencoded"),d.withCredentials=!0,d.send(params)}else console.log("Something went wrong")},c.open("GET","/customer/current.jwt?app_client_id="+b,!0),c.send()}var currentcustomeremail="%%GLOBAL_CurrentCustomerEmail%%",shopPath="%%GLOBAL_ShopPathSSL%%",domainName="https://demo.rebillia.com",domainURL="https://demo.rebillia.com/";$(document).ready(function(){$.getScript(domainName+"/js/embed-common.js");var a=window.location.href.match(/[^\/]+$/);if(a&&a.length){var b=a[0].split(".");"account"!=b[0]&&"checkout"!=b[0]&&"finishorder"!=b[0]||$.getScript(domainName+"/js/embed-"+b[0]+".js"),"account"==b[0]&&customerJWT()}}); +</script> +``` + +### Conversion Tracking: Conversions on Demand + +Here is one final example of an app that you could enable by using the script manager or our new Scripts API. This example enables Conversions on Demand: + +```html showLineNumbers copy +<script type='text/javascript'>// <![CDATA[ + var cod_page_guid = 'CHECKOUT'; + var COD_CONFIG = {'platform':'bigcommerce', 'stoken':'as2_bcmarket_org'}; + (function(){ + var divCOD = document.createElement('div'); + divCOD.id = 'codScripts'; + var bodytag = document.getElementsByTagName('body')[0]; + bodytag.appendChild(divCOD); + var cod = document.createElement('script'); + cod.type = 'text/javascript'; + cod.src = 'https://www.conversionsondemand.com/codadmin2/framework/cod-scripts-loader.js'; + var s = document.getElementById('codScripts'); + s.parentNode.insertBefore(cod, s); + })(COD_CONFIG); +// ]]></script> +``` + +### Google Analytics: Addrexx Address Verification + +The Addrexx app is integrated to the Checkout or Order Confirmation page via the BigCommerce control panel's Google Analytics box, rather than through injection directly into either Stencil template file. Here is the corresponding script to enter into the control panel: + +```html showLineNumbers copy +<!-- START Addrexx --> +<script type="text/javascript"> + wwPage = window.location.href; + if (wwPage.indexOf("billing_address") >= 0 || wwPage.indexOf("create_account") >= 0 || wwPage.indexOf("shipping_address") >= 0 || wwPage.indexOf("checkout") >= 0) { + function loadaddrexx() { + var _cc_url = "xxredda.s3.amazonaws.com/bcmarket/loader.js"; + var _cc_s = document.createElement('script'); + _cc_s.type = 'text/javascript'; + _cc_s.src = (("http:" === document.location.protocol) ? "http:" : "https:") + "//" + _cc_url; + document.getElementsByTagName("head")[0].appendChild(_cc_s); + }; + loadaddrexx(); + } +</script> +<!-- END Addrexx --> +``` + +## Resources + +* [REST Management API: Scripts](/docs/rest-management/scripts) + +### Related Articles +* [Adding a GeoTrust SSL Seal to Your Store's Footer (Help Center)](https://support.bigcommerce.com/s/article/Adding-a-GeoTrust-SSL-seal-to-your--footer) + +### Additional Resources +* [Olark (Olark)](https://www.olark.com/integrations/bigcommerce) +* [Rebillia (Rebillia)](https://www.rebillia.com/documentation/stencil-or-blueprint) +* [Set up conversion tracking for your website (Google)](https://support.google.com/google-ads/answer/6095821) +* [Addrexx (BigCommerce App Marketplace)](https://www.bigcommerce.com/apps/addrexx/) diff --git a/docs/stencil-docs/storefront-customization/using-disqus.mdx b/docs/storefront/stencil/themes/templates/disqus.mdx similarity index 100% rename from docs/stencil-docs/storefront-customization/using-disqus.mdx rename to docs/storefront/stencil/themes/templates/disqus.mdx diff --git a/docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx b/docs/storefront/stencil/themes/templates/dynamic-rendering.mdx similarity index 97% rename from docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx rename to docs/storefront/stencil/themes/templates/dynamic-rendering.mdx index 679b6f98b..648d3a2d1 100644 --- a/docs/stencil-docs/javascript-and-event-hooks/rendering-html-with-ajax.mdx +++ b/docs/storefront/stencil/themes/templates/dynamic-rendering.mdx @@ -1,43 +1,43 @@ -# Rendering HTML with Ajax - -Stencil allows you to render dynamic components on the fly. For example, note this default code in <span class="fp">templates/components/products/quick-view.html</span> (note also this file name, which Handlebars will reference later in this example): - - -```handlebars filename="templates/components/products/quick-view.html" showLineNumbers copy -<div class="modal-body quickView"> - {{> components/products/product-view schema=false}} -</div> -``` - -To render a different template, you would instead reference that template’s file name. For example, assume that you want to substitute a custom template that you’ve named: `templates/components/products/quicker-view.html`. - -This next code block is from the Stencil default theme’s `/assets/js/theme/global/quick-view.js` file. Note the `quicker-view.html` statements brought in to reference the new file name: - - -```js filename="/assets/js/theme/global/quick-view.js" showLineNumbers copy -let $modal = $('#modal'), - $modalContent = $('.modal-content', $modal), - $modalOverlay = $('.loadingOverlay', $modal), - modalModifierClasses = 'modal--large'; - -$('body').on('click', '.quickview', (event) => { - let productId = $(event.currentTarget).data('product-id'); - - event.preventDefault(); - - // clear the modal - $modalContent.html(''); - $modalOverlay.show(); - - // open modal - $modal.foundation('reveal', 'open'); - - //quicker-view.html statement, replacing the standard template's quick-view.html template - utils.api.product.getById(productId, {template: 'products/quicker-view'}, function done(err, response) { - $modalOverlay.hide(); - $modalContent.html(response); - - return new ProductDetails($modalContent, context); - }); -}); -``` +# Rendering HTML with Ajax + +Stencil allows you to render dynamic components on the fly. For example, note this default code in <span class="fp">templates/components/products/quick-view.html</span> (note also this file name, which Handlebars will reference later in this example): + + +```handlebars filename="templates/components/products/quick-view.html" showLineNumbers copy +<div class="modal-body quickView"> + {{> components/products/product-view schema=false}} +</div> +``` + +To render a different template, you would instead reference that template’s file name. For example, assume that you want to substitute a custom template that you’ve named: `templates/components/products/quicker-view.html`. + +This next code block is from the Stencil default theme’s `/assets/js/theme/global/quick-view.js` file. Note the `quicker-view.html` statements brought in to reference the new file name: + + +```js filename="/assets/js/theme/global/quick-view.js" showLineNumbers copy +let $modal = $('#modal'), + $modalContent = $('.modal-content', $modal), + $modalOverlay = $('.loadingOverlay', $modal), + modalModifierClasses = 'modal--large'; + +$('body').on('click', '.quickview', (event) => { + let productId = $(event.currentTarget).data('product-id'); + + event.preventDefault(); + + // clear the modal + $modalContent.html(''); + $modalOverlay.show(); + + // open modal + $modal.foundation('reveal', 'open'); + + //quicker-view.html statement, replacing the standard template's quick-view.html template + utils.api.product.getById(productId, {template: 'products/quicker-view'}, function done(err, response) { + $modalOverlay.hide(); + $modalContent.html(response); + + return new ProductDetails($modalContent, context); + }); +}); +``` diff --git a/docs/stencil-docs/storefront-customization/custom-templates.mdx b/docs/storefront/stencil/themes/templates/index.mdx similarity index 98% rename from docs/stencil-docs/storefront-customization/custom-templates.mdx rename to docs/storefront/stencil/themes/templates/index.mdx index 65d8346d0..2f249b838 100644 --- a/docs/stencil-docs/storefront-customization/custom-templates.mdx +++ b/docs/storefront/stencil/themes/templates/index.mdx @@ -174,7 +174,7 @@ This section provides solutions to some known problems that may occur when you a If you are having trouble viewing custom brand templates locally, ensure that the URL used in your `.stencil` or `config.stencil.json` file (if you're using Stencil V3.1 release or later) adheres to the following path sequence: /brands/brandname -This is necessary because all the brand pages are located under the /brands/ URL path. Also, remember that all brand URLs are Unicode-encoded and adhere to Unicode formatting For example if your URL uses a hypen, you should it with *%252d*. +This is necessary because all the brand pages are located under the /brands/ URL path. Also, remember that all brand URLs are Unicode-encoded and adhere to Unicode formatting. For example, if your URL uses hyphens, you should encode them as `%252d`. ### Outdated Stencil CLI diff --git a/docs/stencil-docs/developing-further/modifying-forms.mdx b/docs/storefront/stencil/themes/templates/login.mdx similarity index 100% rename from docs/stencil-docs/developing-further/modifying-forms.mdx rename to docs/storefront/stencil/themes/templates/login.mdx diff --git a/docs/stencil-docs/customizing-checkout/custom-order-confirmation.mdx b/docs/storefront/stencil/themes/templates/order-confirmation.mdx similarity index 100% rename from docs/stencil-docs/customizing-checkout/custom-order-confirmation.mdx rename to docs/storefront/stencil/themes/templates/order-confirmation.mdx diff --git a/docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx b/docs/storefront/stencil/utils/events.mdx similarity index 97% rename from docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx rename to docs/storefront/stencil/utils/events.mdx index 025bfa410..96bb0c4b9 100644 --- a/docs/stencil-docs/javascript-and-event-hooks/event-hooks.mdx +++ b/docs/storefront/stencil/utils/events.mdx @@ -1,113 +1,113 @@ - -# Using Event Hooks - - - -Stencil themes provide access to remote resources through data tags and event hooks. Developers can use these hooks to trigger defined events. A theme can hook to an event to perform actions or calculations based on shopper behavior. - -Stencil themes incorporate event hooks by importing the stencil-utils module. If take a look at [cornerstone/assets/js/theme/](https://github.com/bigcommerce/cornerstone/tree/master/assets/js/theme), you will see the import statement `'import utils from '@bigcommerce/stencil-utils';` at the top of files using leveraging event hooks. - -## Cookie Notification Example - -In the example below, the `cookie-privacy-notification` hook enables customization of the alert window that displays European Union–required cookie notifications: - -First, ensure you have loaded the `stencil-utils` package with the following command: - -`import utils from '@bigcommerce/stencil-utils';` - -European websites must notify users of cookies to comply with European Union law. -The following code implements a hook that will alert shoppers that the website uses cookies. - -```js filename="Example cookie notification hook" showLineNumbers copy -export default function() { - - // Here you can override the default browser alert box by - // hooking to the 'cookie-privacy-notification' hook. - utils.hooks.on('cookie-privacy-notification', (event, privacyMessage) => { - - // You can make your own custom modal or alert box - // appear in your theme using the privacyMessage provided - myCustomAlert(privacyMessage); - - // Call event.preventDefault() to prevent the default - // browser alert from occurring in stencil-utils - event.preventDefault(); - }); -} -``` - -A theme would listen for the `cookie-privacy-notification` event to override the browser’s default notification UI. - -## Cart Dialog Example - -In the following code snippet from Cornerstone in [templates/components/products/product-view.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/products/product-view.html), note the data tag named `data‑cart‑item‑add`: - -```handlebars filename="templates/components/products/product-view.html: data‑cart‑item‑add" showLineNumbers copy -<form class="form" method="post" action="{{product.cart_url}}" - enctype="multipart/form-data" data-cart-item-add> -``` - -This data tag enables the emission of the `cart‑item‑add` event in this next snippet: - -```js filename="Emitter, cart‑item‑add event" showLineNumbers copy -/* - * Import all product-specific js - */ -[...] -import utils from '@bigcommerce/stencil-utils'; -[...] -addProductToCart() { - utils.hooks.on('cart-item-add', (event) => { - event.preventDefault(); - }); -} -``` - -## Stencil Data Tags and Event Hooks -Stencil themes provide the following chains of data tags, delegated DOM (Document Object Model) events, emitted Stencil event hooks, and Stencil event parameter(s). - -### Cart Item Added - -Hook for items added to the customer’s shopping cart. - -```js filename="Function signature: cart item added" showLineNumbers copy -itemAdd() { - this.$body.on('submit', '[data-cart-item-add]', (event) => { - this.emit('cart-item-add', event, event.target); - }); -} -``` - - - -| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameters | -|---|---|---|--| -| data-cart-item-add | submit | cart-item-add | event, event.target | - -### Faceted-Search Events - -Hooks for faceted-search selections that the customer initiates or submits. - - -```js filename="Function signature: faceted-search events" showLineNumbers copy -searchEvents() { - this.$body.on('click', '[data-faceted-search-facet]', (event) => { - this.emit('facetedSearch-facet-clicked', event); - }); - - this.$body.on('submit', '[data-faceted-search-range]', (event) => { - this.emit('facetedSearch-range-submitted', event); - }); -} -``` - -| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameter(s) | -|---|---|---|--| -| data-faceted-search-facet | click | facetedSearch-facet-clicked | event | -| data-faceted-search-range | submit | facetedSearch-range-submitted | event | - - -## Resources - -### Additional Resources -* [cookieNotification.js](https://github.com/bigcommerce/cornerstone/blob/637ef1b0ff130333aea128663daa6d1a4d37fb78/assets/js/theme/global/cookieNotification.js) (BigCommerce GitHub) + +# Using Event Hooks + + + +Stencil themes provide access to remote resources through data tags and event hooks. Developers can use these hooks to trigger defined events. A theme can hook to an event to perform actions or calculations based on shopper behavior. + +Stencil themes incorporate event hooks by importing the stencil-utils module. If take a look at [cornerstone/assets/js/theme/](https://github.com/bigcommerce/cornerstone/tree/master/assets/js/theme), you will see the import statement `'import utils from '@bigcommerce/stencil-utils';` at the top of files using leveraging event hooks. + +## Cookie Notification Example + +In the example below, the `cookie-privacy-notification` hook enables customization of the alert window that displays European Union–required cookie notifications: + +First, ensure you have loaded the `stencil-utils` package with the following command: + +`import utils from '@bigcommerce/stencil-utils';` + +European websites must notify users of cookies to comply with European Union law. +The following code implements a hook that will alert shoppers that the website uses cookies. + +```js filename="Example cookie notification hook" showLineNumbers copy +export default function() { + + // Here you can override the default browser alert box by + // hooking to the 'cookie-privacy-notification' hook. + utils.hooks.on('cookie-privacy-notification', (event, privacyMessage) => { + + // You can make your own custom modal or alert box + // appear in your theme using the privacyMessage provided + myCustomAlert(privacyMessage); + + // Call event.preventDefault() to prevent the default + // browser alert from occurring in stencil-utils + event.preventDefault(); + }); +} +``` + +A theme would listen for the `cookie-privacy-notification` event to override the browser’s default notification UI. + +## Cart Dialog Example + +In the following code snippet from Cornerstone in [templates/components/products/product-view.html](https://github.com/bigcommerce/cornerstone/blob/master/templates/components/products/product-view.html), note the data tag named `data‑cart‑item‑add`: + +```handlebars filename="templates/components/products/product-view.html: data‑cart‑item‑add" showLineNumbers copy +<form class="form" method="post" action="{{product.cart_url}}" + enctype="multipart/form-data" data-cart-item-add> +``` + +This data tag enables the emission of the `cart‑item‑add` event in this next snippet: + +```js filename="Emitter, cart‑item‑add event" showLineNumbers copy +/* + * Import all product-specific js + */ +[...] +import utils from '@bigcommerce/stencil-utils'; +[...] +addProductToCart() { + utils.hooks.on('cart-item-add', (event) => { + event.preventDefault(); + }); +} +``` + +## Stencil Data Tags and Event Hooks +Stencil themes provide the following chains of data tags, delegated DOM (Document Object Model) events, emitted Stencil event hooks, and Stencil event parameter(s). + +### Cart Item Added + +Hook for items added to the customer’s shopping cart. + +```js filename="Function signature: cart item added" showLineNumbers copy +itemAdd() { + this.$body.on('submit', '[data-cart-item-add]', (event) => { + this.emit('cart-item-add', event, event.target); + }); +} +``` + + + +| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameters | +|---|---|---|--| +| data-cart-item-add | submit | cart-item-add | event, event.target | + +### Faceted-Search Events + +Hooks for faceted-search selections that the customer initiates or submits. + + +```js filename="Function signature: faceted-search events" showLineNumbers copy +searchEvents() { + this.$body.on('click', '[data-faceted-search-facet]', (event) => { + this.emit('facetedSearch-facet-clicked', event); + }); + + this.$body.on('submit', '[data-faceted-search-range]', (event) => { + this.emit('facetedSearch-range-submitted', event); + }); +} +``` + +| Data Tag | Delegated DOM Event | Stencil Event/Hook | Stencil Event Parameter(s) | +|---|---|---|--| +| data-faceted-search-facet | click | facetedSearch-facet-clicked | event | +| data-faceted-search-range | submit | facetedSearch-range-submitted | event | + + +## Resources + +### Additional Resources +* [cookieNotification.js](https://github.com/bigcommerce/cornerstone/blob/637ef1b0ff130333aea128663daa6d1a4d37fb78/assets/js/theme/global/cookieNotification.js) (BigCommerce GitHub) diff --git a/docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx b/docs/storefront/stencil/utils/queries.mdx similarity index 97% rename from docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx rename to docs/storefront/stencil/utils/queries.mdx index 0f9bfeaf0..843252a53 100644 --- a/docs/stencil-docs/javascript-and-event-hooks/remote-api-tutorial.mdx +++ b/docs/storefront/stencil/utils/queries.mdx @@ -1,78 +1,78 @@ -# Using Remote API - -Client-side JavaScript can access event hooks directly, without using Handlebars statements. By setting up listeners for these events, you can exercise granular control over your storefront’s user interface. For example, you can open custom windows when certain events occur. - -Below is an example implemented within a Stencil theme. This code adds an item to the shopping cart, and displays the result in a custom modal dialog rather than a cart page. - -This particular example uses certain conventions of ES6 JavaScript (also known as ECMAScript 6 or ECMAScript 2015). - -Here is the signature of the cart.itemAdd function used below, with parameters for product ID, quantity, and options: - -`itemAdd(FormData, callback)` - -Here is the signature of the cart.getContent function used further down: - -`getContent(options, callback)` - -This first complete code snippet calls cart.itemAdd, catches any errors, and displays the cart contents in a modal dialog: - -```js filename="cart.itemAdd" showLineNumbers copy - // Add item to cart -utils.api.cart.itemAdd(new FormData(form), (err, response) => { - const errorMessage = err || response.data.error; - - $addToCartBtn - .val(originalBtnVal) - .prop('disabled', false); - - this.$overlay.hide(); - - // Guard statement - if (errorMessage) { - // Strip the HTML from the error message - const tmp = document.createElement('DIV'); - tmp.innerHTML = errorMessage; - - return alert(tmp.textContent || tmp.innerText); - } - - // Open preview modal and update content - if (this.previewModal) { - this.previewModal.open(); - - this.updateCartContent(this.previewModal, response.data.cart_item.hash); - } else { - this.$overlay.show(); - // if no modal, redirect to the cart page - this.redirectTo(response.data.cart_item.cart_url || this.context.urls.cart); - } -}); -``` - -This final code snippet calls `cart.getContent` to fetch the cart contents, then display it in a preview format, which is specified by a template option with a value of `cart/preview`: - -```js filename="cart.getContent" showLineNumbers copy - /** - * Get cart contents - * - * @param {String} cartItemHash - * @param {Function} onComplete - */ - getCartContent(cartItemHash, onComplete) { - const options = { - template: 'cart/preview', - params: { - suggest: cartItemHash, - }, - config: { - cart: { - suggestions: { - limit: 4, - }, - }, - }, - }; - - utils.api.cart.getContent(options, onComplete); - } -``` +# Using Remote API + +Client-side JavaScript can access event hooks directly, without using Handlebars statements. By setting up listeners for these events, you can exercise granular control over your storefront’s user interface. For example, you can open custom windows when certain events occur. + +Below is an example implemented within a Stencil theme. This code adds an item to the shopping cart, and displays the result in a custom modal dialog rather than a cart page. + +This particular example uses certain conventions of ES6 JavaScript (also known as ECMAScript 6 or ECMAScript 2015). + +Here is the signature of the cart.itemAdd function used below, with parameters for product ID, quantity, and options: + +`itemAdd(FormData, callback)` + +Here is the signature of the cart.getContent function used further down: + +`getContent(options, callback)` + +This first complete code snippet calls cart.itemAdd, catches any errors, and displays the cart contents in a modal dialog: + +```js filename="cart.itemAdd" showLineNumbers copy + // Add item to cart +utils.api.cart.itemAdd(new FormData(form), (err, response) => { + const errorMessage = err || response.data.error; + + $addToCartBtn + .val(originalBtnVal) + .prop('disabled', false); + + this.$overlay.hide(); + + // Guard statement + if (errorMessage) { + // Strip the HTML from the error message + const tmp = document.createElement('DIV'); + tmp.innerHTML = errorMessage; + + return alert(tmp.textContent || tmp.innerText); + } + + // Open preview modal and update content + if (this.previewModal) { + this.previewModal.open(); + + this.updateCartContent(this.previewModal, response.data.cart_item.hash); + } else { + this.$overlay.show(); + // if no modal, redirect to the cart page + this.redirectTo(response.data.cart_item.cart_url || this.context.urls.cart); + } +}); +``` + +This final code snippet calls `cart.getContent` to fetch the cart contents, then display it in a preview format, which is specified by a template option with a value of `cart/preview`: + +```js filename="cart.getContent" showLineNumbers copy + /** + * Get cart contents + * + * @param {String} cartItemHash + * @param {Function} onComplete + */ + getCartContent(cartItemHash, onComplete) { + const options = { + template: 'cart/preview', + params: { + suggest: cartItemHash, + }, + config: { + cart: { + suggestions: { + limit: 4, + }, + }, + }, + }; + + utils.api.cart.getContent(options, onComplete); + } +``` diff --git a/docs/stencil-docs/reference-docs/stencil-utils-api-reference.mdx b/docs/storefront/stencil/utils/reference.mdx similarity index 100% rename from docs/stencil-docs/reference-docs/stencil-utils-api-reference.mdx rename to docs/storefront/stencil/utils/reference.mdx diff --git a/docs/api-docs/storefront/graphql/rendering-widgets.mdx b/docs/storefront/widgets/draft/rendering-widgets.mdx similarity index 100% rename from docs/api-docs/storefront/graphql/rendering-widgets.mdx rename to docs/storefront/widgets/draft/rendering-widgets.mdx diff --git a/docs/api-docs/storefront/widgets/widgets-code-samples.mdx b/docs/storefront/widgets/examples.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widgets-code-samples.mdx rename to docs/storefront/widgets/examples.mdx diff --git a/docs/api-docs/storefront/widgets/global-regions-tutorial.mdx b/docs/storefront/widgets/guide/global-regions.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/global-regions-tutorial.mdx rename to docs/storefront/widgets/guide/global-regions.mdx diff --git a/docs/api-docs/storefront/widgets/product-widget-tutorial.mdx b/docs/storefront/widgets/guide/graphql-templates.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/product-widget-tutorial.mdx rename to docs/storefront/widgets/guide/graphql-templates.mdx diff --git a/docs/api-docs/storefront/widgets/widgets-tutorial.mdx b/docs/storefront/widgets/guide/index.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widgets-tutorial.mdx rename to docs/storefront/widgets/guide/index.mdx diff --git a/docs/api-docs/storefront/widgets/widget-versioning-tutorial.mdx b/docs/storefront/widgets/guide/versioning.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widget-versioning-tutorial.mdx rename to docs/storefront/widgets/guide/versioning.mdx diff --git a/docs/api-docs/storefront/widgets/widgets-overview.mdx b/docs/storefront/widgets/index.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widgets-overview.mdx rename to docs/storefront/widgets/index.mdx diff --git a/docs/api-docs/storefront/widgets/schema.json b/docs/storefront/widgets/input-reference/schema.json similarity index 96% rename from docs/api-docs/storefront/widgets/schema.json rename to docs/storefront/widgets/input-reference/schema.json index 963871a66..d93a8986f 100644 --- a/docs/api-docs/storefront/widgets/schema.json +++ b/docs/storefront/widgets/input-reference/schema.json @@ -1,23 +1,23 @@ -{ - "name": "Header Images", - "template": "{{#each images}}<a href='{{image_url}}'><img src={{image_source}} style='width:33.3%'/></a>{{/each}}", - "schema": [ - { - "type": "tab", - "label": "Content", - "sections": [ - { - "label": "Product cards", - "settings": [ - { - "type": "boolean", - "label": "Show product name", - "id": "showProductName", - "default": true - } - ] - } - ] - } - ] +{ + "name": "Header Images", + "template": "{{#each images}}<a href='{{image_url}}'><img src={{image_source}} style='width:33.3%'/></a>{{/each}}", + "schema": [ + { + "type": "tab", + "label": "Content", + "sections": [ + { + "label": "Product cards", + "settings": [ + { + "type": "boolean", + "label": "Show product name", + "id": "showProductName", + "default": true + } + ] + } + ] + } + ] } \ No newline at end of file diff --git a/docs/stencil-docs/page-builder/widget-ui-schema.mdx b/docs/storefront/widgets/input-reference/schema.mdx similarity index 100% rename from docs/stencil-docs/page-builder/widget-ui-schema.mdx rename to docs/storefront/widgets/input-reference/schema.mdx diff --git a/docs/stencil-docs/page-builder/widget_alignment.yaml b/docs/storefront/widgets/input-reference/settings/alignment.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_alignment.yaml rename to docs/storefront/widgets/input-reference/settings/alignment.yaml diff --git a/docs/stencil-docs/page-builder/widget_boolean.yaml b/docs/storefront/widgets/input-reference/settings/boolean.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_boolean.yaml rename to docs/storefront/widgets/input-reference/settings/boolean.yaml diff --git a/docs/stencil-docs/page-builder/widget_box_model.yaml b/docs/storefront/widgets/input-reference/settings/box-model.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_box_model.yaml rename to docs/storefront/widgets/input-reference/settings/box-model.yaml diff --git a/docs/stencil-docs/page-builder/widget_code.yaml b/docs/storefront/widgets/input-reference/settings/code.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_code.yaml rename to docs/storefront/widgets/input-reference/settings/code.yaml diff --git a/docs/stencil-docs/page-builder/widget_color.yaml b/docs/storefront/widgets/input-reference/settings/color.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_color.yaml rename to docs/storefront/widgets/input-reference/settings/color.yaml diff --git a/docs/stencil-docs/page-builder/widget_element_settings.yaml b/docs/storefront/widgets/input-reference/settings/element-settings.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_element_settings.yaml rename to docs/storefront/widgets/input-reference/settings/element-settings.yaml diff --git a/docs/stencil-docs/page-builder/widget_image_manager.yaml b/docs/storefront/widgets/input-reference/settings/image-manager.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_image_manager.yaml rename to docs/storefront/widgets/input-reference/settings/image-manager.yaml diff --git a/docs/stencil-docs/page-builder/widget_input.yaml b/docs/storefront/widgets/input-reference/settings/input.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_input.yaml rename to docs/storefront/widgets/input-reference/settings/input.yaml diff --git a/docs/stencil-docs/page-builder/widget_number.yaml b/docs/storefront/widgets/input-reference/settings/number.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_number.yaml rename to docs/storefront/widgets/input-reference/settings/number.yaml diff --git a/docs/stencil-docs/page-builder/widget_product_ID.yaml b/docs/storefront/widgets/input-reference/settings/product-id.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_product_ID.yaml rename to docs/storefront/widgets/input-reference/settings/product-id.yaml diff --git a/docs/stencil-docs/page-builder/widget_product_image.yaml b/docs/storefront/widgets/input-reference/settings/product-image.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_product_image.yaml rename to docs/storefront/widgets/input-reference/settings/product-image.yaml diff --git a/docs/stencil-docs/page-builder/widget_range.yaml b/docs/storefront/widgets/input-reference/settings/range.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_range.yaml rename to docs/storefront/widgets/input-reference/settings/range.yaml diff --git a/docs/stencil-docs/page-builder/widget_regex_input.yaml b/docs/storefront/widgets/input-reference/settings/regex-input.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_regex_input.yaml rename to docs/storefront/widgets/input-reference/settings/regex-input.yaml diff --git a/docs/stencil-docs/page-builder/widget_select.yaml b/docs/storefront/widgets/input-reference/settings/select.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_select.yaml rename to docs/storefront/widgets/input-reference/settings/select.yaml diff --git a/docs/stencil-docs/page-builder/widget_text.yaml b/docs/storefront/widgets/input-reference/settings/text.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_text.yaml rename to docs/storefront/widgets/input-reference/settings/text.yaml diff --git a/docs/stencil-docs/page-builder/widget_typography.yaml b/docs/storefront/widgets/input-reference/settings/typography.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_typography.yaml rename to docs/storefront/widgets/input-reference/settings/typography.yaml diff --git a/docs/stencil-docs/page-builder/widget_visibility.yaml b/docs/storefront/widgets/input-reference/settings/visibility.yaml similarity index 100% rename from docs/stencil-docs/page-builder/widget_visibility.yaml rename to docs/storefront/widgets/input-reference/settings/visibility.yaml diff --git a/docs/api-docs/storefront/widgets/widgets-localizing-settings.mdx b/docs/storefront/widgets/localization.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widgets-localizing-settings.mdx rename to docs/storefront/widgets/localization.mdx diff --git a/docs/api-docs/storefront/widgets/widget-builder.mdx b/docs/storefront/widgets/widget-builder.mdx similarity index 100% rename from docs/api-docs/storefront/widgets/widget-builder.mdx rename to docs/storefront/widgets/widget-builder.mdx diff --git a/docs/bigcommerce-for-wordpress/getting-started/gutenberg-support.mdx b/docs/storefront/wordpress/content/gutenberg.mdx similarity index 96% rename from docs/bigcommerce-for-wordpress/getting-started/gutenberg-support.mdx rename to docs/storefront/wordpress/content/gutenberg.mdx index 7f9679f64..cdbd05b11 100644 --- a/docs/bigcommerce-for-wordpress/getting-started/gutenberg-support.mdx +++ b/docs/storefront/wordpress/content/gutenberg.mdx @@ -1,28 +1,28 @@ -# Gutenberg Support - -The WordPress Gutenberg Visual Editor provides users the ability to easily compose a page by adding and arranging blocks of content. Some blocks come with WordPress by default -- paragraph, image, list, and audio blocks, for example. Additionally, WordPress plugins can extend Gutenberg by adding their own blocks to the Visual Editor's Add Block dropdown. The BigCommerce for WordPress plugin is packed with custom blocks that put the power of BigCommerce in the hands of WordPress developers. - -## Available BigCommerce Blocks - -| Block Name| Description| Settings| -|:--|:--|:--| -| BigCommerce Products| displays a list of products by brands, categories or individual products.| Edit Products, Additional CSS Class | -| BigCommerce Cart | displays the items currently in the customer’s cart | Additional CSS Class | -| BigCommerce Checkout | displays an embedded checkout form | Additional CSS Class | -| BigCommerce Account Profile | displays a customer information update form | Additional CSS Class | -| BigCommerce Address List | displays a list of customer shipping addresses with edit UI | Additional CSS Class | -| BigCommerce Order History | displays list of the customer’s past orders. | Additional CSS Class | -| BigCommerce Login Form | displays customer login form | Additional CSS Class | -| BigCommerce Gift Certificates | displays gift certificate UI | Additional CSS Class | -| BigCommerce Gift Certificate Balance | displays gift certificate balance | Additional CSS Class | -| BigCommerce Product Reviews | displays product reviews for a product | Product ID, Additional CSS Class | -| BigCommerce Product Components | displays a product's component(s) (sku, image, title, description, add to cart) | Product ID, Product Component, Additional CSS Class | - -<Callout type="info"> - #### Shortcodes - BigCommerce blocks can also be added to a wordpress page or post by using Short Codes in Gutenberg's Code Editor. For more information and a list of available shortcodes, see: [Shortcodes](/docs/storefront/wordpress/content/shortcodes). -</Callout> - -## Creating Your Own Blocks - -The source code behind the BigCommerce for WordPress Gutenberg blocks is available on [GitHub](https://github.com/bigcommerce/bigcommerce-for-wordpress/tree/master/src/BigCommerce/Editor/Gutenberg/Blocks). Developers can use these blocks as a starting point for creating their own, customized BigCommerce Gutenbenberg editor blocks. +# Gutenberg Support + +The WordPress Gutenberg Visual Editor provides users the ability to easily compose a page by adding and arranging blocks of content. Some blocks come with WordPress by default -- paragraph, image, list, and audio blocks, for example. Additionally, WordPress plugins can extend Gutenberg by adding their own blocks to the Visual Editor's Add Block dropdown. The BigCommerce for WordPress plugin is packed with custom blocks that put the power of BigCommerce in the hands of WordPress developers. + +## Available BigCommerce Blocks + +| Block Name| Description| Settings| +|:--|:--|:--| +| BigCommerce Products| displays a list of products by brands, categories or individual products.| Edit Products, Additional CSS Class | +| BigCommerce Cart | displays the items currently in the customer’s cart | Additional CSS Class | +| BigCommerce Checkout | displays an embedded checkout form | Additional CSS Class | +| BigCommerce Account Profile | displays a customer information update form | Additional CSS Class | +| BigCommerce Address List | displays a list of customer shipping addresses with edit UI | Additional CSS Class | +| BigCommerce Order History | displays list of the customer’s past orders. | Additional CSS Class | +| BigCommerce Login Form | displays customer login form | Additional CSS Class | +| BigCommerce Gift Certificates | displays gift certificate UI | Additional CSS Class | +| BigCommerce Gift Certificate Balance | displays gift certificate balance | Additional CSS Class | +| BigCommerce Product Reviews | displays product reviews for a product | Product ID, Additional CSS Class | +| BigCommerce Product Components | displays a product's component(s) (sku, image, title, description, add to cart) | Product ID, Product Component, Additional CSS Class | + +<Callout type="info"> + #### Shortcodes + BigCommerce blocks can also be added to a wordpress page or post by using Short Codes in Gutenberg's Code Editor. For more information and a list of available shortcodes, see: [Shortcodes](/docs/storefront/wordpress/content/shortcodes). +</Callout> + +## Creating Your Own Blocks + +The source code behind the BigCommerce for WordPress Gutenberg blocks is available on [GitHub](https://github.com/bigcommerce/bigcommerce-for-wordpress/tree/master/src/BigCommerce/Editor/Gutenberg/Blocks). Developers can use these blocks as a starting point for creating their own, customized BigCommerce Gutenberg editor blocks. diff --git a/docs/bigcommerce-for-wordpress/setup/shortcodes.mdx b/docs/storefront/wordpress/content/shortcodes.mdx similarity index 98% rename from docs/bigcommerce-for-wordpress/setup/shortcodes.mdx rename to docs/storefront/wordpress/content/shortcodes.mdx index 2d6c1d8a6..6fc3fd66a 100644 --- a/docs/bigcommerce-for-wordpress/setup/shortcodes.mdx +++ b/docs/storefront/wordpress/content/shortcodes.mdx @@ -35,7 +35,7 @@ While the shortcode can be built using the button, it can also be created manual `[bc-component]` -The component shortcode lets you include an attribute for a particular product in pages and posts across your WordPress site. Within the Block Editor, click the plus symbol on the area of the page you want to add the component to and select BigCommerce Product Components. This creates a Gutenburg block containing a product's information. You must specify a Product ID, then select the product component you'd like to display. +The component shortcode lets you include an attribute for a particular product in pages and posts across your WordPress site. Within the Block Editor, click the plus symbol on the area of the page you want to add the component to and select BigCommerce Product Components. This creates a Gutenberg block containing a product's information. You must specify a Product ID, then select the product component you'd like to display. You can build the shortcode using the Block Editor, or it can be created manually. It accepts a number of attributes: diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/bigcommerce-for-wordpress-cron.mdx b/docs/storefront/wordpress/deployment/creating-reliable-cron-jobs.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/bigcommerce-for-wordpress-cron.mdx rename to docs/storefront/wordpress/deployment/creating-reliable-cron-jobs.mdx diff --git a/docs/bigcommerce-for-wordpress/getting-started/site-launch-checklist.mdx b/docs/storefront/wordpress/deployment/index.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/getting-started/site-launch-checklist.mdx rename to docs/storefront/wordpress/deployment/index.mdx diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/customization-guide.html b/docs/storefront/wordpress/draft/customization-guide.html similarity index 100% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/customization-guide.html rename to docs/storefront/wordpress/draft/customization-guide.html diff --git a/docs/bigcommerce-for-wordpress/changelog/plugin-changelog.mdx b/docs/storefront/wordpress/draft/plugin-changelog.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/changelog/plugin-changelog.mdx rename to docs/storefront/wordpress/draft/plugin-changelog.mdx diff --git a/docs/bigcommerce-for-wordpress/getting-started/introduction.mdx b/docs/storefront/wordpress/index.mdx similarity index 98% rename from docs/bigcommerce-for-wordpress/getting-started/introduction.mdx rename to docs/storefront/wordpress/index.mdx index b706f119b..bdeaeeac4 100644 --- a/docs/bigcommerce-for-wordpress/getting-started/introduction.mdx +++ b/docs/storefront/wordpress/index.mdx @@ -1,49 +1,49 @@ -# Introduction - -BigCommerce for WordPress allows you to power content-driven WordPress storefronts with the ecommerce functionality of BigCommerce. Product data is pulled into WordPress as a custom post type, giving you the freedom to embed products in posts and pages to create a tailored shopping experience. The plugin utilizes the full suite of BigCommerce APIs, allowing shoppers to seamlessly complete a purchase end-to-end on WordPress. - -You can use the BigCommerce for WordPress plugin as a building block to create an ecommerce solution that’s unique to your brand. Whether you want to link multiple WordPress storefronts to a single BigCommerce store or extend the open source plugin to create custom-made solutions, BigCommerce for WordPress makes it easy to combine the power of BigCommerce with the flexible presentation of WordPress. - -## How it works - -BigCommerce for WordPress connects your WordPress site to your BigCommerce store via API, and pulls all of the relevant data into a variety of database tables, some custom, some default WordPress. Products are a post type: product data is stored in the post table and product meta is stored in the post_meta table. - -Orders data is stored on the BigCommerce servers and is accessible in your WordPress site via API with custom code and via a nice UI in the BigCommerce admin. - -Most store options and settings are managed inside the BigCommerce UI, including Shipping, Taxes, and Payment Gateways. - -### Templating - -All templates that render on the front end are found in the `/wp-content/plugins/bigcommerce/templates/public` directory. To override any template, create a `bigcommerce` directory in your theme and copy the template file to that directory. - -For example, copy - -```copy -wp-content/plugins/bigcommerce/templates/public/single-bigcommerce_product.php -``` - -to - -```copy -wp-content/themes/<theme-name>/bigcommerce/single-bigcommerce_product.php -``` -Then, edit `wp-content/themes/<theme-name>/bigcommerce/single-bigcommerce_product.php` to override the default content. - -<Callout type="info"> - Most templates are used for rendering content inside the content area of your theme's template. Only a few take over the entire page template. These may need modifications to match your theme. -</Callout> - -### Shopper Experience - -When a customer visits the store, the products they see are stored locally in WordPress. A cart is optional–when the customer clicks add-to-cart, they can either be directed to a cart page or delivered directly to the checkout page. -When a shopper proceeds to checkout, they land on the BigCommerce checkout page in an embedded iframe, which can be styled to match your WordPress site. This creates a seamless experience for the shopper because they remain on your WordPress site and domain for the entire shopping experience. BigCommerce embedded checkout also allows you to leverage the built-in security and PCI-compliance of the BigCommerce checkout. - -### Channels - -Channels allow you to manage products in BigCommerce and sell them on other storefronts, like one or more WordPress sites, or in marketplaces, like Amazon and Facebook by Meta. A key concept is that the products listed on other channels are managed centrally from your BigCommerce store, so inventory is tracked neatly across all channels. This means that if all of your product ends up being sold through Amazon, your Facebook by Meta store will also be sold out. - -### WordPress as a Channel - -When using the WordPress plugin for BigCommerce, each connected WordPress site is considered another channel. This means that your WordPress store is aware of inventory levels, because those are monitored centrally in your BigCommerce store, and when an order is placed, it appears in the BigCommerce Order View UI along with orders received on other channels. Orders are labeled with the channel they originated from, to help you track sales data across multiple channels. - -While merchants traditionally sell primarily through their BigCommerce store and supplement with channels, it is possible to mask the main BigCommerce store and treat any given channel as the primary store. This would allow you to use WordPress as your primary store. +# Introduction + +BigCommerce for WordPress allows you to power content-driven WordPress storefronts with the ecommerce functionality of BigCommerce. Product data is pulled into WordPress as a custom post type, giving you the freedom to embed products in posts and pages to create a tailored shopping experience. The plugin utilizes the full suite of BigCommerce APIs, allowing shoppers to seamlessly complete a purchase end-to-end on WordPress. + +You can use the BigCommerce for WordPress plugin as a building block to create an ecommerce solution that’s unique to your brand. Whether you want to link multiple WordPress storefronts to a single BigCommerce store or extend the open source plugin to create custom-made solutions, BigCommerce for WordPress makes it easy to combine the power of BigCommerce with the flexible presentation of WordPress. + +## How it works + +BigCommerce for WordPress connects your WordPress site to your BigCommerce store via API, and pulls all of the relevant data into a variety of database tables, some custom, some default WordPress. Products are a post type: product data is stored in the post table and product meta is stored in the post_meta table. + +Orders data is stored on the BigCommerce servers and is accessible in your WordPress site via API with custom code and via a nice UI in the BigCommerce admin. + +Most store options and settings are managed inside the BigCommerce UI, including Shipping, Taxes, and Payment Gateways. + +### Templating + +All templates that render on the front end are found in the `/wp-content/plugins/bigcommerce/templates/public` directory. To override any template, create a `bigcommerce` directory in your theme and copy the template file to that directory. + +For example, copy + +```copy +wp-content/plugins/bigcommerce/templates/public/single-bigcommerce_product.php +``` + +to + +```copy +wp-content/themes/<theme-name>/bigcommerce/single-bigcommerce_product.php +``` +Then, edit `wp-content/themes/<theme-name>/bigcommerce/single-bigcommerce_product.php` to override the default content. + +<Callout type="info"> + Most templates are used for rendering content inside the content area of your theme's template. Only a few take over the entire page template. These may need modifications to match your theme. +</Callout> + +### Shopper Experience + +When a customer visits the store, the products they see are stored locally in WordPress. A cart is optional–when the customer clicks add-to-cart, they can either be directed to a cart page or delivered directly to the checkout page. +When a shopper proceeds to checkout, they land on the BigCommerce checkout page in an embedded iframe, which can be styled to match your WordPress site. This creates a seamless experience for the shopper because they remain on your WordPress site and domain for the entire shopping experience. BigCommerce embedded checkout also allows you to leverage the built-in security and PCI-compliance of the BigCommerce checkout. + +### Channels + +Channels allow you to manage products in BigCommerce and sell them on other storefronts, like one or more WordPress sites, or in marketplaces, like Amazon and Facebook by Meta. A key concept is that the products listed on other channels are managed centrally from your BigCommerce store, so inventory is tracked neatly across all channels. This means that if all of your product ends up being sold through Amazon, your Facebook by Meta store will also be sold out. + +### WordPress as a Channel + +When using the WordPress plugin for BigCommerce, each connected WordPress site is considered another channel. This means that your WordPress store is aware of inventory levels, because those are monitored centrally in your BigCommerce store, and when an order is placed, it appears in the BigCommerce Order View UI along with orders received on other channels. Orders are labeled with the channel they originated from, to help you track sales data across multiple channels. + +While merchants traditionally sell primarily through their BigCommerce store and supplement with channels, it is possible to mask the main BigCommerce store and treat any given channel as the primary store. This would allow you to use WordPress as your primary store. diff --git a/docs/bigcommerce-for-wordpress/getting-started/app-compatibility.mdx b/docs/storefront/wordpress/platform-integration/app-compatibility.mdx similarity index 98% rename from docs/bigcommerce-for-wordpress/getting-started/app-compatibility.mdx rename to docs/storefront/wordpress/platform-integration/app-compatibility.mdx index a83840077..8511772eb 100644 --- a/docs/bigcommerce-for-wordpress/getting-started/app-compatibility.mdx +++ b/docs/storefront/wordpress/platform-integration/app-compatibility.mdx @@ -1,27 +1,27 @@ -# App Compatibility - -When you use BigCommerce for WordPress, your storefront is rendered by WordPress rather than BigCommerce, so some apps that you use for a BigCommerce-powered storefront may no longer be compatible. - -## Supported Apps - -For the most part, any app that operates solely on the backend can be used without modification on WordPress. This includes apps that interface with our catalog, order, shipping, and customer APIs. You can find hundreds of compatible apps in these categories: - -* [Accounting & Tax](https://www.bigcommerce.com/apps/categories/accounting-tax/) -* [Catalog & Order Management](https://www.bigcommerce.com/apps/categories/catalog-order-management/) -* [Data Transfer & Migration Services](https://www.bigcommerce.com/apps/categories/data-transfer-migration-services/) -* [ERP](https://www.bigcommerce.com/apps/categories/erp/) -* [Sales Channels](https://www.bigcommerce.com/apps/categories/sales-channels/) -* [Shipping & Fulfillment](https://www.bigcommerce.com/apps/categories/shipping-fulfillment/) - -## Unsupported Apps - -Apps that modify the storefront are currently not supported. This includes [Customer Acquisition & Retention](https://www.bigcommerce.com/apps/categories/marketing/customer-acquisition-retention/) apps show banners, pop-ups, or other storefront modifications. - -Although a specific BigCommerce app may not be available, you may be able to find an alternative in the WordPress Plugin Directory. For example, some companies, like [Mailchimp](https://mailchimp.com/), build both BigCommerce apps and WordPress plugins. Keep that in mind when searching for a solution. - -<Callout type="info"> - #### Bolt Checkout for BigCommerce - It's also possible to integrate into BigCommerce for WordPress by creating additional plugins that hook into and extend functionality; for example, Bolt's WordPress plugin: [Bolt Checkout for BigCommerce](https://wordpress.org/plugins/bolt-checkout-bigcommerce/). For more information on how Bolt used BigCommerce for WordPress to build their plugin, see [How Bolt Built an Internet-Wide Checkout UX](https://medium.com/bigcommerce-developer-blog/how-bolt-built-an-internet-wide-checkout-ux-34c285fdb322). -</Callout> - -If you are a BigCommerce app developer and would like to help our merchants on WordPress too, reach out to our App Marketplace team at [appstore@bigcommerce.com](mailto:appstore@bigcommerce.com). +# App Compatibility + +When you use BigCommerce for WordPress, your storefront is rendered by WordPress rather than BigCommerce, so some apps that you use for a BigCommerce-powered storefront may no longer be compatible. + +## Supported Apps + +For the most part, any app that operates solely on the backend can be used without modification on WordPress. This includes apps that interface with our catalog, order, shipping, and customer APIs. You can find hundreds of compatible apps in these categories: + +* [Accounting & Tax](https://www.bigcommerce.com/apps/categories/accounting-tax/) +* [Catalog & Order Management](https://www.bigcommerce.com/apps/categories/catalog-order-management/) +* [Data Transfer & Migration Services](https://www.bigcommerce.com/apps/categories/data-transfer-migration-services/) +* [ERP](https://www.bigcommerce.com/apps/categories/erp/) +* [Sales Channels](https://www.bigcommerce.com/apps/categories/sales-channels/) +* [Shipping & Fulfillment](https://www.bigcommerce.com/apps/categories/shipping-fulfillment/) + +## Unsupported Apps + +Apps that modify the storefront are currently not supported. This includes [Customer Acquisition & Retention](https://www.bigcommerce.com/apps/categories/marketing/customer-acquisition-retention/) apps show banners, pop-ups, or other storefront modifications. + +Although a specific BigCommerce app may not be available, you may be able to find an alternative in the WordPress Plugin Directory. For example, some companies, like [Mailchimp](https://mailchimp.com/), build both BigCommerce apps and WordPress plugins. Keep that in mind when searching for a solution. + +<Callout type="info"> + #### Bolt Checkout for BigCommerce + It's also possible to integrate into BigCommerce for WordPress by creating additional plugins that hook into and extend functionality; for example, Bolt's WordPress plugin: [Bolt Checkout for BigCommerce](https://wordpress.org/plugins/bolt-checkout-bigcommerce/). For more information on how Bolt used BigCommerce for WordPress to build their plugin, see [How Bolt Built an Internet-Wide Checkout UX](https://medium.com/bigcommerce-developer-blog/how-bolt-built-an-internet-wide-checkout-ux-34c285fdb322). +</Callout> + +If you are a BigCommerce app developer and would like to help our merchants on WordPress too, reach out to our App Marketplace team at [appstore@bigcommerce.com](mailto:appstore@bigcommerce.com). diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/code-reference.mdx b/docs/storefront/wordpress/platform-integration/code.mdx similarity index 98% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/code-reference.mdx rename to docs/storefront/wordpress/platform-integration/code.mdx index 111d4bc9d..afde7bf6d 100644 --- a/docs/bigcommerce-for-wordpress/extending-the-plugin/code-reference.mdx +++ b/docs/storefront/wordpress/platform-integration/code.mdx @@ -1,11 +1,11 @@ -# BigCommerce for WordPress Plugin Code Reference - -To search the BigCommerce for WordPress (BC4WP) codebase for detailed entries on available hooks, functions, classes, and methods, visit the [BigCommerce Plugin Code Reference](https://bigcommerce.moderntribe.qa/). - -## Usage notes - -The following list contains additional notes on the usage of the hooks, functions, classes, and methods found in the [BigCommerce Plugin Code Reference](https://bigcommerce.moderntribe.qa/) that allow you to extend and customize the BC4WP plugin: - -### Classes - +# BigCommerce for WordPress Plugin Code Reference + +To search the BigCommerce for WordPress (BC4WP) codebase for detailed entries on available hooks, functions, classes, and methods, visit the [BigCommerce Plugin Code Reference](https://bigcommerce.moderntribe.qa/). + +## Usage notes + +The following list contains additional notes on the usage of the hooks, functions, classes, and methods found in the [BigCommerce Plugin Code Reference](https://bigcommerce.moderntribe.qa/) that allow you to extend and customize the BC4WP plugin: + +### Classes + - Refinery - filters product results on product archive or product category archive pages. \ No newline at end of file diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/amp-for-the-plugin.mdx b/docs/storefront/wordpress/platform-integration/enabling-amp.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/amp-for-the-plugin.mdx rename to docs/storefront/wordpress/platform-integration/enabling-amp.mdx diff --git a/docs/bigcommerce-for-wordpress/getting-started/supported-features.mdx b/docs/storefront/wordpress/platform-integration/features.mdx similarity index 97% rename from docs/bigcommerce-for-wordpress/getting-started/supported-features.mdx rename to docs/storefront/wordpress/platform-integration/features.mdx index 97305e69f..49568952b 100644 --- a/docs/bigcommerce-for-wordpress/getting-started/supported-features.mdx +++ b/docs/storefront/wordpress/platform-integration/features.mdx @@ -1,55 +1,55 @@ -# BigCommerce for WordPress Features - -## Supported features - -The BigCommerce for WordPress (BC4WP) plugin supports the following features: - -* Complex product catalog (600 SKUs per product, 250 product values for a single option) -* Product pick lists and bundled products -* Product variants and product variant pricing -* Product promotions -* Secure shopper accounts and logins with PCI compliant checkout -* Ability to overwrite and customize template files -* ShipperHQ integration -* Gutenberg and Classic Editor integration -* Google accelerated mobile pages -* Google address autocomplete -* Facebook by Meta Pixel -* Enterprise systems integrations (connect to existing ERP suites, PIM software, OMS solutions, POS systems, or marketing automation tools) -* Faceted search with FacetWP and search with SearchWP -* Multi-site selling -* Multi-channel selling (eBay, Amazon, Facebook by Meta, Instagram by Meta, Google Shopping, Square, and more) and Central Management (bulk listing, automatic inventory syncing, unified order and fulfillment management) -* Shopper wishlists -* Shipping calculator -* Abandoned cart recovery -* Theme styling within customizer -* Coupon codes - -## Unsupported features - -BC4WP does not support the following features: - -* Product file upload field -* Warranty, availability fields -* Persistent cart -* Cart preview -* Cart page promotional banners -* Real-time syncing with BigCommerce catalog updates -* Google Analytics Enhanced Ecommerce - -### Supported payment gateways - -BigCommerce has over 65 payment gateway integrations available out-of-the box, serving 100+ countries and over 250 local payment methods. BC4WP supports the following payment gateways: - -* PayPal Express (now called PayPal Checkout) -* PayPal through Braintree -* All non-hosted (API) gateways that are supported by Optimized One-Page Checkout - -### Unsupported payment gateways - -BC4WP does not support the following payment gateways: - -* Amazon Pay -* AfterPay -* Google Pay -* Masterpass +# BigCommerce for WordPress Features + +## Supported features + +The BigCommerce for WordPress (BC4WP) plugin supports the following features: + +* Complex product catalog (600 SKUs per product, 250 product values for a single option) +* Product pick lists and bundled products +* Product variants and product variant pricing +* Product promotions +* Secure shopper accounts and logins with PCI compliant checkout +* Ability to overwrite and customize template files +* ShipperHQ integration +* Gutenberg and Classic Editor integration +* Google accelerated mobile pages +* Google address autocomplete +* Facebook by Meta Pixel +* Enterprise systems integrations (connect to existing ERP suites, PIM software, OMS solutions, POS systems, or marketing automation tools) +* Faceted search with FacetWP and search with SearchWP +* Multi-site selling +* Multi-channel selling (eBay, Amazon, Facebook by Meta, Instagram by Meta, Google Shopping, Square, and more) and Central Management (bulk listing, automatic inventory syncing, unified order and fulfillment management) +* Shopper wishlists +* Shipping calculator +* Abandoned cart recovery +* Theme styling within customizer +* Coupon codes + +## Unsupported features + +BC4WP does not support the following features: + +* Product file upload field +* Warranty, availability fields +* Persistent cart +* Cart preview +* Cart page promotional banners +* Real-time syncing with BigCommerce catalog updates +* Google Analytics Enhanced Ecommerce + +### Supported payment gateways + +BigCommerce has over 65 payment gateway integrations available out-of-the box, serving 100+ countries and over 250 local payment methods. BC4WP supports the following payment gateways: + +* PayPal Express (now called PayPal Checkout) +* PayPal through Braintree +* All non-hosted (API) gateways that are supported by Optimized One-Page Checkout + +### Unsupported payment gateways + +BC4WP does not support the following payment gateways: + +* Amazon Pay +* AfterPay +* Google Pay +* Masterpass diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/multi-channel-capabilities.mdx b/docs/storefront/wordpress/platform-integration/multi-channel.mdx similarity index 98% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/multi-channel-capabilities.mdx rename to docs/storefront/wordpress/platform-integration/multi-channel.mdx index 236cb2cca..26a720905 100644 --- a/docs/bigcommerce-for-wordpress/extending-the-plugin/multi-channel-capabilities.mdx +++ b/docs/storefront/wordpress/platform-integration/multi-channel.mdx @@ -34,7 +34,7 @@ add_filter( 'bigcommerce/channel/current', function( $channel ) { The filter above displays the connected channel associated to the WordPress `term_id` passed to `get_term()` (`31` in the example). An easy way to find your connected channel's `term_id` is by hovering over the **Make Primary** link in BigCommerce Channel Settings in the WordPress Admin (note the `term_id` shown in the URL indicated by the red arrow): -![Geting the term_id](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BigCommerce%20for%20WordPress/multi-channel-capabilities-0.png) +![Getting the term_id](https://storage.googleapis.com/bigcommerce-production-dev-center/images/BigCommerce%20for%20WordPress/multi-channel-capabilities-0.png) ## Plugin Example diff --git a/docs/bigcommerce-for-wordpress/setup/product-import.mdx b/docs/storefront/wordpress/platform-integration/product-import.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/setup/product-import.mdx rename to docs/storefront/wordpress/platform-integration/product-import.mdx diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/proxy-rest-api-endpoints.mdx b/docs/storefront/wordpress/platform-integration/rest-proxy.mdx similarity index 99% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/proxy-rest-api-endpoints.mdx rename to docs/storefront/wordpress/platform-integration/rest-proxy.mdx index 87ccfa18f..9f471854b 100644 --- a/docs/bigcommerce-for-wordpress/extending-the-plugin/proxy-rest-api-endpoints.mdx +++ b/docs/storefront/wordpress/platform-integration/rest-proxy.mdx @@ -1,28 +1,28 @@ -# Proxy REST API Endpoints - -BigCommerce for WordPress sets up several proxy REST endpoints that map requests to the BigCommerce API. This allows developers to build extensions using client-side requests without having to worry about cross-origin restrictions. This feature is useful for building extensions such as single-page store apps or progressive web apps, and it powers the AMP integration provided when the official AMP plugin for WordPress is active on the same site. - -By default, these proxy REST endpoints are available under `your-wordpress-site.com/wp-json/bc/v3/`, with request routes mapping to those documented in the BigCommerce Dev Center's API Reference. For example, `your-wordpress-site.com/wp-json/bc/v3/catalog/products` returns data from the corresponding BigCommerce API endpoint and accepts all the same parameters. - -Most of the WordPress proxy REST endpoints are publicly queryable, with authentication happening automatically using plugin settings. For security purposes, however, some potentially sensitive data is filtered out of the WordPress response. Those fields are noted in the table below. - -## Caching and Webhooks - -By default, GET requests under `/catalog` are cached for ten minutes in the object cache -- or via WordPress transients if object caching is not available -- and a BigCommerce webhook is used to bust cached data related to a product when it is updated in BigCommerce or its inventory data changes. This default caching implementation can be overridden using the `bigcommerce/proxy/result_pre` WordPress filter. See the plugin customization guide for details on overriding core plugin functionality. - -## Endpoints - -|URL|Description|Methods|Excluded Fields -|:-|:-|:-|:-| -|[Catalog products endpoints](/docs/rest-catalog/products)|Endpoints for products and product-related data such as reviews, categories, and variants|`GET`|bin_picking_number, cost_price, date_created, date_modified, inventory_tracking, layout_file, product_tax_code, search_keywords, sku_id, tax_class_id, total_sold, view_count; **If price_id_hidden is true**: map_price, price, retail_price, sale_price; **If is_condition_shown is false**: condition; **If is_preorder_only is true**: preorder_message, prorder_release_date -|[Product variants endpoints](/docs/rest-catalog/product-variants)|Fetch variants associated with a product|`GET`|cost_price, sku_id; **If associated product's is_price_hidden is true**: calculated_price, map_price, price, retail_price, sale_price -|[Product images endpoints](/docs/rest-catalog/products/images)|Fetch images associated with a product|`GET`|date_modified -|[Product reviews endpoints](/docs/rest-catalog/products/reviews)|Fetch reviews associated with a product|`GET`|date_created, date_modified, date_reviewed, email, status (**note: reviews are filtered out if status is not `approved`**) -|[Catalog categories endpoints](/docs/rest-catalog/categories)|Fetch category listings or individual categories by ID|`GET`|views -|[Additional catalog endpoints](/docs/rest-catalog/categories/images)| See BigCommerce API docs |`GET` -|[Channels endpoints] (/docs/rest-management/channels)|BigCommerce channels endpoints|`GET` -|[Channel site endpoints] (/docs/rest-management/channels/channel-site)|`GET`| -|[Create a cart endpoints](/docs/rest-storefront/carts#create-a-cart)|Creates a cart|`POST`, `PUT` -|[Carts endpoints](/docs/rest-storefront/carts)|Fetch, update, and delete a cart by cart ID|`GET`, `POST`, `PUT`, `DELETE`| -|[Cart items endpoints](/docs/rest-storefront/carts/cart-items)|Create, update, and delete cart items|`POST`, `PUT`, `DELETE`| -|[Create a cart redirect URLs](/docs/rest-management/carts/redirects)|Fetch a cart's redirect URLs|`POST`, `PUT`| +# Proxy REST API Endpoints + +BigCommerce for WordPress sets up several proxy REST endpoints that map requests to the BigCommerce API. This allows developers to build extensions using client-side requests without having to worry about cross-origin restrictions. This feature is useful for building extensions such as single-page store apps or progressive web apps, and it powers the AMP integration provided when the official AMP plugin for WordPress is active on the same site. + +By default, these proxy REST endpoints are available under `your-wordpress-site.com/wp-json/bc/v3/`, with request routes mapping to those documented in the BigCommerce Dev Center's API Reference. For example, `your-wordpress-site.com/wp-json/bc/v3/catalog/products` returns data from the corresponding BigCommerce API endpoint and accepts all the same parameters. + +Most of the WordPress proxy REST endpoints are publicly queryable, with authentication happening automatically using plugin settings. For security purposes, however, some potentially sensitive data is filtered out of the WordPress response. Those fields are noted in the table below. + +## Caching and Webhooks + +By default, GET requests under `/catalog` are cached for ten minutes in the object cache -- or via WordPress transients if object caching is not available -- and a BigCommerce webhook is used to bust cached data related to a product when it is updated in BigCommerce or its inventory data changes. This default caching implementation can be overridden using the `bigcommerce/proxy/result_pre` WordPress filter. See the plugin customization guide for details on overriding core plugin functionality. + +## Endpoints + +|URL|Description|Methods|Excluded Fields +|:-|:-|:-|:-| +|[Catalog products endpoints](/docs/rest-catalog/products)|Endpoints for products and product-related data such as reviews, categories, and variants|`GET`|bin_picking_number, cost_price, date_created, date_modified, inventory_tracking, layout_file, product_tax_code, search_keywords, sku_id, tax_class_id, total_sold, view_count; **If price_id_hidden is true**: map_price, price, retail_price, sale_price; **If is_condition_shown is false**: condition; **If is_preorder_only is true**: preorder_message, prorder_release_date +|[Product variants endpoints](/docs/rest-catalog/product-variants)|Fetch variants associated with a product|`GET`|cost_price, sku_id; **If associated product's is_price_hidden is true**: calculated_price, map_price, price, retail_price, sale_price +|[Product images endpoints](/docs/rest-catalog/products/images)|Fetch images associated with a product|`GET`|date_modified +|[Product reviews endpoints](/docs/rest-catalog/products/reviews)|Fetch reviews associated with a product|`GET`|date_created, date_modified, date_reviewed, email, status (**note: reviews are filtered out if status is not `approved`**) +|[Catalog categories endpoints](/docs/rest-catalog/categories)|Fetch category listings or individual categories by ID|`GET`|views +|[Additional catalog endpoints](/docs/rest-catalog/categories/images)| See BigCommerce API docs |`GET` +|[Channels endpoints] (/docs/rest-management/channels)|BigCommerce channels endpoints|`GET` +|[Channel site endpoints] (/docs/rest-management/channels/channel-site)|`GET`| +|[Create a cart endpoints](/docs/rest-storefront/carts#create-a-cart)|Creates a cart|`POST`, `PUT` +|[Carts endpoints](/docs/rest-storefront/carts)|Fetch, update, and delete a cart by cart ID|`GET`, `POST`, `PUT`, `DELETE`| +|[Cart items endpoints](/docs/rest-storefront/carts/cart-items)|Create, update, and delete cart items|`POST`, `PUT`, `DELETE`| +|[Create a cart redirect URLs](/docs/rest-management/carts/redirects)|Fetch a cart's redirect URLs|`POST`, `PUT`| diff --git a/docs/bigcommerce-for-wordpress/setup/troubleshooting.mdx b/docs/storefront/wordpress/platform-integration/unexpected-behavior.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/setup/troubleshooting.mdx rename to docs/storefront/wordpress/platform-integration/unexpected-behavior.mdx diff --git a/docs/bigcommerce-for-wordpress/getting-started/install.mdx b/docs/storefront/wordpress/start/index.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/getting-started/install.mdx rename to docs/storefront/wordpress/start/index.mdx diff --git a/docs/bigcommerce-for-wordpress/setup/multi-site.mdx b/docs/storefront/wordpress/start/multi-site.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/setup/multi-site.mdx rename to docs/storefront/wordpress/start/multi-site.mdx diff --git a/docs/bigcommerce-for-wordpress/setup/plugin-settings.mdx b/docs/storefront/wordpress/start/plugin-settings.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/setup/plugin-settings.mdx rename to docs/storefront/wordpress/start/plugin-settings.mdx diff --git a/docs/bigcommerce-for-wordpress/extending-the-plugin/customization-guide.mdx b/docs/storefront/wordpress/themes/index.mdx similarity index 100% rename from docs/bigcommerce-for-wordpress/extending-the-plugin/customization-guide.mdx rename to docs/storefront/wordpress/themes/index.mdx diff --git a/models/webhooks/README.md b/docs/webhooks/callbacks/README.md similarity index 96% rename from models/webhooks/README.md rename to docs/webhooks/callbacks/README.md index 4056a3f3a..5b6199dee 100644 --- a/models/webhooks/README.md +++ b/docs/webhooks/callbacks/README.md @@ -1,32 +1,32 @@ -# Webhooks - -Object schemas for Webhook events. - -## Directory structure - -```shell -. -├── data # json data for generating and updating yaml schema -├── _all.yml # Groups models together for docs -├── store_app_uninstalled.yml # Individual email template models -├── ... -``` - -## Updating models - -To generate a new model from json data and overwrite the existing schema file: - -1. Copy and paste webhook event `json` into corresponding file in `data/`. -2. Use `models/json2schema.py` to convert the json data to a yaml schema. - -Example: - -```bash -cat data.json | python json2schema.py > schema.yml -``` - -Bash for overwriting all webhook event models: - -```bash -for f in models/webhooks/data/*.json; do cat $f | python models/json2schema.py > ${f%.*}.yml; mv ${f%.*}.yml models/webhooks/; done +# Webhooks + +Object schemas for Webhook events. + +## Directory structure + +```shell +. +├── data # json data for generating and updating yaml schema +├── _all.yml # Groups models together for docs +├── store_app_uninstalled.yml # Individual email template models +├── ... +``` + +## Updating models + +To generate a new model from json data and overwrite the existing schema file: + +1. Copy and paste webhook event `json` into corresponding file in `data/`. +2. Use `models/json2schema.py` to convert the json data to a yaml schema. + +Example: + +```bash +cat data.json | python json2schema.py > schema.yml +``` + +Bash for overwriting all webhook event models: + +```bash +for f in models/webhooks/data/*.json; do cat $f | python models/json2schema.py > ${f%.*}.yml; mv ${f%.*}.yml models/webhooks/; done ``` \ No newline at end of file diff --git a/models/webhooks/_all.yml b/docs/webhooks/callbacks/_all.yml similarity index 81% rename from models/webhooks/_all.yml rename to docs/webhooks/callbacks/_all.yml index 480de3df7..e7bf1f1fb 100644 --- a/models/webhooks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -1,500 +1,500 @@ -type: object -title: 'Webhook Events' -description: -properties: - store/app/uninstalled: - description: Fires when a client store is cancelled and uninstalled from the platform. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_app_uninstalled.yml - store/brand/metafield/created: - description: Fires when a new brand metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_created.yml - store/brand/metafield/deleted: - description: Fires when a brand metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_deleted.yml - store/brand/metafield/updated: - description: Fires when a brand metafield is modified. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_brand_metafield_updated.yml - store/cart/abandoned: - description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_abandoned.yml - store/cart/converted: - description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_converted.yml - store/cart/couponApplied: - description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_couponApplied.yml - store/cart/created: - description: |- - Fires when a new cart is created, which happens with the following two events: - - * A storefront shopper adds the first item to their cart - * A new cart is created using any of the APIs that can create carts - - The store/cart/updated webhook fires simultaneously with store/cart/created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_created.yml - store/cart/deleted: - description: |- - Fires when a cart is deleted. This ends the lifecycle of the cart. Events include the following: - - * When a storefront shopper or API call removes all items from the cart - * When the cart is explicitly removed by API using a DELETE request - - The store/cart/updated webhook fires simultaneously with store/cart/deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_deleted.yml - store/cart/lineItem/created: - description: Fires when a new item is added to a cart. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_created.yml - store/cart/lineItem/deleted: - description: Fires when an item is deleted from a cart. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_deleted.yml - store/cart/lineItem/updated: - description: Fires when a line item’s quantity or product options change. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_lineItem_updated.yml - store/cart/metafield/created: - description: Fires when a new cart metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_created.yml - store/cart/metafield/deleted: - description: Fires when a cart metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_deleted.yml - store/cart/metafield/updated: - description: Fires when a cart metafield is modified through the changes in its line items. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_metafield_updated.yml - store/cart/updated: - description: |- - Fires when a cart is modified, including in the following cases: - - * When a new item is added to a cart - * When an existing item’s quantity is updated - * When an existing item is deleted - * When the email is changed during guest checkout - * When the store/cart/created webhook fires - * When the store/cart/deleted webhook fires - - The payload includes the ID of the cart being updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_cart_updated.yml - store/category/created: - description: Fires when a new category is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_created.yml - store/category/deleted: - description: Fires when a category is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_deleted.yml - store/category/updated: - description: Fires when a category is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_updated.yml - store/category/metafield/created: - description: Fires when a new cart metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_created.yml - store/category/metafield/deleted: - description: Fires when a cart metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_deleted.yml - store/category/metafield/updated: - description: Fires when a cart metafield is modified through the changes in its line items. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_category_metafield_updated.yml - store/channel/metafield/created: - description: Fires when a metafield is created per a specified channel. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_created.yml - store/channel/metafield/deleted: - description: Fires when a metafield is deleted per a specified channel. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_deleted.yml - store/channel/metafield/updated: - description: Fires when a cart metafield is modified through the changes in its line items. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_channel_metafield_updated.yml - store/customer/address/created: - description: Fires when a customer address is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_created.yml - store/customer/address/deleted: - description: Fires when a customer address is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_deleted.yml - store/customer/address/updated: - description: Fires when a customer address is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_address_updated.yml - store/customer/created: - description: Fires when a new customer is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_created.yml - store/customer/deleted: - description: Fires when a customer is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_deleted.yml - store/customer/payment/instrument/default/updated: - description: Fires when a customerʼs default payment instrument is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_payment_instrument_default_updated.yml - store/customer/updated: - description: Fires when a customer is updated. It does not currently track changes to the customer address. <br /><br />Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. - - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_customer_updated.yml - store/information/updated: - description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_information_updated.yml - store/inventory/location/created: - description: Fires when a location is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_created.yml - store/inventory/location/updated: - description: Fires when a location is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_updated.yml - store/inventory/location/metafield/created: - description: Fires when a new inventory location metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_created.yml - store/inventory/location/metafield/deleted: - description: Fires when an inventory location metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_deleted.yml - store/inventory/location/metafield/updated: - description: Fires when an existing inventory location metafield is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_inventory_location_metafield_updated.yml - store/metafield/created: - description: Fires whenever a new metafield on any object is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_created.yml - store/metafield/deleted: - description: Fires whenever a metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_deleted.yml - store/metafield/updated: - description: Fires when an already created metafield is updated. Any changes to an existing metafield on any object (such as inventory, carts, brands, categories, channels, orders, ShipperHQ, etc.) will fire this webhook. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_metafield_updated.yml - store/modifier/updated: - description: Fires when product modifier overrides are edited. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_modifier_updated.yml - store/option/updated: - description: Fires when product options overrides are edited. - - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_option_updated.yml - store/order/archived: - description: Fires when an order is archived. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_archived.yml - store/order/created: - description: Fires when an order is created either in the control panel or by API. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_created.yml - store/order/message/created: - description: Fires when an order message is created by a customer or using the control panel. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_message_created.yml - store/order/metafield/created: - description: Fires if an order metafield is created using the control panel, an app, or the API. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_created.yml - store/order/metafield/deleted: - description: Fires when an order metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_deleted.yml - store/order/metafield/updated: - description: Fires when an existing order metafield is updated. Any changes to an existing order metafield will fire this webhook. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_metafield_updated.yml - store/order/refund/created: - description: Fires when a refund is submitted against an order. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_refund_created.yml - store/order/statusUpdated: - description: Fires when the order status has changed, such as from Pending to Awaiting Payment. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_statusUpdated.yml - store/order/transaction/created: - description: Fires when an order transaction is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_transaction_created.yml - store/order/transaction/updated: - description: Fires when an order transaction is changed. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_transaction_updated.yml - store/order/updated: - description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_order_updated.yml - store/product/created: - description: Fires when new product is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_created.yml - store/product/deleted: - description: Fires when a product is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_deleted.yml - store/product/inventory/order/updated: - description: |- - Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. - - The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_inventory_order_updated.yml - store/product/inventory/updated: - description: |- - Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. - - For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. - - Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_inventory_updated.yml - store/product/metafield/created: - description: Fires when a new product metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_created.yml - store/product/metafield/deleted: - description: Fires when a product metafield is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_deleted.yml - store/product/metafield/updated: - description: Fires when product metafield details are edited. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_metafield_updated.yml - store/product/updated: - description: Fires when product details are edited. `attributes` and `context` fields are present for only override updates. For a full list of product fields that trigger an updated event, see the product updated events that follow. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_product_updated.yml - store/product/variant/metafield/created: - description: Fires when a new product variant metafield is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_created.yml - store/product/variant/metafield/deleted: - description: Fires when a product variant metafield is deleted.. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_deleted.yml - store/product/variant/metafield/updated: - description: Fires when product variant metafield details are edited. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_variant_metafield_updated.yml - store/shipment/created: - description: Fires when a shipment is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_created.yml - store/shipment/deleted: - description: Fires when a shipment is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_deleted.yml - store/shipment/updated: - description: Fires when a shipment is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_shipment_updated.yml - store/sku/created: - description: Fires when a new SKU is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_created.yml - store/sku/deleted: - description: Fires when a SKU is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_deleted.yml - store/sku/inventory/order/updated: - description: |- - Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. - - The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_inventory_order_updated.yml - store/sku/inventory/updated: - description: |- - Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. - - For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_ and the _variant-level_ inventory changes. - - Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_inventory_updated.yml - store/sku/updated: - description: Fires when a SKU is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_sku_updated.yml - store/subscriber/created: - description: Fires when a subscriber is created. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_created.yml - store/subscriber/deleted: - description: Fires when a subscriber is deleted. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_deleted.yml - store/subscriber/updated: - description: Fires when a subscriber is updated. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/webhooks/store_subscriber_updated.yml +type: object +title: 'Webhook Events' +description: +properties: + store/app/uninstalled: + description: Fires when a client store is cancelled and uninstalled from the platform. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_app_uninstalled.yml + store/brand/metafield/created: + description: Fires when a new brand metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_brand_metafield_created.yml + store/brand/metafield/deleted: + description: Fires when a brand metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_brand_metafield_deleted.yml + store/brand/metafield/updated: + description: Fires when a brand metafield is modified. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_brand_metafield_updated.yml + store/cart/abandoned: + description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_abandoned.yml + store/cart/converted: + description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_converted.yml + store/cart/couponApplied: + description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_couponApplied.yml + store/cart/created: + description: |- + Fires when a new cart is created, which happens with the following two events: + + * A storefront shopper adds the first item to their cart + * A new cart is created using any of the APIs that can create carts + + The store/cart/updated webhook fires simultaneously with store/cart/created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_created.yml + store/cart/deleted: + description: |- + Fires when a cart is deleted. This ends the lifecycle of the cart. Events include the following: + + * When a storefront shopper or API call removes all items from the cart + * When the cart is explicitly removed by API using a DELETE request + + The store/cart/updated webhook fires simultaneously with store/cart/deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_deleted.yml + store/cart/lineItem/created: + description: Fires when a new item is added to a cart. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_lineItem_created.yml + store/cart/lineItem/deleted: + description: Fires when an item is deleted from a cart. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml + store/cart/lineItem/updated: + description: Fires when a line item’s quantity or product options change. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_lineItem_updated.yml + store/cart/metafield/created: + description: Fires when a new cart metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_metafield_created.yml + store/cart/metafield/deleted: + description: Fires when a cart metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_metafield_deleted.yml + store/cart/metafield/updated: + description: Fires when a cart metafield is modified through the changes in its line items. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_metafield_updated.yml + store/cart/updated: + description: |- + Fires when a cart is modified, including in the following cases: + + * When a new item is added to a cart + * When an existing item’s quantity is updated + * When an existing item is deleted + * When the email is changed during guest checkout + * When the store/cart/created webhook fires + * When the store/cart/deleted webhook fires + + The payload includes the ID of the cart being updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_cart_updated.yml + store/category/created: + description: Fires when a new category is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_created.yml + store/category/deleted: + description: Fires when a category is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_deleted.yml + store/category/updated: + description: Fires when a category is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_updated.yml + store/category/metafield/created: + description: Fires when a new cart metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_metafield_created.yml + store/category/metafield/deleted: + description: Fires when a cart metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_metafield_deleted.yml + store/category/metafield/updated: + description: Fires when a cart metafield is modified through the changes in its line items. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_category_metafield_updated.yml + store/channel/metafield/created: + description: Fires when a metafield is created per a specified channel. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_channel_metafield_created.yml + store/channel/metafield/deleted: + description: Fires when a metafield is deleted per a specified channel. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_channel_metafield_deleted.yml + store/channel/metafield/updated: + description: Fires when a cart metafield is modified through the changes in its line items. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_channel_metafield_updated.yml + store/customer/address/created: + description: Fires when a customer address is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_address_created.yml + store/customer/address/deleted: + description: Fires when a customer address is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_address_deleted.yml + store/customer/address/updated: + description: Fires when a customer address is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_address_updated.yml + store/customer/created: + description: Fires when a new customer is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_created.yml + store/customer/deleted: + description: Fires when a customer is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_deleted.yml + store/customer/payment/instrument/default/updated: + description: Fires when a customerʼs default payment instrument is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml + store/customer/updated: + description: Fires when a customer is updated. It does not currently track changes to the customer address. <br /><br />Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. + + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_updated.yml + store/information/updated: + description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_information_updated.yml + store/inventory/location/created: + description: Fires when a location is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_inventory_location_created.yml + store/inventory/location/updated: + description: Fires when a location is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_inventory_location_updated.yml + store/inventory/location/metafield/created: + description: Fires when a new inventory location metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml + store/inventory/location/metafield/deleted: + description: Fires when an inventory location metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml + store/inventory/location/metafield/updated: + description: Fires when an existing inventory location metafield is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml + store/metafield/created: + description: Fires whenever a new metafield on any object is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_metafield_created.yml + store/metafield/deleted: + description: Fires whenever a metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_metafield_deleted.yml + store/metafield/updated: + description: Fires when an already created metafield is updated. Any changes to an existing metafield on any object (such as inventory, carts, brands, categories, channels, orders, ShipperHQ, etc.) will fire this webhook. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_metafield_updated.yml + store/modifier/updated: + description: Fires when product modifier overrides are edited. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_modifier_updated.yml + store/option/updated: + description: Fires when product options overrides are edited. + + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_option_updated.yml + store/order/archived: + description: Fires when an order is archived. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_archived.yml + store/order/created: + description: Fires when an order is created either in the control panel or by API. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_created.yml + store/order/message/created: + description: Fires when an order message is created by a customer or using the control panel. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_message_created.yml + store/order/metafield/created: + description: Fires if an order metafield is created using the control panel, an app, or the API. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_metafield_created.yml + store/order/metafield/deleted: + description: Fires when an order metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_metafield_deleted.yml + store/order/metafield/updated: + description: Fires when an existing order metafield is updated. Any changes to an existing order metafield will fire this webhook. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_metafield_updated.yml + store/order/refund/created: + description: Fires when a refund is submitted against an order. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_refund_created.yml + store/order/statusUpdated: + description: Fires when the order status has changed, such as from Pending to Awaiting Payment. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_statusUpdated.yml + store/order/transaction/created: + description: Fires when an order transaction is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_transaction_created.yml + store/order/transaction/updated: + description: Fires when an order transaction is changed. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_transaction_updated.yml + store/order/updated: + description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_updated.yml + store/product/created: + description: Fires when new product is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_created.yml + store/product/deleted: + description: Fires when a product is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_deleted.yml + store/product/inventory/order/updated: + description: |- + Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + + The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_inventory_order_updated.yml + store/product/inventory/updated: + description: |- + Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. + + For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. + + Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_inventory_updated.yml + store/product/metafield/created: + description: Fires when a new product metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_metafield_created.yml + store/product/metafield/deleted: + description: Fires when a product metafield is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_metafield_deleted.yml + store/product/metafield/updated: + description: Fires when product metafield details are edited. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_metafield_updated.yml + store/product/updated: + description: Fires when product details are edited. `attributes` and `context` fields are present for only override updates. For a full list of product fields that trigger an updated event, see the product updated events that follow. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_updated.yml + store/product/variant/metafield/created: + description: Fires when a new product variant metafield is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_variant_metafield_created.yml + store/product/variant/metafield/deleted: + description: Fires when a product variant metafield is deleted.. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_variant_metafield_deleted.yml + store/product/variant/metafield/updated: + description: Fires when product variant metafield details are edited. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_variant_metafield_updated.yml + store/shipment/created: + description: Fires when a shipment is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_shipment_created.yml + store/shipment/deleted: + description: Fires when a shipment is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_shipment_deleted.yml + store/shipment/updated: + description: Fires when a shipment is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_shipment_updated.yml + store/sku/created: + description: Fires when a new SKU is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_created.yml + store/sku/deleted: + description: Fires when a SKU is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_deleted.yml + store/sku/inventory/order/updated: + description: |- + Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + + The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml + store/sku/inventory/updated: + description: |- + Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. + + For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_ and the _variant-level_ inventory changes. + + Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_inventory_updated.yml + store/sku/updated: + description: Fires when a SKU is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_updated.yml + store/subscriber/created: + description: Fires when a subscriber is created. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_subscriber_created.yml + store/subscriber/deleted: + description: Fires when a subscriber is deleted. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_subscriber_deleted.yml + store/subscriber/updated: + description: Fires when a subscriber is updated. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_subscriber_updated.yml diff --git a/models/webhooks/data/list.txt b/docs/webhooks/callbacks/data/list.txt similarity index 96% rename from models/webhooks/data/list.txt rename to docs/webhooks/callbacks/data/list.txt index 8a4de8f1c..48dc94211 100644 --- a/models/webhooks/data/list.txt +++ b/docs/webhooks/callbacks/data/list.txt @@ -1,43 +1,43 @@ -store_app_uninstalled.json -store_cart_abandoned.json -store_cart_converted.json -store_cart_couponApplied.json -store_cart_created.json -store_cart_deleted.json -store_cart_lineItem_created.json -store_cart_lineItem_deleted.json -store_cart_lineItem_updated.json -store_cart_updated.json -store_category_created.json -store_category_deleted.json -store_category_updated.json -store_customer_address_created.json -store_customer_address_deleted.json -store_customer_address_updated.json -store_customer_created.json -store_customer_deleted.json -store_customer_payment_instrument_default_updated.json -store_customer_updated.json -store_information_updated.json -store_order_archived.json -store_order_created.json -store_order_message_created.json -store_order_refund_created.json -store_order_statusUpdated.json -store_order_updated.json -store_product_created.json -store_product_deleted.json -store_product_inventory_order_updated.json -store_product_inventory_updated.json -store_product_updated.json -store_shipment_created.json -store_shipment_deleted.json -store_shipment_updated.json -store_sku_created.json -store_sku_deleted.json -store_sku_inventory_order_updated.json -store_sku_inventory_updated.json -store_sku_updated.json -store_subscriber_created.json -store_subscriber_deleted.json +store_app_uninstalled.json +store_cart_abandoned.json +store_cart_converted.json +store_cart_couponApplied.json +store_cart_created.json +store_cart_deleted.json +store_cart_lineItem_created.json +store_cart_lineItem_deleted.json +store_cart_lineItem_updated.json +store_cart_updated.json +store_category_created.json +store_category_deleted.json +store_category_updated.json +store_customer_address_created.json +store_customer_address_deleted.json +store_customer_address_updated.json +store_customer_created.json +store_customer_deleted.json +store_customer_payment_instrument_default_updated.json +store_customer_updated.json +store_information_updated.json +store_order_archived.json +store_order_created.json +store_order_message_created.json +store_order_refund_created.json +store_order_statusUpdated.json +store_order_updated.json +store_product_created.json +store_product_deleted.json +store_product_inventory_order_updated.json +store_product_inventory_updated.json +store_product_updated.json +store_shipment_created.json +store_shipment_deleted.json +store_shipment_updated.json +store_sku_created.json +store_sku_deleted.json +store_sku_inventory_order_updated.json +store_sku_inventory_updated.json +store_sku_updated.json +store_subscriber_created.json +store_subscriber_deleted.json store_subscriber_updated.json \ No newline at end of file diff --git a/models/webhooks/data/store_app_uninstalled.json b/docs/webhooks/callbacks/data/store_app_uninstalled.json similarity index 100% rename from models/webhooks/data/store_app_uninstalled.json rename to docs/webhooks/callbacks/data/store_app_uninstalled.json diff --git a/models/webhooks/data/store_cart_abandoned.json b/docs/webhooks/callbacks/data/store_cart_abandoned.json similarity index 96% rename from models/webhooks/data/store_cart_abandoned.json rename to docs/webhooks/callbacks/data/store_cart_abandoned.json index e984d20e2..af1359399 100644 --- a/models/webhooks/data/store_cart_abandoned.json +++ b/docs/webhooks/callbacks/data/store_cart_abandoned.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/abandoned", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "09346904-4175-44fd-be53-f7e598531b6c", - "token": "1eed6d2d979776ff18e695ceeb10ea61" - }, - "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", - "created_at": 1561482670, - "producer": "stores/{store_hash}" -} +{ + "scope": "store/cart/abandoned", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "09346904-4175-44fd-be53-f7e598531b6c", + "token": "1eed6d2d979776ff18e695ceeb10ea61" + }, + "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", + "created_at": 1561482670, + "producer": "stores/{store_hash}" +} diff --git a/models/webhooks/data/store_cart_converted.json b/docs/webhooks/callbacks/data/store_cart_converted.json similarity index 96% rename from models/webhooks/data/store_cart_converted.json rename to docs/webhooks/callbacks/data/store_cart_converted.json index 6edd50ccb..330066b32 100644 --- a/models/webhooks/data/store_cart_converted.json +++ b/docs/webhooks/callbacks/data/store_cart_converted.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/converted", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "d30016e2-23c0-4a90-884f-2e92ac135476", - "orderId": 252 - }, - "hash": "b86db7c77d7ef8f90d6a8aefa56de32ccd776923", - "created_at": 1561486893, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/converted", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "d30016e2-23c0-4a90-884f-2e92ac135476", + "orderId": 252 + }, + "hash": "b86db7c77d7ef8f90d6a8aefa56de32ccd776923", + "created_at": 1561486893, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_couponApplied.json b/docs/webhooks/callbacks/data/store_cart_couponApplied.json similarity index 96% rename from models/webhooks/data/store_cart_couponApplied.json rename to docs/webhooks/callbacks/data/store_cart_couponApplied.json index 6ce0507cb..a3ef1b086 100644 --- a/models/webhooks/data/store_cart_couponApplied.json +++ b/docs/webhooks/callbacks/data/store_cart_couponApplied.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/couponApplied", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "09346904-4175-44fd-be53-f7e598531b6c", - "couponId": 1 - }, - "hash": "4b7297d295141b660e8db5a0d99dfcdf459fe825", - "created_at": 1561482761, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/couponApplied", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "09346904-4175-44fd-be53-f7e598531b6c", + "couponId": 1 + }, + "hash": "4b7297d295141b660e8db5a0d99dfcdf459fe825", + "created_at": 1561482761, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_created.json b/docs/webhooks/callbacks/data/store_cart_created.json similarity index 96% rename from models/webhooks/data/store_cart_created.json rename to docs/webhooks/callbacks/data/store_cart_created.json index 433d47475..7af4cb879 100644 --- a/models/webhooks/data/store_cart_created.json +++ b/docs/webhooks/callbacks/data/store_cart_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/cart/created", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "09346904-4175-44fd-be53-f7e598531b6c" - }, - "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", - "created_at": 1561482670, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/created", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "09346904-4175-44fd-be53-f7e598531b6c" + }, + "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", + "created_at": 1561482670, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_deleted.json b/docs/webhooks/callbacks/data/store_cart_deleted.json similarity index 96% rename from models/webhooks/data/store_cart_deleted.json rename to docs/webhooks/callbacks/data/store_cart_deleted.json index b29265332..78ce69da7 100644 --- a/models/webhooks/data/store_cart_deleted.json +++ b/docs/webhooks/callbacks/data/store_cart_deleted.json @@ -1,11 +1,11 @@ -{ - "scope": "store/cart/deleted", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "09346904-4175-44fd-be53-f7e598531b6c" - }, - "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", - "created_at": 1561482670, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/deleted", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "09346904-4175-44fd-be53-f7e598531b6c" + }, + "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", + "created_at": 1561482670, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_lineItem_created.json b/docs/webhooks/callbacks/data/store_cart_lineItem_created.json similarity index 96% rename from models/webhooks/data/store_cart_lineItem_created.json rename to docs/webhooks/callbacks/data/store_cart_lineItem_created.json index 77bbc9bf6..7136bee8f 100644 --- a/models/webhooks/data/store_cart_lineItem_created.json +++ b/docs/webhooks/callbacks/data/store_cart_lineItem_created.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/lineItem/created", - "store_id": "1025646", - "data": { - "type": "cart_line_item", - "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", - "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" - }, - "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", - "created_at": 1561481786, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/lineItem/created", + "store_id": "1025646", + "data": { + "type": "cart_line_item", + "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", + "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" + }, + "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", + "created_at": 1561481786, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_lineItem_deleted.json b/docs/webhooks/callbacks/data/store_cart_lineItem_deleted.json similarity index 96% rename from models/webhooks/data/store_cart_lineItem_deleted.json rename to docs/webhooks/callbacks/data/store_cart_lineItem_deleted.json index 15d38b956..9481abc4a 100644 --- a/models/webhooks/data/store_cart_lineItem_deleted.json +++ b/docs/webhooks/callbacks/data/store_cart_lineItem_deleted.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/lineItem/updated", - "store_id": "1025646", - "data": { - "type": "cart_line_item", - "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", - "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" - }, - "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", - "created_at": 1561481786, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/lineItem/updated", + "store_id": "1025646", + "data": { + "type": "cart_line_item", + "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", + "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" + }, + "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", + "created_at": 1561481786, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_lineItem_updated.json b/docs/webhooks/callbacks/data/store_cart_lineItem_updated.json similarity index 96% rename from models/webhooks/data/store_cart_lineItem_updated.json rename to docs/webhooks/callbacks/data/store_cart_lineItem_updated.json index 5e8b6c6c6..148d571ce 100644 --- a/models/webhooks/data/store_cart_lineItem_updated.json +++ b/docs/webhooks/callbacks/data/store_cart_lineItem_updated.json @@ -1,12 +1,12 @@ -{ - "scope": "store/cart/lineItem/deleted", - "store_id": "1025646", - "data": { - "type": "cart_line_item", - "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", - "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" - }, - "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", - "created_at": 1561481786, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/lineItem/deleted", + "store_id": "1025646", + "data": { + "type": "cart_line_item", + "id": "743bfd94-d5dd-47c5-9c19-6eec32ca6119", + "cartId": "b0386708-fef3-45de-9d8b-fbe3031450a4" + }, + "hash": "399321a1bf1ac1331e12826fb89f264b4c8d21a6", + "created_at": 1561481786, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_cart_updated.json b/docs/webhooks/callbacks/data/store_cart_updated.json similarity index 96% rename from models/webhooks/data/store_cart_updated.json rename to docs/webhooks/callbacks/data/store_cart_updated.json index fe5afee2d..5e75be2a7 100644 --- a/models/webhooks/data/store_cart_updated.json +++ b/docs/webhooks/callbacks/data/store_cart_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/cart/updated", - "store_id": "1025646", - "data": { - "type": "cart", - "id": "09346904-4175-44fd-be53-f7e598531b6c" - }, - "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", - "created_at": 1561482670, - "producer": "stores/{store_hash}" +{ + "scope": "store/cart/updated", + "store_id": "1025646", + "data": { + "type": "cart", + "id": "09346904-4175-44fd-be53-f7e598531b6c" + }, + "hash": "352e4afc6dd3fc85ea26bfdf3f91852604d57528", + "created_at": 1561482670, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_category_created.json b/docs/webhooks/callbacks/data/store_category_created.json similarity index 96% rename from models/webhooks/data/store_category_created.json rename to docs/webhooks/callbacks/data/store_category_created.json index 2c276f62b..695efaca0 100644 --- a/models/webhooks/data/store_category_created.json +++ b/docs/webhooks/callbacks/data/store_category_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/category/created", - "store_id": "1025646", - "data": { - "type": "category", - "id": 42 - }, - "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", - "created_at": 1561480214, - "producer": "stores/{store_hash}" +{ + "scope": "store/category/created", + "store_id": "1025646", + "data": { + "type": "category", + "id": 42 + }, + "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", + "created_at": 1561480214, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_category_deleted.json b/docs/webhooks/callbacks/data/store_category_deleted.json similarity index 96% rename from models/webhooks/data/store_category_deleted.json rename to docs/webhooks/callbacks/data/store_category_deleted.json index d877ce78f..a9d021865 100644 --- a/models/webhooks/data/store_category_deleted.json +++ b/docs/webhooks/callbacks/data/store_category_deleted.json @@ -1,11 +1,11 @@ -{ - "scope": "store/category/deleted", - "store_id": "1025646", - "data": { - "type": "category", - "id": 42 - }, - "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", - "created_at": 1561480214, - "producer": "stores/{store_hash}" +{ + "scope": "store/category/deleted", + "store_id": "1025646", + "data": { + "type": "category", + "id": 42 + }, + "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", + "created_at": 1561480214, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_category_updated.json b/docs/webhooks/callbacks/data/store_category_updated.json similarity index 96% rename from models/webhooks/data/store_category_updated.json rename to docs/webhooks/callbacks/data/store_category_updated.json index fadf4db7b..f52d84b66 100644 --- a/models/webhooks/data/store_category_updated.json +++ b/docs/webhooks/callbacks/data/store_category_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/category/updated", - "store_id": "1025646", - "data": { - "type": "category", - "id": 42 - }, - "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", - "created_at": 1561480214, - "producer": "stores/{store_hash}" +{ + "scope": "store/category/updated", + "store_id": "1025646", + "data": { + "type": "category", + "id": 42 + }, + "hash": "dc3a47c15425d2c895dba674f86fe71a8f3b6459", + "created_at": 1561480214, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_address_created.json b/docs/webhooks/callbacks/data/store_customer_address_created.json similarity index 95% rename from models/webhooks/data/store_customer_address_created.json rename to docs/webhooks/callbacks/data/store_customer_address_created.json index d3bb9ca78..aa153421b 100644 --- a/models/webhooks/data/store_customer_address_created.json +++ b/docs/webhooks/callbacks/data/store_customer_address_created.json @@ -1,14 +1,14 @@ -{ - "scope": "store/customer/address/created", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 60, - "address": { - "customer_id": 32 - } - }, - "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", - "created_at": 1561481620, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/address/created", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 60, + "address": { + "customer_id": 32 + } + }, + "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", + "created_at": 1561481620, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_address_deleted.json b/docs/webhooks/callbacks/data/store_customer_address_deleted.json similarity index 95% rename from models/webhooks/data/store_customer_address_deleted.json rename to docs/webhooks/callbacks/data/store_customer_address_deleted.json index 8d6b17565..a120525a0 100644 --- a/models/webhooks/data/store_customer_address_deleted.json +++ b/docs/webhooks/callbacks/data/store_customer_address_deleted.json @@ -1,14 +1,14 @@ -{ - "scope": "store/customer/address/deleted", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 60, - "address": { - "customer_id": 32 - } - }, - "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", - "created_at": 1561481620, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/address/deleted", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 60, + "address": { + "customer_id": 32 + } + }, + "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", + "created_at": 1561481620, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_address_updated.json b/docs/webhooks/callbacks/data/store_customer_address_updated.json similarity index 95% rename from models/webhooks/data/store_customer_address_updated.json rename to docs/webhooks/callbacks/data/store_customer_address_updated.json index de7511a8c..8b64d17de 100644 --- a/models/webhooks/data/store_customer_address_updated.json +++ b/docs/webhooks/callbacks/data/store_customer_address_updated.json @@ -1,14 +1,14 @@ -{ - "scope": "store/customer/address/update", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 60, - "address": { - "customer_id": 32 - } - }, - "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", - "created_at": 1561481620, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/address/update", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 60, + "address": { + "customer_id": 32 + } + }, + "hash": "416ca9c01779515de91824aa1cac9012ee691e7a", + "created_at": 1561481620, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_created.json b/docs/webhooks/callbacks/data/store_customer_created.json similarity index 96% rename from models/webhooks/data/store_customer_created.json rename to docs/webhooks/callbacks/data/store_customer_created.json index 73655a5e2..59ba778dd 100644 --- a/models/webhooks/data/store_customer_created.json +++ b/docs/webhooks/callbacks/data/store_customer_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/customer/created", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 32 - }, - "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", - "created_at": 1561481571, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/created", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 32 + }, + "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", + "created_at": 1561481571, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_deleted.json b/docs/webhooks/callbacks/data/store_customer_deleted.json similarity index 96% rename from models/webhooks/data/store_customer_deleted.json rename to docs/webhooks/callbacks/data/store_customer_deleted.json index 73655a5e2..59ba778dd 100644 --- a/models/webhooks/data/store_customer_deleted.json +++ b/docs/webhooks/callbacks/data/store_customer_deleted.json @@ -1,11 +1,11 @@ -{ - "scope": "store/customer/created", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 32 - }, - "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", - "created_at": 1561481571, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/created", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 32 + }, + "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", + "created_at": 1561481571, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_payment_instrument_default_updated.json b/docs/webhooks/callbacks/data/store_customer_payment_instrument_default_updated.json similarity index 96% rename from models/webhooks/data/store_customer_payment_instrument_default_updated.json rename to docs/webhooks/callbacks/data/store_customer_payment_instrument_default_updated.json index 4501c6bf3..3039d3f85 100644 --- a/models/webhooks/data/store_customer_payment_instrument_default_updated.json +++ b/docs/webhooks/callbacks/data/store_customer_payment_instrument_default_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/customer/payment/instrument/default/updated", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 32 - }, - "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", - "created_at": 1561481571, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/payment/instrument/default/updated", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 32 + }, + "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", + "created_at": 1561481571, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_customer_updated.json b/docs/webhooks/callbacks/data/store_customer_updated.json similarity index 96% rename from models/webhooks/data/store_customer_updated.json rename to docs/webhooks/callbacks/data/store_customer_updated.json index 73655a5e2..59ba778dd 100644 --- a/models/webhooks/data/store_customer_updated.json +++ b/docs/webhooks/callbacks/data/store_customer_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/customer/created", - "store_id": "1025646", - "data": { - "type": "customer", - "id": 32 - }, - "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", - "created_at": 1561481571, - "producer": "stores/{store_hash}" +{ + "scope": "store/customer/created", + "store_id": "1025646", + "data": { + "type": "customer", + "id": 32 + }, + "hash": "8768ab15aa86c6d73c7e4c3efbaee072110ad1d2", + "created_at": 1561481571, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_information_updated.json b/docs/webhooks/callbacks/data/store_information_updated.json similarity index 96% rename from models/webhooks/data/store_information_updated.json rename to docs/webhooks/callbacks/data/store_information_updated.json index 33cd81d6f..04d4d1295 100644 --- a/models/webhooks/data/store_information_updated.json +++ b/docs/webhooks/callbacks/data/store_information_updated.json @@ -1,10 +1,10 @@ -{ - "scope": "store/information/updated", - "store_id": "123446", - "data": { - "type": "store" - }, - "hash": "c553845e0a5e28dc8b0ea494458692a25586a294", - "created_at": 1535489273, - "producer": "stores/{store_hash}" +{ + "scope": "store/information/updated", + "store_id": "123446", + "data": { + "type": "store" + }, + "hash": "c553845e0a5e28dc8b0ea494458692a25586a294", + "created_at": 1535489273, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_metafield_created.json b/docs/webhooks/callbacks/data/store_metafield_created.json similarity index 100% rename from models/webhooks/data/store_metafield_created.json rename to docs/webhooks/callbacks/data/store_metafield_created.json diff --git a/models/webhooks/data/store_order_archived.json b/docs/webhooks/callbacks/data/store_order_archived.json similarity index 95% rename from models/webhooks/data/store_order_archived.json rename to docs/webhooks/callbacks/data/store_order_archived.json index 8537526b0..abe133959 100644 --- a/models/webhooks/data/store_order_archived.json +++ b/docs/webhooks/callbacks/data/store_order_archived.json @@ -1,11 +1,11 @@ -{ - "scope": "store/order/archived", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250 - }, - "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", - "created_at": 1561479335, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/archived", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250 + }, + "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", + "created_at": 1561479335, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_order_created.json b/docs/webhooks/callbacks/data/store_order_created.json similarity index 95% rename from models/webhooks/data/store_order_created.json rename to docs/webhooks/callbacks/data/store_order_created.json index f55b3d62c..a2e3cea90 100644 --- a/models/webhooks/data/store_order_created.json +++ b/docs/webhooks/callbacks/data/store_order_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/order/created", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250 - }, - "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", - "created_at": 1561479335, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/created", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250 + }, + "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", + "created_at": 1561479335, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_order_message_created.json b/docs/webhooks/callbacks/data/store_order_message_created.json similarity index 95% rename from models/webhooks/data/store_order_message_created.json rename to docs/webhooks/callbacks/data/store_order_message_created.json index 806cdf4ab..d7eaf6334 100644 --- a/models/webhooks/data/store_order_message_created.json +++ b/docs/webhooks/callbacks/data/store_order_message_created.json @@ -1,14 +1,14 @@ -{ - "scope": "store/order/message/created", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250, - "message": { - "order_message_id": 3 - } - }, - "hash": "cb07cdbdda8b1965e812693d5988154807eeed02", - "created_at": 1561479923, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/message/created", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250, + "message": { + "order_message_id": 3 + } + }, + "hash": "cb07cdbdda8b1965e812693d5988154807eeed02", + "created_at": 1561479923, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_order_refund_created.json b/docs/webhooks/callbacks/data/store_order_refund_created.json similarity index 95% rename from models/webhooks/data/store_order_refund_created.json rename to docs/webhooks/callbacks/data/store_order_refund_created.json index 6ed1e063d..c2dd049e6 100644 --- a/models/webhooks/data/store_order_refund_created.json +++ b/docs/webhooks/callbacks/data/store_order_refund_created.json @@ -1,14 +1,14 @@ -{ - "scope": "store/order/refund/created", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250, - "refund": { - "refund_id": 3 - } - }, - "hash": "cb07cdbdda8b1965e812693d5988154807eeed02", - "created_at": 1561479923, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/refund/created", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250, + "refund": { + "refund_id": 3 + } + }, + "hash": "cb07cdbdda8b1965e812693d5988154807eeed02", + "created_at": 1561479923, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_order_statusUpdated.json b/docs/webhooks/callbacks/data/store_order_statusUpdated.json similarity index 95% rename from models/webhooks/data/store_order_statusUpdated.json rename to docs/webhooks/callbacks/data/store_order_statusUpdated.json index 56d472935..e962467af 100644 --- a/models/webhooks/data/store_order_statusUpdated.json +++ b/docs/webhooks/callbacks/data/store_order_statusUpdated.json @@ -1,15 +1,15 @@ -{ - "scope": "store/order/statusUpdated", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250, - "status": { - "previous_status_id": 0, - "new_status_id": 11 - } - }, - "hash": "7ee67cd1cf2ca60bc1aa9e5fe957d2de373be4ca", - "created_at": 1561479335, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/statusUpdated", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250, + "status": { + "previous_status_id": 0, + "new_status_id": 11 + } + }, + "hash": "7ee67cd1cf2ca60bc1aa9e5fe957d2de373be4ca", + "created_at": 1561479335, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_order_updated.json b/docs/webhooks/callbacks/data/store_order_updated.json similarity index 95% rename from models/webhooks/data/store_order_updated.json rename to docs/webhooks/callbacks/data/store_order_updated.json index cca47bf85..c5f66b3ed 100644 --- a/models/webhooks/data/store_order_updated.json +++ b/docs/webhooks/callbacks/data/store_order_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/order/updated", - "store_id": "1025646", - "data": { - "type": "order", - "id": 250 - }, - "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", - "created_at": 1561479335, - "producer": "stores/{store_hash}" +{ + "scope": "store/order/updated", + "store_id": "1025646", + "data": { + "type": "order", + "id": 250 + }, + "hash": "dd70c0976e06b67aaf671e73f49dcb79230ebf9d", + "created_at": 1561479335, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_product_created.json b/docs/webhooks/callbacks/data/store_product_created.json similarity index 96% rename from models/webhooks/data/store_product_created.json rename to docs/webhooks/callbacks/data/store_product_created.json index a8cf36a34..d940334d1 100644 --- a/models/webhooks/data/store_product_created.json +++ b/docs/webhooks/callbacks/data/store_product_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/product/created", - "store_id": "1025646", - "data": { - "type": "product", - "id": 205 - }, - "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", - "created_at": 1561479233, - "producer": "stores/{store_hash}" +{ + "scope": "store/product/created", + "store_id": "1025646", + "data": { + "type": "product", + "id": 205 + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_product_deleted.json b/docs/webhooks/callbacks/data/store_product_deleted.json similarity index 96% rename from models/webhooks/data/store_product_deleted.json rename to docs/webhooks/callbacks/data/store_product_deleted.json index 81628852d..4bc70da46 100644 --- a/models/webhooks/data/store_product_deleted.json +++ b/docs/webhooks/callbacks/data/store_product_deleted.json @@ -1,11 +1,11 @@ -{ - "scope": "store/product/deleted", - "store_id": "1025646", - "data": { - "type": "product", - "id": 205 - }, - "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", - "created_at": 1561479233, - "producer": "stores/{store_hash}" +{ + "scope": "store/product/deleted", + "store_id": "1025646", + "data": { + "type": "product", + "id": 205 + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_product_inventory_order_updated.json b/docs/webhooks/callbacks/data/store_product_inventory_order_updated.json similarity index 96% rename from models/webhooks/data/store_product_inventory_order_updated.json rename to docs/webhooks/callbacks/data/store_product_inventory_order_updated.json index a080d37d4..43d33bca2 100644 --- a/models/webhooks/data/store_product_inventory_order_updated.json +++ b/docs/webhooks/callbacks/data/store_product_inventory_order_updated.json @@ -1,16 +1,16 @@ -{ - "scope": "store/product/inventory/order/updated", - "store_id": "1025646", - "data": { - "type": "product", - "id": 167, - "inventory": { - "product_id": 167, - "method": "absolute", - "value": 100000000 - } - }, - "hash": "cba9eef399fbd6d384489bca6cacad24794b1086", - "created_at": 1561478843, - "producer": "stores/{store_hash}" +{ + "scope": "store/product/inventory/order/updated", + "store_id": "1025646", + "data": { + "type": "product", + "id": 167, + "inventory": { + "product_id": 167, + "method": "absolute", + "value": 100000000 + } + }, + "hash": "cba9eef399fbd6d384489bca6cacad24794b1086", + "created_at": 1561478843, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_product_inventory_updated.json b/docs/webhooks/callbacks/data/store_product_inventory_updated.json similarity index 96% rename from models/webhooks/data/store_product_inventory_updated.json rename to docs/webhooks/callbacks/data/store_product_inventory_updated.json index 7d9a83c5b..1b795d5b0 100644 --- a/models/webhooks/data/store_product_inventory_updated.json +++ b/docs/webhooks/callbacks/data/store_product_inventory_updated.json @@ -1,16 +1,16 @@ -{ - "scope": "store/product/inventory/updated", - "store_id": "1025646", - "data": { - "type": "product", - "id": 167, - "inventory": { - "product_id": 167, - "method": "absolute", - "value": 100000000 - } - }, - "hash": "cba9eef399fbd6d384489bca6cacad24794b1086", - "created_at": 1561478843, - "producer": "stores/{store_hash}" +{ + "scope": "store/product/inventory/updated", + "store_id": "1025646", + "data": { + "type": "product", + "id": 167, + "inventory": { + "product_id": 167, + "method": "absolute", + "value": 100000000 + } + }, + "hash": "cba9eef399fbd6d384489bca6cacad24794b1086", + "created_at": 1561478843, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_product_updated.json b/docs/webhooks/callbacks/data/store_product_updated.json similarity index 96% rename from models/webhooks/data/store_product_updated.json rename to docs/webhooks/callbacks/data/store_product_updated.json index c55f878d0..08b3a1c5d 100644 --- a/models/webhooks/data/store_product_updated.json +++ b/docs/webhooks/callbacks/data/store_product_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/product/updated", - "store_id": "1025646", - "data": { - "type": "product", - "id": 205 - }, - "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", - "created_at": 1561479233, - "producer": "stores/{store_hash}" +{ + "scope": "store/product/updated", + "store_id": "1025646", + "data": { + "type": "product", + "id": 205 + }, + "hash": "a833a57fadd56a32dc752fb6ca0841dc9602a495", + "created_at": 1561479233, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_shipment_created.json b/docs/webhooks/callbacks/data/store_shipment_created.json similarity index 95% rename from models/webhooks/data/store_shipment_created.json rename to docs/webhooks/callbacks/data/store_shipment_created.json index de02575c4..8f5903a36 100644 --- a/models/webhooks/data/store_shipment_created.json +++ b/docs/webhooks/callbacks/data/store_shipment_created.json @@ -1,12 +1,12 @@ -{ - "scope": "store/shipment/created", - "store_id": "1025646", - "data": { - "type": "shipment", - "id": 12, - "orderId": 251 - }, - "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", - "created_at": 1561482857, - "producer": "stores/{store_hash}" +{ + "scope": "store/shipment/created", + "store_id": "1025646", + "data": { + "type": "shipment", + "id": 12, + "orderId": 251 + }, + "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", + "created_at": 1561482857, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_shipment_deleted.json b/docs/webhooks/callbacks/data/store_shipment_deleted.json similarity index 95% rename from models/webhooks/data/store_shipment_deleted.json rename to docs/webhooks/callbacks/data/store_shipment_deleted.json index 90e76f7ae..38801a451 100644 --- a/models/webhooks/data/store_shipment_deleted.json +++ b/docs/webhooks/callbacks/data/store_shipment_deleted.json @@ -1,12 +1,12 @@ -{ - "scope": "store/shipment/deleted", - "store_id": "1025646", - "data": { - "type": "shipment", - "id": 12, - "orderId": 251 - }, - "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", - "created_at": 1561482857, - "producer": "stores/{store_hash}" +{ + "scope": "store/shipment/deleted", + "store_id": "1025646", + "data": { + "type": "shipment", + "id": 12, + "orderId": 251 + }, + "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", + "created_at": 1561482857, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_shipment_updated.json b/docs/webhooks/callbacks/data/store_shipment_updated.json similarity index 95% rename from models/webhooks/data/store_shipment_updated.json rename to docs/webhooks/callbacks/data/store_shipment_updated.json index 3ee47c444..2f89aa007 100644 --- a/models/webhooks/data/store_shipment_updated.json +++ b/docs/webhooks/callbacks/data/store_shipment_updated.json @@ -1,12 +1,12 @@ -{ - "scope": "store/shipment/updated", - "store_id": "1025646", - "data": { - "type": "shipment", - "id": 12, - "orderId": 251 - }, - "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", - "created_at": 1561482857, - "producer": "stores/{store_hash}" +{ + "scope": "store/shipment/updated", + "store_id": "1025646", + "data": { + "type": "shipment", + "id": 12, + "orderId": 251 + }, + "hash": "8b98021cb0faa7e3a58a0e4182d3696a4bdd24ab", + "created_at": 1561482857, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_sku_created.json b/docs/webhooks/callbacks/data/store_sku_created.json similarity index 95% rename from models/webhooks/data/store_sku_created.json rename to docs/webhooks/callbacks/data/store_sku_created.json index 5591e67f7..c109cda1f 100644 --- a/models/webhooks/data/store_sku_created.json +++ b/docs/webhooks/callbacks/data/store_sku_created.json @@ -1,15 +1,15 @@ -{ - "scope": "store/sku/created", - "store_id": "1025646", - "data": { - "type": "sku", - "id": 461, - "sku": { - "product_id": 206, - "variant_id": 509 - } - }, - "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", - "created_at": 1561480465, - "producer": "stores/{store_hash}" +{ + "scope": "store/sku/created", + "store_id": "1025646", + "data": { + "type": "sku", + "id": 461, + "sku": { + "product_id": 206, + "variant_id": 509 + } + }, + "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", + "created_at": 1561480465, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_sku_deleted.json b/docs/webhooks/callbacks/data/store_sku_deleted.json similarity index 95% rename from models/webhooks/data/store_sku_deleted.json rename to docs/webhooks/callbacks/data/store_sku_deleted.json index 9fb12f6cc..399db4b80 100644 --- a/models/webhooks/data/store_sku_deleted.json +++ b/docs/webhooks/callbacks/data/store_sku_deleted.json @@ -1,15 +1,15 @@ -{ - "scope": "store/sku/deleted", - "store_id": "1025646", - "data": { - "type": "sku", - "id": 461, - "sku": { - "product_id": 206, - "variant_id": 509 - } - }, - "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", - "created_at": 1561480465, - "producer": "stores/{store_hash}" +{ + "scope": "store/sku/deleted", + "store_id": "1025646", + "data": { + "type": "sku", + "id": 461, + "sku": { + "product_id": 206, + "variant_id": 509 + } + }, + "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", + "created_at": 1561480465, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_sku_inventory_order_updated.json b/docs/webhooks/callbacks/data/store_sku_inventory_order_updated.json similarity index 96% rename from models/webhooks/data/store_sku_inventory_order_updated.json rename to docs/webhooks/callbacks/data/store_sku_inventory_order_updated.json index b3fa9614e..16b616b5d 100644 --- a/models/webhooks/data/store_sku_inventory_order_updated.json +++ b/docs/webhooks/callbacks/data/store_sku_inventory_order_updated.json @@ -1,17 +1,17 @@ -{ - "scope": "store/sku/inventory/order/updated", - "store_id": "1025646", - "data": { - "type": "sku", - "id": 461, - "inventory": { - "product_id": 206, - "method": "absolute", - "value": 5, - "variant_id": 509 - } - }, - "hash": "116ddb29d7bc1b2322cc1a4dc295221ee3637d4b", - "created_at": 1561480673, - "producer": "stores/{store_hash}" +{ + "scope": "store/sku/inventory/order/updated", + "store_id": "1025646", + "data": { + "type": "sku", + "id": 461, + "inventory": { + "product_id": 206, + "method": "absolute", + "value": 5, + "variant_id": 509 + } + }, + "hash": "116ddb29d7bc1b2322cc1a4dc295221ee3637d4b", + "created_at": 1561480673, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_sku_inventory_updated.json b/docs/webhooks/callbacks/data/store_sku_inventory_updated.json similarity index 95% rename from models/webhooks/data/store_sku_inventory_updated.json rename to docs/webhooks/callbacks/data/store_sku_inventory_updated.json index b75389610..f32c01588 100644 --- a/models/webhooks/data/store_sku_inventory_updated.json +++ b/docs/webhooks/callbacks/data/store_sku_inventory_updated.json @@ -1,17 +1,17 @@ -{ - "scope": "store/sku/inventory/updated", - "store_id": "1025646", - "data": { - "type": "sku", - "id": 461, - "inventory": { - "product_id": 206, - "method": "absolute", - "value": 5, - "variant_id": 509 - } - }, - "hash": "116ddb29d7bc1b2322cc1a4dc295221ee3637d4b", - "created_at": 1561480673, - "producer": "stores/{store_hash}" +{ + "scope": "store/sku/inventory/updated", + "store_id": "1025646", + "data": { + "type": "sku", + "id": 461, + "inventory": { + "product_id": 206, + "method": "absolute", + "value": 5, + "variant_id": 509 + } + }, + "hash": "116ddb29d7bc1b2322cc1a4dc295221ee3637d4b", + "created_at": 1561480673, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_sku_updated.json b/docs/webhooks/callbacks/data/store_sku_updated.json similarity index 95% rename from models/webhooks/data/store_sku_updated.json rename to docs/webhooks/callbacks/data/store_sku_updated.json index fc468884d..00eb8b11d 100644 --- a/models/webhooks/data/store_sku_updated.json +++ b/docs/webhooks/callbacks/data/store_sku_updated.json @@ -1,15 +1,15 @@ -{ - "scope": "store/sku/updated", - "store_id": "1025646", - "data": { - "type": "sku", - "id": 461, - "sku": { - "product_id": 206, - "variant_id": 509 - } - }, - "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", - "created_at": 1561480465, - "producer": "stores/{store_hash}" +{ + "scope": "store/sku/updated", + "store_id": "1025646", + "data": { + "type": "sku", + "id": 461, + "sku": { + "product_id": 206, + "variant_id": 509 + } + }, + "hash": "7a0866943b1f46cfda31c3218931f5aab83a4c73", + "created_at": 1561480465, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_subscriber_created.json b/docs/webhooks/callbacks/data/store_subscriber_created.json similarity index 96% rename from models/webhooks/data/store_subscriber_created.json rename to docs/webhooks/callbacks/data/store_subscriber_created.json index 3a1b4df78..259c39702 100644 --- a/models/webhooks/data/store_subscriber_created.json +++ b/docs/webhooks/callbacks/data/store_subscriber_created.json @@ -1,11 +1,11 @@ -{ - "scope": "store/subscriber/created", - "store_id": "1025646", - "data": { - "type": "subscriber", - "id": 5 - }, - "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", - "created_at": 1561482953, - "producer": "stores/{store_hash}" +{ + "scope": "store/subscriber/created", + "store_id": "1025646", + "data": { + "type": "subscriber", + "id": 5 + }, + "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", + "created_at": 1561482953, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_subscriber_deleted.json b/docs/webhooks/callbacks/data/store_subscriber_deleted.json similarity index 96% rename from models/webhooks/data/store_subscriber_deleted.json rename to docs/webhooks/callbacks/data/store_subscriber_deleted.json index 857545305..d71516bd6 100644 --- a/models/webhooks/data/store_subscriber_deleted.json +++ b/docs/webhooks/callbacks/data/store_subscriber_deleted.json @@ -1,11 +1,11 @@ -{ - "scope": "store/subscriber/updated", - "store_id": "1025646", - "data": { - "type": "subscriber", - "id": 5 - }, - "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", - "created_at": 1561482953, - "producer": "stores/{store_hash}" +{ + "scope": "store/subscriber/updated", + "store_id": "1025646", + "data": { + "type": "subscriber", + "id": 5 + }, + "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", + "created_at": 1561482953, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/data/store_subscriber_updated.json b/docs/webhooks/callbacks/data/store_subscriber_updated.json similarity index 96% rename from models/webhooks/data/store_subscriber_updated.json rename to docs/webhooks/callbacks/data/store_subscriber_updated.json index 32e19ccf8..c93e4a6a0 100644 --- a/models/webhooks/data/store_subscriber_updated.json +++ b/docs/webhooks/callbacks/data/store_subscriber_updated.json @@ -1,11 +1,11 @@ -{ - "scope": "store/subscriber/deleted", - "store_id": "1025646", - "data": { - "type": "subscriber", - "id": 5 - }, - "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", - "created_at": 1561482953, - "producer": "stores/{store_hash}" +{ + "scope": "store/subscriber/deleted", + "store_id": "1025646", + "data": { + "type": "subscriber", + "id": 5 + }, + "hash": "bdb6c9c2d17ca7036538e483db0bdd7debc4beb4", + "created_at": 1561482953, + "producer": "stores/{store_hash}" } \ No newline at end of file diff --git a/models/webhooks/store_app_uninstalled.yml b/docs/webhooks/callbacks/store_app_uninstalled.yml similarity index 95% rename from models/webhooks/store_app_uninstalled.yml rename to docs/webhooks/callbacks/store_app_uninstalled.yml index 7a6801b6d..5eb565617 100644 --- a/models/webhooks/store_app_uninstalled.yml +++ b/docs/webhooks/callbacks/store_app_uninstalled.yml @@ -1,23 +1,23 @@ -type: object -properties: - store/app/uninstalled: - description: Fires when a client store is cancelled and uninstalled from the platform. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string +type: object +properties: + store/app/uninstalled: + description: Fires when a client store is cancelled and uninstalled from the platform. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string diff --git a/models/webhooks/store_brand_metafield_created.yml b/docs/webhooks/callbacks/store_brand_metafield_created.yml similarity index 100% rename from models/webhooks/store_brand_metafield_created.yml rename to docs/webhooks/callbacks/store_brand_metafield_created.yml diff --git a/models/webhooks/store_brand_metafield_deleted.yml b/docs/webhooks/callbacks/store_brand_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_brand_metafield_deleted.yml rename to docs/webhooks/callbacks/store_brand_metafield_deleted.yml diff --git a/models/webhooks/store_brand_metafield_updated.yml b/docs/webhooks/callbacks/store_brand_metafield_updated.yml similarity index 100% rename from models/webhooks/store_brand_metafield_updated.yml rename to docs/webhooks/callbacks/store_brand_metafield_updated.yml diff --git a/models/webhooks/store_cart_abandoned.yml b/docs/webhooks/callbacks/store_cart_abandoned.yml similarity index 96% rename from models/webhooks/store_cart_abandoned.yml rename to docs/webhooks/callbacks/store_cart_abandoned.yml index 2e070c98b..b4d658be6 100644 --- a/models/webhooks/store_cart_abandoned.yml +++ b/docs/webhooks/callbacks/store_cart_abandoned.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/abandoned: - description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - token: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/abandoned: + description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + token: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_converted.yml b/docs/webhooks/callbacks/store_cart_converted.yml similarity index 96% rename from models/webhooks/store_cart_converted.yml rename to docs/webhooks/callbacks/store_cart_converted.yml index 5539d7e1e..d0b8fee0e 100644 --- a/models/webhooks/store_cart_converted.yml +++ b/docs/webhooks/callbacks/store_cart_converted.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/converted: - description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - orderId: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/converted: + description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + orderId: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_couponApplied.yml b/docs/webhooks/callbacks/store_cart_couponApplied.yml similarity index 95% rename from models/webhooks/store_cart_couponApplied.yml rename to docs/webhooks/callbacks/store_cart_couponApplied.yml index 87b82ff15..ad04d5f65 100644 --- a/models/webhooks/store_cart_couponApplied.yml +++ b/docs/webhooks/callbacks/store_cart_couponApplied.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/couponApplied: - description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - couponId: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/couponApplied: + description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + couponId: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_created.yml b/docs/webhooks/callbacks/store_cart_created.yml similarity index 96% rename from models/webhooks/store_cart_created.yml rename to docs/webhooks/callbacks/store_cart_created.yml index a390e71a1..e6d00418c 100644 --- a/models/webhooks/store_cart_created.yml +++ b/docs/webhooks/callbacks/store_cart_created.yml @@ -1,30 +1,30 @@ -type: object -properties: - store/cart/created: - description: |- - Fires when a new cart is created, which happens with the following two events: - - * A storefront shopper adds the first item to their cart - * A new cart is created using any of the APIs that can create carts - - The store/cart/updated webhook fires simultaneously with store/cart/created. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/created: + description: |- + Fires when a new cart is created, which happens with the following two events: + + * A storefront shopper adds the first item to their cart + * A new cart is created using any of the APIs that can create carts + + The store/cart/updated webhook fires simultaneously with store/cart/created. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_deleted.yml b/docs/webhooks/callbacks/store_cart_deleted.yml similarity index 96% rename from models/webhooks/store_cart_deleted.yml rename to docs/webhooks/callbacks/store_cart_deleted.yml index a7548fcbd..7fe010676 100644 --- a/models/webhooks/store_cart_deleted.yml +++ b/docs/webhooks/callbacks/store_cart_deleted.yml @@ -1,30 +1,30 @@ -type: object -properties: - store/cart/deleted: - description: |- - Fires when a cart is deleted. This ends the lifecycle of the cart. Events include the following: - - * When a storefront shopper or API call removes all items from the cart - * When the cart is explicitly removed by API using a DELETE request - - The store/cart/updated webhook fires simultaneously with store/cart/deleted. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/deleted: + description: |- + Fires when a cart is deleted. This ends the lifecycle of the cart. Events include the following: + + * When a storefront shopper or API call removes all items from the cart + * When the cart is explicitly removed by API using a DELETE request + + The store/cart/updated webhook fires simultaneously with store/cart/deleted. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_lineItem_created.yml b/docs/webhooks/callbacks/store_cart_lineItem_created.yml similarity index 95% rename from models/webhooks/store_cart_lineItem_created.yml rename to docs/webhooks/callbacks/store_cart_lineItem_created.yml index 9c6a4cf10..0844c7b3c 100644 --- a/models/webhooks/store_cart_lineItem_created.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_created.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/lineItem/created: - description: Fires when a new item is added to a cart. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - cartId: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/lineItem/created: + description: Fires when a new item is added to a cart. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + cartId: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_lineItem_deleted.yml b/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml similarity index 95% rename from models/webhooks/store_cart_lineItem_deleted.yml rename to docs/webhooks/callbacks/store_cart_lineItem_deleted.yml index 50fd621bf..8916302fe 100644 --- a/models/webhooks/store_cart_lineItem_deleted.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/lineItem/deleted: - description: Fires when an item is deleted from a cart. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - cartId: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/lineItem/deleted: + description: Fires when an item is deleted from a cart. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + cartId: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_lineItem_updated.yml b/docs/webhooks/callbacks/store_cart_lineItem_updated.yml similarity index 95% rename from models/webhooks/store_cart_lineItem_updated.yml rename to docs/webhooks/callbacks/store_cart_lineItem_updated.yml index 5035ced59..78bcd7a8e 100644 --- a/models/webhooks/store_cart_lineItem_updated.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_updated.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/cart/lineItem/updated: - description: Fires when a line item’s quantity or product options change. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - cartId: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/lineItem/updated: + description: Fires when a line item’s quantity or product options change. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + cartId: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_cart_metafield_created.yml b/docs/webhooks/callbacks/store_cart_metafield_created.yml similarity index 100% rename from models/webhooks/store_cart_metafield_created.yml rename to docs/webhooks/callbacks/store_cart_metafield_created.yml diff --git a/models/webhooks/store_cart_metafield_deleted.yml b/docs/webhooks/callbacks/store_cart_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_cart_metafield_deleted.yml rename to docs/webhooks/callbacks/store_cart_metafield_deleted.yml diff --git a/models/webhooks/store_cart_metafield_updated.yml b/docs/webhooks/callbacks/store_cart_metafield_updated.yml similarity index 100% rename from models/webhooks/store_cart_metafield_updated.yml rename to docs/webhooks/callbacks/store_cart_metafield_updated.yml diff --git a/models/webhooks/store_cart_updated.yml b/docs/webhooks/callbacks/store_cart_updated.yml similarity index 96% rename from models/webhooks/store_cart_updated.yml rename to docs/webhooks/callbacks/store_cart_updated.yml index ace0086f3..8a11b932d 100644 --- a/models/webhooks/store_cart_updated.yml +++ b/docs/webhooks/callbacks/store_cart_updated.yml @@ -1,34 +1,34 @@ -type: object -properties: - store/cart/updated: - description: |- - Fires when a cart is modified, including in the following cases: - - * When a new item is added to a cart - * When an existing item’s quantity is updated - * When an existing item is deleted - * When the email is changed during guest checkout - * When the store/cart/created webhook fires - * When the store/cart/deleted webhook fires - - The payload includes the ID of the cart being updated. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/cart/updated: + description: |- + Fires when a cart is modified, including in the following cases: + + * When a new item is added to a cart + * When an existing item’s quantity is updated + * When an existing item is deleted + * When the email is changed during guest checkout + * When the store/cart/created webhook fires + * When the store/cart/deleted webhook fires + + The payload includes the ID of the cart being updated. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_category_created.yml b/docs/webhooks/callbacks/store_category_created.yml similarity index 94% rename from models/webhooks/store_category_created.yml rename to docs/webhooks/callbacks/store_category_created.yml index bb37cbb32..a0054ce25 100644 --- a/models/webhooks/store_category_created.yml +++ b/docs/webhooks/callbacks/store_category_created.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/category/created: - description: Fires when a category is created. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/category/created: + description: Fires when a category is created. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_category_deleted.yml b/docs/webhooks/callbacks/store_category_deleted.yml similarity index 94% rename from models/webhooks/store_category_deleted.yml rename to docs/webhooks/callbacks/store_category_deleted.yml index ad60a0ebc..a4dbffc56 100644 --- a/models/webhooks/store_category_deleted.yml +++ b/docs/webhooks/callbacks/store_category_deleted.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/category/deleted: - description: Fires when a category is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/category/deleted: + description: Fires when a category is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_category_metafield_created.yml b/docs/webhooks/callbacks/store_category_metafield_created.yml similarity index 100% rename from models/webhooks/store_category_metafield_created.yml rename to docs/webhooks/callbacks/store_category_metafield_created.yml diff --git a/models/webhooks/store_category_metafield_deleted.yml b/docs/webhooks/callbacks/store_category_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_category_metafield_deleted.yml rename to docs/webhooks/callbacks/store_category_metafield_deleted.yml diff --git a/models/webhooks/store_category_metafield_updated.yml b/docs/webhooks/callbacks/store_category_metafield_updated.yml similarity index 100% rename from models/webhooks/store_category_metafield_updated.yml rename to docs/webhooks/callbacks/store_category_metafield_updated.yml diff --git a/models/webhooks/store_category_updated.yml b/docs/webhooks/callbacks/store_category_updated.yml similarity index 94% rename from models/webhooks/store_category_updated.yml rename to docs/webhooks/callbacks/store_category_updated.yml index e8b5c8a85..138ec87c8 100644 --- a/models/webhooks/store_category_updated.yml +++ b/docs/webhooks/callbacks/store_category_updated.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/category/updated: - description: Fires when a category is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/category/updated: + description: Fires when a category is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_channel_metafield_created.yml b/docs/webhooks/callbacks/store_channel_metafield_created.yml similarity index 100% rename from models/webhooks/store_channel_metafield_created.yml rename to docs/webhooks/callbacks/store_channel_metafield_created.yml diff --git a/models/webhooks/store_channel_metafield_deleted.yml b/docs/webhooks/callbacks/store_channel_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_channel_metafield_deleted.yml rename to docs/webhooks/callbacks/store_channel_metafield_deleted.yml diff --git a/models/webhooks/store_channel_metafield_updated.yml b/docs/webhooks/callbacks/store_channel_metafield_updated.yml similarity index 100% rename from models/webhooks/store_channel_metafield_updated.yml rename to docs/webhooks/callbacks/store_channel_metafield_updated.yml diff --git a/models/webhooks/store_customer_address_created.yml b/docs/webhooks/callbacks/store_customer_address_created.yml similarity index 95% rename from models/webhooks/store_customer_address_created.yml rename to docs/webhooks/callbacks/store_customer_address_created.yml index be2486b4f..f1a2fd5b6 100644 --- a/models/webhooks/store_customer_address_created.yml +++ b/docs/webhooks/callbacks/store_customer_address_created.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/customer/address/created: - description: Fires when a customer address is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - address: - type: object - properties: - customer_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/address/created: + description: Fires when a customer address is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + address: + type: object + properties: + customer_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_address_deleted.yml b/docs/webhooks/callbacks/store_customer_address_deleted.yml similarity index 95% rename from models/webhooks/store_customer_address_deleted.yml rename to docs/webhooks/callbacks/store_customer_address_deleted.yml index 63de5f7a6..647edb235 100644 --- a/models/webhooks/store_customer_address_deleted.yml +++ b/docs/webhooks/callbacks/store_customer_address_deleted.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/customer/address/deleted: - description: Fires when a customer address is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - address: - type: object - properties: - customer_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/address/deleted: + description: Fires when a customer address is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + address: + type: object + properties: + customer_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_address_updated.yml b/docs/webhooks/callbacks/store_customer_address_updated.yml similarity index 95% rename from models/webhooks/store_customer_address_updated.yml rename to docs/webhooks/callbacks/store_customer_address_updated.yml index a9058e83b..df88780a2 100644 --- a/models/webhooks/store_customer_address_updated.yml +++ b/docs/webhooks/callbacks/store_customer_address_updated.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/customer/address/updated: - description: Fires when a customer address is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - address: - type: object - properties: - customer_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/address/updated: + description: Fires when a customer address is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + address: + type: object + properties: + customer_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_created.yml b/docs/webhooks/callbacks/store_customer_created.yml similarity index 94% rename from models/webhooks/store_customer_created.yml rename to docs/webhooks/callbacks/store_customer_created.yml index 9b899f07b..812819f33 100644 --- a/models/webhooks/store_customer_created.yml +++ b/docs/webhooks/callbacks/store_customer_created.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/customer/created: - description: A new customer is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/created: + description: A new customer is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_deleted.yml b/docs/webhooks/callbacks/store_customer_deleted.yml similarity index 94% rename from models/webhooks/store_customer_deleted.yml rename to docs/webhooks/callbacks/store_customer_deleted.yml index ff9ef2c59..c226b0c99 100644 --- a/models/webhooks/store_customer_deleted.yml +++ b/docs/webhooks/callbacks/store_customer_deleted.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/customer/deleted: - description: Fires when a customer is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/deleted: + description: Fires when a customer is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_payment_instrument_default_updated.yml b/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml similarity index 95% rename from models/webhooks/store_customer_payment_instrument_default_updated.yml rename to docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml index 9b66d9414..0878bb9e6 100644 --- a/models/webhooks/store_customer_payment_instrument_default_updated.yml +++ b/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/customer/payment/instrument/default/updated: - description: Fires when a customer default payment instrument is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/payment/instrument/default/updated: + description: Fires when a customer default payment instrument is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_customer_updated.yml b/docs/webhooks/callbacks/store_customer_updated.yml similarity index 96% rename from models/webhooks/store_customer_updated.yml rename to docs/webhooks/callbacks/store_customer_updated.yml index 8335dd95f..5ef1bf648 100644 --- a/models/webhooks/store_customer_updated.yml +++ b/docs/webhooks/callbacks/store_customer_updated.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/customer/updated: - description: |- - Fires when a customer is updated. It does not currently track changes to the customer address. - - - Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. - - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/customer/updated: + description: |- + Fires when a customer is updated. It does not currently track changes to the customer address. + + + Tracks changes to customer attributes only if you make the changes through the control panel. This change triggers the same event `type` and payload as updating a customer; the payload does not include customer attributes. + + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_information_updated.yml b/docs/webhooks/callbacks/store_information_updated.yml similarity index 96% rename from models/webhooks/store_information_updated.yml rename to docs/webhooks/callbacks/store_information_updated.yml index 3833efaed..de4078af0 100644 --- a/models/webhooks/store_information_updated.yml +++ b/docs/webhooks/callbacks/store_information_updated.yml @@ -1,22 +1,22 @@ -type: object -properties: - store/information/updated: - description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/information/updated: + description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_inventory_location_created.yml b/docs/webhooks/callbacks/store_inventory_location_created.yml similarity index 100% rename from models/webhooks/store_inventory_location_created.yml rename to docs/webhooks/callbacks/store_inventory_location_created.yml diff --git a/models/webhooks/store_inventory_location_metafield_created.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml similarity index 100% rename from models/webhooks/store_inventory_location_metafield_created.yml rename to docs/webhooks/callbacks/store_inventory_location_metafield_created.yml diff --git a/models/webhooks/store_inventory_location_metafield_deleted.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_inventory_location_metafield_deleted.yml rename to docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml diff --git a/models/webhooks/store_inventory_location_metafield_updated.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml similarity index 100% rename from models/webhooks/store_inventory_location_metafield_updated.yml rename to docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml diff --git a/models/webhooks/store_inventory_location_updated.yml b/docs/webhooks/callbacks/store_inventory_location_updated.yml similarity index 100% rename from models/webhooks/store_inventory_location_updated.yml rename to docs/webhooks/callbacks/store_inventory_location_updated.yml diff --git a/models/webhooks/store_metafield_created.yml b/docs/webhooks/callbacks/store_metafield_created.yml similarity index 100% rename from models/webhooks/store_metafield_created.yml rename to docs/webhooks/callbacks/store_metafield_created.yml diff --git a/models/webhooks/store_metafield_deleted.yml b/docs/webhooks/callbacks/store_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_metafield_deleted.yml rename to docs/webhooks/callbacks/store_metafield_deleted.yml diff --git a/models/webhooks/store_metafield_updated.yml b/docs/webhooks/callbacks/store_metafield_updated.yml similarity index 100% rename from models/webhooks/store_metafield_updated.yml rename to docs/webhooks/callbacks/store_metafield_updated.yml diff --git a/models/webhooks/store_modifier_updated.yml b/docs/webhooks/callbacks/store_modifier_updated.yml similarity index 100% rename from models/webhooks/store_modifier_updated.yml rename to docs/webhooks/callbacks/store_modifier_updated.yml diff --git a/models/webhooks/store_option_updated.yml b/docs/webhooks/callbacks/store_option_updated.yml similarity index 100% rename from models/webhooks/store_option_updated.yml rename to docs/webhooks/callbacks/store_option_updated.yml diff --git a/models/webhooks/store_order_archived.yml b/docs/webhooks/callbacks/store_order_archived.yml similarity index 94% rename from models/webhooks/store_order_archived.yml rename to docs/webhooks/callbacks/store_order_archived.yml index 022916533..7e309cf9b 100644 --- a/models/webhooks/store_order_archived.yml +++ b/docs/webhooks/callbacks/store_order_archived.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/order/archived: - description: Order is archived - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/archived: + description: Order is archived + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_order_created.yml b/docs/webhooks/callbacks/store_order_created.yml similarity index 95% rename from models/webhooks/store_order_created.yml rename to docs/webhooks/callbacks/store_order_created.yml index 16e843b45..bb1bb5115 100644 --- a/models/webhooks/store_order_created.yml +++ b/docs/webhooks/callbacks/store_order_created.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/order/created: - description: Fires when an order is created either in the control panel or by API. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/created: + description: Fires when an order is created either in the control panel or by API. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_order_message_created.yml b/docs/webhooks/callbacks/store_order_message_created.yml similarity index 95% rename from models/webhooks/store_order_message_created.yml rename to docs/webhooks/callbacks/store_order_message_created.yml index 04269984f..3746ab028 100644 --- a/models/webhooks/store_order_message_created.yml +++ b/docs/webhooks/callbacks/store_order_message_created.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/order/message/created: - description: Order message is created by customer or in control panel - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - message: - type: object - properties: - order_message_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/message/created: + description: Order message is created by customer or in control panel + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + message: + type: object + properties: + order_message_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_order_metafield_created.yml b/docs/webhooks/callbacks/store_order_metafield_created.yml similarity index 100% rename from models/webhooks/store_order_metafield_created.yml rename to docs/webhooks/callbacks/store_order_metafield_created.yml diff --git a/models/webhooks/store_order_metafield_deleted.yml b/docs/webhooks/callbacks/store_order_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_order_metafield_deleted.yml rename to docs/webhooks/callbacks/store_order_metafield_deleted.yml diff --git a/models/webhooks/store_order_metafield_updated.yml b/docs/webhooks/callbacks/store_order_metafield_updated.yml similarity index 100% rename from models/webhooks/store_order_metafield_updated.yml rename to docs/webhooks/callbacks/store_order_metafield_updated.yml diff --git a/models/webhooks/store_order_refund_created.yml b/docs/webhooks/callbacks/store_order_refund_created.yml similarity index 95% rename from models/webhooks/store_order_refund_created.yml rename to docs/webhooks/callbacks/store_order_refund_created.yml index 9b6d9cecf..2da52c92e 100644 --- a/models/webhooks/store_order_refund_created.yml +++ b/docs/webhooks/callbacks/store_order_refund_created.yml @@ -1,29 +1,29 @@ -type: object -properties: - store/order/refund/created: - description: A refund has been submitted against an order - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - refund: - type: object - properties: - refund_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/refund/created: + description: A refund has been submitted against an order + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + refund: + type: object + properties: + refund_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_order_statusUpdated.yml b/docs/webhooks/callbacks/store_order_statusUpdated.yml similarity index 95% rename from models/webhooks/store_order_statusUpdated.yml rename to docs/webhooks/callbacks/store_order_statusUpdated.yml index 44563c4f0..f71ba6a2a 100644 --- a/models/webhooks/store_order_statusUpdated.yml +++ b/docs/webhooks/callbacks/store_order_statusUpdated.yml @@ -1,31 +1,31 @@ -type: object -properties: - store/order/statusUpdated: - description: Fires when the order status has changed, such as from Pending to Awaiting Payment. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - status: - type: object - properties: - previous_status_id: - type: integer - new_status_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/statusUpdated: + description: Fires when the order status has changed, such as from Pending to Awaiting Payment. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + status: + type: object + properties: + previous_status_id: + type: integer + new_status_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_order_transaction_created.yml b/docs/webhooks/callbacks/store_order_transaction_created.yml similarity index 100% rename from models/webhooks/store_order_transaction_created.yml rename to docs/webhooks/callbacks/store_order_transaction_created.yml diff --git a/models/webhooks/store_order_transaction_updated.yml b/docs/webhooks/callbacks/store_order_transaction_updated.yml similarity index 100% rename from models/webhooks/store_order_transaction_updated.yml rename to docs/webhooks/callbacks/store_order_transaction_updated.yml diff --git a/models/webhooks/store_order_updated.yml b/docs/webhooks/callbacks/store_order_updated.yml similarity index 96% rename from models/webhooks/store_order_updated.yml rename to docs/webhooks/callbacks/store_order_updated.yml index 257337511..8919b1092 100644 --- a/models/webhooks/store_order_updated.yml +++ b/docs/webhooks/callbacks/store_order_updated.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/order/updated: - description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/order/updated: + description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_product_created.yml b/docs/webhooks/callbacks/store_product_created.yml similarity index 94% rename from models/webhooks/store_product_created.yml rename to docs/webhooks/callbacks/store_product_created.yml index a5aa514d5..e29e3af91 100644 --- a/models/webhooks/store_product_created.yml +++ b/docs/webhooks/callbacks/store_product_created.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/product/created: - description: A new product is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/product/created: + description: A new product is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_product_deleted.yml b/docs/webhooks/callbacks/store_product_deleted.yml similarity index 94% rename from models/webhooks/store_product_deleted.yml rename to docs/webhooks/callbacks/store_product_deleted.yml index 0cdcfe85e..56d033bed 100644 --- a/models/webhooks/store_product_deleted.yml +++ b/docs/webhooks/callbacks/store_product_deleted.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/product/deleted: - description: Product is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/product/deleted: + description: Product is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_product_inventory_order_updated.yml b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml similarity index 97% rename from models/webhooks/store_product_inventory_order_updated.yml rename to docs/webhooks/callbacks/store_product_inventory_order_updated.yml index c32b90371..41d1e10ab 100644 --- a/models/webhooks/store_product_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml @@ -1,36 +1,36 @@ -type: object -properties: - store/product/inventory/order/updated: - description: |- - Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. - - The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - inventory: - type: object - properties: - product_id: - type: integer - method: - type: string - value: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/product/inventory/order/updated: + description: |- + Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + + The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + inventory: + type: object + properties: + product_id: + type: integer + method: + type: string + value: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_product_inventory_updated.yml b/docs/webhooks/callbacks/store_product_inventory_updated.yml similarity index 97% rename from models/webhooks/store_product_inventory_updated.yml rename to docs/webhooks/callbacks/store_product_inventory_updated.yml index 2b457c594..bbb9a2073 100644 --- a/models/webhooks/store_product_inventory_updated.yml +++ b/docs/webhooks/callbacks/store_product_inventory_updated.yml @@ -1,38 +1,38 @@ -type: object -properties: - store/product/inventory/updated: - description: |- - Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. - - For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. - - Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - inventory: - type: object - properties: - product_id: - type: integer - method: - type: string - value: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/product/inventory/updated: + description: |- + Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. + + For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. + + Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + inventory: + type: object + properties: + product_id: + type: integer + method: + type: string + value: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_product_metafield_created.yml b/docs/webhooks/callbacks/store_product_metafield_created.yml similarity index 100% rename from models/webhooks/store_product_metafield_created.yml rename to docs/webhooks/callbacks/store_product_metafield_created.yml diff --git a/models/webhooks/store_product_metafield_deleted.yml b/docs/webhooks/callbacks/store_product_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_product_metafield_deleted.yml rename to docs/webhooks/callbacks/store_product_metafield_deleted.yml diff --git a/models/webhooks/store_product_metafield_updated.yml b/docs/webhooks/callbacks/store_product_metafield_updated.yml similarity index 100% rename from models/webhooks/store_product_metafield_updated.yml rename to docs/webhooks/callbacks/store_product_metafield_updated.yml diff --git a/models/webhooks/store_product_updated.yml b/docs/webhooks/callbacks/store_product_updated.yml similarity index 96% rename from models/webhooks/store_product_updated.yml rename to docs/webhooks/callbacks/store_product_updated.yml index 7588f5094..41b6dbb8e 100644 --- a/models/webhooks/store_product_updated.yml +++ b/docs/webhooks/callbacks/store_product_updated.yml @@ -1,41 +1,41 @@ -type: object -properties: - store/product/updated: - description: | - Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the product updated events that follow. - - The `context` fields are present for only override updates. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - enum: product - id: - type: integer - properties: - type: array - description: Allowed values are `name`, `description`, `page_title`, `meta_description`, `warranty`, `availability_description`, `search_keywords`, `is_featured` and `preorder_message` - items: - type: string - context: - type: object - properties: - channel_id: - type: integer - locale: - type: string - description: '`null` if the attribute that was overridden applies to the entire channel.' - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/product/updated: + description: | + Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the product updated events that follow. + + The `context` fields are present for only override updates. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + enum: product + id: + type: integer + properties: + type: array + description: Allowed values are `name`, `description`, `page_title`, `meta_description`, `warranty`, `availability_description`, `search_keywords`, `is_featured` and `preorder_message` + items: + type: string + context: + type: object + properties: + channel_id: + type: integer + locale: + type: string + description: '`null` if the attribute that was overridden applies to the entire channel.' + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_shipment_created.yml b/docs/webhooks/callbacks/store_shipment_created.yml similarity index 94% rename from models/webhooks/store_shipment_created.yml rename to docs/webhooks/callbacks/store_shipment_created.yml index f4d6d6a79..02a689a69 100644 --- a/models/webhooks/store_shipment_created.yml +++ b/docs/webhooks/callbacks/store_shipment_created.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/shipment/created: - description: Shipment is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - orderId: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/shipment/created: + description: Shipment is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + orderId: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_shipment_deleted.yml b/docs/webhooks/callbacks/store_shipment_deleted.yml similarity index 94% rename from models/webhooks/store_shipment_deleted.yml rename to docs/webhooks/callbacks/store_shipment_deleted.yml index 18aec25fa..38789354b 100644 --- a/models/webhooks/store_shipment_deleted.yml +++ b/docs/webhooks/callbacks/store_shipment_deleted.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/shipment/deleted: - description: Shipment is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - orderId: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/shipment/deleted: + description: Shipment is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + orderId: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_shipment_updated.yml b/docs/webhooks/callbacks/store_shipment_updated.yml similarity index 94% rename from models/webhooks/store_shipment_updated.yml rename to docs/webhooks/callbacks/store_shipment_updated.yml index 15978efc7..0ee0c1900 100644 --- a/models/webhooks/store_shipment_updated.yml +++ b/docs/webhooks/callbacks/store_shipment_updated.yml @@ -1,26 +1,26 @@ -type: object -properties: - store/shipment/updated: - description: Shipment is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - orderId: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/shipment/updated: + description: Shipment is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + orderId: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_sku_created.yml b/docs/webhooks/callbacks/store_sku_created.yml similarity index 95% rename from models/webhooks/store_sku_created.yml rename to docs/webhooks/callbacks/store_sku_created.yml index 3753de269..d185a1e61 100644 --- a/models/webhooks/store_sku_created.yml +++ b/docs/webhooks/callbacks/store_sku_created.yml @@ -1,31 +1,31 @@ -type: object -properties: - store/sku/created: - description: A new sku is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - sku: - type: object - properties: - product_id: - type: integer - variant_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/sku/created: + description: A new sku is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + sku: + type: object + properties: + product_id: + type: integer + variant_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_sku_deleted.yml b/docs/webhooks/callbacks/store_sku_deleted.yml similarity index 95% rename from models/webhooks/store_sku_deleted.yml rename to docs/webhooks/callbacks/store_sku_deleted.yml index 860d1dd66..c01c6d17b 100644 --- a/models/webhooks/store_sku_deleted.yml +++ b/docs/webhooks/callbacks/store_sku_deleted.yml @@ -1,31 +1,31 @@ -type: object -properties: - store/sku/deleted: - description: SKU is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - sku: - type: object - properties: - product_id: - type: integer - variant_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/sku/deleted: + description: SKU is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + sku: + type: object + properties: + product_id: + type: integer + variant_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_sku_inventory_order_updated.yml b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml similarity index 97% rename from models/webhooks/store_sku_inventory_order_updated.yml rename to docs/webhooks/callbacks/store_sku_inventory_order_updated.yml index dae191e0d..c0e482a21 100644 --- a/models/webhooks/store_sku_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml @@ -1,38 +1,38 @@ -type: object -properties: - store/sku/inventory/order/updated: - description: |- - Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. - - The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - inventory: - type: object - properties: - product_id: - type: integer - method: - type: string - value: - type: integer - variant_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/sku/inventory/order/updated: + description: |- + Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + + The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + inventory: + type: object + properties: + product_id: + type: integer + method: + type: string + value: + type: integer + variant_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_sku_inventory_updated.yml b/docs/webhooks/callbacks/store_sku_inventory_updated.yml similarity index 96% rename from models/webhooks/store_sku_inventory_updated.yml rename to docs/webhooks/callbacks/store_sku_inventory_updated.yml index 5f1aff188..42c80a9f5 100644 --- a/models/webhooks/store_sku_inventory_updated.yml +++ b/docs/webhooks/callbacks/store_sku_inventory_updated.yml @@ -1,40 +1,40 @@ -type: object -properties: - store/sku/inventory/updated: - description: |- - Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. - - For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_ and the _variant-level_ inventory changes. - - Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - inventory: - type: object - properties: - product_id: - type: integer - method: - type: string - value: - type: integer - variant_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/sku/inventory/updated: + description: |- + Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. + + For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_ and the _variant-level_ inventory changes. + + Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + inventory: + type: object + properties: + product_id: + type: integer + method: + type: string + value: + type: integer + variant_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_sku_updated.yml b/docs/webhooks/callbacks/store_sku_updated.yml similarity index 95% rename from models/webhooks/store_sku_updated.yml rename to docs/webhooks/callbacks/store_sku_updated.yml index cc8cbec81..d0b3236e0 100644 --- a/models/webhooks/store_sku_updated.yml +++ b/docs/webhooks/callbacks/store_sku_updated.yml @@ -1,31 +1,31 @@ -type: object -properties: - store/sku/updated: - description: SKU is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - sku: - type: object - properties: - product_id: - type: integer - variant_id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/sku/updated: + description: SKU is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + sku: + type: object + properties: + product_id: + type: integer + variant_id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_subscriber_created.yml b/docs/webhooks/callbacks/store_subscriber_created.yml similarity index 94% rename from models/webhooks/store_subscriber_created.yml rename to docs/webhooks/callbacks/store_subscriber_created.yml index 74df7cdc6..ba49d4cd9 100644 --- a/models/webhooks/store_subscriber_created.yml +++ b/docs/webhooks/callbacks/store_subscriber_created.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/subscriber/created: - description: Subscriber is created - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/subscriber/created: + description: Subscriber is created + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_subscriber_deleted.yml b/docs/webhooks/callbacks/store_subscriber_deleted.yml similarity index 94% rename from models/webhooks/store_subscriber_deleted.yml rename to docs/webhooks/callbacks/store_subscriber_deleted.yml index 30fc5ffe8..2a68a30a3 100644 --- a/models/webhooks/store_subscriber_deleted.yml +++ b/docs/webhooks/callbacks/store_subscriber_deleted.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/subscriber/deleted: - description: Subscriber is deleted - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/subscriber/deleted: + description: Subscriber is deleted + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_subscriber_updated.yml b/docs/webhooks/callbacks/store_subscriber_updated.yml similarity index 94% rename from models/webhooks/store_subscriber_updated.yml rename to docs/webhooks/callbacks/store_subscriber_updated.yml index e25833cde..980134d2f 100644 --- a/models/webhooks/store_subscriber_updated.yml +++ b/docs/webhooks/callbacks/store_subscriber_updated.yml @@ -1,24 +1,24 @@ -type: object -properties: - store/subscriber/updated: - description: Subscriber is updated - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - id: - type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - +type: object +properties: + store/subscriber/updated: + description: Subscriber is updated + type: object + properties: + scope: + type: string + store_id: + type: string + data: + type: object + properties: + type: + type: string + id: + type: integer + hash: + type: string + created_at: + type: integer + producer: + type: string + diff --git a/models/webhooks/store_variant_metafield_created.yml b/docs/webhooks/callbacks/store_variant_metafield_created.yml similarity index 100% rename from models/webhooks/store_variant_metafield_created.yml rename to docs/webhooks/callbacks/store_variant_metafield_created.yml diff --git a/models/webhooks/store_variant_metafield_deleted.yml b/docs/webhooks/callbacks/store_variant_metafield_deleted.yml similarity index 100% rename from models/webhooks/store_variant_metafield_deleted.yml rename to docs/webhooks/callbacks/store_variant_metafield_deleted.yml diff --git a/models/webhooks/store_variant_metafield_updated.yml b/docs/webhooks/callbacks/store_variant_metafield_updated.yml similarity index 100% rename from models/webhooks/store_variant_metafield_updated.yml rename to docs/webhooks/callbacks/store_variant_metafield_updated.yml diff --git a/models/_root/forms.yml b/models/_root/forms.yml deleted file mode 100644 index 8767d73ae..000000000 --- a/models/_root/forms.yml +++ /dev/null @@ -1,15 +0,0 @@ -description: |- - `{{forms}}` object available to pages and components with forms - - **Handlebars Expression**: `{{forms.edit_account}}` -type: object -anyOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/address.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/contact.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/create_account.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/edit_account.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/gift_certificate.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/login.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/provider.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/return.yml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/forms/wishlist.yml diff --git a/models/theme_objects/_all.yml b/models/theme_objects/_all.yml deleted file mode 100644 index 1695f0b70..000000000 --- a/models/theme_objects/_all.yml +++ /dev/null @@ -1,98 +0,0 @@ -title: _all.yml -description: Theme objects -banners: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/banners.yml -blog: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/blog.yml -brand_results: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brand_results.yaml -brand: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brand.yml -brands: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/brands.yml -breadcrumbs: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/breadcrumbs.yml -carousel: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/carousel.yml -cart_id: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/cart_id.yml -cart: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/cart.yml -categories: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/categories.yml -category_results: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/category_results.yaml -category: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/category.yml -checkout: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/checkout.yml -comparisons: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/comparisons.yml -content_results: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/content_results.yaml -countries: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/countries.yml -create_account: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/create_account.yml -currency_selector: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/currency_selector.yml -customer_group_id: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer_group_id.yml -customer_group_name: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer_group_name.yml -customer: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/customer.yml -downloads: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/downloads.yml -faceted_search: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/faceted_search.yml -footer: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/footer.yml -forms_contact: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/forms_contact.yaml -forms: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/forms.yml -head: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/head.yml -is_ajax: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/is_ajax.yml -order: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/order.yml -page_type: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/page_type.yml -page: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/page.yml -pages: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/pages.yml -pagination: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/pagination.yml -price: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/price.yml -product_results: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/product_results.yaml -product: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/product.yml -products: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/products.yml -settings: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/settings.yml -shipments: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shipments.yml -shipping_messages: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shipping_messages.yml -shop_by_brand: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/shop_by_brand.yml -sitemap: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/sitemap.yml -social_media: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/social_media.yml -template_file: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/template_file.yml -template_settings: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/theme_settings.yml -urls: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/urls.yml -vault: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/vault.yml -wishlist: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/models/_root/wishlist.yml diff --git a/package.json b/package.json index 1f183f373..6d6af39ee 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "node": ">= 18.0.0" }, "scripts": { - "lint": "eslint ./docs ./examples ./theme-styles --ext mdx --max-warnings 0" + "lint": "eslint ./docs ./archive --ext mdx --max-warnings 0" }, "repository": { "type": "git", diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 82b25d622..3c7127b4d 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -563,7 +563,7 @@ components: properties: code: type: string - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' format: ISO-4217 description: This will always be the same between cart and checkout. x-go-gen-location: models diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index cb0b8e349..b28ef2bce 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -1709,7 +1709,7 @@ components: code: type: string format: ISO-4217 - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' title: Currency x-internal: false LineItems: diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 256d1af7b..f34449d13 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -61,7 +61,7 @@ info: Allowed values for a channelʼs `status` vary by channel `type`. - | Type | Writeable Statuses | + | Type | Writable Statuses | |:-----|:-------------------| | `storefront` | `prelaunch`, `active`, `inactive`, `archived`, `deleted` | | `marketing`, `marketplace`, `pos`| `connected`, `disconnected`, `archived`, `deleted` | @@ -3070,13 +3070,13 @@ components: x-internal: false EnabledCurrencies: type: array - description: 'Currencies that are enabled for the specified channel in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) three character alphabetic format.' + description: 'Currencies that are enabled for the specified channel in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) three character alphabetic format.' items: type: string x-internal: false DefaultCurrency: type: string - description: 'Default currency for the channel in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) three character alphabetic format. Will be used on storefront when other currencies cannot.' + description: 'Default currency for the channel in [ISO 4217](https://www.iso.org/iso-4217-currency-codes.html) three character alphabetic format. Will be used on storefront when other currencies cannot.' x-internal: false ChannelProductName: type: string diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index bab1558b4..5773eb4c5 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -2588,7 +2588,7 @@ components: description: The currency name. code: type: string - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' symbol: type: string description: The currency symbol. @@ -3589,7 +3589,7 @@ components: description: The currency name. code: type: string - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' symbol: type: string description: The currency symbol. diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index e1208d026..cf348f223 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -7859,7 +7859,7 @@ components: properties: code: type: string - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' example: USD base_amount: type: number diff --git a/reference/inventory.v3.yml b/reference/inventory.v3.yml new file mode 100644 index 000000000..970bee1e2 --- /dev/null +++ b/reference/inventory.v3.yml @@ -0,0 +1,743 @@ +openapi: '3.0.3' +info: + title: Inventory + version: '3.0' + description: |- + BigCommerce's V3 REST Inventory API endpoints expose location-aware, item-level inventory data to API consumers. These API resources allow developers to create BigCommerce apps and in-house API-driven solutions that can do the following: + + * Track inventory across multiple locations + * Display location-level inventory to shoppers + * Provide multi-location fulfillment options + * Facilitate _Buy Online Pickup in Store_ (BOPIS) + * Manage order fulfillment post-checkout + + ## Items + All product variants whose inventories are tracked by variant are inventory items. You can reference these inventory items using a variant's `variant_id` or `sku`. If a product has no variants, use `product_id`. + + * **Inventory Settings**: You can apply and get inventory settings for the inventory at a specific location or at all locations. You can update inventory settings for a specific location. + * **Inventory Quantities**: You can get inventory levels at all locations or specific locations. You can update inventory levels at a specific location using relative or absolute adjustment endpoints. + + ## Adjustments + There are two ways to adjust an item's inventory: + * **[Absolute](/docs/rest-management/inventory/adjustments#absolute-adjustment)**: Override existing inventory with a new count (Ex: set current inventory to `30`). Use absolute adjustments as the default method for updating inventory. Absolute adjustments are batched, making them more resource friendly than the [Catalog API](/docs/rest-catalog/products#update-products-batch). Absolute adjustments have lower complexity than relative adjustments, which synchronize with orders. + * **[Relative Adjustments](/docs/rest-management/inventory/adjustments#relative-adjustment)**: Change to item's inventory relative to existing inventory (Ex: add `10` current inventory). Use relative adjustments only when you do not know absolute quantities. For example, making order-related inventory changes through a third-party may require relative adjustments. Otherwise, use absolute adjustments for updating inventory. + + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Adjustments + - name: Items +paths: + '/inventory/adjustments/absolute': + parameters: + - $ref: '#/components/parameters/Accept' + put: + tags: + - Adjustments + description: | + Override the existing inventory levels for an inventory item at a location. For maximum inventory levels, see [Inventory adjustments](/docs/store-operations/catalog/inventory-adjustments#inventory-adjustments). For payload limits, see [Optimizing performance](/docs/store-operations/catalog/inventory-adjustments#optimizing-performance). + + Use absolute adjustments as the default method for updating inventory. This endpoint batches requests, making them more resource friendly than the [Catalog API](/docs/rest-catalog/products#update-products-batch). Absolute adjustments have lower complexity than [relative adjustments](/docs/rest-management/inventory/adjustments#relative-adjustment), which synchronize with orders. + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdjustmentsAbsoluteRequest' + examples: + Absolute Adjustment: + value: + reason: Absolute adjustment reason + items: + - location_id: 1 + variant_id: 1 + quantity: 1 + - location_id: 2 + variant_id: 3 + quantity: 1 + - location_id: 3 + sku: sku-4 + quantity: 1 + - location_id: 1 + sku: sku-5 + quantity: 1 + - location_id: 1 + product_id: 111 + quantity: 7 + required: true + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + examples: {} + '422': + description: Incorrect entity. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + Item has another tracking mode error: + value: + status: 422 + title: '[Item with variant_id 106 is tracked by product, please update stock by product id]' + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: {} + summary: Absolute Adjustment + operationId: put-absolute-adjustment + '/inventory/adjustments/relative': + parameters: + - $ref: '#/components/parameters/Accept' + post: + parameters: + - $ref: '#/components/parameters/ContentType' + tags: + - Adjustments + description: | + Add or subtract inventory for an inventory item at a location. For maximum inventory levels, see [Inventory adjustments](/docs/store-operations/catalog/inventory-adjustments#inventory-adjustments). For payload limits, see [Optimizing performance](/docs/store-operations/catalog/inventory-adjustments#optimizing-performance). + + Use this endpoint only when you do not know absolute quantities. For example, making order-related inventory changes through a third-party may require relative adjustments. Otherwise, use the [Absolute adjustment](/docs/rest-management/inventory/adjustments#absolute-adjustment) endpoint for updating inventory. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdjustmentsRelativeRequest' + examples: + Relative Adjustment: + value: + reason: Relative adjustment reason + items: + - location_id: 1 + variant_id: 1 + quantity: 1 + - location_id: 2 + variant_id: 3 + quantity: -1 + - location_id: 3 + sku: sku-4 + quantity: 1 + - location_id: 1 + sku: sku-5 + quantity: -1 + - location_id: 1 + product_id: 111 + quantity: 7 + required: true + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + '422': + description: | + Incorrect entity. The adjustment was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + Item requires absolute adjustment before relative error: + value: + status: 422 + title: 'Items with identity: [product_id 113] requires absolute adjustment before relative' + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: {} + Item has another tracking mode error: + value: + status: 422 + title: '[Item with variant_id 106 is tracked by product, please update stock by product id]' + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: {} + summary: Relative Adjustment + operationId: post-relative-adjustment + '/inventory/items': + parameters: + - $ref: '#/components/parameters/Accept' + get: + operationId: get-inventory-items + tags: + - Items + description: | + Return a list of inventory and inventory settings for all items in all locations. + parameters: + - $ref: '#/components/parameters/SkuFilterParam' + - $ref: '#/components/parameters/VariantIdFilterParam' + - $ref: '#/components/parameters/ProductIdFilterParam' + - $ref: '#/components/parameters/LocationIdsParam' + - $ref: '#/components/parameters/LocationCodeFilterParam' + - $ref: '#/components/parameters/PageParam' + - $ref: '#/components/parameters/LimitParam' + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/ItemResponse' + meta: + $ref: '#/components/schemas/Meta' + summary: Get Inventory at Locations + '/inventory/locations/{location_id}/items': + parameters: + - $ref: '#/components/parameters/Accept' + get: + operationId: get-location-inventory-items + tags: + - Items + description: Return a list of inventory and inventory settings for all items in a location. + parameters: + - $ref: '#/components/parameters/LocationIdParam' + - $ref: '#/components/parameters/VariantIdFilterParam' + - $ref: '#/components/parameters/ProductIdFilterParam' + - $ref: '#/components/parameters/SkuFilterParam' + - $ref: '#/components/parameters/PageParam' + - $ref: '#/components/parameters/LimitParam' + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/LocationItemsResponse' + meta: + $ref: '#/components/schemas/Meta' + '404': + description: Request has been rejected due to resource not being found. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + summary: Get Inventory at a Location + put: + operationId: put-location-inventory-items + tags: + - Items + description: Update inventory settings for items at a location. + parameters: + - $ref: '#/components/parameters/LocationIdParam' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationItemsSettingsRequest' + required: true + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + examples: {} + '422': + description: | + Incorrect entity. Item was not valid due to missing required fields or invalid data. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + Missed settings in payload: + value: + status: 422 + title: Payload contains invalid fields + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + setting.0.settings: 'At least one setting must be specified: warning_level, is_in_stock or safety_stock' + summary: Update Inventory Settings for a Location +components: + schemas: + ErrorResponse: + type: object + properties: + status: + type: integer + description: The HTTP status code generated by the origin server for this occurrence of the problem. + title: + type: string + description: Human readable error message. + type: + type: string + description: | + URL identifying the error type. Dereferencing the URL leads to documentation about the error type. + errors: + type: object + properties: {} + additionalProperties: true + description: Detailed summary describing the particular error. + Meta: + type: object + properties: + pagination: + type: object + properties: + total: + type: integer + description: Total number of items in the result set. + example: 246 + count: + type: integer + description: The total number of items in the collection on current page. + example: 5 + per_page: + type: integer + description: 'The number of items returned in the collection per page, controlled by the limit parameter.' + example: 5 + current_page: + type: integer + description: The page you are currently on within the collection. + example: 1 + total_pages: + type: integer + description: The total number of pages in the collection. + example: 50 + links: + type: object + description: Pagination links for the previous and next parts of the whole collection. + properties: + previous: + type: string + description: A link to the previous page is returned in the response. + example: '?limit=5&page=2' + current: + type: string + description: A link to the current page is returned in the response. + example: '?limit=5&page=3' + next: + type: string + description: Link to the next page returned in the response. + example: '?limit=5&page=4' + AdjustmentsRelativeRequest: + type: object + description: '' + properties: + reason: + type: string + description: Reason for the adjustment operation. + example: Monthly arrival delivered. + items: + type: array + description: 'One of the `sku`, `product_id`, or `variant_id` is required to identify the item.' + items: + oneOf: + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + sku: + type: string + example: RE-130 + description: '"Stock keeping unit" identifier of an item.' + quantity: + type: integer + description: Amount of items that will be moved. + example: -2 + required: + - location_id + - sku + - quantity + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + variant_id: + type: integer + description: ID of variant. + example: 78 + quantity: + type: integer + description: Amount of items that will be moved. + example: -2 + required: + - location_id + - variant_id + - quantity + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + product_id: + type: integer + description: ID of product. + example: 130 + quantity: + type: integer + description: Amount of items that will be moved. + example: -2 + required: + - location_id + - product_id + - quantity + required: + - items + AdjustmentsAbsoluteRequest: + type: object + properties: + reason: + type: string + description: Reason for the adjustment operation. + example: Monthly arrival delivered. + items: + type: array + description: 'One of the `sku`, `product_id`, or `variant_id` is required to identify the item.' + items: + oneOf: + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + sku: + type: string + description: '"Stock keeping unit" identifier of an item.' + example: RE-130 + quantity: + type: integer + description: Amount of items that will be moved. + example: 10 + required: + - location_id + - sku + - quantity + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + variant_id: + type: integer + description: variant_id identifier of item. + example: 78 + quantity: + type: integer + description: Amount of items that will be moved. + example: 10 + required: + - location_id + - variant_id + - quantity + - type: object + properties: + location_id: + type: integer + description: ID of location. This is empty in the case of the default allotment. + example: 1 + product_id: + type: integer + description: product_id identifier of item. + example: 120 + quantity: + type: integer + description: Amount of items that will be moved. + example: 10 + required: + - location_id + - product_id + - quantity + required: + - items + LocationItemsSettingsRequest: + type: object + properties: + settings: + type: array + items: + type: object + properties: + identity: + oneOf: + - type: object + properties: + sku: + type: string + description: '"Stock keeping unit" identifier of an item.' + example: RE-130 + - type: object + properties: + variant_id: + type: integer + description: ID of variant. + example: 79 + - type: object + properties: + product_id: + type: integer + description: ID of product. + example: 120 + description: 'One of the `sku`, `product_id`, or `variant_id` is required to identify the item.' + safety_stock: + type: integer + description: | + Safety stock. Decreases the amount available for selling items at that amount. If missing, the value will remain the same. + example: 5 + is_in_stock: + type: boolean + description: | + Shows whether an item is available for purchase independent of quantity. If missing, the value will remain the same. + warning_level: + type: integer + description: | + Inventory warning level for the product. The store owner will be informed when the product's inventory level drops below the warning level. If missing, the value will remain the same. + example: 10 + bin_picking_number: + type: string + description: | + Warehouse location identifier; bin picking number for the item. + example: "1" + required: + - settings + LocationItemsResponse: + type: object + properties: + identity: + type: object + properties: + sku: + type: string + description: '"Stock keeping unit" identifier of item.' + example: RE-130 + variant_id: + type: integer + description: ID of variant. + example: 78 + product_id: + type: integer + description: ID of product. + example: 130 + available_to_sell: + type: integer + description: Amount of available items. + example: 10 + total_inventory_onhand: + type: integer + description: Amount of available items on hand minus `safety_stock`. + example: 12 + settings: + type: object + properties: + safety_stock: + type: integer + description: | + Safety stock. Decreases the amount available for selling an item. If missing, the value will remain the same. + example: 2 + default: 0 + is_in_stock: + type: boolean + description: Shows whether an item is available for purchase independent of quantity. + default: true + warning_level: + type: integer + description: | + Inventory warning level for the product. The store owner will be informed when the product's inventory level drops below the warning level. If missing, the value will remain the same. + example: 2 + default: 0 + bin_picking_number: + type: string + description: | + Warehouse location identifier; bin picking number for the item. + example: "1" + ItemResponse: + type: object + properties: + identity: + type: object + properties: + sku: + type: string + description: '"Stock keeping unit" identifier of an item.' + example: RE-130 + variant_id: + type: integer + example: 79 + description: ID of variant. + product_id: + type: integer + description: ID of product. + example: 120 + locations: + type: array + items: + type: object + properties: + location_id: + type: integer + example: 1 + description: ID of location. + location_code: + type: string + example: BC-LOCATION-1 + description: Code of location. + location_name: + type: string + description: Name of location. + example: Default location + available_to_sell: + type: integer + description: Available to sell. Total inventory on hand minus the safety stock. + example: 10 + total_inventory_onhand: + type: integer + description: Total inventory on hand. + example: 11 + location_enabled: + type: boolean + description: Status of the location. Indicates whether a location is enabled. + settings: + type: object + properties: + safety_stock: + type: integer + description: Decreases the amount available for selling items at that amount. + example: 1 + is_in_stock: + type: boolean + description: Shows whether an item is available for purchase independent of quantity. + warning_level: + type: integer + description: 'Inventory warning level for the product. The store owner will be informed when the product inventory level drops below the warning level.' + example: 1 + bin_picking_number: + type: string + description: Warehouse location identifier; bin picking number for the item. + example: "1" + SimpleTransactionResponse: + type: object + properties: + transaction_id: + type: string + description: Unique identifier of performed action. + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + SkuFilterParam: + in: query + name: 'sku:in' + description: List of `sku` separated by comma. + required: false + schema: + type: string + VariantIdFilterParam: + in: query + name: 'variant_id:in' + description: List of `variant_id` separated by comma. + required: false + schema: + type: integer + ProductIdFilterParam: + in: query + name: 'product_id:in' + description: List of `product_id` separated by comma. + required: false + schema: + type: integer + PageParam: + in: query + name: page + description: Specifies the page number in a limited (paginated) list. + required: false + schema: + type: integer + LimitParam: + in: query + name: limit + description: Controls the number of items per page in a limited (paginated) list. + required: false + schema: + type: integer + LocationIdParam: + in: path + name: location_id + description: Unique identifier for a location. + required: true + schema: + type: integer + LocationIdsParam: + in: query + name: 'location_id:in' + description: Comma separated list of `location_id`. + required: false + schema: + type: integer + LocationCodeFilterParam: + in: query + name: 'location_code:in' + description: Comma separated list of `location_code`. + required: false + schema: + type: string + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Store Inventory | read-only | `store_inventory_read_only` | + | Store Inventory | modify | `store_inventory` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts#oauth-scopes). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header diff --git a/reference/locations.v3.yml b/reference/locations.v3.yml new file mode 100644 index 000000000..667db692e --- /dev/null +++ b/reference/locations.v3.yml @@ -0,0 +1,1900 @@ +openapi: '3.0.3' +info: + title: Locations + version: '3.0' + description: |- + ## Locations + By default, all BigCommerce stores have at least one location (`id` = `1`). You can create additional locations to track inventory against using the `/locations` endpoints. Initially, we will only support the creation of physical inventory locations, which must have an address. + + ## Metafields + Metafields allow you to add additional fields about your storeʼs locations. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Adjustments + - name: Items + - name: Inventory + description: BigCommerce Inventory API Definition. + - name: Locations + - name: Metafields + - name: Batch metafields +paths: + '/inventory/locations': + parameters: + - $ref: '#/components/parameters/Accept' + post: + operationId: createLocations + tags: + - Locations + description: Create new locations. + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationsCreateRequest' + examples: + Create Locations: + $ref: '#/components/examples/create_locations' + application/xml: + schema: + type: object + properties: {} + required: true + responses: + '200': + description: Locations have been successfully created. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + '422': + description: | + Incorrect entity. Locations were not valid. This results from missing required fields, invalid data, or partial error. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + summary: Create Locations + get: + operationId: getLocations + tags: + - Locations + description: List locations. You can use optional filter parameters. + parameters: + - $ref: '#/components/parameters/LocationIdsParam' + - $ref: '#/components/parameters/LocationCodeFilterParam' + - $ref: '#/components/parameters/LocationIsDefaultParam' + - $ref: '#/components/parameters/LocationTypeIdParam' + - $ref: '#/components/parameters/LocationManagedByExternalSourceParam' + - $ref: '#/components/parameters/LocationIsActiveParam' + - $ref: '#/components/parameters/LocationStorefrontVisibilityParam' + - $ref: '#/components/parameters/PageParam' + - $ref: '#/components/parameters/LimitParam' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/LocationResponse' + meta: + $ref: '#/components/schemas/Meta' + summary: Get Locations + put: + operationId: updateLocations + tags: + - Locations + description: Update existing locations. + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LocationsUpdateRequest' + examples: + Update Locations: + $ref: '#/components/examples/update_locations' + required: true + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + '422': + description: | + Incorrect entity. Locations were not valid. This results from missing required fields, invalid data, or partial error. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + summary: Update Locations + delete: + tags: + - Locations + operationId: deleteLocations + description: | + Delete existing locations. + + You cannot delete locations that are shipping origins or have open order transactions. The location with a `location_id` of 1 is the storeʼs default shipping origin, and you cannot change the shipping origin. + + You can delete locations assigned to pickup methods. + + > Warning: + > + > Deleting locations that have inventory also deletes its stock. + parameters: + - in: query + name: 'location_id:in' + description: Comma separated list of `location_id`. + required: true + schema: + type: integer + responses: + '200': + description: Request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/SimpleTransactionResponse' + '404': + description: Request has been rejected due to resource not being found. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '422': + description: | + Incorrect entity. The location is not valid. This error is the result of missing required fields or invalid data. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + Location with open transactions: + value: + status: 422 + title: Location with associated orders canʼt be deleted. {label} is associated with 1 order(s) and canʼt be deleted by now. + type: 'https://developer.bigcommerce.com/docs/start/about/status-codes' + errors: {} + Location is a shipping origin: + value: + status: 422 + title: Location canʼt be deleted. {label} is set as a shipping origin for this store and canʼt be deleted. + type: 'https://developer.bigcommerce.com/docs/start/about/status-codes' + errors: {} + summary: Delete Locations + '/inventory/locations/{location_id}/metafields': + parameters: + - $ref: '#/components/parameters/Accept' + - schema: + type: string + name: location_id + in: path + required: true + get: + summary: Get Metafields + description: Retrieve metafields for a location. + parameters: + - $ref: '#/components/parameters/LocationIdParam' + operationId: getLocationMetafields + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + examples: {} + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Metafield' + meta: + type: object + properties: + pagination: + type: object + properties: + total: + type: integer + description: The total number of items in the result set. + count: + type: integer + description: The total number of items in the collection on current page. + per_page: + type: integer + description: 'The number of items returned in the collection per page, controlled by the limit parameter.' + current_page: + type: integer + description: The page you are currently on within the collection. + total_pages: + type: integer + description: The total number of pages in the collection. + links: + type: object + description: Pagination links for parts of the whole collection. + properties: + current: + type: string + description: A link to the current page is returned in the response. + example: '?limit=100&page=1' + tags: + - Metafields + post: + summary: Create a Metafield + description: Create a location metafield. + operationId: createLocationMetafield + parameters: + - $ref: '#/components/parameters/LocationIdParam' + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MetafieldBase' + required: true + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + examples: {} + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Metafield' + meta: + type: object + properties: {} + additionalProperties: true + '400': + description: Bad Request. Metafield is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '409': + description: | + The `Metafield` conflicted with another `Metafield`. This can result from duplicate unique key combinations of the appʼs client id, namespace, key, resource_type, and resource_id. + content: + application/json: + examples: {} + schema: + type: object + properties: + status: + type: integer + description: The HTTP status code generated by the origin server for this occurrence of the problem. + title: + type: string + description: Human readable error message. + type: + type: string + description: URL identifying the error type. Dereferencing the URL leads to documentation about the error type. + '422': + description: | + The `Metafield` was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + examples: {} + schema: + $ref: '#/components/schemas/ErrorResponse' + tags: + - Metafields + '/inventory/locations/{location_id}/metafields/{metafield_id}': + parameters: + - $ref: '#/components/parameters/Accept' + description: 'Gets a `Metafield`, by `location_id`.' + get: + parameters: + - $ref: '#/components/parameters/LocationIdParam' + - $ref: '#/components/parameters/MetafieldIdParam' + summary: Get a Metafield + description: Get a metafield by location. + operationId: getLocationMetafield + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + examples: {} + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Metafield' + meta: + type: object + properties: {} + additionalProperties: true + '404': + description: The resource was not found. + content: + application/json: + examples: {} + schema: + $ref: '#/components/schemas/ErrorResponse' + tags: + - Metafields + put: + parameters: + - $ref: '#/components/parameters/LocationIdParam' + - $ref: '#/components/parameters/MetafieldIdParam' + summary: Update a Metafield + description: Update a metafield. + operationId: updateLocationMetafield + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MetafieldBase' + required: true + description: '' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + examples: {} + schema: + type: object + properties: + data: + $ref: '#/components/schemas/Metafield' + meta: + type: object + properties: {} + additionalProperties: true + '400': + description: Bad Request. Metafield is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '404': + description: The resource was not found. + content: + application/json: + examples: {} + schema: + $ref: '#/components/schemas/ErrorResponse' + application/xml: + schema: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + errors: + type: object + properties: {} + additionalProperties: true + tags: + - Metafields + delete: + parameters: + - $ref: '#/components/parameters/LocationIdParam' + - $ref: '#/components/parameters/MetafieldIdParam' + summary: Delete a Metafield + description: Delete a metafield. + operationId: deleteLocationMetafield + responses: + '204': + description: No Content + '404': + description: The resource was not found. + content: + application/json: + examples: {} + schema: + $ref: '#/components/schemas/ErrorResponse' + application/xml: + schema: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + errors: + type: object + properties: {} + additionalProperties: true + tags: + - Metafields + '/inventory/locations/metafields': + get: + summary: Get All Metafields + tags: + - Batch metafields + description: Get all location metafields. + operationId: getLocationsMetafields + responses: + '200': + description: | + List of `Metafield` objects. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponse' + parameters: + - $ref: '#/components/parameters/PageParam' + - $ref: '#/components/parameters/LimitParam' + - $ref: '#/components/parameters/MetafieldKeyParam' + - $ref: '#/components/parameters/MetafieldKeyInParam' + - $ref: '#/components/parameters/MetafieldNamespaceParam' + - $ref: '#/components/parameters/MetafieldNamespaceInParam' + - $ref: '#/components/parameters/DirectionParam' + - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + post: + summary: Create multiple Metafields + tags: + - Batch metafields + description: Create multiple metafields. + operationId: createLocationsMetafields + requestBody: + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '#/components/schemas/MetafieldBase_Post' + - type: object + properties: + resource_id: + type: integer + example: 42 + description: | + The ID of the location with which the metafield is associated. + required: + - resource_id + description: '' + responses: + '200': + description: | + List of created `Metafield` objects. # TODO + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Metafield is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '422': + description: | + Response object for metafields creation with partial success. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' + put: + summary: Update multiple Metafields + tags: + - Batch metafields + description: Create multiple metafields. + operationId: updateLocationsMetafields + requestBody: + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: '#/components/schemas/MetafieldBase_Put' + - type: object + properties: + id: + type: string + example: "42" + description: | + The ID of metafield to update. + required: + - id + description: '' + responses: + '200': + description: | + List of updated `Metafield` objects. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponse_POST_PUT' + '400': + description: Bad Request. Metafield is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + example: + status: 400 + title: Input is invalid + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + detail: Syntax error + '422': + description: | + Response object for metafields creation with partial success. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' + delete: + summary: Delete Multiple Metafields + tags: + - Batch metafields + description: Delete all location metafields. + operationId: deleteLocationsMetafields + requestBody: + content: + application/json: + schema: + type: array + items: + type: integer + description: List of metafield IDs. + responses: + '200': + description: | + Response object for metafields deletion with success. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionDeleteResponseSuccess' + '422': + description: | + Response object for metafields deletion with partial success. + content: + application/json: + schema: + $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_DELETE' +components: + schemas: + ErrorResponse: + type: object + properties: + status: + type: integer + description: The HTTP status code generated by the origin server for this occurrence of the problem. + title: + type: string + description: Human readable error message. + type: + type: string + description: | + URL identifying the error type. Dereferencing the URL leads to documentation about the error type. + errors: + type: object + properties: {} + additionalProperties: true + description: The detailed summary describing the particular error. + Meta: + type: object + properties: + pagination: + type: object + properties: + total: + type: integer + description: The total number of items in the result set. + example: 2 + count: + type: integer + description: The total number of items in the collection on current page. + example: 2 + per_page: + type: integer + description: 'The number of items returned in the collection per page, controlled by the limit parameter.' + example: 100 + current_page: + type: integer + description: The page you are currently on within the collection. + example: 1 + total_pages: + type: integer + description: The total number of pages in the collection. + example: 1 + links: + type: object + description: Pagination links for the previous and next parts of the whole collection. + properties: + previous: + type: string + description: The link to the previous page is returned in the response. + example: '?limit=100&page=1' + current: + type: string + description: A link to the current page is returned in the response. + example: '?limit=100&page=1' + next: + type: string + description: Link to the next page returned in the response. + example: '?limit=100&page=1' + OperatingHoursForDay: + type: object + properties: + open: + type: boolean + description: Boolean variable that defines if the location is open or not. + default: false + opening: + type: string + description: Opening time. + format: string + example: '08:00' + closing: + type: string + description: Closing time. + format: string + example: '16:00' + OperatingHours: + type: object + description: Schedule with opening and closing hours for each day of the week. + properties: + sunday: + $ref: '#/components/schemas/OperatingHoursForDay' + monday: + $ref: '#/components/schemas/OperatingHoursForDay' + tuesday: + $ref: '#/components/schemas/OperatingHoursForDay' + wednesday: + $ref: '#/components/schemas/OperatingHoursForDay' + thursday: + $ref: '#/components/schemas/OperatingHoursForDay' + friday: + $ref: '#/components/schemas/OperatingHoursForDay' + saturday: + $ref: '#/components/schemas/OperatingHoursForDay' + BlackoutHours: + type: array + items: + type: object + properties: + label: + type: string + example: Thanksgiving + date: + type: string + format: date + example: '2022-09-29' + open: + type: boolean + opening: + type: string + format: string + example: '09:00' + default: '00:00' + closing: + type: string + format: string + example: '09:00' + default: '00:00' + all_day: + type: boolean + default: false + annual: + type: boolean + default: false + required: + - label + - date + - open + LocationResponse: + type: object + description: '' + title: '' + properties: + id: + type: integer + description: Location immutable unique identifier. + example: 2 + code: + type: string + description: Location user-defined unique identifier. + example: BIGC-1 + label: + type: string + description: Location label. + example: Central store + description: + type: string + description: Description of location. + example: Central shop of the world + managed_by_external_source: + type: boolean + description: | + Indicates if the third-party system is the source of truth for inventory values. If set to true, manually editing inventory in BCʼs control panel will be disabled. + default: false + type_id: + type: string + description: Describe type of given location. + default: PHYSICAL + enum: + - PHYSICAL + - VIRTUAL + enabled: + type: boolean + description: Indicator of accessibility of the location. + default: true + operating_hours: + $ref: '#/components/schemas/OperatingHours' + time_zone: + type: string + description: Time zone of location. + example: Etc/GMT+12 + created_at: + type: string + format: date-time + description: Time when location was created. + example: '2022-05-30T12:18:02Z' + updated_at: + type: string + format: date-time + description: Time of last update of the location. + example: '2022-05-30T12:18:02Z' + address: + type: object + properties: + address1: + type: string + description: Main address information. + example: Central Park + address2: + type: string + description: Additional address information. + city: + type: string + description: The city where the location is located. + example: New York City + state: + type: string + description: The state where the location is located. + example: NY + zip: + type: string + description: Zip code of the location. + example: '11111' + email: + type: string + format: email + description: Email of the location. + example: test@example.com + phone: + type: string + description: Phone number of the location. + example: 800-555-0198 + geo_coordinates: + type: object + description: Object with latitude and longitude that points at the location. + properties: + latitude: + type: number + format: float + description: Latitude. + example: 11 + longitude: + type: number + format: float + description: Longitude. + example: 8 + country_code: + type: string + description: ISO 3166-1 alpha-3 code. + example: US + storefront_visibility: + type: boolean + description: Indicator of accessibility of location on the storefront. + default: true + special_hours: + type: array + items: + type: object + properties: + label: + type: string + example: Thanksgiving + date: + type: string + format: date + example: '2022-09-29' + open: + type: boolean + opening: + type: string + format: string + example: '09:00' + default: '00:00' + closing: + type: string + format: string + example: '09:00' + default: '00:00' + all_day: + type: boolean + default: false + annual: + type: boolean + default: false + LocationsUpdateRequest: + type: array + description: '' + title: '' + items: + type: object + description: A request to update an existing locations. + properties: + id: + type: integer + description: Location immutable unique identifier. + example: 2 + code: + type: string + description: Location user-defined unique identifier. + example: BIGC-2 + label: + type: string + description: Location label. + example: Central store + description: + type: string + description: Description of location. + example: Central shop of the world + managed_by_external_source: + type: boolean + description: | + Indicates if the third-party system is the source of truth for inventory values. If set to true, manually editing inventory in BCʼs control panel will be disabled. + default: false + type_id: + type: string + enum: + - PHYSICAL + - VIRTUAL + description: Describe type of given location. + default: PHYSICAL + enabled: + type: boolean + description: Indicator of accessibility of the location. + default: true + operating_hours: + $ref: '#/components/schemas/OperatingHours' + time_zone: + type: string + description: Time zone of location. + example: Etc/UTC + address: + type: object + properties: + address1: + type: string + description: Main address information. + example: 5th Ave + address2: + type: string + description: Additional address information. + city: + type: string + description: The city where the location is located. + example: New York City + state: + type: string + description: The state where the location is located. + example: NY + zip: + type: string + description: Zip code of the location. + example: '12345' + email: + type: string + format: email + description: Email of the location. + example: test@example.com + phone: + type: string + description: Phone number of the location. + example: 800-555-0198 + geo_coordinates: + type: object + description: Object with latitude and longitude that points at the location. + properties: + latitude: + type: number + format: float + description: Latitude. + exclusiveMinimum: false + minimum: -90 + maximum: 90 + example: 11 + longitude: + type: number + format: float + description: Longitude. + minimum: -180 + maximum: 180 + example: 11 + required: + - latitude + - longitude + country_code: + type: string + description: ISO 3166-1 alpha-3 code. + default: US + enum: + - US + required: + - country_code + storefront_visibility: + type: boolean + description: Indicator of accessibility of location on the storefront. + default: true + special_hours: + $ref: '#/components/schemas/BlackoutHours' + required: + - id + LocationsCreateRequest: + type: array + title: '' + description: '' + items: + type: object + properties: + code: + type: string + description: Location user-defined unique identifier. + example: BIGC-1 + label: + type: string + description: Location label. + example: Central store + description: + type: string + description: 'Description of location. This field can be returned by the GraphQL Storefront API so that additional details can be exposed to customers on the storefront (customer-facing). ' + example: Central shop of the world + managed_by_external_source: + type: boolean + description: | + Indicates if the third-party system is the source of truth for inventory values. If set to true, manually editing inventory in BCʼs control panel will be disabled. + default: false + type_id: + type: string + enum: + - PHYSICAL + - VIRTUAL + description: Describe type of given location. + default: PHYSICAL + enabled: + type: boolean + default: true + operating_hours: + $ref: '#/components/schemas/OperatingHours' + time_zone: + type: string + description: 'Time zone of location. For a list of valid time zones, please view: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.' + example: Etc/UTC + address: + type: object + description: Address is required if the locationʼs `type_id` is `PHYSICAL`. + required: + - address1 + - city + - state + - zip + - email + - geo_coordinates + - country_code + properties: + address1: + type: string + description: Main address information. + example: 5th Ave + address2: + type: string + description: Additional address information. + city: + type: string + description: The city where the location is located. + example: New York + state: + type: string + description: The state where the location is located. + example: NY + format: enum + zip: + type: string + description: Zip code of the location. + example: '10021' + email: + type: string + description: Email of the location. + example: test@example.com + format: email + phone: + type: string + description: Phone number of the location. + example: 800-555-0198 + geo_coordinates: + type: object + description: Object with latitude and longitude that points at the location. + properties: + latitude: + type: number + format: float + description: Latitude. + example: 40.774378 + minimum: -90 + maximum: 90 + exclusiveMaximum: false + longitude: + type: number + format: float + description: Longitude. + minimum: -180 + maximum: 180 + example: -73.9653178 + required: + - latitude + - longitude + country_code: + type: string + description: ISO 3166-1 alpha-3 code. + format: enum + example: US + storefront_visibility: + type: boolean + default: true + special_hours: + $ref: '#/components/schemas/BlackoutHours' + required: + - label + - managed_by_external_source + - type_id + - time_zone + - address + SimpleTransactionResponse: + type: object + properties: + transaction_id: + type: string + description: Unique identifier of performed action. + MetafieldBase: + type: object + description: | + Common metafield properties. + properties: + key: + type: string + description: 'The name of the field, for example: `location_id`, `color`.' + x-required: + - post + minLength: 1 + maxLength: 64 + example: status + value: + type: string + description: | + The value of the field, for example: `1`, `blue`. + x-required: + - post + minLength: 1 + maxLength: 65535 + example: upcoming + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + x-required: + - post + minLength: 1 + maxLength: 64 + example: headquarters + permission_set: + type: string + description: | + Determines the visibility and writeability of the field by other API consumers. + | Value | Description | + | :--- | :--- | + | `app_only` | Private to the app that owns the field. | + | `read` | Visible to other API consumers. | + | `write` | Open for reading and writing by other API consumers. | + | `read_and_sf_access` | Visible to other API consumers, including on the storefront. | + | `write_and_sf_access` | Open for reading and writing by other API consumers, including on the storefront. | + enum: + - app_only + - read + - write + - read_and_sf_access + - write_and_sf_access + x-required: + - post + description: + type: string + description: | + Description for the metafields. + minLength: 0 + maxLength: 255 + Metafield: + description: | + Allows app partners to write custom data to various resources in the API. + allOf: + - type: object + properties: + id: + type: integer + description: Unique ID for the metafield. + example: 1 + - $ref: '#/components/schemas/MetafieldBase' + - type: object + properties: + resource_type: + type: string + description: | + The type of resource with which the metafield is associated. + enum: + - location + resource_id: + type: integer + description: | + The unique identifier for the resource with which the metafield is associated. + minimum: 0 + maximum: 10000000000 + readOnly: true + - type: object + properties: + date_created: + type: string + format: date-time + description: | + Date and time when the metafield was created. + example: '2022-04-14T23:06:45+00:00' + date_modified: + type: string + format: date-time + description: | + Date and time when the metafield was last updated. + example: '2022-09-08T04:18:55+00:00' + owner_client_id: + type: string + description: Client ID for the metafieldʼs creator. + example: asdfasdfasdfasdfasdfasdfasdf + readOnly: true + MetaFieldCollectionResponse: + type: object + description: | + Response payload for the BigCommerce API. + properties: + data: + type: array + items: + $ref: '#/components/schemas/Metafield' + meta: + $ref: '#/components/schemas/CollectionMeta' + x-internal: false + MetaFieldCollectionResponse_POST_PUT: + type: object + description: | + Response payload for the BigCommerce API. + properties: + data: + type: array + items: + $ref: '#/components/schemas/Metafield' + errors: + type: array + description: Empty for 200 responses. + example: [] + items: {} + meta: + $ref: '#/components/schemas/CollectionMeta' + MetaFieldCollectionResponsePartialSuccess_POST_PUT: + type: object + description: | + Response payload for the BigCommerce API. + properties: + data: + type: array + items: + $ref: '#/components/schemas/Metafield' + errors: + type: array + items: + $ref: '#/components/schemas/Error' + meta: + $ref: '#/components/schemas/WriteCollectionPartialSuccessMeta' + MetaFieldCollectionResponsePartialSuccess_DELETE: + type: object + description: | + Response payload for the BigCommerce API. + properties: + data: + type: array + items: + type: integer + description: | + The unique identifier for the metafield. + example: + - 123 + errors: + type: array + items: + $ref: '#/components/schemas/Error' + meta: + $ref: '#/components/schemas/WriteCollectionPartialSuccessMeta' + x-internal: false + MetaFieldCollectionDeleteResponseSuccess: + type: object + description: | + Response payload for the BigCommerce API. + properties: + data: + type: array + items: + type: integer + description: | + The unique identifier for the metafield. + example: + - 123 + - 124 + - 125 + errors: + type: array + description: Empty for 200 responses. + example: [] + items: {} + meta: + $ref: '#/components/schemas/WriteCollectionSuccessMeta' + x-internal: false + WriteCollectionPartialSuccessMeta: + type: object + description: 'Additional data about the response.' + properties: + total: + type: integer + description: | + Total number of items in the result set. + example: 3 + success: + type: integer + description: | + Total number of items that were successfully deleted. + example: 1 + failed: + type: integer + description: | + Total number of items that failed to be deleted. + example: 2 + title: Collection Meta + x-internal: false + WriteCollectionSuccessMeta: + type: object + description: 'Additional data about the response.' + properties: + total: + type: integer + description: | + Total number of items in the result set. + example: 3 + success: + type: integer + description: | + Total number of items that were successfully deleted. + example: 3 + failed: + type: integer + description: | + Total number of items that failed to be deleted. + example: 0 + title: Collection Meta + x-internal: false + Total: + type: integer + description: | + Total number of items in the result set. + example: 3 + Success: + type: integer + description: | + Total number of items that were successfully deleted. + example: 1 + Failed: + type: integer + description: | + Total number of items that failed to be deleted. + example: 2 + Error: + type: object + description: | + Error response payload for the BigCommerce API. + properties: + status: + type: integer + description: | + The HTTP status code for the error. + example: 422 + title: + type: string + description: | + The error title. + example: Bulk operation has failed + type: + type: string + description: | + The error type. + example: https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes + errors: + $ref: '#/components/schemas/ErrorDetail' + ErrorDetail: + type: object + properties: {} + additionalProperties: true + description: | + Error detail response payload for the BigCommerce API. + example: + "1": "Unauthorized to delete" + "2": "Metafield does not exist" + CollectionMeta: + type: object + description: Data about the response, including pagination and collection totals. + properties: + pagination: + type: object + description: Data about the response, including pagination and collection totals. + title: Pagination + properties: + total: + type: integer + description: | + Total number of items in the result set. + example: 36 + count: + type: integer + description: | + Total number of items in the collection response. + example: 36 + per_page: + type: integer + description: | + The amount of items returned in the collection per page, controlled by the limit parameter. + example: 50 + current_page: + type: integer + description: | + The page you are currently on within the collection. + example: 1 + total_pages: + type: integer + description: | + The total number of pages in the collection. + example: 1 + links: + type: object + description: | + Pagination links for the previous and next parts of the whole collection. + properties: + previous: + type: string + description: | + Link to the previous page returned in the response. + current: + type: string + description: | + Link to the current page returned in the response. + example: '?page=1&limit=50' + next: + type: string + description: | + Link to the next page returned in the response. + additionalProperties: true + title: Collection Meta + x-internal: false + MetafieldBase_Post: + type: object + description: | + Common Metafield properties. + x-internal: false + properties: + permission_set: + type: string + description: | + Determines the visibility and writeability of the field by other API consumers. + | Value | Description | + | :--- | :--- | + | `app_only` | Private to the app that owns the field. | + | `read` | Visible to other API consumers. | + | `write` | Open for reading and writing by other API consumers. | + | `read_and_sf_access` | Visible to other API consumers, including on the storefront. | + | `write_and_sf_access` | Open for reading and writing by other API consumers, including on the storefront. | + enum: + - app_only + - read + - write + - read_and_sf_access + - write_and_sf_access + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 + key: + type: string + description: | + The name of the field, for example: `location_id`, `color`. + minLength: 1 + maxLength: 64 + example: Staff Name + value: + type: string + description: | + The value of the field, for example: `1`, `blue`. + minLength: 1 + maxLength: 65535 + example: Ronaldo + description: + type: string + description: | + Description for the metafields. + minLength: 0 + maxLength: 255 + example: Name of Staff Member + required: + - permission_set + - namespace + - key + - value + MetafieldBase_Put: + type: object + description: | + Common Metafield properties. + x-internal: false + properties: + permission_set: + type: string + description: | + Determines the visibility and writeability of the field by other API consumers. + | Value | Description | + | :--- | :--- | + | `app_only` | Private to the app that owns the field. | + | `read` | Visible to other API consumers. | + | `write` | Open for reading and writing by other API consumers. | + | `read_and_sf_access` | Visible to other API consumers, including on the storefront. | + | `write_and_sf_access` | Open for reading and writing by other API consumers, including on the storefront. | + enum: + - app_only + - read + - write + - read_and_sf_access + - write_and_sf_access + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 + key: + type: string + description: | + The name of the field, for example: `location_id`, `color`. + minLength: 1 + maxLength: 64 + example: Staff Name + value: + type: string + description: | + The value of the field, for example: `1`, `blue`. + minLength: 1 + maxLength: 65535 + example: Ronaldo + description: + type: string + description: | + Description for the metafields. + minLength: 0 + maxLength: 255 + example: Name of Staff Member + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + LocationIdParam: + in: path + name: location_id + description: Unique identifier for a location. + required: true + schema: + type: integer + LocationIdsParam: + in: query + name: 'location_id:in' + description: Comma separated list of `location_id`. + required: false + schema: + type: integer + LocationCodeFilterParam: + in: query + name: 'location_code:in' + description: Comma separated list of `location_code`. + required: false + schema: + type: string + LocationIsDefaultParam: + in: query + name: is_default + description: Filter whether the location is the default. + required: false + schema: + type: boolean + LocationTypeIdParam: + in: query + name: 'type_id:in' + description: Comma separated list of locations type codes. + required: false + schema: + type: string + LocationManagedByExternalSourceParam: + in: query + name: managed_by_external_source + description: Filter whether an external source manages location inventory levels. + required: false + schema: + type: boolean + LocationIsActiveParam: + in: query + name: is_active + description: 'Filter by active locations flag; return both if not specified.' + required: false + schema: + type: boolean + LocationStorefrontVisibilityParam: + in: query + name: storefront_visibility + description: 'Filter by storefront_visibility flag; return both if not specified.' + required: false + schema: + type: boolean + MetafieldIdParam: + in: path + name: metafield_id + description: Unique identifier for a metafield. + required: true + schema: + type: integer + PageParam: + name: page + description: | + Specifies the page number in a limited (paginated) list of products. + required: false + in: query + schema: + type: integer + MetafieldKeyParam: + name: key + in: query + description: Filter based on a metafieldʼs key. + required: false + schema: + type: string + MetafieldKeyInParam: + name: key:in + in: query + description: Filter based on comma-separated metafieldʼs keys. Could be used with vanilla 'key' query parameter. + required: false + style: form + explode: false + schema: + type: array + items: + type: string + MetafieldNamespaceParam: + name: namespace + in: query + description: Filter based on a metafieldʼs namespaces. + required: false + schema: + type: string + MetafieldNamespaceInParam: + name: namespace:in + in: query + description: Filter based on comma-separated metafieldʼs namespaces. Could be used with vanilla 'namespace' query parameter. + required: false + style: form + explode: false + schema: + type: array + items: + type: string + LimitParam: + name: limit + description: | + Controls the number of items per page in a limited (paginated) list of products. + required: false + in: query + schema: + type: integer + DirectionParam: + name: direction + description: | + Sort direction. Acceptable values are: `asc`, `desc`. + required: false + in: query + schema: + type: string + enum: + - asc + - desc + IncludeFieldsParamMetafields: + name: include_fields + in: query + description: Fields to include, in a comma-separated list. The ID and the specified fields will be returned. + style: form + explode: false + schema: + type: array + items: + type: string + enum: + - resource_id + - key + - value + - namespace + - permission_set + - resource_type + - description + - owner_client_id + - date_created + - date_modified + examples: + create_locations: + value: + - code: BIGC-1 + label: Central store + description: Central shop of the world + managed_by_external_source: false + type_id: PHYSICAL + enabled: true + operating_hours: + sunday: + open: false + opening: '08:00' + closing: '16:00' + monday: + open: false + opening: '08:00' + closing: '16:00' + tuesday: + open: false + opening: '08:00' + closing: '16:00' + wednesday: + open: false + opening: '08:00' + closing: '16:00' + thursday: + open: false + opening: '08:00' + closing: '16:00' + friday: + open: false + opening: '08:00' + closing: '16:00' + saturday: + open: false + opening: '08:00' + closing: '16:00' + time_zone: Etc/UTC + address: + address1: 5th Ave + address2: string + city: New York + state: NY + zip: '10021' + email: test@example.com + phone: 800-555-0198 + geo_coordinates: + latitude: 40.774378 + longitude: -73.9653178 + country_code: US + storefront_visibility: true + special_hours: + - label: Thanksgiving + date: '2022-09-29' + open: true + opening: '09:00' + closing: '09:00' + all_day: false + annual: false + update_locations: + value: + - id: 2 + code: BIGC-2 + label: Central store + description: Central shop of the world + managed_by_external_source: false + type_id: PHYSICAL + enabled: true + operating_hours: + sunday: + open: false + opening: '08:00' + closing: '16:00' + monday: + open: false + opening: '08:00' + closing: '16:00' + tuesday: + open: false + opening: '08:00' + closing: '16:00' + wednesday: + open: false + opening: '08:00' + closing: '16:00' + thursday: + open: false + opening: '08:00' + closing: '16:00' + friday: + open: false + opening: '08:00' + closing: '16:00' + saturday: + open: false + opening: '08:00' + closing: '16:00' + time_zone: Etc/UTC + address: + address1: 5th Ave + address2: string + city: New York City + state: NY + zip: '12345' + email: test@example.com + phone: 800-555-0198 + geo_coordinates: + latitude: 11 + longitude: 11 + country_code: US + storefront_visibility: true + special_hours: + - label: Thanksgiving + date: '2022-09-29' + open: true + opening: '09:00' + closing: '09:00' + all_day: false + annual: false + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Store Locations | read-only | `store_locations_read_only` | + | Store Locations | modify | `store_locations` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts#oauth-scopes). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header diff --git a/reference/orders.sf.yml b/reference/orders.sf.yml index 345d6ffc1..5e35dc202 100644 --- a/reference/orders.sf.yml +++ b/reference/orders.sf.yml @@ -179,7 +179,7 @@ components: description: The currency name. code: type: string - description: 'ISO-4217 currency code. (See: http://en.wikipedia.org/wiki/ISO_4217.)' + description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' symbol: type: string description: The currency symbol. diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 619be15c9..b444e0bf5 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -4569,7 +4569,7 @@ components: billing_address: $ref: '#/components/schemas/billingAddress_Base' default_currency_code: - description: The currency code of the transactional currency the shopper pays in is writeable when multi-currency is enabled. + description: The currency code of the transactional currency the shopper pays in is writable when multi-currency is enabled. type: string products: type: array diff --git a/reference/pickup.v3.yml b/reference/pickup.v3.yml new file mode 100644 index 000000000..1a586c9c1 --- /dev/null +++ b/reference/pickup.v3.yml @@ -0,0 +1,405 @@ +openapi: '3.0.3' +info: + title: Pickup + version: '3.0' + description: This API endpoint enables you to manage pickups. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Pickup + description: BigCommerce Pickup API Definition. +paths: + '/orders/pickups': + parameters: + - $ref: '#/components/parameters/Accept' + get: + operationId: get-pickup + tags: + - Pickup + summary: Get Pickups + description: |- + Retrieves a list of pickups. + + ## Examples + + You can filter the list to return pickup objects specific to a list of requested pickup or order IDs. + This is achieved by appending the query string `?order_id:in=100,103,202` or `pickup_id:in=1,4` to the + resource `/orders/pickups`. + + ```http + GET /orders/pickups?order_id:in=100,300,500 + ``` + or + ```http + GET /orders/pickups?pickup_id:in=7,13,17 + ``` + parameters: + - name: 'order_id:in' + description: Comma separated list of order IDs. + in: query + required: false + schema: + type: integer + format: int64 + - name: 'pickup_id:in' + description: Comma separated list of pickup IDs. + in: query + required: false + schema: + type: integer + format: int64 + responses: + '200': + description: The request has been processed and a list of pickups has been returned successfully. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Pickup' + post: + parameters: + - $ref: '#/components/parameters/ContentType' + operationId: post-pickup + tags: + - Pickup + summary: Create Pickups + description: |- + Creates one or many pickups. + + This is a batch operation that can create up to 100 pickup objects in one request. + + ## Limits + * Limit of creating 100 pickup objects per `POST` request. + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PostRequestPickup' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Pickup' + meta: + type: object + properties: {} + additionalProperties: true + '422': + description: | + Incorrect entity. Locations were not valid. This results from missing required fields, invalid data, or partial error. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + operationId: delete-pickup + tags: + - Pickup + summary: Delete Pickups + description: |- + Delete pickups by providing a list of `pickup_id`s. + + ## Examples + You can use the list of `pickup_ids` to delete the pickup items. This is achieved by appending the query string **?id:in=1,2,3** to the resource **/pickup**. + + ```http + DELETE /pickup?id:in=1,2,3 + ``` + parameters: + - name: 'id:in' + description: Comma separated list of pickup IDs. + in: query + required: true + schema: + type: integer + format: int64 + responses: + '204': + description: No Content + put: + parameters: + - $ref: '#/components/parameters/ContentType' + operationId: put-pickup + tags: + - Pickup + summary: Update Pickups + description: 'Update pickups by providing `pickup_id`, `collected_at`, and `ready_at` in the input.' + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PutRequestPickup' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Pickup' + meta: + type: object + properties: {} + additionalProperties: true + '422': + description: | + Incorrect entity. Locations were not valid. This results from missing required fields, invalid data, or partial error. See the response for more details. + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ErrorResponse' +components: + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + schemas: + BasePickup: + type: object + properties: + pickup_method_id: + type: integer + minimum: 1 + example: 2 + description: ID of pickup method. + order_id: + type: integer + minimum: 1 + example: 103 + description: ID of order. + Pickup: + allOf: + - type: object + properties: + id: + type: integer + example: 1 + description: The ID of pickup. + - $ref: '#/components/schemas/BasePickup' + - type: object + properties: + ready_at: + type: string + format: date-time + example: '2022-08-15T09:30:44Z' + description: 'Datetime when pickup was ready for collection. ' + created_at: + type: string + format: date-time + example: '2022-08-12T04:15:19.150539Z' + description: Datetime when pickup was created. + updated_at: + type: string + format: date-time + example: '2022-08-12T04:15:19.150539Z' + description: Datetime when pickup was updated. + pickup_items: + type: array + items: + $ref: '#/components/schemas/PickupItem' + BasePickupItem: + type: object + properties: + order_product_id: + type: integer + minimum: 1 + example: 4 + description: The ID of the product. + quantity: + type: integer + minimum: 1 + example: 5 + description: The quantity of an item. + PickupItem: + allOf: + - type: object + properties: + id: + type: integer + minimum: 1 + example: 3 + description: The ID of pickup. + - $ref: '#/components/schemas/BasePickupItem' + - type: object + properties: + status: + type: string + enum: + - AWAITING_COLLECTION + - COLLECTED + example: COLLECTED + description: The status of the pickup. + collected_at: + type: string + format: date-time + example: '2022-08-12T04:15:19.150539Z' + description: Date and time when the pickup was collected. + nullable: true + PostRequestPickup: + allOf: + - $ref: '#/components/schemas/BasePickup' + - type: object + properties: + ready_at: + type: string + description: | + Can be provided as two inputs. + Unix: Represents the time in seconds that has elapsed since Unix epoch (00:00:00 UTC on 1 January 1970) + ISO-8601: Represents the time in ISO format. + example: "'1660555844' or '2022-06-11T00:00:20Z'" + collected_at: + type: string + description: | + Can be provided as two inputs. + Unix: Represents the time in seconds that has elapsed since Unix epoch (00:00:00 UTC on 1 January 1970). + ISO-8601: Represents the time in ISO format. + If this value is not supplied, the pickup item collected_at property will be null. + example: "'1660831392' or '2022-06-18T00:00:30Z'" + pickup_items: + type: array + items: + $ref: '#/components/schemas/PostRequestPickupItem' + required: + - pickup_method_id + - order_id + - ready_at + - pickup_items + PostRequestPickupItem: + type: object + properties: + order_product_id: + type: integer + minimum: 1 + example: 4 + description: The ID of the product. + quantity: + type: integer + minimum: 1 + example: 5 + description: The quantity of an item. + required: + - order_product_id + - quantity + PutRequestPickup: + type: object + properties: + id: + type: integer + minimum: 1 + example: 2 + deprecated: true + pickup_id: + type: integer + minimum: 1 + example: 2 + description: The ID of pickup. + ready_at: + type: string + description: | + Can be provided as two inputs. + Unix: Represents the time in seconds that has elapsed since Unix epoch (00:00:00 UTC on 1 January 1970) + ISO-8601: Represents the time in ISO format. + example: "'1660555844' or '2022-06-11T00:00:20Z'" + collected_at: + type: string + description: | + Can be provided as two inputs. + Unix: Represents the time in seconds that has elapsed since Unix epoch (00:00:00 UTC on 1 January 1970). + ISO-8601: Represents the time in ISO format. + If this value is not supplied, the pickup item collected_at property will be null. + example: "'1660831392' or '2022-06-18T00:00:30Z'" + required: + - id + - pickup_id + ErrorResponse: + type: object + properties: + status: + type: integer + description: The HTTP status code generated by the origin server for this occurrence of the problem. + example: 422 + title: + type: string + description: Human readable error message. + example: JSON data is missing or invalid + type: + type: string + description: | + URL identifying the error type. Dereferencing the URL leads to documentation about the error type. + errors: + type: object + description: Detailed summary describing the particular error. + properties: {} + additionalProperties: true + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Order Fulfillment | read-only | `store_order_fulfillment_read_only` | + | Order Fulfillment | modify | `store_order_fulfillment_manage` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts#oauth-scopes). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header diff --git a/reference/pickup_methods.v3.yml b/reference/pickup_methods.v3.yml new file mode 100644 index 000000000..63e62affd --- /dev/null +++ b/reference/pickup_methods.v3.yml @@ -0,0 +1,402 @@ +openapi: '3.0.1' +info: + title: Pickup Methods + version: '3.0' + description: This API endpoint enables you to manage pickup methods. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Pickup Methods + description: BigCommerce Pickup Methods API Definition. +paths: + '/pickup/methods': + parameters: + - $ref: '#/components/parameters/Accept' + get: + operationId: get-pickup-methods + tags: + - Pickup Methods + summary: Get Pickup Methods + description: |- + Retrieves a list of pickup methods. + + ## Examples + + You can filter this list to return pickup method objects specific to a list of requested pickup method IDs. This is achieved by appending the query string `?id:in=1,3,5` to the resource `/pickup/methods`. + + ```http + GET /pickup/methods?id:in=1,3,5 + ``` + parameters: + - name: 'id:in' + description: Comma separated list of pickup method IDs. + in: query + required: false + schema: + type: integer + format: int64 + - name: limit + description: Maximum number of results per page. + in: query + required: false + schema: + type: integer + format: int64 + - name: page + description: The number of the page to be fetched. + in: query + required: false + schema: + type: integer + format: int64 + - name: date_created + description: |- + Filter pickup methods by the date created. Return methods created on the provided date. + + For example, `date_created=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: date_created:min + description: |- + Filter pickup methods by minimum date created. Return methods created after the provided date. + + For example, `date_created:min=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: date_created:max + description: |- + Filter pickup methods by maximum date created. Return methods created before the provided date. + + For example, `date_created:max=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: date_modified + description: |- + Filter pickup methods by date modified. Return methods modified on the provided date. + + For example, `date_modified=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: date_modified:min + description: |- + Filter pickup methods by minimum date modified. Return methods modified after the provided date. + + For example, `date_modified:min=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: date_modified:max + description: |- + Filter pickup methods by maximum date modified. Return methods modified before the provided date. + + For example, `date_modified:max=2023-09-07T06:23:13Z`. + in: query + required: false + schema: + type: string + format: date-time + example: '2023-09-07T06:23:13Z' + - name: sort + description: |- + Sort pickup methods by date_modified:* or name:* ; for example, `sort=name:asc`. + + - `date_modified:asc` - sort by date modified in ascending order + - `date_modified:desc` - sort by date modified in descending order + - `name:asc` - sort by name in ascending order + - `name:desc` - sort by name in descending order + in: query + required: false + schema: + type: string + enum: + - 'date_modified:asc' + - 'date_modified:desc' + - 'name:asc' + - 'name:desc' + responses: + '200': + description: The request has been processed and a list of pickup methods has been returned successfully. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/PickupMethodResponse' + meta: + $ref: '#/components/schemas/MetaCollection' + post: + parameters: + - $ref: '#/components/parameters/ContentType' + operationId: post-pickup-methods + tags: + - Pickup Methods + summary: Create Pickup Methods + description: |- + Creates one or many pickup methods. + + This is a batch operation that can create up to 100 pickup methods objects in one request. + + ## Limits + * Limit of creating 100 pickup method objects per `POST` request. + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/BasePickupMethod' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/PickupMethodResponse' + meta: + type: object + properties: {} + additionalProperties: true + put: + parameters: + - $ref: '#/components/parameters/ContentType' + operationId: put-pickup-methods + tags: + - Pickup Methods + summary: Update Pickup Methods + description: |- + Update existing pickup methods. + + This batch operation can update 10 pickup method objects in one request. + + Only the `id` property of the pickup method object is required as part of the request. Pickup method properties that are not provided will maintain their existing values. + + ## Limits + * Limit of updating 10 pickup method objects per `PUT` request. + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + allOf: + - type: object + properties: + id: + type: integer + example: 1 + description: The ID of the pickup method. + - $ref: '#/components/schemas/BasePickupMethod' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/PickupMethodResponse' + meta: + type: object + properties: {} + additionalProperties: true + delete: + operationId: delete-pickup-methods + tags: + - Pickup Methods + description: Delete existing pickup methods. + parameters: + - name: 'id:in' + description: Comma separated list of pickup method IDs. + in: query + required: true + schema: + type: integer + format: int64 + responses: + '204': + description: No Content + summary: Delete Pickup Methods +components: + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + schemas: + BasePickupMethod: + type: object + properties: + location_id: + type: integer + example: 2 + description: The ID of the location. + display_name: + type: string + minLength: 0 + maxLength: 250 + example: Office Pickup! + description: Title of the pickup method. + collection_instructions: + type: string + minLength: 0 + maxLength: 250 + example: Bring your ID! + description: Instructions for picking up items. + collection_time_description: + type: string + minLength: 0 + maxLength: 250 + example: Collect during our opening hours of 0900 - 1700 + description: The description of collection time. + location_identity: + type: integer + example: 2 + deprecated: true + PickupMethodResponse: + allOf: + - type: object + properties: + id: + type: integer + example: 1 + description: The ID of the pickup method. + - $ref: '#/components/schemas/BasePickupMethod' + - type: object + properties: + date_created: + type: string + format: date-time + example: '2023-06-06T00:00:20Z' + description: |- + Filter pickup methods by time created. + + Time is presented in ISO-8601 format. + date_modified: + type: string + format: date-time + example: '2023-06-08T00:00:20Z' + description: |- + Filter pickup methods by time modified. + + Time is presented in ISO-8601 format. + MetaCollection: + type: object + properties: + pagination: + type: object + properties: + total: + type: integer + description: Total number of items in the result set. + example: 123 + count: + type: integer + description: The total number of items in the collection on the current page. + example: 100 + per_page: + type: integer + description: 'The amount of items returned in the collection per page, controlled by the limit parameter.' + example: 100 + current_page: + type: integer + description: The page you are currently on within the collection. + example: 1 + total_pages: + type: integer + description: The total number of pages in the collection. + example: 2 + links: + type: object + description: Pagination links for the previous and next parts of the whole collection. + properties: + previous: + type: string + description: A link to the previous page is returned in the response. + current: + type: string + description: A link to the current page is returned in the response. + next: + type: string + description: A link to the next page is returned in the response. + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Fulfillment Methods | read-only | `store_fulfillment_methods_read_only` | + | Fulfillment Methods | modify | `store_fulfillment_methods_manage` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header diff --git a/reference/pickup_options.sf.yml b/reference/pickup_options.sf.yml new file mode 100644 index 000000000..65f74c426 --- /dev/null +++ b/reference/pickup_options.sf.yml @@ -0,0 +1,175 @@ +openapi: '3.0.1' +info: + title: Storefront Pickup Options + version: '3.0' + description: |- + This API endpoint enables you to search for available pickup options near provided coordinates. + + For info about API accounts, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For info about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://{store_domain}/api/storefront' + variables: + store_domain: + default: your_store.example.com + description: 'The [URL authority](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL#authority) of the storefront.' +tags: + - name: Pickup Options + description: BigCommerce Storefront Pickup Options Definition. +paths: + /pickup-options: + parameters: + - $ref: '#/components/parameters/Accept' + post: + summary: Find Available Pickup Options + operationId: post-pickup-options + tags: + - Pickup Options + description: |- + Returns up to 10 available pickup options for the requested items around a radius of the provided search coordinates. + + The pickup options returned only include options where all requested items are available and can be picked up from a single location. + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PickupRequestPayload' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '#/components/schemas/PickupOptionsResponse' +components: + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + schemas: + PickupRequestPayload: + type: object + properties: + searchArea: + $ref: '#/components/schemas/SearchArea' + items: + type: array + description: Items you include in your search for pickup options. + items: + $ref: '#/components/schemas/Item' + SearchArea: + type: object + description: Area where you are searching for pickup options. + properties: + radius: + type: object + description: Radius around the coordinates where you are searching for pickup options. + properties: + value: + type: integer + example: 25 + unit: + type: string + enum: + - KM + - MI + coordinates: + $ref: '#/components/schemas/Coordinates' + Coordinates: + type: object + description: Coordinates where you are searching for pickup options. + properties: + latitude: + type: number + example: 37.7749 + longitude: + type: number + example: 122.4194 + Item: + type: object + properties: + variantId: + type: integer + example: 24 + quantity: + type: integer + example: 98 + PickupOptionsResponse: + type: object + properties: + pickupOptions: + type: array + description: Pickup options for the available items. + items: + $ref: '#/components/schemas/PickupOption' + PickupOption: + type: object + properties: + pickupMethod: + $ref: '#/components/schemas/PickupMethod' + availableItems: + type: array + description: Items that are available using the pickup method. + items: + $ref: '#/components/schemas/AvailableItem' + PickupMethod: + type: object + description: Pickup method that can be used with the available items. + properties: + id: + type: integer + example: 1 + locationId: + type: integer + example: 2 + displayName: + type: string + minLength: 0 + maxLength: 250 + example: Office Pickup! + collectionInstructions: + type: string + minLength: 0 + maxLength: 250 + example: Bring your ID! + collectionTimeDescription: + type: string + minLength: 0 + maxLength: 250 + example: Collect during our opening hours of 0900 - 1700 + AvailableItem: + type: object + properties: + variantId: + type: integer + example: 55 + quantity: + type: integer + example: 12 diff --git a/reference/pickup_options.v3.yml b/reference/pickup_options.v3.yml new file mode 100644 index 000000000..fce7ea214 --- /dev/null +++ b/reference/pickup_options.v3.yml @@ -0,0 +1,213 @@ +openapi: '3.0.1' +info: + title: Pickup Options V3 + version: '3.0' + description: This API provides a way to search for available pickup options near provided coordinates. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Pickup Options + description: BigCommerce Pickup Options V3 Definition. +paths: + '/pickup/options': + parameters: + - $ref: '#/components/parameters/Accept' + post: + parameters: + - $ref: '#/components/parameters/ContentType' + summary: Find Available Pickup Options + operationId: post-pickup-options + tags: + - Pickup Options + description: |- + Returns up to 10 available pickup options for the requested items around a radius of the provided search coordinates. + + The pickup options returned only include options where all requested items are available and can be picked up from a single location. + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PickupRequestPayload' + responses: + '200': + description: The request has been successfully processed. + content: + application/json: + schema: + $ref: '#/components/schemas/PickupOptionsResponse' +components: + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + schemas: + PickupRequestPayload: + type: object + properties: + search_area: + $ref: '#/components/schemas/SearchArea' + items: + type: array + description: Items you include in your search for pickup options. + items: + $ref: '#/components/schemas/Item' + required: + - search_area + - items + SearchArea: + type: object + description: Area where you are searching for pickup options. + properties: + coordinates: + $ref: '#/components/schemas/Coordinates' + radius: + type: object + description: Radius around the coordinates where you are searching for pickup options. + required: + - value + - unit + properties: + value: + type: integer + example: 10 + unit: + type: string + enum: + - KM + - MI + required: + - radius + Coordinates: + type: object + description: Coordinates where you are searching for pickup options. + properties: + latitude: + type: number + example: 37.7749 + longitude: + type: number + example: 122.4194 + required: + - latitude + - longitude + Item: + type: object + properties: + variant_id: + type: integer + example: 24 + quantity: + type: integer + example: 98 + required: + - variant_id + - quantity + PickupOptionsResponse: + type: object + properties: + results: + type: array + items: + type: object + properties: + pickup_options: + type: array + description: Pickup options for the available items. + items: + $ref: '#/components/schemas/PickupOption' + PickupOption: + type: object + properties: + pickup_method: + $ref: '#/components/schemas/PickupMethod' + available_items: + type: array + description: Items that are available using the pickup method. + items: + $ref: '#/components/schemas/AvailableItem' + PickupMethod: + type: object + description: Pickup method that can be used with the available items. + properties: + id: + type: integer + example: 1 + location_id: + type: integer + example: 2 + display_name: + type: string + minLength: 0 + maxLength: 250 + example: Office Pickup! + collection_instructions: + type: string + minLength: 0 + maxLength: 250 + example: Bring your ID! + collection_time_description: + type: string + minLength: 0 + maxLength: 250 + example: Collect during our opening hours of 0900 - 1700 + AvailableItem: + type: object + properties: + variant_id: + type: integer + example: 55 + quantity: + type: integer + example: 12 + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Fulfillment Methods | read-only | `store_fulfillment_methods_read_only` | + | Fulfillment Methods | modify | `store_fulfillment_methods_manage` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header diff --git a/reference/promotions.v3.yml b/reference/promotions.v3.yml new file mode 100644 index 000000000..dd309724a --- /dev/null +++ b/reference/promotions.v3.yml @@ -0,0 +1,1678 @@ +openapi: '3.0.3' +info: + title: Promotions API + version: '1.0' + description: | + A *promotion* is composed of a condition that a customer can satisfy, such as increasing their cart value above a certain amount or adding an item to their cart. + + After the customer satisfies the condition, an action takes place, such as a free item being added to the cart or a discount applying itself to the order total. + + To learn more about promotions, consult the [Promotions Overview](/docs/store-operations/promotions). + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Promotions (Bulk) + - name: Promotions (Single) + - name: Coupon Codes (Bulk) + - name: Coupon Codes (Single) +paths: + '/promotions': + parameters: + - $ref: '#/components/parameters/Accept' + get: + tags: + - Promotions (Bulk) + summary: Get All Promotions + description: |- + Returns a list of *promotions*. + + The response includes the display name and other details about each promotion, and lists the promotions ordered by ID by default. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: getPromotions + parameters: + - $ref: '#/components/parameters/IdQuery' + - $ref: '#/components/parameters/NameQuery' + - $ref: '#/components/parameters/CodeQuery' + - $ref: '#/components/parameters/CurrencyCodeQuery' + - $ref: '#/components/parameters/RedemptionTypeQuery' + - $ref: '#/components/parameters/StatusQuery' + - $ref: '#/components/parameters/PageQuery' + - $ref: '#/components/parameters/LimitQuery' + - $ref: '#/components/parameters/SortQuery' + - $ref: '#/components/parameters/DirectionQuery' + - $ref: '#/components/parameters/ChannelQuery' + responses: + '200': + $ref: '#/components/responses/PromotionsCollectionResponse' + '422': + description: Failure due to an invalid query parameter. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + post: + tags: + - Promotions (Single) + summary: Create Promotion + description: |- + Creates a *promotion*. + To learn more about how to create a *promotion*, read the [Promotions Overview](/docs/store-operations/promotions). + For examples grouped by use case, see the [promotions examples](/docs/store-operations/promotions/examples/brand). + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: createPromotion + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/PromotionCoupon' + - $ref: '#/components/schemas/PromotionAutomatic' + responses: + '201': + $ref: '#/components/responses/PromotionsResponse' + '422': + description: The request payload was invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Promotions (Bulk) + summary: Delete Multiple Promotions + description: |- + Deletes multiple promotions. Currently, batches are limited to 50 promotions. + + **Notes** + * "id:in" query param is required to delete promotions. If this parameter is not provided, or provided with the wrong data format, a 422 error code is returned. + * You cannot delete promotions that still have coupon codes attached. + * The default rate limit for this endpoint is 40 concurrent requests. + operationId: deletePromotions + parameters: + - $ref: '#/components/parameters/IdInQuery' + responses: + '204': + description: A 204 response. + content: {} + '422': + $ref: '#/components/responses/BulkDeleteResponse' + '/promotions/{id}': + parameters: + - $ref: '#/components/parameters/Accept' + get: + tags: + - Promotions (Single) + summary: Get Promotion + description: |- + Returns a single *promotion*. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests + operationId: getPromotion + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '200': + $ref: '#/components/responses/PromotionsResponse' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + put: + tags: + - Promotions (Single) + summary: Update Promotion + description: |- + Update a promotion. + + **Note:** + The default rate limit for this request is 40 concurrent requests. + operationId: updatePromotion + parameters: + - $ref: '#/components/parameters/ContentType' + - $ref: '#/components/parameters/IdPath' + requestBody: + content: + application/json: + schema: + anyOf: + - $ref: '#/components/schemas/PromotionCoupon' + - $ref: '#/components/schemas/PromotionAutomatic' + responses: + '200': + $ref: '#/components/responses/PromotionsResponse' + '404': + description: The requested resource could not be found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + tags: + - Promotions (Single) + summary: Delete Promotion + description: |- + Deletes a promotion. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: deletePromotion + parameters: + - $ref: '#/components/parameters/IdPath' + responses: + '204': + description: The deletion was successful or the specified resource does not exist. + content: {} + '/promotions/{promotion_id}/codes': + parameters: + - $ref: '#/components/parameters/Accept' + get: + tags: + - Coupon Codes (Bulk) + summary: Get Coupon Codes + description: |- + Get codes for a particular promotion. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: getPromotionCodes + parameters: + - $ref: '#/components/parameters/PromotionIdPath' + responses: + '200': + $ref: '#/components/responses/PromotionCodesCollectionResponse' + post: + tags: + - Coupon Codes (Single) + summary: Create A Coupon Code + description: |- + Create a new code for the promotion. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: createPromotionCode + parameters: + - $ref: '#/components/parameters/ContentType' + - $ref: '#/components/parameters/PromotionIdPath' + requestBody: + content: + application/json: + schema: + required: + - code + type: object + properties: + code: + pattern: '[a-zA-Z0-9_\ -]' + type: string + description: 'A unique code that can be used to manually apply a discount. Only letters, numbers, white spaces, underscores, and hyphens are allowed.' + maxLength: 50 + max_uses: + type: integer + description: The maximum number of times you can use this coupon code. The default value is 0, which represents unlimited uses. The parent promotion's `max_uses` field overrides the coupon code's `max_uses` field. + example: 10 + max_uses_per_customer: + type: integer + description: The maximum number of times a specific customer can use this coupon code. The default value is 0, which represents unlimited uses. + example: 5 + required: true + responses: + '200': + $ref: '#/components/responses/PromotionCodeResponse' + delete: + tags: + - Coupon Codes (Bulk) + summary: Delete Multiple Coupon Codes + description: |- + Deletes multiple coupon codes relating to the given promotion. Currently, batches are limited to 50 coupon codes. + + **Notes** + * "id:in" query param is required to delete coupon codes. If not provided, or provided with the wrong data format, a 422 error code is returned. + * The default rate limit for this endpoint is 40 concurrent requests. + operationId: deleteCouponCodes + parameters: + - $ref: '#/components/parameters/IdInQuery' + - $ref: '#/components/parameters/PromotionIdPath' + responses: + '204': + description: A 204 response. + content: {} + '422': + $ref: '#/components/responses/BulkDeleteResponse' + '/promotions/{promotion_id}/codes/{code_id}': + parameters: + - $ref: '#/components/parameters/Accept' + delete: + tags: + - Coupon Codes (Single) + summary: Delete A Coupon Code + description: |- + Deletes a coupon code. + + **Note:** + The default rate limit for this endpoint is 40 concurrent requests. + operationId: deleteCouponCode + parameters: + - $ref: '#/components/parameters/PromotionIdPath' + - $ref: '#/components/parameters/CodeIdPath' + responses: + '204': + description: The deletion was successful or the resource does not exist. + content: {} +components: + schemas: + PromotionBase: + title: PromotionBase + type: object + description: |- + **Promotion** + A *promotion* is composed of a condition that a customer can satisfy (such as increasing their cart value above a certain amount or adding an item to their cart) and an action will take place (such as a discount on the customer’s order total, or a free item being added to their cart). + properties: + id: + type: integer + description: An auto-generated unique identifier for the discount rule. + example: 1 + readOnly: true + redemption_type: + type: string + description: A read-only field indicating the type of promotion. Promotions applied automatically have a value of `AUTOMATIC` whereas promotions requiring a coupon have a value of `COUPON`. + enum: + - AUTOMATIC + - COUPON + readOnly: true + name: + type: string + description: An internal name for this rule that the merchant can refer to. + example: Buy Product X Get Free Shipping + channels: + type: array + description: 'Channels that the promotion targets. Empty array [] means targeting all the channels. In POST request, if omitted, this field defaults to an empty array [] value.' + items: + $ref: '#/components/schemas/Channel' + customer: + $ref: '#/components/schemas/Customer' + rules: + type: array + description: An ordered list of rules to be executed until the first applicable one applies a discount successfully and the rest will be skipped. + items: + $ref: '#/components/schemas/Rule' + current_uses: + type: integer + description: A read-only count of the times this rule has been used by customers. A rule is considered to be used when a customer successfully checks out with a rule that has applied a discount to their cart. + readOnly: true + example: 2 + max_uses: + type: integer + description: The maximum number of times this discount can be used by customers. + example: 10 + status: + type: string + description: Controls whether or not a discount rule can be used by customers. `INVALID` is a read-only status into which enabled discount rules may transition when they become invalid. + enum: + - ENABLED + - DISABLED + - INVALID + start_date: + type: string + description: The date and time when this rule will become active. + example: '2005-12-30T01:02:03+00:00' + end_date: + type: string + description: 'The date and time when this rule will expire. If this property is left null, the promotion never expires.' + example: '2025-12-30T01:02:03+00:00' + stop: + type: boolean + description: 'Boolean value that specifies whether to stop evaluating promotions down the priority list when the promotion is applied successfully.' + example: false + can_be_used_with_other_promotions: + type: boolean + description: 'Boolean value that specifies whether this promotion can be used with other promotions. When set to false, only apply this promotion if there are no discounts applied already, and stop executing other promotions if this promotion applies successfully.' + example: false + default: true + currency_code: + type: string + description: The ISO-4217-based transactional currency code to which the promotion applies OR * for all currencies. + example: USD + notifications: + type: array + description: Notifications to display on the storefront based on the result of the evaluation for promotion eligibility. + items: + $ref: '#/components/schemas/Notification' + shipping_address: + $ref: '#/components/schemas/AddressMatcher' + schedule: + $ref: '#/components/schemas/AvailabilityByWeekDay' + required: + - name + - rules + PromotionCoupon: + title: Coupon Promotion + description: '**Coupon Promotion** A shopper must manually apply a *coupon promotion* to their cart.' + allOf: + - $ref: '#/components/schemas/PromotionBase' + - type: object + properties: + coupon_overrides_automatic_when_offering_higher_discounts: + type: boolean + example: false + default: false + description: |- + This field only has effect when the `redemption_type` is `COUPON` and `can_be_used_with_other_promotions` is `false`: + - When the property is set to "true", the coupon will override the applied automatic promotions if it provides a greater discount. + - When the property is set to "false", the coupon will not be applied if automatic promotions are already applied. + + Trying to set the value of this field to "true" when the `redemption_type` is not `COUPON`, or when `can_be_used_with_other_promotions` is `true` will yield a 422 error response. + PromotionAutomatic: + title: Automatic Promotion + description: The store applies *automatic promotions* to a shopper’s cart once the promotion criteria are satisfied. The shopper cannot manually apply an *automatic promotion*. + allOf: + - $ref: '#/components/schemas/PromotionBase' + Customer: + type: object + description: |- + Specifies the requirements which make the customer eligible for the promotion. + + Note: + - Only "group_ids" or "excluded_group_ids" should be specified (have non-empty array data), but not both. + - group_id zero (0) signifies guest customers or registered customers who are not assigned to any groups. + properties: + group_ids: + type: array + description: 'A list of customer group IDs that the promotion targets. Only customers in those groups are eligible for this promotion. When unspecified, or set to an empty array, this requirement is not effective, and all customers who satisfy the other requirements (minimum_order_count, excluded_group_ids) are eligible for the promotion.' + example: + - 1 + - 2 + - 3 + items: + type: integer + minimum_order_count: + type: integer + description: The minimum number of completed orders required of the customer. + excluded_group_ids: + type: array + description: 'A list of customer group IDs that the promotion will exclude. Only customers who are NOT in those groups are eligible for this promotion. When unspecified, or set to an empty array, this requirement will not have any effects, and all customers who satisfy the other requirements (group_ids, minimum_order_count) are eligible for the promotion.' + example: + - 1 + - 2 + - 3 + items: + type: integer + example: 0 + segments: + oneOf: + - $ref: '#/components/schemas/CustomerSegmentLimitation' + Rule: + title: Rule + type: object + description: |- + **Rule** + A Rule is the executable unit of the promotion. When a ruleʼs condition is met, the API applies the discount defined in the specified action. + properties: + action: + $ref: '#/components/schemas/Action' + apply_once: + type: boolean + description: 'Setting this property to false enables the rule to run repeatedly (for example: 1 free product X for every product Y you purchase)' + default: true + stop: + type: boolean + description: Boolean value that specifies whether to stop executing all the remaining rules down the priority list when the current rule is applied successfully. + condition: + $ref: '#/components/schemas/Condition' + required: + - action + Condition: + description: '**Condition**' + anyOf: + - $ref: '#/components/schemas/CartCondition' + - $ref: '#/components/schemas/AndCondition' + AndCondition: + title: AndCondition + type: object + description: |- + **AndCondition** + Evaluates to true when all children are evaluated to true. + properties: + and: + type: array + description: 'Array of [Conditions](/docs/rest-management/promotions).' + items: + $ref: '#/components/schemas/CartCondition' + CartCondition: + title: Cart Condition + type: object + description: |- + **Cart Condition** + Condition based on the content of the current cart. + properties: + cart: + type: object + properties: + items: + $ref: '#/components/schemas/ItemMatcher' + minimum_spend: + $ref: '#/components/schemas/Money' + minimum_quantity: + type: integer + description: 'Minimum required quantity of the item in the cart for the condition to match. This field is *mandatory* when `items` are specified, but has *no effect* if `items` are not specified.' + example: 1 + ItemMatcher: + title: Item Matcher + description: |- + **ItemMatcher** + Lists which items to consider in the condition or action. If this is specified, you will need to also specify at least one of minimum_quantity or minimum_spend. + oneOf: + - $ref: '#/components/schemas/SimpleItemMatcher' + - $ref: '#/components/schemas/NotItemMatcher' + - $ref: '#/components/schemas/AndItemMatcher' + - $ref: '#/components/schemas/OrItemMatcher' + AndItemMatcher: + title: AndItemMatcher + type: object + description: |- + **AndItemMatcher** + Evaluates to true when all children are evaluated to true. + properties: + and: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/ItemMatcher2' + OrItemMatcher: + title: OrItemMatcher + type: object + description: |- + **OrItemMatcher** + Evaluates to true when one of its children are evaluated to true. + properties: + or: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/ItemMatcher2' + NotItemMatcher: + title: NotItemMatcher + type: object + description: |- + **NotItemMatcher** + Evaluates to true when the child is evaluated to false. + properties: + not: + $ref: '#/components/schemas/ItemMatcher2' + ItemMatcher2: + title: Item Matcher + description: |- + **ItemMatcher** + Lists which items to consider in the condition or action. If this is specified, you will need to also specify at least one of minimum_quantity or minimum_spend. + oneOf: + - $ref: '#/components/schemas/SimpleItemMatcher' + - $ref: '#/components/schemas/NotItemMatcher2' + - $ref: '#/components/schemas/AndItemMatcher2' + - $ref: '#/components/schemas/OrItemMatcher2' + AndItemMatcher2: + title: AndItemMatcher + type: object + description: |- + **AndItemMatcher** + Evaluates to true when all children are evaluated to true. + properties: + and: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/ItemMatcher3' + OrItemMatcher2: + title: OrItemMatcher + type: object + description: |- + **OrItemMatcher** + Evaluates to true when one of its children are evaluated to true. + properties: + or: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/ItemMatcher3' + NotItemMatcher2: + title: NotItemMatcher + type: object + description: |- + **NotItemMatcher** + Evaluates to true when the child is evaluated to false. + properties: + not: + $ref: '#/components/schemas/ItemMatcher3' + ItemMatcher3: + title: Item Matcher + description: |- + **ItemMatcher** + Lists which items to consider in the condition or action. If this is specified, you will need to also specify at least one of minimum_quantity or minimum_spend. + oneOf: + - $ref: '#/components/schemas/SimpleItemMatcher' + - $ref: '#/components/schemas/NotItemMatcher3' + - $ref: '#/components/schemas/AndItemMatcher3' + - $ref: '#/components/schemas/OrItemMatcher3' + AndItemMatcher3: + title: AndItemMatcher + type: object + description: |- + **AndItemMatcher** + Evaluates to true when all children are evaluated to true. + properties: + and: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/SimpleItemMatcher' + OrItemMatcher3: + title: OrItemMatcher + type: object + description: |- + **OrItemMatcher** + Evaluates to true when one of its children are evaluated to true. + properties: + or: + type: array + description: 'Array of Item Matcher.' + items: + $ref: '#/components/schemas/SimpleItemMatcher' + NotItemMatcher3: + title: NotItemMatcher + type: object + description: |- + **NotItemMatcher** + Evaluates to true when the child is evaluated to false. + properties: + not: + $ref: '#/components/schemas/SimpleItemMatcher' + SimpleItemMatcher: + title: Simple Item Matcher + description: '**Simple Item Matcher**' + oneOf: + - $ref: '#/components/schemas/BrandsItemMatcher' + - $ref: '#/components/schemas/CategoriesItemMatcher' + - $ref: '#/components/schemas/ProductsItemMatcher' + - $ref: '#/components/schemas/VariantsItemMatcher' + - $ref: '#/components/schemas/ProductOptionsItemMatcher' + - $ref: '#/components/schemas/ProductCustomFieldMatcher' + BrandsItemMatcher: + title: Brands Item Matcher + type: object + properties: + brands: + type: array + description: List of brand IDs. + example: + - 1 + - 2 + - 3 + items: + type: integer + description: |- + **BrandsItemMatcher** + Brands to which the items should belong. + CategoriesItemMatcher: + title: Categories Item Matcher + type: object + properties: + categories: + type: array + description: List of category IDs. + example: + - 1 + - 2 + - 3 + items: + type: integer + description: |- + **CategoriesItemMatcher** + Categories to which the items should belong. + ProductsItemMatcher: + title: Products Item Matcher + type: object + properties: + products: + type: array + description: List of product IDs. + example: + - 1 + - 2 + - 3 + items: + type: integer + description: |- + **Products Item Matcher** + Specific products which items should be from. + VariantsItemMatcher: + title: Variants Item Matcher + type: object + properties: + variants: + type: array + description: List of variant IDs. + example: + - 1 + - 2 + - 3 + items: + type: integer + description: |- + **Variants Item Matcher** + Product variants which items should be from. + CartValueAction: + title: Cart Value Action + type: object + properties: + cart_value: + required: + - discount + type: object + properties: + discount: + $ref: '#/components/schemas/Discount' + description: |- + **Cart Value Action** + Applies discount on the entire cart. + GiftItemAction: + type: object + properties: + gift_item: + required: + - quantity + type: object + properties: + quantity: + type: integer + description: Quantity of gift item to give. + product_id: + type: integer + description: Product ID of the gift item. + variant_id: + type: integer + description: Variant ID of the gift item. + description: |- + **Gift Item Action** + Give a gift item for free. + FixedPriceSetAction: + title: Fixed Price Set Action + type: object + properties: + fixed_price_set: + required: + - fixed_price + - quantity + type: object + properties: + quantity: + type: integer + description: Quantity of items in the set that would receive the discount. + fixed_price: + $ref: '#/components/schemas/Money' + items: + $ref: '#/components/schemas/ItemMatcher' + strategy: + type: string + description: 'If the shopper has multiple items in their cart that could be discounted by this action, strategy will determine which items are discounted, for example LEAST_EXPENSIVE will sort items in price ascending order and discount the cheapest item first.' + enum: + - LEAST_EXPENSIVE + - LEAST_EXPENSIVE_ONLY + - MOST_EXPENSIVE + - MOST_EXPENSIVE_ONLY + exclude_items_on_sale: + type: boolean + description: Enable this option to prevent items already on sale from being further discounted. + include_items_considered_by_condition: + default: true + type: boolean + description: 'Setting this value to false enables you to exclude items used to satisfy the condition to be discounted. By default, items that are used to satisfy the condition are eligible to receive the discount.' + description: |- + **Fixed Price Set Action** + Sets a fixed price for a list of items. + CartItemsAction: + title: Cart Items Action + type: object + properties: + cart_items: + required: + - discount + type: object + properties: + discount: + $ref: '#/components/schemas/Discount' + as_total: + type: boolean + description: |- + Set this value to true to distribute the discount as a total among matching items. By default, the discount applies to each item. + Example: If set to false, the discount is $10 and you have 2 eligible items for this discount in the cart, both items will be discounted by $10, with a total of $20 off the order. + If set to true, $10 will be distributed among the 2 items, weighted by their respective price. In a case where there are 2 of the same items, each item will be discounted by $5. + items: + $ref: '#/components/schemas/ItemMatcher' + include_items_considered_by_condition: + type: boolean + description: 'Setting this value to true enables you to discount items that are used to satisfy the condition. By default items that are used to satisfy the condition are excluded from receiving the discount. For example, "Buy 1 Get 1 20% off." When the cart only contains 1 item, the discount won’t apply.' + exclude_items_on_sale: + type: boolean + description: Setting this value to true enables the option to prevent items already on sale from being further discounted. + strategy: + type: string + description: 'If the shopper has multiple items in their cart that could be discounted by this action, strategy will determine which items are discounted, for example LEAST_EXPENSIVE will sort items by their price in ascending order and discount the cheapest item first.' + enum: + - LEAST_EXPENSIVE + - LEAST_EXPENSIVE_ONLY + - MOST_EXPENSIVE + - MOST_EXPENSIVE_ONLY + quantity: + type: integer + description: 'Specifies a quantity of matching items to discount. If no quantity is specified, an infinite number of items can be discounted.' + example: 2 + add_free_item: + type: boolean + description: 'The promotion will try to add a free item to the cart automatically, but if it cannot, it will discount a matching existing cart item by 100%.' + description: |- + **Cart Items Action** + Applies discount on matching products in the cart. + ShippingAction: + title: Shipping Action + type: object + description: |- + **Shipping Action** + Applies discount on shipping, optionally restricted to specific shipping zones. + properties: + shipping: + type: object + properties: + free_shipping: + type: boolean + description: Set this property to true to provide a separate free shipping method. Read-Only. + zone_ids: + description: '' + oneOf: + - type: string + enum: + - '*' + description: All configured shipping zones. + - type: array + uniqueItems: true + description: List of shipping zone IDs to which free shipping can apply. + items: + type: integer + minimum: 1 + required: + - zone_ids + Discount: + title: Discount + description: '**Discount**' + oneOf: + - $ref: '#/components/schemas/FixedDiscount' + - $ref: '#/components/schemas/PercentageDiscount' + PercentageDiscount: + title: Percentage Discount + type: object + properties: + percentage_amount: + type: string + description: The amount of discount (percentage off) to apply. + description: '**Percentage Discount**' + FixedDiscount: + title: Fixed Discount + type: object + properties: + fixed_amount: + $ref: '#/components/schemas/Money' + description: '**Fixed Discount**' + Money: + title: Money + pattern: '[0-9]+(\.[0-9]+)?' + type: string + description: |- + **Money** + Represents a monetary value in the store’s default currency. + example: '12.95' + CollectionMeta: + title: Collection Meta + type: object + properties: + pagination: + $ref: '#/components/schemas/Pagination' + description: Contains data about the response including pagination and collection totals. + Pagination: + title: Pagination + type: object + properties: + total: + type: integer + description: Total number of items in the result set. + count: + type: integer + description: Total number of items in the collection response. + per_page: + type: integer + description: 'The amount of items returned in the collection per page, controlled by the limit of items per page parameter.' + current_page: + type: integer + description: The page you are currently on within the collection. + total_pages: + type: integer + description: The total number of pages in the collection. + links: + type: object + properties: + previous: + type: string + description: Link to the previous page returned in the response. + current: + type: string + description: Link to the current page returned in the response. + next: + type: string + description: Link to the next page returned in the response. + description: Pagination links for the previous and next parts of the whole collection. + description: 'Data about the response, including pagination and collection totals.' + ErrorResponse: + title: Error Response + type: object + properties: + errors: + type: array + items: + $ref: '#/components/schemas/Error' + Error: + title: Error + type: object + properties: + status: + type: integer + title: + type: string + Notification: + title: Notification + required: + - content + - locations + - type + type: object + properties: + content: + type: string + description: |- + The notification content to be displayed to the user. + Data from the condition and action are available allowing the message to be customized. + example: Congratulations! Youʼve received a free %ACTION.FREE_PRODUCT%! + type: + type: string + enum: + - UPSELL + - ELIGIBLE + - APPLIED + locations: + type: array + description: Specifies where the notification message will be displayed. + example: + - HOME_PAGE + - PRODUCT_PAGE + - CART_PAGE + - CHECKOUT_PAGE + items: + type: string + description: |- + **Notification** + A notification displayed to the user based on the result of executing a promotion, for example, a "Congratulations! Youʼve received free shipping!" message when the shopper receives free shipping. + Action: + title: Action + description: '**Action**' + anyOf: + - $ref: '#/components/schemas/CartValueAction' + - $ref: '#/components/schemas/CartItemsAction' + - $ref: '#/components/schemas/GiftItemAction' + - $ref: '#/components/schemas/FixedPriceSetAction' + - $ref: '#/components/schemas/ShippingAction' + ProductOptionsItemMatcher: + title: Product Options Item Matcher + type: object + properties: + product_option: + required: + - name + - type + - values + type: object + properties: + type: + type: string + example: string_match + name: + type: string + example: Color + values: + type: array + items: + type: string + example: '["Red": "Blue"]' + description: |- + Match a product by product options. + + Currently the only supported type is `string_match` which performs a string comparison on the name and values. + ProductCustomFieldMatcher: + title: Product Custom Field Item Matcher + type: object + description: |- + Match a product with a custom field. + + You can define a maximum of 10 Product Custom Field Item Matchers within an Item Matcher. + properties: + product_custom_field: + required: + - name + - values + type: object + properties: + name: + type: string + example: ISBN-10 + values: + type: array + items: + minItems: 1 + type: string + example: "0439538491" + CouponCode: + type: object + description: A `CouponCode` object encapsulates attributes of a coupon code. + properties: + id: + type: integer + description: An auto-generated unique identifier for the coupon code. + example: 1 + code: + pattern: '[a-zA-Z0-9_\ -]' + type: string + description: 'A unique code that can be used to manually apply a discount. Only letters, numbers, white spaces, underscores and hyphens are allowed.' + example: TEST-COUPON-CODE + maxLength: 50 + current_uses: + type: integer + description: A read-only count of the times this coupon code has been used. + readOnly: true + example: 2 + max_uses: + type: integer + description: The maximum number of times you can use this coupon code. The default value is 0, which represents unlimited uses. + example: 10 + max_uses_per_customer: + type: integer + description: The maximum number of times a specific customer can use this coupon code. The default value is 0, which represents unlimited uses. + example: 5 + created: + type: string + description: The date and time when this coupon code was created. + format: date-time + example: '2019-01-20T22:00:00.000Z' + required: + - code + BulkActionResponseMeta: + title: Bulk Action Response Meta + type: object + properties: + total: + type: integer + description: Total number of items in the bulk action. + success: + type: integer + description: Number of items that processed successfully. + failed: + type: integer + description: Number of items that failed to process. + description: 'Contains data about the bulk action response including the number of total, failed and success.' + BulkActionResponseError: + title: Bulk Action Response Error + type: object + properties: + status: + type: integer + description: HTTP Response status. + example: 422 + title: + type: string + description: Title of the status + example: Some promotions failed to delete. + type: + type: string + description: Explanation of the error type. + example: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + type: object + properties: {} + additionalProperties: true + description: |- + List all per-item errors. Use an index of an item on a request to reference an error. The example shows the first and second item on a request that has caused an error. + example: + '0.id': Invalid ID + '1.error': Promotion cannot be deleted + description: Contains data about the error of the bulk action. + CountryAddressMatcher: + title: CountryAddressMatcher + type: object + description: Specifies the countries which the promotion targets. + properties: + countries: + type: array + description: List of Country Rules + items: + $ref: '#/components/schemas/CountryRuleInfo' + required: + - countries + AddressMatcher: + title: AddressMatcher + description: Specifies which addresses to consider. + oneOf: + - $ref: '#/components/schemas/CountryAddressMatcher' + - $ref: '#/components/schemas/NotAddressMatcher' + NotAddressMatcher: + title: NotAddressMatcher + type: object + description: Evaluates to `true` when the child is evaluated to `false`. + properties: + not: + $ref: '#/components/schemas/CountryAddressMatcher' + required: + - not + CountryRuleInfo: + title: CountryRuleInfo + type: object + description: Country Rule + properties: + iso2_country_code: + type: string + description: 'Specifies the country code, in ISO 3166-1 alpha-2 format.' + example: US + required: + - iso2_country_code + AvailabilityByWeekDay: + title: AvailabilityByWeekDay + type: object + description: Specifies the availability by weekdays. + properties: + week_frequency: + minimum: 1 + type: integer + description: 'Specifies the recurrence, in number of weeks, during which the promotion is available (every "x" weeks).' + example: 2 + week_days: + type: array + description: Specifies the weekdays during which the promotion is available. + items: + example: Monday + enum: + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday + - Sunday + type: string + daily_start_time: + maxLength: 8 + minLength: 8 + pattern: '^([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$' + type: string + description: Specifies the time of day from which the promotion is available. + format: time + example: '01:20:00' + daily_end_time: + maxLength: 8 + minLength: 8 + pattern: '^([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$' + type: string + description: Specifies the time of day until which the promotion is available. + format: time + example: '23:59:00' + required: + - week_frequency + - week_days + - daily_start_time + - daily_end_time + CustomerSegmentLimitation: + title: CustomerSegmentLimitation + oneOf: + - $ref: '#/components/schemas/CustomerSegmentIdLimitation' + - $ref: '#/components/schemas/NotCustomerSegmentLimitation' + - $ref: '#/components/schemas/AndCustomerSegmentLimitation' + - $ref: '#/components/schemas/OrCustomerSegmentLimitation' + description: '' + CustomerSegmentIdLimitation: + title: CustomerSegmentIdLimitation + required: + - id + type: object + properties: + id: + minItems: 1 + type: array + description: An array of segment IDs. + items: + maxLength: 36 + type: string + example: ccec121a-f9bc-4a04-809e-1fe0d8ae7fdd + AndCustomerSegmentLimitation: + title: AndCustomerSegmentLimitation + type: object + properties: + and: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentLimitation2' + required: + - and + OrCustomerSegmentLimitation: + title: OrCustomerSegmentLimitation + type: object + properties: + or: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentLimitation2' + required: + - or + NotCustomerSegmentLimitation: + title: NotCustomerSegmentLimitation + type: object + properties: + not: + $ref: '#/components/schemas/CustomerSegmentLimitation2' + required: + - not + CustomerSegmentLimitation2: + title: CustomerSegmentLimitation + oneOf: + - $ref: '#/components/schemas/CustomerSegmentIdLimitation' + - $ref: '#/components/schemas/NotCustomerSegmentLimitation2' + - $ref: '#/components/schemas/AndCustomerSegmentLimitation2' + - $ref: '#/components/schemas/OrCustomerSegmentLimitation2' + description: '' + AndCustomerSegmentLimitation2: + title: AndCustomerSegmentLimitation + type: object + properties: + and: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentLimitation3' + required: + - and + OrCustomerSegmentLimitation2: + title: OrCustomerSegmentLimitation + type: object + properties: + or: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentLimitation3' + required: + - or + NotCustomerSegmentLimitation2: + title: NotCustomerSegmentLimitation + type: object + properties: + not: + $ref: '#/components/schemas/CustomerSegmentLimitation3' + required: + - not + CustomerSegmentLimitation3: + title: CustomerSegmentLimitation + oneOf: + - $ref: '#/components/schemas/CustomerSegmentIdLimitation' + - $ref: '#/components/schemas/NotCustomerSegmentLimitation3' + - $ref: '#/components/schemas/AndCustomerSegmentLimitation3' + - $ref: '#/components/schemas/OrCustomerSegmentLimitation3' + description: '' + AndCustomerSegmentLimitation3: + title: AndCustomerSegmentLimitation + type: object + properties: + and: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentIdLimitation' + required: + - and + OrCustomerSegmentLimitation3: + title: OrCustomerSegmentLimitation + type: object + properties: + or: + minItems: 2 + type: array + items: + $ref: '#/components/schemas/CustomerSegmentIdLimitation' + required: + - or + NotCustomerSegmentLimitation3: + title: NotCustomerSegmentLimitation + type: object + properties: + not: + $ref: '#/components/schemas/CustomerSegmentIdLimitation' + required: + - not + Channel: + title: Channel + type: object + properties: + id: + type: integer + example: 1 + required: + - id + responses: + BulkDeleteResponse: + description: '' + content: + application/json: + schema: + type: object + properties: + errors: + type: array + items: + $ref: '#/components/schemas/BulkActionResponseError' + meta: + $ref: '#/components/schemas/BulkActionResponseMeta' + examples: + 422 - Missing Parameter: + value: + errors: + - status: 422 + title: 'Parameter id:in is required' + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + meta: + total: 0 + success: 0 + failed: 0 + 422 - Error Deleting: + value: + errors: + - status: 422 + title: Errors occurred in bulk delete action. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + 0.constraint: 'Failed for id=12. Error: constraint reference error.' + 2.code: 'Failed for id=14. Error: some relating codes are still present.' + meta: + total: 5 + success: 3 + failed: 2 + 422 - Missing Parameter: + example: + errors: + - status: 422 + title: 'Parameter id:in is required' + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + meta: + total: 0 + success: 0 + failed: 0 + 422 - Error Deleting: + example: + errors: + - status: 422 + title: Errors occurred in bulk delete action. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + 0.constraint: "Failed for id=12. Error: constraint reference error." + 2.code: "Failed for id=14. Error: some relating codes are still present." + meta: + total: 5 + success: 3 + failed: 2 + PromotionCodeResponse: + description: '' + content: + application/json: + schema: + type: object + properties: + data: + $ref: '#/components/schemas/CouponCode' + meta: + type: object + properties: {} + description: 'Empty meta object, which may be used at a later time.' + examples: + example-1: + value: + data: + id: 1 + code: TEST_COUPON + max_uses: 10 + max_uses_per_customer: 5 + current_uses: 0 + created: '2019-01-20T22:00:00+00:00' + meta: {} + PromotionCodesCollectionResponse: + description: '' + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/CouponCode' + meta: + $ref: '#/components/schemas/CollectionMeta' + examples: + example-1: + value: + data: + - id: 1 + code: TEST_COUPON + max_uses: 10 + max_uses_per_customer: 5 + current_uses: 0 + created: '2019-01-20T22:00:00+00:00' + meta: + pagination: + total: 1 + count: 1 + per_page: 50 + current_page: 1 + total_pages: 1 + links: + current: '?page=1&limit=50' + PromotionsCollectionResponse: + description: '' + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + anyOf: + - $ref: '#/components/schemas/PromotionAutomatic' + - $ref: '#/components/schemas/PromotionCoupon' + meta: + $ref: '#/components/schemas/CollectionMeta' + examples: + example-1: + value: + data: + - id: 1 + redemption_type: AUTOMATIC + name: Buy Product X Get Free Shipping + channels: + - id: 1 + customer: + group_ids: + - 1 + - 2 + - 3 + minimum_order_count: 0 + excluded_group_ids: + - 1 + - 2 + - 3 + segments: + id: + - ccec121a-f9bc-4a04-809e-1fe0d8ae7fdd + rules: + - action: + cart_value: + discount: + fixed_amount: '12.95' + apply_once: true + stop: true + condition: + cart: + items: + brands: + - 1 + - 2 + - 3 + minimum_spend: '12.95' + minimum_quantity: 1 + current_uses: 2 + max_uses: 10 + status: ENABLED + start_date: '2019-01-20T22:00:00.000Z' + end_date: '2019-01-20T22:00:00.000Z' + stop: false + can_be_used_with_other_promotions: false + currency_code: USD + notifications: + - content: Congratulations! Youʼve received a free %ACTION.FREE_PRODUCT% + type: UPSELL + locations: + - HOME_PAGE + shipping_address: + countries: + - iso2_country_code: US + schedule: + week_frequency: 2 + week_days: + - Monday + daily_start_time: '01:20:00' + daily_end_time: '23:59:00' + meta: + pagination: + total: 0 + count: 0 + per_page: 0 + current_page: 0 + total_pages: 0 + links: + previous: string + current: string + next: string + PromotionsResponse: + description: '' + content: + application/json: + schema: + type: object + properties: + data: + anyOf: + - $ref: '#/components/schemas/PromotionCoupon' + - $ref: '#/components/schemas/PromotionAutomatic' + meta: + type: object + description: 'Empty meta object, which may be used at a later time.' + properties: {} + additionalProperties: true + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + IdPath: + name: id + in: path + description: The ID of the promotion in question. + schema: + type: string + required: true + CodeIdPath: + name: code_id + in: path + description: The ID of the coupon code to delete. + required: true + schema: + type: string + IdQuery: + name: id + in: query + description: Filter items by `id`. + schema: + type: integer + IdInQuery: + name: 'id:in' + in: query + description: |- + A comma-separated list of promotions to filter or target with this operation. + + Example: **?id:in=11,12,13,14** + required: true + style: form + explode: false + schema: + minItems: 1 + type: array + items: + type: integer + PageQuery: + name: page + in: query + description: Query parameter that specifies the page number in a paginated list of resources. + schema: + minimum: 1 + type: integer + LimitQuery: + name: limit + in: query + description: Query parameter that limits the number of items displayed per page in a paginated list of resources. + schema: + maximum: 250 + minimum: 1 + type: integer + required: true + NameQuery: + name: name + in: query + description: Filter items by `name`. + schema: + type: string + CodeQuery: + name: code + in: query + description: Filter items by `code`. + schema: + type: string + CurrencyCodeQuery: + name: currency_code + in: query + description: Filter items by `currency_code`. + schema: + type: string + RedemptionTypeQuery: + name: redemption_type + in: query + description: Filter items by `redemption type` + allowEmptyValue: true + schema: + type: string + enum: + - automatic + - coupon + StatusQuery: + name: status + in: query + description: Filter items by `status`. + schema: + type: string + SortQuery: + name: sort + in: query + description: Query parameter that specifies the field name to sort by. The default value is *id*. + allowEmptyValue: true + schema: + type: string + enum: + - id + - name + - priority + - start_date + DirectionQuery: + name: direction + in: query + description: Query parameter that specifies the sorting direction. The default value is *asc*. + allowEmptyValue: true + schema: + type: string + enum: + - asc + - desc + PromotionIdPath: + name: promotion_id + in: path + description: The ID of the associated promotion. + required: true + schema: + type: string + ChannelQuery: + name: channels + in: query + required: false + style: form + explode: false + schema: + type: array + items: + type: integer + description: 'Filter promotions that target those `channel IDs`. Example: **?channels=1,2**. Note: promotions that target all the channels are included in the filtering result.' + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Marketing | modify | `store_v2_marketing` | + | Marketing | read-only | `store_v2_marketing_read_only` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header From 236525f28e7bb0bbb1cccae6e6c49faebe7fb47f Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Thu, 13 Jun 2024 23:02:55 +0200 Subject: [PATCH 057/221] CATALOG-9785: [update] Catalog, Category Images, Sort Order (#313) # [CATALOG-9785] ## What changed? * Updated swagger file for Category Image, Sort Order endpoints ## Release notes draft * Updated swagger file for Category Image, Sort Order endpoints [CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/categories_catalog.v3.yml | 62 ++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 4eafe42e4..22598bbdb 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -1298,7 +1298,10 @@ paths: - image_file: Form posts are the only accepted upload option. Only one image at a time can be created. - Limit image size to 1MB. + + Supported file types are `JPEG/JPG`, `GIF`, `PNG` and `ICO`. + + Limit image size to `8MB`. To update a *Category Image*, use the [Update categories](/docs/rest-catalog/category-trees/categories#update-categories) endpoint and an `image_url`. operationId: createCategoryImage parameters: @@ -1340,6 +1343,10 @@ paths: title: Error Response type: object properties: {} + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Forbidden' '404': description: | The resource was not found. @@ -1397,6 +1404,31 @@ paths: '204': description: '' content: {} + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + description: | + The resource was not found. + content: + application/json: + schema: + title: Not Found + type: object + properties: + status: + type: integer + description: | + 404 HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + instance: + type: string + description: Error payload for the BigCommerce API. parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/CategoryIdParam' @@ -1427,6 +1459,10 @@ paths: type: array items: $ref: '#/components/schemas/productSortOrder' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Forbidden' '404': description: The requested category was not found. content: @@ -1460,12 +1496,18 @@ paths: type: array items: $ref: '#/components/schemas/productSortOrder' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Forbidden' '404': description: The requested category was not found. content: application/json: schema: $ref: '#/components/schemas/error_Base' + '415': + $ref: '#/components/responses/Unsupported' '422': description: |- Unprocessable entity. @@ -2639,6 +2681,24 @@ components: application/json: schema: $ref: '#/components/schemas/error_Base' + UnauthorizedError: + description: Unauthorized + content: + plain/text: + schema: + type: string + Forbidden: + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unsupported: + description: Unsupported Media Type + content: + plain/text: + schema: + type: string parameters: CategoryIdParam: name: category_id From e32709568eaa14a8d4f69d794c9414abd2eb229e Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Thu, 13 Jun 2024 23:03:58 +0200 Subject: [PATCH 058/221] CATALOG-9786: [update] remove brand_name from response body (#329) # [DEVDOCS-] ## What changed? * Remove brand_name from response body ## Release notes draft * Update swagger file for Products endpoints --- reference/catalog/products_catalog.v3.yml | 1352 ++++++++++++--------- 1 file changed, 757 insertions(+), 595 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index d8d3c4411..7214d8dc7 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -158,110 +158,98 @@ paths: application/json: schema: $ref: '#/components/schemas/product_Put_Collection' - examples: - example-1: - value: + example: + - id: 0 + name: Smith Journal 13 + type: physical + sku: SM-13 + description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' + weight: 0 + width: 0 + depth: 0 + height: 0 + price: 0 + cost_price: 0 + retail_price: 0 + sale_price: 0 + map_price: 0 + tax_class_id: 0 + product_tax_code: string + categories: + - 0 + brand_id: 37 + inventory_level: 0 + inventory_warning_level: 0 + inventory_tracking: none + fixed_cost_shipping_price: 0 + is_free_shipping: true + is_visible: true + is_featured: true + related_products: + - 0 + warranty: string + bin_picking_number: string + layout_file: string + upc: string + search_keywords: string + availability: available + availability_description: string + gift_wrapping_options_type: any + gift_wrapping_options_list: + - 0 + sort_order: -2147483648 + condition: New + is_condition_shown: true + order_quantity_minimum: 0 + order_quantity_maximum: 0 + page_title: string + meta_keywords: + - string + meta_description: string + view_count: 0 + preorder_release_date: '2019-08-24T14:15:22Z' + preorder_message: string + is_preorder_only: true + is_price_hidden: true + price_hidden_label: string + custom_url: + url: string + is_customized: true + open_graph_type: product + open_graph_title: string + open_graph_description: string + open_graph_use_meta_description: true + open_graph_use_product_name: true + open_graph_use_image: true + gtin: string + mpn: string + date_last_imported: '2015-07-03T18:16:02+00:00' + reviews_rating_sum: 3 + reviews_count: 4 + total_sold: 80 + custom_fields: + - id: 6 + name: ISBN + value: '1234567890123' + bulk_pricing_rules: - id: 0 - name: Smith Journal 13 - type: physical - sku: SM-13 - description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' - weight: 0 - width: 0 - depth: 0 - height: 0 - price: 0 - cost_price: 0 - retail_price: 0 - sale_price: 0 - map_price: 0 - tax_class_id: 0 - product_tax_code: string - categories: - - 0 - brand_id: 0 - inventory_level: 0 - inventory_warning_level: 0 - inventory_tracking: none - fixed_cost_shipping_price: 0 - is_free_shipping: true - is_visible: true - is_featured: true - related_products: - - 0 - warranty: string - bin_picking_number: string - layout_file: string - upc: string - search_keywords: string - availability: available - availability_description: string - gift_wrapping_options_type: any - gift_wrapping_options_list: - - 0 + quantity_min: 10 + quantity_max: 50 + type: price + amount: 10 + images: + - image_file: string + is_thumbnail: true sort_order: -2147483648 - condition: New - is_condition_shown: true - order_quantity_minimum: 0 - order_quantity_maximum: 0 - page_title: string - meta_keywords: - - string - meta_description: string - view_count: 0 - preorder_release_date: '2019-08-24T14:15:22Z' - preorder_message: string - is_preorder_only: true - is_price_hidden: true - price_hidden_label: string - custom_url: - url: string - is_customized: true - open_graph_type: product - open_graph_title: string - open_graph_description: string - open_graph_use_meta_description: true - open_graph_use_product_name: true - open_graph_use_image: true - brand_name: Common Good - gtin: string - mpn: string - date_last_imported: '2015-07-03T18:16:02+00:00' - reviews_rating_sum: 3 - reviews_count: 4 - total_sold: 80 - custom_fields: - - id: 6 - name: ISBN - value: '1234567890123' - bulk_pricing_rules: - - id: 0 - quantity_min: 10 - quantity_max: 50 - type: price - amount: 10 - images: - - image_file: string - is_thumbnail: true - sort_order: -2147483648 - description: string - image_url: string - id: 0 - product_id: 0 - url_zoom: string - url_standard: string - url_thumbnail: string - url_tiny: string - date_modified: '2019-08-24T14:15:22Z' - videos: - - title: Writing Great Documentation - description: A video about documentation. - sort_order: 1 - type: youtube - video_id: z3fRu9pkuXE - id: 0 - product_id: 0 - length: string + description: string + image_url: string + id: 0 + product_id: 0 + url_zoom: string + url_standard: string + url_thumbnail: string + url_tiny: string + date_modified: '2019-08-24T14:15:22Z' responses: '200': description: '' @@ -277,250 +265,98 @@ paths: $ref: '#/components/schemas/product_Full' meta: $ref: '#/components/schemas/metaCollection_Full' - examples: - example-1: - value: - data: - - id: 1 - name: Smith Journal 13 - type: physical - sku: SM-13 - description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' - weight: 0 - width: 0 - depth: 0 - height: 0 - price: 0 - cost_price: 0 - retail_price: 0 - sale_price: 0 - map_price: 0 - tax_class_id: 0 - product_tax_code: string - categories: - - 0 - brand_id: 0 - inventory_level: 0 - inventory_warning_level: 0 - inventory_tracking: none - fixed_cost_shipping_price: 0 - is_free_shipping: true - is_visible: true - is_featured: true - related_products: - - 0 - warranty: string - bin_picking_number: string - layout_file: string - upc: string - search_keywords: string - availability: available - availability_description: string - gift_wrapping_options_type: any - gift_wrapping_options_list: - - 0 - sort_order: -2147483648 - condition: New - is_condition_shown: true - order_quantity_minimum: 0 - order_quantity_maximum: 0 - page_title: string - meta_keywords: - - string - meta_description: string - view_count: 0 - preorder_release_date: '2019-08-24T14:15:22Z' - preorder_message: string - is_preorder_only: true - is_price_hidden: true - price_hidden_label: string - custom_url: - url: string - is_customized: true - open_graph_type: product - open_graph_title: string - open_graph_description: string - open_graph_use_meta_description: true - open_graph_use_product_name: true - open_graph_use_image: true - brand_name: Common Good - gtin: string - mpn: string - date_last_imported: '2015-07-03T18:16:02+00:00' - reviews_rating_sum: 3 - reviews_count: 4 - total_sold: 80 - custom_fields: - - id: 6 - name: ISBN - value: '1234567890123' - bulk_pricing_rules: - - id: 0 - quantity_min: 10 - quantity_max: 50 - type: price - amount: 10 - images: - - image_file: string - is_thumbnail: true - sort_order: -2147483648 - description: string - image_url: string - id: 0 - product_id: 0 - url_zoom: string - url_standard: string - url_thumbnail: string - url_tiny: string - date_modified: '2019-08-24T14:15:22Z' - videos: - - title: Writing Great Documentation - description: A video about documentation - sort_order: 1 - type: youtube - video_id: z3fRu9pkuXE - id: 0 - product_id: 0 - length: string - date_created: '2018-08-15T14:49:05+00:00' - date_modified: '2018-08-24T14:41:00+00:00' - base_variant_id: 0 - calculated_price: 0 - options: - - id: 55 - product_id: 4 - display_name: Add-a-$5-Donation1535042499-187 - type: radio_buttons - config: - default_value: string - checked_by_default: true - checkbox_label: string - date_limited: true - date_limit_mode: range - date_earliest_value: '2019-08-24' - date_latest_value: '2019-08-24' - file_types_mode: specific - file_types_supported: - - 'images, documents, other' - file_types_other: - - pdf - file_max_size: 5 - text_characters_limited: true - text_min_length: 1 - text_max_length: 55 - text_lines_limited: true - text_max_lines: 4 - number_limited: true - number_limit_mode: lowest - number_lowest_value: 100 - number_highest_value: 0 - number_integers_only: false - product_list_adjusts_inventory: true - product_list_adjusts_pricing: true - product_list_shipping_calc: weight - sort_order: 1 - option_values: - - is_default: false - label: Green - sort_order: 0 - value_data: {} - id: 0 - modifiers: - - type: date - required: true - sort_order: 0 - config: - default_value: string - checked_by_default: true - checkbox_label: string - date_limited: true - date_limit_mode: range - date_earliest_value: '2019-08-24' - date_latest_value: '2019-08-24' - file_types_mode: specific - file_types_supported: - - 'images, documents, other' - file_types_other: - - pdf - file_max_size: 5 - text_characters_limited: true - text_min_length: 1 - text_max_length: 55 - text_lines_limited: true - text_max_lines: 4 - number_limited: true - number_limit_mode: lowest - number_lowest_value: 100 - number_highest_value: 0 - number_integers_only: false - product_list_adjusts_inventory: true - product_list_adjusts_pricing: true - product_list_shipping_calc: weight - display_name: string - id: 12 - product_id: 77 - name: Add-a-$5-Donation1535039590-191 - option_values: - - is_default: false - label: Green - sort_order: 0 - value_data: {} - adjusters: - price: - adjuster: relative - adjuster_value: 5 - weight: - adjuster: relative - adjuster_value: 5 - image_url: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' - purchasing_disabled: - status: true - message: string - id: 0 - option_id: 0 - option_set_id: 0 - option_set_display: string - variants: - - cost_price: 0 - price: 0 - sale_price: 0 - retail_price: 0 - weight: 0 - width: 0 - height: 0 - depth: 0 - is_free_shipping: true - fixed_cost_shipping_price: 0 - purchasing_disabled: true - purchasing_disabled_message: string - upc: string - inventory_level: 0 - inventory_warning_level: 0 - bin_picking_number: string - mpn: string - gtin: '012345678905' - id: 0 - product_id: 0 - sku: string - sku_id: 0 - option_values: - - option_display_name: Color - label: Beige - id: 146 - option_id: 151 - calculated_price: 0 - calculated_weight: 0 - meta: - pagination: - total: 36 - count: 36 - per_page: 50 - current_page: 1 - total_pages: 1 - links: - previous: string - current: '?page=1&limit=50' - next: string + example: + id: 0 + name: Smith Journal 13 + type: physical + sku: SM-13 + description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' + weight: 0 + width: 0 + depth: 0 + height: 0 + price: 0 + cost_price: 0 + retail_price: 0 + sale_price: 0 + map_price: 0 + tax_class_id: 0 + product_tax_code: string + categories: + - 0 + brand_id: 37 + inventory_level: 0 + inventory_warning_level: 0 + inventory_tracking: none + fixed_cost_shipping_price: 0 + is_free_shipping: true + is_visible: true + is_featured: true + related_products: + - 0 + warranty: string + bin_picking_number: string + layout_file: string + upc: string + search_keywords: string + availability: available + availability_description: string + gift_wrapping_options_type: any + gift_wrapping_options_list: + - 0 + sort_order: -2147483648 + condition: New + is_condition_shown: true + order_quantity_minimum: 0 + order_quantity_maximum: 0 + page_title: string + meta_keywords: + - string + meta_description: string + view_count: 0 + preorder_release_date: '2019-08-24T14:15:22Z' + preorder_message: string + is_preorder_only: true + is_price_hidden: true + price_hidden_label: string + custom_url: + url: string + is_customized: true + open_graph_type: product + open_graph_title: string + open_graph_description: string + open_graph_use_meta_description: true + open_graph_use_product_name: true + open_graph_use_image: true + gtin: string + mpn: string + date_last_imported: '2015-07-03T18:16:02+00:00' + reviews_rating_sum: 3 + reviews_count: 4 + total_sold: 80 + custom_fields: + - id: 6 + name: ISBN + value: '1234567890123' + bulk_pricing_rules: + - id: 0 + quantity_min: 10 + quantity_max: 50 + type: price + amount: 10 + images: + - image_file: string + is_thumbnail: true + sort_order: -2147483648 + description: string + image_url: string + id: 0 + product_id: 0 + url_zoom: string + url_standard: string + url_thumbnail: string + url_tiny: string + date_modified: '2019-08-24T14:15:22Z' '207': description: |- Multi-status. Typically indicates that a partial failure has occurred, such as when a POST or PUT request is successful, but saving one of the attributes has failed. @@ -638,8 +474,8 @@ paths: $ref: '#/components/schemas/product_Full' meta: $ref: '#/components/schemas/metaEmpty_Full' - example-1: example: + id: 0 name: Smith Journal 13 type: physical sku: SM-13 @@ -657,7 +493,7 @@ paths: product_tax_code: string categories: - 0 - brand_id: 0 + brand_id: 37 inventory_level: 0 inventory_warning_level: 0 inventory_tracking: none @@ -687,7 +523,7 @@ paths: - string meta_description: string view_count: 0 - preorder_release_date: '2019-08-24T14:15:22+00:00' + preorder_release_date: '2019-08-24T14:15:22Z' preorder_message: string is_preorder_only: true is_price_hidden: true @@ -701,11 +537,10 @@ paths: open_graph_use_meta_description: true open_graph_use_product_name: true open_graph_use_image: true - brand_name: Common Good gtin: string mpn: string date_last_imported: '2015-07-03T18:16:02+00:00' - reviews_rating_sum: 3.2 + reviews_rating_sum: 3 reviews_count: 4 total_sold: 80 custom_fields: @@ -730,147 +565,7 @@ paths: url_standard: string url_thumbnail: string url_tiny: string - date_modified: '2019-08-24T14:15:22+00:00' - videos: - - title: string - description: string - sort_order: -2147483648 - type: youtube - video_id: string - id: 0 - product_id: 0 - length: string - date_created: '2018-08-15T14:49:05+00:00' - date_modified: '2018-08-24T14:41:00+00:00' - id: 1 - base_variant_id: 0 - calculated_price: 0 - options: - - id: 55 - product_id: 4 - display_name: Add-a-$5-Donation1535042499-187 - type: radio_buttons - config: - default_value: string - checked_by_default: true - checkbox_label: string - date_limited: true - date_limit_mode: range - date_earliest_value: '2019-08-24T00:00:00+00:00' - date_latest_value: '2019-08-24T00:00:00+00:00' - file_types_mode: specific - file_types_supported: - - 'images, documents, other' - file_types_other: - - pdf - file_max_size: 5 - text_characters_limited: true - text_min_length: 1 - text_max_length: 55 - text_lines_limited: true - text_max_lines: 4 - number_limited: true - number_limit_mode: lowest - number_lowest_value: 100 - number_highest_value: 0 - number_integers_only: false - product_list_adjusts_inventory: true - product_list_adjusts_pricing: true - product_list_shipping_calc: weight - sort_order: 1 - option_values: - is_default: false - label: Green - sort_order: 0 - value_data: {} - id: 0 - modifiers: - - type: date - required: true - sort_order: 0 - config: - default_value: string - checked_by_default: true - checkbox_label: string - date_limited: true - date_limit_mode: range - date_earliest_value: '2019-08-24T00:00:00+00:00' - date_latest_value: '2019-08-24T00:00:00+00:00' - file_types_mode: specific - file_types_supported: - - 'images, documents, other' - file_types_other: - - pdf - file_max_size: 5 - text_characters_limited: true - text_min_length: 1 - text_max_length: 55 - text_lines_limited: true - text_max_lines: 4 - number_limited: true - number_limit_mode: lowest - number_lowest_value: 100 - number_highest_value: 0 - number_integers_only: false - product_list_adjusts_inventory: true - product_list_adjusts_pricing: true - product_list_shipping_calc: weight - display_name: string - id: 12 - product_id: 77 - name: Add-a-$5-Donation1535039590-191 - option_values: - - is_default: false - label: Green - sort_order: 0 - value_data: {} - adjusters: - price: - adjuster: relative - adjuster_value: 5 - weight: - adjuster: relative - adjuster_value: 5 - image_url: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' - purchasing_disabled: - status: true - message: string - id: 0 - option_id: 0 - option_set_id: 0 - option_set_display: string - variants: - - cost_price: 0 - price: 0 - sale_price: 0 - retail_price: 0 - weight: 0 - width: 0 - height: 0 - depth: 0 - is_free_shipping: true - fixed_cost_shipping_price: 0 - purchasing_disabled: true - purchasing_disabled_message: string - upc: string - inventory_level: 0 - inventory_warning_level: 0 - bin_picking_number: string - mpn: string - gtin: '012345678905' - id: 0 - product_id: 0 - sku: string - sku_id: 0 - option_values: - - option_display_name: Color - label: Beige - id: 146 - option_id: 151 - calculated_price: 0 - calculated_weight: 0 - meta: {} - '207': + date_modified: '2019-08-24T14:15:22Z' '207': description: |- Multi-status. Typically indicates that a partial failure has occurred, such as when a POST or PUT request is successful, but saving one of the attributes has failed. @@ -6713,7 +6408,7 @@ components: type: integer description: ID of the product. Read-Only. readOnly: true - - $ref: '#/components/schemas/product_Base' + - $ref: '#/components/schemas/product_Base_response' - type: object properties: date_created: @@ -6832,6 +6527,7 @@ components: categories: - 0 brand_id: 0 + brand_name: "New Brand" inventory_level: 0 inventory_warning_level: 0 inventory_tracking: none @@ -6875,7 +6571,6 @@ components: open_graph_use_meta_description: true open_graph_use_product_name: true open_graph_use_image: true - brand_name: Common Good gtin: string mpn: string date_last_imported: '2015-07-03T18:16:02+00:00' @@ -7089,108 +6784,83 @@ components: * `GET` x-internal: false x-examples: - example-1: - id: 0 - name: Smith Journal 13 - type: physical - sku: SM-13 - description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' - weight: 0 - width: 0 - depth: 0 - height: 0 - price: 0 - cost_price: 0 - retail_price: 0 - sale_price: 0 - map_price: 0 - tax_class_id: 0 - product_tax_code: string - categories: - - 0 - brand_id: 0 - inventory_level: 0 - inventory_warning_level: 0 - inventory_tracking: none - fixed_cost_shipping_price: 0 - is_free_shipping: true - is_visible: true - is_featured: true - related_products: - - 0 - warranty: string - bin_picking_number: string - layout_file: string - upc: string - search_keywords: string - availability_description: string - availability: available - gift_wrapping_options_type: any - gift_wrapping_options_list: - - 0 - sort_order: -2147483648 - condition: New - is_condition_shown: true - order_quantity_minimum: 0 - order_quantity_maximum: 0 - page_title: string - meta_keywords: - - string - meta_description: string - view_count: 0 - preorder_release_date: '2019-08-24T14:15:22Z' - preorder_message: string - is_preorder_only: true - is_price_hidden: true - price_hidden_label: string - custom_url: - url: string - is_customized: true - open_graph_type: product - open_graph_title: string - open_graph_description: string - open_graph_use_meta_description: true - open_graph_use_product_name: true - open_graph_use_image: true - brand_name: Common Good - gtin: string - mpn: string - date_last_imported: '2015-07-03T18:16:02+00:00' - reviews_rating_sum: 3.2 - reviews_count: 4 - total_sold: 80 - custom_fields: - - id: 6 - name: ISBN - value: '1234567890123' - bulk_pricing_rules: - - id: 0 - quantity_min: 10 - quantity_max: 50 - type: price - amount: 10 - images: - - image_file: string - is_thumbnail: true + example: + data: + - id: 37 + name: Smith Journal 13 + type: physical + sku: SM-13 + description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' + weight: 5 + width: 5 + depth: 5 + height: 5 + price: 40 + cost_price: 40 + retail_price: 40 + sale_price: 40 + map_price: 0 + tax_class_id: 0 + product_tax_code: string + calculated_price: 50 + categories: + - 24 + brand_id: 37 + brand_name: "New Brand" + option_set_id: 21 + option_set_display: "right" + inventory_level: 100 + inventory_warning_level: 10 + inventory_tracking: "product" + reviews_rating_sum: 0 + reviews_count: 0 + total_sold: 44 + fixed_cost_shipping_price: 50 + is_free_shipping: true + is_visible: true + is_featured: true + related_products: + - 163 + warranty: string + bin_picking_number: string + layout_file: product.html + upc: string + mpn: " " + gtin: " " + date_last_imported: "2022-01-27T20:17:47+00:00" + search_keywords: string + availability: "available" + availability_description: string + gift_wrapping_options_type: any + gift_wrapping_options_list: + - 0 sort_order: -2147483648 - description: string - image_url: string - id: 0 - product_id: 0 - url_zoom: string - url_standard: string - url_thumbnail: string - url_tiny: string - date_modified: '2019-08-24T14:15:22Z' - videos: - - title: Writing Great Documentation - description: A video about documenation - sort_order: 1 - type: youtube - video_id: z3fRu9pkuXE - id: 0 - product_id: 0 - length: string + condition: New + is_condition_shown: true + order_quantity_minimum: 1 + order_quantity_maximum: 1 + page_title: "dress" + meta_keywords: + - string + meta_description: string + date_created: "2021-02-10T20:29:15+00:00" + date_modified: "2024-06-10T15:45:28+00:00" + view_count: 0 + preorder_release_date: '2019-08-24T14:15:22Z' + preorder_message: string + is_preorder_only: true + is_price_hidden: true + price_hidden_label: string + custom_url: + url: "/dress/" + is_customized: true + base_variant_id: 112 + open_graph_type: product + open_graph_title: string + open_graph_description: string + open_graph_use_meta_description: true + open_graph_use_product_name: true + open_graph_use_image: true properties: name: maxLength: 250 @@ -7605,6 +7275,498 @@ components: - type - weight - price + product_Base_response: + title: product_Base_response + type: object + description: Base Product response + x-internal: false + x-examples: + example: + data: + - id: 37 + name: Smith Journal 13 + type: physical + sku: SM-13 + description: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' + weight: 5 + width: 5 + depth: 5 + height: 5 + price: 40 + cost_price: 40 + retail_price: 40 + sale_price: 40 + map_price: 0 + tax_class_id: 0 + product_tax_code: string + calculated_price: 50 + categories: + - 24 + brand_id: 37 + option_set_id: 21 + option_set_display: "right" + inventory_level: 100 + inventory_warning_level: 10 + inventory_tracking: "product" + reviews_rating_sum: 0 + reviews_count: 0 + total_sold: 44 + fixed_cost_shipping_price: 50 + is_free_shipping: true + is_visible: true + is_featured: true + related_products: + - 163 + warranty: string + bin_picking_number: string + layout_file: product.html + upc: string + mpn: " " + gtin: " " + date_last_imported: "2022-01-27T20:17:47+00:00" + search_keywords: string + availability: "available" + availability_description: string + gift_wrapping_options_type: any + gift_wrapping_options_list: + - 0 + sort_order: -2147483648 + condition: New + is_condition_shown: true + order_quantity_minimum: 1 + order_quantity_maximum: 1 + page_title: "dress" + meta_keywords: + - string + meta_description: string + date_created: "2021-02-10T20:29:15+00:00" + date_modified: "2024-06-10T15:45:28+00:00" + view_count: 0 + preorder_release_date: '2019-08-24T14:15:22Z' + preorder_message: string + is_preorder_only: true + is_price_hidden: true + price_hidden_label: string + custom_url: + url: "/dress/" + is_customized: true + base_variant_id: 112 + open_graph_type: product + open_graph_title: string + open_graph_description: string + open_graph_use_meta_description: true + open_graph_use_product_name: true + open_graph_use_image: true + properties: + name: + maxLength: 250 + minLength: 1 + type: string + description: | + A unique product name. + example: Smith Journal 13 + x-required: + - post + type: + type: string + description: | + The product type. One of: `physical` - a physical stock unit, `digital` - a digital download. + example: physical + enum: + - physical + - digital + x-required: + - post + sku: + maxLength: 255 + minLength: 0 + type: string + description: | + A unique user-defined alphanumeric product code/stock keeping unit (SKU). + example: SM-13 + description: + type: string + description: | + The product description, which can include HTML formatting. + example: '<p><span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel metus ac est egestas porta sed quis erat. Integer id nulla massa. Proin vitae enim nisi. Praesent non dignissim nulla. Nulla mattis id massa ac pharetra. Mauris et nisi in dolor aliquam sodales. Aliquam dui nisl, dictum quis leo sit amet, rutrum volutpat metus. Curabitur libero nunc, interdum ac libero non, tristique porttitor metus. Ut non dignissim lorem, in vestibulum leo. Vivamus sodales quis turpis eget.</span></p>' + weight: + maximum: 9999999999 + minimum: 0 + type: number + description: | + Weight of the product, which can be used when calculating shipping costs. This is based on the unit set on the store + format: float + width: + maximum: 9999999999 + minimum: 0 + type: number + description: | + Width of the product, which can be used when calculating shipping costs. + format: float + depth: + maximum: 9999999999 + minimum: 0 + type: number + description: | + Depth of the product, which can be used when calculating shipping costs. + format: float + height: + maximum: 9999999999 + minimum: 0 + type: number + description: | + Height of the product, which can be used when calculating shipping costs. + format: float + price: + minimum: 0 + type: number + description: | + The price of the product. The price should include or exclude tax, based on the store settings. + format: float + cost_price: + minimum: 0 + type: number + description: | + The cost price of the product. Stored for reference only; it is not used or displayed anywhere on the store. + format: float + retail_price: + minimum: 0 + type: number + description: | + The retail cost of the product. If entered, the retail cost price will be shown on the product page. + format: float + sale_price: + minimum: 0 + type: number + description: | + If entered, the sale price will be used instead of value in the price field when calculating the productʼs cost. + format: float + map_price: + type: number + description: Minimum Advertised Price + tax_class_id: + maximum: 255 + minimum: 0 + type: number + description: | + The ID of the tax class applied to the product. (NOTE: Value ignored if automatic tax is enabled.) + product_tax_code: + maxLength: 255 + minLength: 0 + type: string + description: | + Tax Codes, such as AvaTax System Tax Codes, identify products and services that fall into special sales-tax categories. By using these codes, merchants who subscribe to a tax provider integration, such as BigCommerceʼs Avalara Premium, can calculate sales taxes more accurately. Stores without a tax provider will ignore the code when calculating sales tax. Do not pass more than one code. The codes are case-sensitive. For details, please see the tax providerʼs documentation. + categories: + type: array + description: | + An array of IDs for the categories to which this product belongs. When updating a product, if an array of categories is supplied, all product categories will be overwritten. Does not accept more than 1,000 ID values. + x-required: + - post + items: + type: number + maximum: 1000 + minimum: 0 + brand_id: + maximum: 1000000000 + minimum: 0 + type: integer + description: | + You can add a product to an existing brand during a product /PUT or /POST use the `brand_id` field. The response body can include `brand_id'. + inventory_level: + maximum: 2147483647 + minimum: 0 + type: integer + description: |- + Current inventory level of the product. You must track inventory by _product_ for this to take effect (see the `inventory_tracking` field). The Catalog API returns the inventory for only the default location. + + The inventory for a product cannot exceed 2,147,483,647 in the catalog. If you exceed the limit, the store sets the inventory level to the limit. + + The Catalog API handles limits in a different way than the Inventory API. For more information, see [Limit handling](/docs/store-operations/catalog/inventory-adjustments#limit-handling-in-inventory-versus-catalog-api). + inventory_warning_level: + maximum: 2147483647 + minimum: 0 + type: integer + description: | + Inventory warning level for the product. When the productʼs inventory level drops below the warning level, the store owner will be informed. Simple inventory tracking must be enabled (see the `inventory_tracking` field) for this to take any effect. + inventory_tracking: + type: string + description: | + The type of inventory tracking for the product. Values are: `none` - inventory levels will not be tracked; `product` - inventory levels will be tracked using the `inventory_level` and `inventory_warning_level` fields; `variant` - inventory levels will be tracked based on variants, which maintain their own warning levels and inventory levels. + enum: + - none + - product + - variant + fixed_cost_shipping_price: + minimum: 0 + type: number + description: | + A fixed shipping cost for the product. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + format: float + is_free_shipping: + type: boolean + description: | + Flag used to indicate whether the product has free shipping. If `true`, the shipping cost for the product will be zero. + is_visible: + type: boolean + description: | + Flag to determine whether the product should be displayed to customers browsing the store. If `true`, the product will be displayed. If `false`, the product will be hidden from view. + is_featured: + type: boolean + description: | + Flag to determine whether the product should be included in the `featured products` panel when viewing the store. + related_products: + type: array + description: | + An array of IDs for the related products. + items: + type: integer + warranty: + maxLength: 65535 + minLength: 0 + type: string + description: | + Warranty information displayed on the product page. Can include HTML formatting. + bin_picking_number: + maxLength: 255 + minLength: 0 + type: string + description: | + The BIN picking number for the product. + layout_file: + maxLength: 500 + minLength: 0 + type: string + description: | + The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). + upc: + type: string + maxLength: 32 + minLength: 0 + description: | + The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. + search_keywords: + maxLength: 65535 + minLength: 0 + type: string + description: | + A comma-separated list of keywords that can be used to locate the product when searching the store. + availability_description: + maxLength: 255 + minLength: 0 + type: string + description: | + Availability text displayed on the checkout page, under the product title. Tells the customer how long it will normally take to ship this product, such as: 'Usually ships in 24 hours.' + availability: + type: string + description: | + Availability of the product. (Corresponds to the productʼs [Purchasability](https://support.bigcommerce.com/s/article/Adding-Products-v3?language=en_US#sections) section in the control panel.) Supported values: `available` - the product is available for purchase; `disabled` - the product is listed on the storefront, but cannot be purchased; `preorder` - the product is listed for pre-orders. + enum: + - available + - disabled + - preorder + gift_wrapping_options_type: + type: string + description: | + Type of gift-wrapping options. Values: `any` - allow any gift-wrapping options in the store; `none` - disallow gift-wrapping on the product; `list` – provide a list of IDs in the `gift_wrapping_options_list` field. + + Always included in the response body; not applicable for the `include_fields` and `exclude_fields` query parameters. + enum: + - any + - none + - list + gift_wrapping_options_list: + type: array + description: | + A list of gift-wrapping option IDs. + + Always included in the response body; not applicable for the `include_fields` and `exclude_fields` query parameters. + items: + type: integer + sort_order: + type: integer + description: | + Priority to give this product when included in product lists on category pages and in search results. Lower integers will place the product closer to the top of the results. + maximum: 2147483647 + minimum: -2147483648 + condition: + type: string + description: | + The product condition. Will be shown on the product page if the `is_condition_shown` fieldʼs value is `true`. Possible values: `New`, `Used`, `Refurbished`. + enum: + - New + - Used + - Refurbished + is_condition_shown: + type: boolean + description: | + Flag used to determine whether the product condition is shown to the customer on the product page. + order_quantity_minimum: + maximum: 1000000000 + minimum: 0 + type: integer + description: | + The minimum quantity an order must contain, to be eligible to purchase this product. + order_quantity_maximum: + maximum: 1000000000 + minimum: 0 + type: integer + description: | + The maximum quantity an order can contain when purchasing the product. + page_title: + maxLength: 255 + minLength: 0 + type: string + description: | + Custom title for the product page. If not defined, the product name will be used as the meta title. + meta_keywords: + type: array + maxLength: 65535 + minLength: 0 + description: | + Custom meta keywords for the product page. If not defined, the storeʼs default keywords will be used. + items: + type: string + meta_description: + maxLength: 65535 + minLength: 0 + type: string + description: | + Custom meta description for the product page. If not defined, the storeʼs default meta description will be used. + view_count: + maximum: 1000000000 + minimum: 0 + type: integer + description: | + The number of times the product has been viewed. + deprecated: true + preorder_release_date: + type: string + description: | + Pre-order release date. See the `availability` field for details on setting a productʼs availability to accept pre-orders. + format: date-time + nullable: true + preorder_message: + maxLength: 255 + minLength: 0 + type: string + description: | + Custom expected-date message to display on the product page. If undefined, the message defaults to the storewide setting. Can contain the `%%DATE%%` placeholder, which will be substituted for the release date. + is_preorder_only: + type: boolean + description: | + If set to true then on the preorder release date the preorder status will automatically be removed. + If set to false, then on the release date the preorder status **will not** be removed. It will need to be changed manually either in the + control panel or using the API. Using the API set `availability` to `available`. + is_price_hidden: + type: boolean + description: | + False by default, indicating that this productʼs price should be shown on the product page. If set to `true`, the price is hidden. (NOTE: To successfully set `is_price_hidden` to `true`, the `availability` value must be `disabled`.) + price_hidden_label: + maxLength: 200 + minLength: 0 + type: string + description: | + By default, an empty string. If `is_price_hidden` is `true`, the value of `price_hidden_label` is displayed instead of the price. (NOTE: To successfully set a non-empty string value with `is_price_hidden` set to `true`, the `availability` value must be `disabled`.) + custom_url: + $ref: '#/components/schemas/customUrl_Full' + open_graph_type: + type: string + description: | + Type of product, defaults to `product`. + enum: + - product + - album + - book + - drink + - food + - game + - movie + - song + - tv_show + open_graph_title: + type: string + description: | + Title of the product, if not specified the product name will be used instead. + open_graph_description: + type: string + description: | + Description to use for the product, if not specified then the meta_description will be used instead. + open_graph_use_meta_description: + type: boolean + description: | + Flag to determine if product description or open graph description is used. + open_graph_use_product_name: + type: boolean + description: | + Flag to determine if product name or open graph name is used. + open_graph_use_image: + type: boolean + description: | + Flag to determine if product image or open graph image is used. + gtin: + type: string + description: Global Trade Item Number + mpn: + type: string + description: Manufacturer Part Number + date_last_imported: + type: string + description: the date when the Product had been imported + reviews_rating_sum: + type: integer + description: | + The total (cumulative) rating for the product. + example: 3 + reviews_count: + type: integer + description: | + The number of times the product has been rated. + example: 4 + total_sold: + type: integer + description: | + The total quantity of this product sold. + example: 80 + custom_fields: + type: array + minimum: 0 + maximum: 255 + description: 200 maximum custom fields per product. 255 maximum characters per custom field. The default rate limit for this endpoint is 40 concurrent requests. + items: + $ref: '#/components/schemas/productCustomField_Put' + bulk_pricing_rules: + type: array + items: + allOf: + - type: object + properties: + id: + type: integer + description: Unique ID of the *Bulk Pricing Rule*. Read-Only. + readOnly: true + required: + - id + - $ref: '#/components/schemas/bulkPricingRule_Full' + images: + type: array + items: + $ref: '#/components/schemas/productImage_Full' + videos: + type: array + description: | + The Catalog API integrates with third-party YouTube. + The [YouTube Terms of Service](https://www.youtube.com/t/terms) and [Google Privacy Policy](https://policies.google.com/privacy) apply, as indicated in our [Privacy Policy](https://www.bigcommerce.com/privacy/) and [Terms of Service](https://www.bigcommerce.com/terms/). + items: + $ref: '#/components/schemas/productVideo_Full' + variants: + type: array + items: + $ref: '#/components/schemas/productVariant_Full' + required: + - name + - type + - weight + - price metafield_Full: title: metafield_Full allOf: From efd0d11450bbec94c52dddc87572809faf5f0022 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 14 Jun 2024 14:16:53 -0500 Subject: [PATCH 059/221] DEVDOCS-5383: [Update] remove All pages restrictions (#331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5383] ## What changed? * Removed restrictions for scripts on All Pages. ## Release notes draft Bug Fix <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5383]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5383?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/integrations/scripts.mdx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/integrations/scripts.mdx b/docs/integrations/scripts.mdx index 918bcf72b..73e8aed2a 100644 --- a/docs/integrations/scripts.mdx +++ b/docs/integrations/scripts.mdx @@ -55,9 +55,6 @@ The following table describes the locations you can associate with Scripts API o | `checkout` | Checkout | | `order_confirmation` | Order Confirmation | -You cannot make a Scripts API script available on the following Stencil pages: -- giftcertificates.php -- sitemap.php To associate scripts with a checkout page, you need the [Modify Checkout Content OAuth scope](/docs/start/authentication/api-accounts#oauth-scopes). @@ -183,4 +180,4 @@ Stencil themes from the marketplace support [Optimized One-Page Checkout (Help C ### Tools -* [SRI Hash Generator](https://www.srihash.org/) \ No newline at end of file +* [SRI Hash Generator](https://www.srihash.org/) From c19ed0db1a762241e7f04abd20e1e610ba6c9113 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Fri, 14 Jun 2024 15:49:42 -0500 Subject: [PATCH 060/221] (no ticket): [repo] Issue templates, new (#3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # No ticket: issue templates ## What changed? <!-- Provide a bulleted list in the present tense --> * add issue template config and bug report template ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- .github/ISSUE_TEMPLATES/bug-report.yml | 29 ++++++++++++++++++++++++++ .github/ISSUE_TEMPLATES/config.yml | 13 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .github/ISSUE_TEMPLATES/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATES/config.yml diff --git a/.github/ISSUE_TEMPLATES/bug-report.yml b/.github/ISSUE_TEMPLATES/bug-report.yml new file mode 100644 index 000000000..0dc766b4e --- /dev/null +++ b/.github/ISSUE_TEMPLATES/bug-report.yml @@ -0,0 +1,29 @@ +name: 🖍️ Incorrect documentation report +description: Something is wrong or missing from the docs. +labels: + - 'bug:unverified' +body: + - type: markdown + attributes: + value: | + Thank you for helping improve the BigCommerce DevDocs! + + ## Tell us what's missing! + + - type: input + attributes: + label: What is the link to the page that needs updating? Provide multiple links if needed. + validations: + required: true + - type: textarea + attributes: + label: What needs to be documented? + description: A concise description of what you expect to see here. + validations: + required: true + - type: textarea + attributes: + label: What is currently documented? + description: A concise description of what you're actually seeing. + validations: + required: true diff --git a/.github/ISSUE_TEMPLATES/config.yml b/.github/ISSUE_TEMPLATES/config.yml new file mode 100644 index 000000000..21c4f53a0 --- /dev/null +++ b/.github/ISSUE_TEMPLATES/config.yml @@ -0,0 +1,13 @@ +blank_issues_enabled: false +contact_links: + - name: Get BigCommerce help + url: https://support.bigcommerce.com/s/contact + about: + If you need to file a BigCommerce bug report or platform outage, contact our Support team. Contact information is in the store control panel. Partners, please use your Partner Portal to open a case. + - name: Docs + DevCenter feature request + url: https://github.com/bigcommerce/docs/discussions/new?category=ideas-feature-requests + about: + We appreciate you taking the time to improve our docs! Meet us in Discussions to talk further about your feature request. + - name: 💬 BigCommerce community + url: https://developer.bigcommerce.com/community + about: Meet and chat with other people building with BigCommerce. From bf45fbc73f05428ce99324c30843f470438407a2 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Fri, 14 Jun 2024 16:02:36 -0500 Subject: [PATCH 061/221] [repo] Issue templates, rename directory (#335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [repo] Issue templates, rename directory ## What changed? <!-- Provide a bulleted list in the present tense --> * Issue templates, rename directory ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * TBD ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> * #3 ping {names} --- .github/{ISSUE_TEMPLATES => ISSUE_TEMPLATE}/bug-report.yml | 0 .github/{ISSUE_TEMPLATES => ISSUE_TEMPLATE}/config.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/{ISSUE_TEMPLATES => ISSUE_TEMPLATE}/bug-report.yml (100%) rename .github/{ISSUE_TEMPLATES => ISSUE_TEMPLATE}/config.yml (100%) diff --git a/.github/ISSUE_TEMPLATES/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml similarity index 100% rename from .github/ISSUE_TEMPLATES/bug-report.yml rename to .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATES/config.yml b/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .github/ISSUE_TEMPLATES/config.yml rename to .github/ISSUE_TEMPLATE/config.yml From 0abccd4183731fba7d435e4b0bd9313e7d0d0bb0 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Mon, 17 Jun 2024 14:18:56 -0500 Subject: [PATCH 062/221] [update] README, nextjs tutorial filename (#336) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [update] README, nextjs tutorial filename ## What changed? <!-- Provide a bulleted list in the present tense --> * sentence case README, comment out directory structure * change nextjs tutorial filename ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * N/A ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- README.md | 7 ++++--- .../tutorial/{nextjs-enhance.mdx => nextjs-enhance.mdx} | 0 2 files changed, 4 insertions(+), 3 deletions(-) rename docs/integrations/apps/tutorial/{nextjs-enhance.mdx => nextjs-enhance.mdx} (100%) diff --git a/README.md b/README.md index dc5ee5fe8..843a8a1a0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# BigCommerce Public Developer Documentation +# BigCommerce public developer documentation This repo is the source of truth for the public, open source BigCommerce DevDocs and API reference at [developer.bigcommerce.com](https://developer.bigcommerce.com). It consists of **Markdown React (.mdx)**, **OpenAPI Specification (.yml)**, and **JSON Schema (.json and .yml)** files. @@ -6,7 +6,7 @@ The BigCommerce DX team maintains these open source docs; we welcome your [issue ## Contributing -If you're interested in contributing, see our [Contribution Guide](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md). +If you're interested in contributing, see our [Contribution guide](CONTRIBUTING.md) and [Code of conduct](CODE_OF_CONDUCT.md). ## History @@ -29,6 +29,7 @@ Significant dates include the following: * In May 2023, we subdivided both the Catalog and Payments API specifications into multiple files. * On December 27, 2023, all public docs moved into the [bigcommerce/docs](https://github.com/bigcommerce/docs) repo. +<!-- ## Directory structure ```shell @@ -72,4 +73,4 @@ Significant dates include the following: ├── package.json ├── pull_request_template.md # template for most pull requests └── README.md -``` +``` --> diff --git a/docs/integrations/apps/tutorial/nextjs-enhance.mdx b/docs/integrations/apps/tutorial/nextjs-enhance.mdx similarity index 100% rename from docs/integrations/apps/tutorial/nextjs-enhance.mdx rename to docs/integrations/apps/tutorial/nextjs-enhance.mdx From 286ccf726df7ae976b22bec82cde22965549450b Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 17 Jun 2024 14:19:23 -0500 Subject: [PATCH 063/221] =?UTF-8?q?DEVDOCS-5477:=20[Update]=20Added=20requ?= =?UTF-8?q?irements=20for=20storefront=20checkout=20end=E2=80=A6=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …points <!-- Ticket number or summary of work --> # [DEVDOCS-5477] ## What changed? Added a note about endpoint requirements ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5477]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5477?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/checkouts.sf.yml | 40 ++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index 5773eb4c5..1ebe2e39f 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -44,7 +44,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: getCheckout parameters: - $ref: '#/components/parameters/IncludeShippingDefault' @@ -205,7 +206,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: updateCheckout parameters: - $ref: '#/components/parameters/ContentType' @@ -351,6 +353,7 @@ paths: > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. > * Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: updateCheckoutLineItem parameters: - $ref: '#/components/parameters/ContentType' @@ -486,7 +489,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutLineItem responses: '200': @@ -730,7 +734,8 @@ paths: > * The `email` property is only required if the customer is a guest shopper. Otherwise, it is set automatically. > * Sending `email` property as a payload in POST request triggers the abandoned cart notification process. > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: addCheckoutBillingAddress requestBody: content: @@ -875,7 +880,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: updateCheckoutBillingAddress requestBody: content: @@ -1152,6 +1158,7 @@ paths: > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. > * Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: createCheckoutConsignment requestBody: content: @@ -1315,6 +1322,7 @@ paths: > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. > * Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: updateCheckoutConsignment parameters: - $ref: '#/components/parameters/IncludeShippingPickupDefault' @@ -1452,7 +1460,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutConsignment responses: '200': @@ -1587,7 +1596,8 @@ paths: > * You are not able to purchase a gift certificate with a gift certificate. > * The rate limit is 20/hour (only for unique gift-certificate codes). > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: addCheckoutGiftCertificate requestBody: content: @@ -1735,7 +1745,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutGiftCertificate responses: '200': @@ -1761,7 +1772,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: addCheckoutCoupon requestBody: content: @@ -1905,7 +1917,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutCoupon responses: '200': @@ -2141,6 +2154,7 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: addCheckoutStoreCredit parameters: - $ref: '#/components/parameters/ContentType' @@ -2160,7 +2174,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: removeCheckoutStoreCredit responses: '200': @@ -2184,7 +2199,8 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. - > * The Send a Test Request feature is not currently supported for this endpoint. + > * The Send a Test Request feature is not currently supported for this endpoint. + > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: checkoutSpamProtection requestBody: content: From 30797ead15521da89a84c8ac63edc7d52700c4b9 Mon Sep 17 00:00:00 2001 From: Jack Harner <hello@jackharner.com> Date: Tue, 18 Jun 2024 09:07:50 -0600 Subject: [PATCH 064/221] [update] GQLSF carts guide, add default namespace callout (#332) Adding note about what namespace the graphql mutation will add a cart metafield to. <!-- Ticket number or summary of work --> ## What changed? <!-- Provide a bulleted list in the present tense --> * Added a note about what namespace the GraphQL Create Cart Metafield mutation will use. ## Release notes draft * The updated notes in the docs will save the merchants and developers time trying to chase down metafields added to the cart through the storefront. --------- Co-authored-by: Sarah Riehl <sarah.riehl@bigcommerce.com> --- docs/storefront/cart-checkout/guide/graphql-storefront.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/storefront/cart-checkout/guide/graphql-storefront.mdx b/docs/storefront/cart-checkout/guide/graphql-storefront.mdx index 78a7fd418..5e69562b4 100644 --- a/docs/storefront/cart-checkout/guide/graphql-storefront.mdx +++ b/docs/storefront/cart-checkout/guide/graphql-storefront.mdx @@ -575,8 +575,9 @@ If using the getCart query with customer impersonation tokens, you must include </Tabs> ### Create cart metafield + <Callout type="info"> -The current platform limit is 250 metafields for a single cart. +The current platform limit is 250 metafields for a single cart. When you create metafields using the `createCartMetafield` mutation, the default namespace is `bc_storefront`. </Callout> <Tabs items={['Request', 'Response']}> From 369c590a5de1ee038d5f3f1f53db7428f4f4ba63 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 18 Jun 2024 10:25:58 -0500 Subject: [PATCH 065/221] DEVDOCS-5878: [Update] graphql-cart-metafields (#314) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5878] ## What changed? Add new article "Working with Cart Metafields" ## Release notes draft Talk to Jamie Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5878]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5878?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Sarah Riehl <sarah.riehl@bigcommerce.com> --- docs/storefront/cart-checkout/metafields.mdx | 215 +++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 docs/storefront/cart-checkout/metafields.mdx diff --git a/docs/storefront/cart-checkout/metafields.mdx b/docs/storefront/cart-checkout/metafields.mdx new file mode 100644 index 000000000..773b3659c --- /dev/null +++ b/docs/storefront/cart-checkout/metafields.mdx @@ -0,0 +1,215 @@ +**GraphQL Storefront API: Cart Metafields** + +# Working with cart metafields + +Cart metafields let you add custom metadata to a cart to display product information. Cart metafields are key-value pairs. You can work with them using both the GraphQL Storefront API and the REST Storefront API. + +## Example queries and mutations + +### Query cart metafields + +<Tabs items={['Request', 'Response']}> + <Tab> +```graphql filename="Example query: Get cart metafields" showLineNumbers copy + query getCartMetafields { + site{ + cart{ + metafields(namespace: "bc_storefront"){ + edges{ + node{ + id + key + value + } + } + } + } + } +} +``` +</Tab> +<Tab> +```json filename="Example query: Get cart metafields" showLineNumbers copy +{ + "data": { + "site": { + "cart": { + "metafields": { + "edges": [ + { + "node": { + "id": "TWV0YWZpZWxkczo1NQ==", + "key": "size", + "value": "small" + } + } + ] + } + } + } + } +} +``` +</Tab> +</Tabs> + + +### Create a cart metafield + +<Callout type="info"> +The platform limit is 250 metafields for a single cart. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> +```graphql filename="Example mutation: Create a cart metafield" showLineNumbers copy +mutation createCartMetafield { + cart { + createCartMetafield(input:{ + cartEntityId: "4a5fd706-beb9-41b5-9ac2-01593b471168" + data: { + key: "size" + value: "small" + } + }) { + metafield { + id + entityId + key + value + } + errors { + ...on Error { + message + } + } + } +} +} + ``` +</Tab> + <Tab> + ```json filename="Example mutation: Create a cart metafield" showLineNumbers copy + { + "data": { + "cart": { + "createCartMetafield": { + "metafield": { + "id": "TWV0YWZpZWxkczo1Mw==", + "entityId": 53, + "key": "size", + "value": "small" + }, + "errors": [] + } + } + } +} +``` + </Tab> +</Tabs> + +### Update a cart metafield +<Tabs items={['Request', 'Response']}> + <Tab> + ```graphql filename="Example mutation: Update a cart metafield" showLineNumbers copy + mutation updateCartMetafield { + cart { + updateCartMetafield(input:{ + cartEntityId: "4a5fd706-beb9-41b5-9ac2-01593b471168" + metafieldEntityId:53 + data: { + key: "Size", + value: "medium" + } + }) { + metafield { + id + entityId + key + value + } + errors { + ...on Error { + message + } + } + } + } +} + +``` +</Tab> + <Tab> +```json filename="Example mutation: Update a cart metafield" showLineNumbers copy + { + "data": { + "cart": { + "updateCartMetafield": { + "metafield": { + "id": "TWV0YWZpZWxkczo1Mw==", + "entityId": 53, + "key": "Size", + "value": "medium" + }, + "errors": [] + } + } + } +} +``` + </Tab> +</Tabs> + +### Delete a cart metafield +<Tabs items={['Request', 'Response']}> + <Tab> +```graphql filename="Example mutation: Delete a cart metafield" showLineNumbers copy + mutation deleteCartMetafield { + cart { + deleteCartMetafield(input:{ + cartEntityId: "4a5fd706-beb9-41b5-9ac2-01593b471168" + metafieldEntityId: 53 + }) { + errors { + ... on NotFoundError { + __typename + message + } + ... on ValidationError { + __typename + message + path + } + ... on NotAuthorisedError { + __typename + } + } + } + } +} +``` +</Tab> + <Tab> +```json filename="Example mutation: Delete a cart metafield" showLineNumbers copy +{ + "data": { + "cart": { + "deleteCartMetafield": { + "errors": [] + } + } + } +} +``` + </Tab> +</Tabs> + +## Resources + +### GraphQL documentation +- [GraphQL Storefront API overview](/docs/storefront/graphql) +- [GraphQL Storefront API: Carts and Checkout](/docs/storefront/cart-checkout/guide/graphql-storefront) +- [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront) +- [Authentication and Example Requests: BigCommerce-generated JWTs](/docs/start/authentication#bigcommerce-generated-jwts) +- [GraphQL Storefront Playground](/graphql-storefront/playground) From f1f528a2f93b3feda7d5c26494ee345a23a29e25 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 18 Jun 2024 14:36:31 -0500 Subject: [PATCH 066/221] DEVDOCS-5958: [Update] add note about multiple coupons (#334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5958] ## What changed? Added note about enabling multiple coupons. ## Release notes draft * We're happy to announce the ability to apply multiple coupons on a cart using the Checkout v3 API. <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5958]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5958?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/checkouts.v3.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index cf348f223..366215bd8 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -6278,7 +6278,9 @@ paths: - Checkout Coupons summary: Add Coupon to Checkout description: |- - Adds a coupon code to a checkout. + Adds a coupon code to a checkout. + + You can use multiple coupons by using this endpoint to apply one coupon at a time on your storefront. Ensure you enable the [Promotion Settings](https://support.bigcommerce.com/s/article/Store-Settings?language=en_US#promotion) in your control panel to allow for multiple coupons per order. **Required Fields** * coupon_code From c20072cf3ff429bbf1d5e7a7e52d44b2261f26d2 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:57:21 -0500 Subject: [PATCH 067/221] DEVDOCS-5889 [update]: Webhooks, update inventory webhook description (#339) --- docs/integrations/webhooks/events/index.mdx | 4 ++-- docs/webhooks/callbacks/_all.yml | 4 ++-- .../callbacks/store_product_inventory_order_updated.yml | 2 +- docs/webhooks/callbacks/store_sku_inventory_order_updated.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/integrations/webhooks/events/index.mdx b/docs/integrations/webhooks/events/index.mdx index 1c14c2841..fdddc44fc 100644 --- a/docs/integrations/webhooks/events/index.mdx +++ b/docs/integrations/webhooks/events/index.mdx @@ -806,7 +806,7 @@ Consult the [product assignment section of the Channel Webhooks Guide](/docs/int | store/product/created | Fires when a new product is created. | | store/product/updated | Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the [product updated events](#product-update-events) that follow. The `context` fields are present for only override updates. | | store/product/inventory/updated | Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. <br /><br />For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. <br /><br />Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. | -| store/product/inventory/order/updated | Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel.<br /><br />The webhook always fires for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _product_. | +| store/product/inventory/order/updated | Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel.<br /><br />The webhook always fires for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _product_. | | store/product/metafield/* | Fires for all store/product/metafield events. | | store/product/metafield/created | Fires when a new product metafield is created. | | store/product/metafield/updated | Fires when product metafield details are edited. | @@ -1015,7 +1015,7 @@ Consult the [sites section of the Channel Webhooks Guide](/docs/integrations/web | store/sku/updated | Fires when a SKU is updated. | | store/sku/deleted | Fires when a SKU is deleted. | | store/sku/inventory/updated | Fires when inventory levels change for a _variant_. This webhook does not fire for products without variants. <br /><br />For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_ and the _variant-level_ inventory changes. <br /><br />Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. | -| store/sku/inventory/order/updated | Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). Settings for a channel apply when inventory changes through an order in a channel.<br /><br />The webhook does not fire for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _variant_. | +| store/sku/inventory/order/updated | Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). Settings for a channel apply when inventory changes through an order in a channel.<br /><br />The webhook does not fire for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _variant_. | Payload objects with the following scopes take the form that follows: diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index e7bf1f1fb..b7d40b7b6 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -364,7 +364,7 @@ properties: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_deleted.yml store/product/inventory/order/updated: description: |- - Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. type: object @@ -456,7 +456,7 @@ properties: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_deleted.yml store/sku/inventory/order/updated: description: |- - Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. type: object diff --git a/docs/webhooks/callbacks/store_product_inventory_order_updated.yml b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml index 41d1e10ab..0f2614018 100644 --- a/docs/webhooks/callbacks/store_product_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml @@ -2,7 +2,7 @@ type: object properties: store/product/inventory/order/updated: description: |- - Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. type: object diff --git a/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml index c0e482a21..4d3abcf4f 100644 --- a/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml @@ -2,7 +2,7 @@ type: object properties: store/sku/inventory/order/updated: description: |- - Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when you refund or cancel an order. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. + Fires when _variant_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel. The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. type: object From df4d2244565dd791f2b8c8339c18147b449f904e Mon Sep 17 00:00:00 2001 From: Riccardo <147587711+smcc-riccardoc@users.noreply.github.com> Date: Thu, 20 Jun 2024 22:19:44 +0200 Subject: [PATCH 068/221] Remove duplicated `location_id` param (#340) ## What changed? <!-- Provide a bulleted list in the present tense --> * Remove duplicated parameter `location_id` ping @slsriehl @bc-tgomez Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- reference/locations.v3.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reference/locations.v3.yml b/reference/locations.v3.yml index 667db692e..9731107b6 100644 --- a/reference/locations.v3.yml +++ b/reference/locations.v3.yml @@ -186,11 +186,6 @@ paths: '/inventory/locations/{location_id}/metafields': parameters: - $ref: '#/components/parameters/Accept' - - schema: - type: string - name: location_id - in: path - required: true get: summary: Get Metafields description: Retrieve metafields for a location. From e15377c77d24ef7bfb1400ed393e8cf36abdbac4 Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Tue, 25 Jun 2024 17:24:31 -0400 Subject: [PATCH 069/221] SELFDEV-626 Change PUT site's routes body to array (#351) <!-- Ticket number or summary of work --> # [SELFDEV-626] ## What changed? This PR changes the request body of PUT site's routes to an array of objects, as pointed out by the SELFDEV-626 submitter. > Furthermore, the code sample for "Update a Site's Routes" is incorrect. Since it's a bulk update for all possible Routes, it should be wrapped in an array: > ``` > [{ > "id": 0, > "type": "product", > "matching": "5", > "route": "/my-amazing-product" > }] > ``` > Attempting to run the code sample presently documented will result in this error: > > ``` > "status": 422, > "title": "The request payload has to be a JSON array for the endpoint" > ``` [SELFDEV-626]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-626?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/sites.v3.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reference/sites.v3.yml b/reference/sites.v3.yml index c1af90a68..0bda80fb8 100644 --- a/reference/sites.v3.yml +++ b/reference/sites.v3.yml @@ -401,7 +401,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/siteRoute_Full' + type: array + items: + $ref: '#/components/schemas/siteRoute_Full' x-examples: application/json: - id: 1 From 13509559f6fe0463ae80c889a246928f838c48ef Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Wed, 26 Jun 2024 01:29:06 +0300 Subject: [PATCH 070/221] CATALOG-9786: [update] Brands: REST Catalog (#337) # [CATALOG-9786] ## What changed? * Add swagger file for V2 Brands * Update swagger file for V3 Brands ## Release notes draft * Revert this PR [CATALOG-9786]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9786?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- archive/rest-catalog/brands.v2.yaml | 515 ++++++++++++++++++++++++ reference/catalog/brands_catalog.v3.yml | 4 + 2 files changed, 519 insertions(+) create mode 100644 archive/rest-catalog/brands.v2.yaml diff --git a/archive/rest-catalog/brands.v2.yaml b/archive/rest-catalog/brands.v2.yaml new file mode 100644 index 000000000..244c149f0 --- /dev/null +++ b/archive/rest-catalog/brands.v2.yaml @@ -0,0 +1,515 @@ +openapi: '3.0.3' +info: + title: Catalog - Brands V2 (Deprecated) + description: |- + Brand facets for identifying and categorizing products according to their manufacturer or company metonym. + + #### Deprecated + + Avoid using this API operation if possible. It will be removed in a future version. For the most up-to-date version of this API, see [Brands](/docs/rest-catalog/brands). + + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com + version: '1.0.1' +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v2' + variables: + store_url: + default: store_url + description: Permanent url of the BigCommerce store. + description: BigCommerce API Gateway +security: + - basicAuth: [] +tags: + - name: Brands V2 +paths: + '/brands': + get: + tags: + - Brands V2 + summary: Gets list of Brands. (Deprecated) + description: Gets the collection of Brands. (Default sorting is by brand id, from lowest to highest.) + operationId: getBrands + parameters: + - $ref: '#/components/parameters/Name' + - $ref: '#/components/parameters/IdMin' + - $ref: '#/components/parameters/IdMax' + - $ref: '#/components/parameters/Page' + - $ref: '#/components/parameters/Limit' + responses: + '200': + $ref: '#/components/responses/brands' + '400': + $ref: '#/components/responses/errors' + '401': + $ref: '#/components/responses/errorsWithDetails' + '403': + $ref: '#/components/responses/errorsWithDetails' + post: + tags: + - Brands V2 + summary: Create a Brand. (Deprecated) + description: |- + Creates a *Brand*. + + **Required Fields** + + The following properties of the brand are required. The request won’t be fulfilled unless these properties are valid. + - name + + **Read-only Fields** + + The following properties of the brand are read-only. If one or more of these properties are included in the request, it will be rejected. + - id + + **Limits** + - 30,000 brands per store limit + To maximize system performance, BigCommerce caps the number of brands you can add to a store at 30,000. If your POST causes the store to exceed the maximum of 30,000 brands, BigCommerce will return a 403 error. + operationId: createBrand + requestBody: + content: + 'application/json': + schema: + $ref: '#/components/schemas/BrandPost' + 'application/xml': + schema: + $ref: '#/components/schemas/BrandPost' + required: true + responses: + '201': + $ref: '#/components/responses/brand' + '400': + $ref: '#/components/responses/errors' + '401': + $ref: '#/components/responses/errorsWithDetails' + '403': + $ref: '#/components/responses/errorsWithDetails' + '409': + $ref: '#/components/responses/errorsWithDetails' + delete: + tags: + - Brands V2 + summary: Deletes all existing on store brands. (Deprecated) + description: Deletes all existing on store brands. + operationId: deleteBrands + responses: + '204': + description: No content + content: { } + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/errorsWithDetails' + '/brands/{brand_id}': + get: + tags: + - Brands V2 + summary: Gets a brand. (Deprecated) + description: Returns a single *Brand*. + operationId: getBrandById + responses: + '200': + $ref: '#/components/responses/brand' + '400': + $ref: '#/components/responses/errors' + '401': + $ref: '#/components/responses/errorsWithDetails' + '403': + $ref: '#/components/responses/errorsWithDetails' + '404': + $ref: '#/components/responses/NotFoundError' + put: + tags: + - Brands V2 + summary: Updates an existing Brand. (Deprecated) + operationId: updateBrand + description: |- + Updates a *Brand*. + + **Required Fields** + - None + + **Read-Only Fields** + - id + + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BrandPut' + required: true + responses: + '200': + $ref: '#/components/responses/brand' + '400': + $ref: '#/components/responses/errors' + '401': + $ref: '#/components/responses/errorsWithDetails' + '403': + $ref: '#/components/responses/errorsWithDetails' + '404': + $ref: '#/components/responses/NotFoundError' + delete: + tags: + - Brands V2 + summary: Deletes a Brand. (Deprecated) + description: Deletes a *Brand*. + operationId: deleteBrand + responses: + '204': + description: No content + content: { } + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/errorsWithDetails' + '404': + $ref: '#/components/responses/NotFoundError' + parameters: + - $ref: '#/components/parameters/BrandIdParam' + '/brands/count': + get: + tags: + - Brands V2 + summary: Count Brands. (Deprecated) + description: Returns the total number of brands in the store. + operationId: getBrandsCount + responses: + '200': + $ref: '#/components/responses/brandsCount' + '401': + $ref: '#/components/responses/errors' + '403': + $ref: '#/components/responses/errors' +components: + schemas: + id: + type: integer + minimum: 1 + description: |- + Unique ID of the *Brand*. Increments sequentially. + Read-Only. + readOnly: true + name: + maxLength: 255 + minLength: 1 + type: string + description: |- + The name displayed for the brand. Name must be unique. + Required in a POST. + x-required: + - post + - put + page_title: + type: string + minLength: 0 + maxLength: 250 + description: The title shown in the browser while viewing the brand. + meta_keywords: + type: string + maxLength: 65535 + minLength: 0 + description: Comma-separated list of meta keywords to include in the HTML. + meta_description: + maxLength: 65535 + minLength: 0 + type: string + description: A meta description to include. + image_file: + title: image_file + type: string + description: A valid image URL. Maximum brand image file size 8MB. Supported file types are `JPEG/JPG`, `GIF`, `PNG`. + search_keywords: + maxLength: 65535 + minLength: 0 + type: string + description: A comma-separated list of keywords you can use to locate this brand. + brand: + title: Brand response + type: object + required: + - id + - name + xml: + name: brand + properties: + id: + $ref: '#/components/schemas/id' + name: + $ref: '#/components/schemas/name' + page_title: + $ref: '#/components/schemas/page_title' + meta_keywords: + $ref: '#/components/schemas/meta_keywords' + meta_description: + $ref: '#/components/schemas/meta_description' + image_file: + $ref: '#/components/schemas/image_file' + search_keywords: + $ref: '#/components/schemas/search_keywords' + description: 'Get Brand' + BrandPost: + title: Brand POST request body + required: + - name + type: object + description: Common brand properties. + properties: + name: + $ref: '#/components/schemas/name' + page_title: + $ref: '#/components/schemas/page_title' + meta_keywords: + $ref: '#/components/schemas/meta_keywords' + meta_description: + $ref: '#/components/schemas/meta_description' + image_file: + $ref: '#/components/schemas/image_file' + search_keywords: + $ref: '#/components/schemas/search_keywords' + BrandPut: + title: Brand PUT request body + required: + - name + type: object + properties: + id: + $ref: '#/components/schemas/id' + name: + $ref: '#/components/schemas/name' + page_title: + $ref: '#/components/schemas/page_title' + meta_keywords: + $ref: '#/components/schemas/meta_keywords' + meta_description: + $ref: '#/components/schemas/meta_description' + search_keywords: + $ref: '#/components/schemas/search_keywords' + image_file: + $ref: '#/components/schemas/image_file' + description: Common Brand properties. + brands: + title: brands + required: + - count + type: object + properties: + count: + type: integer + description: A count of the number of brands in the store. + error: + title: Response error + type: object + required: + - status + - message + xml: + name: error + properties: + status: + type: integer + description: The HTTP status code. + message: + type: string + description: Error message + errorWithDetails: + title: Response error with details + type: object + required: + - status + - title + - type + - errors + xml: + name: error + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + errors: + title: Detailed Errors + type: object + properties: { } + additionalProperties: true + NotFoundError: + required: + - status + - title + - type + title: Not Found + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + Conflict: + title: Conflict + type: object + properties: + status: + type: integer + description: The HTTP status code. + title: + type: string + description: The error title describing the particular error. + type: + type: string + errors: + title: Detailed Errors + type: object + properties: { } + responses: + brand: + description: Gets array of Brands response + content: + application/json: + schema: + $ref: '#/components/schemas/brand' + 'application/xml': + schema: + $ref: '#/components/schemas/brand' + brands: + description: Gets array of Brands response + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/brand' + 'application/xml': + schema: + type: array + items: + $ref: '#/components/schemas/brand' + xml: + name: brands + wrapped: true + brandsCount: + description: Gets a count of the total number of Brands in the store. + content: + application/json: + schema: + $ref: '#/components/schemas/brands' + application/xml: + schema: + $ref: '#/components/schemas/brands' + errors: + description: '' + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/error' + 'application/xml': + schema: + type: array + items: + $ref: '#/components/schemas/error' + xml: + name: errors + wrapped: true + errorsWithDetails: + description: '' + content: + 'application/json': + schema: + type: array + items: + $ref: '#/components/schemas/errorWithDetails' + 'application/xml': + schema: + type: array + items: + $ref: '#/components/schemas/errorWithDetails' + xml: + name: errors + wrapped: true + Conflict: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/Conflict' + NotFoundError: + description: Not Found + content: + 'application/json': + schema: + $ref: '#/components/schemas/NotFoundError' + UnauthorizedError: + description: Unauthorized + content: + plain/text: + schema: + type: string + BadRequestError: + description: Bad Request + content: + plain/text: + schema: + type: string + parameters: + Id: + name: id + in: query + description: Filter items by ID. + schema: + type: integer + Name: + name: name + in: query + description: Filter items by name. + schema: + type: string + IdMin: + name: 'min_id' + in: query + style: form + explode: false + schema: + type: integer + IdMax: + name: 'max_id' + in: query + style: form + explode: false + schema: + type: integer + Page: + name: page + in: query + description: 'Specifies the page number in a limited (paginated) list of products.' + schema: + type: integer + Limit: + name: limit + in: query + description: 'Controls the number of items per page in a limited (paginated) list of products.' + schema: + type: integer + BrandIdParam: + name: brand_id + in: path + description: | + The ID of the `Brand` to which the resource belongs. + required: true + schema: + type: integer + securitySchemes: + basicAuth: + type: http + scheme: basic diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index 5a6eff1ba..b713f21fa 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -813,6 +813,10 @@ paths: meta: {} '207': $ref: '#/components/responses/MultiStatus' + '401': + $ref: '#/components/responses/UnauthorizedError' + '403': + $ref: '#/components/responses/Error' '404': description: | The resource was not found. From f94d2f43123a53676b4d3335cadb6cdd09525266 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 26 Jun 2024 13:39:07 -0500 Subject: [PATCH 071/221] DEVDOCS-5953: [update] add date created and date modified query parameters (#322) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5953] ## What changed? add date created and date modified query parameters ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5953]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5953?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/carts.v3.yml | 36 +++++++++ reference/catalog/brands_catalog.v3.yml | 32 ++++++++ reference/catalog/categories_catalog.v3.yml | 36 +++++++++ .../catalog/product-variants_catalog.v3.yml | 36 +++++++++ reference/catalog/products_catalog.v3.yml | 36 +++++++++ reference/channels.v3.yml | 16 ++-- reference/customers.v3.yml | 74 +++++++++++++------ reference/orders.v3.yml | 32 ++++++++ 8 files changed, 271 insertions(+), 27 deletions(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index b28ef2bce..c071f0fdb 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -1056,6 +1056,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create multiple Metafields tags: @@ -3818,6 +3822,38 @@ components: in: query schema: type: integer + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string DirectionParam: name: direction description: | diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index b713f21fa..dc2230701 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -2431,6 +2431,38 @@ components: type: array items: type: string + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string DirectionParam: name: direction description: | diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 22598bbdb..700a80f86 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -1547,6 +1547,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create multiple Metafields tags: @@ -2820,6 +2824,38 @@ components: enum: - asc - desc + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string IncludeFieldsParam: name: include_fields in: query diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index d5f2b97bf..7627a6dab 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1677,6 +1677,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' post: summary: Create multiple Metafields tags: @@ -3032,6 +3036,38 @@ components: enum: - asc - desc + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string IncludeFieldsParam: name: include_fields in: query diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 7214d8dc7..ccd3c7a60 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -4930,6 +4930,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create multiple Metafields tags: @@ -8758,6 +8762,38 @@ components: type: integer default: 50 maximum: 250 + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, ffor example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string DirectionParam: name: direction description: | diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index f34449d13..edabf6835 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -886,6 +886,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create multiple Metafields tags: @@ -1222,42 +1226,42 @@ components: - 'facebook by meta,amazon' date_created: name: date_created - description: 'Filter items by date_created. For example, `date_created=2019-09-04T00:00:00`, `date_created=2019-09-04`, or `date_created=1567573200`' + description: 'Filter items by date created. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`.' in: query required: false schema: type: string date_created_min: name: 'date_created:min' - description: 'Filter items by minimum date_created. For example, `date_created:min=2019-09-04T00:00:00`, `date_created:min=2019-09-04`, or `date_created:min=1567573200`' + description: 'Filter items by minimum date created. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`. Returns metafields created after this date.' in: query required: false schema: type: string date_created_max: name: 'date_created:max' - description: 'Filter items by maximum date_created. For example, `date_created:max=2019-09-04T00:00:00`, `date_created:max=2019-09-04`, or `date_created:max=1567573200`' + description: 'Filter items by maximum date created. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`. Returns metafields created before this date.' in: query required: false schema: type: string date_modified: name: date_modified - description: 'Filter items by date_modified. For example, `date_modified=2019-09-04T00:00:00`, `date_modified=2019-09-04`, or `date_modified=1567573200`' + description: 'Filter items by date modified. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`.' in: query required: false schema: type: string date_modified_min: name: 'date_modified:min' - description: 'Filter items by minimum date_modified. For example, `date_modified:min=2019-09-04T00:00:00`, `date_modified:min=2019-09-04`, or `date_modified:min=1567573200`' + description: 'Filter items by minimum date modified. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`. Returns metafields modified after this date.' in: query required: false schema: type: string date_modified_max: name: 'date_modified:max' - description: 'Filter items by maximum date_modified. For example, `date_modified:max=2019-09-04T00:00:00`, `date_modified:max=2019-09-04`, or `date_modified:max=1567573200`' + description: 'Filter items by maximum date modified. For example, `date_created=2024-05-14T09:34:00` or `date_created=2024-05-14`. Returns metafields modified before this date.' in: query required: false schema: diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 90b0a4093..4087be71c 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -91,35 +91,35 @@ paths: type: string - name: date_created in: query - description: 'Filter items by date_created. `date_created=2018-09-05T13:43:54`' + description: 'Filter items by date created, for example, `2024-05-14T09:34:00` or `2024-05-14`.' schema: type: string format: date-time - name: 'date_created:max' in: query - description: 'Filter items by maximum date_created. `date_created:max=2018-09-10`' + description: 'Filter items by maximum date created, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' schema: type: string - name: 'date_created:min' in: query - description: 'Filter items by date_created. `date_created:min=2018-09-05`' + description: 'Filter items by date created for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' schema: type: string format: date-time - - name: date_modified + - name: 'date_modified' in: query - description: 'Filter items by date_modified. `date_modified=2018-09-05T13:45:03`' + description: 'Filter items by date modified, for example, `2024-05-14T09:34:00` or `2024-05-14`.' schema: type: string format: date-time - name: 'date_modified:min' in: query - description: 'Filter items by minimum date_modified. `date_modified:min=2019-09-04T:00:00:00` or `date_modified:min=2019-09-04`' + description: 'Filter items by minimum date modified, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' schema: type: string - name: 'date_modified:max' in: query - description: 'Filter items by maximum date_modified. `date_modified:max=2018-09-05T13:45:03` or `date_modified:max=2019-09-04`' + description: 'Filter items by maximum date modified, for example, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' schema: type: string format: date-time @@ -997,42 +997,42 @@ paths: - name: date_created in: query required: false - description: 'Filter items by `date_created`. `date_created=2021-01-07T20:28:16Z`' + description: 'Filter items by `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`.' schema: type: string format: date-time - name: 'date_created:max' in: query required: false - description: 'Filter items by maximum `date_created`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by maximum `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields created before this date.' schema: type: string format: date-time - name: 'date_created:min' in: query required: false - description: 'Filter items by minimum `date_created`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by minimum `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields created after this date.' schema: type: string format: date-time - - name: date_modified + - name: 'date_modified' in: query required: false - description: Filter items by `date_modified`. + description: Filter items by `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`. schema: type: string format: date-time - name: 'date_modified:max' in: query required: false - description: 'Filter items by maximum `date_modified`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by maximum `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields modified before this date.' schema: type: string format: date-time - name: 'date_modified:min' in: query required: false - description: 'Filter items by minimum `date_modified`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by minimum `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields modified after this date.' schema: type: string format: date-time @@ -1245,36 +1245,36 @@ paths: type: string - name: date_created in: query - description: 'Filter items by `date_created`. `date_created=2018-09-05T13:43:54`' + description: 'Filter items by `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`.' schema: type: string format: date-time - name: 'date_created:max' in: query - description: 'Filter items by maximum `date_created`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by maximum `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields created before this date.' schema: type: string - name: 'date_created:min' in: query - description: 'Filter items by minimum `date_created`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by minimum `date_created`, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields created after this date' schema: type: string format: date-time - - name: date_modified + - name: 'date_modified' in: query - description: 'Filter items by `date_modified`. `date_modified=2018-09-05T13:45:03`' + description: 'Filter items by `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`.' schema: type: string format: date-time - name: 'date_modified:max' in: query - description: 'Filter items by maximum `date_modified`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by maximum `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields modified before this date.' schema: type: string format: date-time - name: 'date_modified:min' in: query - description: 'Filter items by minimum `date_modified`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. `date_created=2021-01-07` or `date_created=1610051296000`' + description: 'Filter items by minimum `date_modified`, for example, `2024-05-14T09:34:00` or `2024-05-14`. ISO 8601 full-date is required, ISO 8601 full-time is not required. UNIX timestamp also accepted. Returns metafields modified after this date.' schema: type: string responses: @@ -1910,6 +1910,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create Multiple Metafields tags: @@ -2156,6 +2160,34 @@ components: in: query schema: type: integer + date_created_min: + name: 'date_created:min' + description: 'Filter items by minimum date created. For example, `date_created:min=2019-09-04T00:00:00` or `date_created:min=2019-09-04`. Returns metafields created after this date.' + in: query + required: false + schema: + type: string + date_created_max: + name: 'date_created:max' + description: 'Filter items by maximum date created. For example, `date_created:max=`2024-05-14T09:34:00` or `date_created:max=2019-09-04`. Returns metafields created before this date.' + in: query + required: false + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: 'Filter items by minimum date modified. For example, `date_modified:min=`2024-05-14T09:34:00` or `date_modified:min=2019-09-04`. Returns metafields modified after this date.' + in: query + required: false + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: 'Filter items by maximum date modified. For example, `date_modified:max=2019-09-04T00:00:00` or `date_modified:max=2019-09-04`. Returns metafields modified before this date.' + in: query + required: false + schema: + type: string DirectionParam: name: direction description: | diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index ffdb7d923..b04342aab 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -840,6 +840,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' post: summary: Create multiple Metafields tags: @@ -3715,6 +3719,34 @@ components: in: query schema: type: integer + date_created_min: + name: 'date_created:min' + description: 'Filter items by minimum datevcreated. For example, `date_created:min=2019-09-04T00:00:00` or `date_created:min=2019-09-04`. Returns metafields created after this date.' + in: query + required: false + schema: + type: string + date_created_max: + name: 'date_created:max' + description: 'Filter items by maximum date created. For example, `date_created:max=2019-09-04T00:00:00` or `date_created:max=2019-09-04`. Returns metafields created before this date.' + in: query + required: false + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: 'Filter items by minimum date modified. For example, `date_modified:min=2019-09-04T00:00:00` or `date_modified:min=2019-09-04`. Returns metafields modified after this date.' + in: query + required: false + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: 'Filter items by maximum date modified. For example, `date_modified:max=2019-09-04T00:00:00` or `date_modified:max=2019-09-04`. Returns metafields modified before this date.' + in: query + required: false + schema: + type: string MetafieldIdParam: name: metafield_id in: path From 2e7230a3a5c2248132ea02367d6b417f59f2467a Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 1 Jul 2024 10:44:15 -0500 Subject: [PATCH 072/221] DEVDOCS-5997: International Enhancements for MSF, update `properties` field for channel locale only (#352) --- docs/integrations/webhooks/events/index.mdx | 6 +++--- docs/webhooks/callbacks/_all.yml | 6 +++--- docs/webhooks/callbacks/store_modifier_updated.yml | 2 +- docs/webhooks/callbacks/store_option_updated.yml | 2 +- docs/webhooks/callbacks/store_product_updated.yml | 5 +++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/integrations/webhooks/events/index.mdx b/docs/integrations/webhooks/events/index.mdx index fdddc44fc..9e0b7a3d4 100644 --- a/docs/integrations/webhooks/events/index.mdx +++ b/docs/integrations/webhooks/events/index.mdx @@ -444,7 +444,7 @@ Payload objects with the following scopes take the form that follows: | Name / Scope | Description | |:-------------------------|:------------| -| store/modifier/updated | Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. | +| store/modifier/updated | Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook.<br /><br />The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. | The payload object takes the form that follows: @@ -475,7 +475,7 @@ Consult the [notifications section of the Channel Webhooks Guide](/docs/integrat | Name / Scope | Description | |:-------------------------|:------------| -| store/option/updated | Fires when you edit attributes for a local or shared variant option, including its display name and option values. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. | +| store/option/updated | Fires when you edit attributes for a local or shared variant option, including its display name and option values. Updates to the global store and channel locale as an override triggers the webhook.<br /><br />The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. | The payload object takes the form that follows: @@ -804,7 +804,7 @@ Consult the [product assignment section of the Channel Webhooks Guide](/docs/int | store/product/* | Fires for all store/product events. | | store/product/deleted| Fires when a product is deleted.| | store/product/created | Fires when a new product is created. | -| store/product/updated | Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the [product updated events](#product-update-events) that follow. The `context` fields are present for only override updates. | +| store/product/updated | Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the [product updated events](#product-update-events) that follow.<br /><br />The `properties` and `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. | | store/product/inventory/updated | Fires when inventory levels change for a _base product_. For products without variants, the webhook fires regardless of how you track inventory. <br /><br />For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_ and the _product-level_ inventory changes. <br /><br />Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. | | store/product/inventory/order/updated | Fires when _base product_ inventory levels change in response to the order-related events configured in [Inventory settings](/docs/rest-management/settings/inventory#get-inventory-settings). For example, stock levels can change when you either place or complete/ship an order. Stock levels can also change when an order status changes to cancelled or refunded, but not partially refunded. Global settings apply when inventory changes through a [manual order](https://support.bigcommerce.com/s/article/Creating-a-Manual-Order?language=en_US). The settings for a channel apply when inventory changes through an order in a channel.<br /><br />The webhook always fires for products without variants. For products with variants, the webhook only fires when you configure the product's inventory properties to track by _product_. | | store/product/metafield/* | Fires for all store/product/metafield events. | diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index b7d40b7b6..6d5259a95 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -272,13 +272,13 @@ properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_metafield_updated.yml store/modifier/updated: - description: Fires when product modifier overrides are edited. + description: Fires when product modifier are edited. The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. type: object properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_modifier_updated.yml store/option/updated: - description: Fires when product options overrides are edited. + description: Fires when product options are edited. The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. type: object properties: @@ -401,7 +401,7 @@ properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_product_metafield_updated.yml store/product/updated: - description: Fires when product details are edited. `attributes` and `context` fields are present for only override updates. For a full list of product fields that trigger an updated event, see the product updated events that follow. + description: Fires when product details are edited. The `properties` and `context` fields are present for only updates to overrides, not the global store. For a full list of product fields that trigger an updated event, see the product updated events that follow. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. type: object properties: allOf: diff --git a/docs/webhooks/callbacks/store_modifier_updated.yml b/docs/webhooks/callbacks/store_modifier_updated.yml index f7279bfaf..2bd689ff2 100644 --- a/docs/webhooks/callbacks/store_modifier_updated.yml +++ b/docs/webhooks/callbacks/store_modifier_updated.yml @@ -2,7 +2,7 @@ type: object properties: store/modifier/updated: description: | - Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. + Fires when you edit attributes for a local or shared modifier. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. For shared modifiers, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. type: object diff --git a/docs/webhooks/callbacks/store_option_updated.yml b/docs/webhooks/callbacks/store_option_updated.yml index a52417d4f..c0e2cad86 100644 --- a/docs/webhooks/callbacks/store_option_updated.yml +++ b/docs/webhooks/callbacks/store_option_updated.yml @@ -2,7 +2,7 @@ type: object properties: store/option/updated: description: | - Fires when you edit attributes for a local or shared variant option. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only override updates. + Fires when you edit attributes for a local or shared variant option. Updates to the global store and channel locale as an override triggers the webhook. The `context` fields are present for only updates to overrides, not the global store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. For shared options, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. type: object diff --git a/docs/webhooks/callbacks/store_product_updated.yml b/docs/webhooks/callbacks/store_product_updated.yml index 41b6dbb8e..79d702b13 100644 --- a/docs/webhooks/callbacks/store_product_updated.yml +++ b/docs/webhooks/callbacks/store_product_updated.yml @@ -4,7 +4,7 @@ properties: description: | Fires when you edit product attributes globally or for a channel locale as an override. For a full list of product fields that trigger an updated event, see the product updated events that follow. - The `context` fields are present for only override updates. + The `properties` and `context` fields are present for only updates to overrides, not global updates for the store. For information on updating overrides, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. type: object properties: scope: @@ -16,7 +16,8 @@ properties: properties: type: type: string - enum: product + enum: + - product id: type: integer properties: From 35e94566379f833023bf3943e05c0f7532b1b219 Mon Sep 17 00:00:00 2001 From: Roman Liukshyn <79109064+bc-romanliukshyn@users.noreply.github.com> Date: Tue, 2 Jul 2024 22:17:07 +0200 Subject: [PATCH 073/221] Update themes product.yml - move custom_fields node up to match alphabetical order (#342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-] ## What changed? ![image](https://github.com/bigcommerce/docs/assets/79109064/fdc5c140-04a0-41b9-a983-fa39d7f9c4f7) custom_fields node appears to be out of order, which makes it hard to find. Moved it up to match alphabetical order, the same as all other nodes are sorted. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- .../object-reference/schemas/product.yml | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml index b9d7064e2..94d303a8b 100644 --- a/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml @@ -64,6 +64,20 @@ properties: type: array items: type: object + custom_fields: + type: array + items: + type: object + properties: + id: + type: integer + example: 61 + name: + type: string + example: unavailable_for + value: + type: string + example: CAD depth: description: The product's physical depth measurement. type: string @@ -192,17 +206,3 @@ properties: width: description: The product's physical width measurement. type: string - custom_fields: - type: array - items: - type: object - properties: - id: - type: integer - example: 61 - name: - type: string - example: unavailable_for - value: - type: string - example: CAD From 3ce9db160ee87a9c9fa9cf2eada8cd60de36d922 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 2 Jul 2024 16:21:17 -0500 Subject: [PATCH 074/221] DEVDOCS-5953: [update] add date created and date modified (#330) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5953] ## What changed? Added parameters to the GET batch metafields endpoint. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5953]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5953?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/locations.v3.yml | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/reference/locations.v3.yml b/reference/locations.v3.yml index 9731107b6..1938c3f58 100644 --- a/reference/locations.v3.yml +++ b/reference/locations.v3.yml @@ -484,6 +484,10 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_modified_min' + - $ref: '#/components/parameters/date_modified_max' + - $ref: '#/components/parameters/date_created_min' + - $ref: '#/components/parameters/date_created_max' post: summary: Create multiple Metafields tags: @@ -1726,6 +1730,38 @@ components: enum: - asc - desc + date_created_min: + name: 'date_created:min' + description: | + 'Query parameter that lets you filter by the minimum date created, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created after this date.' + required: false + in: query + schema: + type: string + date_created_max: + name: 'date_created:max' + description: | + 'Query parameter that lets you filter by the maximum date created, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields created before this date.' + required: false + in: query + schema: + type: string + date_modified_max: + name: 'date_modified:max' + description: | + 'Query parameter that lets you filter by the maximum date modified, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified before this date.' + required: false + in: query + schema: + type: string + date_modified_min: + name: 'date_modified:min' + description: | + 'Query parameter that lets you filter by the minimum date modified, for example, `2024-05-14T09:34:00`, `2024-05-14T09:34:00` or `2024-05-14`. Returns metafields modified after this date.' + required: false + in: query + schema: + type: string IncludeFieldsParamMetafields: name: include_fields in: query @@ -1746,7 +1782,7 @@ components: - description - owner_client_id - date_created - - date_modified + - date modified examples: create_locations: value: From 4380073a2962b8ae9e3afc53c75472df30cb1e40 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 2 Jul 2024 20:59:15 -0500 Subject: [PATCH 075/221] DEVDOCS-5972: [update] product videos (#346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5972] ## What changed? Added product video section ## Release notes draft We're happy to announce the ability to query product videos using the storefront product graph. <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5972]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5972?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/storefront/graphql/examples/products.mdx | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/docs/storefront/graphql/examples/products.mdx b/docs/storefront/graphql/examples/products.mdx index 9615181ef..3f05fbb02 100644 --- a/docs/storefront/graphql/examples/products.mdx +++ b/docs/storefront/graphql/examples/products.mdx @@ -598,6 +598,117 @@ You can query product images at different resolutions. The following query retri </Tab> </Tabs> +## Get product videos + +The following example retrieves video titles and URLs associated with videos attached to a product. + +<Tabs items={['Request', 'Response']}> +<Tab> +```graphql filename="Example query: Get product videos for a product" showLineNumbers copy + query { + site { + products (entityIds: [112, 113]) { + pageInfo { + startCursor + endCursor + } + edges { + cursor + node { + entityId + name + videos { + pageInfo { + startCursor + endCursor + hasNextPage + hasPreviousPage + } + edges { + cursor + node { + title + url + } + } + } + } + } + } + } + } +``` + + </Tab> + <Tab> + +```json filename="Example response: Get product videos for a product" showLineNumbers copy +{ + "data": { + "site": { + "products": { + "pageInfo": { + "startCursor": "YXJyYXljb25uZWN0aW9uOjA=", + "endCursor": "YXJyYXljb25uZWN0aW9uOjM=" + }, + "edges": [ + { + "cursor": "YXJyYXljb25uZWN0aW9uOjA=", + "node": { + "entityId": 112, + "name": "Product_112", + "videos": { + "pageInfo": { + "startCursor": "YXJyYXljb25uZWN0aW9uOjA=", + "endCursor": "YXJyYXljb25uZWN0aW9uOjA=", + "hasNextPage": false, + "hasPreviousPage": false + }, + "edges": [ + { + "cursor": "YXJyYXljb25uZWN0aW9uOjA=", + "node": { + "title": "What is BigCommerce", + "url": "https://www.youtube.com/watch?v=Vx0OmcMSWGQ&t=8s" + } + } + ] + } + } + }, + { + "cursor": "YXJyYXljb25uZWN0aW9uOjE=", + "node": { + "entityId": 113, + "name": "Product_113", + "videos": { + "pageInfo": { + "startCursor": "YXJyYXljb25uZWN0aW9uOjA=", + "endCursor": "YXJyYXljb25uZWN0aW9uOjA=", + "hasNextPage": false, + "hasPreviousPage": false + }, + "edges": [ + { + "cursor": "YXJyYXljb25uZWN0aW9uOjA=", + "node": { + "title": "BigCommerce is enterprise ecommerce, simplified.", + "url": "https://www.youtube.com/watch?v=vAZ0e5lomfk" + } + } + ] + } + } + } + ] + } + } + } +} +``` + </Tab> +</Tabs> + ## Get product metafields Query product metafields by specifying the product metafield's namespace. The API returns only metafields that have storefront permissions. Permissions must be set to `write_and_sf_access` or `read_and_sf_access`. To set permissions, use the [Update a product metafield](/docs/rest-catalog/products/metafields#update-a-product-metafield) endpoint. From 4298fa02578a95f02032d8283139e8211a4cb01a Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 3 Jul 2024 10:38:39 -0500 Subject: [PATCH 076/221] DEVDOCS-5990: [update] Update Add discount to checkout schema and example (#356) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5990] ## What changed? Correct example and schema for Checkout Discounts Chad Taylor approved the changes. See screenshot attached to the ticket. ## Release notes draft Bug Fix <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5990]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5990?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/checkouts.v3.yml | 87 +++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index 366215bd8..58f5a5120 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -1642,6 +1642,11 @@ paths: discounted_amount: type: number example: 15 + example: + carts: + discounts: + - discounted_amount: 10 + name: "manual-discount" required: false responses: '200': @@ -1655,6 +1660,82 @@ paths: $ref: '#/components/schemas/Checkout' meta: $ref: '#/components/schemas/MetaOpen' + example: + data: + id: 306d57d7-124e-4112-82cd-35e060c0d4d9 + cart: + id: 306d57d7-124e-4112-82cd-35e060c0d4d9 + customer_id: 11 + channel_id: 1 + email: janedoe@example.com + currency: + code: USD + tax_included: false + base_amount: 31.95 + discount_amount: 0 + manual_discount_amount: 10 + cart_amount_inc_tax: 33.23 + cart_amount_ex_tax: 31.95 + coupons: [] + discounts: + - id: 8edef915-8e8e-4ebd-bece-31fbb1191a7e + discounted_amount: 13.6 + line_items: + physical_items: + - id: 8edef915-8e8e-4ebd-bece-31fbb1191a7e + parent_id: 123 + variant_id: 359 + product_id: 188 + sku: DUST1 + name: Hello + url: 'https://{store_hash}/all/dustpan-brush/' + quantity: 1 + is_taxable: true + image_url: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/188/images/460/dustpan1_1024x1024_1024x1024__43447__69128.1534344539.330.500.jpg?c=2' + discounts: + - id: 18 + discounted_amount: 13.6 + - id: 49 + discounted_amount: 2.4 + - id: "manual-discount" + discounted_amount: 10 + coupons: [] + discount_amount: 0 + coupon_amount: 0 + original_price: 35.95 + list_price: 31.95 + sale_price: 33.23 + extended_list_price: 31.95 + extended_sale_price: 33.23 + is_require_shipping: true + gift_wrapping: {} + is_mutable: true + digital_items: [] + gift_certificates: [] + custom_items: [] + created_time: '2019-08-05T15:38:14+00:00' + updated_time: '2019-08-05T15:41:28+00:00' + billing_address: {} + consignments: [] + taxes: + - name: Tax + amount: 1.28 + coupons: [] + order_id: null + shipping_cost_total_inc_tax: 0 + shipping_cost_total_ex_tax: 0 + handling_cost_total_inc_tax: 0 + handling_cost_total_ex_tax: 0 + tax_total: 1.28 + subtotal_inc_tax: 33.23 + subtotal_ex_tax: 31.95 + grand_total: 33.23 + created_time: '2019-08-05T15:38:14+00:00' + updated_time: '2019-08-05T15:41:28+00:00' + customer_message: '' + staff_note: " " + fees: [] + meta: {} Available Shipping Options: example: data: @@ -7977,8 +8058,10 @@ components: type: object properties: id: - type: integer - description: ID of the applied discount. + anyOf: + - type: string + - type: integer + description: The string value is always equal to "manual-discount" regardless of the input. discounted_amount: type: number description: The discounted amount applied within a given context. From b0ff264afe4ff7aafece6d140e6e75bd78c6063c Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 3 Jul 2024 10:42:31 -0500 Subject: [PATCH 077/221] DEVDOCS-6004 [update] add fields for bulk_discount_rates & fix errors in file (#357) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6004] ## What changed? Bug Fix: Added missing information Screenshot of the missing information is in the ticket. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6004]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6004?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../object-reference/schemas/product.yml | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml index 94d303a8b..f0c78c712 100644 --- a/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/product.yml @@ -46,6 +46,20 @@ properties: type: array items: type: object + properties: + type: + type: string + min: + type: integer + max: + type: integer + discount: + type: object + properties: + formatted: + type: string + value: + type: integer can_purchase: description: Boolean that indicates whether the product is available for purchase type: boolean @@ -63,7 +77,7 @@ properties: description: 'Product customizations (for example, a T-shirt size); these correspond to configurable fields and numeric-text product options in the BigCommerce control panel' type: array items: - type: object + type: string custom_fields: type: array items: @@ -175,7 +189,7 @@ properties: shipping_messages: type: array items: - type: object + type: string show_quantity_input: type: integer sku: @@ -188,7 +202,7 @@ properties: description: Keywords by which this product can also be identified. type: array items: - type: object + type: string title: description: Displayed name of the product type: string From bf4f3cc3118b25d598d795374c73117d813b3f6c Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 3 Jul 2024 10:44:32 -0500 Subject: [PATCH 078/221] DEVDOCS-6003 [Update] add token expiration time (#355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6003] ## What changed? * Added the expiration time for the PAT token. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6003]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6003?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/store-operations/payments/index.mdx | 2 +- reference/payments/access-tokens_payments.v3.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/store-operations/payments/index.mdx b/docs/store-operations/payments/index.mdx index 5d71c86f9..ec5f5945e 100644 --- a/docs/store-operations/payments/index.mdx +++ b/docs/store-operations/payments/index.mdx @@ -283,7 +283,7 @@ Accept: application/json <Callout type="info"> #### Authorization header -The `PAT_TOKEN` is the `data.id` value returned in preceding step. +The `PAT_TOKEN` is the `data.id` value returned in preceding step. The token expires after one hour. To be valid, the header value string must contain a space between "PAT" and the `{{PAT_TOKEN}}`. </Callout> diff --git a/reference/payments/access-tokens_payments.v3.yml b/reference/payments/access-tokens_payments.v3.yml index a5a4678c2..eb1baa8f1 100644 --- a/reference/payments/access-tokens_payments.v3.yml +++ b/reference/payments/access-tokens_payments.v3.yml @@ -59,7 +59,7 @@ paths: You can also generate a payment access token during checkout by using the `completeCheckout` mutation in the [GraphQL Storefront API](/docs/storefront/cart-checkout/guide/graphql-storefront#handling-payments). - After the token is created, use the token to [Process a payment](/docs/rest-payments/processing#process-payment). + After the token is created, use the token to [Process a payment](/docs/rest-payments/processing#process-payment). The token is valid for one hour. **Required Fields** * order_id From 68ebb19bb10fe2d6a59cb5990fa404b44ae249ff Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 3 Jul 2024 10:45:07 -0500 Subject: [PATCH 079/221] Add cart redirect url expiration time (#359) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # NO Ticket ## What changed? Add the redirect URL expiration time See slack conversation: https://bigcommerce.slack.com/archives/C0WC9CSJX/p1719949652260899 ## Release notes draft Added clarification for how long the cart redirect url is active. <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/carts.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index c071f0fdb..c55b9f055 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -352,7 +352,7 @@ paths: **Usage Notes** * Redirect URLs can also be created with **Create a Cart** requests by appending `include=redirect_urls`. - * A **Carts** redirect URL may only be used once. + * A **Carts** redirect URL is valid for 30 days and may only be used once. * Redirect URLs point to either a shared checkout domain or a channel-specific domain, depending on the storefront configuration. * Once a redirect URL has been visited, it will be invalidated and cannot be used again. * If your application requires URLs to be visited more than once, consider generating a fresh one each time you need to restore a cart, and redirecting to the URL from your own application. From 95feb0bf6339168caf91a6a0969f1c82b3c8f493 Mon Sep 17 00:00:00 2001 From: David Aland <david.aland@bigcommerce.com> Date: Thu, 4 Jul 2024 11:33:55 +1000 Subject: [PATCH 080/221] Update bulk pricing tiers documentation to cover `null` case (#353) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update schemas for pricelist bulk tiers to cover that `null` may be returned when there is no upper limit on the quantity for a given tier. ## What changed? * Update schemas for pricelist bulk tiers to cover that `null` may be returned when there is no upper limit on the quantity for a given tier. * Unrelatedly, add a `'` to "this tiers pricing" since it's a possessive rather than a plural. ## Release notes draft * Clarified documentation for pricelist bulk tier pricing to explain tiers with no upper quantity limit. ## Anything else? Nope 😄 --- reference/price_lists.v3.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index aab46a633..da87b4ba6 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -1088,12 +1088,13 @@ paths: quantity_min: type: integer description: | - The minimum quantity of associated variant in the cart needed to qualify for this tiers pricing. + The minimum quantity of associated variant in the cart needed to qualify for this tier's pricing. example: 1 quantity_max: type: integer + nullable: true description: | - The maximum allowed quantity of associated variant in the cart to qualify for this tiers pricing. + The maximum allowed quantity of associated variant in the cart to qualify for this tier's pricing. `null` indicates that there is no maximum allowed quantity for this tier. example: 10 type: type: string From 81a2eb1a401c2d907edbf6ffceaea682bc083db4 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 9 Jul 2024 12:10:03 -0500 Subject: [PATCH 081/221] DEVDOCS-5957 [new]: MSF International Enhancements, add custom_fields (#347) --- docs/integrations/webhooks/events/index.mdx | 3 +- .../graphql-admin/product-basic-info.mdx | 1 + .../graphql-admin/product-custom-fields.mdx | 357 ++++++++++++++++++ .../msf-international-enhancements.mdx | 1 + docs/storefront/graphql/examples/products.mdx | 6 + .../localization/storefront-selector.mdx | 2 + .../callbacks/store_product_updated.yml | 2 +- 7 files changed, 370 insertions(+), 2 deletions(-) create mode 100644 docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx diff --git a/docs/integrations/webhooks/events/index.mdx b/docs/integrations/webhooks/events/index.mdx index 9e0b7a3d4..ec26a3823 100644 --- a/docs/integrations/webhooks/events/index.mdx +++ b/docs/integrations/webhooks/events/index.mdx @@ -846,7 +846,7 @@ Payload objects with the following scopes take the form that follows: "data": { "type": "product", // will always be product "id": 205, // ID of the product - "properties": ["warranty", "is_featured"], + "properties": ["warranty", "is_featured", "custom_fields"], "context": { "channel_id": 2, "locale": "fr" @@ -885,6 +885,7 @@ A change to any of the following fields triggers a `store/product/updated` event * Thumbnail - new images only* * Visibility * Warranty +* Custom field's name or value <Callout type="info"> Setting a thumbnail triggers an updated event only when that thumbnail is the first to be set. For example, setting an image as a thumbnail **after deleting all images** triggers an updated event. However, changing the current thumbnail, uploading an additional product image and setting it as the thumbnail, or even deleting all thumbnails, does not generate an update event. diff --git a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx index f72c86683..6cc4f1a35 100644 --- a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx @@ -33,6 +33,7 @@ The following table describes the ID fields that you can use in inputs for mutat | | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | | `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | | | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | +| `customFieldId` | ID for a product custom field | [Get product custom fields](/docs/rest-catalog/products/custom-fields#get-product-custom-fields) | `"bc/store/productCustomField/1"` | ## Set basic product information at the global level diff --git a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx new file mode 100644 index 000000000..e73269609 --- /dev/null +++ b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx @@ -0,0 +1,357 @@ +# Product custom fields + +[_International Enhancements for multi-storefront_](/docs/store-operations/catalog/msf-international-enhancements) + +<Callout type="info"> + This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. + To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). +</Callout> + +Using the Catalog features of the Admin API, you can localize custom fields for a product in a storefront channel. + +You must first create the custom field through the control panel or [Create product custom field](/docs/rest-catalog/products/custom-fields#create-a-product-custom-field) endpoint of the REST Management API. + +You can perform the following: +- [Set attributes for the custom field](#set-product-custom-fields): + + The `setProductCustomFieldsInformation` mutation lets you set global values for the store that channels inherit by default. The mutation also lets you set overrides for a channel locale, which will override global store information. +- [Remove overrides for a channel locale](#remove-product-custom-fields-for-a-locale). A channel then inherits global values. +- [Query custom fields](#query-product-custom-fields), those set at the global level and the overrides. + +For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). + +## Input fields + +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). + +## Set product custom fields + +The following example sets custom fields for the global store and the specified channel locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Set product custom fields" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: SetProductCustomFieldsInformationInput!) { + product { + setProductCustomFieldsInformation(input: $input) { + product { + customFields { + edges { + node { + id + + # For the global store + name + value + + # For the channel locale + overrides (context: { channelId: "bc/store/channel/1", locale: "en-US" }) { + edges { + node { + ... on ProductCustomFieldOverridesForChannelLocale { + name + value + isVisible + context { + channelId + locale + } + } + } + } + } + } + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": [ + { + "customFieldId": "bc/store/productCustomField/1", + + // For the global store + "name": "Custom Field Name", + "value": "Custom Field Value", + + // For the channel locale + "overrides": { + "channelLocaleContextData": { + "context": { + "channelId": "bc/store/channel/1", + "locale": "en-US" + }, + "data": { + "name": "Custom Field Name Override", + "value": "Custom Field Value Override", + "isVisible": true + } + } + } + } + ] + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example mutation: Set product custom fields" showLineNumbers copy + { + "data": { + "product": { + "setProductCustomFieldsInformation": { + "product": { + "customFields": { + "edges": [ + { + "node": { + "id": "bc/store/productCustomField/1", + + // For the global store + "name": "Custom Field Name", + "value": "Custom Field Value", + + // For the channel locale + "overrides": { + "edges": [ + { + "node": { + "name": "Custom Field Name Override", + "value": "Custom Field Value Override", + "isVisible": true, + "context": { + "channelId": "bc/store/channel/1", + "locale": "en-US" + } + } + } + ] + } + } + } + ] + } + } + } + } + } + } + ``` + + </Tab> +</Tabs> + +## Remove product custom fields for a locale + +The following example removes product custom fields for the specified channel locale. + +Omitting the `attributes` field from the input removes _all_ overrides for the custom fields from the locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example mutation: Remove product custom fields for a locale" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + mutation ($input: RemoveProductCustomFieldsOverridesInput!) { + product { + removeProductCustomFieldsOverrides(input: $input) { + product { + customFields { + edges { + node { + id + + # For the global store + name + value + + # For the channel locale + overrides (context: { channelId: "bc/store/channel/1", locale: "en-US" }) { + edges { + node { + ... on ProductCustomFieldOverridesForChannelLocale { + name + value + isVisible + context { + channelId + locale + } + } + } + } + } + } + } + } + } + } + } + } + ``` + ```json filename="GraphQL variables" showLineNumbers copy + { + "input": { + "productId": "bc/store/product/111", + "data": [ + { + "customFieldId": "bc/store/productCustomField/1", + "channelLocaleContextData": { + "context": { + "channelId": "bc/store/channel/1", + "locale": "en-US" + }, + "attributes": ["NAME", "VALUE", "IS_VISIBLE"] + } + } + ] + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example mutation: Remove product custom fields for a locale" showLineNumbers copy + { + "data": { + "product": { + "removeProductCustomFieldsOverrides": { + "product": { + "customFields": { + "edges": [ + { + "node": { + "id": "bc/store/productCustomField/1", + + // For the global store + "name": "Custom Field Name", + "value": "Custom Field Value", + + // For the channel locale + "overrides": { + "edges": [] + } + } + } + ] + } + } + } + } + } + } + ``` + </Tab> +</Tabs> + +## Query product custom fields + +The following example retrieves custom fields. You can retrieve global information for the store and overrides for the specified channel locale. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```graphql filename="Example query: Get product custom fields" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/graphql + X-Auth-Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + query { + store { + product(id: "bc/store/product/111") { + customFields { + edges { + node { + id + + # For the global store + name + value + + # For the channel locale + overrides (context: { channelId: "bc/store/channel/1", locale: "en-US" }) { + edges { + node { + ... on ProductCustomFieldOverridesForChannelLocale { + name + value + isVisible + context { + channelId + locale + } + } + } + } + } + } + } + } + } + } + } + ``` + </Tab> + <Tab> + + ```json filename="Example query: Get product custom fields" showLineNumbers copy + { + "data": { + "store": { + "product": { + "customFields": { + "edges": [ + { + "node": { + "id": "bc/store/productCustomField/1", + + // For the global store + "name": "Global Custom Field Name", + "value": "Global Custom Field Value", + + // For the channel locale + "overrides": { + "edges": [ + { + "node": { + "name": "Custom Field Name Override", + "value": "Custom Field Value Override", + "isVisible": true, + "context": { + "channelId": "bc/store/channel/1", + "locale": "en-US" + } + } + } + ] + } + } + } + ] + } + } + } + } + } + ``` + + </Tab> +</Tabs> \ No newline at end of file diff --git a/docs/store-operations/catalog/msf-international-enhancements.mdx b/docs/store-operations/catalog/msf-international-enhancements.mdx index 48f5fb94e..61b14caf1 100644 --- a/docs/store-operations/catalog/msf-international-enhancements.mdx +++ b/docs/store-operations/catalog/msf-international-enhancements.mdx @@ -18,6 +18,7 @@ The following pages provide sample queries: - [Product modifier options](/docs/store-operations/catalog/graphql-admin/product-modifier-options) - [Product URL](/docs/store-operations/catalog/graphql-admin/product-url) - [Additional product attributes](/docs/store-operations/catalog/graphql-admin/product-attributes) +- [Product custom fields](/docs/store-operations/catalog/graphql-admin/product-custom-fields) You can create webhooks that trigger for the following events: - [Product updated](/docs/integrations/webhooks/events#products) diff --git a/docs/storefront/graphql/examples/products.mdx b/docs/storefront/graphql/examples/products.mdx index 3f05fbb02..504141069 100644 --- a/docs/storefront/graphql/examples/products.mdx +++ b/docs/storefront/graphql/examples/products.mdx @@ -12,6 +12,12 @@ You can access these attributes for a product if a merchant makes a product visi This guide walks you through the process of retrieving information for a product. If your product has variants, see [Guide to Working with Product Variants](/docs/storefront/graphql/examples/variants) on how to retrieve variant information. For full schema documentation, see the [GraphQL Storefront Playground](https://developer.bigcommerce.com/graphql-storefront/playground). +<Callout type="info"> + [_International Enhancements for Multi-Storefront_](https://support.bigcommerce.com/s/article/International-Enhancements-for-Multi-Storefront) allows some product features to have overrides in a storefront channel locale. + For these features, the GraphQL Storefront API can return the global store value that the storefront inherits, or the override for the channel's locale, depending on [storefront settings](https://support.bigcommerce.com/s/article/International-Enhancements-for-Multi-Storefront#product-overrides). + For a full list of product fields, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. +</Callout> + ## Get a Product ### Get a product with the product field diff --git a/docs/storefront/stencil/themes/localization/storefront-selector.mdx b/docs/storefront/stencil/themes/localization/storefront-selector.mdx index db89827d0..3a404b628 100644 --- a/docs/storefront/stencil/themes/localization/storefront-selector.mdx +++ b/docs/storefront/stencil/themes/localization/storefront-selector.mdx @@ -10,6 +10,8 @@ You can do the following with the storefront selectors that you create and injec This guide walks you through how to add data for the storefront selector into your Cornerstone theme. +Learn about how to create and localize Stencil storefronts to support international shoppers in the [International Enhancements for Multi-Storefront](https://support.bigcommerce.com/s/article/International-Enhancements-for-Multi-Storefront) support article. + ## Steps to add storefront selector data Currently, there is no Stencil object for the storefront selector. Instead, you can add data for the storefront selector in the `config.json` file, which allows the selector to appear in the `theme_settings` Stencil object. diff --git a/docs/webhooks/callbacks/store_product_updated.yml b/docs/webhooks/callbacks/store_product_updated.yml index 79d702b13..b2a11a4e8 100644 --- a/docs/webhooks/callbacks/store_product_updated.yml +++ b/docs/webhooks/callbacks/store_product_updated.yml @@ -22,7 +22,7 @@ properties: type: integer properties: type: array - description: Allowed values are `name`, `description`, `page_title`, `meta_description`, `warranty`, `availability_description`, `search_keywords`, `is_featured` and `preorder_message` + description: Allowed values are `name`, `description`, `page_title`, `meta_description`, `warranty`, `availability_description`, `search_keywords`, `is_featured`, `custom_fields` and `preorder_message` items: type: string context: From 8ace844eafc73742fc450b90527e136a8c3986ef Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:55:33 -0500 Subject: [PATCH 082/221] DEVDOCS-5971 [new]: GQL Storefront API / Customers, add password complexity requirements (#343) --- docs/storefront/graphql/customers.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/storefront/graphql/customers.mdx b/docs/storefront/graphql/customers.mdx index c6015cf99..da380ae92 100644 --- a/docs/storefront/graphql/customers.mdx +++ b/docs/storefront/graphql/customers.mdx @@ -18,6 +18,8 @@ Customer mutations and queries can do the following: * Reset a password * Get a customer address book +When you register, change, or reset a password, you can validate it using the password complexity requirements under the [CustomersSettings node](/graphql-storefront/reference#definition-CustomersSettings) before submitting the desired password to the BigCommerce platform. + ## Tokens To make requests, create a [store-level](/docs/start/authentication/api-accounts#store-level-api-accounts) or [app-level](/docs/start/authentication/api-accounts#app-level-api-accounts) API account with one or more of the following token creation OAuth scopes: From 5d4b73dca2ab468da8a4a81bdad62d357a36e785 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 10 Jul 2024 12:00:43 -0500 Subject: [PATCH 083/221] DEVDOCS-5957 [new]: MSF International Enhancements, edit custom_fields (#367) --- .../catalog/graphql-admin/product-custom-fields.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx index e73269609..f9bafb054 100644 --- a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx @@ -1,6 +1,6 @@ # Product custom fields -[_International Enhancements for multi-storefront_](/docs/store-operations/catalog/msf-international-enhancements) +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. From ba8802d746e70a626cf4878ace5190efab3d2cf9 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Thu, 11 Jul 2024 10:19:01 -0500 Subject: [PATCH 084/221] [DEVDOCS-5629]: [Update] Getting Started, API Rate limits update (#325) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5629] ## What changed? <!-- Provide a bulleted list in the present tense --> * Update API rate limits documentation ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Updated API rate limits documentation: Added methods for handling limits and optimizing requests. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5629]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Andrei K <zvuki@users.noreply.github.com> Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- .../getting-started/api-rate-limits.mdx | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 docs/api-docs/getting-started/api-rate-limits.mdx diff --git a/docs/api-docs/getting-started/api-rate-limits.mdx b/docs/api-docs/getting-started/api-rate-limits.mdx new file mode 100644 index 000000000..0de2a75b6 --- /dev/null +++ b/docs/api-docs/getting-started/api-rate-limits.mdx @@ -0,0 +1,121 @@ +# API Rate limits + +BigCommerce aims to provide outstanding platform reliability. To ensure reliability, we implement safeguards in the form of rate limits for our REST APIs. + +These rate limits enhance quality for merchants by regulating excessive API calls. In this document, we provide information on rate limits along with some best practices to put in place. + +<Callout type="info"> + BigCommerce recommends adhering to industry-standard rate limits when developing. +</Callout> + +## How limits work + +Each API request consumes one quota unit. The system rejects later requests once it reaches the quota. This continues until the quota is refreshed after the reset interval. + +All apps accessing the store share the store's quota. This prevents a single app from using the entire quota. The available quota for an app adjusts as other clients make or stop requests. + +## Rate limits by plan type + +Apps using OAuth are rate-limited based on a quota that's refreshed every 30 seconds. The maximum quota varies by store plan and requested resources. + +| Plan Type| Quota | +|:------------------|:-------| +| Enterprise and Enterprise-Test | by plan and [resource](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits) | +| Other sandboxes (Dev/Partner/Employee) | by [resource](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits) | +| Pro | 60k per hour (450 / 30sec) | +| Plus & Standard | 20k per hour (150 / 30sec) | + +### Unlimited rate plan + +The Unlimited Rate Plan is for some BigCommerce Enterprise clients. It has no request rate limits. But, it may face limits from physical infrastructure. These limits may cap the maximum request throughput for a resource. + + For more on resource constraints, see [object-related limits (Help Center)](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits). + +<Callout type="warning"> + BigCommerce can limit excessive API use to keep the platform stable. This limit is per our [Terms of Service](https://www.bigcommerce.com/terms/api-terms/). +</Callout> + +## Best practices + +Manage API rate limits by following these crucial guidelines for success. + +Process rate limit HTTP 429 status code accurately, distribute request loads evenly, store results, and repeat requests strategically to boost app performance and prevent outages. + +### Handle rate limit status codes + +<Callout type="info"> + As of January 2022, BigCommerce header field names are case-insensitive. Learn more about BigCommerce [response header conventions](/docs/start/about#response-headers). +</Callout> + +API rate limits regulate the amount of calls made to your app. You can use the API's response HTTP headers to find more information about your current rate limit status: + +```http filename="Standard plan example: Rate limit headers" +X-Rate-Limit-Time-Window-Ms: 30000 +X-Rate-Limit-Time-Reset-Ms: 15000 +X-Rate-Limit-Requests-Quota: 150 +X-Rate-Limit-Requests-Left: 35 +``` + +|Name | Description | +|:------|:-----| +| X-Rate-Limit-Time-Window-Ms | Shows the size of your current rate limiting window. In this case, it’s 30000 milliseconds. | +| X-Rate-Limit-Time-Reset-Ms | Shows the size of your current rate limiting window. In this case, it’s 15000 milliseconds. | +| X-Rate-Limit-Requests-Quota | Shows how many API requests are allowed in the current window for your client. In this case, 150 requests.| +| X-Rate-Limit-Requests-Left | Details how many remaining requests your client can make in the current window before being rate limited. In this case, 35 requests.| + +### Distribute the load + +To avoid spikes in API requests and ensure efficient use of your quota, spread out your API calls over time. The practice helps prevent hitting rate limits by balancing the number of requests sent in a given time frame. + +You can use strategies such as using asynchronous processes, batching requests, and using a queue. They will help you distribute the load evenly. You can also keep a smooth request rate by adjusting the rate based on the API response headers. + +### Caching results + +Cache frequent results to reduce API calls. + +### Retry requests responsibly + +To retry requests responsibly when using the BigCommerce API, follow these steps: + +1. Monitor for `429` Responses: When you receive a `429: Too Many Requests` response, it indicates that you've hit the rate limit. + +2. Check the Retry-After Header: Use the `X-Rate-Limit-Time-Reset-Ms` header to determine how long to wait before retrying. This header provides the time in milliseconds until your quota resets. + +3. Pause Before Retrying: Implement a delay in your code based on the `X-Rate-Limit-Time-Reset-Ms` value. For example, in PHP: + +```php filename="PHP" showLineNumbers copy + $milliseconds = $response->getHeader("X-Rate-Limit-Time-Reset-Ms"); + usleep($milliseconds * 1000); +``` + +#### Seeing a `429` response? + +If you encounter a `429` response without the API HTTP headers, this is an indication that the platform experiences high load due to excessive traffic on a particular store and the request may be retried at another time. + +Here's an example of what a 429 response looks like: + +```http filename="Example: 429 response" showLineNumbers copy + HTTP/1.1 429 Too Many Requests + Date: Mon, 03 Feb 2022 20:36:00 GMT + Content-Type: application/json + X-Rate-Limit-Time-Window-Ms: 30000 + X-Rate-Limit-Time-Reset-Ms: 15000 + X-Rate-Limit-Requests-Quota: 150 + X-Rate-Limit-Requests-Left: 35 +``` +Continue to reduce the risk of an app outage by slowing down the amount of calls being made. This will reduce any strain on performance. For more details on response headers, see [About Our API](/docs/start/about#bigcommerce-specific-response-headers). + +If retries continue to hit rate limits, gradually increase the wait time to avoid overwhelming the server. + +By following these steps, you can ensure your requests are retried responsibly on the BigCommerce platform. + +## Resources + +### Related articles + +* [Platform limits - Store limits](/https://support.bigcommerce.com/s/article/Platform-Limits?language=en_US#storelimits) (BigCommerce Knowledge Base) +* [About our APIs - Response headers](/https://developer.bigcommerce.com/docs/start/about#response-headers) + +## Additional resources + +* [BigCommerce: Incorporated terms - API terms](/https://www.bigcommerce.com/terms/api-terms/) (BigCommerce terms of service) \ No newline at end of file From c1f49737bdfed1264c8d7551609055346d5838ea Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:12:08 -0500 Subject: [PATCH 085/221] DEVDOCS-5957: Revert Admin GQL API's custom fields (#371) --- .../catalog/graphql-admin/product-basic-info.mdx | 1 - docs/store-operations/catalog/msf-international-enhancements.mdx | 1 - 2 files changed, 2 deletions(-) diff --git a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx index 6cc4f1a35..f72c86683 100644 --- a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx @@ -33,7 +33,6 @@ The following table describes the ID fields that you can use in inputs for mutat | | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | | `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | | | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | -| `customFieldId` | ID for a product custom field | [Get product custom fields](/docs/rest-catalog/products/custom-fields#get-product-custom-fields) | `"bc/store/productCustomField/1"` | ## Set basic product information at the global level diff --git a/docs/store-operations/catalog/msf-international-enhancements.mdx b/docs/store-operations/catalog/msf-international-enhancements.mdx index 61b14caf1..48f5fb94e 100644 --- a/docs/store-operations/catalog/msf-international-enhancements.mdx +++ b/docs/store-operations/catalog/msf-international-enhancements.mdx @@ -18,7 +18,6 @@ The following pages provide sample queries: - [Product modifier options](/docs/store-operations/catalog/graphql-admin/product-modifier-options) - [Product URL](/docs/store-operations/catalog/graphql-admin/product-url) - [Additional product attributes](/docs/store-operations/catalog/graphql-admin/product-attributes) -- [Product custom fields](/docs/store-operations/catalog/graphql-admin/product-custom-fields) You can create webhooks that trigger for the following events: - [Product updated](/docs/integrations/webhooks/events#products) From 83866562d21e5c0dae5d1dba9abad7697c8c2c8b Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:52:03 -0500 Subject: [PATCH 086/221] [DEVDOCS-5910]: [remove] Best Practices, Remove API limit content from the Development doc (#372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5910] ## What changed? <!-- Provide a bulleted list in the present tense --> * Removed API rate limiting content from the doc as a new file exists around [API rate limits](https://developer.bigcommerce.com/docs/start/best-practices/api-rate-limits) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Removed API rate limit content from the Best Practices section to streamline documentation and improve clarity for developers. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5910]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5910?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/start/best-practices/index.mdx | 72 ++--------------------------- 1 file changed, 3 insertions(+), 69 deletions(-) diff --git a/docs/start/best-practices/index.mdx b/docs/start/best-practices/index.mdx index 3bec8b518..b8ae119db 100644 --- a/docs/start/best-practices/index.mdx +++ b/docs/start/best-practices/index.mdx @@ -1,6 +1,6 @@ --- title: API Best Practices -keywords: rate limits, best practices, +keywords: best practices, --- # API Best Practices @@ -51,74 +51,7 @@ You can use threaded requests in order to quickly update information in an API. The [BigCommerce Ruby API client](https://github.com/bigcommerce/bigcommerce-api-ruby) is thread-safe. It satisfies both the need for multiple threads to access the same shared data and the need for only one thread to access a shared piece of data at any given time. This design pattern can reduce the total time that your app requires to complete a series of requests. -## API rate limits - -Apps that authenticate with OAuth are rate-limited based on a quota that is refreshed every few seconds. The maximum quota for a store will vary depending on the store plan and resources requested. - -| Plans & sandboxes | Quotas | -|:------------------|:-------| -| Enterprise plans and Enterprise sandboxes (Enterprise-Test) | by plan\* and [resource](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits) | -| All other sandboxes (Dev/Partner/Employee) | by [resource](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits) | -| Pro plans| 60k per hour (450 / 30sec) | -| Plus & Standard plans| 20k per hour (150 / 30sec) | - -<Callout type="warning"> - \* The **Unlimited** rate plan for select BigCommerce Enterprise clients means that these stores are not rate limited by number of requests per unit of time. However, there are physical infrastructure-related constraints that may limit the maximum throughput of requests for a given resource. For more on resource constraints, consult our article on [object-related limits (Help Center)](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits). - - BigCommerce reserves the right to limit unreasonable or abusive API activity in the interest of platform stability, per our [Terms of Service](https://www.bigcommerce.com/terms/api-terms/). -</Callout> - -Each request to the API consumes one available request from the quota. When an app hits the quota limit, subsequent requests are rejected until the quota is refreshed. - -A store’s overall quota is distributed across all apps that are accessing that store at a given time. This prevents a single app from consuming the store’s entire quota by itself. The quota available to a single app adjusts as additional clients start and stop making requests. - -### Playing nicely with the platform - -<Callout type="info"> - As of January 2022, BigCommerce header field names became functionally case-insensitive. Learn more about BigCommerce [response header conventions](/docs/start/about#response-headers). -</Callout> - -Every API response’s HTTP headers give you full visibility into your position in the rate-limiting algorithm: - -```http filename="Standard plan example: Rate limit headers" -X-Rate-Limit-Time-Window-Ms: 30000 -X-Rate-Limit-Time-Reset-Ms: 15000 -X-Rate-Limit-Requests-Quota: 150 -X-Rate-Limit-Requests-Left: 35 -``` - -If your implementation's request to the API triggers a [429: Too Many Requests](/docs/start/about/status-codes#4xx-client-error) response, it is encountering rate limits. Responses contain the `X-Rate-Limit-Time-Reset-Ms` header, which specifies the time in milliseconds that your client must wait before its quota refreshes. Retry the request after this time has elapsed. - -For more about rate limit headers and how to calculate the timing of your requests to reduce the risk of encountering rate limits, see [About Our API](/docs/start/about#bigcommerce-specific-response-headers). - -### Example of 429 status code - -When you see a response with an HTTP `429` status code, your client shouldn’t make any further requests until your quota has refreshed: - -```http filename="Example: 429 response" showLineNumbers copy - HTTP/1.1 429 Too Many Requests - Date: Mon, 03 Feb 2022 20:36:00 GMT - Content-Type: application/json - X-Rate-Limit-Time-Reset-Ms: 15000 -``` - -Parse the `X-Rate-Limit-Time-Reset-Ms` header to determine how long you have to wait. In this case, it would be 15000 milliseconds. -Your client can sleep on the specified interval: - -```php filename="PHP example for delaying response" showLineNumbers copy - $milliseconds = $response->getHeader("X-Rate-Limit-Time-Reset-Ms"); - usleep($milliseconds); -``` - -After waiting for the given number of milliseconds, your client can go back to making API requests. - -### Making requests in parallel - -You can increase the amount of work your app can do in a given unit of time by sending multiple HTTP requests in parallel. This is perfectly acceptable. However, your app should monitor the rate limiting headers to avoid an HTTP `429` response. Methods for doing this include the following: -* Slowing your rate of API requests as `X-Rate-Limit-Requests-Left` approaches zero. -* Determining an acceptable average rate of requests by dividing `X-Rate-Limit-Requests-Quota` by `X-Rate-Limit-Time-Window-Ms`, and then self-throttling to that rate. - -Endpoints that accept bulk requests may have specific limitations on the number of accepted parallel requests. For example, making multiple parallel requests to [Upsert price list records](/docs/rest-management/price-lists/price-lists-records#upsert-price-list-records) results in one or more error responses with the [429: Too Many Requests](/docs/start/about/status-codes#4xx-client-error) status code. The current list of limitations is documented in our article on [resource-specific limits (Help Center)](https://support.bigcommerce.com/s/article/Platform-Limits#storelimits). The [API reference](/docs/api) specification for each endpoint or mutation also documents any limits specific to that request. +Looking for more information on handling requests? Continue with [API rate limits](/docs/start/best-practices/api-rate-limits) to learn about our best practices. ## Resources @@ -129,6 +62,7 @@ Endpoints that accept bulk requests may have specific limitations on the number * [Filtering Requests](/docs/start/about/common-query-params) * [API Status Codes](/docs/start/about/status-codes) * [About Our API: Response Headers](/docs/start/about#response-headers) +* [API rate limits](/docs/start/best-practices/api-rate-limits) * [Guide to API Accounts](/docs/start/authentication/api-accounts)[webhook events and their payloads](/docs/integrations/webhooks/events) * [Changelog](/release-notes) From a71d0e43a9abcf6b67858b3ca864f58e92da7685 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 11 Jul 2024 15:32:17 -0500 Subject: [PATCH 087/221] =?UTF-8?q?DEVDOCS-5996:=20[Update]=20channel=20ID?= =?UTF-8?q?=20is=20no=20longer=20a=20requirement=20for=20toke=E2=80=A6=20(?= =?UTF-8?q?#364)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …n creation <!-- Ticket number or summary of work --> # [DEVDOCS-5996] ## What changed? * removed text regarding the requirement to enter a channel ID when creating a Storefront token * Fixed incorrect example * Created a ticket to remove duplicated request fields. ## Release notes draft We're happy to announce that you can use a channel ID or channel IDs when creating a Storefront token. (needs review) <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5996]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5996?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/storefront/graphql/index.mdx | 2 +- reference/storefront_tokens.v3.yml | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/docs/storefront/graphql/index.mdx b/docs/storefront/graphql/index.mdx index b2fa21af5..fbf807fc8 100644 --- a/docs/storefront/graphql/index.mdx +++ b/docs/storefront/graphql/index.mdx @@ -576,7 +576,7 @@ For example, if your store hash is `abc123` and your channel ID is `456`, the ch For a channel's permanent URL to respond to requests, you must first [create a site](/docs/rest-management/sites#create-a-site) for the channel. <Callout type="info"> - When you create a GraphQL Storefront API token, include the channel ID of the channel on which you wish to use the token. Otherwise, the server will reject your requests. See the section on [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in the GraphQL Storefront authentication article. + When you create a GraphQL Storefront API token, you can include the channel ID of the channel on which you wish to use the token. See the section on [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in the GraphQL Storefront authentication article. </Callout> ### I want to run requests from a front-end application or browser. I only show anonymous information, or I do not support signing in as a customer diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index aac5c0d6a..cb45a5a83 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -64,6 +64,11 @@ paths: allOf: - $ref: '#/components/schemas/TokenPostSimple' - $ref: '#/components/schemas/TokenPostImpersonation' + example: + allowed_cors_origins: + - 'https://www.yourstorefront.com/' + channel_id: 1 + expires_at: 1885635176 required: false responses: '200': @@ -169,18 +174,23 @@ components: x-internal: false properties: channel_id: - type: integer - minimum: 1 - description: Channel ID for requested token - example: 1 + type: integer + example: 1 + description: Channel ID for a requested token. Use this field to enter a channel ID. Do not use this field if you have more than one channel. You can not use both `channel_id` and `channel_ids` in your request. + channel_ids: + type: array + items: + type: integer + example: [667251, 1] + description: List of channel IDs for a requested token. Use this field if you have more than one channel ID. You can not use both `channel_id` and `channel_ids` in your request. expires_at: type: integer description: Unix timestamp (UTC time) defining when the token should expire. Supports seconds, but does not support milliseconds, microseconds, or nanoseconds. example: 1885635176 minimum: 0 required: - - channel_id - expires_at + - channel_id TokenPostSimple: type: object properties: @@ -190,15 +200,9 @@ components: type: array description: List of allowed domains for Cross-Origin Request Sharing. Currently accepts a maximum of two domains per created token. items: - maxLength: 1 minLength: 1 - pattern: '/^https?:\/\/(?=.{1,254}(?::|$))(?:(?!\d|-)(?![a-z0-9\-]{1,62}-(?:\.|:|$))[a-z0-9\-]{1,63}\b(?!\.$)\.?)+(:\d+)?$/i;' type: string x-internal: false - x-examples: - example-1: - allowed_cors_origins: - - 'https://www.yourstorefront.com/' Token_Full: type: object properties: From d131f969f7ce085e12488099d59d494532349c36 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:45:55 +0100 Subject: [PATCH 088/221] [DEVDOCS-6010] Remove pagination object for Themes API (#363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replacing all pagination objects with empty meta object (copied from email_templates.v3.yml) <!-- Ticket number or summary of work --> # [DEVDOCS-6010] Remove pagination object for Themes API ## What changed? <!-- Provide a bulleted list in the present tense --> * Removed all pagination objects and replaced them with empty meta object (copied from email_templates.v3.yml) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Removed pagination object from [GET All Themes API call](https://developer.bigcommerce.com/docs/rest-content/themes#get-all-themes) ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> [DEVDOCS-6010]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6010?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/themes.v3.yml | 252 +++------------------------------------- 1 file changed, 13 insertions(+), 239 deletions(-) diff --git a/reference/themes.v3.yml b/reference/themes.v3.yml index 41e2b78a4..6cc42d3b1 100644 --- a/reference/themes.v3.yml +++ b/reference/themes.v3.yml @@ -708,13 +708,7 @@ components: settings: {} date_created: ei site_id: 52736226 - meta: - pagination: - total: 36 - count: 36 - per_page: 50 - current_page: 1 - total_pages: 1 + meta: {} securitySchemes: X-Auth-Token: name: X-Auth-Token @@ -743,196 +737,23 @@ components: schemas: CollectionMeta: type: object - description: 'Data about the response, including pagination and collection totals.' - properties: - pagination: - type: object - description: 'Data about the response, including pagination and collection totals.' - title: Pagination - properties: - total: - type: integer - description: | - Total number of items in the result set. - example: 36 - count: - type: integer - description: | - Total number of items in the collection response. - example: 36 - per_page: - type: integer - description: | - The amount of items returned in the collection per page, controlled by the limit parameter. - example: 50 - current_page: - type: integer - description: | - The page you are currently on within the collection. - example: 1 - total_pages: - type: integer - description: | - The total number of pages in the collection. - example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. + properties: {} + additionalProperties: true + description: Response metadata. title: Collection Meta x-internal: false ThemesCollectionMeta: type: object - description: 'Data about the response, including pagination and collection totals.' - properties: - pagination: - type: object - description: 'Data about the response, including pagination and collection totals.' - title: Pagination - properties: - total: - type: integer - description: | - Total number of items in the result set. - example: 36 - count: - type: integer - description: | - Total number of items in the collection response. - example: 36 - per_page: - type: integer - description: | - The amount of items returned in the collection per page, controlled by the limit parameter. - example: 50 - current_page: - type: integer - description: | - The page you are currently on within the collection. - example: 1 - total_pages: - type: integer - description: | - The total number of pages in the collection. - example: 1 + properties: {} + additionalProperties: true + description: Response metadata. title: Themes Collection Meta x-internal: false - Pagination: - type: object - description: 'Data about the response, including pagination and collection totals.' - title: Pagination - properties: - total: - type: integer - description: | - Total number of items in the result set. - example: 36 - count: - type: integer - description: | - Total number of items in the collection response. - example: 36 - per_page: - type: integer - description: | - The amount of items returned in the collection per page, controlled by the limit parameter. - example: 50 - current_page: - type: integer - description: | - The page you are currently on within the collection. - example: 1 - total_pages: - type: integer - description: | - The total number of pages in the collection. - example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. - x-internal: false Meta: type: object - description: 'Data about the response, including pagination and collection totals.' - title: Collection Meta - properties: - pagination: - type: object - description: 'Data about the response, including pagination and collection totals.' - title: Pagination - properties: - total: - type: integer - description: | - Total number of items in the result set. - example: 36 - count: - type: integer - description: | - Total number of items in the collection response. - example: 36 - per_page: - type: integer - description: | - The amount of items returned in the collection per page, controlled by the limit parameter. - example: 50 - current_page: - type: integer - description: | - The page you are currently on within the collection. - example: 1 - total_pages: - type: integer - description: | - The total number of pages in the collection. - example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. + properties: {} + additionalProperties: true + description: Response metadata. x-internal: false ErrorResponse: allOf: @@ -1204,56 +1025,9 @@ components: type: string meta: type: object - description: 'Data about the response, including pagination and collection totals.' - properties: - pagination: - type: object - description: 'Data about the response, including pagination and collection totals.' - title: Pagination - properties: - total: - type: integer - description: | - Total number of items in the result set. - example: 36 - count: - type: integer - description: | - Total number of items in the collection response. - example: 36 - per_page: - type: integer - description: | - The amount of items returned in the collection per page, controlled by the limit parameter. - example: 50 - current_page: - type: integer - description: | - The page you are currently on within the collection. - example: 1 - total_pages: - type: integer - description: | - The total number of pages in the collection. - example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. + properties: {} + additionalProperties: true + description: Response metadata. title: Collection Meta title: Themes Collection Response x-internal: false From 2b91b3194f9b3fffbbf28104a36e5528fd66d7b5 Mon Sep 17 00:00:00 2001 From: sviat stoliarenko <80041457+bc-tayvs@users.noreply.github.com> Date: Fri, 12 Jul 2024 18:37:25 +0300 Subject: [PATCH 089/221] PAPI-2240: remove events endpoint from webhooks doc (#345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [PAPI-2240](https://bigcommercecloud.atlassian.net/browse/PAPI-2242) ## What changed? * Remove 'events' endpoint from documentation because of endpoint removing ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * The endpoint in a process of removal. Need to remove all mentioning from documentation as well ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [PAPI-2240]: https://bigcommercecloud.atlassian.net/browse/PAPI-2240?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/webhooks.v3.yml | 78 +-------------------------------------- 1 file changed, 1 insertion(+), 77 deletions(-) diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index 5d32ab6b3..4f8c860ac 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -11,7 +11,6 @@ info: tags: - name: Manage Webhooks (Single) - name: Manage Webhooks (Bulk) - - name: Webhook Events - name: Webhooks Admin security: - X-Auth-Token: [] @@ -133,7 +132,7 @@ paths: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/Content-Type' parameters: - - $ref: '#/components/parameters/WebhookId' + - $ref: '#/components/parameters/WebhookId' put: responses: '200': @@ -321,41 +320,6 @@ paths: $ref: '#/components/responses/422_UnprocessableEntity' tags: - Webhooks Admin - '/hooks/events': - get: - tags: - - Webhook Events - summary: Get Events - deprecated: true - parameters: - - $ref: '#/components/parameters/FilterPageParam' - - $ref: '#/components/parameters/FilterLimitParam' - - $ref: '#/components/parameters/FilterMaxCreatedAtParam' - - $ref: '#/components/parameters/FilterMinCreatedAtParam' - operationId: getWebhookEvents - responses: - '200': - description: Successful operation. - content: - application/json: - schema: - type: object - properties: - data: - type: array - items: - $ref: '#/components/schemas/HistoryEvent' - meta: - type: object - properties: - pagination: - $ref: '#/components/schemas/Pagination' - '400': - $ref: '#/components/responses/400_BadRequest' - '401': - $ref: '#/components/responses/401_Unauthorized' - description: | - Get a list of events that were sent but not successfully received. Events are stored for at least one week. This hook/event functionality is superseded by [Delivery exception hooks](/docs/integrations/webhooks/events#delivery-exception-hooks). components: parameters: WebhookId: @@ -406,22 +370,6 @@ components: required: false schema: type: integer - FilterMaxCreatedAtParam: - name: 'created_at:max' - in: query - description: | - Maximum value for returned data. - required: false - schema: - type: string - FilterMinCreatedAtParam: - name: 'created_at:min' - in: query - description: | - Minimum value for returned data. - required: false - schema: - type: string Accept: in: header name: Accept @@ -3052,30 +3000,6 @@ components: type: integer example: 1561488106 description: The time the webhook was most recently updated, represented in UNIX epoch time. - HistoryEvent: - type: object - properties: - scope: - type: string - description: Alias where the event occurred. - store_id: - type: string - description: A numerical identifier that is unique to each store. - data: - type: object - properties: {} - additionalProperties: true - description: A lightweight description of the event that triggered the webhook. Will vary depending on the event registered. - hash: - type: string - description: The payload data encoded in JSON format and then passed through SH1 encryption. - created_at: - type: integer - format: int64 - description: UTC timestamp, in seconds, that the events was created. - producer: - type: string - description: Will always follow the pattern stores/store_hash. This is the store that created the webhook. Pagination: type: object description: | From 7c8e4ee1310f65f9d35db39379343edf2ca3cf02 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Fri, 12 Jul 2024 10:46:38 -0500 Subject: [PATCH 090/221] [No ticket] Correction, Fix sentence case header (#373) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> No Ticket ## What changed? <!-- Provide a bulleted list in the present tense --> * Fix title to match sentence casing rules ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- docs/api-docs/getting-started/api-rate-limits.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-docs/getting-started/api-rate-limits.mdx b/docs/api-docs/getting-started/api-rate-limits.mdx index 0de2a75b6..a52884e42 100644 --- a/docs/api-docs/getting-started/api-rate-limits.mdx +++ b/docs/api-docs/getting-started/api-rate-limits.mdx @@ -1,4 +1,4 @@ -# API Rate limits +# API rate limits BigCommerce aims to provide outstanding platform reliability. To ensure reliability, we implement safeguards in the form of rate limits for our REST APIs. From f4fa70eb773e0ad1f486ccb571e7ffe18e5db2c8 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 15 Jul 2024 12:28:55 -0500 Subject: [PATCH 091/221] DEVDOCS-5988: [update] Update shopPath definition (#369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5988] ## What changed? Added note to the shopPath variable ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5988]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5988?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- archive/storefront/blueprint/themes/global-variables.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archive/storefront/blueprint/themes/global-variables.mdx b/archive/storefront/blueprint/themes/global-variables.mdx index 893f6a17a..41d32cf1e 100644 --- a/archive/storefront/blueprint/themes/global-variables.mdx +++ b/archive/storefront/blueprint/themes/global-variables.mdx @@ -8,7 +8,7 @@ The list below is sorted by the number of times that the Blueprint base theme re | Variable | Description | |:---------|:------------| -| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL based page, this will be the HTTPS version of the store path. | +| `%%GLOBAL_ShopPath%%` | The full URL to the store without a trailing slash. If on an SSL-based page, this will be the HTTPS version of the store path. NOTE: This variable does not work for headless storefronts when linking to categories. In this case, you should use the URL instead of the store path variable. | | `%%GLOBAL_IMG_PATH%%` | . | | `%%GLOBAL_ProductName%%` | . | | `%%GLOBAL_ProductId%%` | . | From c3a432c933c78cc668c761ff2c868df0ae411c35 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:15:47 -0500 Subject: [PATCH 092/221] DEVDOCS-5142 [new]: Apps, update MLI-compatibility requirements (#366) --- docs/integrations/apps/guide/publishing.mdx | 6 +++--- .../frequently-asked-questions.mdx | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/integrations/apps/guide/publishing.mdx b/docs/integrations/apps/guide/publishing.mdx index ad934b04f..97f459af0 100644 --- a/docs/integrations/apps/guide/publishing.mdx +++ b/docs/integrations/apps/guide/publishing.mdx @@ -75,11 +75,11 @@ Provide a helpful description with screenshots and a video to promote your app. | App Screenshot | Screenshots of app UI in a BigCommerce store's control panel | | Alternate Logo | Used if app featured in Marketplace carousel; should be 259 x 158px (or larger at ratio); color background and light branding; no taglines | -## Add supported features +## Add supported features -Indicate whether your app supports multi-storefront functionality. +Indicate whether your app supports functionality for multi-storefront and [multi-location inventory](https://support.bigcommerce.com/s/article/Multi-Location#app-support). -![App Supported Features](https://storage.googleapis.com/bigcommerce-production-dev-center/Big%20Design%20Docs/App%20Supported%20Features.png "App Supported Features") +![App Supported Features](https://storage.googleapis.com/bigcommerce-production-dev-center/images/dev-portal-app-supported-features.png "App Supported Features") ## Review submission diff --git a/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx b/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx index 8dae8a485..88ca6643c 100644 --- a/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx +++ b/docs/integrations/buy-online-pick-up-in-store/frequently-asked-questions.mdx @@ -26,3 +26,7 @@ Order Refunds do not affect order consignments. When an order is edited, the order consignment will be modified to reflect these changes. For example, this includes changes to shipping addresses or line item quantities, as well as the addition or removal of line items. An order can be edited at any time of the fulfillment lifecycle; this includes orders that have already been fulfilled. + +**As an app developer, how can I ensure my app is compatible with multi-location inventory?** + +Apps that are [compatible with multi-location inventory](https://support.bigcommerce.com/s/article/Multi-Location#app-support) must use the [Inventory API](/docs/store-operations/catalog/inventory-adjustments), not the [V3 Catalog API](/docs/rest-catalog), to adjust inventory in a store. For more information, see the [Inventory overview](/docs/store-operations/catalog/inventory-adjustments). \ No newline at end of file From f23f355af3a14aa80c757b9cb0cd6ecbf778de0b Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:04:24 -0500 Subject: [PATCH 093/221] DEVDOCS-5999 [new]: GQL SF API, GQL token multiple channels (#368) --- .../authentication/graphql-storefront.mdx | 4 +- docs/storefront/graphql/index.mdx | 2 +- reference/storefront_tokens.v3.yml | 56 +++++++++++++------ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx index 902b6ccba..1d93d1e74 100644 --- a/docs/start/authentication/graphql-storefront.mdx +++ b/docs/start/authentication/graphql-storefront.mdx @@ -45,7 +45,7 @@ accept: application/json content-type: application/json { - "channel_id": 1, // integer (must be a valid channel ID on the store) + "channel_ids": [1, 2, 3], // array of integers (must be a valid channel IDs on the store) "expires_at": 1602288000, // when the token will expire, as an integer unix timestamp (in seconds) "allowed_cors_origins": [ // array of origins (up to 2 origins per token) "https://example.com" @@ -94,7 +94,7 @@ Accept: application/json Content-Type: application/json { - "channel_id": 1, // integer (must be a valid channel ID on the store) + "channel_ids": [1, 2, 3] // array of integers (must be a valid channel IDs on the store) "expires_at": 1602288000 // when the token will expire, as an integer unix timestamp (in seconds) } ``` diff --git a/docs/storefront/graphql/index.mdx b/docs/storefront/graphql/index.mdx index fbf807fc8..5f3c02418 100644 --- a/docs/storefront/graphql/index.mdx +++ b/docs/storefront/graphql/index.mdx @@ -576,7 +576,7 @@ For example, if your store hash is `abc123` and your channel ID is `456`, the ch For a channel's permanent URL to respond to requests, you must first [create a site](/docs/rest-management/sites#create-a-site) for the channel. <Callout type="info"> - When you create a GraphQL Storefront API token, you can include the channel ID of the channel on which you wish to use the token. See the section on [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in the GraphQL Storefront authentication article. + When you create a GraphQL Storefront API token, you can include the channel IDs of the channels on which you wish to use the token. See the section on [Creating a token](/docs/start/authentication/graphql-storefront#creating-a-token) in the GraphQL Storefront authentication article. </Callout> ### I want to run requests from a front-end application or browser. I only show anonymous information, or I do not support signing in as a customer diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index cb45a5a83..92dfbf52e 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -170,27 +170,22 @@ components: default: 'application/json' schemas: TokenPostImpersonation: - type: object x-internal: false - properties: - channel_id: - type: integer - example: 1 - description: Channel ID for a requested token. Use this field to enter a channel ID. Do not use this field if you have more than one channel. You can not use both `channel_id` and `channel_ids` in your request. - channel_ids: - type: array - items: - type: integer - example: [667251, 1] - description: List of channel IDs for a requested token. Use this field if you have more than one channel ID. You can not use both `channel_id` and `channel_ids` in your request. - expires_at: - type: integer - description: Unix timestamp (UTC time) defining when the token should expire. Supports seconds, but does not support milliseconds, microseconds, or nanoseconds. - example: 1885635176 - minimum: 0 + allOf: + - type: object + properties: + expires_at: + type: integer + description: Unix timestamp (UTC time) defining when the token should expire. Supports seconds, but does not support milliseconds, microseconds, or nanoseconds. + example: 1885635176 + minimum: 0 + required: + - expires_at + - oneOf: + - $ref: "#/components/schemas/Channels" + - $ref: "#/components/schemas/Channel" required: - expires_at - - channel_id TokenPostSimple: type: object properties: @@ -220,6 +215,31 @@ components: type: string description: JWT Token for accessing the Storefront API x-internal: false + Channel: + title: channel_id + type: object + x-internal: false + properties: + channel_id: + type: integer + minimum: 1 + description: Channel ID that is valid for the requested token. Use this field to enter a channel ID. Do not use this field if you have more than one channel. We support this field for backwards compatibility, but `channel_ids` is preferred. You can not use both `channel_id` and `channel_ids` in your request. + example: 1 + required: + - channel_id + Channels: + title: channel_ids + type: object + x-internal: false + properties: + channel_ids: + type: array + description: A list of channel IDs that are valid for the requested token. Use this field if you have more than one channel ID. You can not use both `channel_id` and `channel_ids` in your request. + items: + type: integer + example: [667251, 1] + required: + - channel_ids ErrorResponse: allOf: - $ref: '#/components/schemas/BaseError' From 1d625648a594639583dbb70168e871e10cafe1b9 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 23 Jul 2024 08:06:58 -0500 Subject: [PATCH 094/221] DEVDOCS-5780: [update] Added TD Online Mart (#378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5780] ## What changed? Added TD Online Mart to the list of compatible payment gateways for both Stored Instruments and Raw Card Data ## Release notes draft We're happy to announce that TD Online Mart is supported for both Stored Instruments and Raw Card Data. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5780]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5780?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/store-operations/payments/index.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/store-operations/payments/index.mdx b/docs/store-operations/payments/index.mdx index ec5f5945e..9a474d6ef 100644 --- a/docs/store-operations/payments/index.mdx +++ b/docs/store-operations/payments/index.mdx @@ -81,6 +81,7 @@ The following table lists the payment gateways that are compatible with our publ | Stripe | ✓ | ✓ | | StripeV3 | ✓ | ✓ | | StripeV4 | ✓ | ✓ | +| TD Online Mart | ✓ | ✓ | | USA ePay | | ✓ | | Vantiv | | ✓ | | Vantiv Core | | ✓ | From 473678356c3cc814689fdb37889977b5e4788a64 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 23 Jul 2024 12:28:22 -0500 Subject: [PATCH 095/221] DEVDOCS-4695 [new]: Store-level API accounts, add authorized users (#382) --- docs/integrations/apps/guide/auth.mdx | 2 +- docs/integrations/apps/guide/types.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/integrations/apps/guide/auth.mdx b/docs/integrations/apps/guide/auth.mdx index 5403ff4f6..8f6981769 100644 --- a/docs/integrations/apps/guide/auth.mdx +++ b/docs/integrations/apps/guide/auth.mdx @@ -7,7 +7,7 @@ It may be more appropriate for your application to use an API client to handle t <Callout type="info"> #### Store owner access_token constraint - Typically, only [store owners](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) and authorized users can create API accounts and `access_token`s for a store. However, when an app is approved to be publicly available for additional stores to install, it can generate `access_token`s *on behalf* of store owners. + Typically, only [store owners](https://support.bigcommerce.com/s/article/Store-API-Accounts#creating) and authorized users can create API accounts and `access_token`s for a store. However, when an app is approved to be publicly available for additional stores to install, it can generate `access_token`s *on behalf* of store owners and authorized users. </Callout> ## Overview diff --git a/docs/integrations/apps/guide/types.mdx b/docs/integrations/apps/guide/types.mdx index be2a5afd7..dac64b20c 100644 --- a/docs/integrations/apps/guide/types.mdx +++ b/docs/integrations/apps/guide/types.mdx @@ -5,7 +5,7 @@ keywords: app extensions # Types of Apps -The first step when developing an app is deciding which type of app to develop. The two types of apps, single-click and connector, are defined by the method of authentication. [Single-click](#single-click) apps use an OAuth Authorization Code Grant flow. [Connector apps](#connector) require store owners to manually generate and configure store API credentials. In addition to the authentication method, apps can differ by [visibility](#visibility). +The first step when developing an app is deciding which type of app to develop. The two types of apps, single-click and connector, are defined by the method of authentication. [Single-click](#single-click) apps use an OAuth Authorization Code Grant flow. [Connector apps](#connector) require store owners or authorized users to manually generate and configure store API credentials. In addition to the authentication method, apps can differ by [visibility](#visibility). ## Single-Click @@ -22,7 +22,7 @@ Once granted, the app can request a permanent `access_token` for making REST API Single-click apps can use [App Extensions](/docs/integrations/apps/app-extensions). ## Connector -Connector apps use manual OAuth token creation instead of the single-click app flow. Store owners manually generate [store-level API credentials](/docs/start/authentication/api-accounts#revoking-store-level-api-credentials) and enter them into the app's configuration. While single-click apps are recommended, the following use cases might not be compatible: +Connector apps use manual OAuth token creation instead of the single-click app flow. Store owners and authorized users manually generate [store-level API credentials](/docs/start/authentication/api-accounts#revoking-store-level-api-credentials) and enter them into the app's configuration. While we recommend single-click apps, the following use cases might not be compatible: - Customized integrations that vary per store. - Integrations that do not provide any content for an iFrame. From d0200e332000d42add4d5bca74eb678c5515f10d Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Tue, 23 Jul 2024 16:23:42 -0500 Subject: [PATCH 096/221] [No-ticket]: [new] Repo file, Add GH issues CSV to assets folder (#393) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [no-ticket] ## What changed? <!-- Provide a bulleted list in the present tense --> * Adding GH issues CSV file to repo so that Jira Issues are created for the team ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- assets/csv/2024-07-23-12-56-27-issues.csv | 7970 +++++++++++++++++++++ 1 file changed, 7970 insertions(+) create mode 100644 assets/csv/2024-07-23-12-56-27-issues.csv diff --git a/assets/csv/2024-07-23-12-56-27-issues.csv b/assets/csv/2024-07-23-12-56-27-issues.csv new file mode 100644 index 000000000..43063ac5a --- /dev/null +++ b/assets/csv/2024-07-23-12-56-27-issues.csv @@ -0,0 +1,7970 @@ +url,repository_url,labels_url,comments_url,events_url,html_url,id,node_id,number,title,user.login,user.id,user.node_id,user.avatar_url,user.gravatar_id,user.url,user.html_url,user.followers_url,user.following_url,user.gists_url,user.starred_url,user.subscriptions_url,user.organizations_url,user.repos_url,user.events_url,user.received_events_url,user.type,user.site_admin,labels,state,locked,assignee,assignees,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request.url,pull_request.html_url,pull_request.diff_url,pull_request.patch_url,pull_request.merged_at,body,reactions.url,reactions.total_count,reactions.+1,reactions.-1,reactions.laugh,reactions.hooray,reactions.confused,reactions.heart,reactions.rocket,reactions.eyes,timeline_url,performed_via_github_app,state_reason,assignee.login,assignee.id,assignee.node_id,assignee.avatar_url,assignee.gravatar_id,assignee.url,assignee.html_url,assignee.followers_url,assignee.following_url,assignee.gists_url,assignee.starred_url,assignee.subscriptions_url,assignee.organizations_url,assignee.repos_url,assignee.events_url,assignee.received_events_url,assignee.type,assignee.site_admin +https://api.github.com/repos/bigcommerce/docs/issues/390,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/390/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/390/comments,https://api.github.com/repos/bigcommerce/docs/issues/390/events,https://github.com/bigcommerce/docs/pull/390,2425671554,PR_kwDOI7BBSM52Paru,390,"DEVDOCS-5654 [new]: Page Widgets, add docs & reference",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],open,false,,[],,0,2024-07-23T16:53:40Z,2024-07-23T16:55:37Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/390,https://github.com/bigcommerce/docs/pull/390,https://github.com/bigcommerce/docs/pull/390.diff,https://github.com/bigcommerce/docs/pull/390.patch,,"# [DEVDOCS-5654] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Move Page Widgets docs from api-specs-repository to docs repository for GA + +## Release notes draft + +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. + + +## Anything else? +@bigcommerce/team-merchandising + + + +[DEVDOCS-5654]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5654?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/390/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/390/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/389,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/389/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/389/comments,https://api.github.com/repos/bigcommerce/docs/issues/389/events,https://github.com/bigcommerce/docs/issues/389,2425176247,I_kwDOI7BBSM6QjUC3,389,Schema anchor links not working,Dpschu2,22309201,MDQ6VXNlcjIyMzA5MjAx,https://avatars.githubusercontent.com/u/22309201?v=4,,https://api.github.com/users/Dpschu2,https://github.com/Dpschu2,https://api.github.com/users/Dpschu2/followers,https://api.github.com/users/Dpschu2/following{/other_user},https://api.github.com/users/Dpschu2/gists{/gist_id},https://api.github.com/users/Dpschu2/starred{/owner}{/repo},https://api.github.com/users/Dpschu2/subscriptions,https://api.github.com/users/Dpschu2/orgs,https://api.github.com/users/Dpschu2/repos,https://api.github.com/users/Dpschu2/events{/privacy},https://api.github.com/users/Dpschu2/received_events,User,false,[],open,false,,[],,0,2024-07-23T13:07:07Z,2024-07-23T13:07:07Z,,NONE,,,,,,,,"### What is the link to the page that needs updating? Provide multiple links if needed. + +https://developer.bigcommerce.com/docs/storefront/stencil/themes/context/object-reference/schemas#product + +### What needs to be documented? + +If you open the url anchor link for any schema below forms_contact, it will not work, most likely because that schema has not loaded yet. For example, if you go here: https://developer.bigcommerce.com/docs/storefront/stencil/themes/context/object-reference/schemas#product, it will only go down to forms_contact. This prevents me from sending documentation to other devs. + +### What is currently documented? + +Currently only scrolls to forms_contact.",https://api.github.com/repos/bigcommerce/docs/issues/389/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/389/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/388,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/388/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/388/comments,https://api.github.com/repos/bigcommerce/docs/issues/388/events,https://github.com/bigcommerce/docs/issues/388,2421658207,I_kwDOI7BBSM6QV5Jf,388,/v3/settings/store/locale docs suggest the endpoint is global only,JamieWT,124628155,U_kgDOB22suw,https://avatars.githubusercontent.com/u/124628155?v=4,,https://api.github.com/users/JamieWT,https://github.com/JamieWT,https://api.github.com/users/JamieWT/followers,https://api.github.com/users/JamieWT/following{/other_user},https://api.github.com/users/JamieWT/gists{/gist_id},https://api.github.com/users/JamieWT/starred{/owner}{/repo},https://api.github.com/users/JamieWT/subscriptions,https://api.github.com/users/JamieWT/orgs,https://api.github.com/users/JamieWT/repos,https://api.github.com/users/JamieWT/events{/privacy},https://api.github.com/users/JamieWT/received_events,User,false,[],closed,false,,[],,1,2024-07-21T23:57:18Z,2024-07-22T15:52:46Z,2024-07-22T15:52:46Z,NONE,,,,,,,,"### What is the link to the page that needs updating? Provide multiple links if needed. + +https://developer.bigcommerce.com/docs/rest-management/settings/store-locale#get-locale-settings + +### What needs to be documented? + +The docs don't mention that this endpoint doesn't just return global local settings, it will return channel-specific locale settings too. + +### What is currently documented? + +The docs say ""Returns global locale settings"" and there are no notes about the channel_id querystring parameter. However if you call this endpoint with a channel_id parameter, it will return the channel-specific locale config.",https://api.github.com/repos/bigcommerce/docs/issues/388/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/388/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/387,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/387/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/387/comments,https://api.github.com/repos/bigcommerce/docs/issues/387/events,https://github.com/bigcommerce/docs/issues/387,2420952598,I_kwDOI7BBSM6QTM4W,387,Upsert a Siteʼs Checkout URL - error when using example,cmeagher-rwy,76565030,MDQ6VXNlcjc2NTY1MDMw,https://avatars.githubusercontent.com/u/76565030?v=4,,https://api.github.com/users/cmeagher-rwy,https://github.com/cmeagher-rwy,https://api.github.com/users/cmeagher-rwy/followers,https://api.github.com/users/cmeagher-rwy/following{/other_user},https://api.github.com/users/cmeagher-rwy/gists{/gist_id},https://api.github.com/users/cmeagher-rwy/starred{/owner}{/repo},https://api.github.com/users/cmeagher-rwy/subscriptions,https://api.github.com/users/cmeagher-rwy/orgs,https://api.github.com/users/cmeagher-rwy/repos,https://api.github.com/users/cmeagher-rwy/events{/privacy},https://api.github.com/users/cmeagher-rwy/received_events,User,false,[],open,false,,[],,0,2024-07-20T15:51:28Z,2024-07-20T15:51:28Z,,NONE,,,,,,,,"### What is the link to the page that needs updating? Provide multiple links if needed. + +https://developer.bigcommerce.com/docs/rest-management/channels/site-checkout-url#upsert-a-site%CA%BCs-checkout-url + +### What needs to be documented? + +The `url` in the example is `https://checkout.kittens.mybigcommerce.com`, but if I send a request with my URL including the URL scheme I receive the error `Your checkout and storefront must be within the same main domain like 'main.com' and 'subdomain.main.com'`. + +I removed the scheme from the `url` and the request succeeded. + +Also I was originally sending the request with a scheme of `http`, because I used the example to [Create a Channel Site](https://developer.bigcommerce.com/docs/rest-management/channels/site#create-a-channel-site) first, but it seems `http` is ignored and `https` is always set - this is for good reason for sure, but it seems including the scheme in both examples is unnecessary. + +The examples should be updated to not include the scheme in the `url`. + +### What is currently documented? + +The example includes the URL scheme in `url`, but this caused an error when sending the request.",https://api.github.com/repos/bigcommerce/docs/issues/387/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/387/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/386,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/386/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/386/comments,https://api.github.com/repos/bigcommerce/docs/issues/386/events,https://github.com/bigcommerce/docs/pull/386,2420834713,PR_kwDOI7BBSM51_BVQ,386,[DEVDOCS-6033] - Arrange callback attributes in correct order,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-20T11:00:58Z,2024-07-23T16:45:36Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/386,https://github.com/bigcommerce/docs/pull/386,https://github.com/bigcommerce/docs/pull/386.diff,https://github.com/bigcommerce/docs/pull/386.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6033] Webhooks reference overhaul - Arrange callback attributes in correct order + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Arranged the order of attributes to be accurate with our payload format for the following events: +store/cart/abandoned +store/cart/converted +store/cart/couponApplied +store/cart/created +store/cart/deleted +store/cart/lineItem/created +store/cart/lineItem/updated +store/cart/lineItem/deleted +store/cart/updated +store/category/created +store/category/updated +store/category/deleted +store/customer/deleted +store/customer/address/created +store/customer/address/updated +store/customer/address/deleted +store/customer/payment/instrument/default/updated +store/information/updated +store/inventory/location/created +store/inventory/location/updated +store/modifier/updated +store/option/updated +store/order/archived +store/order/created +store/order/updated +store/order/message/created +store/order/refund/created +store/order/statusUpdated +store/product/created +store/product/updated +store/product/deleted +store/product/inventory/order/updated +store/product/inventory/updated +store/shipment/created +store/shipment/updated +store/shipment/deleted +store/sku/created +store/sku/updated +store/sku/deleted +store/sku/inventory/order/updated +store/sku/inventory/updated +store/subscriber/created +store/subscriber/updated +store/subscriber/deleted +* Note that other callbacks would have their order re-arranged by pull request for DEVDOCS-6029: +https://github.com/bigcommerce/docs/pull/380 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Re-ordered the attributes of callbacks in our documentation so they match the order of webhook payloads. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {@bc-traciporter} + + +[DEVDOCS-6033]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6033?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/386/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/386/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/385,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/385/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/385/comments,https://api.github.com/repos/bigcommerce/docs/issues/385/events,https://github.com/bigcommerce/docs/pull/385,2420798168,PR_kwDOI7BBSM51-5Fs,385,[DEVDOCS-6031] Add undocumented event types,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-20T10:12:28Z,2024-07-20T10:12:32Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/385,https://github.com/bigcommerce/docs/pull/385,https://github.com/bigcommerce/docs/pull/385.diff,https://github.com/bigcommerce/docs/pull/385.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6031] Webhooks reference overhaul - Add undocumented event types + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added the following events to the _all.yml list. +* Added a file for each of the following events, with accurate payload data. +store/customer/channel/login/access/updated +store/priceList/created +store/priceList/activated +store/priceList/deactivated +store/priceList/assignment/updated +store/priceList/record/created +store/priceList/record/updated +store/priceList/record/deleted +store/priceList/records/created +store/priceList/records/updated +store/priceList/records/deleted +store/product/price/updated +store/redirects/updated +store/store/metafield/created +store/store/metafield/updated +store/store/metafield/deleted + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Added undocumented events for: +* Customer channel login access updates +* Price lists, price list assignments and price list records +* 301 redirects +* Store metafields + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {@bc-traciporter} + + +[DEVDOCS-6031]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6031?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/385/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/385/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/384,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/384/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/384/comments,https://api.github.com/repos/bigcommerce/docs/issues/384/events,https://github.com/bigcommerce/docs/pull/384,2420766545,PR_kwDOI7BBSM51-x_h,384,Update formatting field `date_modified:max` in customers.v2.yml,sandip5678,18615735,MDQ6VXNlcjE4NjE1NzM1,https://avatars.githubusercontent.com/u/18615735?v=4,,https://api.github.com/users/sandip5678,https://github.com/sandip5678,https://api.github.com/users/sandip5678/followers,https://api.github.com/users/sandip5678/following{/other_user},https://api.github.com/users/sandip5678/gists{/gist_id},https://api.github.com/users/sandip5678/starred{/owner}{/repo},https://api.github.com/users/sandip5678/subscriptions,https://api.github.com/users/sandip5678/orgs,https://api.github.com/users/sandip5678/repos,https://api.github.com/users/sandip5678/events{/privacy},https://api.github.com/users/sandip5678/received_events,User,false,[],open,false,,[],,0,2024-07-20T09:31:31Z,2024-07-20T09:31:31Z,,FIRST_TIME_CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/384,https://github.com/bigcommerce/docs/pull/384,https://github.com/bigcommerce/docs/pull/384.diff,https://github.com/bigcommerce/docs/pull/384.patch,,"Minor formatting on `date_modified:max` + +<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Extra ` removed in field `date_modified:max` +* From +![before-format](https://github.com/user-attachments/assets/d7708d31-a707-47d9-b56f-fd4394f616dd) + +* To +![after](https://github.com/user-attachments/assets/b2f70d33-efd1-4ec9-83e4-2d141291a816) + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +",https://api.github.com/repos/bigcommerce/docs/issues/384/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/384/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/383,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/383/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/383/comments,https://api.github.com/repos/bigcommerce/docs/issues/383/events,https://github.com/bigcommerce/docs/pull/383,2419830784,PR_kwDOI7BBSM518cA2,383,DEVDOCS-6024: [TEST SPEC] changes from testing this endpoint,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],open,false,,[],,0,2024-07-19T20:50:17Z,2024-07-19T20:50:20Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/383,https://github.com/bigcommerce/docs/pull/383,https://github.com/bigcommerce/docs/pull/383.diff,https://github.com/bigcommerce/docs/pull/383.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6024] + + +## What changed? +Made changes based on my testing. + +Outstanding issues: +1. The `is_featured` query parameter does not work as documented. Entering ""1"" or ""true"" does not work. +2. What field does the query parameter `inventory_low` related to? Is this the same as `inventory_warning_level`. +3. What field does the query paramter `out_of_stock` related to? +4. The values for the `keyword_context` query parameter give the same result. +5. What are the accepted values for the `status` query parameter? + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/383/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/383/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/382,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/382/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/382/comments,https://api.github.com/repos/bigcommerce/docs/issues/382/events,https://github.com/bigcommerce/docs/pull/382,2419802304,PR_kwDOI7BBSM518Vp0,382,"DEVDOCS-4695 [new]: Store-level API accounts, add authorized users",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-07-19T20:27:49Z,2024-07-23T17:28:25Z,2024-07-23T17:28:23Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/382,https://github.com/bigcommerce/docs/pull/382,https://github.com/bigcommerce/docs/pull/382.diff,https://github.com/bigcommerce/docs/pull/382.patch,2024-07-23T17:28:23Z,"# [DEVDOCS-4695] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Edit wording to include that authorized users (not just store owners) can manage API accounts + +## Release notes draft + +* We're happy to announce [X feature], which can help you [perform Y action]. + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + + + + +[DEVDOCS-4695]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4695?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/382/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/382/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/381,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/381/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/381/comments,https://api.github.com/repos/bigcommerce/docs/issues/381/events,https://github.com/bigcommerce/docs/pull/381,2419260721,PR_kwDOI7BBSM516pss,381,Devdocs 6030 remove store/order/transaction/updated callback,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,"[{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",open,false,,[],,1,2024-07-19T15:58:31Z,2024-07-23T16:36:19Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/381,https://github.com/bigcommerce/docs/pull/381,https://github.com/bigcommerce/docs/pull/381.diff,https://github.com/bigcommerce/docs/pull/381.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6030] Remove store/order/transaction/updated callback + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Deleted store/order/transaction/updated YAML file +* Removed store/order/transaction/updated from callbacks list + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Removed invalid event store/order/transaction/updated from documentation + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {@bc-traciporter} + + +[DEVDOCS-6030]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6030?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/381/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/381/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/380,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/380/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/380/comments,https://api.github.com/repos/bigcommerce/docs/issues/380/events,https://github.com/bigcommerce/docs/pull/380,2419248693,PR_kwDOI7BBSM516nCm,380,Devdocs 6029 fix attributes missing from/added by the documentation,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,1,2024-07-19T15:50:15Z,2024-07-22T18:14:37Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/380,https://github.com/bigcommerce/docs/pull/380,https://github.com/bigcommerce/docs/pull/380.diff,https://github.com/bigcommerce/docs/pull/380.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6029] Webhooks reference overhaul - Fix attributes missing from/added by the documentation + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Removed `id` from store/app/uninstalled +* Added `namespace` to: +store/brand/metafield/created +store/brand/metafield/deleted +store/brand/metafield/updated +store/cart/metafield/created +store/cart/metafield/deleted +store/cart/metafield/updated +store/category/metafield/created +store/category/metafield/updated +store/category/metafield/deleted +store/channel/metafield/created +store/channel/metafield/updated +store/channel/metafield/deleted +store/inventory/location/metafield/created +store/inventory/location/metafield/updated +store/inventory/location/metafield/deleted +store/metafield/created +store/metafield/updated +store/metafield/deleted +store/order/metafield/created +store/order/metafield/updated +store/order/metafield/deleted +*Added `namespace` to and removed `resource_type` from: +store/product/metafield/created +store/product/metafield/updated +store/product/metafield/deleted +*Added `namespace` to, removed `resource_type` from, and correct scope name for: +store/product/variant/metafield/created +store/product/variant/metafield/updated +store/product/variant/metafield/deleted +*Added `origin_channel_id` and `channel_ids` to: +store/customer/created +store/customer/updated +*Added `platform_transaction_id` and `provider_transaction_id` to store/order/transaction/created +*For all events above, re-arranged the order of attributes so they're accurate with the order of actual payloads + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* All metafield events now correctly include the namespace attribute. +* Customer created and updated events now correctly include channel attributes. +* Transaction created events now correctly include platform and provider transaction ID attributes. +* Product and Variant metafield events no longer include an incorrect resource_type attribute. +* Variant metafield events now present the correct scope name. +* The app uninstalled event no longer includes an incorrect id attribute. +* All above events now list attributes in the correct order + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {traci porter} + + +[DEVDOCS-6029]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6029?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/380/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/380/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/379,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/379/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/379/comments,https://api.github.com/repos/bigcommerce/docs/issues/379/events,https://github.com/bigcommerce/docs/pull/379,2416878668,PR_kwDOI7BBSM51zc1n,379,"DEVDOCS-6000 [new]: GQL Storefront API, add dev_mode field",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,"[{""id"":6477243721,""node_id"":""LA_kwDOI7BBSM8AAAABghLlSQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-css-cue"",""name"":""awaiting-css-cue"",""color"":""492E5F"",""default"":false,""description"":""""}]",open,false,,[],,0,2024-07-18T16:22:42Z,2024-07-23T17:22:33Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/379,https://github.com/bigcommerce/docs/pull/379,https://github.com/bigcommerce/docs/pull/379.diff,https://github.com/bigcommerce/docs/pull/379.patch,,"# [DEVDOCS-6000] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add `dev_mode` field to the Create a Token & Create a Customer Impersonation Token endpoint (for GQL Storefront API) + +## Release notes draft +* We're happy to announce the `dev_mode` field, which allows you to create [GraphQL Storefront tokens](https://developer.bigcommerce.com/docs/rest-authentication/tokens#create-a-token) and [customer impersonation tokens ](https://developer.bigcommerce.com/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token)that can perform login and logout mutations when a storefront channel is not active. + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-6000]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6000?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/379/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/379/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/378,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/378/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/378/comments,https://api.github.com/repos/bigcommerce/docs/issues/378/events,https://github.com/bigcommerce/docs/pull/378,2414363778,PR_kwDOI7BBSM51rscB,378,DEVDOCS-5780: [update] Added TD Online Mart,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-17T19:11:56Z,2024-07-23T13:07:01Z,2024-07-23T13:06:59Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/378,https://github.com/bigcommerce/docs/pull/378,https://github.com/bigcommerce/docs/pull/378.diff,https://github.com/bigcommerce/docs/pull/378.patch,2024-07-23T13:06:59Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5780] + + +## What changed? +Added TD Online Mart to the list of compatible payment gateways for both Stored Instruments and Raw Card Data + +## Release notes draft +We're happy to announce that TD Online Mart is supported for both Stored Instruments and Raw Card Data. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5780]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5780?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/378/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/378/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/377,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/377/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/377/comments,https://api.github.com/repos/bigcommerce/docs/issues/377/events,https://github.com/bigcommerce/docs/issues/377,2411377783,I_kwDOI7BBSM6PurR3,377,https://developer.bigcommerce.com/docs/rest-authentication/tokens#create-a-token bad example request,pcfco-kmason,83259051,MDQ6VXNlcjgzMjU5MDUx,https://avatars.githubusercontent.com/u/83259051?v=4,,https://api.github.com/users/pcfco-kmason,https://github.com/pcfco-kmason,https://api.github.com/users/pcfco-kmason/followers,https://api.github.com/users/pcfco-kmason/following{/other_user},https://api.github.com/users/pcfco-kmason/gists{/gist_id},https://api.github.com/users/pcfco-kmason/starred{/owner}{/repo},https://api.github.com/users/pcfco-kmason/subscriptions,https://api.github.com/users/pcfco-kmason/orgs,https://api.github.com/users/pcfco-kmason/repos,https://api.github.com/users/pcfco-kmason/events{/privacy},https://api.github.com/users/pcfco-kmason/received_events,User,false,[],open,false,,[],,0,2024-07-16T14:55:14Z,2024-07-16T14:56:30Z,,NONE,,,,,,,,"### What is the link to the page that needs updating? Provide multiple links if needed. + +example has trailing slash in allowed_cors_origins + +### What needs to be documented? + +remove the trailing slash in the example for allowed_cors_origins: + +{ + ""allowed_cors_origins"": [ + ""https://www.yourstorefront.com"" + ], + ""channel_id"": 1, + ""expires_at"": 1885635176 +} +response when using example: +{ + ""status"": 422, + ""title"": ""The following fields are invalid: allowed_cors_origins:has_invalid_suffix"", + ""type"": ""https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes"", + ""errors"": { + ""allowed_cors_origins:has_invalid_suffix"": ""A supplied origin has a trailing slash or other special character following the end of the domain. Please remove any trailing characters in supplied origins."" + } +} + +### What is currently documented? + +{ + ""allowed_cors_origins"": [ + ""https://www.yourstorefront.com/"" + ], + ""channel_id"": 1, + ""expires_at"": 1885635176 +}",https://api.github.com/repos/bigcommerce/docs/issues/377/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/377/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/376,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/376/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/376/comments,https://api.github.com/repos/bigcommerce/docs/issues/376/events,https://github.com/bigcommerce/docs/pull/376,2409243232,PR_kwDOI7BBSM51af5X,376,"DEVDOCS-5558 [new]: Widget theme regions, add channel_id query parameter",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],open,false,,[],,0,2024-07-15T17:19:35Z,2024-07-15T17:23:51Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/376,https://github.com/bigcommerce/docs/pull/376,https://github.com/bigcommerce/docs/pull/376.diff,https://github.com/bigcommerce/docs/pull/376.patch,,"# [DEVDOCS-5558] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add channel_id query parameter to Get Theme Regions endpoint + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +* Updated the [Get Theme Regions](https://developer.bigcommerce.com/docs/rest-content/widgets/regions) endpoint to include the `channel_id` query parameter. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +@bigcommerce/team-merchandising + + +[DEVDOCS-5558]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5558?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/376/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/376/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/375,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/375/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/375/comments,https://api.github.com/repos/bigcommerce/docs/issues/375/events,https://github.com/bigcommerce/docs/pull/375,2407334497,PR_kwDOI7BBSM51UCqu,375,[DEVDOCS-6014] Remove inconsistent enum for order payment_method,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-14T08:52:44Z,2024-07-14T08:52:44Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/375,https://github.com/bigcommerce/docs/pull/375,https://github.com/bigcommerce/docs/pull/375.diff,https://github.com/bigcommerce/docs/pull/375.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] Remove inconsistent enum for order payment_method + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Removed inconsistent / misleading enum list from order `payment_method` parameter / attribute. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Removed enum list from order `payment_method` parameter / attribute in POST and GET calls. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* Order `payment_method` parameter / attribute was inconsistent because: +* - Enum list was included everywhere but PUT request +* Order `payment_method` parameter / attribute was misleading because: +* - Enum list suggested you had limited allowed values, when the parameter is fully writable. +",https://api.github.com/repos/bigcommerce/docs/issues/375/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/375/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/374,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/374/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/374/comments,https://api.github.com/repos/bigcommerce/docs/issues/374/events,https://github.com/bigcommerce/docs/pull/374,2407280655,PR_kwDOI7BBSM51T33E,374,DEVDOCS-6013 Document supported parameters for Order Count method,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-14T05:56:08Z,2024-07-14T05:58:35Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/374,https://github.com/bigcommerce/docs/pull/374,https://github.com/bigcommerce/docs/pull/374.diff,https://github.com/bigcommerce/docs/pull/374.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6013] Document supported parameters for Order Count method + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added accepted parameters for Orders count method + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Added accepted parameters for Orders count method + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +* Note that some of these parameters are irrelevant to this method and will be ignored (e.g. `limit` and `page`) +* Could be partially blocked by ORDERS-6007 (issue with `is_deleted` param not showing up on devdoc frontend) + + +[DEVDOCS-6013]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6013?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/374/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/374/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/373,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/373/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/373/comments,https://api.github.com/repos/bigcommerce/docs/issues/373/events,https://github.com/bigcommerce/docs/pull/373,2405886350,PR_kwDOI7BBSM51POWC,373,"[No ticket] Correction, Fix sentence case header",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,,[],,0,2024-07-12T15:42:24Z,2024-07-12T15:46:39Z,2024-07-12T15:46:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/373,https://github.com/bigcommerce/docs/pull/373,https://github.com/bigcommerce/docs/pull/373.diff,https://github.com/bigcommerce/docs/pull/373.patch,2024-07-12T15:46:38Z,"<!-- Ticket number or summary of work --> +No Ticket + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Fix title to match sentence casing rules + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/373/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/373/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/372,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/372/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/372/comments,https://api.github.com/repos/bigcommerce/docs/issues/372/events,https://github.com/bigcommerce/docs/pull/372,2403685843,PR_kwDOI7BBSM51H4vw,372,"[DEVDOCS-5910]: [remove] Best Practices, Remove API limit content from the Development doc",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-07-11T17:23:01Z,2024-07-11T19:52:06Z,2024-07-11T19:52:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/372,https://github.com/bigcommerce/docs/pull/372,https://github.com/bigcommerce/docs/pull/372.diff,https://github.com/bigcommerce/docs/pull/372.patch,2024-07-11T19:52:03Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5910] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Removed API rate limiting content from the doc as a new file exists around [API rate limits](https://developer.bigcommerce.com/docs/start/best-practices/api-rate-limits) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Removed API rate limit content from the Best Practices section to streamline documentation and improve clarity for developers. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5910]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5910?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/372/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/372/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/371,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/371/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/371/comments,https://api.github.com/repos/bigcommerce/docs/issues/371/events,https://github.com/bigcommerce/docs/pull/371,2403560387,PR_kwDOI7BBSM51HdHo,371,DEVDOCS-5957: Revert Admin GQL API's custom fields,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-07-11T16:07:19Z,2024-07-11T16:12:11Z,2024-07-11T16:12:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/371,https://github.com/bigcommerce/docs/pull/371,https://github.com/bigcommerce/docs/pull/371.diff,https://github.com/bigcommerce/docs/pull/371.patch,2024-07-11T16:12:09Z,"# [DEVDOCS-5957] + +P&E team needs the doc changes temporarily reverted +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Revert Admin GQL API's custom fields, from [PR 347](https://github.com/bigcommerce/docs/pull/347), under P&E's discretion + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +Goes hand in hand with [PR 946](https://github.com/bigcommerce/developer-center/pull/946) + + +[DEVDOCS-5957]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5957?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/371/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/371/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/370,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/370/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/370/comments,https://api.github.com/repos/bigcommerce/docs/issues/370/events,https://github.com/bigcommerce/docs/pull/370,2402022214,PR_kwDOI7BBSM51CORO,370,PROMO-1051: [add] Promotion Settings v3 REST contract,jpajar,45197791,MDQ6VXNlcjQ1MTk3Nzkx,https://avatars.githubusercontent.com/u/45197791?v=4,,https://api.github.com/users/jpajar,https://github.com/jpajar,https://api.github.com/users/jpajar/followers,https://api.github.com/users/jpajar/following{/other_user},https://api.github.com/users/jpajar/gists{/gist_id},https://api.github.com/users/jpajar/starred{/owner}{/repo},https://api.github.com/users/jpajar/subscriptions,https://api.github.com/users/jpajar/orgs,https://api.github.com/users/jpajar/repos,https://api.github.com/users/jpajar/events{/privacy},https://api.github.com/users/jpajar/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""}]",open,false,,[],,4,2024-07-11T01:27:46Z,2024-07-22T13:51:13Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/370,https://github.com/bigcommerce/docs/pull/370,https://github.com/bigcommerce/docs/pull/370.diff,https://github.com/bigcommerce/docs/pull/370.patch,,"<!-- Ticket number or summary of work --> +# [PROMO-1051] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added documentation for future Promotion Settings REST API + +## Release notes draft +* Added documentation for future Promotion Settings REST API + + + +[PROMO-1051]: https://bigcommercecloud.atlassian.net/browse/PROMO-1051?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/370/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/370/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/369,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/369/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/369/comments,https://api.github.com/repos/bigcommerce/docs/issues/369/events,https://github.com/bigcommerce/docs/pull/369,2401332702,PR_kwDOI7BBSM50_8P7,369,DEVDOCS-5988: [update] Update shopPath definition,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-10T17:42:45Z,2024-07-15T17:28:56Z,2024-07-15T17:28:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/369,https://github.com/bigcommerce/docs/pull/369,https://github.com/bigcommerce/docs/pull/369.diff,https://github.com/bigcommerce/docs/pull/369.patch,2024-07-15T17:28:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5988] + + +## What changed? +Added note to the shopPath variable + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5988]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5988?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/369/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/369/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/368,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/368/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/368/comments,https://api.github.com/repos/bigcommerce/docs/issues/368/events,https://github.com/bigcommerce/docs/pull/368,2401089577,PR_kwDOI7BBSM50_GWH,368,"DEVDOCS-5999 [new]: GQL SF API, GQL token multiple channels",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-07-10T15:36:51Z,2024-07-16T18:04:27Z,2024-07-16T18:04:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/368,https://github.com/bigcommerce/docs/pull/368,https://github.com/bigcommerce/docs/pull/368.diff,https://github.com/bigcommerce/docs/pull/368.patch,2024-07-16T18:04:25Z,"# [DEVDOCS-5999] + +## What changed? +* Update reference & docs to mention that GQL Storefront API token & Customer Impersonation Tokens can be created for multiple channels + +## Release notes draft + +* We're happy to announce that you can now create [GraphQL Storefront API Tokens](https://developer.bigcommerce.com/docs/rest-authentication/tokens) that are valid for multiple channels. For more information, see [Create a Storefront API token](https://developer.bigcommerce.com/docs/rest-authentication/tokens#create-a-token) and [Create a Customer Impersonation Token](https://developer.bigcommerce.com/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token). + +[DEVDOCS-5999]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5999?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/368/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/368/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/367,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/367/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/367/comments,https://api.github.com/repos/bigcommerce/docs/issues/367/events,https://github.com/bigcommerce/docs/pull/367,2398772888,PR_kwDOI7BBSM503S-e,367,"DEVDOCS-5957 [new]: MSF International Enhancements, edit custom_fields",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-07-09T17:27:33Z,2024-07-10T17:00:45Z,2024-07-10T17:00:43Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/367,https://github.com/bigcommerce/docs/pull/367,https://github.com/bigcommerce/docs/pull/367.diff,https://github.com/bigcommerce/docs/pull/367.patch,2024-07-10T17:00:43Z,"# [DEVDOCS-5957] + + +## What changed? +* Peer review for [PR 347](https://github.com/bigcommerce/docs/pull/347) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5957]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5957?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/367/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/367/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/366,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/366/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/366/comments,https://api.github.com/repos/bigcommerce/docs/issues/366/events,https://github.com/bigcommerce/docs/pull/366,2396582629,PR_kwDOI7BBSM50vwY3,366,"DEVDOCS-5142 [new]: Apps, update MLI-compatibility requirements",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-07-08T21:12:38Z,2024-07-16T15:15:49Z,2024-07-16T15:15:47Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/366,https://github.com/bigcommerce/docs/pull/366,https://github.com/bigcommerce/docs/pull/366.diff,https://github.com/bigcommerce/docs/pull/366.patch,2024-07-16T15:15:47Z,"# [DEVDOCS-5142] + + +## What changed? +* Add MLI-compatibility requirements into BOPIS FAQs +* Update screenshot for dev portal + +## Release notes draft +* Apps that are compatible with multi-location inventory use our Inventory API for inventory adjustments. Now, you can indicate whether an app is MLI-compatible when you submit an app in the Dev Portal. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + + + +[DEVDOCS-5142]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5142?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/366/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/366/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/365,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/365/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/365/comments,https://api.github.com/repos/bigcommerce/docs/issues/365/events,https://github.com/bigcommerce/docs/pull/365,2396559020,PR_kwDOI7BBSM50vrLv,365,DEVDOCS-5923: [update] add customer access token,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",open,false,,[],,2,2024-07-08T20:58:54Z,2024-07-23T15:26:44Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/365,https://github.com/bigcommerce/docs/pull/365,https://github.com/bigcommerce/docs/pull/365.diff,https://github.com/bigcommerce/docs/pull/365.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5923] + + +## What changed? +Added customer access token to documentation + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5923]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5923?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/365/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/365/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/364,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/364/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/364/comments,https://api.github.com/repos/bigcommerce/docs/issues/364/events,https://github.com/bigcommerce/docs/pull/364,2396046689,PR_kwDOI7BBSM50t6bg,364,DEVDOCS-5996: [Update] channel ID is no longer a requirement for toke…,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-08T16:16:10Z,2024-07-11T20:32:19Z,2024-07-11T20:32:17Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/364,https://github.com/bigcommerce/docs/pull/364,https://github.com/bigcommerce/docs/pull/364.diff,https://github.com/bigcommerce/docs/pull/364.patch,2024-07-11T20:32:17Z,"…n creation + +<!-- Ticket number or summary of work --> +# [DEVDOCS-5996] + + +## What changed? + +* removed text regarding the requirement to enter a channel ID when creating a Storefront token +* Fixed incorrect example +* Created a ticket to remove duplicated request fields. + +## Release notes draft + +We're happy to announce that you can use a channel ID or channel IDs when creating a Storefront token. (needs review) + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5996]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5996?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/364/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/364/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/363,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/363/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/363/comments,https://api.github.com/repos/bigcommerce/docs/issues/363/events,https://github.com/bigcommerce/docs/pull/363,2394146342,PR_kwDOI7BBSM50nhET,363,[DEVDOCS-6010] Remove pagination object for Themes API,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],closed,false,,[],,0,2024-07-07T17:32:39Z,2024-07-12T13:45:56Z,2024-07-12T13:45:55Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/363,https://github.com/bigcommerce/docs/pull/363,https://github.com/bigcommerce/docs/pull/363.diff,https://github.com/bigcommerce/docs/pull/363.patch,2024-07-12T13:45:55Z,"Replacing all pagination objects with empty meta object (copied from email_templates.v3.yml) + +<!-- Ticket number or summary of work --> +# [DEVDOCS-6010] Remove pagination object for Themes API + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Removed all pagination objects and replaced them with empty meta object (copied from email_templates.v3.yml) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Removed pagination object from [GET All Themes API call](https://developer.bigcommerce.com/docs/rest-content/themes#get-all-themes) + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + + + + +[DEVDOCS-6010]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6010?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/363/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/363/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/362,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/362/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/362/comments,https://api.github.com/repos/bigcommerce/docs/issues/362/events,https://github.com/bigcommerce/docs/pull/362,2394132641,PR_kwDOI7BBSM50neZO,362,Changed order_source description,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-07T16:55:27Z,2024-07-22T16:47:43Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/362,https://github.com/bigcommerce/docs/pull/362,https://github.com/bigcommerce/docs/pull/362.diff,https://github.com/bigcommerce/docs/pull/362.patch,,"Changed order_source description from order_RespOnly Added enum object for allowed values + +<!-- Ticket number or summary of work --> +# [DEVDOCS-6009] Re-work of order_source parameter description + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Changed description of `order_source` parameter in order_RespOnly YAML object. +* Note that this is currently the only location of the `order_source` description, however there could be more if DEVDOCS-6008 has been merged. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Re-worked `order_source` description to be more specific as to what values can be set for each origin. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +May need more changes if DEVDOCS-6008 has been merged ahead of it. + + +[DEVDOCS-6009]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6009?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/362/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/362/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/361,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/361/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/361/comments,https://api.github.com/repos/bigcommerce/docs/issues/361/events,https://github.com/bigcommerce/docs/pull/361,2394117438,PR_kwDOI7BBSM50nbbq,361,Add copy of order_source for POST/PUT request params,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-07T16:13:50Z,2024-07-07T16:13:54Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/361,https://github.com/bigcommerce/docs/pull/361,https://github.com/bigcommerce/docs/pull/361.diff,https://github.com/bigcommerce/docs/pull/361.patch,,"Copied existing content for `order_source` attribute to show as request param for POST/PUT requests. + +<!-- Ticket number or summary of work --> +# [DEVDOCS-6008] `order_source` missing from request parameters + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Addition of `order_source` as a request parameter for Order [POST](https://developer.bigcommerce.com/docs/rest-management/orders#create-an-order)/[PUT ](https://developer.bigcommerce.com/docs/rest-management/orders#update-an-order) requests. +* Added in order_Put an order_Shared YAML objects. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Addition of `order_source` as a request parameter for Order [POST](https://developer.bigcommerce.com/docs/rest-management/orders#create-an-order)/[PUT ](https://developer.bigcommerce.com/docs/rest-management/orders#update-an-order) requests. + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* Twined with DEVDOCS-6009: Re-work of order_source parameter description + + + +[DEVDOCS-6008]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6008?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/361/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/361/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/360,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/360/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/360/comments,https://api.github.com/repos/bigcommerce/docs/issues/360/events,https://github.com/bigcommerce/docs/pull/360,2394094489,PR_kwDOI7BBSM50nWz9,360,[DEVDOCS-6006] Document is_deleted flag for Orders,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],open,false,,[],,0,2024-07-07T15:09:55Z,2024-07-07T15:09:59Z,,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/360,https://github.com/bigcommerce/docs/pull/360,https://github.com/bigcommerce/docs/pull/360.diff,https://github.com/bigcommerce/docs/pull/360.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6006] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added `is_deleted` flag to order response attributes for [POST](https://developer.bigcommerce.com/docs/rest-management/orders#create-an-order), [PUT](https://developer.bigcommerce.com/docs/rest-management/orders#update-an-order), [GET ](https://developer.bigcommerce.com/docs/rest-management/orders#get-an-order)and[ GET all](https://developer.bigcommerce.com/docs/rest-management/orders#get-all-orders) calls +* Response body attributes map to order_RespOnly YAML object + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Documentation for `is_deleted` flag in V2 Orders API + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +*Twined with DEVDOCS-6007 - Investigate missing `is_deleted` parameter/attribute in Orders documentation + + + +[DEVDOCS-6006]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6006?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/360/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/360/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/359,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/359/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/359/comments,https://api.github.com/repos/bigcommerce/docs/issues/359/events,https://github.com/bigcommerce/docs/pull/359,2388708285,PR_kwDOI7BBSM50VMIA,359,Add cart redirect url expiration time,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-07-03T13:53:43Z,2024-07-03T15:45:09Z,2024-07-03T15:45:07Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/359,https://github.com/bigcommerce/docs/pull/359,https://github.com/bigcommerce/docs/pull/359.diff,https://github.com/bigcommerce/docs/pull/359.patch,2024-07-03T15:45:07Z,"<!-- Ticket number or summary of work --> +# NO Ticket + + +## What changed? +Add the redirect URL expiration time + +See slack conversation: https://bigcommerce.slack.com/archives/C0WC9CSJX/p1719949652260899 + +## Release notes draft + +Added clarification for how long the cart redirect url is active. +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/359/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/359/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/358,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/358/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/358/comments,https://api.github.com/repos/bigcommerce/docs/issues/358/events,https://github.com/bigcommerce/docs/pull/358,2387450179,PR_kwDOI7BBSM50Q4k7,358,PROMO-1050 Add shipping discount action,bc-luke,2160087,MDQ6VXNlcjIxNjAwODc=,https://avatars.githubusercontent.com/u/2160087?v=4,,https://api.github.com/users/bc-luke,https://github.com/bc-luke,https://api.github.com/users/bc-luke/followers,https://api.github.com/users/bc-luke/following{/other_user},https://api.github.com/users/bc-luke/gists{/gist_id},https://api.github.com/users/bc-luke/starred{/owner}{/repo},https://api.github.com/users/bc-luke/subscriptions,https://api.github.com/users/bc-luke/orgs,https://api.github.com/users/bc-luke/repos,https://api.github.com/users/bc-luke/events{/privacy},https://api.github.com/users/bc-luke/received_events,User,false,[],open,false,,[],,0,2024-07-03T01:33:46Z,2024-07-15T05:43:09Z,,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/358,https://github.com/bigcommerce/docs/pull/358,https://github.com/bigcommerce/docs/pull/358.diff,https://github.com/bigcommerce/docs/pull/358.patch,,"<!-- Ticket number or summary of work --> +# [PROMO-1050] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add new shipping discount action, which can + * apply to some or all shipping methods + * provide a $ or % discount to the shipping cost + +This is based on the [mockup](https://www.figma.com/design/McOjm58nJwRzNxOLo3fx36Ua/%E2%9C%8D%EF%B8%8F-Promotions?node-id=4238-64079&t=hITuS9L4C4PMa7NM-0) shown here: + +<img width=""1131"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/2160087/d77c8a69-0017-4519-8906-eedca291150b""> + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + +TBC + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[PROMO-1050]: https://bigcommercecloud.atlassian.net/browse/PROMO-1050?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/358/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/358/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/357,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/357/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/357/comments,https://api.github.com/repos/bigcommerce/docs/issues/357/events,https://github.com/bigcommerce/docs/pull/357,2387110038,PR_kwDOI7BBSM50Ptv6,357,DEVDOCS-6004 [update] add fields for bulk_discount_rates & fix errors in file,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-02T20:28:28Z,2024-07-03T15:42:33Z,2024-07-03T15:42:32Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/357,https://github.com/bigcommerce/docs/pull/357,https://github.com/bigcommerce/docs/pull/357.diff,https://github.com/bigcommerce/docs/pull/357.patch,2024-07-03T15:42:32Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6004] + + +## What changed? +Bug Fix: Added missing information + +Screenshot of the missing information is in the ticket. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-6004]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6004?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/357/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/357/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/356,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/356/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/356/comments,https://api.github.com/repos/bigcommerce/docs/issues/356/events,https://github.com/bigcommerce/docs/pull/356,2384725573,PR_kwDOI7BBSM50HjLy,356,DEVDOCS-5990: [update] Update Add discount to checkout schema and example,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-01T20:57:05Z,2024-07-03T15:38:41Z,2024-07-03T15:38:40Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/356,https://github.com/bigcommerce/docs/pull/356,https://github.com/bigcommerce/docs/pull/356.diff,https://github.com/bigcommerce/docs/pull/356.patch,2024-07-03T15:38:40Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5990] + + +## What changed? +Correct example and schema for Checkout Discounts + +Chad Taylor approved the changes. See screenshot attached to the ticket. + +## Release notes draft + +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5990]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5990?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/356/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/356/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/355,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/355/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/355/comments,https://api.github.com/repos/bigcommerce/docs/issues/355/events,https://github.com/bigcommerce/docs/pull/355,2384464667,PR_kwDOI7BBSM50GrfX,355,DEVDOCS-6003 [Update] add token expiration time,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-07-01T18:19:49Z,2024-07-03T15:44:35Z,2024-07-03T15:44:33Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/355,https://github.com/bigcommerce/docs/pull/355,https://github.com/bigcommerce/docs/pull/355.diff,https://github.com/bigcommerce/docs/pull/355.patch,2024-07-03T15:44:33Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-6003] + + +## What changed? + +* Added the expiration time for the PAT token. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-6003]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6003?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/355/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/355/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/354,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/354/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/354/comments,https://api.github.com/repos/bigcommerce/docs/issues/354/events,https://github.com/bigcommerce/docs/pull/354,2378991588,PR_kwDOI7BBSM5z0SQu,354,DEVDOCS-5458 [new]: Caching best practices,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-06-27T19:59:42Z,2024-07-18T19:23:55Z,2024-07-18T19:23:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/354,https://github.com/bigcommerce/docs/pull/354,https://github.com/bigcommerce/docs/pull/354.diff,https://github.com/bigcommerce/docs/pull/354.patch,,"# [DEVDOCS-5458] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add caching best practices article under the Getting Started Section + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5458]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5458?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/354/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/354/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/353,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/353/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/353/comments,https://api.github.com/repos/bigcommerce/docs/issues/353/events,https://github.com/bigcommerce/docs/pull/353,2376567100,PR_kwDOI7BBSM5zsz6x,353,Update bulk pricing tiers documentation to cover `null` case,IamDavidovich,1845397,MDQ6VXNlcjE4NDUzOTc=,https://avatars.githubusercontent.com/u/1845397?v=4,,https://api.github.com/users/IamDavidovich,https://github.com/IamDavidovich,https://api.github.com/users/IamDavidovich/followers,https://api.github.com/users/IamDavidovich/following{/other_user},https://api.github.com/users/IamDavidovich/gists{/gist_id},https://api.github.com/users/IamDavidovich/starred{/owner}{/repo},https://api.github.com/users/IamDavidovich/subscriptions,https://api.github.com/users/IamDavidovich/orgs,https://api.github.com/users/IamDavidovich/repos,https://api.github.com/users/IamDavidovich/events{/privacy},https://api.github.com/users/IamDavidovich/received_events,User,false,[],closed,false,,[],,2,2024-06-27T02:17:25Z,2024-07-04T01:33:57Z,2024-07-04T01:33:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/353,https://github.com/bigcommerce/docs/pull/353,https://github.com/bigcommerce/docs/pull/353.diff,https://github.com/bigcommerce/docs/pull/353.patch,2024-07-04T01:33:55Z,"Update schemas for pricelist bulk tiers to cover that `null` may be returned when there is no upper limit on the quantity for a given tier. + +## What changed? + +* Update schemas for pricelist bulk tiers to cover that `null` may be returned when there is no upper limit on the quantity for a given tier. +* Unrelatedly, add a `'` to ""this tiers pricing"" since it's a possessive rather than a plural. + +## Release notes draft +* Clarified documentation for pricelist bulk tier pricing to explain tiers with no upper quantity limit. + +## Anything else? +Nope 😄 +",https://api.github.com/repos/bigcommerce/docs/issues/353/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/353/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/352,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/352/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/352/comments,https://api.github.com/repos/bigcommerce/docs/issues/352/events,https://github.com/bigcommerce/docs/pull/352,2373243622,PR_kwDOI7BBSM5zhyQl,352,"DEVDOCS-5997: International Enhancements for MSF, update `properties` field for channel locale only",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-25T17:27:44Z,2024-07-01T15:44:18Z,2024-07-01T15:44:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/352,https://github.com/bigcommerce/docs/pull/352,https://github.com/bigcommerce/docs/pull/352.diff,https://github.com/bigcommerce/docs/pull/352.patch,2024-07-01T15:44:16Z,"# [DEVDOCS-5997](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5997) & [DEVDOCS-5791](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5976) + + +## What changed? +* Mention that `properties` field is for channel locale only +* Link back to MSF International Enhancements overview (so developers know currently, the only way to update the overrides is through the GQL Admin API) + +* This PR also fixes a yml file error that prevents the `store/product/updated` schema from rendering properly on the DevCenter site + +## Release notes draft + +n / a + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + + + + + +[DEVDOCS-5997]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5997?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +[DEVDOCS-5791]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5791?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/352/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/352/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/351,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/351/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/351/comments,https://api.github.com/repos/bigcommerce/docs/issues/351/events,https://github.com/bigcommerce/docs/pull/351,2372803461,PR_kwDOI7BBSM5zgT6H,351,SELFDEV-626 Change PUT site's routes body to array,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,1,2024-06-25T14:08:48Z,2024-06-25T21:24:32Z,2024-06-25T21:24:31Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/351,https://github.com/bigcommerce/docs/pull/351,https://github.com/bigcommerce/docs/pull/351.diff,https://github.com/bigcommerce/docs/pull/351.patch,2024-06-25T21:24:31Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-626] + + +## What changed? +This PR changes the request body of PUT site's routes to an array of objects, as pointed out by the SELFDEV-626 submitter. + +> Furthermore, the code sample for ""Update a Site's Routes"" is incorrect. Since it's a bulk update for all possible Routes, it should be wrapped in an array: +> ``` +> [{ +> ""id"": 0, +> ""type"": ""product"", +> ""matching"": ""5"", +> ""route"": ""/my-amazing-product"" +> }] +> ``` +> Attempting to run the code sample presently documented will result in this error: +> +> ``` +> ""status"": 422, +> ""title"": ""The request payload has to be a JSON array for the endpoint"" +> ``` + + +[SELFDEV-626]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-626?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/351/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/351/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/350,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/350/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/350/comments,https://api.github.com/repos/bigcommerce/docs/issues/350/events,https://github.com/bigcommerce/docs/issues/350,2372429858,I_kwDOI7BBSM6NaGgi,350,Missing product param googleproductsearch,IlyaZha,9284214,MDQ6VXNlcjkyODQyMTQ=,https://avatars.githubusercontent.com/u/9284214?v=4,,https://api.github.com/users/IlyaZha,https://github.com/IlyaZha,https://api.github.com/users/IlyaZha/followers,https://api.github.com/users/IlyaZha/following{/other_user},https://api.github.com/users/IlyaZha/gists{/gist_id},https://api.github.com/users/IlyaZha/starred{/owner}{/repo},https://api.github.com/users/IlyaZha/subscriptions,https://api.github.com/users/IlyaZha/orgs,https://api.github.com/users/IlyaZha/repos,https://api.github.com/users/IlyaZha/events{/privacy},https://api.github.com/users/IlyaZha/received_events,User,false,[],open,false,,[],,1,2024-06-25T11:23:55Z,2024-06-25T11:25:08Z,,NONE,,,,,,,,"### What is the link to the page that needs updating? Provide multiple links if needed. + +https://developer.bigcommerce.com/docs/rest-catalog/products + +### What needs to be documented? + +API users can get google product search param through an endpoint `endpoint /products/${productId}/googleproductsearch`. It isn't documented now. + +### What is currently documented? + +Now documented to receive product parameters: Complex rules, Custom fields, Images, Metafields, Reviews, Videos",https://api.github.com/repos/bigcommerce/docs/issues/350/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/350/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/348,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/348/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/348/comments,https://api.github.com/repos/bigcommerce/docs/issues/348/events,https://github.com/bigcommerce/docs/pull/348,2367148996,PR_kwDOI7BBSM5zN7oF,348,DEVDOCS-5976: [updated]correct store_product_updated.yml schema,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,2,2024-06-21T19:42:43Z,2024-06-25T16:21:59Z,2024-06-25T16:12:32Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/348,https://github.com/bigcommerce/docs/pull/348,https://github.com/bigcommerce/docs/pull/348.diff,https://github.com/bigcommerce/docs/pull/348.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5976] + + +## What changed? +Corrected schema. I attached a screenshot of the schema is in the ticket. + +## Release notes draft +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5976]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5976?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/348/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/348/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/347,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/347/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/347/comments,https://api.github.com/repos/bigcommerce/docs/issues/347/events,https://github.com/bigcommerce/docs/pull/347,2367100328,PR_kwDOI7BBSM5zNxOT,347,"DEVDOCS-5957 [new]: MSF International Enhancements, add custom_fields",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-21T19:04:07Z,2024-07-09T17:12:14Z,2024-07-09T17:10:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/347,https://github.com/bigcommerce/docs/pull/347,https://github.com/bigcommerce/docs/pull/347.diff,https://github.com/bigcommerce/docs/pull/347.patch,2024-07-09T17:10:03Z,"# [DEVDOCS-5957] + + +## What changed? +- (GQL Admin API) Update MSF International Enhancements overview page to mention custom fields +- (GQL Admin API) Add new custom fields doc for example requests/responses +- (Webhooks) Add new custom field webhook +- (GQL Storefront API) Mention that API responses depend on channel locale (& control panel settings) +- (Stencil) Mention that Stencil storefront channels support overrides for localization + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +Related PRs: +- [PR 3090](https://github.com/bigcommerce/storefront/pull/3090) (GQL SF API descriptions) +- [PR 2975](https://github.com/bigcommerce/api-proxy-java/pull/2975) / [PR 2977](https://github.com/bigcommerce/api-proxy-java/pull/2977) (GQL Admin API descriptions) +- [PR 941](https://github.com/bigcommerce/developer-center/pull/941) (TOC changes for dev center) + +ping {names} + + +[DEVDOCS-5957]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5957?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/347/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/347/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/346,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/346/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/346/comments,https://api.github.com/repos/bigcommerce/docs/issues/346/events,https://github.com/bigcommerce/docs/pull/346,2367077648,PR_kwDOI7BBSM5zNsNO,346,DEVDOCS-5972: [update] product videos,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,2,2024-06-21T18:45:56Z,2024-07-03T13:10:20Z,2024-07-03T01:59:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/346,https://github.com/bigcommerce/docs/pull/346,https://github.com/bigcommerce/docs/pull/346.diff,https://github.com/bigcommerce/docs/pull/346.patch,2024-07-03T01:59:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5972] + + +## What changed? +Added product video section + +## Release notes draft + +We're happy to announce the ability to query product videos using the storefront product graph. + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5972]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5972?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/346/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/346/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/345,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/345/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/345/comments,https://api.github.com/repos/bigcommerce/docs/issues/345/events,https://github.com/bigcommerce/docs/pull/345,2366711350,PR_kwDOI7BBSM5zMbi6,345,PAPI-2240: remove events endpoint from webhooks doc,bc-tayvs,80041457,MDQ6VXNlcjgwMDQxNDU3,https://avatars.githubusercontent.com/u/80041457?v=4,,https://api.github.com/users/bc-tayvs,https://github.com/bc-tayvs,https://api.github.com/users/bc-tayvs/followers,https://api.github.com/users/bc-tayvs/following{/other_user},https://api.github.com/users/bc-tayvs/gists{/gist_id},https://api.github.com/users/bc-tayvs/starred{/owner}{/repo},https://api.github.com/users/bc-tayvs/subscriptions,https://api.github.com/users/bc-tayvs/orgs,https://api.github.com/users/bc-tayvs/repos,https://api.github.com/users/bc-tayvs/events{/privacy},https://api.github.com/users/bc-tayvs/received_events,User,false,[],closed,false,,[],,0,2024-06-21T14:52:50Z,2024-07-12T15:37:27Z,2024-07-12T15:37:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/345,https://github.com/bigcommerce/docs/pull/345,https://github.com/bigcommerce/docs/pull/345.diff,https://github.com/bigcommerce/docs/pull/345.patch,2024-07-12T15:37:25Z,"<!-- Ticket number or summary of work --> +# [PAPI-2240](https://bigcommercecloud.atlassian.net/browse/PAPI-2242) + + +## What changed? +* Remove 'events' endpoint from documentation because of endpoint removing + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* The endpoint in a process of removal. Need to remove all mentioning from documentation as well + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[PAPI-2240]: https://bigcommercecloud.atlassian.net/browse/PAPI-2240?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/345/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/345/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/344,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/344/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/344/comments,https://api.github.com/repos/bigcommerce/docs/issues/344/events,https://github.com/bigcommerce/docs/pull/344,2365146900,PR_kwDOI7BBSM5zHIgI,344,DEVDOCS-5865:[sentence case]About our APIs,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6867578600,""node_id"":""LA_kwDOI7BBSM8AAAABmVbu6A"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/sentence%20case"",""name"":""sentence case"",""color"":""7375EA"",""default"":false,""description"":""Label designated to collect PRs created from our sentence casing project.""}]",open,false,,[],,0,2024-06-20T19:54:17Z,2024-06-20T20:27:58Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/344,https://github.com/bigcommerce/docs/pull/344,https://github.com/bigcommerce/docs/pull/344.diff,https://github.com/bigcommerce/docs/pull/344.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5865] + + +## What changed? +Updated for sentence case + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5865]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5865?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/344/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/344/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/343,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/343/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/343/comments,https://api.github.com/repos/bigcommerce/docs/issues/343/events,https://github.com/bigcommerce/docs/pull/343,2364971636,PR_kwDOI7BBSM5zGiGE,343,"DEVDOCS-5971 [new]: GQL Storefront API / Customers, add password complexity requirements",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-06-20T17:57:18Z,2024-07-09T21:55:35Z,2024-07-09T21:55:33Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/343,https://github.com/bigcommerce/docs/pull/343,https://github.com/bigcommerce/docs/pull/343.diff,https://github.com/bigcommerce/docs/pull/343.patch,2024-07-09T21:55:33Z,"# [DEVDOCS-5971] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Mention password complexity requirements that developers can use to validate passwords when registering / changing / resetting a customer's password + +## Release notes draft + +* The GraphQL Storefront API's newly-released [`CustomersSettings` node](https://developer.bigcommerce.com/graphql-storefront/reference#definition-CustomersSettings) has password complexity requirements that are now available. Now, when you register, update, or reset a customer's password, you’ll be able to validate it before submitting the customer's desired password to the BigCommerce Platform. + +## Anything else? + +This PR relates to [PR 3054](https://github.com/bigcommerce/storefront/pull/3054) (editing schema descriptions) + +To prevent broken links, this PR should be merged only after the node shows up on https://developer.bigcommerce.com/graphql-storefront/reference + +@bigcommerce/team-storefront + + +[DEVDOCS-5971]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5971?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/343/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/343/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/342,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/342/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/342/comments,https://api.github.com/repos/bigcommerce/docs/issues/342/events,https://github.com/bigcommerce/docs/pull/342,2364755833,PR_kwDOI7BBSM5zFykP,342,Update themes product.yml - move custom_fields node up to match alphabetical order,bc-romanliukshyn,79109064,MDQ6VXNlcjc5MTA5MDY0,https://avatars.githubusercontent.com/u/79109064?v=4,,https://api.github.com/users/bc-romanliukshyn,https://github.com/bc-romanliukshyn,https://api.github.com/users/bc-romanliukshyn/followers,https://api.github.com/users/bc-romanliukshyn/following{/other_user},https://api.github.com/users/bc-romanliukshyn/gists{/gist_id},https://api.github.com/users/bc-romanliukshyn/starred{/owner}{/repo},https://api.github.com/users/bc-romanliukshyn/subscriptions,https://api.github.com/users/bc-romanliukshyn/orgs,https://api.github.com/users/bc-romanliukshyn/repos,https://api.github.com/users/bc-romanliukshyn/events{/privacy},https://api.github.com/users/bc-romanliukshyn/received_events,User,false,[],closed,false,,[],,0,2024-06-20T15:42:00Z,2024-07-02T20:17:09Z,2024-07-02T20:17:08Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/342,https://github.com/bigcommerce/docs/pull/342,https://github.com/bigcommerce/docs/pull/342.diff,https://github.com/bigcommerce/docs/pull/342.patch,2024-07-02T20:17:08Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +![image](https://github.com/bigcommerce/docs/assets/79109064/fdc5c140-04a0-41b9-a983-fa39d7f9c4f7) + +custom_fields node appears to be out of order, which makes it hard to find. Moved it up to match alphabetical order, the same as all other nodes are sorted. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/342/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/342/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/341,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/341/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/341/comments,https://api.github.com/repos/bigcommerce/docs/issues/341/events,https://github.com/bigcommerce/docs/pull/341,2364317122,PR_kwDOI7BBSM5zES1F,341,Delete a Price List Record - currency and sku:in undocumented parameters,clemblanco,668419,MDQ6VXNlcjY2ODQxOQ==,https://avatars.githubusercontent.com/u/668419?v=4,,https://api.github.com/users/clemblanco,https://github.com/clemblanco,https://api.github.com/users/clemblanco/followers,https://api.github.com/users/clemblanco/following{/other_user},https://api.github.com/users/clemblanco/gists{/gist_id},https://api.github.com/users/clemblanco/starred{/owner}{/repo},https://api.github.com/users/clemblanco/subscriptions,https://api.github.com/users/clemblanco/orgs,https://api.github.com/users/clemblanco/repos,https://api.github.com/users/clemblanco/events{/privacy},https://api.github.com/users/clemblanco/received_events,User,false,[],open,false,,[],,0,2024-06-20T12:26:35Z,2024-06-20T12:26:35Z,,FIRST_TIME_CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/341,https://github.com/bigcommerce/docs/pull/341,https://github.com/bigcommerce/docs/pull/341.diff,https://github.com/bigcommerce/docs/pull/341.patch,,"Looks like these were missing, and maybe more? + +## What changed? + +* `[DELETE] /v3/pricelists/{ID}/records` + * added `currency` undocumented parameter + * added `sku:in` undocumented parameter + +## Release notes draft +* Document undocumented parameters `currency` and `sku:in` for `[DELETE] /v3/pricelists/{ID}/records`",https://api.github.com/repos/bigcommerce/docs/issues/341/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/341/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/340,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/340/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/340/comments,https://api.github.com/repos/bigcommerce/docs/issues/340/events,https://github.com/bigcommerce/docs/pull/340,2361973001,PR_kwDOI7BBSM5y8R71,340,Remove duplicated `location_id` param,smcc-riccardoc,147587711,U_kgDOCMwCfw,https://avatars.githubusercontent.com/u/147587711?v=4,,https://api.github.com/users/smcc-riccardoc,https://github.com/smcc-riccardoc,https://api.github.com/users/smcc-riccardoc/followers,https://api.github.com/users/smcc-riccardoc/following{/other_user},https://api.github.com/users/smcc-riccardoc/gists{/gist_id},https://api.github.com/users/smcc-riccardoc/starred{/owner}{/repo},https://api.github.com/users/smcc-riccardoc/subscriptions,https://api.github.com/users/smcc-riccardoc/orgs,https://api.github.com/users/smcc-riccardoc/repos,https://api.github.com/users/smcc-riccardoc/events{/privacy},https://api.github.com/users/smcc-riccardoc/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-06-19T10:22:19Z,2024-06-20T20:19:45Z,2024-06-20T20:19:45Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/340,https://github.com/bigcommerce/docs/pull/340,https://github.com/bigcommerce/docs/pull/340.diff,https://github.com/bigcommerce/docs/pull/340.patch,2024-06-20T20:19:45Z,"## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove duplicated parameter `location_id` + +ping @slsriehl @bc-tgomez +",https://api.github.com/repos/bigcommerce/docs/issues/340/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/340/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/339,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/339/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/339/comments,https://api.github.com/repos/bigcommerce/docs/issues/339/events,https://github.com/bigcommerce/docs/pull/339,2360808738,PR_kwDOI7BBSM5y4Rag,339,"DEVDOCS-5889 [update]: Webhooks, update inventory webhook description",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-18T21:59:41Z,2024-06-20T15:57:22Z,2024-06-20T15:57:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/339,https://github.com/bigcommerce/docs/pull/339,https://github.com/bigcommerce/docs/pull/339.diff,https://github.com/bigcommerce/docs/pull/339.patch,2024-06-20T15:57:21Z,"# [DEVDOCS-5889] + + +## What changed? +* Revise inventory webhook description for nuance + +## Release notes draft + + +## Anything else? +@bigcommerce/team-inventory + +[DEVDOCS-5889]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5889?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/339/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/339/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/338,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/338/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/338/comments,https://api.github.com/repos/bigcommerce/docs/issues/338/events,https://github.com/bigcommerce/docs/pull/338,2360018139,PR_kwDOI7BBSM5y1jBU,338,"DEVDOCS-5920 [update]: Inventory API, revise absolute & relative adjustment",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,2,2024-06-18T14:32:24Z,2024-06-21T17:41:48Z,2024-06-21T17:41:47Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/338,https://github.com/bigcommerce/docs/pull/338,https://github.com/bigcommerce/docs/pull/338.diff,https://github.com/bigcommerce/docs/pull/338.patch,,"# [DEVDOCS-5920] + + +## What changed? +- Add note about using absolute before relative adjustment + +## Release notes draft + +n / a + + +[DEVDOCS-5920]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5920?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/338/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/338/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/337,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/337/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/337/comments,https://api.github.com/repos/bigcommerce/docs/issues/337/events,https://github.com/bigcommerce/docs/pull/337,2359971162,PR_kwDOI7BBSM5y1YwL,337,CATALOG-9786: [update] Brands: REST Catalog,NataliiaNefodova,83062053,MDQ6VXNlcjgzMDYyMDUz,https://avatars.githubusercontent.com/u/83062053?v=4,,https://api.github.com/users/NataliiaNefodova,https://github.com/NataliiaNefodova,https://api.github.com/users/NataliiaNefodova/followers,https://api.github.com/users/NataliiaNefodova/following{/other_user},https://api.github.com/users/NataliiaNefodova/gists{/gist_id},https://api.github.com/users/NataliiaNefodova/starred{/owner}{/repo},https://api.github.com/users/NataliiaNefodova/subscriptions,https://api.github.com/users/NataliiaNefodova/orgs,https://api.github.com/users/NataliiaNefodova/repos,https://api.github.com/users/NataliiaNefodova/events{/privacy},https://api.github.com/users/NataliiaNefodova/received_events,User,false,[],closed,false,,[],,0,2024-06-18T14:11:31Z,2024-06-25T22:29:07Z,2024-06-25T22:29:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/337,https://github.com/bigcommerce/docs/pull/337,https://github.com/bigcommerce/docs/pull/337.diff,https://github.com/bigcommerce/docs/pull/337.patch,2024-06-25T22:29:06Z,"# [CATALOG-9786] + +## What changed? +* Add swagger file for V2 Brands +* Update swagger file for V3 Brands + +## Release notes draft +* Revert this PR + + + +[CATALOG-9786]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9786?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/337/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/337/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/336,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/336/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/336/comments,https://api.github.com/repos/bigcommerce/docs/issues/336/events,https://github.com/bigcommerce/docs/pull/336,2358063310,PR_kwDOI7BBSM5yu3Ry,336,"[update] README, nextjs tutorial filename",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-06-17T19:14:42Z,2024-06-17T19:20:33Z,2024-06-17T19:18:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/336,https://github.com/bigcommerce/docs/pull/336,https://github.com/bigcommerce/docs/pull/336.diff,https://github.com/bigcommerce/docs/pull/336.patch,2024-06-17T19:18:56Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-702]: [update] README, nextjs tutorial filename + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* sentence case README, comment out directory structure +* change nextjs tutorial filename + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* N/A + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[SELFDEV-702]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-702?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/336/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/336/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/335,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/335/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/335/comments,https://api.github.com/repos/bigcommerce/docs/issues/335/events,https://github.com/bigcommerce/docs/pull/335,2354103389,PR_kwDOI7BBSM5yhY8o,335,"[repo] Issue templates, rename directory",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-06-14T21:00:15Z,2024-06-14T21:02:37Z,2024-06-14T21:02:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/335,https://github.com/bigcommerce/docs/pull/335,https://github.com/bigcommerce/docs/pull/335.diff,https://github.com/bigcommerce/docs/pull/335.patch,2024-06-14T21:02:36Z,"<!-- Ticket number or summary of work --> +# [repo] Issue templates, rename directory + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Issue templates, rename directory + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* TBD + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #3 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/335/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/335/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/334,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/334/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/334/comments,https://api.github.com/repos/bigcommerce/docs/issues/334/events,https://github.com/bigcommerce/docs/pull/334,2354014619,PR_kwDOI7BBSM5yhE5b,334,DEVDOCS-5958: [Update] add note about multiple coupons,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-14T20:07:09Z,2024-06-18T19:36:32Z,2024-06-18T19:36:31Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/334,https://github.com/bigcommerce/docs/pull/334,https://github.com/bigcommerce/docs/pull/334.diff,https://github.com/bigcommerce/docs/pull/334.patch,2024-06-18T19:36:31Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5958] + + +## What changed? +Added note about enabling multiple coupons. + +## Release notes draft + +* We're happy to announce the ability to apply multiple coupons on a cart using the Checkout v3 API. + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5958]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5958?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/334/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/334/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/333,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/333/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/333/comments,https://api.github.com/repos/bigcommerce/docs/issues/333/events,https://github.com/bigcommerce/docs/pull/333,2353918685,PR_kwDOI7BBSM5ygv8w,333,DEVDOCS-5477: [Update] Added requirements for storefront checkout end…,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-14T18:56:22Z,2024-06-17T19:19:24Z,2024-06-17T19:19:24Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/333,https://github.com/bigcommerce/docs/pull/333,https://github.com/bigcommerce/docs/pull/333.diff,https://github.com/bigcommerce/docs/pull/333.patch,2024-06-17T19:19:24Z,"…points + +<!-- Ticket number or summary of work --> +# [DEVDOCS-5477] + + +## What changed? +Added a note about endpoint requirements + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5477]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5477?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/333/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/333/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/332,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/332/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/332/comments,https://api.github.com/repos/bigcommerce/docs/issues/332/events,https://github.com/bigcommerce/docs/pull/332,2353897069,PR_kwDOI7BBSM5ygrOo,332,"[update] GQLSF carts guide, add default namespace callout",harnerdesigns,20668329,MDQ6VXNlcjIwNjY4MzI5,https://avatars.githubusercontent.com/u/20668329?v=4,,https://api.github.com/users/harnerdesigns,https://github.com/harnerdesigns,https://api.github.com/users/harnerdesigns/followers,https://api.github.com/users/harnerdesigns/following{/other_user},https://api.github.com/users/harnerdesigns/gists{/gist_id},https://api.github.com/users/harnerdesigns/starred{/owner}{/repo},https://api.github.com/users/harnerdesigns/subscriptions,https://api.github.com/users/harnerdesigns/orgs,https://api.github.com/users/harnerdesigns/repos,https://api.github.com/users/harnerdesigns/events{/privacy},https://api.github.com/users/harnerdesigns/received_events,User,false,[],closed,false,,[],,0,2024-06-14T18:39:08Z,2024-06-19T17:19:51Z,2024-06-18T15:07:50Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/332,https://github.com/bigcommerce/docs/pull/332,https://github.com/bigcommerce/docs/pull/332.diff,https://github.com/bigcommerce/docs/pull/332.patch,2024-06-18T15:07:50Z,"Adding note about what namespace the graphql mutation will add a cart metafield to. + +<!-- Ticket number or summary of work --> + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added a note about what namespace the GraphQL Create Cart Metafield mutation will use. + +## Release notes draft + +* The updated notes in the docs will save the merchants and developers time trying to chase down metafields added to the cart through the storefront. +",https://api.github.com/repos/bigcommerce/docs/issues/332/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/332/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/331,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/331/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/331/comments,https://api.github.com/repos/bigcommerce/docs/issues/331/events,https://github.com/bigcommerce/docs/pull/331,2353663843,PR_kwDOI7BBSM5yf38l,331,DEVDOCS-5383: [Update] remove All pages restrictions,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-14T15:58:11Z,2024-06-14T19:16:54Z,2024-06-14T19:16:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/331,https://github.com/bigcommerce/docs/pull/331,https://github.com/bigcommerce/docs/pull/331.diff,https://github.com/bigcommerce/docs/pull/331.patch,2024-06-14T19:16:53Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5383] + + +## What changed? +* Removed restrictions for scripts on All Pages. + +## Release notes draft + +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5383]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5383?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/331/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/331/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/330,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/330/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/330/comments,https://api.github.com/repos/bigcommerce/docs/issues/330/events,https://github.com/bigcommerce/docs/pull/330,2351883845,PR_kwDOI7BBSM5yZ0EF,330,DEVDOCS-5953: [update] add date created and date modified,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-06-13T19:14:14Z,2024-07-02T21:21:19Z,2024-07-02T21:21:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/330,https://github.com/bigcommerce/docs/pull/330,https://github.com/bigcommerce/docs/pull/330.diff,https://github.com/bigcommerce/docs/pull/330.patch,2024-07-02T21:21:17Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5953] + + +## What changed? +Added parameters to the GET batch metafields endpoint. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5953]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5953?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/330/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/330/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/329,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/329/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/329/comments,https://api.github.com/repos/bigcommerce/docs/issues/329/events,https://github.com/bigcommerce/docs/pull/329,2349218067,PR_kwDOI7BBSM5yQueY,329,CATALOG-9786: [update] remove brand_name from response body,NataliiaNefodova,83062053,MDQ6VXNlcjgzMDYyMDUz,https://avatars.githubusercontent.com/u/83062053?v=4,,https://api.github.com/users/NataliiaNefodova,https://github.com/NataliiaNefodova,https://api.github.com/users/NataliiaNefodova/followers,https://api.github.com/users/NataliiaNefodova/following{/other_user},https://api.github.com/users/NataliiaNefodova/gists{/gist_id},https://api.github.com/users/NataliiaNefodova/starred{/owner}{/repo},https://api.github.com/users/NataliiaNefodova/subscriptions,https://api.github.com/users/NataliiaNefodova/orgs,https://api.github.com/users/NataliiaNefodova/repos,https://api.github.com/users/NataliiaNefodova/events{/privacy},https://api.github.com/users/NataliiaNefodova/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-12T16:40:09Z,2024-06-17T19:36:12Z,2024-06-13T21:03:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/329,https://github.com/bigcommerce/docs/pull/329,https://github.com/bigcommerce/docs/pull/329.diff,https://github.com/bigcommerce/docs/pull/329.patch,2024-06-13T21:03:58Z,"# [DEVDOCS-5962] + + +## What changed? +* Remove brand_name from response body + +## Release notes draft +* Update swagger file for Products endpoints + + + + +[DEVDOCS-5962]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5962?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/329/reactions,1,0,0,0,1,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/329/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/328,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/328/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/328/comments,https://api.github.com/repos/bigcommerce/docs/issues/328/events,https://github.com/bigcommerce/docs/pull/328,2349096342,PR_kwDOI7BBSM5yQTnF,328,"DEVDOCS-5969 [update]: Orders V3 API, remove batch refund quotes endpoint",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-12T15:40:51Z,2024-06-12T16:20:22Z,2024-06-12T16:20:21Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/328,https://github.com/bigcommerce/docs/pull/328,https://github.com/bigcommerce/docs/pull/328.diff,https://github.com/bigcommerce/docs/pull/328.patch,2024-06-12T16:20:21Z,"# [DEVDOCS-5969] + + +## What changed? +- remove batch refund quotes endpoint + +This PR relates to [PR 926](https://github.com/bigcommerce/developer-center/pull/926). Must merge after PR 926. + + +[DEVDOCS-5969]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5969?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/328/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/328/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/327,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/327/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/327/comments,https://api.github.com/repos/bigcommerce/docs/issues/327/events,https://github.com/bigcommerce/docs/pull/327,2348988752,PR_kwDOI7BBSM5yP8B_,327,Update amount.yml to fix data type,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-06-12T14:52:06Z,2024-06-12T19:47:54Z,2024-06-12T19:47:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/327,https://github.com/bigcommerce/docs/pull/327,https://github.com/bigcommerce/docs/pull/327.diff,https://github.com/bigcommerce/docs/pull/327.patch,2024-06-12T19:47:54Z,"<!-- Ticket number or summary of work --> +Updated the type of the amount model to number and fixed description. This is likely the reason that the Price theme object isn't rendering. +",https://api.github.com/repos/bigcommerce/docs/issues/327/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/327/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/326,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/326/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/326/comments,https://api.github.com/repos/bigcommerce/docs/issues/326/events,https://github.com/bigcommerce/docs/pull/326,2346942297,PR_kwDOI7BBSM5yI9Fc,326,"DEVDOCS-5911 [new]: MSF/Stencil, add storefront selector guide",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-11T17:30:47Z,2024-06-12T16:37:19Z,2024-06-12T16:37:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/326,https://github.com/bigcommerce/docs/pull/326,https://github.com/bigcommerce/docs/pull/326.diff,https://github.com/bigcommerce/docs/pull/326.patch,2024-06-12T16:37:18Z,"# [DEVDOCS-5911] + +## What changed? + +- Add guide for MSF Storefront selector + +## Release notes draft + +We are happy to announce the newly-released storefront selector feature in Stencil themes. Shoppers can now choose which storefront they want to browse when they visit your storefront. + +[DEVDOCS-5911]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5911?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/326/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/326/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/325,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/325/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/325/comments,https://api.github.com/repos/bigcommerce/docs/issues/325/events,https://github.com/bigcommerce/docs/pull/325,2344943216,PR_kwDOI7BBSM5yCGR-,325,"[DEVDOCS-5629]: [Update] Getting Started, API Rate limits update",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-06-10T22:20:14Z,2024-07-11T15:21:20Z,2024-07-11T15:19:01Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/325,https://github.com/bigcommerce/docs/pull/325,https://github.com/bigcommerce/docs/pull/325.diff,https://github.com/bigcommerce/docs/pull/325.patch,2024-07-11T15:19:01Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5629] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update API rate limits documentation + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Updated API rate limits documentation: Added methods for handling limits and optimizing requests. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5629]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/325/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/325/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/324,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/324/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/324/comments,https://api.github.com/repos/bigcommerce/docs/issues/324/events,https://github.com/bigcommerce/docs/pull/324,2344829760,PR_kwDOI7BBSM5yBuH0,324,"SELFDEV-576 + DEVDOCS-5863: [organize] Make docs structure match IA, move newer public docs to public repo",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-06-10T21:08:30Z,2024-06-12T21:15:25Z,2024-06-12T21:15:24Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/324,https://github.com/bigcommerce/docs/pull/324,https://github.com/bigcommerce/docs/pull/324.diff,https://github.com/bigcommerce/docs/pull/324.patch,2024-06-12T21:15:24Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-576] + [DEVDOCS-5863] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Make docs structure match IA +* BOPIS and promotions docs into public repo +* Other than adding the spec files from bopis and promotions to the dev center, i did not reorganize the API reference because that requires comms and advance notice to everyone who maintains an API client or SDK. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* The bigcommerce/docs repo now contains the OAS for promotions, inventory, locations, and other newer API features! +* It's now easier than ever to contribute to the docs. The source file structure in the repo now matches the Dev Center URLs. Finding the doc you want to modify never had less friction :) +* This only applies to the narrative docs. API reference source file restructure is in the works as soon as we can give enough notice for all you API client maintainers to reset your references. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-tgomez @bc-traciporter + + +[SELFDEV-576]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-576?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[DEVDOCS-5863]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5863?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/324/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/324/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/323,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/323/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/323/comments,https://api.github.com/repos/bigcommerce/docs/issues/323/events,https://github.com/bigcommerce/docs/pull/323,2344088264,PR_kwDOI7BBSM5x_Kdy,323,DEVDOCS-5963: [update] create redirect URL request body,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-06-10T14:34:25Z,2024-06-10T18:08:22Z,2024-06-10T18:08:21Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/323,https://github.com/bigcommerce/docs/pull/323,https://github.com/bigcommerce/docs/pull/323.diff,https://github.com/bigcommerce/docs/pull/323.patch,2024-06-10T18:08:21Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5963] + + +## What changed? +Correct request body for cart redirect URL. Screenshot image of the payload is in the ticket. + +## Release notes draft +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5963]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5963?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/323/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/323/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/322,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/322/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/322/comments,https://api.github.com/repos/bigcommerce/docs/issues/322/events,https://github.com/bigcommerce/docs/pull/322,2341005584,PR_kwDOI7BBSM5x1Ag8,322,DEVDOCS-5953: [update] add date created and date modified query parameters,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-07T18:58:33Z,2024-06-26T18:39:08Z,2024-06-26T18:39:07Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/322,https://github.com/bigcommerce/docs/pull/322,https://github.com/bigcommerce/docs/pull/322.diff,https://github.com/bigcommerce/docs/pull/322.patch,2024-06-26T18:39:07Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5953] + + +## What changed? +add date created and date modified query parameters + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5953]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5953?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/322/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/322/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/321,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/321/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/321/comments,https://api.github.com/repos/bigcommerce/docs/issues/321/events,https://github.com/bigcommerce/docs/pull/321,2339293585,PR_kwDOI7BBSM5xvMDn,321,SELFDEV-687: [update] Remove and update broken links,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-06-06T23:23:44Z,2024-06-06T23:28:06Z,2024-06-06T23:28:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/321,https://github.com/bigcommerce/docs/pull/321,https://github.com/bigcommerce/docs/pull/321.diff,https://github.com/bigcommerce/docs/pull/321.patch,2024-06-06T23:28:06Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-687] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove and/or update broken links + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[SELFDEV-687]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-687?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/321/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/321/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/320,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/320/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/320/comments,https://api.github.com/repos/bigcommerce/docs/issues/320/events,https://github.com/bigcommerce/docs/pull/320,2339090746,PR_kwDOI7BBSM5xufsA,320,DEVDOCS-5962: [update] remove brand_name from response body,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-06-06T20:21:34Z,2024-06-17T19:38:51Z,2024-06-12T15:33:29Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/320,https://github.com/bigcommerce/docs/pull/320,https://github.com/bigcommerce/docs/pull/320.diff,https://github.com/bigcommerce/docs/pull/320.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5962] + + +## What changed? +Removed `brand_name` from the response body because this field is incorrect. See [PR 329](https://github.com/bigcommerce/docs/pull/329). + +## Release notes draft + +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5962]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5962?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/320/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/320/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/319,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/319/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/319/comments,https://api.github.com/repos/bigcommerce/docs/issues/319/events,https://github.com/bigcommerce/docs/pull/319,2336344352,PR_kwDOI7BBSM5xlB94,319,"(no ticket): [links] Users, update links",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,"[{""id"":5127839035,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdOw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/dependencies"",""name"":""dependencies"",""color"":""c4f9a9"",""default"":false,""description"":""Pull requests that update a dependency file""}]",closed,false,,[],,0,2024-06-05T16:24:28Z,2024-06-05T22:21:39Z,2024-06-05T22:21:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/319,https://github.com/bigcommerce/docs/pull/319,https://github.com/bigcommerce/docs/pull/319.diff,https://github.com/bigcommerce/docs/pull/319.patch,2024-06-05T22:21:38Z,"<!-- Ticket number or summary of work --> +# (no ticket): [links] Users, update links + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update the links to the users overview + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* no release notes for a minor link change + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* depends on [DC PR](https://github.com/bigcommerce/developer-center/pull/917) + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/319/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/319/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/318,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/318/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/318/comments,https://api.github.com/repos/bigcommerce/docs/issues/318/events,https://github.com/bigcommerce/docs/pull/318,2336323131,PR_kwDOI7BBSM5xk9TX,318,"DEVDOCS-5929 [new]: Tax Settings API, add document submission strategy field",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-06-05T16:13:00Z,2024-06-13T00:13:28Z,2024-06-11T18:13:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/318,https://github.com/bigcommerce/docs/pull/318,https://github.com/bigcommerce/docs/pull/318.diff,https://github.com/bigcommerce/docs/pull/318.patch,2024-06-11T18:13:54Z,"# [DEVDOCS-5929] + + +## What changed? +- Add document submission strategy field + +## Release notes draft + +* We're happy to announce the [Tax Settings API's](https://developer.bigcommerce.com/docs/rest-management/tax-settings) new `document_submission_strategy` field, which lets you choose when tax documents are submitted to third-party tax providers. + + +[DEVDOCS-5929]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5929?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/318/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/318/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/317,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/317/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/317/comments,https://api.github.com/repos/bigcommerce/docs/issues/317/events,https://github.com/bigcommerce/docs/pull/317,2336206934,PR_kwDOI7BBSM5xkjWW,317,"Revert ""DEVDOCS-5911 [new]: MSF / Stencil, add channels object to themes""",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-06-05T15:22:22Z,2024-06-05T15:26:03Z,2024-06-05T15:25:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/317,https://github.com/bigcommerce/docs/pull/317,https://github.com/bigcommerce/docs/pull/317.diff,https://github.com/bigcommerce/docs/pull/317.patch,2024-06-05T15:25:22Z,"[DEVDOCS-5911](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5911) + +Reverts bigcommerce/docs#301 + +(Revert based on comment in DEVDOCS-5911) + +[DEVDOCS-5911]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5911?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/317/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/317/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/316,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/316/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/316/comments,https://api.github.com/repos/bigcommerce/docs/issues/316/events,https://github.com/bigcommerce/docs/pull/316,2334178874,PR_kwDOI7BBSM5xdkjT,316,DEVDOCS-5818: update refs,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,2,2024-06-04T18:57:06Z,2024-06-05T18:57:40Z,2024-06-05T18:57:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/316,https://github.com/bigcommerce/docs/pull/316,https://github.com/bigcommerce/docs/pull/316.diff,https://github.com/bigcommerce/docs/pull/316.patch,2024-06-05T18:57:39Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5818] + + +## What changed? +Add in refs for the price object + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5818]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5818?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/316/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/316/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/315,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/315/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/315/comments,https://api.github.com/repos/bigcommerce/docs/issues/315/events,https://github.com/bigcommerce/docs/pull/315,2334167835,PR_kwDOI7BBSM5xdiIl,315,"[DEVDOCS-5715]: [revise] Customers V3, Add origin_channel_id to the list of read only fields",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-06-04T18:50:35Z,2024-06-10T16:13:45Z,2024-06-10T16:13:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/315,https://github.com/bigcommerce/docs/pull/315,https://github.com/bigcommerce/docs/pull/315.diff,https://github.com/bigcommerce/docs/pull/315.patch,2024-06-10T16:13:36Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5715] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add `origin_channel_ids` to the list of read only fields + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Added origin_channel_id to the list of read-only fields in the Customers V3 API. This field is set upon customer creation and cannot be updated afterward. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @ + + +[DEVDOCS-5715]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5715?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/315/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/315/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/314,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/314/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/314/comments,https://api.github.com/repos/bigcommerce/docs/issues/314/events,https://github.com/bigcommerce/docs/pull/314,2334085048,PR_kwDOI7BBSM5xdQD0,314,DEVDOCS-5878: [Update] graphql-cart-metafields,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-06-04T18:00:04Z,2024-06-18T15:25:59Z,2024-06-18T15:25:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/314,https://github.com/bigcommerce/docs/pull/314,https://github.com/bigcommerce/docs/pull/314.diff,https://github.com/bigcommerce/docs/pull/314.patch,2024-06-18T15:25:58Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5878] + + +## What changed? +Add new article ""Working with Cart Metafields"" + +## Release notes draft +Talk to Jamie + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5878]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5878?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/314/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/314/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/313,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/313/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/313/comments,https://api.github.com/repos/bigcommerce/docs/issues/313/events,https://github.com/bigcommerce/docs/pull/313,2334042753,PR_kwDOI7BBSM5xdGzC,313,"CATALOG-9785: [update] Catalog, Category Images, Sort Order",NataliiaNefodova,83062053,MDQ6VXNlcjgzMDYyMDUz,https://avatars.githubusercontent.com/u/83062053?v=4,,https://api.github.com/users/NataliiaNefodova,https://github.com/NataliiaNefodova,https://api.github.com/users/NataliiaNefodova/followers,https://api.github.com/users/NataliiaNefodova/following{/other_user},https://api.github.com/users/NataliiaNefodova/gists{/gist_id},https://api.github.com/users/NataliiaNefodova/starred{/owner}{/repo},https://api.github.com/users/NataliiaNefodova/subscriptions,https://api.github.com/users/NataliiaNefodova/orgs,https://api.github.com/users/NataliiaNefodova/repos,https://api.github.com/users/NataliiaNefodova/events{/privacy},https://api.github.com/users/NataliiaNefodova/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-06-04T17:33:09Z,2024-06-13T21:02:56Z,2024-06-13T21:02:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/313,https://github.com/bigcommerce/docs/pull/313,https://github.com/bigcommerce/docs/pull/313.diff,https://github.com/bigcommerce/docs/pull/313.patch,2024-06-13T21:02:56Z," +# [CATALOG-9785] + + +## What changed? + +* Updated swagger file for Category Image, Sort Order endpoints + +## Release notes draft + +* Updated swagger file for Category Image, Sort Order endpoints + + + +[CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/313/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/313/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/312,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/312/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/312/comments,https://api.github.com/repos/bigcommerce/docs/issues/312/events,https://github.com/bigcommerce/docs/pull/312,2333868718,PR_kwDOI7BBSM5xcgxs,312,"DEVDOCS-5939 [update]: Channel listings, add usage note",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-06-04T15:51:35Z,2024-06-12T15:27:27Z,2024-06-12T15:27:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/312,https://github.com/bigcommerce/docs/pull/312,https://github.com/bigcommerce/docs/pull/312.diff,https://github.com/bigcommerce/docs/pull/312.patch,2024-06-12T15:27:25Z,"# [DEVDOCS-5939] + + +## What changed? +- Add a note to Channel Listings API that it's intended for non-storefront channels + +## Release notes draft +* N / A + + + +[DEVDOCS-5939]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5939?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/312/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/312/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/311,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/311/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/311/comments,https://api.github.com/repos/bigcommerce/docs/issues/311/events,https://github.com/bigcommerce/docs/issues/311,2330355334,I_kwDOI7BBSM6K5maG,311,Update Product with Variation ,kajalo360,110799688,U_kgDOBpqrSA,https://avatars.githubusercontent.com/u/110799688?v=4,,https://api.github.com/users/kajalo360,https://github.com/kajalo360,https://api.github.com/users/kajalo360/followers,https://api.github.com/users/kajalo360/following{/other_user},https://api.github.com/users/kajalo360/gists{/gist_id},https://api.github.com/users/kajalo360/starred{/owner}{/repo},https://api.github.com/users/kajalo360/subscriptions,https://api.github.com/users/kajalo360/orgs,https://api.github.com/users/kajalo360/repos,https://api.github.com/users/kajalo360/events{/privacy},https://api.github.com/users/kajalo360/received_events,User,false,[],open,false,,[],,1,2024-06-03T07:12:29Z,2024-06-03T15:48:09Z,,NONE,,,,,,,,in update product I want to update the variant with option value also but it's not working ,https://api.github.com/repos/bigcommerce/docs/issues/311/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/311/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/310,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/310/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/310/comments,https://api.github.com/repos/bigcommerce/docs/issues/310/events,https://github.com/bigcommerce/docs/pull/310,2328600948,PR_kwDOI7BBSM5xKvuR,310,"[DEVDOCS-5854]: [revise] Abandoned carts V3, Clean up schema layout to use as example API",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,,[],,0,2024-05-31T21:21:00Z,2024-05-31T21:29:14Z,2024-05-31T21:29:14Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/310,https://github.com/bigcommerce/docs/pull/310,https://github.com/bigcommerce/docs/pull/310.diff,https://github.com/bigcommerce/docs/pull/310.patch,2024-05-31T21:29:14Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5854] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Move parameters in to place +* Fix format issues with schema + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No real changes, just small tweaks to the schema layouts. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5854]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5854?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/310/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/310/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/309,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/309/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/309/comments,https://api.github.com/repos/bigcommerce/docs/issues/309/events,https://github.com/bigcommerce/docs/pull/309,2328472026,PR_kwDOI7BBSM5xKTY6,309,Issue-300: [update] Update webhooks.v3.yml,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-31T19:32:47Z,2024-05-31T20:11:31Z,2024-05-31T20:11:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/309,https://github.com/bigcommerce/docs/pull/309,https://github.com/bigcommerce/docs/pull/309.diff,https://github.com/bigcommerce/docs/pull/309.patch,2024-05-31T20:11:30Z,"<!-- Ticket number or summary of work --> +# [ISSUE-300] + + +## What changed? +Added information regarding the replacement for this endpoint. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/309/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/309/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/308,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/308/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/308/comments,https://api.github.com/repos/bigcommerce/docs/issues/308/events,https://github.com/bigcommerce/docs/pull/308,2328453165,PR_kwDOI7BBSM5xKPSV,308,Update remote_api_scripts.yml per Mark,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-05-31T19:17:23Z,2024-05-31T19:38:05Z,2024-05-31T19:38:05Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/308,https://github.com/bigcommerce/docs/pull/308,https://github.com/bigcommerce/docs/pull/308.diff,https://github.com/bigcommerce/docs/pull/308.patch,2024-05-31T19:38:04Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5518] + + +## What changed? +Fixed schema for remote_api_scripts + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/308/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/308/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/307,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/307/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/307/comments,https://api.github.com/repos/bigcommerce/docs/issues/307/events,https://github.com/bigcommerce/docs/pull/307,2328439162,PR_kwDOI7BBSM5xKMOE,307,Devdocs-5642 [update] Pages V3,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-31T19:07:54Z,2024-06-04T15:40:02Z,2024-06-04T15:40:01Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/307,https://github.com/bigcommerce/docs/pull/307,https://github.com/bigcommerce/docs/pull/307.diff,https://github.com/bigcommerce/docs/pull/307.patch,2024-06-04T15:40:01Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5642] + + +## What changed? +Updated the order and added titles for schemas + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5642]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5642?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/307/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/307/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/306,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/306/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/306/comments,https://api.github.com/repos/bigcommerce/docs/issues/306/events,https://github.com/bigcommerce/docs/pull/306,2328313998,PR_kwDOI7BBSM5xJweQ,306,DEVDOCS-5518: [Update]remote_api_scripts.yml,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-05-31T17:44:41Z,2024-05-31T18:03:48Z,2024-05-31T18:03:47Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/306,https://github.com/bigcommerce/docs/pull/306,https://github.com/bigcommerce/docs/pull/306.diff,https://github.com/bigcommerce/docs/pull/306.patch,2024-05-31T18:03:47Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5518] + + +## What changed? +Added ""No properties available for this object"" + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/306/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/306/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/305,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/305/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/305/comments,https://api.github.com/repos/bigcommerce/docs/issues/305/events,https://github.com/bigcommerce/docs/pull/305,2328243740,PR_kwDOI7BBSM5xJhZZ,305,"DEVDOCS-5518: [Update] update page, urls, and comparisons theme objects",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-05-31T16:58:59Z,2024-05-31T17:36:51Z,2024-05-31T17:36:51Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/305,https://github.com/bigcommerce/docs/pull/305,https://github.com/bigcommerce/docs/pull/305.diff,https://github.com/bigcommerce/docs/pull/305.patch,2024-05-31T17:36:51Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5518] + + +## What changed? +Updated theme objects (page, urls, and comparisons) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5518]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5518?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/305/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/305/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/304,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/304/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/304/comments,https://api.github.com/repos/bigcommerce/docs/issues/304/events,https://github.com/bigcommerce/docs/pull/304,2328033272,PR_kwDOI7BBSM5xIzpF,304,Update models so title appears when rendered,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-05-31T14:55:25Z,2024-06-01T01:27:14Z,2024-06-01T01:27:12Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/304,https://github.com/bigcommerce/docs/pull/304,https://github.com/bigcommerce/docs/pull/304.diff,https://github.com/bigcommerce/docs/pull/304.patch,2024-06-01T01:27:12Z,"## What changed? +This PR modifies the structure of the forms and pagination related models so that the titles appear in the anyOf or oneOf selectors + +## Release notes draft +anyOf or oneOf options now appear for `forms` and `pagination` theme object models. + +## Anything else? + +Before: + +<img width=""730"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/29524703/d040b7f1-8268-49ee-ba4e-dfa7721c41d8""> + +After: + +<img width=""745"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/29524703/22b5caed-04b6-454c-8c60-b74015fd6c71""> +",https://api.github.com/repos/bigcommerce/docs/issues/304/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/304/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/303,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/303/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/303/comments,https://api.github.com/repos/bigcommerce/docs/issues/303/events,https://github.com/bigcommerce/docs/pull/303,2328024404,PR_kwDOI7BBSM5xIxsK,303,"CATALOG-9785: [update] Catalog, Category, Category Trees",NataliiaNefodova,83062053,MDQ6VXNlcjgzMDYyMDUz,https://avatars.githubusercontent.com/u/83062053?v=4,,https://api.github.com/users/NataliiaNefodova,https://github.com/NataliiaNefodova,https://api.github.com/users/NataliiaNefodova/followers,https://api.github.com/users/NataliiaNefodova/following{/other_user},https://api.github.com/users/NataliiaNefodova/gists{/gist_id},https://api.github.com/users/NataliiaNefodova/starred{/owner}{/repo},https://api.github.com/users/NataliiaNefodova/subscriptions,https://api.github.com/users/NataliiaNefodova/orgs,https://api.github.com/users/NataliiaNefodova/repos,https://api.github.com/users/NataliiaNefodova/events{/privacy},https://api.github.com/users/NataliiaNefodova/received_events,User,false,[],closed,false,,[],,0,2024-05-31T14:50:47Z,2024-06-04T13:49:46Z,2024-06-04T13:49:45Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/303,https://github.com/bigcommerce/docs/pull/303,https://github.com/bigcommerce/docs/pull/303.diff,https://github.com/bigcommerce/docs/pull/303.patch,2024-06-04T13:49:45Z,"# [CATALOG-9785] + +## What changed? +* Update swagger file for Categories, Category Trees + +## Release notes draft +* Update swagger file for Categories, Category Trees + +ping @NataliiaNefodova + + +[CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/303/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/303/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/302,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/302/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/302/comments,https://api.github.com/repos/bigcommerce/docs/issues/302/events,https://github.com/bigcommerce/docs/pull/302,2327705485,PR_kwDOI7BBSM5xHrlP,302,DEVDOCS-5964 Fix missing schemas in theme objects,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-05-31T12:13:17Z,2024-05-31T13:37:10Z,2024-05-31T13:37:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/302,https://github.com/bigcommerce/docs/pull/302,https://github.com/bigcommerce/docs/pull/302.diff,https://github.com/bigcommerce/docs/pull/302.patch,2024-05-31T13:37:09Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5964] + + +## What changed? +This PR changes the relative links in the schemas to full URLs so that the ref parser can render the theme objects + +## Release notes draft + +Previously missing object properties and missing schemas will now appear correctly + +<img width=""1495"" alt=""Screenshot 2024-05-31 at 8 59 05 AM"" src=""https://github.com/bigcommerce/docs/assets/29524703/21deda2e-d38f-488c-830b-44c71ac7a56a""> + +Preview branch: https://developer-center-pycvjlr36-bigcommerce-dx.vercel.app/docs/storefront/stencil/themes/context/object-reference/schemas#customer + +[DEVDOCS-5964]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5964?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/302/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/302/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/301,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/301/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/301/comments,https://api.github.com/repos/bigcommerce/docs/issues/301/events,https://github.com/bigcommerce/docs/pull/301,2326404960,PR_kwDOI7BBSM5xDPOW,301,"DEVDOCS-5911 [new]: MSF / Stencil, add channels object to themes",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-05-30T19:30:27Z,2024-06-03T16:02:45Z,2024-06-03T16:02:45Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/301,https://github.com/bigcommerce/docs/pull/301,https://github.com/bigcommerce/docs/pull/301.diff,https://github.com/bigcommerce/docs/pull/301.patch,2024-06-03T16:02:45Z,"# [DEVDOCS-5911] + + +## What changed? +- add channels to a theme's settings JSON object to `config.json` + +## Release notes draft + +* The `settings` Stencil Theme object has a newly-released `channels` setting, which lets you add a storefront selector for shoppers to switch storefronts. + + +[DEVDOCS-5911]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5911?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/301/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/301/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/300,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/300/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/300/comments,https://api.github.com/repos/bigcommerce/docs/issues/300/events,https://github.com/bigcommerce/docs/issues/300,2325850638,I_kwDOI7BBSM6KoaoO,300,"Feedback for “Webhook Events”, Get Events",cjbarth,3049726,MDQ6VXNlcjMwNDk3MjY=,https://avatars.githubusercontent.com/u/3049726?v=4,,https://api.github.com/users/cjbarth,https://github.com/cjbarth,https://api.github.com/users/cjbarth/followers,https://api.github.com/users/cjbarth/following{/other_user},https://api.github.com/users/cjbarth/gists{/gist_id},https://api.github.com/users/cjbarth/starred{/owner}{/repo},https://api.github.com/users/cjbarth/subscriptions,https://api.github.com/users/cjbarth/orgs,https://api.github.com/users/cjbarth/repos,https://api.github.com/users/cjbarth/events{/privacy},https://api.github.com/users/cjbarth/received_events,User,false,[],closed,false,,[],,6,2024-05-30T14:41:02Z,2024-05-31T19:35:05Z,2024-05-30T16:30:57Z,NONE,,,,,,,,"https://developer.bigcommerce.com/docs/webhooks/webhooks/webhook-events#get-events is listed as deprecated, but there is no note about what the replacement or alternative is.",https://api.github.com/repos/bigcommerce/docs/issues/300/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/300/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/299,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/299/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/299/comments,https://api.github.com/repos/bigcommerce/docs/issues/299/events,https://github.com/bigcommerce/docs/pull/299,2324032020,PR_kwDOI7BBSM5w7IMF,299,Update introduction-to-bigcommerce.mdx,mmurphytest,117189321,U_kgDOBvwqyQ,https://avatars.githubusercontent.com/u/117189321?v=4,,https://api.github.com/users/mmurphytest,https://github.com/mmurphytest,https://api.github.com/users/mmurphytest/followers,https://api.github.com/users/mmurphytest/following{/other_user},https://api.github.com/users/mmurphytest/gists{/gist_id},https://api.github.com/users/mmurphytest/starred{/owner}{/repo},https://api.github.com/users/mmurphytest/subscriptions,https://api.github.com/users/mmurphytest/orgs,https://api.github.com/users/mmurphytest/repos,https://api.github.com/users/mmurphytest/events{/privacy},https://api.github.com/users/mmurphytest/received_events,User,false,[],closed,false,,[],,0,2024-05-29T18:56:14Z,2024-05-29T18:59:49Z,2024-05-29T18:59:49Z,NONE,,false,https://api.github.com/repos/bigcommerce/docs/pulls/299,https://github.com/bigcommerce/docs/pull/299,https://github.com/bigcommerce/docs/pull/299.diff,https://github.com/bigcommerce/docs/pull/299.patch,,"I thought the emoji helped + +<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/299/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/299/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/298,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/298/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/298/comments,https://api.github.com/repos/bigcommerce/docs/issues/298/events,https://github.com/bigcommerce/docs/pull/298,2323539551,PR_kwDOI7BBSM5w5a-V,298,DEVDOCS-5914: [Update] name definition,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-29T14:54:34Z,2024-05-31T14:54:57Z,2024-05-31T14:54:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/298,https://github.com/bigcommerce/docs/pull/298,https://github.com/bigcommerce/docs/pull/298.diff,https://github.com/bigcommerce/docs/pull/298.patch,2024-05-31T14:54:56Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5914] + + +## What changed? +Update description for category name. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5914]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5914?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/298/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/298/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/297,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/297/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/297/comments,https://api.github.com/repos/bigcommerce/docs/issues/297/events,https://github.com/bigcommerce/docs/issues/297,2323445658,I_kwDOI7BBSM6KfPea,297,Feedback for “Creating an External Installation Button”,preetham9498,85742748,MDQ6VXNlcjg1NzQyNzQ4,https://avatars.githubusercontent.com/u/85742748?v=4,,https://api.github.com/users/preetham9498,https://github.com/preetham9498,https://api.github.com/users/preetham9498/followers,https://api.github.com/users/preetham9498/following{/other_user},https://api.github.com/users/preetham9498/gists{/gist_id},https://api.github.com/users/preetham9498/starred{/owner}{/repo},https://api.github.com/users/preetham9498/subscriptions,https://api.github.com/users/preetham9498/orgs,https://api.github.com/users/preetham9498/repos,https://api.github.com/users/preetham9498/events{/privacy},https://api.github.com/users/preetham9498/received_events,User,false,[],closed,false,,[],,1,2024-05-29T14:13:49Z,2024-05-30T16:53:13Z,2024-05-30T16:53:13Z,NONE,,,,,,,,"I am unable to test this with my draft app. It says that ""This app is not available for installation"" + +![image](https://github.com/bigcommerce/docs/assets/85742748/8b5f9186-d41e-4a71-b667-4a1038f7b9d9) + +Is there any way to test this flow by generating a temporary custom install link for my draft app?",https://api.github.com/repos/bigcommerce/docs/issues/297/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/297/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/296,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/296/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/296/comments,https://api.github.com/repos/bigcommerce/docs/issues/296/events,https://github.com/bigcommerce/docs/pull/296,2322308287,PR_kwDOI7BBSM5w1MpE,296,Fix response code for createShippingZones operation,funivan,425208,MDQ6VXNlcjQyNTIwOA==,https://avatars.githubusercontent.com/u/425208?v=4,,https://api.github.com/users/funivan,https://github.com/funivan,https://api.github.com/users/funivan/followers,https://api.github.com/users/funivan/following{/other_user},https://api.github.com/users/funivan/gists{/gist_id},https://api.github.com/users/funivan/starred{/owner}{/repo},https://api.github.com/users/funivan/subscriptions,https://api.github.com/users/funivan/orgs,https://api.github.com/users/funivan/repos,https://api.github.com/users/funivan/events{/privacy},https://api.github.com/users/funivan/received_events,User,false,[],closed,false,,[],,0,2024-05-29T04:06:44Z,2024-06-03T17:46:01Z,2024-06-03T17:46:01Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/296,https://github.com/bigcommerce/docs/pull/296,https://github.com/bigcommerce/docs/pull/296.diff,https://github.com/bigcommerce/docs/pull/296.patch,2024-06-03T17:46:01Z,"## What changed? +Change response code +![image](https://github.com/bigcommerce/docs/assets/425208/d4b71d0d-2453-4494-b52c-2683d2fb79e5) + +## Release notes draft + +Fixed a bug in the /v2/shipping/zones. Now the response code is 201 instead of 200 + +## Anything else? +-",https://api.github.com/repos/bigcommerce/docs/issues/296/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/296/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/295,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/295/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/295/comments,https://api.github.com/repos/bigcommerce/docs/issues/295/events,https://github.com/bigcommerce/docs/pull/295,2321466583,PR_kwDOI7BBSM5wyWf7,295,SELFDEV-650 : [update] example for create a product modifier,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-05-28T16:18:28Z,2024-05-30T16:03:17Z,2024-05-30T16:03:17Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/295,https://github.com/bigcommerce/docs/pull/295,https://github.com/bigcommerce/docs/pull/295.diff,https://github.com/bigcommerce/docs/pull/295.patch,2024-05-30T16:03:17Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-650] + + +## What changed? +This should be a DEVDOCS tickets, not a SELFDEV. There specification file is fine. I just added a correct example. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[SELFDEV-650]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-650?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/295/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/295/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/294,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/294/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/294/comments,https://api.github.com/repos/bigcommerce/docs/issues/294/events,https://github.com/bigcommerce/docs/issues/294,2320700662,I_kwDOI7BBSM6KUxT2,294,Feedback for “Products”,KmcEA,159226720,U_kgDOCX2bYA,https://avatars.githubusercontent.com/u/159226720?v=4,,https://api.github.com/users/KmcEA,https://github.com/KmcEA,https://api.github.com/users/KmcEA/followers,https://api.github.com/users/KmcEA/following{/other_user},https://api.github.com/users/KmcEA/gists{/gist_id},https://api.github.com/users/KmcEA/starred{/owner}{/repo},https://api.github.com/users/KmcEA/subscriptions,https://api.github.com/users/KmcEA/orgs,https://api.github.com/users/KmcEA/repos,https://api.github.com/users/KmcEA/events{/privacy},https://api.github.com/users/KmcEA/received_events,User,false,[],open,false,,[],,2,2024-05-28T10:27:07Z,2024-06-04T20:51:16Z,,NONE,,,,,,,,How do i save or update if i want more than related products in our record there old products have 150 plus related products when we are trying to update it does not want us to update the products cause it is too many related,https://api.github.com/repos/bigcommerce/docs/issues/294/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/294/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/293,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/293/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/293/comments,https://api.github.com/repos/bigcommerce/docs/issues/293/events,https://github.com/bigcommerce/docs/pull/293,2316185540,PR_kwDOI7BBSM5wgeUf,293,DEVDOCS-5906: [Update]custom_url and url,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-24T20:11:10Z,2024-05-31T14:53:47Z,2024-05-31T14:53:47Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/293,https://github.com/bigcommerce/docs/pull/293,https://github.com/bigcommerce/docs/pull/293.diff,https://github.com/bigcommerce/docs/pull/293.patch,2024-05-31T14:53:47Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5906] + + +## What changed? +Updating the descriptions for custom_url and url + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5906]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5906?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/293/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/293/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/292,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/292/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/292/comments,https://api.github.com/repos/bigcommerce/docs/issues/292/events,https://github.com/bigcommerce/docs/pull/292,2315782118,PR_kwDOI7BBSM5wfEqv,292,DEVDOCS-5949: [update] added a note about option_values,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-24T16:21:08Z,2024-05-28T16:56:25Z,2024-05-28T16:56:24Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/292,https://github.com/bigcommerce/docs/pull/292,https://github.com/bigcommerce/docs/pull/292.diff,https://github.com/bigcommerce/docs/pull/292.patch,2024-05-28T16:56:24Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5949] + + +## What changed? +Added a note about how to obtain the option values needed in the create a product variant request. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5949]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5949?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/292/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/292/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/291,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/291/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/291/comments,https://api.github.com/repos/bigcommerce/docs/issues/291/events,https://github.com/bigcommerce/docs/pull/291,2315595426,PR_kwDOI7BBSM5webiV,291,SELFDEV-673 Trigger build on merge to main,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-05-24T14:48:59Z,2024-05-24T17:25:15Z,2024-05-24T17:25:14Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/291,https://github.com/bigcommerce/docs/pull/291,https://github.com/bigcommerce/docs/pull/291.diff,https://github.com/bigcommerce/docs/pull/291.patch,2024-05-24T17:25:14Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-673] + + +## What changed? +This modifies the deploy GH Action to trigger a production developer center build in CircleCI on docs are merged to the `main` docs branch. + + +[SELFDEV-673]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-673?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/291/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/291/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/290,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/290/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/290/comments,https://api.github.com/repos/bigcommerce/docs/issues/290/events,https://github.com/bigcommerce/docs/pull/290,2313954091,PR_kwDOI7BBSM5wYxl8,290,"[DEVDOCS-5787]: [New] GQL Storefront Orders API, Create new doc",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-05-23T22:20:08Z,2024-07-19T20:46:21Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/290,https://github.com/bigcommerce/docs/pull/290,https://github.com/bigcommerce/docs/pull/290.diff,https://github.com/bigcommerce/docs/pull/290.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5787] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Create new documentation for GraphQL Storefront Orders API + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* New feature: GQL Storefront Orders API now in beta! Access and manage order information with enhanced query and mutation operations. Try it out and share your feedback! 🚀 + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @jamie-mckenzie + + +[DEVDOCS-5787]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5787?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/290/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/290/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/289,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/289/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/289/comments,https://api.github.com/repos/bigcommerce/docs/issues/289/events,https://github.com/bigcommerce/docs/pull/289,2313073551,PR_kwDOI7BBSM5wVuvO,289,DEVDOCS-5896: [Update] add cart redirect URL,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-23T14:27:05Z,2024-05-29T16:54:58Z,2024-05-29T16:54:57Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/289,https://github.com/bigcommerce/docs/pull/289,https://github.com/bigcommerce/docs/pull/289.diff,https://github.com/bigcommerce/docs/pull/289.patch,2024-05-29T16:54:57Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5896] + + +## What changed? +Add cart redirect URL + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5896]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5896?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/289/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/289/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/288,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/288/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/288/comments,https://api.github.com/repos/bigcommerce/docs/issues/288/events,https://github.com/bigcommerce/docs/pull/288,2311504785,PR_kwDOI7BBSM5wQZ44,288,DEVDOCS-5033: [new] B2B getting started + GraphQL Storefront API auth narrative,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-22T21:20:56Z,2024-05-22T23:29:18Z,2024-05-22T23:29:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/288,https://github.com/bigcommerce/docs/pull/288,https://github.com/bigcommerce/docs/pull/288.diff,https://github.com/bigcommerce/docs/pull/288.patch,2024-05-22T23:29:18Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5033] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5033]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5033?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/288/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/288/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/287,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/287/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/287/comments,https://api.github.com/repos/bigcommerce/docs/issues/287/events,https://github.com/bigcommerce/docs/pull/287,2310760860,PR_kwDOI7BBSM5wN0Dr,287,"[DEVDOCS-5955]: [update] OrdersV3, Support new query parameter transaction_id in GET Refunds API endpoints",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,,[],,1,2024-05-22T14:52:40Z,2024-05-22T22:57:02Z,2024-05-22T15:12:31Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/287,https://github.com/bigcommerce/docs/pull/287,https://github.com/bigcommerce/docs/pull/287.diff,https://github.com/bigcommerce/docs/pull/287.patch,2024-05-22T15:12:31Z," +## What changed? +* Support new query parameter `transaction_id` in GET Refunds API endpoints: +e.g.: +GET /v3/orders/{id}/payment_actions/refunds?transaction_id=13 GET /v3/orders/payment_actions/refunds?transaction_id=13 + +* Expose `transaction_id` field to refund.payment on the API: + + +![image](https://github.com/bigcommerce/docs/assets/63274600/e1059f15-a8ba-4d72-b215-677bddcf62b9) + +**Testing proof**: +- The new query param is displayed correctly in the swagger editor: + +<img width=""632"" alt=""image"" +src=""https://github.com/bigcommerce/docs/assets/63274600/29037ec4-7c7c-4680-8bd6-e14ca8ea4f86""> + +- The new field is displayed correctly in the swagger editor: + +<img width=""611"" alt=""image"" +src=""https://github.com/bigcommerce/docs/assets/63274600/a56a1ff7-ad47-4656-948f-3c3d892382f8""> + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + + +ping @bigcommerce/team-orders @slsriehl @bc-tgomez + +<!-- Ticket number or summary of work --> +# [DEVDOCS-5955] - Pulled in PR from Orders team + + +## Anything else? +# [ORDERS-6364 and ORDERS-6365] (#286) + +ping @donald-nguyen-bc + + +[DEVDOCS-5955]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5955?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/287/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/287/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/286,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/286/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/286/comments,https://api.github.com/repos/bigcommerce/docs/issues/286/events,https://github.com/bigcommerce/docs/pull/286,2309419602,PR_kwDOI7BBSM5wJNNx,286,"doc(orders): ORDERS-6364 ORDERS-6365 support new query parameter ""tra…",donald-nguyen-bc,63274600,MDQ6VXNlcjYzMjc0NjAw,https://avatars.githubusercontent.com/u/63274600?v=4,,https://api.github.com/users/donald-nguyen-bc,https://github.com/donald-nguyen-bc,https://api.github.com/users/donald-nguyen-bc/followers,https://api.github.com/users/donald-nguyen-bc/following{/other_user},https://api.github.com/users/donald-nguyen-bc/gists{/gist_id},https://api.github.com/users/donald-nguyen-bc/starred{/owner}{/repo},https://api.github.com/users/donald-nguyen-bc/subscriptions,https://api.github.com/users/donald-nguyen-bc/orgs,https://api.github.com/users/donald-nguyen-bc/repos,https://api.github.com/users/donald-nguyen-bc/events{/privacy},https://api.github.com/users/donald-nguyen-bc/received_events,User,false,[],closed,false,,[],,1,2024-05-22T02:02:09Z,2024-05-22T22:57:59Z,2024-05-22T14:48:40Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/286,https://github.com/bigcommerce/docs/pull/286,https://github.com/bigcommerce/docs/pull/286.diff,https://github.com/bigcommerce/docs/pull/286.patch,2024-05-22T14:48:40Z,"…nsaction_id"" and also add new field ""transaction_id"" in the response of the GET Refunds API + +# [ORDERS-6364 and ORDERS-6365] + +## What changed? +* Support new query parameter `transaction_id` in GET Refunds API endpoints: +e.g.: +GET /v3/orders/{id}/payment_actions/refunds?transaction_id=13 +GET /v3/orders/payment_actions/refunds?transaction_id=13 + +* Expose `transaction_id` field to refund.payment on the API: + +![image](https://github.com/bigcommerce/docs/assets/63274600/e1059f15-a8ba-4d72-b215-677bddcf62b9) + +**Testing proof**: +- The new query param is displayed correctly in the swagger editor: + +<img width=""632"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/63274600/29037ec4-7c7c-4680-8bd6-e14ca8ea4f86""> + +- The new field is displayed correctly in the swagger editor: + +<img width=""611"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/63274600/a56a1ff7-ad47-4656-948f-3c3d892382f8""> + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + + +ping @bigcommerce/team-orders @slsriehl @bc-tgomez +",https://api.github.com/repos/bigcommerce/docs/issues/286/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/286/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/285,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/285/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/285/comments,https://api.github.com/repos/bigcommerce/docs/issues/285/events,https://github.com/bigcommerce/docs/pull/285,2309230890,PR_kwDOI7BBSM5wIkLk,285,"(no ticket): [update] Process payments, remove faulty examples",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-21T22:34:10Z,2024-05-21T23:43:23Z,2024-05-21T23:43:23Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/285,https://github.com/bigcommerce/docs/pull/285,https://github.com/bigcommerce/docs/pull/285.diff,https://github.com/bigcommerce/docs/pull/285.patch,2024-05-21T23:43:22Z,"<!-- Ticket number or summary of work --> +# (no ticket): [update] Process payments, remove faulty examples + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* change x-examples to examples +* remove duplicate example +* remove ill-formatted examples +* remove curl example with no request body + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/285/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/285/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/284,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/284/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/284/comments,https://api.github.com/repos/bigcommerce/docs/issues/284/events,https://github.com/bigcommerce/docs/pull/284,2308763441,PR_kwDOI7BBSM5wG8g9,284,"DEVDOCS-5890 [new]: Stencil theme, add Japanese language",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-05-21T17:22:24Z,2024-05-22T18:45:37Z,2024-05-22T18:45:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/284,https://github.com/bigcommerce/docs/pull/284,https://github.com/bigcommerce/docs/pull/284.diff,https://github.com/bigcommerce/docs/pull/284.patch,2024-05-22T18:45:36Z,"# [DEVDOCS-5890] + + +## What changed? +- Add Japanese as a supported language for your Stencil storefront content. + +## Release notes draft + +We are excited to announce Japanese language support. Now, BigCommerce's Cornerstone Stencil theme supports uneditable strings in Japanese. + +## Anything else? + +@bigcommerce/team-localization + + +[DEVDOCS-5890]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5890?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/284/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/284/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/283,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/283/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/283/comments,https://api.github.com/repos/bigcommerce/docs/issues/283/events,https://github.com/bigcommerce/docs/pull/283,2308668405,PR_kwDOI7BBSM5wGnwJ,283,ISSUE-274: [fix] Remove duplicate parameters,smcc-riccardoc,147587711,U_kgDOCMwCfw,https://avatars.githubusercontent.com/u/147587711?v=4,,https://api.github.com/users/smcc-riccardoc,https://github.com/smcc-riccardoc,https://api.github.com/users/smcc-riccardoc/followers,https://api.github.com/users/smcc-riccardoc/following{/other_user},https://api.github.com/users/smcc-riccardoc/gists{/gist_id},https://api.github.com/users/smcc-riccardoc/starred{/owner}{/repo},https://api.github.com/users/smcc-riccardoc/subscriptions,https://api.github.com/users/smcc-riccardoc/orgs,https://api.github.com/users/smcc-riccardoc/repos,https://api.github.com/users/smcc-riccardoc/events{/privacy},https://api.github.com/users/smcc-riccardoc/received_events,User,false,[],closed,false,,[],,0,2024-05-21T16:22:37Z,2024-05-21T16:42:21Z,2024-05-21T16:42:21Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/283,https://github.com/bigcommerce/docs/pull/283,https://github.com/bigcommerce/docs/pull/283.diff,https://github.com/bigcommerce/docs/pull/283.patch,2024-05-21T16:42:21Z,"## What changed? +<!-- Provide a bulleted list in the present tense --> +* remove duplicated parameters (as #274) +* mark request body for `updateProducts` operation as required + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +No need for release notes, this PR only fixes some documentation errors. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +This PR actually fixes a little more than what is reported in #274. During development I noticed another problem (see commit 32bfcbb) which I decided to fix immediately instead of opening another issue. Feel free to discard this commit when merging the PR if that `required: false` is not an error. + +ping @slsriehl @bc-tgomez ",https://api.github.com/repos/bigcommerce/docs/issues/283/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/283/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/282,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/282/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/282/comments,https://api.github.com/repos/bigcommerce/docs/issues/282/events,https://github.com/bigcommerce/docs/pull/282,2308615093,PR_kwDOI7BBSM5wGcBK,282,"ISSUE-280 + ISSUE-281: [update] Product variant metafields, reorder fields + populate response example",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-21T15:52:26Z,2024-05-21T15:58:43Z,2024-05-21T15:58:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/282,https://github.com/bigcommerce/docs/pull/282,https://github.com/bigcommerce/docs/pull/282.diff,https://github.com/bigcommerce/docs/pull/282.patch,2024-05-21T15:58:42Z,"<!-- Ticket number or summary of work --> +# ISSUE-280 + ISSUE-281: [update] Product variant metafields, reorder fields + populate response example +* #280 +* #281 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Reorder fields in the several product variant metafields responses +* Populate response body by removing required and readOnly fields from response schema + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @atensoftware @bc-tgomez +",https://api.github.com/repos/bigcommerce/docs/issues/282/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/282/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/281,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/281/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/281/comments,https://api.github.com/repos/bigcommerce/docs/issues/281/events,https://github.com/bigcommerce/docs/issues/281,2308231754,I_kwDOI7BBSM6JlNJK,281,Inconsistent Ordering of fields for “Batch Metafields”,atensoftware,20326471,MDQ6VXNlcjIwMzI2NDcx,https://avatars.githubusercontent.com/u/20326471?v=4,,https://api.github.com/users/atensoftware,https://github.com/atensoftware,https://api.github.com/users/atensoftware/followers,https://api.github.com/users/atensoftware/following{/other_user},https://api.github.com/users/atensoftware/gists{/gist_id},https://api.github.com/users/atensoftware/starred{/owner}{/repo},https://api.github.com/users/atensoftware/subscriptions,https://api.github.com/users/atensoftware/orgs,https://api.github.com/users/atensoftware/repos,https://api.github.com/users/atensoftware/events{/privacy},https://api.github.com/users/atensoftware/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-05-21T12:49:18Z,2024-05-21T16:01:26Z,2024-05-21T16:01:26Z,NONE,,,,,,,,"Currently, the documentation lists the fields in this order: + +permission_set +namespace +key +value +description +resource_type +resource_id +id +date_created +date_modified +owner_client_id + +An actual API call emits the data in this order: +""id"" +""key"" +""value"" +""namespace"" +""permission_set"" +""resource_type"" +""resource_id"" +""description"" +""date_created"" +""date_modified"" +""owner_client_id"" + +Instead, the **documentation should list the fields in the same order as the API output**. In this case, the API output is in a more logical order and is far preferred to the ordering listed in the documentation. If possible, the preferred ordering would be: + +""id"" +""namespace"" +""key"" +""value"" +""resource_id"" +""resource_type"" +""description"" +""permission_set"" +""owner_client_id"" +""date_created"" +""date_modified"" + + +In general, throughout the BC documentation and API, field names should be listed in a logical order or alphabetical order, and ordered consistently in the field list, example JSON, and actual API output. It's a big project to go through all that, but would it would improve the documentation considerably IMHO. +",https://api.github.com/repos/bigcommerce/docs/issues/281/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/281/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/280,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/280/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/280/comments,https://api.github.com/repos/bigcommerce/docs/issues/280/events,https://github.com/bigcommerce/docs/issues/280,2308149115,I_kwDOI7BBSM6Jk497,280,Example JSON for “Batch Metafields”,atensoftware,20326471,MDQ6VXNlcjIwMzI2NDcx,https://avatars.githubusercontent.com/u/20326471?v=4,,https://api.github.com/users/atensoftware,https://github.com/atensoftware,https://api.github.com/users/atensoftware/followers,https://api.github.com/users/atensoftware/following{/other_user},https://api.github.com/users/atensoftware/gists{/gist_id},https://api.github.com/users/atensoftware/starred{/owner}{/repo},https://api.github.com/users/atensoftware/subscriptions,https://api.github.com/users/atensoftware/orgs,https://api.github.com/users/atensoftware/repos,https://api.github.com/users/atensoftware/events{/privacy},https://api.github.com/users/atensoftware/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-05-21T12:08:39Z,2024-05-21T16:02:45Z,2024-05-21T16:02:45Z,NONE,,,,,,,,"https://developer.bigcommerce.com/docs/rest-catalog/product-variants/batch-metafields#get-all-product-variant-metafields + +Currently, the example JSON is missing **resource_id** and **owner_client_id** in the 200 response body 'data' section. +Instead, add those to the example JSON response. Especially 'resource_id', since without that, there is no way to link the meta-field value back to its resource. + + + +",https://api.github.com/repos/bigcommerce/docs/issues/280/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/280/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/279,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/279/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/279/comments,https://api.github.com/repos/bigcommerce/docs/issues/279/events,https://github.com/bigcommerce/docs/pull/279,2306378730,PR_kwDOI7BBSM5v-vUs,279,DEVDOCS-5851: [update] add Deprecated label,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-20T16:50:55Z,2024-05-30T16:04:56Z,2024-05-30T16:04:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/279,https://github.com/bigcommerce/docs/pull/279,https://github.com/bigcommerce/docs/pull/279.diff,https://github.com/bigcommerce/docs/pull/279.patch,2024-05-30T16:04:18Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5851] + + +## What changed? +Add deprecation label on the name of endpoint to alleviate confusion + +## Release notes draft +Add deprecation label on the name of endpoint to alleviate confusion and updated examples. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5851]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5851?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/279/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/279/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/278,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/278/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/278/comments,https://api.github.com/repos/bigcommerce/docs/issues/278/events,https://github.com/bigcommerce/docs/pull/278,2304532712,PR_kwDOI7BBSM5v4j8O,278,"DEVDOCS-5907: [update] Pricing, change name:like from csv array to string",Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],closed,false,,[],,1,2024-05-19T10:05:27Z,2024-07-07T15:42:16Z,2024-05-20T14:29:54Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/278,https://github.com/bigcommerce/docs/pull/278,https://github.com/bigcommerce/docs/pull/278.diff,https://github.com/bigcommerce/docs/pull/278.patch,2024-05-20T14:29:54Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5907] Update ""name:like="" parameter from array to string (Pricing API) + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* The name:like parameter is documented to accept an array, however it can only accept a string for price lists. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Provide accurate documentation as to what data type the name:like parameter accepts for Price Lists. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +Confirmed by pricing team here: +https://bigcommerce.slack.com/archives/C05DH8JCESU/p1713971423881579 + + +[DEVDOCS-5907]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5907?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/278/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/278/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/277,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/277/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/277/comments,https://api.github.com/repos/bigcommerce/docs/issues/277/events,https://github.com/bigcommerce/docs/pull/277,2303430164,PR_kwDOI7BBSM5v1EG3,277,5627 test,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-05-17T19:27:55Z,2024-05-20T16:17:56Z,2024-05-20T16:17:52Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/277,https://github.com/bigcommerce/docs/pull/277,https://github.com/bigcommerce/docs/pull/277.diff,https://github.com/bigcommerce/docs/pull/277.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/277/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/277/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/276,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/276/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/276/comments,https://api.github.com/repos/bigcommerce/docs/issues/276/events,https://github.com/bigcommerce/docs/pull/276,2301827353,PR_kwDOI7BBSM5vvj8L,276,"No ticket: Tax Provider API, add `fee` tax item type to `tax_item` types",theromulans,10804073,MDQ6VXNlcjEwODA0MDcz,https://avatars.githubusercontent.com/u/10804073?v=4,,https://api.github.com/users/theromulans,https://github.com/theromulans,https://api.github.com/users/theromulans/followers,https://api.github.com/users/theromulans/following{/other_user},https://api.github.com/users/theromulans/gists{/gist_id},https://api.github.com/users/theromulans/starred{/owner}{/repo},https://api.github.com/users/theromulans/subscriptions,https://api.github.com/users/theromulans/orgs,https://api.github.com/users/theromulans/repos,https://api.github.com/users/theromulans/events{/privacy},https://api.github.com/users/theromulans/received_events,User,false,[],closed,false,,[],,2,2024-05-17T05:02:09Z,2024-05-21T22:08:40Z,2024-05-21T22:08:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/276,https://github.com/bigcommerce/docs/pull/276,https://github.com/bigcommerce/docs/pull/276.diff,https://github.com/bigcommerce/docs/pull/276.patch,2024-05-21T22:08:39Z,"## What changed? +- Add `fee` to tax item types. + +## Release notes draft +No need for release notes, minor additive change that reflects an adjustment from some months ago. + +## Anything else? +Nope.",https://api.github.com/repos/bigcommerce/docs/issues/276/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/276/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/275,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/275/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/275/comments,https://api.github.com/repos/bigcommerce/docs/issues/275/events,https://github.com/bigcommerce/docs/pull/275,2300741866,PR_kwDOI7BBSM5vr2Ef,275,"[DEVDOCS-5945]: [update] Customers, Update API examples and add contextual info",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-05-16T15:39:45Z,2024-05-20T20:16:35Z,2024-05-20T20:16:34Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/275,https://github.com/bigcommerce/docs/pull/275,https://github.com/bigcommerce/docs/pull/275.diff,https://github.com/bigcommerce/docs/pull/275.patch,2024-05-20T20:16:34Z,"# [DEVDOCS-5945] + + +## What changed? +* Added examples of POST/PUT requests for subscribers +* Added information around the importance of `consents` determining whether a subscriber has opted in or not + +## Release notes draft +Currently there is ambiguity around what it means to be a subscriber or not. When a shopper is created during checkout, regardless a subscriber will be created (however they may not be opted in, a record exists regardless). + +## Anything else? +Related: doc(customers): CUST-2597 Customers-Subscribers overview page (#273) + +ping @bc-tgomez @bigcommerce/team-customers @slsriehl + +### Original: + +[CUST-2597]: +https://bigcommercecloud.atlassian.net/browse/CUST-2597?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5945]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5945?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[CUST-2597]: https://bigcommercecloud.atlassian.net/browse/CUST-2597?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/275/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/275/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/274,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/274/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/274/comments,https://api.github.com/repos/bigcommerce/docs/issues/274/events,https://github.com/bigcommerce/docs/issues/274,2300490906,I_kwDOI7BBSM6JHrSa,274,Duplicate parameters in some OpenAPI operations,smcc-riccardoc,147587711,U_kgDOCMwCfw,https://avatars.githubusercontent.com/u/147587711?v=4,,https://api.github.com/users/smcc-riccardoc,https://github.com/smcc-riccardoc,https://api.github.com/users/smcc-riccardoc/followers,https://api.github.com/users/smcc-riccardoc/following{/other_user},https://api.github.com/users/smcc-riccardoc/gists{/gist_id},https://api.github.com/users/smcc-riccardoc/starred{/owner}{/repo},https://api.github.com/users/smcc-riccardoc/subscriptions,https://api.github.com/users/smcc-riccardoc/orgs,https://api.github.com/users/smcc-riccardoc/repos,https://api.github.com/users/smcc-riccardoc/events{/privacy},https://api.github.com/users/smcc-riccardoc/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false},{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-05-16T13:56:32Z,2024-05-21T16:43:35Z,2024-05-21T16:43:35Z,CONTRIBUTOR,,,,,,,,"Hello, while parsing OpenAPI definition files in [docs/reference](https://github.com/bigcommerce/docs/tree/main/reference) using [openapi-typescript](https://openapi-ts.pages.dev/) I have noticed that some operations contain duplicated parameters. + +Specifically: +operationId | schema file | duplicated parameters +--- | --- | --- +`getCustomerStoredInstruments` | [customers.v3.yml](https://github.com/bigcommerce/docs/blob/8739e57a8c940b868822203350eb53738dfa72ef/reference/customers.v3.yml#L1596) | `customerId` +`getOrderConsignments` | [orders.v2.oas2.yml](https://github.com/bigcommerce/docs/blob/8739e57a8c940b868822203350eb53738dfa72ef/reference/orders.v2.oas2.yml#L979) | `order_id` +`getThemeConfiguration` | [themes.v3.yml](https://github.com/bigcommerce/docs/blob/8739e57a8c940b868822203350eb53738dfa72ef/reference/themes.v3.yml#L488) | `page`, `limit` +`previewWidget` | [widgets.v3.yml](https://github.com/bigcommerce/docs/blob/8739e57a8c940b868822203350eb53738dfa72ef/reference/widgets.v3.yml#L149) | `uuid` + +Also, these duplications appears in the docs at developer.bigcommerce.com, which may cause confusion. Example for the `getCustomerStoredInstruments` operation: +![Duplicated `customerId` parameter in the `getCustomerStoredInstruments` operation](https://github.com/bigcommerce/docs/assets/147587711/fbf83395-fc2f-42ef-ae94-601aacb72d8e) + +Is there a reason that I am missing for these duplications to be present? + +I am available to open a pull request if there is something that should be fixed.",https://api.github.com/repos/bigcommerce/docs/issues/274/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/274/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/273,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/273/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/273/comments,https://api.github.com/repos/bigcommerce/docs/issues/273/events,https://github.com/bigcommerce/docs/pull/273,2299452529,PR_kwDOI7BBSM5vnZYk,273,doc(customers): CUST-2597 Customers-Subscribers overview page,mjhmatt,9570178,MDQ6VXNlcjk1NzAxNzg=,https://avatars.githubusercontent.com/u/9570178?v=4,,https://api.github.com/users/mjhmatt,https://github.com/mjhmatt,https://api.github.com/users/mjhmatt/followers,https://api.github.com/users/mjhmatt/following{/other_user},https://api.github.com/users/mjhmatt/gists{/gist_id},https://api.github.com/users/mjhmatt/starred{/owner}{/repo},https://api.github.com/users/mjhmatt/subscriptions,https://api.github.com/users/mjhmatt/orgs,https://api.github.com/users/mjhmatt/repos,https://api.github.com/users/mjhmatt/events{/privacy},https://api.github.com/users/mjhmatt/received_events,User,false,[],closed,false,,[],,0,2024-05-16T06:19:23Z,2024-05-16T15:35:30Z,2024-05-16T15:35:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/273,https://github.com/bigcommerce/docs/pull/273,https://github.com/bigcommerce/docs/pull/273.diff,https://github.com/bigcommerce/docs/pull/273.patch,2024-05-16T15:35:30Z,"# [CUST-2597] + + +## What changed? +* Added examples of POST/PUT requests for subscribers +* Added information around the importance of `consents` determining whether a subscriber has opted in or not + +## Release notes draft +Currently there is ambiguity around what it means to be a subscriber or not. When a shopper is created during checkout, regardless a subscriber will be created (however they may not be opted in, a record exists regardless). + +## Anything else? +N/A + +ping @bc-tgomez @bigcommerce/team-customers + + +[CUST-2597]: https://bigcommercecloud.atlassian.net/browse/CUST-2597?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/273/reactions,1,0,0,0,0,0,0,0,1,https://api.github.com/repos/bigcommerce/docs/issues/273/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/272,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/272/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/272/comments,https://api.github.com/repos/bigcommerce/docs/issues/272/events,https://github.com/bigcommerce/docs/pull/272,2298808069,PR_kwDOI7BBSM5vlMdq,272,DEVDOCS-5898: Product reviews,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-05-15T20:42:51Z,2024-05-17T15:51:54Z,2024-05-17T15:31:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/272,https://github.com/bigcommerce/docs/pull/272,https://github.com/bigcommerce/docs/pull/272.diff,https://github.com/bigcommerce/docs/pull/272.patch,2024-05-17T15:31:27Z,"# [DEVDOCS-5898] + +## What changed? +* Add net new doc for product reviews, which includes the newly-released mutation + +## Release notes draft +* The newly-released product review mutation is now available to use. Now, you’ll be able to create product reviews through the built-in comment system using the GraphQL Storefront API. + +## Anything else? +- [PR 897](https://github.com/bigcommerce/developer-center/pull/897) for changing toc on site +- Upcoming PR (for editing GQL SF API descriptions) + + + +[DEVDOCS-5898]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5898?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/272/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/272/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/271,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/271/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/271/comments,https://api.github.com/repos/bigcommerce/docs/issues/271/events,https://github.com/bigcommerce/docs/pull/271,2298724521,PR_kwDOI7BBSM5vk6Av,271,"ISSUE-268: [update] Support options, update to reflect current resources",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-15T19:50:15Z,2024-05-15T20:01:11Z,2024-05-15T20:01:10Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/271,https://github.com/bigcommerce/docs/pull/271,https://github.com/bigcommerce/docs/pull/271.diff,https://github.com/bigcommerce/docs/pull/271.patch,2024-05-15T20:01:10Z,"<!-- Ticket number or summary of work --> +# ISSUE-268: [update] Support options, update to reflect current resources +* #268 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update the support options available to developers + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've updated our list of dev support options to include the Resource Hub. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @madisontillery @bc-traciporter +",https://api.github.com/repos/bigcommerce/docs/issues/271/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/271/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/270,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/270/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/270/comments,https://api.github.com/repos/bigcommerce/docs/issues/270/events,https://github.com/bigcommerce/docs/pull/270,2298616540,PR_kwDOI7BBSM5vkh5x,270,DEVDOCS-5917: [update] added missing image_url object,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-15T18:54:21Z,2024-05-17T16:00:35Z,2024-05-17T16:00:35Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/270,https://github.com/bigcommerce/docs/pull/270,https://github.com/bigcommerce/docs/pull/270.diff,https://github.com/bigcommerce/docs/pull/270.patch,2024-05-17T16:00:35Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5917] + + +## What changed? +Added missing `image_url` in the response body for the Create a Product Variant endpoint. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5917]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5917?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/270/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/270/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/269,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/269/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/269/comments,https://api.github.com/repos/bigcommerce/docs/issues/269/events,https://github.com/bigcommerce/docs/pull/269,2296227426,PR_kwDOI7BBSM5vcUuj,269,DEVDOCS-5931 - Fix typo,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,,[],,0,2024-05-14T19:20:30Z,2024-05-14T19:41:49Z,2024-05-14T19:41:48Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/269,https://github.com/bigcommerce/docs/pull/269,https://github.com/bigcommerce/docs/pull/269.diff,https://github.com/bigcommerce/docs/pull/269.patch,2024-05-14T19:41:48Z,"Fix typo from previous merge. +",https://api.github.com/repos/bigcommerce/docs/issues/269/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/269/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/268,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/268/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/268/comments,https://api.github.com/repos/bigcommerce/docs/issues/268/events,https://github.com/bigcommerce/docs/issues/268,2296073160,I_kwDOI7BBSM6I20vI,268,Feedback for “Staying Current with Platform Changes”,MadisonTillery,143548054,U_kgDOCI5elg,https://avatars.githubusercontent.com/u/143548054?v=4,,https://api.github.com/users/MadisonTillery,https://github.com/MadisonTillery,https://api.github.com/users/MadisonTillery/followers,https://api.github.com/users/MadisonTillery/following{/other_user},https://api.github.com/users/MadisonTillery/gists{/gist_id},https://api.github.com/users/MadisonTillery/starred{/owner}{/repo},https://api.github.com/users/MadisonTillery/subscriptions,https://api.github.com/users/MadisonTillery/orgs,https://api.github.com/users/MadisonTillery/repos,https://api.github.com/users/MadisonTillery/events{/privacy},https://api.github.com/users/MadisonTillery/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-05-14T18:10:32Z,2024-05-16T17:02:56Z,2024-05-16T17:02:56Z,NONE,,,,,,,,"Should we change verbiage for ""changelog/changelogs"" to ""release notes"" as the actual page links to release notes + +https://developer.bigcommerce.com/archive/start/partner/staying-current > references _Developer Changelog_ and _changelog_ + +- It actually links to here: https://developer.bigcommerce.com/release-notes + +https://developer.bigcommerce.com/docs/start/about/support#changelog > definition of changelog, could be potentially edited to advise of the change in verbiage only? +",https://api.github.com/repos/bigcommerce/docs/issues/268/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/268/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/267,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/267/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/267/comments,https://api.github.com/repos/bigcommerce/docs/issues/267/events,https://github.com/bigcommerce/docs/pull/267,2293307957,PR_kwDOI7BBSM5vSQks,267,"ISSUE-202: [update] Category object, add empty properties",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-13T16:36:49Z,2024-05-13T16:38:56Z,2024-05-13T16:38:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/267,https://github.com/bigcommerce/docs/pull/267,https://github.com/bigcommerce/docs/pull/267.diff,https://github.com/bigcommerce/docs/pull/267.patch,2024-05-13T16:38:55Z,"<!-- Ticket number or summary of work --> +# ISSUE-202: [update] Category object, add empty properties + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add empty properties to objects that didn't have them, per #202 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-traciporter +",https://api.github.com/repos/bigcommerce/docs/issues/267/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/267/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/266,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/266/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/266/comments,https://api.github.com/repos/bigcommerce/docs/issues/266/events,https://github.com/bigcommerce/docs/pull/266,2292642417,PR_kwDOI7BBSM5vP9UK,266,"CATALOG-9785: [update] Catalog, update all Brands V3 endpoints",NataliiaNefodova,83062053,MDQ6VXNlcjgzMDYyMDUz,https://avatars.githubusercontent.com/u/83062053?v=4,,https://api.github.com/users/NataliiaNefodova,https://github.com/NataliiaNefodova,https://api.github.com/users/NataliiaNefodova/followers,https://api.github.com/users/NataliiaNefodova/following{/other_user},https://api.github.com/users/NataliiaNefodova/gists{/gist_id},https://api.github.com/users/NataliiaNefodova/starred{/owner}{/repo},https://api.github.com/users/NataliiaNefodova/subscriptions,https://api.github.com/users/NataliiaNefodova/orgs,https://api.github.com/users/NataliiaNefodova/repos,https://api.github.com/users/NataliiaNefodova/events{/privacy},https://api.github.com/users/NataliiaNefodova/received_events,User,false,[],closed,false,,[],,2,2024-05-13T12:09:59Z,2024-05-23T18:58:59Z,2024-05-23T18:58:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/266,https://github.com/bigcommerce/docs/pull/266,https://github.com/bigcommerce/docs/pull/266.diff,https://github.com/bigcommerce/docs/pull/266.patch,2024-05-23T18:58:58Z," +# [CATALOG-9785] Categories: REST Contract + + +## What changed? +* Updated v3 brands swagger scheme + +## Release notes draft +* updated description for endpoints +* add responses code to endpoints +* deleted params ""Content-Type"" and ""Accept"" base https://swagger.io/docs/specification/describing-parameters/ + +ping @bigcommerce/team-catalog + + +[CATALOG-9785]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9785?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/266/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/266/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/265,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/265/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/265/comments,https://api.github.com/repos/bigcommerce/docs/issues/265/events,https://github.com/bigcommerce/docs/pull/265,2290345278,PR_kwDOI7BBSM5vIbDC,265,"(no ticket): Orders V3, add schemas for alt request body mime types",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-10T20:07:42Z,2024-05-10T20:09:51Z,2024-05-10T20:09:50Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/265,https://github.com/bigcommerce/docs/pull/265,https://github.com/bigcommerce/docs/pull/265.diff,https://github.com/bigcommerce/docs/pull/265.patch,2024-05-10T20:09:50Z,"<!-- Ticket number or summary of work --> +# (no ticket): Orders V3, add schemas for alt request body mime types + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* add xml and multipart schemas where indicated + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/265/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/265/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/264,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/264/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/264/comments,https://api.github.com/repos/bigcommerce/docs/issues/264/events,https://github.com/bigcommerce/docs/pull/264,2290173666,PR_kwDOI7BBSM5vH1oL,264,"[DEVDOCS-5931]: [update] Ordersv2, Remove outdated shipper from create order shipment list",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-05-10T17:59:47Z,2024-05-10T18:25:39Z,2024-05-10T18:25:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/264,https://github.com/bigcommerce/docs/pull/264,https://github.com/bigcommerce/docs/pull/264.diff,https://github.com/bigcommerce/docs/pull/264.patch,2024-05-10T18:25:38Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5931] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove UPSOnline from the list of shippers + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Create an order shipment no longer supports UPSOnline as a shipper + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5931]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5931?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/264/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/264/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/263,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/263/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/263/comments,https://api.github.com/repos/bigcommerce/docs/issues/263/events,https://github.com/bigcommerce/docs/issues/263,2290131741,I_kwDOI7BBSM6IgKMd,263,Feedback for “Adjustments”,bc-seamusduffy,95488192,U_kgDOBbEIwA,https://avatars.githubusercontent.com/u/95488192?v=4,,https://api.github.com/users/bc-seamusduffy,https://github.com/bc-seamusduffy,https://api.github.com/users/bc-seamusduffy/followers,https://api.github.com/users/bc-seamusduffy/following{/other_user},https://api.github.com/users/bc-seamusduffy/gists{/gist_id},https://api.github.com/users/bc-seamusduffy/starred{/owner}{/repo},https://api.github.com/users/bc-seamusduffy/subscriptions,https://api.github.com/users/bc-seamusduffy/orgs,https://api.github.com/users/bc-seamusduffy/repos,https://api.github.com/users/bc-seamusduffy/events{/privacy},https://api.github.com/users/bc-seamusduffy/received_events,User,false,"[{""id"":6975581169,""node_id"":""LA_kwDOI7BBSM8AAAABn8br8Q"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ticketed"",""name"":""ticketed"",""color"":""C55A37"",""default"":false,""description"":""""}]",open,false,"{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-05-10T17:27:31Z,2024-05-20T17:58:26Z,,MEMBER,,,,,,,,"An absolute adjustment is required before any relative adjustments can be made. This error occurs when a product or a location is created and the `available_inventory` value is null/undefined but displayed as `0` due to the element being an `integer`. + +This should be called out within the dev docs to ensure when a user is building their own inventory mgmt tool they have put in place a system to establish a starting inventory point (whether that's setting to a true 0 or another value). ",https://api.github.com/repos/bigcommerce/docs/issues/263/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/263/timeline,,,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/262,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/262/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/262/comments,https://api.github.com/repos/bigcommerce/docs/issues/262/events,https://github.com/bigcommerce/docs/pull/262,2290102582,PR_kwDOI7BBSM5vHmMK,262,[Fix] Checkout Consignments: Content is not wrapping properly,bc-shawnyap,85641361,MDQ6VXNlcjg1NjQxMzYx,https://avatars.githubusercontent.com/u/85641361?v=4,,https://api.github.com/users/bc-shawnyap,https://github.com/bc-shawnyap,https://api.github.com/users/bc-shawnyap/followers,https://api.github.com/users/bc-shawnyap/following{/other_user},https://api.github.com/users/bc-shawnyap/gists{/gist_id},https://api.github.com/users/bc-shawnyap/starred{/owner}{/repo},https://api.github.com/users/bc-shawnyap/subscriptions,https://api.github.com/users/bc-shawnyap/orgs,https://api.github.com/users/bc-shawnyap/repos,https://api.github.com/users/bc-shawnyap/events{/privacy},https://api.github.com/users/bc-shawnyap/received_events,User,false,[],closed,false,,[],,0,2024-05-10T17:06:22Z,2024-05-10T17:12:14Z,2024-05-10T17:12:13Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/262,https://github.com/bigcommerce/docs/pull/262,https://github.com/bigcommerce/docs/pull/262.diff,https://github.com/bigcommerce/docs/pull/262.patch,2024-05-10T17:12:13Z,"<!-- Ticket number or summary of work --> +# [[SELFDEV-166](https://bigcommercecloud.atlassian.net/browse/SELFDEV-166)] + +This PR fixes the content in checkout consignment ""Create a consignment"" rendering incorrectly. + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Removed some leading indents causing the render component to render as a code block instead of the intended behavior + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* n/a + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @slsriehl + + +[SELFDEV-166]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-166?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/262/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/262/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/261,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/261/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/261/comments,https://api.github.com/repos/bigcommerce/docs/issues/261/events,https://github.com/bigcommerce/docs/pull/261,2289760604,PR_kwDOI7BBSM5vGbVw,261,Update customizing-printable-packing-slips.mdx,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-10T13:42:03Z,2024-05-10T18:38:08Z,2024-05-10T18:38:08Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/261,https://github.com/bigcommerce/docs/pull/261,https://github.com/bigcommerce/docs/pull/261.diff,https://github.com/bigcommerce/docs/pull/261.patch,2024-05-10T18:38:08Z,"<!-- Ticket number or summary of work --> +# NO TICKET + + +## What changed? +Fixing file format + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/261/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/261/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/260,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/260/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/260/comments,https://api.github.com/repos/bigcommerce/docs/issues/260/events,https://github.com/bigcommerce/docs/pull/260,2288383556,PR_kwDOI7BBSM5vBwd6,260,"DEVDOCS-5797 [new]: Scripts feature, add nonce attribute and handlebar ",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],open,false,,[],,0,2024-05-09T20:13:09Z,2024-06-17T19:12:29Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/260,https://github.com/bigcommerce/docs/pull/260,https://github.com/bigcommerce/docs/pull/260.diff,https://github.com/bigcommerce/docs/pull/260.patch,,"# [DEVDOCS-5797] + + +## What changed? +* Add nonce attribute and handlebar for inline scripts (PCI compliance) + +## Release notes draft + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. + + + +[DEVDOCS-5797]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5797?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/260/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/260/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/259,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/259/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/259/comments,https://api.github.com/repos/bigcommerce/docs/issues/259/events,https://github.com/bigcommerce/docs/pull/259,2288215953,PR_kwDOI7BBSM5vBMNu,259,"(no ticket): [update] API reference, remove empty x-examples",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-09T18:16:49Z,2024-05-09T18:19:54Z,2024-05-09T18:19:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/259,https://github.com/bigcommerce/docs/pull/259,https://github.com/bigcommerce/docs/pull/259.diff,https://github.com/bigcommerce/docs/pull/259.patch,2024-05-09T18:19:53Z,"<!-- Ticket number or summary of work --> +# (no ticket): [update] API reference, remove empty x-examples + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* remove empty x-examples + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/259/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/259/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/258,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/258/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/258/comments,https://api.github.com/repos/bigcommerce/docs/issues/258/events,https://github.com/bigcommerce/docs/issues/258,2285360287,I_kwDOI7BBSM6IN9Sf,258,Reset password mutation is not working giving internal server error.,MJAN123,37670181,MDQ6VXNlcjM3NjcwMTgx,https://avatars.githubusercontent.com/u/37670181?v=4,,https://api.github.com/users/MJAN123,https://github.com/MJAN123,https://api.github.com/users/MJAN123/followers,https://api.github.com/users/MJAN123/following{/other_user},https://api.github.com/users/MJAN123/gists{/gist_id},https://api.github.com/users/MJAN123/starred{/owner}{/repo},https://api.github.com/users/MJAN123/subscriptions,https://api.github.com/users/MJAN123/orgs,https://api.github.com/users/MJAN123/repos,https://api.github.com/users/MJAN123/events{/privacy},https://api.github.com/users/MJAN123/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-05-08T11:27:02Z,2024-05-20T16:33:28Z,2024-05-20T16:33:28Z,NONE,,,,,,,,"Hi I am trying to implement reset password functionality to my store. +https://developer.bigcommerce.com/docs/storefront/graphql/customers#request-a-password-reset +",https://api.github.com/repos/bigcommerce/docs/issues/258/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/258/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/257,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/257/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/257/comments,https://api.github.com/repos/bigcommerce/docs/issues/257/events,https://github.com/bigcommerce/docs/pull/257,2283956366,PR_kwDOI7BBSM5uy1x0,257,DEVDOCS-5922: [Update] removed 500 status error code from metafield docs,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-07T18:18:01Z,2024-05-17T15:54:30Z,2024-05-17T15:54:29Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/257,https://github.com/bigcommerce/docs/pull/257,https://github.com/bigcommerce/docs/pull/257.diff,https://github.com/bigcommerce/docs/pull/257.patch,2024-05-17T15:54:29Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5922] + + +## What changed? +Removed 500 status code from metafield docs + +Carts +Channels +Customer +Catalog +Orders + +## Release notes draft + +n/a +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5922]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5922?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/257/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/257/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/256,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/256/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/256/comments,https://api.github.com/repos/bigcommerce/docs/issues/256/events,https://github.com/bigcommerce/docs/pull/256,2283432536,PR_kwDOI7BBSM5uxFEI,256,DEVDOCS-5901: [update] edit URL description,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839095,""node_id"":""LA_kwDOI7BBSM8AAAABMaSddw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/on%20hold"",""name"":""on hold"",""color"":""5319e7"",""default"":false,""description"":""""}]",closed,false,,[],,0,2024-05-07T13:55:49Z,2024-05-13T13:24:53Z,2024-05-13T13:24:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/256,https://github.com/bigcommerce/docs/pull/256,https://github.com/bigcommerce/docs/pull/256.diff,https://github.com/bigcommerce/docs/pull/256.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5901] + + +## What changed? +This PR removes a change made for [DEVDOCS-5818](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5818). This PR updates the URL description. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5901]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5901?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[DEVDOCS-5818]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5818?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/256/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/256/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/255,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/255/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/255/comments,https://api.github.com/repos/bigcommerce/docs/issues/255/events,https://github.com/bigcommerce/docs/pull/255,2281806712,PR_kwDOI7BBSM5ur7G7,255,Test,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-05-06T21:26:49Z,2024-05-09T18:20:11Z,2024-05-09T18:20:11Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/255,https://github.com/bigcommerce/docs/pull/255,https://github.com/bigcommerce/docs/pull/255.diff,https://github.com/bigcommerce/docs/pull/255.patch,,Test,https://api.github.com/repos/bigcommerce/docs/issues/255/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/255/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/254,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/254/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/254/comments,https://api.github.com/repos/bigcommerce/docs/issues/254/events,https://github.com/bigcommerce/docs/pull/254,2281709539,PR_kwDOI7BBSM5urlrT,254,"ISSUE-249: [update] Spectral & OAS, add obj properties and array items to linter + fixes",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-05-06T20:34:21Z,2024-05-06T21:48:02Z,2024-05-06T21:48:02Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/254,https://github.com/bigcommerce/docs/pull/254,https://github.com/bigcommerce/docs/pull/254.diff,https://github.com/bigcommerce/docs/pull/254.patch,2024-05-06T21:48:02Z,"<!-- Ticket number or summary of work --> +* #249 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update spectral linter to remove old caveats +* Update spectral linter to add the following requirements + * all objects have a properties attribute + * all arrays have an items attribute + * all schemas with a properties attribute have type: object +* Update the spec files to meet the new linting requirements + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've made updates to the OAS linting configuration to help make sure object and array definitions are valid. We've also made updates throughout our OAS files to bring our objects and arrays into line with the new linter. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @jb-gourav +",https://api.github.com/repos/bigcommerce/docs/issues/254/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/254/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/253,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/253/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/253/comments,https://api.github.com/repos/bigcommerce/docs/issues/253/events,https://github.com/bigcommerce/docs/issues/253,2279795697,I_kwDOI7BBSM6H4uvx,253,Breadcrumbs display error,theromulans,10804073,MDQ6VXNlcjEwODA0MDcz,https://avatars.githubusercontent.com/u/10804073?v=4,,https://api.github.com/users/theromulans,https://github.com/theromulans,https://api.github.com/users/theromulans/followers,https://api.github.com/users/theromulans/following{/other_user},https://api.github.com/users/theromulans/gists{/gist_id},https://api.github.com/users/theromulans/starred{/owner}{/repo},https://api.github.com/users/theromulans/subscriptions,https://api.github.com/users/theromulans/orgs,https://api.github.com/users/theromulans/repos,https://api.github.com/users/theromulans/events{/privacy},https://api.github.com/users/theromulans/received_events,User,false,[],closed,false,,[],,1,2024-05-05T23:39:55Z,2024-05-07T22:35:35Z,2024-05-06T15:07:22Z,MEMBER,,,,,,,,"Hi there, there's a bunch of breadcrumb navigation that is appearing incorrectly. + +<img width=""531"" alt=""Screenshot 2024-05-06 at 9 37 28 am"" src=""https://github.com/bigcommerce/docs/assets/10804073/347c5edb-fee4-46a3-9f01-56c6e5ff3400""> + +Shipping Provider API: + +https://developer.bigcommerce.com/docs/rest-contracts/shipping + +Others observed: + +https://developer.bigcommerce.com/docs/rest-contracts/tax +https://developer.bigcommerce.com/docs/rest-contracts/tax-app-connection",https://api.github.com/repos/bigcommerce/docs/issues/253/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/253/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/252,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/252/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/252/comments,https://api.github.com/repos/bigcommerce/docs/issues/252/events,https://github.com/bigcommerce/docs/pull/252,2278035320,PR_kwDOI7BBSM5ufh6X,252,"DEVDOCS-5912 [new]: International Enhancements for MSF, add webhooks ",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-05-03T16:29:07Z,2024-05-21T16:47:43Z,2024-05-21T16:47:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/252,https://github.com/bigcommerce/docs/pull/252,https://github.com/bigcommerce/docs/pull/252.diff,https://github.com/bigcommerce/docs/pull/252.patch,2024-05-21T16:47:42Z,"[DEVDOCS-5912](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5912) + +This PR documents the following webhooks' overrides: +- store/product/updated +- store/option/updated +- store/modifier/updated + +A new PR will be created for the following scopes once development is complete: +- store/sku/updated +- store/url-path/updated + +Reverts bigcommerce/docs#244 to include changes from [DEVDOCS-5838](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5838) + +Related to [PR 307](https://github.com/bigcommerce/api-specs-ssot/pull/307) + + + +[DEVDOCS-5912]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5912?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[DEVDOCS-5838]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5838?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/252/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/252/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/251,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/251/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/251/comments,https://api.github.com/repos/bigcommerce/docs/issues/251/events,https://github.com/bigcommerce/docs/pull/251,2276517554,PR_kwDOI7BBSM5uaZPS,251,"DEVDOCS-5899 [update]: Legacy docs, update SKU",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-05-02T21:21:11Z,2024-05-03T15:26:07Z,2024-05-03T15:26:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/251,https://github.com/bigcommerce/docs/pull/251,https://github.com/bigcommerce/docs/pull/251.diff,https://github.com/bigcommerce/docs/pull/251.patch,2024-05-03T15:26:06Z,"# [DEVDOCS-5899] + + +## What changed? +- Fixed an incorrect statement that said SKUs were read-only + + +[DEVDOCS-5899]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5899?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/251/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/251/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/250,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/250/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/250/comments,https://api.github.com/repos/bigcommerce/docs/issues/250/events,https://github.com/bigcommerce/docs/pull/250,2276279964,PR_kwDOI7BBSM5uZkiT,250,DEVDOCS-5627 [update]: Remark linter ,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-05-02T19:04:32Z,2024-05-17T20:06:59Z,2024-05-17T20:06:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/250,https://github.com/bigcommerce/docs/pull/250,https://github.com/bigcommerce/docs/pull/250.diff,https://github.com/bigcommerce/docs/pull/250.patch,2024-05-17T20:06:57Z,"# [DEVDOCS-5627] + +## What changed? + +Before: +- When I make a commit, Reviewdog (re)comments on all the lines in the PR + +After: +- When I make a commit, Reviewdog comments on only the lines included in the commit + +[DEVDOCS-5627]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5627?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/250/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/250/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/249,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/249/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/249/comments,https://api.github.com/repos/bigcommerce/docs/issues/249/events,https://github.com/bigcommerce/docs/issues/249,2276259110,I_kwDOI7BBSM6HrPUm,249,In customer Swagger v3 file the array structure is not defined correctly.,jb-gourav,46708831,MDQ6VXNlcjQ2NzA4ODMx,https://avatars.githubusercontent.com/u/46708831?v=4,,https://api.github.com/users/jb-gourav,https://github.com/jb-gourav,https://api.github.com/users/jb-gourav/followers,https://api.github.com/users/jb-gourav/following{/other_user},https://api.github.com/users/jb-gourav/gists{/gist_id},https://api.github.com/users/jb-gourav/starred{/owner}{/repo},https://api.github.com/users/jb-gourav/subscriptions,https://api.github.com/users/jb-gourav/orgs,https://api.github.com/users/jb-gourav/repos,https://api.github.com/users/jb-gourav/events{/privacy},https://api.github.com/users/jb-gourav/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-05-02T18:54:52Z,2024-05-06T21:49:13Z,2024-05-06T21:49:13Z,NONE,,,,,,,,"` MetafieldCollectionResponse: + description: Response payload for the BigCommerce API. + content: + application/json: + schema: + type: object + properties: + data: + type: array + id: + type: integer + description: Unique ID of the *Metafield*. Read-Only. + readOnly: true + example: 0 + key: + type: string + description: The key for the metafields. + example: Staff Name + value: + type: string + description: The description for the metafield. + example: Ronaldo + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 + permission_set:` + +The type of array must have items in it but it is missing, because of that, when we are using the parser it is not getting the component values. + +when I parse by swagger-parser in Java OpenAPI returns the component as null. +![image](https://github.com/bigcommerce/docs/assets/46708831/5b99628a-5a19-4060-9124-66516fc9ed25) + +Here is the snippet of the code. +![image](https://github.com/bigcommerce/docs/assets/46708831/e659d31f-4abf-47a4-bb7b-1f4cbea934cb) + +It must have all the $ref information. It seems, that the structure is not correct that's why OpenAPI is not able to load the components. + +The same case is happening with most of the swagger files. +",https://api.github.com/repos/bigcommerce/docs/issues/249/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/249/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/248,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/248/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/248/comments,https://api.github.com/repos/bigcommerce/docs/issues/248/events,https://github.com/bigcommerce/docs/pull/248,2275636313,PR_kwDOI7BBSM5uXWd-,248,DEVDOCS-5648: [update] add custom shipping,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-05-02T14:06:51Z,2024-05-03T15:24:17Z,2024-05-03T15:24:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/248,https://github.com/bigcommerce/docs/pull/248,https://github.com/bigcommerce/docs/pull/248.diff,https://github.com/bigcommerce/docs/pull/248.patch,2024-05-03T15:24:16Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5648] + + +## What changed? +Added custom shipping to request body + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5648]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5648?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/248/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/248/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/247,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/247/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/247/comments,https://api.github.com/repos/bigcommerce/docs/issues/247/events,https://github.com/bigcommerce/docs/pull/247,2272491162,PR_kwDOI7BBSM5uMmsX,247,"[DEVDOCS-5667]: [revise] Authentication, Replace inaccurate information in Customer Login API callout",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-04-30T21:38:20Z,2024-04-30T21:41:42Z,2024-04-30T21:40:32Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/247,https://github.com/bigcommerce/docs/pull/247,https://github.com/bigcommerce/docs/pull/247.diff,https://github.com/bigcommerce/docs/pull/247.patch,2024-04-30T21:40:32Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5667] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Replace invalid information in the callout in the Prerequisites segment; token should be created at the store-level and app must be installed on a store to generate a token + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Corrected information in our Authentication docs. Customer login API had the wrong information for token creation. Users need store-level access to create a token. The app must be installed on the store before creating a JWT. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5667]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5667?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/247/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/247/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/246,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/246/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/246/comments,https://api.github.com/repos/bigcommerce/docs/issues/246/events,https://github.com/bigcommerce/docs/pull/246,2272419495,PR_kwDOI7BBSM5uMW37,246,DEVDOCS-5895: [update] update ngrok installation instructions,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-30T20:44:23Z,2024-05-03T15:25:07Z,2024-05-03T15:25:07Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/246,https://github.com/bigcommerce/docs/pull/246,https://github.com/bigcommerce/docs/pull/246.diff,https://github.com/bigcommerce/docs/pull/246.patch,2024-05-03T15:25:07Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5895] + + +## What changed? +Update all occurrences of installing ngrok form npm in the dev center + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5895]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5895?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/246/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/246/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/245,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/245/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/245/comments,https://api.github.com/repos/bigcommerce/docs/issues/245/events,https://github.com/bigcommerce/docs/pull/245,2271872948,PR_kwDOI7BBSM5uKkhl,245,"DEVDOCS-5839 [update]: Batch Metafields, add include_fields query parameter",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-04-30T15:48:13Z,2024-05-02T15:37:27Z,2024-05-02T15:37:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/245,https://github.com/bigcommerce/docs/pull/245,https://github.com/bigcommerce/docs/pull/245.diff,https://github.com/bigcommerce/docs/pull/245.patch,2024-05-02T15:37:26Z,"# [DEVDOCS-5839] + +## What changed? +- add include_fields query parameter on Batch Metafields + +This PR is related to [PR 305](https://github.com/bigcommerce/api-specs-ssot/pull/305) + +## Release notes draft + +Examples: +* We're happy to announce the `include_fields` query parameter on batch metafields, which can help you query specific enum fields. + + + +[DEVDOCS-5839]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5839?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/245/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/245/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/244,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/244/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/244/comments,https://api.github.com/repos/bigcommerce/docs/issues/244/events,https://github.com/bigcommerce/docs/pull/244,2271576948,PR_kwDOI7BBSM5uJnxP,244,DEVDOCS-5838:[revert] changes not ready to be published,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-30T14:07:46Z,2024-05-01T15:38:12Z,2024-05-01T15:38:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/244,https://github.com/bigcommerce/docs/pull/244,https://github.com/bigcommerce/docs/pull/244.diff,https://github.com/bigcommerce/docs/pull/244.patch,2024-05-01T15:38:11Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5838] + + +## What changed? +Rolling back changes in [PR 206](https://github.com/bigcommerce/docs/pull/206) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5838]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5838?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/244/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/244/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/243,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/243/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/243/comments,https://api.github.com/repos/bigcommerce/docs/issues/243/events,https://github.com/bigcommerce/docs/pull/243,2269865750,PR_kwDOI7BBSM5uDu6f,243,DEVDOCS-5850: [update] removed incorrect statement,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-29T20:03:54Z,2024-05-01T15:39:56Z,2024-05-01T15:39:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/243,https://github.com/bigcommerce/docs/pull/243,https://github.com/bigcommerce/docs/pull/243.diff,https://github.com/bigcommerce/docs/pull/243.patch,2024-05-01T15:39:56Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5850] + + +## What changed? +Removed ""Redirect URLs can be generated only from carts that were created using the REST Management API."" + +## Release notes draft + +Bug Fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5850]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5850?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/243/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/243/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/242,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/242/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/242/comments,https://api.github.com/repos/bigcommerce/docs/issues/242/events,https://github.com/bigcommerce/docs/pull/242,2269851513,PR_kwDOI7BBSM5uDrtl,242,DEVDOCS-5850: [update] remove incorrect statement,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-29T19:56:31Z,2024-04-29T19:57:31Z,2024-04-29T19:57:26Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/242,https://github.com/bigcommerce/docs/pull/242,https://github.com/bigcommerce/docs/pull/242.diff,https://github.com/bigcommerce/docs/pull/242.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/242/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/242/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/241,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/241/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/241/comments,https://api.github.com/repos/bigcommerce/docs/issues/241/events,https://github.com/bigcommerce/docs/pull/241,2269815987,PR_kwDOI7BBSM5uDjxZ,241,DEVDOCS-5904: [Update] fix issues in orders.v3.yml,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-29T19:37:57Z,2024-05-08T19:15:37Z,2024-05-08T19:15:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/241,https://github.com/bigcommerce/docs/pull/241,https://github.com/bigcommerce/docs/pull/241.diff,https://github.com/bigcommerce/docs/pull/241.patch,2024-05-08T19:15:36Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5904] + + +## What changed? +Fix incorrect information in order file + +## Release notes draft + +Bug fix +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5904]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5904?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/241/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/241/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/240,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/240/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/240/comments,https://api.github.com/repos/bigcommerce/docs/issues/240/events,https://github.com/bigcommerce/docs/pull/240,2269725858,PR_kwDOI7BBSM5uDPsm,240,DEVDOCS-5206:[Update] update text for duplicate webhook,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-29T18:49:31Z,2024-05-02T18:14:56Z,2024-05-02T18:14:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/240,https://github.com/bigcommerce/docs/pull/240,https://github.com/bigcommerce/docs/pull/240.diff,https://github.com/bigcommerce/docs/pull/240.patch,2024-05-02T18:14:56Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5206] + + +## What changed? +Update text for duplicate webhook + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5206]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5206?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/240/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/240/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/239,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/239/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/239/comments,https://api.github.com/repos/bigcommerce/docs/issues/239/events,https://github.com/bigcommerce/docs/pull/239,2267457551,PR_kwDOI7BBSM5t7f2W,239,[DEVDOCS-5916] - Format fix for Cart currency.code request body,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],closed,false,,[],,0,2024-04-28T09:39:44Z,2024-04-29T14:37:02Z,2024-04-29T14:37:02Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/239,https://github.com/bigcommerce/docs/pull/239,https://github.com/bigcommerce/docs/pull/239.diff,https://github.com/bigcommerce/docs/pull/239.patch,2024-04-29T14:37:02Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5916 - Format fix for Cart `currency.code` request body] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Replaced the incorrect ""usd"" `currency.code` in Carts API > changed to correct ""USD"" + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Merchants will be able to use the sample code for Carts with 'custom item' without running into an error. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +This is my first PR so hopefully all is well. + + +[DEVDOCS-5916]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5916?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/239/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/239/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/238,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/238/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/238/comments,https://api.github.com/repos/bigcommerce/docs/issues/238/events,https://github.com/bigcommerce/docs/pull/238,2267447683,PR_kwDOI7BBSM5t7d6N,238,added test,Lucki2501,120939817,U_kgDOBzVlKQ,https://avatars.githubusercontent.com/u/120939817?v=4,,https://api.github.com/users/Lucki2501,https://github.com/Lucki2501,https://api.github.com/users/Lucki2501/followers,https://api.github.com/users/Lucki2501/following{/other_user},https://api.github.com/users/Lucki2501/gists{/gist_id},https://api.github.com/users/Lucki2501/starred{/owner}{/repo},https://api.github.com/users/Lucki2501/subscriptions,https://api.github.com/users/Lucki2501/orgs,https://api.github.com/users/Lucki2501/repos,https://api.github.com/users/Lucki2501/events{/privacy},https://api.github.com/users/Lucki2501/received_events,User,false,[],closed,false,,[],,0,2024-04-28T09:14:03Z,2024-04-28T09:19:12Z,2024-04-28T09:14:38Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/238,https://github.com/bigcommerce/docs/pull/238,https://github.com/bigcommerce/docs/pull/238.diff,https://github.com/bigcommerce/docs/pull/238.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/238/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/238/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/237,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/237/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/237/comments,https://api.github.com/repos/bigcommerce/docs/issues/237/events,https://github.com/bigcommerce/docs/pull/237,2266513053,PR_kwDOI7BBSM5t4dJE,237,"[DEVDOCS-5829]: [revise] OrdersV3, Update notes for /refund_quotes endpoint",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-04-26T21:11:40Z,2024-04-30T21:23:26Z,2024-04-30T21:23:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/237,https://github.com/bigcommerce/docs/pull/237,https://github.com/bigcommerce/docs/pull/237.diff,https://github.com/bigcommerce/docs/pull/237.patch,2024-04-30T21:23:25Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5829] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add note describing the logical relationship between the amounts used in the /refunds_quotes endpoint and the /refunds endpoint. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-vincent-zhao + + +[DEVDOCS-5829]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5829?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/237/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/237/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/236,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/236/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/236/comments,https://api.github.com/repos/bigcommerce/docs/issues/236/events,https://github.com/bigcommerce/docs/pull/236,2264607153,PR_kwDOI7BBSM5tx9AV,236,"[DEVDOCS-5758]: [revise] OrdersV3, Add `order_level_refund_amount` to the orders/{order_id}/payment_actions/refund_quotes API",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-04-25T22:35:30Z,2024-04-25T22:39:39Z,2024-04-25T22:39:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/236,https://github.com/bigcommerce/docs/pull/236,https://github.com/bigcommerce/docs/pull/236.diff,https://github.com/bigcommerce/docs/pull/236.patch,2024-04-25T22:39:38Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5758] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add missing value, `order_level_refunds_amount`, to the `orders/{order_id}/payment_actions/refund_quotes` request response example + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5758]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5758?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/236/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/236/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/235,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/235/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/235/comments,https://api.github.com/repos/bigcommerce/docs/issues/235/events,https://github.com/bigcommerce/docs/pull/235,2264084305,PR_kwDOI7BBSM5twKbZ,235,fix category assignments link,bc-romanliukshyn,79109064,MDQ6VXNlcjc5MTA5MDY0,https://avatars.githubusercontent.com/u/79109064?v=4,,https://api.github.com/users/bc-romanliukshyn,https://github.com/bc-romanliukshyn,https://api.github.com/users/bc-romanliukshyn/followers,https://api.github.com/users/bc-romanliukshyn/following{/other_user},https://api.github.com/users/bc-romanliukshyn/gists{/gist_id},https://api.github.com/users/bc-romanliukshyn/starred{/owner}{/repo},https://api.github.com/users/bc-romanliukshyn/subscriptions,https://api.github.com/users/bc-romanliukshyn/orgs,https://api.github.com/users/bc-romanliukshyn/repos,https://api.github.com/users/bc-romanliukshyn/events{/privacy},https://api.github.com/users/bc-romanliukshyn/received_events,User,false,[],closed,false,,[],,0,2024-04-25T17:04:03Z,2024-04-25T17:55:40Z,2024-04-25T17:55:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/235,https://github.com/bigcommerce/docs/pull/235,https://github.com/bigcommerce/docs/pull/235.diff,https://github.com/bigcommerce/docs/pull/235.patch,2024-04-25T17:55:39Z,"## What changed? +* Removed dot from the end of the `PUT Create Products Category Assignments` summary +* Updated link to category assignments on the Channel Webhooks page +These changes with broken link (because of dot sign at the end): + +https://github.com/bigcommerce/docs/assets/79109064/49baa6df-354d-4c18-9ba7-a3915e844429 + + + +## Release notes draft +Not sure what to put here, need help from Dev Docs team. + +Bug Fix +",https://api.github.com/repos/bigcommerce/docs/issues/235/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/235/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/234,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/234/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/234/comments,https://api.github.com/repos/bigcommerce/docs/issues/234/events,https://github.com/bigcommerce/docs/pull/234,2263999538,PR_kwDOI7BBSM5tv3vk,234,"Revert ""DEVDOCS-3840: [Update] replaces PR 205""",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-25T16:19:08Z,2024-04-25T16:21:20Z,2024-04-25T16:21:19Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/234,https://github.com/bigcommerce/docs/pull/234,https://github.com/bigcommerce/docs/pull/234.diff,https://github.com/bigcommerce/docs/pull/234.patch,2024-04-25T16:21:19Z,"Reverts bigcommerce/docs#228 + +According to @bc-romanliukshyn these changes are not ready yet for channel support. So I am reverting the changes.",https://api.github.com/repos/bigcommerce/docs/issues/234/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/234/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/233,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/233/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/233/comments,https://api.github.com/repos/bigcommerce/docs/issues/233/events,https://github.com/bigcommerce/docs/issues/233,2261687645,I_kwDOI7BBSM6Gzp1d,233,Feedback for “Items” - Add to Cart Limit,Fefe-Hern,7971847,MDQ6VXNlcjc5NzE4NDc=,https://avatars.githubusercontent.com/u/7971847?v=4,,https://api.github.com/users/Fefe-Hern,https://github.com/Fefe-Hern,https://api.github.com/users/Fefe-Hern/followers,https://api.github.com/users/Fefe-Hern/following{/other_user},https://api.github.com/users/Fefe-Hern/gists{/gist_id},https://api.github.com/users/Fefe-Hern/starred{/owner}{/repo},https://api.github.com/users/Fefe-Hern/subscriptions,https://api.github.com/users/Fefe-Hern/orgs,https://api.github.com/users/Fefe-Hern/repos,https://api.github.com/users/Fefe-Hern/events{/privacy},https://api.github.com/users/Fefe-Hern/received_events,User,false,[],closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-04-24T16:17:17Z,2024-05-14T15:53:44Z,2024-05-14T15:53:44Z,NONE,,,,,,,,"What's the max number of line items that can be added to a cart at once via POST /v3/carts/{cart-id}/items in the API? +I noticed the REST Api doesn't specify a limit of line items that can be added to a cart for this request: + +https://developer.bigcommerce.com/docs/rest-management/carts/items#add-cart-line-items + +In testing, I was able to add around 70 items at once.",https://api.github.com/repos/bigcommerce/docs/issues/233/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/233/timeline,,completed,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/232,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/232/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/232/comments,https://api.github.com/repos/bigcommerce/docs/issues/232/events,https://github.com/bigcommerce/docs/issues/232,2260397096,I_kwDOI7BBSM6Guuwo,232,Fetching products by category using GraphQL is returning inaccurate data,tvlgiao,1865930,MDQ6VXNlcjE4NjU5MzA=,https://avatars.githubusercontent.com/u/1865930?v=4,,https://api.github.com/users/tvlgiao,https://github.com/tvlgiao,https://api.github.com/users/tvlgiao/followers,https://api.github.com/users/tvlgiao/following{/other_user},https://api.github.com/users/tvlgiao/gists{/gist_id},https://api.github.com/users/tvlgiao/starred{/owner}{/repo},https://api.github.com/users/tvlgiao/subscriptions,https://api.github.com/users/tvlgiao/orgs,https://api.github.com/users/tvlgiao/repos,https://api.github.com/users/tvlgiao/events{/privacy},https://api.github.com/users/tvlgiao/received_events,User,false,[],closed,false,,[],,2,2024-04-24T05:49:13Z,2024-05-06T21:01:29Z,2024-05-06T21:01:29Z,NONE,,,,,,,,"Hi, + +I've observed an issue where fetching products by category is yielding incorrect data. + +Kindly review the following: + +- Store URL: https://grumpymancables.com/ +- GraphQL Request: https://prnt.sc/dQ3Ajkvhbs_1 + +As demonstrated by the screenshot here: https://prnt.sc/J48iqBqb32bK +the request returns no product within the category, despite the fact that there are indeed products in the category. + +Could you please investigate this discrepancy? + +Thank you for your assistance.",https://api.github.com/repos/bigcommerce/docs/issues/232/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/232/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/231,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/231/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/231/comments,https://api.github.com/repos/bigcommerce/docs/issues/231/events,https://github.com/bigcommerce/docs/pull/231,2259662466,PR_kwDOI7BBSM5thHtA,231,DEVDOCS-5856: [update] added deliveryException hooks to webhook events,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-23T19:55:04Z,2024-04-25T16:23:12Z,2024-04-25T16:23:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/231,https://github.com/bigcommerce/docs/pull/231,https://github.com/bigcommerce/docs/pull/231.diff,https://github.com/bigcommerce/docs/pull/231.patch,2024-04-25T16:23:11Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5856] + + +## What changed? +Added deliveryException hooks to webhook events + +## Release notes draft +The newly-released delivery exception webhooks alert users of delivery issues at their primary delivery destination. + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5856]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5856?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/231/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/231/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/230,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/230/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/230/comments,https://api.github.com/repos/bigcommerce/docs/issues/230/events,https://github.com/bigcommerce/docs/pull/230,2259493054,PR_kwDOI7BBSM5tgikI,230,DEVDOCS-5900: [update] Edit descriptions for page and limit parameters,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-23T18:18:10Z,2024-04-25T16:30:19Z,2024-04-25T16:30:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/230,https://github.com/bigcommerce/docs/pull/230,https://github.com/bigcommerce/docs/pull/230.diff,https://github.com/bigcommerce/docs/pull/230.patch,2024-04-25T16:30:18Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5900] + + +## What changed? +Updated the descriptions for page and limit descriptions + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5900]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5900?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/230/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/230/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/229,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/229/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/229/comments,https://api.github.com/repos/bigcommerce/docs/issues/229/events,https://github.com/bigcommerce/docs/pull/229,2259215510,PR_kwDOI7BBSM5tfnLF,229,"DEVDOCS-5796 [new]: Scripts API, add integrity hash",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-04-23T15:47:14Z,2024-04-29T17:38:22Z,2024-04-29T17:38:21Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/229,https://github.com/bigcommerce/docs/pull/229,https://github.com/bigcommerce/docs/pull/229.diff,https://github.com/bigcommerce/docs/pull/229.patch,2024-04-29T17:38:21Z,"# [DEVDOCS-5796] + + +## What changed? +- update Scripts yml file to include hash property +- update Scripts doc to include info about how BC handles integrity hashes + +## Release notes draft + +* The newly-released SRI hash feature is now available to use. Now, you’ll be able to add SRI hashes to external SRC scripts. + + + +[DEVDOCS-5796]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5796?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/229/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/229/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/228,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/228/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/228/comments,https://api.github.com/repos/bigcommerce/docs/issues/228/events,https://github.com/bigcommerce/docs/pull/228,2253521298,PR_kwDOI7BBSM5tM03w,228,DEVDOCS-3840: [Update] replaces PR 205,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-19T17:30:24Z,2024-04-19T19:32:03Z,2024-04-19T19:32:02Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/228,https://github.com/bigcommerce/docs/pull/228,https://github.com/bigcommerce/docs/pull/228.diff,https://github.com/bigcommerce/docs/pull/228.patch,2024-04-19T19:32:02Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-3840] + + +## What changed? +I closed PR 205 due to the merge conflicts and added my changes here. +Added channel_id as an optional field to existing catalog products v3 endpoints. + +## Release notes draft +Confirm with @bc-romanliukshyn and @bc-alexandr-naumenko + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-3840]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-3840?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/228/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/228/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/227,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/227/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/227/comments,https://api.github.com/repos/bigcommerce/docs/issues/227/events,https://github.com/bigcommerce/docs/pull/227,2248704605,PR_kwDOI7BBSM5s8fom,227,DEVDOCS-5857: [update] add note about checkout.content_head,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-17T16:20:47Z,2024-04-19T19:33:54Z,2024-04-19T19:33:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/227,https://github.com/bigcommerce/docs/pull/227,https://github.com/bigcommerce/docs/pull/227.diff,https://github.com/bigcommerce/docs/pull/227.patch,2024-04-19T19:33:53Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5857] + + +## What changed? +Added note about checkout.content_head since it is not mention in our docs + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5857]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5857?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/227/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/227/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/226,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/226/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/226/comments,https://api.github.com/repos/bigcommerce/docs/issues/226/events,https://github.com/bigcommerce/docs/issues/226,2248397955,I_kwDOI7BBSM6GA9SD,226,Feedback for “Orders”,realtebo,1268699,MDQ6VXNlcjEyNjg2OTk=,https://avatars.githubusercontent.com/u/1268699?v=4,,https://api.github.com/users/realtebo,https://github.com/realtebo,https://api.github.com/users/realtebo/followers,https://api.github.com/users/realtebo/following{/other_user},https://api.github.com/users/realtebo/gists{/gist_id},https://api.github.com/users/realtebo/starred{/owner}{/repo},https://api.github.com/users/realtebo/subscriptions,https://api.github.com/users/realtebo/orgs,https://api.github.com/users/realtebo/repos,https://api.github.com/users/realtebo/events{/privacy},https://api.github.com/users/realtebo/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",closed,false,,[],,3,2024-04-17T14:09:20Z,2024-04-23T20:01:44Z,2024-04-23T20:01:44Z,NONE,,,,,,,,"It's undocumented how to search orders by meta field + +for example, we need to find ALL and ONLY orders with this key + + ""key"": ""date_created_woocommerce"", + +",https://api.github.com/repos/bigcommerce/docs/issues/226/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/226/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/225,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/225/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/225/comments,https://api.github.com/repos/bigcommerce/docs/issues/225/events,https://github.com/bigcommerce/docs/pull/225,2246974048,PR_kwDOI7BBSM5s2m-B,225,DEVDOCS-5156: [update] add variables for packing slips,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-16T22:23:55Z,2024-05-03T15:26:23Z,2024-05-03T15:26:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/225,https://github.com/bigcommerce/docs/pull/225,https://github.com/bigcommerce/docs/pull/225.diff,https://github.com/bigcommerce/docs/pull/225.patch,2024-05-03T15:26:22Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5156] + + +## What changed? +Add variables for packing slips + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5156]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5156?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/225/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/225/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/224,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/224/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/224/comments,https://api.github.com/repos/bigcommerce/docs/issues/224/events,https://github.com/bigcommerce/docs/pull/224,2246425006,PR_kwDOI7BBSM5s0vli,224,DEVDOCS-5894: [update] update store/order/transaction/created,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-16T16:09:50Z,2024-04-17T15:52:22Z,2024-04-17T15:52:21Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/224,https://github.com/bigcommerce/docs/pull/224,https://github.com/bigcommerce/docs/pull/224.diff,https://github.com/bigcommerce/docs/pull/224.patch,2024-04-17T15:52:21Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5894] + + +## What changed? +Update schema + +## Release notes draft +The newly-updated `store/order/transaction/created` webhook now allows you to receive additional data for `transaction_status`, `transaction_type`, and `result` attributes. + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5894]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5894?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/224/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/224/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/223,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/223/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/223/comments,https://api.github.com/repos/bigcommerce/docs/issues/223/events,https://github.com/bigcommerce/docs/pull/223,2246256992,PR_kwDOI7BBSM5s0Kor,223,updating due to security issue,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-16T14:50:00Z,2024-04-19T18:15:55Z,2024-04-19T18:15:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/223,https://github.com/bigcommerce/docs/pull/223,https://github.com/bigcommerce/docs/pull/223.diff,https://github.com/bigcommerce/docs/pull/223.patch,2024-04-19T18:15:54Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5848] + + +## What changed? +Still need to remove a command that causes a security threat. The tutorial still works without it. + +## Release notes draft +N/A +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5848]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5848?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/223/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/223/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/222,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/222/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/222/comments,https://api.github.com/repos/bigcommerce/docs/issues/222/events,https://github.com/bigcommerce/docs/pull/222,2238065164,PR_kwDOI7BBSM5sYPtv,222,fixed typo-setting-up-webhooks.mdx,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-11T15:55:00Z,2024-04-11T19:21:56Z,2024-04-11T19:21:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/222,https://github.com/bigcommerce/docs/pull/222,https://github.com/bigcommerce/docs/pull/222.diff,https://github.com/bigcommerce/docs/pull/222.patch,2024-04-11T19:21:56Z,"<!-- Ticket number or summary of work --> +# NO TICKET + + +## What changed? +fixed subject-verb agreement + +## Release notes draft +N/A +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/222/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/222/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/221,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/221/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/221/comments,https://api.github.com/repos/bigcommerce/docs/issues/221/events,https://github.com/bigcommerce/docs/pull/221,2237990436,PR_kwDOI7BBSM5sX_K0,221,"DEVDOCS-4105: [update] OAS files, use unexploded arrays for csv params",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-04-11T15:17:38Z,2024-04-12T12:18:28Z,2024-04-11T19:48:07Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/221,https://github.com/bigcommerce/docs/pull/221,https://github.com/bigcommerce/docs/pull/221.diff,https://github.com/bigcommerce/docs/pull/221.patch,2024-04-11T19:48:07Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4105] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Every CSV query param is now expressed as the following: +```yaml +style: form +explode: false +schema: + type: array + items: + type: <integer, string, uuid string, etc> +``` +* sporadic scope sprawl to clean things up + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-tgomez @bc-andreadao @bc-traciporter @bobbyshaw + + +[DEVDOCS-4105]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4105?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/221/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/221/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/220,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/220/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/220/comments,https://api.github.com/repos/bigcommerce/docs/issues/220/events,https://github.com/bigcommerce/docs/pull/220,2234953115,PR_kwDOI7BBSM5sNlua,220,CATALOG-9783: [add] Product Images: V2 REST Contract,olysenko,8058039,MDQ6VXNlcjgwNTgwMzk=,https://avatars.githubusercontent.com/u/8058039?v=4,,https://api.github.com/users/olysenko,https://github.com/olysenko,https://api.github.com/users/olysenko/followers,https://api.github.com/users/olysenko/following{/other_user},https://api.github.com/users/olysenko/gists{/gist_id},https://api.github.com/users/olysenko/starred{/owner}{/repo},https://api.github.com/users/olysenko/subscriptions,https://api.github.com/users/olysenko/orgs,https://api.github.com/users/olysenko/repos,https://api.github.com/users/olysenko/events{/privacy},https://api.github.com/users/olysenko/received_events,User,false,[],open,false,,[],,0,2024-04-10T07:38:01Z,2024-06-17T19:12:30Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/220,https://github.com/bigcommerce/docs/pull/220,https://github.com/bigcommerce/docs/pull/220.diff,https://github.com/bigcommerce/docs/pull/220.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +* Added Product Images: V2 REST Contract + +## Release notes draft +* Added Product Images: V2 REST Contract + +",https://api.github.com/repos/bigcommerce/docs/issues/220/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/220/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/219,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/219/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/219/comments,https://api.github.com/repos/bigcommerce/docs/issues/219/events,https://github.com/bigcommerce/docs/pull/219,2231838193,PR_kwDOI7BBSM5sC3YR,219,SELFDEV-565 - Move style guide linter action to docs repo,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-04-08T18:25:16Z,2024-04-08T19:13:36Z,2024-04-08T19:13:35Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/219,https://github.com/bigcommerce/docs/pull/219,https://github.com/bigcommerce/docs/pull/219.diff,https://github.com/bigcommerce/docs/pull/219.patch,2024-04-08T19:13:35Z,"This was previously located in a [separate repo](https://github.com/bigcommerce/dev-docs-style-guide-action/blob/master/action.yml), but moving it to `docs` will make it more maintainable.",https://api.github.com/repos/bigcommerce/docs/issues/219/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/219/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/218,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/218/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/218/comments,https://api.github.com/repos/bigcommerce/docs/issues/218/events,https://github.com/bigcommerce/docs/pull/218,2231596744,PR_kwDOI7BBSM5sCCHs,218,DEVDOCS-5881: [update] add stencil cli,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""}]",closed,false,,[],,0,2024-04-08T16:06:25Z,2024-04-25T16:29:50Z,2024-04-25T16:24:04Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/218,https://github.com/bigcommerce/docs/pull/218,https://github.com/bigcommerce/docs/pull/218.diff,https://github.com/bigcommerce/docs/pull/218.patch,2024-04-25T16:24:04Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5881] + + +## What changed? +added Stencil CLI to the Deprecations & Sunset article + +## Release notes draft + +Jaime provided draft release notes [here](https://docs.google.com/document/d/15Ixir65KrBl03hezR7npQqrAcXeCVZK4hZZa2vPlm6I/edit?usp=sharing). + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5881]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5881?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/218/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/218/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/217,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/217/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/217/comments,https://api.github.com/repos/bigcommerce/docs/issues/217/events,https://github.com/bigcommerce/docs/issues/217,2230767479,I_kwDOI7BBSM6E9s93,217,"/v3/catalog/products?categories:in=123,456",propsmagic,97802228,U_kgDOBdRX9A,https://avatars.githubusercontent.com/u/97802228?v=4,,https://api.github.com/users/propsmagic,https://github.com/propsmagic,https://api.github.com/users/propsmagic/followers,https://api.github.com/users/propsmagic/following{/other_user},https://api.github.com/users/propsmagic/gists{/gist_id},https://api.github.com/users/propsmagic/starred{/owner}{/repo},https://api.github.com/users/propsmagic/subscriptions,https://api.github.com/users/propsmagic/orgs,https://api.github.com/users/propsmagic/repos,https://api.github.com/users/propsmagic/events{/privacy},https://api.github.com/users/propsmagic/received_events,User,false,[],closed,false,"{""login"":""robincoferbc"",""id"":90152147,""node_id"":""MDQ6VXNlcjkwMTUyMTQ3"",""avatar_url"":""https://avatars.githubusercontent.com/u/90152147?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/robincoferbc"",""html_url"":""https://github.com/robincoferbc"",""followers_url"":""https://api.github.com/users/robincoferbc/followers"",""following_url"":""https://api.github.com/users/robincoferbc/following{/other_user}"",""gists_url"":""https://api.github.com/users/robincoferbc/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/robincoferbc/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/robincoferbc/subscriptions"",""organizations_url"":""https://api.github.com/users/robincoferbc/orgs"",""repos_url"":""https://api.github.com/users/robincoferbc/repos"",""events_url"":""https://api.github.com/users/robincoferbc/events{/privacy}"",""received_events_url"":""https://api.github.com/users/robincoferbc/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""robincoferbc"",""id"":90152147,""node_id"":""MDQ6VXNlcjkwMTUyMTQ3"",""avatar_url"":""https://avatars.githubusercontent.com/u/90152147?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/robincoferbc"",""html_url"":""https://github.com/robincoferbc"",""followers_url"":""https://api.github.com/users/robincoferbc/followers"",""following_url"":""https://api.github.com/users/robincoferbc/following{/other_user}"",""gists_url"":""https://api.github.com/users/robincoferbc/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/robincoferbc/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/robincoferbc/subscriptions"",""organizations_url"":""https://api.github.com/users/robincoferbc/orgs"",""repos_url"":""https://api.github.com/users/robincoferbc/repos"",""events_url"":""https://api.github.com/users/robincoferbc/events{/privacy}"",""received_events_url"":""https://api.github.com/users/robincoferbc/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-04-08T09:56:32Z,2024-05-06T21:00:41Z,2024-05-06T21:00:40Z,NONE,,,,,,,,"/v3/catalog/products?categories:in=123,456 this API endpoints doesn't work but /v3/catalog/products?categories:not_in=123,456 this is working +",https://api.github.com/repos/bigcommerce/docs/issues/217/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/217/timeline,,completed,robincoferbc,90152147,MDQ6VXNlcjkwMTUyMTQ3,https://avatars.githubusercontent.com/u/90152147?v=4,,https://api.github.com/users/robincoferbc,https://github.com/robincoferbc,https://api.github.com/users/robincoferbc/followers,https://api.github.com/users/robincoferbc/following{/other_user},https://api.github.com/users/robincoferbc/gists{/gist_id},https://api.github.com/users/robincoferbc/starred{/owner}{/repo},https://api.github.com/users/robincoferbc/subscriptions,https://api.github.com/users/robincoferbc/orgs,https://api.github.com/users/robincoferbc/repos,https://api.github.com/users/robincoferbc/events{/privacy},https://api.github.com/users/robincoferbc/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/216,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/216/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/216/comments,https://api.github.com/repos/bigcommerce/docs/issues/216/events,https://github.com/bigcommerce/docs/pull/216,2228791989,PR_kwDOI7BBSM5r4r9A,216,DEVDOCS-5819: [update] add cart metafields example,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-05T20:54:19Z,2024-04-12T17:19:11Z,2024-04-12T17:19:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/216,https://github.com/bigcommerce/docs/pull/216,https://github.com/bigcommerce/docs/pull/216.diff,https://github.com/bigcommerce/docs/pull/216.patch,2024-04-12T17:19:11Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5819] + + +## What changed? +Add create cart metafield example + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5819]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5819?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/216/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/216/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/215,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/215/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/215/comments,https://api.github.com/repos/bigcommerce/docs/issues/215/events,https://github.com/bigcommerce/docs/pull/215,2228604033,PR_kwDOI7BBSM5r4DAB,215,DEVDOCS-5848: [Update] remove ngrok installation steps using npm,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-05T18:35:14Z,2024-04-11T15:28:56Z,2024-04-11T15:28:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/215,https://github.com/bigcommerce/docs/pull/215,https://github.com/bigcommerce/docs/pull/215.diff,https://github.com/bigcommerce/docs/pull/215.patch,2024-04-11T15:28:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5848] + + +## What changed? +Removed npm ngrok installation steps + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5848]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5848?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/215/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/215/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/214,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/214/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/214/comments,https://api.github.com/repos/bigcommerce/docs/issues/214/events,https://github.com/bigcommerce/docs/pull/214,2227050381,PR_kwDOI7BBSM5ryrhw,214,TAX-2050: Add performance/timeout section to tax provider API documentation,theromulans,10804073,MDQ6VXNlcjEwODA0MDcz,https://avatars.githubusercontent.com/u/10804073?v=4,,https://api.github.com/users/theromulans,https://github.com/theromulans,https://api.github.com/users/theromulans/followers,https://api.github.com/users/theromulans/following{/other_user},https://api.github.com/users/theromulans/gists{/gist_id},https://api.github.com/users/theromulans/starred{/owner}{/repo},https://api.github.com/users/theromulans/subscriptions,https://api.github.com/users/theromulans/orgs,https://api.github.com/users/theromulans/repos,https://api.github.com/users/theromulans/events{/privacy},https://api.github.com/users/theromulans/received_events,User,false,[],closed,false,,[],,3,2024-04-05T05:05:40Z,2024-04-23T21:59:38Z,2024-04-23T21:59:37Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/214,https://github.com/bigcommerce/docs/pull/214,https://github.com/bigcommerce/docs/pull/214.diff,https://github.com/bigcommerce/docs/pull/214.patch,2024-04-23T21:59:37Z,"On the back of a recent incident we identified there was an opportunity to speak more about performance and our timeout expectations in our Tax Provider API documentation. + +Here we are introducing a new section on this topic. Further comments inline.",https://api.github.com/repos/bigcommerce/docs/issues/214/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/214/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/213,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/213/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/213/comments,https://api.github.com/repos/bigcommerce/docs/issues/213/events,https://github.com/bigcommerce/docs/pull/213,2226772516,PR_kwDOI7BBSM5rxtbZ,213,fix(customers): Fix letter case in response mapping for the Get Stored Instrument API operation,TomA-R,1606901,MDQ6VXNlcjE2MDY5MDE=,https://avatars.githubusercontent.com/u/1606901?v=4,,https://api.github.com/users/TomA-R,https://github.com/TomA-R,https://api.github.com/users/TomA-R/followers,https://api.github.com/users/TomA-R/following{/other_user},https://api.github.com/users/TomA-R/gists{/gist_id},https://api.github.com/users/TomA-R/starred{/owner}{/repo},https://api.github.com/users/TomA-R/subscriptions,https://api.github.com/users/TomA-R/orgs,https://api.github.com/users/TomA-R/repos,https://api.github.com/users/TomA-R/events{/privacy},https://api.github.com/users/TomA-R/received_events,User,false,[],closed,false,,[],,0,2024-04-05T01:06:44Z,2024-04-11T13:16:38Z,2024-04-11T13:16:37Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/213,https://github.com/bigcommerce/docs/pull/213,https://github.com/bigcommerce/docs/pull/213.diff,https://github.com/bigcommerce/docs/pull/213.patch,2024-04-11T13:16:37Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5880] + +Fixes #212 + +## What changed? +Changes mapping value from #/components/schemas/PaypalAccountInstrument to #/components/schemas/PayPalAccountInstrument in response for the Get Stored Instrument API operation in the Customers V3 OpenAPI spec + +## Release notes draft +Updates OpenAPI spec: Fixes letter case in response mapping for the `PayPalAccountInstrument` when querying the V3 customers API for Stored Instruments + +## Anything else? +n/a + +[DEVDOCS-5880]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5880?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/213/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/213/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/212,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/212/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/212/comments,https://api.github.com/repos/bigcommerce/docs/issues/212/events,https://github.com/bigcommerce/docs/issues/212,2226754062,I_kwDOI7BBSM6EuZIO,212,"The OpenAPI spec for Customers V3 has a ""spelling"" error",gillih,4052533,MDQ6VXNlcjQwNTI1MzM=,https://avatars.githubusercontent.com/u/4052533?v=4,,https://api.github.com/users/gillih,https://github.com/gillih,https://api.github.com/users/gillih/followers,https://api.github.com/users/gillih/following{/other_user},https://api.github.com/users/gillih/gists{/gist_id},https://api.github.com/users/gillih/starred{/owner}{/repo},https://api.github.com/users/gillih/subscriptions,https://api.github.com/users/gillih/orgs,https://api.github.com/users/gillih/repos,https://api.github.com/users/gillih/events{/privacy},https://api.github.com/users/gillih/received_events,User,false,[],closed,false,,[],,1,2024-04-05T00:42:19Z,2024-04-11T13:16:38Z,2024-04-11T13:16:38Z,NONE,,,,,,,,"The line 1579 in Customers V3 Open API reference spec is + +`stored_paypal_account: '#/components/schemas/PaypalAccountInstrument'` + +but should be + +`stored_paypal_account: '#/components/schemas/PayPalAccountInstrument'` + +""Pal"" in ""PayPal"" has the incorrect case + +",https://api.github.com/repos/bigcommerce/docs/issues/212/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/212/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/211,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/211/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/211/comments,https://api.github.com/repos/bigcommerce/docs/issues/211/events,https://github.com/bigcommerce/docs/pull/211,2226511258,PR_kwDOI7BBSM5rwzVK,211,Update webhook-events.mdx,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-04T21:04:08Z,2024-04-24T19:12:05Z,2024-04-24T19:12:05Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/211,https://github.com/bigcommerce/docs/pull/211,https://github.com/bigcommerce/docs/pull/211.diff,https://github.com/bigcommerce/docs/pull/211.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5861] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5861]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5861?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/211/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/211/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/210,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/210/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/210/comments,https://api.github.com/repos/bigcommerce/docs/issues/210/events,https://github.com/bigcommerce/docs/pull/210,2225632784,PR_kwDOI7BBSM5rtu7h,210,Add to DEVDOCS-5717,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-04T14:12:55Z,2024-04-04T17:37:49Z,2024-04-04T17:37:48Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/210,https://github.com/bigcommerce/docs/pull/210,https://github.com/bigcommerce/docs/pull/210.diff,https://github.com/bigcommerce/docs/pull/210.patch,2024-04-04T17:37:48Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5717] + + +## What changed? +I did not see changes when merging the [PR 200.](https://github.com/bigcommerce/docs/pull/200/files) I think this one needed to be updated for the changes to display. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5717]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5717?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/210/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/210/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/209,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/209/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/209/comments,https://api.github.com/repos/bigcommerce/docs/issues/209/events,https://github.com/bigcommerce/docs/pull/209,2223726518,PR_kwDOI7BBSM5rnGVe,209,Issue-196: [update] cost_price,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-03T19:18:07Z,2024-04-05T18:59:16Z,2024-04-05T18:59:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/209,https://github.com/bigcommerce/docs/pull/209,https://github.com/bigcommerce/docs/pull/209.diff,https://github.com/bigcommerce/docs/pull/209.patch,2024-04-05T18:59:16Z,"<!-- Ticket number or summary of work --> +# [ISSUE-196](https://github.com/bigcommerce/docs/issues/196) + + +## What changed? +Clarified the values for cost_price. See Slack conversation for details. +https://bigcommerce.slack.com/archives/C05GVCPFW66/p1712082685986189 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/209/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/209/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/208,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/208/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/208/comments,https://api.github.com/repos/bigcommerce/docs/issues/208/events,https://github.com/bigcommerce/docs/pull/208,2221123254,PR_kwDOI7BBSM5reF45,208,remove duplicates of Store Address,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-02T18:06:26Z,2024-04-02T18:12:41Z,2024-04-02T18:12:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/208,https://github.com/bigcommerce/docs/pull/208,https://github.com/bigcommerce/docs/pull/208.diff,https://github.com/bigcommerce/docs/pull/208.patch,2024-04-02T18:12:41Z,"<!-- Ticket number or summary of work --> +#No Ticket - [Issue 207](https://github.com/bigcommerce/docs/issues/207) + +## What changed? +Store Address is listed twice so I removed one of them. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/208/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/208/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/207,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/207/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/207/comments,https://api.github.com/repos/bigcommerce/docs/issues/207/events,https://github.com/bigcommerce/docs/issues/207,2220645892,I_kwDOI7BBSM6EXF4E,207,Feedback for “Webhook Events”,john-franco-80,110476283,U_kgDOBpW7-w,https://avatars.githubusercontent.com/u/110476283?v=4,,https://api.github.com/users/john-franco-80,https://github.com/john-franco-80,https://api.github.com/users/john-franco-80/followers,https://api.github.com/users/john-franco-80/following{/other_user},https://api.github.com/users/john-franco-80/gists{/gist_id},https://api.github.com/users/john-franco-80/starred{/owner}{/repo},https://api.github.com/users/john-franco-80/subscriptions,https://api.github.com/users/john-franco-80/orgs,https://api.github.com/users/john-franco-80/repos,https://api.github.com/users/john-franco-80/events{/privacy},https://api.github.com/users/john-franco-80/received_events,User,false,[],closed,false,,[],,1,2024-04-02T14:15:48Z,2024-04-02T18:12:55Z,2024-04-02T18:12:55Z,NONE,,,,,,,,"https://developer.bigcommerce.com/docs/integrations/webhooks/events#stores + +Store Address is listed twice ",https://api.github.com/repos/bigcommerce/docs/issues/207/reactions,1,1,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/207/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/206,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/206/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/206/comments,https://api.github.com/repos/bigcommerce/docs/issues/206/events,https://github.com/bigcommerce/docs/pull/206,2218758372,PR_kwDOI7BBSM5rV_rL,206,DEVDOCS-5838: [product overrides] store_product_updated,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-04-01T17:55:57Z,2024-04-08T14:11:26Z,2024-04-05T18:59:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/206,https://github.com/bigcommerce/docs/pull/206,https://github.com/bigcommerce/docs/pull/206.diff,https://github.com/bigcommerce/docs/pull/206.patch,2024-04-05T18:59:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5838] + + +## What changed? +Updated store/product/updated and store/sku/updated +Added store/option/updated and store/modifier/updated + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +@jyuricle +@andrii-lenets + +[DEVDOCS-5838]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5838?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/206/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/206/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/205,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/205/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/205/comments,https://api.github.com/repos/bigcommerce/docs/issues/205/events,https://github.com/bigcommerce/docs/pull/205,2218630558,PR_kwDOI7BBSM5rVjXz,205,DEVDOCS-3840 [update] Add channel_id,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-04-01T16:37:31Z,2024-04-19T17:30:27Z,2024-04-19T17:30:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/205,https://github.com/bigcommerce/docs/pull/205,https://github.com/bigcommerce/docs/pull/205.diff,https://github.com/bigcommerce/docs/pull/205.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-3840] + + +## What changed? +Add channel_id as an optional field to existing catalog products v3 endpoints. + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +@bc-romanliukshyn +@bc-alexandr-naumenko + +[DEVDOCS-3840]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-3840?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/205/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/205/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/204,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/204/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/204/comments,https://api.github.com/repos/bigcommerce/docs/issues/204/events,https://github.com/bigcommerce/docs/issues/204,2216017541,I_kwDOI7BBSM6EFb6F,204,Feedback for “Price Lists Records”,paulopompeu,22667080,MDQ6VXNlcjIyNjY3MDgw,https://avatars.githubusercontent.com/u/22667080?v=4,,https://api.github.com/users/paulopompeu,https://github.com/paulopompeu,https://api.github.com/users/paulopompeu/followers,https://api.github.com/users/paulopompeu/following{/other_user},https://api.github.com/users/paulopompeu/gists{/gist_id},https://api.github.com/users/paulopompeu/starred{/owner}{/repo},https://api.github.com/users/paulopompeu/subscriptions,https://api.github.com/users/paulopompeu/orgs,https://api.github.com/users/paulopompeu/repos,https://api.github.com/users/paulopompeu/events{/privacy},https://api.github.com/users/paulopompeu/received_events,User,false,"[{""id"":6950291010,""node_id"":""LA_kwDOI7BBSM8AAAABnkUGQg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/answered"",""name"":""answered"",""color"":""7ABA6B"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bdav87"",""id"":16565458,""node_id"":""MDQ6VXNlcjE2NTY1NDU4"",""avatar_url"":""https://avatars.githubusercontent.com/u/16565458?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bdav87"",""html_url"":""https://github.com/bdav87"",""followers_url"":""https://api.github.com/users/bdav87/followers"",""following_url"":""https://api.github.com/users/bdav87/following{/other_user}"",""gists_url"":""https://api.github.com/users/bdav87/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bdav87/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bdav87/subscriptions"",""organizations_url"":""https://api.github.com/users/bdav87/orgs"",""repos_url"":""https://api.github.com/users/bdav87/repos"",""events_url"":""https://api.github.com/users/bdav87/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bdav87/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bdav87"",""id"":16565458,""node_id"":""MDQ6VXNlcjE2NTY1NDU4"",""avatar_url"":""https://avatars.githubusercontent.com/u/16565458?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bdav87"",""html_url"":""https://github.com/bdav87"",""followers_url"":""https://api.github.com/users/bdav87/followers"",""following_url"":""https://api.github.com/users/bdav87/following{/other_user}"",""gists_url"":""https://api.github.com/users/bdav87/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bdav87/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bdav87/subscriptions"",""organizations_url"":""https://api.github.com/users/bdav87/orgs"",""repos_url"":""https://api.github.com/users/bdav87/repos"",""events_url"":""https://api.github.com/users/bdav87/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bdav87/received_events"",""type"":""User"",""site_admin"":false},{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-03-29T21:32:27Z,2024-05-14T17:56:12Z,2024-05-14T17:51:43Z,NONE,,,,,,,,"Which value should I send to remove the price overriding the catalog price? + +I'm trying to remove the new price from an item so BigCommerce can use the catalog price. The upsert request doesn't accept: null, """", {}, etc... when I send 0.00, it becomes the new price instead. + +``` +curl --request PUT \ + --url 'https://api.bigcommerce.com/stores/store/v3/pricelists/1/records' \ + --header 'Accept: application/json' \ + --header 'Content-Type: application/json' \ + --header 'X-Auth-Token: token' \ + --data '[{""sku"":""999P7068"",""currency"":""usd"",""price"": 0 }]' +``` + +Thank you",https://api.github.com/repos/bigcommerce/docs/issues/204/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/204/timeline,,completed,bdav87,16565458,MDQ6VXNlcjE2NTY1NDU4,https://avatars.githubusercontent.com/u/16565458?v=4,,https://api.github.com/users/bdav87,https://github.com/bdav87,https://api.github.com/users/bdav87/followers,https://api.github.com/users/bdav87/following{/other_user},https://api.github.com/users/bdav87/gists{/gist_id},https://api.github.com/users/bdav87/starred{/owner}{/repo},https://api.github.com/users/bdav87/subscriptions,https://api.github.com/users/bdav87/orgs,https://api.github.com/users/bdav87/repos,https://api.github.com/users/bdav87/events{/privacy},https://api.github.com/users/bdav87/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/203,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/203/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/203/comments,https://api.github.com/repos/bigcommerce/docs/issues/203/events,https://github.com/bigcommerce/docs/pull/203,2215963645,PR_kwDOI7BBSM5rMzQ7,203,DEVDOCS-5855: [Update] clarify price list webhooks docs,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-29T20:29:35Z,2024-04-05T19:00:16Z,2024-04-05T19:00:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/203,https://github.com/bigcommerce/docs/pull/203,https://github.com/bigcommerce/docs/pull/203.diff,https://github.com/bigcommerce/docs/pull/203.patch,2024-04-05T19:00:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5855] + + +## What changed? +Added clarification for the Price List records docs + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5855]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5855?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/203/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/203/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/202,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/202/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/202/comments,https://api.github.com/repos/bigcommerce/docs/issues/202/events,https://github.com/bigcommerce/docs/issues/202,2214033913,I_kwDOI7BBSM6D93n5,202,Feedback for “Schemas”,electricenjindevops,107559620,U_kgDOBmk6xA,https://avatars.githubusercontent.com/u/107559620?v=4,,https://api.github.com/users/electricenjindevops,https://github.com/electricenjindevops,https://api.github.com/users/electricenjindevops/followers,https://api.github.com/users/electricenjindevops/following{/other_user},https://api.github.com/users/electricenjindevops/gists{/gist_id},https://api.github.com/users/electricenjindevops/starred{/owner}{/repo},https://api.github.com/users/electricenjindevops/subscriptions,https://api.github.com/users/electricenjindevops/orgs,https://api.github.com/users/electricenjindevops/repos,https://api.github.com/users/electricenjindevops/events{/privacy},https://api.github.com/users/electricenjindevops/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",open,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false},{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-03-28T20:06:13Z,2024-05-13T16:42:59Z,,NONE,,,,,,,,"On the schemas documentation we are unable to click the arrows to see more info for array / object structures. + +examples: +- facet +- meta +- selected + +https://developer.bigcommerce.com/docs/storefront/stencil/themes/context/object-reference/schemas#category + +I am using Chrome (latest version) on Windows 10. ",https://api.github.com/repos/bigcommerce/docs/issues/202/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/202/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/201,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/201/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/201/comments,https://api.github.com/repos/bigcommerce/docs/issues/201/events,https://github.com/bigcommerce/docs/pull/201,2213586361,PR_kwDOI7BBSM5rEtNx,201,"[DEVDOCS-5864]/[ANA-4629] Users, Update AddUserToStore docs to reflect security patch ",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-28T15:59:47Z,2024-03-28T16:10:42Z,2024-03-28T16:10:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/201,https://github.com/bigcommerce/docs/pull/201,https://github.com/bigcommerce/docs/pull/201.diff,https://github.com/bigcommerce/docs/pull/201.patch,2024-03-28T16:10:41Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5864] +Jira: [ANA-4629](https://bigcommercecloud.atlassian.net/browse/ANA-4629) + + +## What changed? +* Updating the AddUserToStore documentation to reflect the security patch that the IAM team tackled as part of ANA-4629. The vulnerability there was that it was possible for attackers to enumerate through user ID's and retrieve all the emails of users throughout the platform if they were successful in using an ID that belongs to someone. The IAM team recommends that we instead use email as the identifier for users as part of this specific mutation, however we are still allowing for a set of accounts that have existing Users API tokens to continue using the original API contract as before. + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @mikelopez100 + + +[ANA-4629]: +https://bigcommercecloud.atlassian.net/browse/ANA-4629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + + + +[DEVDOCS-5864]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5864?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[ANA-4629]: https://bigcommercecloud.atlassian.net/browse/ANA-4629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[ANA-4629]: https://bigcommercecloud.atlassian.net/browse/ANA-4629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/201/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/201/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/200,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/200/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/200/comments,https://api.github.com/repos/bigcommerce/docs/issues/200/events,https://github.com/bigcommerce/docs/pull/200,2209314232,PR_kwDOI7BBSM5q2VX0,200,DEVDOCS-5717: [update] Update shop_by_price.yml,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-26T20:56:48Z,2024-03-27T17:24:46Z,2024-03-27T17:24:45Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/200,https://github.com/bigcommerce/docs/pull/200,https://github.com/bigcommerce/docs/pull/200.diff,https://github.com/bigcommerce/docs/pull/200.patch,2024-03-27T17:24:45Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5717] + + +## What changed? +Updated the shop_by_price description + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5717]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5717?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/200/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/200/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/199,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/199/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/199/comments,https://api.github.com/repos/bigcommerce/docs/issues/199/events,https://github.com/bigcommerce/docs/pull/199,2209199403,PR_kwDOI7BBSM5q17md,199,"[DEVDOCS-5831/PAPI-2091]: Carts v3 and Store information V2, add store-level metafield's open api spec (#197)",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-26T19:59:01Z,2024-06-17T19:12:30Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/199,https://github.com/bigcommerce/docs/pull/199,https://github.com/bigcommerce/docs/pull/199.diff,https://github.com/bigcommerce/docs/pull/199.patch,,"<!-- Ticket number or summary of work --> +# [PAPI-2091] [DEVDOCS-5831] + + +## What changed? +- Store metafield's open api spec is now available in Store Information V2 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Store metafields is now available for use. Add metafield data to a merchant's store using this set of APIs. Metafields can be created, updated, and deleted on stores. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +[PAPI-2091]: +https://bigcommercecloud.atlassian.net/browse/PAPI-2091?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +ping @bc-tayvs + + + +--------- + +<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add Store metafields is now available. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[PAPI-2091]: https://bigcommercecloud.atlassian.net/browse/PAPI-2091?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[PAPI-2091]: https://bigcommercecloud.atlassian.net/browse/PAPI-2091?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +[DEVDOCS-5831]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5831?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/199/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/199/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/198,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/198/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/198/comments,https://api.github.com/repos/bigcommerce/docs/issues/198/events,https://github.com/bigcommerce/docs/pull/198,2206603251,PR_kwDOI7BBSM5qtCaJ,198,feat(iam): ANA-4629 Update AddUserToStore docs to reflect security patch,mikelopez100,47608798,MDQ6VXNlcjQ3NjA4Nzk4,https://avatars.githubusercontent.com/u/47608798?v=4,,https://api.github.com/users/mikelopez100,https://github.com/mikelopez100,https://api.github.com/users/mikelopez100/followers,https://api.github.com/users/mikelopez100/following{/other_user},https://api.github.com/users/mikelopez100/gists{/gist_id},https://api.github.com/users/mikelopez100/starred{/owner}{/repo},https://api.github.com/users/mikelopez100/subscriptions,https://api.github.com/users/mikelopez100/orgs,https://api.github.com/users/mikelopez100/repos,https://api.github.com/users/mikelopez100/events{/privacy},https://api.github.com/users/mikelopez100/received_events,User,false,[],closed,false,"{""login"":""mikelopez100"",""id"":47608798,""node_id"":""MDQ6VXNlcjQ3NjA4Nzk4"",""avatar_url"":""https://avatars.githubusercontent.com/u/47608798?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/mikelopez100"",""html_url"":""https://github.com/mikelopez100"",""followers_url"":""https://api.github.com/users/mikelopez100/followers"",""following_url"":""https://api.github.com/users/mikelopez100/following{/other_user}"",""gists_url"":""https://api.github.com/users/mikelopez100/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/mikelopez100/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/mikelopez100/subscriptions"",""organizations_url"":""https://api.github.com/users/mikelopez100/orgs"",""repos_url"":""https://api.github.com/users/mikelopez100/repos"",""events_url"":""https://api.github.com/users/mikelopez100/events{/privacy}"",""received_events_url"":""https://api.github.com/users/mikelopez100/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""mikelopez100"",""id"":47608798,""node_id"":""MDQ6VXNlcjQ3NjA4Nzk4"",""avatar_url"":""https://avatars.githubusercontent.com/u/47608798?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/mikelopez100"",""html_url"":""https://github.com/mikelopez100"",""followers_url"":""https://api.github.com/users/mikelopez100/followers"",""following_url"":""https://api.github.com/users/mikelopez100/following{/other_user}"",""gists_url"":""https://api.github.com/users/mikelopez100/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/mikelopez100/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/mikelopez100/subscriptions"",""organizations_url"":""https://api.github.com/users/mikelopez100/orgs"",""repos_url"":""https://api.github.com/users/mikelopez100/repos"",""events_url"":""https://api.github.com/users/mikelopez100/events{/privacy}"",""received_events_url"":""https://api.github.com/users/mikelopez100/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-03-25T20:07:20Z,2024-03-28T16:14:16Z,2024-03-28T15:58:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/198,https://github.com/bigcommerce/docs/pull/198,https://github.com/bigcommerce/docs/pull/198.diff,https://github.com/bigcommerce/docs/pull/198.patch,2024-03-28T15:58:06Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] +Jira: [ANA-4629](https://bigcommercecloud.atlassian.net/browse/ANA-4629) + + +## What changed? +* Updating the AddUserToStore documentation to reflect the security patch that the IAM team tackled as part of ANA-4629. The vulnerability there was that it was possible for attackers to enumerate through user ID's and retrieve all the emails of users throughout the platform if they were successful in using an ID that belongs to someone. The IAM team recommends that we instead use email as the identifier for users as part of this specific mutation, however we are still allowing for a set of accounts that have existing Users API tokens to continue using the original API contract as before. + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[ANA-4629]: https://bigcommercecloud.atlassian.net/browse/ANA-4629?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/198/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/198/timeline,,,mikelopez100,47608798,MDQ6VXNlcjQ3NjA4Nzk4,https://avatars.githubusercontent.com/u/47608798?v=4,,https://api.github.com/users/mikelopez100,https://github.com/mikelopez100,https://api.github.com/users/mikelopez100/followers,https://api.github.com/users/mikelopez100/following{/other_user},https://api.github.com/users/mikelopez100/gists{/gist_id},https://api.github.com/users/mikelopez100/starred{/owner}{/repo},https://api.github.com/users/mikelopez100/subscriptions,https://api.github.com/users/mikelopez100/orgs,https://api.github.com/users/mikelopez100/repos,https://api.github.com/users/mikelopez100/events{/privacy},https://api.github.com/users/mikelopez100/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/197,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/197/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/197/comments,https://api.github.com/repos/bigcommerce/docs/issues/197/events,https://github.com/bigcommerce/docs/pull/197,2206548106,PR_kwDOI7BBSM5qs2Gh,197,PAPI-2091: store metafield's open api spec,bc-tayvs,80041457,MDQ6VXNlcjgwMDQxNDU3,https://avatars.githubusercontent.com/u/80041457?v=4,,https://api.github.com/users/bc-tayvs,https://github.com/bc-tayvs,https://api.github.com/users/bc-tayvs/followers,https://api.github.com/users/bc-tayvs/following{/other_user},https://api.github.com/users/bc-tayvs/gists{/gist_id},https://api.github.com/users/bc-tayvs/starred{/owner}{/repo},https://api.github.com/users/bc-tayvs/subscriptions,https://api.github.com/users/bc-tayvs/orgs,https://api.github.com/users/bc-tayvs/repos,https://api.github.com/users/bc-tayvs/events{/privacy},https://api.github.com/users/bc-tayvs/received_events,User,false,[],closed,false,,[],,0,2024-03-25T19:38:57Z,2024-03-26T19:47:43Z,2024-03-26T19:47:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/197,https://github.com/bigcommerce/docs/pull/197,https://github.com/bigcommerce/docs/pull/197.diff,https://github.com/bigcommerce/docs/pull/197.patch,2024-03-26T19:47:42Z,"<!-- Ticket number or summary of work --> +# [PAPI-2091] + + +## What changed? +- Store metafield's open api spec + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping + + +[PAPI-2091]: https://bigcommercecloud.atlassian.net/browse/PAPI-2091?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/197/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/197/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/196,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/196/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/196/comments,https://api.github.com/repos/bigcommerce/docs/issues/196/events,https://github.com/bigcommerce/docs/issues/196,2206463051,I_kwDOI7BBSM6Dg_RL,196,Cost Price Value Issue,Pranay-Kumar-16,159160010,U_kgDOCXyWyg,https://avatars.githubusercontent.com/u/159160010?v=4,,https://api.github.com/users/Pranay-Kumar-16,https://github.com/Pranay-Kumar-16,https://api.github.com/users/Pranay-Kumar-16/followers,https://api.github.com/users/Pranay-Kumar-16/following{/other_user},https://api.github.com/users/Pranay-Kumar-16/gists{/gist_id},https://api.github.com/users/Pranay-Kumar-16/starred{/owner}{/repo},https://api.github.com/users/Pranay-Kumar-16/subscriptions,https://api.github.com/users/Pranay-Kumar-16/orgs,https://api.github.com/users/Pranay-Kumar-16/repos,https://api.github.com/users/Pranay-Kumar-16/events{/privacy},https://api.github.com/users/Pranay-Kumar-16/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",open,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,7,2024-03-25T18:57:42Z,2024-04-04T15:00:49Z,,NONE,,,,,,,,"Hi Team, + +I wanted to bring to your attention an observation I made while working on the create variants API. Specifically, I noticed that when the cost_price field is sent as null via API, it defaults to 0. However, when I create a variant from the UI, the cost_price is set to null when fetching the product from the API. + +I assume there might be an inconsistency in how the cost_price field is handled between the API and the UI as the API documentation says that the null values and number is accepted. + +Could we please review this observation and let me know if it is the expected behavior? + +Thank you.",https://api.github.com/repos/bigcommerce/docs/issues/196/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/196/timeline,,reopened,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/195,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/195/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/195/comments,https://api.github.com/repos/bigcommerce/docs/issues/195/events,https://github.com/bigcommerce/docs/pull/195,2202729491,PR_kwDOI7BBSM5qgE0B,195,Add a reference to price.yml,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-22T15:11:38Z,2024-03-22T15:35:16Z,2024-03-22T15:35:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/195,https://github.com/bigcommerce/docs/pull/195,https://github.com/bigcommerce/docs/pull/195.diff,https://github.com/bigcommerce/docs/pull/195.patch,2024-03-22T15:35:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-2781] + + +## What changed? +Add a reference to price.yml to display file. + +## Release notes draft +n/a + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-2781]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-2781?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/195/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/195/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/194,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/194/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/194/comments,https://api.github.com/repos/bigcommerce/docs/issues/194/events,https://github.com/bigcommerce/docs/pull/194,2202721075,PR_kwDOI7BBSM5qgC61,194,Adding price.yml to root directory,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-22T15:08:14Z,2024-03-22T15:32:19Z,2024-03-22T15:32:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/194,https://github.com/bigcommerce/docs/pull/194,https://github.com/bigcommerce/docs/pull/194.diff,https://github.com/bigcommerce/docs/pull/194.patch,2024-03-22T15:32:18Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-2781] + + +## What changed? +See slack conversation: https://bigcommerce.slack.com/archives/C57SQ401K/p1709333656392169 + +## Release notes draft +n/a + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-2781]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-2781?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/194/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/194/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/193,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/193/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/193/comments,https://api.github.com/repos/bigcommerce/docs/issues/193/events,https://github.com/bigcommerce/docs/pull/193,2201232394,PR_kwDOI7BBSM5qa8Bo,193,[GH-ISSUE] - [ #173] Order Product API does not return `order_product_id`,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-21T21:34:41Z,2024-05-09T18:51:17Z,2024-05-09T18:51:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/193,https://github.com/bigcommerce/docs/pull/193,https://github.com/bigcommerce/docs/pull/193.diff,https://github.com/bigcommerce/docs/pull/193.patch,2024-05-09T18:51:16Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5847] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add note indicating that the response `id` is required when creating order shipments + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Added a note to /v2/orders/{order_id}/shipments letting merchants know that the 'id' response is needed when creating order shipments. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5847]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5847?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/193/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/193/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/192,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/192/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/192/comments,https://api.github.com/repos/bigcommerce/docs/issues/192/events,https://github.com/bigcommerce/docs/pull/192,2201034975,PR_kwDOI7BBSM5qaQti,192,"[No-Ticket]: [revise] MarketingV2, Fix status code in marketing.v2.yml",funivan,425208,MDQ6VXNlcjQyNTIwOA==,https://avatars.githubusercontent.com/u/425208?v=4,,https://api.github.com/users/funivan,https://github.com/funivan,https://api.github.com/users/funivan/followers,https://api.github.com/users/funivan/following{/other_user},https://api.github.com/users/funivan/gists{/gist_id},https://api.github.com/users/funivan/starred{/owner}{/repo},https://api.github.com/users/funivan/subscriptions,https://api.github.com/users/funivan/orgs,https://api.github.com/users/funivan/repos,https://api.github.com/users/funivan/events{/privacy},https://api.github.com/users/funivan/received_events,User,false,[],closed,false,,[],,0,2024-03-21T19:48:57Z,2024-03-21T22:03:12Z,2024-03-21T22:03:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/192,https://github.com/bigcommerce/docs/pull/192,https://github.com/bigcommerce/docs/pull/192.diff,https://github.com/bigcommerce/docs/pull/192.patch,2024-03-21T22:03:11Z,"## What changed? + +I just checked this endpoint and it returns 201 instead of 200 + +```shell +curl --verbose --request POST \ + --url ""https://api.bigcommerce.com/stores/$HASH/v2/gift_certificates"" \ + --header 'Accept: application/json' \ + --header 'Content-Type: application/json' \ + --header ""X-Auth-Token: $TOKEN"" \ + --data '{""to_name"":""John Doe"",""to_email"":""johndoe@example.com"",""from_name"":""Jane Doe"",""from_email"":""janedoe@example.com"",""amount"":""11"",""balance"":""0"",""purchase_date"":""Mon, 19 Jan 1970 07:21:46 CST"",""expiry_date"":""Tue, 20 Jan 1970 08:45:38 CST"",""customer_id"":5,""template"":""celebration.html"",""message"":""Congratulations!"",""code"":""ABC-5N4-C7M-S78"",""status"":""active"",""currency_code"":""PLN""}' + + +``` + + +## Anything else? +![image](https://github.com/bigcommerce/docs/assets/425208/e06acc52-7162-4813-a0bb-deb83db7af44) + +",https://api.github.com/repos/bigcommerce/docs/issues/192/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/192/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/191,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/191/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/191/comments,https://api.github.com/repos/bigcommerce/docs/issues/191/events,https://github.com/bigcommerce/docs/pull/191,2201012510,PR_kwDOI7BBSM5qaLvE,191,"[DEVDOCS-5816]: [update] Apps Publishing, update screenshots and first step details",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-21T19:37:06Z,2024-03-21T20:10:29Z,2024-03-21T20:10:29Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/191,https://github.com/bigcommerce/docs/pull/191,https://github.com/bigcommerce/docs/pull/191.diff,https://github.com/bigcommerce/docs/pull/191.patch,2024-03-21T20:10:29Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5816] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Switch the first steps in the guide since the process has since updated +* Update images of the UI as it is no longer up-to-date + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Revisited out-of-date screenshots that now provide the correct steps needed to ceritfy an application + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5816]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5816?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/191/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/191/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/190,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/190/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/190/comments,https://api.github.com/repos/bigcommerce/docs/issues/190/events,https://github.com/bigcommerce/docs/pull/190,2200867248,PR_kwDOI7BBSM5qZrnq,190,"DEVDOCS-5168 [revise]: GQL SF API Faceted Search, clarify price sort order",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-03-21T18:18:05Z,2024-03-22T14:47:40Z,2024-03-22T14:47:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/190,https://github.com/bigcommerce/docs/pull/190,https://github.com/bigcommerce/docs/pull/190.diff,https://github.com/bigcommerce/docs/pull/190.patch,2024-03-22T14:47:39Z,"# [DEVDOCS-5168] + +## What changed? +- Clarified how API handles price sort order + + +[DEVDOCS-5168]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5168?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/190/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/190/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/189,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/189/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/189/comments,https://api.github.com/repos/bigcommerce/docs/issues/189/events,https://github.com/bigcommerce/docs/pull/189,2200756240,PR_kwDOI7BBSM5qZTIe,189,"DEVDOCS-5605 [revise]: Headless, add callout for Catalyst",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-03-21T17:17:39Z,2024-03-21T18:26:20Z,2024-03-21T18:26:19Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/189,https://github.com/bigcommerce/docs/pull/189,https://github.com/bigcommerce/docs/pull/189.diff,https://github.com/bigcommerce/docs/pull/189.patch,2024-03-21T18:26:19Z,"# [DEVDOCS-5605] + +## What changed? +- Added callout for Catalyst + +[DEVDOCS-5605]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5605?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/189/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/189/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/188,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/188/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/188/comments,https://api.github.com/repos/bigcommerce/docs/issues/188/events,https://github.com/bigcommerce/docs/pull/188,2200714363,PR_kwDOI7BBSM5qZJlV,188,DEVDOCS-5665: [update] GQL SF API end to end headless checkout flow,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-03-21T17:03:05Z,2024-03-26T16:20:16Z,2024-03-26T16:20:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/188,https://github.com/bigcommerce/docs/pull/188,https://github.com/bigcommerce/docs/pull/188.diff,https://github.com/bigcommerce/docs/pull/188.patch,2024-03-26T16:20:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5665] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Review and revise end-to-end GraphQL Storefront API headless checkout flow article + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5665]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5665?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/188/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/188/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/187,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/187/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/187/comments,https://api.github.com/repos/bigcommerce/docs/issues/187/events,https://github.com/bigcommerce/docs/pull/187,2200660388,PR_kwDOI7BBSM5qY9ku,187,"DEVDOCS-5817 [update]: Theme & Content APIs, update widget guide",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-03-21T16:38:54Z,2024-03-27T16:21:37Z,2024-03-27T16:21:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/187,https://github.com/bigcommerce/docs/pull/187,https://github.com/bigcommerce/docs/pull/187.diff,https://github.com/bigcommerce/docs/pull/187.patch,2024-03-27T16:21:36Z,"# [DEVDOCS-5817] + + +## What changed? +- Fix incorrect method for updating widget + + +[DEVDOCS-5817]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5817?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/187/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/187/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/186,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/186/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/186/comments,https://api.github.com/repos/bigcommerce/docs/issues/186/events,https://github.com/bigcommerce/docs/pull/186,2200653229,PR_kwDOI7BBSM5qY8AA,186,"DEVDOCS-5646 [update] Checkouts, changes to discounts",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6477243721,""node_id"":""LA_kwDOI7BBSM8AAAABghLlSQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-css-cue"",""name"":""awaiting-css-cue"",""color"":""492E5F"",""default"":false,""description"":""""}]",closed,false,,[],,3,2024-03-21T16:35:14Z,2024-03-25T17:50:40Z,2024-03-25T17:50:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/186,https://github.com/bigcommerce/docs/pull/186,https://github.com/bigcommerce/docs/pull/186.diff,https://github.com/bigcommerce/docs/pull/186.patch,2024-03-25T17:50:39Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5646] + + +## What changed? +Updated checkout discount endpoint + +## Release notes draft +V3/Discounts API can now be used to add item-level discount in addition to cart level discount + + +## Anything else? +Initial PR: [PR 1517](https://github.com/bigcommerce/api-specs/pull/1517) +[Checkout-7756](https://bigcommercecloud.atlassian.net/browse/CHECKOUT-7756) + + +ping @valentindellangela and @bc-charlesho for review + + +[DEVDOCS-5646]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5646?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/186/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/186/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/185,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/185/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/185/comments,https://api.github.com/repos/bigcommerce/docs/issues/185/events,https://github.com/bigcommerce/docs/pull/185,2200419624,PR_kwDOI7BBSM5qYITT,185,DEVDOCS-5834 [Update] make state_or_province required,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-21T14:56:38Z,2024-03-21T18:34:14Z,2024-03-21T18:34:13Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/185,https://github.com/bigcommerce/docs/pull/185,https://github.com/bigcommerce/docs/pull/185.diff,https://github.com/bigcommerce/docs/pull/185.patch,2024-03-21T18:34:13Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5834] & [DEVDOCS-5833] + + +## What changed? +Make state_or_province required in the Add Consignment to Checkout endpoint + +## Release notes draft + +Bug Fix + +## Anything else? +See DEVDOCS tickets for screenshots. + +ping {names} + + +[DEVDOCS-5834]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5834?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +[DEVDOCS-5833]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5833?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/185/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/185/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/184,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/184/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/184/comments,https://api.github.com/repos/bigcommerce/docs/issues/184/events,https://github.com/bigcommerce/docs/pull/184,2199990579,PR_kwDOI7BBSM5qWqED,184,DEVDOCS-5767: Create a storefront token API allows 2 domains,bc-bm,109731768,U_kgDOBopfuA,https://avatars.githubusercontent.com/u/109731768?v=4,,https://api.github.com/users/bc-bm,https://github.com/bc-bm,https://api.github.com/users/bc-bm/followers,https://api.github.com/users/bc-bm/following{/other_user},https://api.github.com/users/bc-bm/gists{/gist_id},https://api.github.com/users/bc-bm/starred{/owner}{/repo},https://api.github.com/users/bc-bm/subscriptions,https://api.github.com/users/bc-bm/orgs,https://api.github.com/users/bc-bm/repos,https://api.github.com/users/bc-bm/events{/privacy},https://api.github.com/users/bc-bm/received_events,User,false,[],closed,false,,[],,0,2024-03-21T11:58:30Z,2024-03-21T21:47:49Z,2024-03-21T21:47:49Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/184,https://github.com/bigcommerce/docs/pull/184,https://github.com/bigcommerce/docs/pull/184.diff,https://github.com/bigcommerce/docs/pull/184.patch,2024-03-21T21:47:48Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5767] : [update] Storefront Token, Update the Create a storefront token endpoint's allowed CORS origins max limit + + +## What changed? +* BigCommerce currently allows sending two domains for CORS, API doc updated to change the limit from 1 to 2. + +## Release notes draft +* Create GraphQL token API docs - updated the number of allowed domains for CORS to 2. + + +## Anything else? +BigCommerce currently allows sending two domains, we get this error when we send more than 2 origins : ""Allowed CORS origins list length should not be greater than 2"". + + +[DEVDOCS-5767]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5767?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/184/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/184/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/183,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/183/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/183/comments,https://api.github.com/repos/bigcommerce/docs/issues/183/events,https://github.com/bigcommerce/docs/pull/183,2198276365,PR_kwDOI7BBSM5qQwVR,183,"DEVDOCS-5840: [update] add link to stored instruments, add theme considerations",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-03-20T18:33:30Z,2024-04-19T16:31:37Z,2024-04-19T16:31:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/183,https://github.com/bigcommerce/docs/pull/183,https://github.com/bigcommerce/docs/pull/183.diff,https://github.com/bigcommerce/docs/pull/183.patch,2024-04-19T16:31:36Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5840] + + +## What changed? +* Added a link to the Stored Instruments doc +* Added a new section on Theme considerations + + +## Release notes draft +Clarified the workarounds needed when using Payment API on a headless storefront. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5840]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5840?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/183/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/183/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/182,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/182/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/182/comments,https://api.github.com/repos/bigcommerce/docs/issues/182/events,https://github.com/bigcommerce/docs/pull/182,2198034667,PR_kwDOI7BBSM5qP6mL,182,update per Bala,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-20T16:53:33Z,2024-03-20T17:12:26Z,2024-03-20T17:12:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/182,https://github.com/bigcommerce/docs/pull/182,https://github.com/bigcommerce/docs/pull/182.diff,https://github.com/bigcommerce/docs/pull/182.patch,2024-03-20T17:12:25Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5841] + + +## What changed? +Updated description for consents + +## Release notes draft +n/a + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5841]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5841?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/182/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/182/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/181,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/181/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/181/comments,https://api.github.com/repos/bigcommerce/docs/issues/181/events,https://github.com/bigcommerce/docs/pull/181,2198007047,PR_kwDOI7BBSM5qP0fF,181,Linter testing new action location,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],open,false,,[],,0,2024-03-20T16:40:29Z,2024-06-17T19:12:29Z,,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/181,https://github.com/bigcommerce/docs/pull/181,https://github.com/bigcommerce/docs/pull/181.diff,https://github.com/bigcommerce/docs/pull/181.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/181/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/181/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/180,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/180/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/180/comments,https://api.github.com/repos/bigcommerce/docs/issues/180/events,https://github.com/bigcommerce/docs/pull/180,2197874047,PR_kwDOI7BBSM5qPW9t,180,Testing relocated action,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-03-20T15:44:35Z,2024-03-20T16:43:15Z,2024-03-20T16:39:49Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/180,https://github.com/bigcommerce/docs/pull/180,https://github.com/bigcommerce/docs/pull/180.diff,https://github.com/bigcommerce/docs/pull/180.patch,,,https://api.github.com/repos/bigcommerce/docs/issues/180/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/180/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/179,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/179/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/179/comments,https://api.github.com/repos/bigcommerce/docs/issues/179/events,https://github.com/bigcommerce/docs/pull/179,2197715148,PR_kwDOI7BBSM5qO0AN,179,DEVDOCS-5841: [update] add consents,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-20T14:41:36Z,2024-03-20T14:44:45Z,2024-03-20T14:44:45Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/179,https://github.com/bigcommerce/docs/pull/179,https://github.com/bigcommerce/docs/pull/179.diff,https://github.com/bigcommerce/docs/pull/179.patch,2024-03-20T14:44:45Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5841] + + +## What changed? +Added missing consents array + +## Release notes draft + +Bug Fix + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5841]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5841?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/179/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/179/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/178,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/178/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/178/comments,https://api.github.com/repos/bigcommerce/docs/issues/178/events,https://github.com/bigcommerce/docs/pull/178,2195970168,PR_kwDOI7BBSM5qJKJT,178,DEVDOCS-5846 [Update] update timeline section,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-19T20:42:12Z,2024-03-21T18:27:53Z,2024-03-21T18:27:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/178,https://github.com/bigcommerce/docs/pull/178,https://github.com/bigcommerce/docs/pull/178.diff,https://github.com/bigcommerce/docs/pull/178.patch,2024-03-21T18:27:53Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5846] + + +## What changed? +Updated the timeline section since node sass has been sunsetted + +## Release notes draft +N/A + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5846]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5846?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/178/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/178/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/177,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/177/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/177/comments,https://api.github.com/repos/bigcommerce/docs/issues/177/events,https://github.com/bigcommerce/docs/pull/177,2195629805,PR_kwDOI7BBSM5qH-9T,177,"[DEVDOCS-5413]: [revise] OrdersV2, is_deleted is a read-only value",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-03-19T18:00:49Z,2024-03-20T19:59:04Z,2024-03-20T19:59:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/177,https://github.com/bigcommerce/docs/pull/177,https://github.com/bigcommerce/docs/pull/177.diff,https://github.com/bigcommerce/docs/pull/177.patch,2024-03-20T19:59:03Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5413] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Correct `is_deleted` definition to include that this is a read-only parameter. +* Remove is_deleted from the body request for create an order. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No PR needed for a read-only attribute fix + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5413]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5413?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/177/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/177/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/176,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/176/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/176/comments,https://api.github.com/repos/bigcommerce/docs/issues/176/events,https://github.com/bigcommerce/docs/pull/176,2195594588,PR_kwDOI7BBSM5qH3JH,176,"DEVDOCS-5844 [update] add links to price lists, price list records an…",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-19T17:44:20Z,2024-03-21T18:28:20Z,2024-03-21T18:28:20Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/176,https://github.com/bigcommerce/docs/pull/176,https://github.com/bigcommerce/docs/pull/176.diff,https://github.com/bigcommerce/docs/pull/176.patch,2024-03-21T18:28:19Z,"…d assignments t + +<!-- Ticket number or summary of work --> +# [DEVDOCS-5844] + + +## What changed? +Added price list webhooks, price list record and price list assignment to the Guide for apps. + +## Release notes draft +N/A + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5844]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5844?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/176/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/176/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/175,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/175/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/175/comments,https://api.github.com/repos/bigcommerce/docs/issues/175/events,https://github.com/bigcommerce/docs/pull/175,2193350689,PR_kwDOI7BBSM5qALmZ,175,"[DEVDOCS-5772]: [revise] Webhooks, Webhook event Orders",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-18T21:22:19Z,2024-03-19T19:06:15Z,2024-03-19T19:06:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/175,https://github.com/bigcommerce/docs/pull/175,https://github.com/bigcommerce/docs/pull/175.diff,https://github.com/bigcommerce/docs/pull/175.patch,2024-03-19T19:06:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5772] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add information to store/orders/created table informing that this fires on all orders including those with incomplete payments, failed payments, and unprocessed orders. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* no release notes needed here. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5772]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5772?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/175/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/175/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/174,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/174/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/174/comments,https://api.github.com/repos/bigcommerce/docs/issues/174/events,https://github.com/bigcommerce/docs/issues/174,2190983146,I_kwDOI7BBSM6Cl7_q,174,Feedback for “Object Reference”,Euclidean-Dev,83853737,MDQ6VXNlcjgzODUzNzM3,https://avatars.githubusercontent.com/u/83853737?v=4,,https://api.github.com/users/Euclidean-Dev,https://github.com/Euclidean-Dev,https://api.github.com/users/Euclidean-Dev/followers,https://api.github.com/users/Euclidean-Dev/following{/other_user},https://api.github.com/users/Euclidean-Dev/gists{/gist_id},https://api.github.com/users/Euclidean-Dev/starred{/owner}{/repo},https://api.github.com/users/Euclidean-Dev/subscriptions,https://api.github.com/users/Euclidean-Dev/orgs,https://api.github.com/users/Euclidean-Dev/repos,https://api.github.com/users/Euclidean-Dev/events{/privacy},https://api.github.com/users/Euclidean-Dev/received_events,User,false,[],closed,false,,[],,1,2024-03-18T00:19:42Z,2024-03-18T00:21:32Z,2024-03-18T00:21:14Z,NONE,,,,,,,,Missing: Object definitions for the Order Email template.,https://api.github.com/repos/bigcommerce/docs/issues/174/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/174/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/173,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/173/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/173/comments,https://api.github.com/repos/bigcommerce/docs/issues/173/events,https://github.com/bigcommerce/docs/issues/173,2189960984,I_kwDOI7BBSM6CiCcY,173,Order Product API does not return order_product_id,lisastriker,18165904,MDQ6VXNlcjE4MTY1OTA0,https://avatars.githubusercontent.com/u/18165904?v=4,,https://api.github.com/users/lisastriker,https://github.com/lisastriker,https://api.github.com/users/lisastriker/followers,https://api.github.com/users/lisastriker/following{/other_user},https://api.github.com/users/lisastriker/gists{/gist_id},https://api.github.com/users/lisastriker/starred{/owner}{/repo},https://api.github.com/users/lisastriker/subscriptions,https://api.github.com/users/lisastriker/orgs,https://api.github.com/users/lisastriker/repos,https://api.github.com/users/lisastriker/events{/privacy},https://api.github.com/users/lisastriker/received_events,User,false,"[{""id"":6930298775,""node_id"":""LA_kwDOI7BBSM8AAAABnRP3lw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/changes%20made"",""name"":""changes made"",""color"":""44A6A0"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-03-16T13:11:10Z,2024-05-09T18:53:35Z,2024-05-09T18:53:35Z,NONE,,,,,,,,"When i run a get request https://api.bigcommerce.com/stores/{store}/v2/orders/{order_number}/products. No order_product_id is found + +This is my json result +`[ + { + ""id"": 108, + ""order_id"": 196, + ""product_id"": 8250, + ""variant_id"": 8215, + ""order_pickup_method_id"": 0, + ""order_address_id"": 97, + ""name"": ""Antenna, 3dBi Wifi emONE"", + ""name_customer"": ""Antenna, 3dBi Wifi emONE"", + ""name_merchant"": ""Antenna, 3dBi Wifi emONE"", + ""sku"": ""ANT-008"", + ""upc"": """", + ""type"": ""physical"", + ""base_price"": ""25.0000"", + ""price_ex_tax"": ""25.0000"", + ""price_inc_tax"": ""25.0000"", + ""price_tax"": ""0.0000"", + ""base_total"": ""1000.0000"", + ""total_ex_tax"": ""1000.0000"", + ""total_inc_tax"": ""1000.0000"", + ""total_tax"": ""0.0000"", + ""weight"": ""0.0800"", + ""width"": ""0.0000"", + ""height"": ""0.0000"", + ""depth"": ""0.0000"", + ""quantity"": 40, + ""base_cost_price"": ""0.0000"", + ""cost_price_inc_tax"": ""0.0000"", + ""cost_price_ex_tax"": ""0.0000"", + ""cost_price_tax"": ""0.0000"", + ""is_refunded"": false, + ""quantity_refunded"": 0, + ""refund_amount"": ""0.0000"", + ""return_id"": 0, + ""wrapping_id"": 0, + ""wrapping_name"": """", + ""base_wrapping_cost"": ""0.0000"", + ""wrapping_cost_ex_tax"": ""0.0000"", + ""wrapping_cost_inc_tax"": ""0.0000"", + ""wrapping_cost_tax"": ""0.0000"", + ""wrapping_message"": """", + ""quantity_shipped"": 0, + ""event_name"": null, + ""event_date"": """", + ""fixed_shipping_cost"": ""0.0000"", + ""ebay_item_id"": """", + ""ebay_transaction_id"": """", + ""option_set_id"": null, + ""parent_order_product_id"": null, + ""is_bundled_product"": false, + ""bin_picking_number"": """", + ""external_id"": null, + ""fulfillment_source"": """", + ""brand"": """", + ""gift_certificate_id"": null, + ""applied_discounts"": [], + ""product_options"": [], + ""configurable_fields"": [], + ""discounted_total_inc_tax"": ""1000.0000"" + } +]` + +As you can see, there is no order_product_id. This means for this API endpoint https://api.bigcommerce.com/stores/{sttore_id}/v2/orders/{orderr_id}/shipments, i can't create a shipment, because i simply don't have the order_product_id and i have no way to get it. + +I'm wondering if this is because of the variant ID. I have a feeling, the variant and product id might have to be combined? I'm not sure what's the problem. +https://api.bigcommerce.com/stores/{store_id}/v2/orders/{order_id}/products/{product_id} +-> This also strangely gives an error once i plug in the product id +![image](https://github.com/bigcommerce/docs/assets/18165904/c73c0d1d-3158-4846-b148-3d683d1cad82) + + +",https://api.github.com/repos/bigcommerce/docs/issues/173/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/173/timeline,,completed,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/172,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/172/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/172/comments,https://api.github.com/repos/bigcommerce/docs/issues/172/events,https://github.com/bigcommerce/docs/pull/172,2189007760,PR_kwDOI7BBSM5pxhBN,172,DEVDOCS-5830: [update] added missing fields,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-15T16:16:52Z,2024-03-18T16:19:28Z,2024-03-18T16:19:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/172,https://github.com/bigcommerce/docs/pull/172,https://github.com/bigcommerce/docs/pull/172.diff,https://github.com/bigcommerce/docs/pull/172.patch,2024-03-18T16:19:27Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5830] + + +## What changed? +Added in missing fields:`is_active` and `updated_at` + +## Release notes draft +Bug Fix +Added in missing fields to Get all themes and get a theme endpoints + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5830]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5830?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/172/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/172/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/171,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/171/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/171/comments,https://api.github.com/repos/bigcommerce/docs/issues/171/events,https://github.com/bigcommerce/docs/pull/171,2188795792,PR_kwDOI7BBSM5pwwXg,171,DEVDOCS-5732: [update] Added tree_id to example response body,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-15T15:10:32Z,2024-03-18T16:19:54Z,2024-03-18T16:19:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/171,https://github.com/bigcommerce/docs/pull/171,https://github.com/bigcommerce/docs/pull/171.diff,https://github.com/bigcommerce/docs/pull/171.patch,2024-03-18T16:19:54Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5732] + + +## What changed? +Updated the example response for Get all Categories + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5732]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5732?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/171/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/171/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/170,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/170/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/170/comments,https://api.github.com/repos/bigcommerce/docs/issues/170/events,https://github.com/bigcommerce/docs/issues/170,2187411241,I_kwDOI7BBSM6CYT8p,170,Feedback for “Store Logs”,pgorizo,110556971,U_kgDOBpb3Kw,https://avatars.githubusercontent.com/u/110556971?v=4,,https://api.github.com/users/pgorizo,https://github.com/pgorizo,https://api.github.com/users/pgorizo/followers,https://api.github.com/users/pgorizo/following{/other_user},https://api.github.com/users/pgorizo/gists{/gist_id},https://api.github.com/users/pgorizo/starred{/owner}{/repo},https://api.github.com/users/pgorizo/subscriptions,https://api.github.com/users/pgorizo/orgs,https://api.github.com/users/pgorizo/repos,https://api.github.com/users/pgorizo/events{/privacy},https://api.github.com/users/pgorizo/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",open,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-03-14T22:49:31Z,2024-03-20T16:33:51Z,,NONE,,,,,,,,"https://api.bigcommerce.com/stores/store_hash/v3/store/systemlogs?date_created:max=1749373600 +1749373600 = March 12, 2024, 00:00:00 (UTC) +Should return results and the last dated log was dated for 2023-01-25T15:51:39+00:00 we have made modifications that should have logged past this date. + +I also cant add another parameter such as ?date_created:min=1749373600&date_created:max=1710395999. It provides a 200 response but data was returned and there is logs for this date range. ",https://api.github.com/repos/bigcommerce/docs/issues/170/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/170/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/169,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/169/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/169/comments,https://api.github.com/repos/bigcommerce/docs/issues/169/events,https://github.com/bigcommerce/docs/pull/169,2187157462,PR_kwDOI7BBSM5prILX,169,Testing linter,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],open,false,,[],,0,2024-03-14T19:53:15Z,2024-06-17T19:12:30Z,,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/169,https://github.com/bigcommerce/docs/pull/169,https://github.com/bigcommerce/docs/pull/169.diff,https://github.com/bigcommerce/docs/pull/169.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/169/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/169/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/168,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/168/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/168/comments,https://api.github.com/repos/bigcommerce/docs/issues/168/events,https://github.com/bigcommerce/docs/pull/168,2186980767,PR_kwDOI7BBSM5pqg7F,168,Testing linter,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-03-14T18:14:19Z,2024-03-14T19:51:55Z,2024-03-14T19:51:55Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/168,https://github.com/bigcommerce/docs/pull/168,https://github.com/bigcommerce/docs/pull/168.diff,https://github.com/bigcommerce/docs/pull/168.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/168/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/168/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/167,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/167/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/167/comments,https://api.github.com/repos/bigcommerce/docs/issues/167/events,https://github.com/bigcommerce/docs/pull/167,2186924851,PR_kwDOI7BBSM5pqUqx,167,Testing Linter,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-03-14T17:41:09Z,2024-03-14T18:13:50Z,2024-03-14T18:13:50Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/167,https://github.com/bigcommerce/docs/pull/167,https://github.com/bigcommerce/docs/pull/167.diff,https://github.com/bigcommerce/docs/pull/167.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/167/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/167/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/166,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/166/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/166/comments,https://api.github.com/repos/bigcommerce/docs/issues/166/events,https://github.com/bigcommerce/docs/pull/166,2186908867,PR_kwDOI7BBSM5pqRKc,166,Test linter,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-03-14T17:31:44Z,2024-03-14T17:39:27Z,2024-03-14T17:39:27Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/166,https://github.com/bigcommerce/docs/pull/166,https://github.com/bigcommerce/docs/pull/166.diff,https://github.com/bigcommerce/docs/pull/166.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/166/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/166/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/165,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/165/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/165/comments,https://api.github.com/repos/bigcommerce/docs/issues/165/events,https://github.com/bigcommerce/docs/pull/165,2182648968,PR_kwDOI7BBSM5pbwIx,165,"[DEVDOCS-5802]: [update] Storefront Customers, Add customer metafields and customer metafields by metafieldId endpoints",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-03-12T20:51:44Z,2024-06-17T19:12:30Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/165,https://github.com/bigcommerce/docs/pull/165,https://github.com/bigcommerce/docs/pull/165.diff,https://github.com/bigcommerce/docs/pull/165.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5802] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add endpoints to the Storefront Customers API +* Include customers/{customerId}/metafields (GET/POST) +* Include customers/{customerId}/metafields/{metafieldId} (GET/PUT/DELETE) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Now you can add metafields to Customers, as well as look up a Customer's metafield by metafieldId. This collection of APIs provide you with the actions needed to provide more Customer information (from a list), and the ability to delete what you don't want. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @zvuki + + +[DEVDOCS-5802]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5802?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/165/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/165/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/164,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/164/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/164/comments,https://api.github.com/repos/bigcommerce/docs/issues/164/events,https://github.com/bigcommerce/docs/pull/164,2182491271,PR_kwDOI7BBSM5pbNXf,164,changed Price Lists to Price list,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-12T19:11:53Z,2024-03-14T16:38:20Z,2024-03-14T16:38:19Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/164,https://github.com/bigcommerce/docs/pull/164,https://github.com/bigcommerce/docs/pull/164.diff,https://github.com/bigcommerce/docs/pull/164.patch,2024-03-14T16:38:19Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5401] + + +## What changed? +fixed typo + +## Release notes draft +N/A + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5401]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5401?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/164/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/164/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/163,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/163/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/163/comments,https://api.github.com/repos/bigcommerce/docs/issues/163/events,https://github.com/bigcommerce/docs/pull/163,2182285144,PR_kwDOI7BBSM5pafHW,163,DEVDOCS-5792: [update] add file upload option example,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-03-12T17:33:51Z,2024-03-14T16:38:39Z,2024-03-14T16:38:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/163,https://github.com/bigcommerce/docs/pull/163,https://github.com/bigcommerce/docs/pull/163.diff,https://github.com/bigcommerce/docs/pull/163.patch,2024-03-14T16:38:38Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5792] + + +## What changed? +Added file upload options example + +## Release notes draft +Added example for using the file upload option to create a cart. + + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5792]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5792?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/163/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/163/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/162,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/162/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/162/comments,https://api.github.com/repos/bigcommerce/docs/issues/162/events,https://github.com/bigcommerce/docs/pull/162,2180049918,PR_kwDOI7BBSM5pSyB6,162,Fix for GraphQL complexity limit example error message,CNanninga,668830,MDQ6VXNlcjY2ODgzMA==,https://avatars.githubusercontent.com/u/668830?v=4,,https://api.github.com/users/CNanninga,https://github.com/CNanninga,https://api.github.com/users/CNanninga/followers,https://api.github.com/users/CNanninga/following{/other_user},https://api.github.com/users/CNanninga/gists{/gist_id},https://api.github.com/users/CNanninga/starred{/owner}{/repo},https://api.github.com/users/CNanninga/subscriptions,https://api.github.com/users/CNanninga/orgs,https://api.github.com/users/CNanninga/repos,https://api.github.com/users/CNanninga/events{/privacy},https://api.github.com/users/CNanninga/received_events,User,false,[],closed,false,,[],,0,2024-03-11T19:32:07Z,2024-03-11T19:39:11Z,2024-03-11T19:39:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/162,https://github.com/bigcommerce/docs/pull/162,https://github.com/bigcommerce/docs/pull/162.diff,https://github.com/bigcommerce/docs/pull/162.patch,2024-03-11T19:39:11Z,"# Fix for GraphQL complexity limit example error message + + +## What changed? +* Re-formatted the example GraphQL complexity limit error message to match what is actually returned: An `errors` array with a `message` property in the error object. + +## Release notes draft +* Fixed incorrect formatting of the example error message for GraphQL complexity limits.",https://api.github.com/repos/bigcommerce/docs/issues/162/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/162/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/161,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/161/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/161/comments,https://api.github.com/repos/bigcommerce/docs/issues/161/events,https://github.com/bigcommerce/docs/pull/161,2176239789,PR_kwDOI7BBSM5pF9OY,161,DEVDOCS-5678: [update] clarify payments doc,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-03-08T15:17:57Z,2024-03-12T18:41:40Z,2024-03-12T16:33:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/161,https://github.com/bigcommerce/docs/pull/161,https://github.com/bigcommerce/docs/pull/161.diff,https://github.com/bigcommerce/docs/pull/161.patch,2024-03-12T16:33:40Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5678] + + +## What changed? +Updated wording to alleviate confusion. + +## Release notes draft + +Bug Fix +Clarified the availability of stored PayPal accounts vs general Wallet availability + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5678]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5678?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/161/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/161/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/160,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/160/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/160/comments,https://api.github.com/repos/bigcommerce/docs/issues/160/events,https://github.com/bigcommerce/docs/pull/160,2175817267,PR_kwDOI7BBSM5pEgN4,160,feat(payment): PAYPAL-3716 Mention that PayPalCommercePlatform can use stored paypal accounts,bc-illia-rezvin,132652652,U_kgDOB-gebA,https://avatars.githubusercontent.com/u/132652652?v=4,,https://api.github.com/users/bc-illia-rezvin,https://github.com/bc-illia-rezvin,https://api.github.com/users/bc-illia-rezvin/followers,https://api.github.com/users/bc-illia-rezvin/following{/other_user},https://api.github.com/users/bc-illia-rezvin/gists{/gist_id},https://api.github.com/users/bc-illia-rezvin/starred{/owner}{/repo},https://api.github.com/users/bc-illia-rezvin/subscriptions,https://api.github.com/users/bc-illia-rezvin/orgs,https://api.github.com/users/bc-illia-rezvin/repos,https://api.github.com/users/bc-illia-rezvin/events{/privacy},https://api.github.com/users/bc-illia-rezvin/received_events,User,false,[],closed,false,,[],,0,2024-03-08T11:07:43Z,2024-04-29T08:00:49Z,2024-04-29T08:00:48Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/160,https://github.com/bigcommerce/docs/pull/160,https://github.com/bigcommerce/docs/pull/160.diff,https://github.com/bigcommerce/docs/pull/160.patch,2024-04-29T08:00:48Z,"<!-- Ticket number or summary of work --> +# [PAYPAL-3716] < not before May 1st, 2024 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Changed ""PayPal Powered By Braintree is the only provider that currently supports the ability to store PayPal accounts"" to ""PayPal Powered By Braintree and PayPal (Commerce Platform) are the providers that support the ability to store PayPal accounts"" +* Added checkbox in the Compatible payment gateways table, ""Stored instruments"" column, PayPal (Commerce Platform) row + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. --> +* Mention that PayPal (Commerce Platform) can store PayPal accounts along with Braintree + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +This should be probably merged after PPCP account vaulting GA (on May 1st, 2024) + + + +[PAYPAL-3716]: https://bigcommercecloud.atlassian.net/browse/PAYPAL-3716?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/160/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/160/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/159,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/159/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/159/comments,https://api.github.com/repos/bigcommerce/docs/issues/159/events,https://github.com/bigcommerce/docs/pull/159,2174892413,PR_kwDOI7BBSM5pBXPe,159,DEVDOCS-5678,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-07T22:03:51Z,2024-03-13T18:02:35Z,2024-03-07T22:03:54Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/159,https://github.com/bigcommerce/docs/pull/159,https://github.com/bigcommerce/docs/pull/159.diff,https://github.com/bigcommerce/docs/pull/159.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/159/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/159/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/158,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/158/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/158/comments,https://api.github.com/repos/bigcommerce/docs/issues/158/events,https://github.com/bigcommerce/docs/pull/158,2171836417,PR_kwDOI7BBSM5o23cU,158,Added more clarification for custom folder,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-03-06T15:50:51Z,2024-03-06T16:02:27Z,2024-03-06T16:02:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/158,https://github.com/bigcommerce/docs/pull/158,https://github.com/bigcommerce/docs/pull/158.diff,https://github.com/bigcommerce/docs/pull/158.patch,2024-03-06T16:02:26Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5464] + + +## What changed? +The documentation is correct now but I have been asked to make it very clear that you can add front matter to the custom directory. + +## Release notes draft + +See [PR 131](https://github.com/bigcommerce/docs/pull/131) + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5464]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5464?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/158/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/158/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/157,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/157/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/157/comments,https://api.github.com/repos/bigcommerce/docs/issues/157/events,https://github.com/bigcommerce/docs/pull/157,2170306727,PR_kwDOI7BBSM5oxo59,157,"[DEVDOCS-5666]: [revise] Price Lists, Fix PUT Create Batch of Price Lists records request/response bodies",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-05T23:15:54Z,2024-03-06T21:17:04Z,2024-03-06T21:17:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/157,https://github.com/bigcommerce/docs/pull/157,https://github.com/bigcommerce/docs/pull/157.diff,https://github.com/bigcommerce/docs/pull/157.patch,2024-03-06T21:17:03Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5666] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Fix body request to include the right schema +* Fix 200 response to show the return response + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Fixed incorrect schemas for /pricelists/records PUT Create batch of price lists records endpoint. Previous schema returned a 400 response. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5666]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5666?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/157/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/157/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/156,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/156/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/156/comments,https://api.github.com/repos/bigcommerce/docs/issues/156/events,https://github.com/bigcommerce/docs/pull/156,2170196616,PR_kwDOI7BBSM5oxQn2,156,"DEVDOCS-5153: [update] Store Content, blog posts default to draft status",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-03-05T21:46:18Z,2024-03-06T00:57:17Z,2024-03-06T00:57:17Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/156,https://github.com/bigcommerce/docs/pull/156,https://github.com/bigcommerce/docs/pull/156.diff,https://github.com/bigcommerce/docs/pull/156.patch,2024-03-06T00:57:17Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5153] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add note to indicate that blog posts default to draft status on create and update. +* clean up store_content.v2.yml + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've updated the blog feature specification to note that the `is_published` field defaults to false on both POST and PUT. Pass `true` to avoid reverting the post to draft status. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5153]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5153?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/156/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/156/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/155,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/155/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/155/comments,https://api.github.com/repos/bigcommerce/docs/issues/155/events,https://github.com/bigcommerce/docs/pull/155,2170159071,PR_kwDOI7BBSM5oxIYk,155,"DEVDOCS-5794 [update]: Catalog API, add terms of service and policy",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-03-05T21:17:47Z,2024-03-12T15:19:50Z,2024-03-12T15:19:49Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/155,https://github.com/bigcommerce/docs/pull/155,https://github.com/bigcommerce/docs/pull/155.diff,https://github.com/bigcommerce/docs/pull/155.patch,2024-03-12T15:19:49Z,"# [DEVDOCS-5794] + +## What changed? +Update the following endpoints to include terms of service and privacy policy: +- [Create a Product](https://developer.bigcommerce.com/docs/rest-catalog/products#create-a-product) +- [Update Products Batch](https://developer.bigcommerce.com/docs/rest-catalog/products#update-products-batch) +- [Update a Product](https://developer.bigcommerce.com/docs/rest-catalog/products#update-a-product) +- [Create a Product Video](https://developer.bigcommerce.com/docs/rest-catalog/products/videos#create-a-product-video) +- [Update a Product Video](https://developer.bigcommerce.com/docs/rest-catalog/products/videos#update-a-product-video) + + +[DEVDOCS-5794]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5794?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/155/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/155/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/154,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/154/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/154/comments,https://api.github.com/repos/bigcommerce/docs/issues/154/events,https://github.com/bigcommerce/docs/pull/154,2170088414,PR_kwDOI7BBSM5ow5B4,154,"DEVDOCS-4173: [update] Channels, add listing_id === group_id",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-03-05T20:25:40Z,2024-03-05T20:30:52Z,2024-03-05T20:30:52Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/154,https://github.com/bigcommerce/docs/pull/154,https://github.com/bigcommerce/docs/pull/154.diff,https://github.com/bigcommerce/docs/pull/154.patch,2024-03-05T20:30:51Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4173] with [DEVDOCS-4105] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* In the Channel Listings feature, add the caveat that listing_id === group_id to the description of listing_id +* convert comma-separated lists to unexploded form-style arrays + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've clarified that some 422 errors in calls to the Channel Listings feature of the Management API include a group_id, which is the same as the listing_id of the request. +* We're continuing to convert query params that provide comma-separated lists to unexploded form-style arrays, which will make generated API clients more efficient. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-4173]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4173?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[DEVDOCS-4105]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4105?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/154/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/154/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/153,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/153/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/153/comments,https://api.github.com/repos/bigcommerce/docs/issues/153/events,https://github.com/bigcommerce/docs/pull/153,2169764502,PR_kwDOI7BBSM5ovxmL,153,"DEVDOCS-5723 [update]: Themes API, add channel_id as a query parameter",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-03-05T17:21:19Z,2024-03-11T17:30:48Z,2024-03-11T17:30:47Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/153,https://github.com/bigcommerce/docs/pull/153,https://github.com/bigcommerce/docs/pull/153.diff,https://github.com/bigcommerce/docs/pull/153.patch,2024-03-11T17:30:47Z,"# [DEVDOCS-5723] + + +## What changed? +- Add `channel_id` as a query parameter for Activate a Theme endpoint +- Remove required flag from `which` field + + +[DEVDOCS-5723]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5723?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/153/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/153/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/152,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/152/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/152/comments,https://api.github.com/repos/bigcommerce/docs/issues/152/events,https://github.com/bigcommerce/docs/pull/152,2169601664,PR_kwDOI7BBSM5ovNyP,152,"DEVDOCS-5818 [update]: Catalog API, remove required flag from URL",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-03-05T16:02:52Z,2024-03-05T20:06:16Z,2024-03-05T20:06:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/152,https://github.com/bigcommerce/docs/pull/152,https://github.com/bigcommerce/docs/pull/152.diff,https://github.com/bigcommerce/docs/pull/152.patch,2024-03-05T20:06:15Z,"# [DEVDOCS-5818] + +- Category Trees: remove required flag from URL + + +[DEVDOCS-5818]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5818?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/152/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/152/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/151,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/151/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/151/comments,https://api.github.com/repos/bigcommerce/docs/issues/151/events,https://github.com/bigcommerce/docs/pull/151,2169596807,PR_kwDOI7BBSM5ovMur,151,"[DEVDOCS-5777]: [revise] Storefront, Checkout SDK, Fix links that route to wrong docs",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-05T16:00:29Z,2024-03-05T20:48:37Z,2024-03-05T20:48:37Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/151,https://github.com/bigcommerce/docs/pull/151,https://github.com/bigcommerce/docs/pull/151.diff,https://github.com/bigcommerce/docs/pull/151.patch,2024-03-05T20:48:37Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5777] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Fix 1st link to ""Getting Started with Checkout SDK"" +* Fix 2nd link to ""Getting Started with Checkout SDK"" + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No notes for this one. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5777]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5777?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/151/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/151/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/150,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/150/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/150/comments,https://api.github.com/repos/bigcommerce/docs/issues/150/events,https://github.com/bigcommerce/docs/issues/150,2167260058,I_kwDOI7BBSM6BLcOa,150,Feedback for “Blog Posts”,edpol,10979469,MDQ6VXNlcjEwOTc5NDY5,https://avatars.githubusercontent.com/u/10979469?v=4,,https://api.github.com/users/edpol,https://github.com/edpol,https://api.github.com/users/edpol/followers,https://api.github.com/users/edpol/following{/other_user},https://api.github.com/users/edpol/gists{/gist_id},https://api.github.com/users/edpol/starred{/owner}{/repo},https://api.github.com/users/edpol/subscriptions,https://api.github.com/users/edpol/orgs,https://api.github.com/users/edpol/repos,https://api.github.com/users/edpol/events{/privacy},https://api.github.com/users/edpol/received_events,User,false,[],closed,false,,[],,2,2024-03-04T16:32:32Z,2024-03-05T17:47:58Z,2024-03-05T17:47:57Z,NONE,,,,,,,,Was able to download the first 50 of 113 blogs. Need to have one example that shows how to get the rest. ,https://api.github.com/repos/bigcommerce/docs/issues/150/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/150/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/149,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/149/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/149/comments,https://api.github.com/repos/bigcommerce/docs/issues/149/events,https://github.com/bigcommerce/docs/pull/149,2165850597,PR_kwDOI7BBSM5oiWT2,149,"doc(orders): ORDERS-6248 avoid duplicated fields with ""allOf"" openapi schemas in Orders v2 API",donald-nguyen-bc,63274600,MDQ6VXNlcjYzMjc0NjAw,https://avatars.githubusercontent.com/u/63274600?v=4,,https://api.github.com/users/donald-nguyen-bc,https://github.com/donald-nguyen-bc,https://api.github.com/users/donald-nguyen-bc/followers,https://api.github.com/users/donald-nguyen-bc/following{/other_user},https://api.github.com/users/donald-nguyen-bc/gists{/gist_id},https://api.github.com/users/donald-nguyen-bc/starred{/owner}{/repo},https://api.github.com/users/donald-nguyen-bc/subscriptions,https://api.github.com/users/donald-nguyen-bc/orgs,https://api.github.com/users/donald-nguyen-bc/repos,https://api.github.com/users/donald-nguyen-bc/events{/privacy},https://api.github.com/users/donald-nguyen-bc/received_events,User,false,[],closed,false,,[],,0,2024-03-04T03:34:29Z,2024-03-05T21:52:38Z,2024-03-05T21:52:37Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/149,https://github.com/bigcommerce/docs/pull/149,https://github.com/bigcommerce/docs/pull/149.diff,https://github.com/bigcommerce/docs/pull/149.patch,2024-03-05T21:52:37Z,"# [ORDERS-6248] + +Context: https://bigcommerce.slack.com/archives/C96P5T3J4/p1709383968237619 + +we have order_Resp https://github.com/bigcommerce/docs/blob/main/reference/orders.v2.oas2.yml#L2690 +``` + order_Resp: + title: order_Resp + description: Order object returned in responses. + allOf: + - $ref: '#/components/schemas/order_RespOnly' + - $ref: '#/components/schemas/order_Shared' +``` + +The below fields exists in both the `order_RespOnly` and `order_Shared`, so it leads to duplication problem in our [BC public API doc](https://developer.bigcommerce.com/docs/rest-management/orders#create-an-order) and error in the API client generator: + +- `billing_address`: + +![image](https://github.com/bigcommerce/docs/assets/63274600/0f02534f-b7a1-46cc-a62f-534b18a6809a) + +![image](https://github.com/bigcommerce/docs/assets/63274600/a3c0b139-4331-4e35-a06d-2151f1713fe7) + +- `default_currency_code`: + +<img width=""344"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/63274600/f2b2fbae-d30a-4159-917a-979e0d5cff4d""> + +<img width=""364"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/63274600/7f787ac9-88db-4e7d-a315-933a2e018336""> + +## What changed? +Remove the duplications of those fields in the `order_RespOnly` and `order_Shared` + +## Release notes draft +- Fix a bug that show duplication of `default_currency_code` and `billing_address` fields in Orders V2 API response body + +ping @bigcommerce/team-orders @bc-traciporter + + +[ORDERS-6248]: https://bigcommercecloud.atlassian.net/browse/ORDERS-6248?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/149/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/149/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/148,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/148/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/148/comments,https://api.github.com/repos/bigcommerce/docs/issues/148/events,https://github.com/bigcommerce/docs/pull/148,2164122000,PR_kwDOI7BBSM5ocrrs,148,DEVDOCS-5401: [update] add price list webhooks,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-03-01T20:26:24Z,2024-03-12T18:38:51Z,2024-03-12T16:33:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/148,https://github.com/bigcommerce/docs/pull/148,https://github.com/bigcommerce/docs/pull/148.diff,https://github.com/bigcommerce/docs/pull/148.patch,2024-03-12T16:33:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5401] + + +## What changed? + +* added price list webhooks + +## Release notes draft + +* The newly released price list and price list records webhooks are now available. Now, you can add events and use batch price lists and price list record events where appropriate. + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5401]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5401?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/148/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/148/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/147,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/147/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/147/comments,https://api.github.com/repos/bigcommerce/docs/issues/147/events,https://github.com/bigcommerce/docs/pull/147,2163946736,PR_kwDOI7BBSM5ocFCz,147,"[DEVDOCS-5815]: [revise] Publishing an App, Fill in Details, minor correction",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-01T18:18:33Z,2024-03-01T18:30:20Z,2024-03-01T18:30:19Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/147,https://github.com/bigcommerce/docs/pull/147,https://github.com/bigcommerce/docs/pull/147.diff,https://github.com/bigcommerce/docs/pull/147.patch,2024-03-01T18:30:19Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5815] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Swap from ""dark background"" to ""color background"" for Alternate Logo details + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Minor correction + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5815]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5815?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/147/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/147/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/146,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/146/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/146/comments,https://api.github.com/repos/bigcommerce/docs/issues/146/events,https://github.com/bigcommerce/docs/pull/146,2163877672,PR_kwDOI7BBSM5ob1tc,146,"#144 Add 'read-only' marker, Remove enum of accepted values for tax_p…",AndrewBarber,135927,MDQ6VXNlcjEzNTkyNw==,https://avatars.githubusercontent.com/u/135927?v=4,,https://api.github.com/users/AndrewBarber,https://github.com/AndrewBarber,https://api.github.com/users/AndrewBarber/followers,https://api.github.com/users/AndrewBarber/following{/other_user},https://api.github.com/users/AndrewBarber/gists{/gist_id},https://api.github.com/users/AndrewBarber/starred{/owner}{/repo},https://api.github.com/users/AndrewBarber/subscriptions,https://api.github.com/users/AndrewBarber/orgs,https://api.github.com/users/AndrewBarber/repos,https://api.github.com/users/AndrewBarber/events{/privacy},https://api.github.com/users/AndrewBarber/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-01T17:36:53Z,2024-03-01T17:43:39Z,2024-03-01T17:43:39Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/146,https://github.com/bigcommerce/docs/pull/146,https://github.com/bigcommerce/docs/pull/146.diff,https://github.com/bigcommerce/docs/pull/146.patch,2024-03-01T17:43:39Z,"…rovider_id on OrdersV2 create/update + +<!-- Ticket number or summary of work --> +#144 + + +## What changed? +* Add 'read-only' marker to tax_provider_id on OrdersV2 create/update +* Remove enum of accepted values for tax_provider_id on OrdersV2 create/update + +## Release notes draft +* Ensures developers understand that any value will be ignored when using the endpoint. + +## Anything else? +N/A + +ping @bc-traciporter +",https://api.github.com/repos/bigcommerce/docs/issues/146/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/146/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/145,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/145/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/145/comments,https://api.github.com/repos/bigcommerce/docs/issues/145/events,https://github.com/bigcommerce/docs/pull/145,2163876531,PR_kwDOI7BBSM5ob1dH,145,"[DEVDOCS-5814]: [revision] CustomersV3, Make GET /{customerId}/metafields Response appear",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-03-01T17:36:16Z,2024-03-01T18:31:56Z,2024-03-01T18:31:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/145,https://github.com/bigcommerce/docs/pull/145,https://github.com/bigcommerce/docs/pull/145.diff,https://github.com/bigcommerce/docs/pull/145.patch,2024-03-01T18:31:56Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5814] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* [Subtask] Correct Metafield Response so that it appears + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Not necessary here. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5814]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5814?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/145/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/145/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/144,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/144/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/144/comments,https://api.github.com/repos/bigcommerce/docs/issues/144/events,https://github.com/bigcommerce/docs/issues/144,2163868100,I_kwDOI7BBSM6A-gHE,144,Orders V2 Create/Update does not accept values for tax_provider_id,AndrewBarber,135927,MDQ6VXNlcjEzNTkyNw==,https://avatars.githubusercontent.com/u/135927?v=4,,https://api.github.com/users/AndrewBarber,https://github.com/AndrewBarber,https://api.github.com/users/AndrewBarber/followers,https://api.github.com/users/AndrewBarber/following{/other_user},https://api.github.com/users/AndrewBarber/gists{/gist_id},https://api.github.com/users/AndrewBarber/starred{/owner}{/repo},https://api.github.com/users/AndrewBarber/subscriptions,https://api.github.com/users/AndrewBarber/orgs,https://api.github.com/users/AndrewBarber/repos,https://api.github.com/users/AndrewBarber/events{/privacy},https://api.github.com/users/AndrewBarber/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,4,2024-03-01T17:31:15Z,2024-03-01T17:50:59Z,2024-03-01T17:50:45Z,CONTRIBUTOR,,,,,,,,"As highlighted on [BigCommerceDevs Slack](https://bigcommerce-devs.slack.com/archives/C012R9319AT/p1709311427053969), and confirmed by @bc-hnbarr on [forum here](https://support.bigcommerce.com/s/question/0D54O00007FNy8uSAD/tax-provider-id-via-order-api-post?language=en_US), OrdersV2 Create/Update does not accept a value for `tax_provider_id`. + +The value should be shown as 'Read Only', and the enum reference removed to show that the value is not adhered to. + +(Although - strangely, supplying this does not cause the request to error, it is simply ignored.) ",https://api.github.com/repos/bigcommerce/docs/issues/144/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/144/timeline,,completed,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/143,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/143/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/143/comments,https://api.github.com/repos/bigcommerce/docs/issues/143/events,https://github.com/bigcommerce/docs/pull/143,2163795972,PR_kwDOI7BBSM5objpo,143,TEST,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-03-01T16:50:22Z,2024-03-14T17:31:09Z,2024-03-14T17:31:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/143,https://github.com/bigcommerce/docs/pull/143,https://github.com/bigcommerce/docs/pull/143.diff,https://github.com/bigcommerce/docs/pull/143.patch,,,https://api.github.com/repos/bigcommerce/docs/issues/143/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/143/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/142,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/142/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/142/comments,https://api.github.com/repos/bigcommerce/docs/issues/142/events,https://github.com/bigcommerce/docs/pull/142,2161948430,PR_kwDOI7BBSM5oVNOZ,142,"DEVDOCS-5810 [update]: Tax Provider API, update response body for adjust operation",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,1,2024-02-29T19:23:14Z,2024-03-11T17:25:05Z,2024-03-11T17:25:04Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/142,https://github.com/bigcommerce/docs/pull/142,https://github.com/bigcommerce/docs/pull/142.diff,https://github.com/bigcommerce/docs/pull/142.patch,2024-03-11T17:25:04Z,"# [DEVDOCS-5810] + + +## What changed? +* Update response body schema for adjust operation +* Remove incorrect response example for adjust operation + + +[DEVDOCS-5810]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5810?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/142/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/142/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/141,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/141/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/141/comments,https://api.github.com/repos/bigcommerce/docs/issues/141/events,https://github.com/bigcommerce/docs/pull/141,2161916944,PR_kwDOI7BBSM5oVGRq,141,"DEVDOCS-5770 [update]: Catalog API, update brand metafields",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-02-29T19:02:05Z,2024-03-04T19:30:04Z,2024-03-04T19:30:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/141,https://github.com/bigcommerce/docs/pull/141,https://github.com/bigcommerce/docs/pull/141.diff,https://github.com/bigcommerce/docs/pull/141.patch,2024-03-04T19:30:03Z,"# [DEVDOCS-5770] + + +## What changed? +* Remove parameters +* Update request body + +[DEVDOCS-5770]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5770?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/141/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/141/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/140,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/140/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/140/comments,https://api.github.com/repos/bigcommerce/docs/issues/140/events,https://github.com/bigcommerce/docs/pull/140,2160498684,PR_kwDOI7BBSM5oQO9T,140,"doc(orders): ORDERS-6095 correct the type for ""external_order_id"" query parameter in GET /v2/orders",donald-nguyen-bc,63274600,MDQ6VXNlcjYzMjc0NjAw,https://avatars.githubusercontent.com/u/63274600?v=4,,https://api.github.com/users/donald-nguyen-bc,https://github.com/donald-nguyen-bc,https://api.github.com/users/donald-nguyen-bc/followers,https://api.github.com/users/donald-nguyen-bc/following{/other_user},https://api.github.com/users/donald-nguyen-bc/gists{/gist_id},https://api.github.com/users/donald-nguyen-bc/starred{/owner}{/repo},https://api.github.com/users/donald-nguyen-bc/subscriptions,https://api.github.com/users/donald-nguyen-bc/orgs,https://api.github.com/users/donald-nguyen-bc/repos,https://api.github.com/users/donald-nguyen-bc/events{/privacy},https://api.github.com/users/donald-nguyen-bc/received_events,User,false,[],closed,false,,[],,0,2024-02-29T06:30:59Z,2024-02-29T22:37:50Z,2024-02-29T22:37:49Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/140,https://github.com/bigcommerce/docs/pull/140,https://github.com/bigcommerce/docs/pull/140.diff,https://github.com/bigcommerce/docs/pull/140.patch,2024-02-29T22:37:49Z,"# [ORDERS-6095] + +## What changed? +- Correct the type for ""external_order_id"" query parameter in GET /v2/orders + +<img width=""640"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/63274600/079ae493-3056-43f8-9ab1-20702fc2a096""> + + +ping @bigcommerce/team-orders @bc-traciporter + + +[ORDERS-6095]: https://bigcommercecloud.atlassian.net/browse/ORDERS-6095?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/140/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/140/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/139,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/139/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/139/comments,https://api.github.com/repos/bigcommerce/docs/issues/139/events,https://github.com/bigcommerce/docs/pull/139,2159960904,PR_kwDOI7BBSM5oObaB,139,Spectral linter test,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-02-28T22:14:55Z,2024-02-28T22:23:13Z,2024-02-28T22:23:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/139,https://github.com/bigcommerce/docs/pull/139,https://github.com/bigcommerce/docs/pull/139.diff,https://github.com/bigcommerce/docs/pull/139.patch,,Spectral linter test,https://api.github.com/repos/bigcommerce/docs/issues/139/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/139/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/138,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/138/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/138/comments,https://api.github.com/repos/bigcommerce/docs/issues/138/events,https://github.com/bigcommerce/docs/pull/138,2159869141,PR_kwDOI7BBSM5oOHQu,138,DEVDOCS-5690: [Update] update add consignment to checkout endpoint,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-02-28T21:07:15Z,2024-02-29T19:13:01Z,2024-02-29T19:13:00Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/138,https://github.com/bigcommerce/docs/pull/138,https://github.com/bigcommerce/docs/pull/138.diff,https://github.com/bigcommerce/docs/pull/138.patch,2024-02-29T19:13:00Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5690] + + +## What changed? +Corrected the shipping consignment example + +## Release notes draft + +Bug Fix +Corrected the shipping consignment example +https://developer.bigcommerce.com/docs/rest-management/checkouts/checkout-consignments#add-consignment-to-checkout + + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5690]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5690?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/138/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/138/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/137,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/137/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/137/comments,https://api.github.com/repos/bigcommerce/docs/issues/137/events,https://github.com/bigcommerce/docs/pull/137,2159816934,PR_kwDOI7BBSM5oN7yC,137,DEVDOCS-5128: [update] update discount_amount definition,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-28T20:31:13Z,2024-02-29T18:48:59Z,2024-02-29T18:48:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/137,https://github.com/bigcommerce/docs/pull/137,https://github.com/bigcommerce/docs/pull/137.diff,https://github.com/bigcommerce/docs/pull/137.patch,2024-02-29T18:48:58Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5128] + + +## What changed? +Updated the discount_amount + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: + +Bug Fix +Updated the discount amount definition +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5128]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5128?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/137/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/137/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/136,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/136/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/136/comments,https://api.github.com/repos/bigcommerce/docs/issues/136/events,https://github.com/bigcommerce/docs/pull/136,2159369993,PR_kwDOI7BBSM5oMZUf,136,SELFDEV-478 Update Spectral Action to include ReviewDog,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-02-28T16:35:31Z,2024-02-28T17:46:21Z,2024-02-28T17:46:20Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/136,https://github.com/bigcommerce/docs/pull/136,https://github.com/bigcommerce/docs/pull/136.diff,https://github.com/bigcommerce/docs/pull/136.patch,2024-02-28T17:46:20Z,"- [SELFDEV-478] + +## What changed? +* Spectral linter will now work +* Violations will now report as comments on the PR + +<img width=""943"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/29524703/2b68013f-6744-449c-9eaa-508d0e886dbb""> + + + +[SELFDEV-478]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-478?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/136/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/136/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/135,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/135/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/135/comments,https://api.github.com/repos/bigcommerce/docs/issues/135/events,https://github.com/bigcommerce/docs/pull/135,2159292594,PR_kwDOI7BBSM5oMIqI,135,Test Spectral Workflow with violation,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-02-28T15:58:07Z,2024-02-28T17:47:45Z,2024-02-28T17:47:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/135,https://github.com/bigcommerce/docs/pull/135,https://github.com/bigcommerce/docs/pull/135.diff,https://github.com/bigcommerce/docs/pull/135.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/135/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/135/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/134,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/134/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/134/comments,https://api.github.com/repos/bigcommerce/docs/issues/134/events,https://github.com/bigcommerce/docs/pull/134,2159265886,PR_kwDOI7BBSM5oMC1K,134,Intentionally violate Spectral for test,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-02-28T15:44:52Z,2024-02-28T17:47:49Z,2024-02-28T15:56:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/134,https://github.com/bigcommerce/docs/pull/134,https://github.com/bigcommerce/docs/pull/134.diff,https://github.com/bigcommerce/docs/pull/134.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/134/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/134/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/133,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/133/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/133/comments,https://api.github.com/repos/bigcommerce/docs/issues/133/events,https://github.com/bigcommerce/docs/pull/133,2159201175,PR_kwDOI7BBSM5oL0qJ,133,Test Spectral Workflow,markcmurphy,29524703,MDQ6VXNlcjI5NTI0NzAz,https://avatars.githubusercontent.com/u/29524703?v=4,,https://api.github.com/users/markcmurphy,https://github.com/markcmurphy,https://api.github.com/users/markcmurphy/followers,https://api.github.com/users/markcmurphy/following{/other_user},https://api.github.com/users/markcmurphy/gists{/gist_id},https://api.github.com/users/markcmurphy/starred{/owner}{/repo},https://api.github.com/users/markcmurphy/subscriptions,https://api.github.com/users/markcmurphy/orgs,https://api.github.com/users/markcmurphy/repos,https://api.github.com/users/markcmurphy/events{/privacy},https://api.github.com/users/markcmurphy/received_events,User,false,[],closed,false,,[],,0,2024-02-28T15:13:18Z,2024-02-28T17:47:49Z,2024-02-28T15:44:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/133,https://github.com/bigcommerce/docs/pull/133,https://github.com/bigcommerce/docs/pull/133.diff,https://github.com/bigcommerce/docs/pull/133.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/133/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/133/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/132,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/132/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/132/comments,https://api.github.com/repos/bigcommerce/docs/issues/132/events,https://github.com/bigcommerce/docs/pull/132,2158946024,PR_kwDOI7BBSM5oK8a8,132,"CATALOG-8923: [update] Catalog, fix description in Create a variant using the product endpoint chapter",olysenko,8058039,MDQ6VXNlcjgwNTgwMzk=,https://avatars.githubusercontent.com/u/8058039?v=4,,https://api.github.com/users/olysenko,https://github.com/olysenko,https://api.github.com/users/olysenko/followers,https://api.github.com/users/olysenko/following{/other_user},https://api.github.com/users/olysenko/gists{/gist_id},https://api.github.com/users/olysenko/starred{/owner}{/repo},https://api.github.com/users/olysenko/subscriptions,https://api.github.com/users/olysenko/orgs,https://api.github.com/users/olysenko/repos,https://api.github.com/users/olysenko/events{/privacy},https://api.github.com/users/olysenko/received_events,User,false,[],closed,false,,[],,0,2024-02-28T13:13:58Z,2024-02-28T15:29:04Z,2024-02-28T15:29:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/132,https://github.com/bigcommerce/docs/pull/132,https://github.com/bigcommerce/docs/pull/132.diff,https://github.com/bigcommerce/docs/pull/132.patch,2024-02-28T15:29:03Z," + +<!-- Ticket number or summary of work --> +# CATALOG-8923: [update] Catalog, fix description in Create a variant using the product endpoint chapter + + +## What changed? +* Fixed description about option type that is set by default from radio buttons to rectangles in Create a variant using the product endpoint operation + +## Release notes draft +* Fixed description about option type that is set by default from radio buttons to rectangles in Create a variant using the product endpoint operation + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +@bc-traciporter +",https://api.github.com/repos/bigcommerce/docs/issues/132/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/132/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/131,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/131/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/131/comments,https://api.github.com/repos/bigcommerce/docs/issues/131/events,https://github.com/bigcommerce/docs/pull/131,2157301853,PR_kwDOI7BBSM5oFXNi,131,DEVDOCS-5464: [update] Update front-matter support information,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-27T18:06:30Z,2024-03-04T17:46:39Z,2024-03-04T17:46:38Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/131,https://github.com/bigcommerce/docs/pull/131,https://github.com/bigcommerce/docs/pull/131.diff,https://github.com/bigcommerce/docs/pull/131.patch,2024-03-04T17:46:38Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5464] + + +## What changed? +Update docs on usability of YAML front matter with custom templates +* + +## Release notes draft + +Removed the contradictory information regarding YAML front matter in the templates/pages subdirectory. +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5464]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5464?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/131/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/131/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/130,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/130/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/130/comments,https://api.github.com/repos/bigcommerce/docs/issues/130/events,https://github.com/bigcommerce/docs/pull/130,2155607359,PR_kwDOI7BBSM5n_gIz,130,"DEVDOCS-5657 [update]: Tax Provider API, update development flow ",theromulans,10804073,MDQ6VXNlcjEwODA0MDcz,https://avatars.githubusercontent.com/u/10804073?v=4,,https://api.github.com/users/theromulans,https://github.com/theromulans,https://api.github.com/users/theromulans/followers,https://api.github.com/users/theromulans/following{/other_user},https://api.github.com/users/theromulans/gists{/gist_id},https://api.github.com/users/theromulans/starred{/owner}{/repo},https://api.github.com/users/theromulans/subscriptions,https://api.github.com/users/theromulans/orgs,https://api.github.com/users/theromulans/repos,https://api.github.com/users/theromulans/events{/privacy},https://api.github.com/users/theromulans/received_events,User,false,[],closed,false,,[],,11,2024-02-27T04:06:46Z,2024-04-02T15:20:43Z,2024-04-01T22:05:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/130,https://github.com/bigcommerce/docs/pull/130,https://github.com/bigcommerce/docs/pull/130.diff,https://github.com/bigcommerce/docs/pull/130.patch,2024-04-01T22:05:09Z,"# [TAX-1968] + +## What changed? +* Numerous simplifications to our tax provider development flow. +* Most importantly, this update includes changes to how we enable tax providers (the enable button is going away, replaced by the provider connection target panel in provider settings). +* See inline comments for more detail. + +[TAX-1968]: https://bigcommercecloud.atlassian.net/browse/TAX-1968?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/130/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/130/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/129,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/129/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/129/comments,https://api.github.com/repos/bigcommerce/docs/issues/129/events,https://github.com/bigcommerce/docs/pull/129,2155069497,PR_kwDOI7BBSM5n9qUi,129,DEVDOCS-5266: [update] add BlueSnap Direct to payment gateways,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-26T20:32:36Z,2024-02-27T21:07:28Z,2024-02-27T21:07:28Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/129,https://github.com/bigcommerce/docs/pull/129,https://github.com/bigcommerce/docs/pull/129.diff,https://github.com/bigcommerce/docs/pull/129.patch,2024-02-27T21:07:28Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5266] + + +## What changed? +Add BlueSnap Direct Payment Gateway + + +## Release notes draft +The newly-released BlueSnap Direct payment gateway is available for raw card and stored instrument data. See the list of [compatible payment gateways]. +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? + +OLD PR: https://github.com/bigcommerce/dev-docs/pull/1918 + +OLD DEVDOCS ticket: [DEVDOCS-4905](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4905) +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5266]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5266?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +[DEVDOCS-4905]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4905?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/129/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/129/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/128,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/128/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/128/comments,https://api.github.com/repos/bigcommerce/docs/issues/128/events,https://github.com/bigcommerce/docs/pull/128,2154655917,PR_kwDOI7BBSM5n8O6C,128,DEVDOCS-5559:[update] added notes about filters,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-26T16:57:19Z,2024-02-28T15:10:31Z,2024-02-27T21:08:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/128,https://github.com/bigcommerce/docs/pull/128,https://github.com/bigcommerce/docs/pull/128.diff,https://github.com/bigcommerce/docs/pull/128.patch,2024-02-27T21:08:06Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5559] + + +## What changed? +Added recommendation for using the query parameters + +## Release notes draft +Added recommendations for how to do cursor based pagination when iterating over a large amount of coupons. +https://developer.bigcommerce.com/docs/rest-content/marketing/coupons + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5559]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5559?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/128/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/128/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/127,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/127/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/127/comments,https://api.github.com/repos/bigcommerce/docs/issues/127/events,https://github.com/bigcommerce/docs/pull/127,2153971391,PR_kwDOI7BBSM5n54_6,127,Filter Products by MPN #126: Added documentation for filtering produc…,AndrewBarber,135927,MDQ6VXNlcjEzNTkyNw==,https://avatars.githubusercontent.com/u/135927?v=4,,https://api.github.com/users/AndrewBarber,https://github.com/AndrewBarber,https://api.github.com/users/AndrewBarber/followers,https://api.github.com/users/AndrewBarber/following{/other_user},https://api.github.com/users/AndrewBarber/gists{/gist_id},https://api.github.com/users/AndrewBarber/starred{/owner}{/repo},https://api.github.com/users/AndrewBarber/subscriptions,https://api.github.com/users/AndrewBarber/orgs,https://api.github.com/users/AndrewBarber/repos,https://api.github.com/users/AndrewBarber/events{/privacy},https://api.github.com/users/AndrewBarber/received_events,User,false,[],closed,false,,[],,0,2024-02-26T11:41:25Z,2024-02-28T19:24:43Z,2024-02-28T19:24:43Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/127,https://github.com/bigcommerce/docs/pull/127,https://github.com/bigcommerce/docs/pull/127.diff,https://github.com/bigcommerce/docs/pull/127.patch,2024-02-28T19:24:43Z,"Filter Products by MPN #126: Added documentation for filtering products by mpn + +<!-- Ticket number or summary of work --> +#126 + +## What changed? +* Add mpn filter attribute to catalog/products endpoint. + +## Release notes draft +* Added documentation to filter products by mpn filter. + +## Anything else? +Happy Monday! 🙌 + +ping @bc-traciporter +",https://api.github.com/repos/bigcommerce/docs/issues/127/reactions,1,0,0,0,1,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/127/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/126,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/126/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/126/comments,https://api.github.com/repos/bigcommerce/docs/issues/126/events,https://github.com/bigcommerce/docs/issues/126,2153958522,I_kwDOI7BBSM6AYsx6,126,Filter Products by MPN,AndrewBarber,135927,MDQ6VXNlcjEzNTkyNw==,https://avatars.githubusercontent.com/u/135927?v=4,,https://api.github.com/users/AndrewBarber,https://github.com/AndrewBarber,https://api.github.com/users/AndrewBarber/followers,https://api.github.com/users/AndrewBarber/following{/other_user},https://api.github.com/users/AndrewBarber/gists{/gist_id},https://api.github.com/users/AndrewBarber/starred{/owner}{/repo},https://api.github.com/users/AndrewBarber/subscriptions,https://api.github.com/users/AndrewBarber/orgs,https://api.github.com/users/AndrewBarber/repos,https://api.github.com/users/AndrewBarber/events{/privacy},https://api.github.com/users/AndrewBarber/received_events,User,false,[],closed,false,,[],,2,2024-02-26T11:34:49Z,2024-02-28T19:25:26Z,2024-02-28T19:25:26Z,CONTRIBUTOR,,,,,,,,"As discussed in this [slack thread](https://bigcommerce-devs.slack.com/archives/C012R9319AT/p1708642318060049?thread_ts=1708640166.618919&cid=C012R9319AT) (BigCommerce Devs slack), it is possible to filter `v3/catalog/products` endpoint via `?mpn={foo}`, however, it is undocumented currently. + +PR incoming... ",https://api.github.com/repos/bigcommerce/docs/issues/126/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/126/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/125,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/125/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/125/comments,https://api.github.com/repos/bigcommerce/docs/issues/125/events,https://github.com/bigcommerce/docs/pull/125,2151869869,PR_kwDOI7BBSM5nzDcI,125,DEVDOCS-5243:[update] update url_zoom definition,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-02-23T21:59:23Z,2024-02-28T14:58:08Z,2024-02-27T22:06:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/125,https://github.com/bigcommerce/docs/pull/125,https://github.com/bigcommerce/docs/pull/125.diff,https://github.com/bigcommerce/docs/pull/125.patch,2024-02-27T22:06:15Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5243] + + +## What changed? +Updated url_zoom definition + +## Release notes draft +bug fix +Updated the `url_zoom` description in the catalog product endpoints. +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5243]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5243?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/125/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/125/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/124,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/124/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/124/comments,https://api.github.com/repos/bigcommerce/docs/issues/124/events,https://github.com/bigcommerce/docs/pull/124,2151654670,PR_kwDOI7BBSM5nyT9a,124,DEVDOCS-4862: [update] add reference link and update conditional defi…,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-23T19:11:40Z,2024-02-27T21:08:48Z,2024-02-27T21:08:48Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/124,https://github.com/bigcommerce/docs/pull/124,https://github.com/bigcommerce/docs/pull/124.diff,https://github.com/bigcommerce/docs/pull/124.patch,2024-02-27T21:08:48Z,"…nition + +<!-- Ticket number or summary of work --> +# [DEVDOCS-4862] + + +## What changed? +Added reference link and update conditional definition + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-4862]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4862?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/124/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/124/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/123,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/123/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/123/comments,https://api.github.com/repos/bigcommerce/docs/issues/123/events,https://github.com/bigcommerce/docs/pull/123,2151425431,PR_kwDOI7BBSM5nxhnl,123,"DEVDOCS-5807 [new]: Settings API, remove Channel ID query parameter",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-02-23T16:33:04Z,2024-02-23T18:00:57Z,2024-02-23T18:00:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/123,https://github.com/bigcommerce/docs/pull/123,https://github.com/bigcommerce/docs/pull/123.diff,https://github.com/bigcommerce/docs/pull/123.patch,2024-02-23T18:00:56Z,"# [DEVDOCS-5807] + + +## What changed? +- Remove Channel ID query parameter from locale endpoints + + +No changelog entry + + +[DEVDOCS-5807]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5807?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/123/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/123/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/122,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/122/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/122/comments,https://api.github.com/repos/bigcommerce/docs/issues/122/events,https://github.com/bigcommerce/docs/pull/122,2150063127,PR_kwDOI7BBSM5ns1_7,122,"[DEVDOCS:5805] - [revise] Apps and Integrations, change statements around beta testing before submitting an app",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-22T22:40:35Z,2024-02-22T22:42:18Z,2024-02-22T22:42:18Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/122,https://github.com/bigcommerce/docs/pull/122,https://github.com/bigcommerce/docs/pull/122.diff,https://github.com/bigcommerce/docs/pull/122.patch,2024-02-22T22:42:18Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5805] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Change statements from 'beta testing before testing' to 'testing before submitting' since beta testing doesn't apply to draft apps + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Statement Correction: Apps > Types of Apps >#visibility clears up confusion around app testing. Beta testing is not applicable for draft apps. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5805]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5805?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/122/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/122/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/121,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/121/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/121/comments,https://api.github.com/repos/bigcommerce/docs/issues/121/events,https://github.com/bigcommerce/docs/pull/121,2149766278,PR_kwDOI7BBSM5nr1Cq,121,"DEVDOCS-5769 [new]: BODL, add consent events",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-02-22T19:12:59Z,2024-02-28T20:05:56Z,2024-02-28T20:05:56Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/121,https://github.com/bigcommerce/docs/pull/121,https://github.com/bigcommerce/docs/pull/121.diff,https://github.com/bigcommerce/docs/pull/121.patch,2024-02-28T20:05:56Z,"# [DEVDOCS-5769] + +## What changed? +- Add `bodl_v1_loaded_consent` & `bodl_v1_update_consent` events to BODL doc + +## Release notes draft + +The [Big Open Data Layer](https://developer.bigcommerce.com/docs/integrations/hosted-analytics) now includes two newly-released events, load and update shopper consent. Now, you’ll be able to send these events to 3rd-party analytics providers. + + +[DEVDOCS-5769]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5769?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/121/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/121/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/120,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/120/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/120/comments,https://api.github.com/repos/bigcommerce/docs/issues/120/events,https://github.com/bigcommerce/docs/pull/120,2145291179,PR_kwDOI7BBSM5ncb1e,120,DEVDOCS-5366: [update] resolve misleading variants array,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-20T21:13:04Z,2024-02-22T17:08:14Z,2024-02-22T17:08:14Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/120,https://github.com/bigcommerce/docs/pull/120,https://github.com/bigcommerce/docs/pull/120.diff,https://github.com/bigcommerce/docs/pull/120.patch,2024-02-22T17:08:14Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5366] + + +## What changed? +* Removed duplicated variants array in the Update a Product array +* Ensured variant ID is in the variants array in the Update Products (Batch) and Create a Product endpoints + +## Release notes draft + +Bug Fix - removed duplicate variants arrays and correct schemas + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5366]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5366?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/120/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/120/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/119,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/119/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/119/comments,https://api.github.com/repos/bigcommerce/docs/issues/119/events,https://github.com/bigcommerce/docs/pull/119,2145288128,PR_kwDOI7BBSM5ncbJq,119,[DEVDOCS-5799] Update from user to store owner in Handling Callbacks properties table,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-20T21:11:20Z,2024-02-20T21:12:59Z,2024-02-20T21:12:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/119,https://github.com/bigcommerce/docs/pull/119,https://github.com/bigcommerce/docs/pull/119.diff,https://github.com/bigcommerce/docs/pull/119.patch,2024-02-20T21:12:58Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5799] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Replaced description from user to store owner for the following properties: +* user.id +* user.email +* user.locale + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No update here, just a correction. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5799]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5799?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/119/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/119/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/118,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/118/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/118/comments,https://api.github.com/repos/bigcommerce/docs/issues/118/events,https://github.com/bigcommerce/docs/pull/118,2145102183,PR_kwDOI7BBSM5nbyk9,118,DEVDOCS-5798: [update] add create_redirect to custom_url,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-20T19:18:18Z,2024-02-22T17:06:37Z,2024-02-22T17:06:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/118,https://github.com/bigcommerce/docs/pull/118,https://github.com/bigcommerce/docs/pull/118.diff,https://github.com/bigcommerce/docs/pull/118.patch,2024-02-22T17:06:36Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5798] + + +## What changed? +Add `create_redirect` to custom_url + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5798]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5798?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/118/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/118/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/117,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/117/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/117/comments,https://api.github.com/repos/bigcommerce/docs/issues/117/events,https://github.com/bigcommerce/docs/pull/117,2144036479,PR_kwDOI7BBSM5nYH1h,117,doc(catalog): CATALOG-8071 Add date_last_imported to V3 API catalog/products,vil11,5585456,MDQ6VXNlcjU1ODU0NTY=,https://avatars.githubusercontent.com/u/5585456?v=4,,https://api.github.com/users/vil11,https://github.com/vil11,https://api.github.com/users/vil11/followers,https://api.github.com/users/vil11/following{/other_user},https://api.github.com/users/vil11/gists{/gist_id},https://api.github.com/users/vil11/starred{/owner}{/repo},https://api.github.com/users/vil11/subscriptions,https://api.github.com/users/vil11/orgs,https://api.github.com/users/vil11/repos,https://api.github.com/users/vil11/events{/privacy},https://api.github.com/users/vil11/received_events,User,false,[],closed,false,,[],,0,2024-02-20T10:22:27Z,2024-02-20T14:35:12Z,2024-02-20T14:35:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/117,https://github.com/bigcommerce/docs/pull/117,https://github.com/bigcommerce/docs/pull/117.diff,https://github.com/bigcommerce/docs/pull/117.patch,2024-02-20T14:35:11Z,"# [CATALOG-8071](https://bigcommercecloud.atlassian.net/browse/CATALOG-8071) + + +## What changed? +* “date_last_imported“ field is added to the Product model + + +## Release notes draft +“date_last_imported“ field is added to the Product model. The field format is _nullable datetime string_ (e.g.: ""2024-01-24T14:36:56+00:00”). The field is modifiable & filterable. + + + +---- + +ping @bigcommerce/catalog-dt-php + + +[CATALOG-8071]: https://bigcommercecloud.atlassian.net/browse/CATALOG-8071?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/117/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/117/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/116,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/116/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/116/comments,https://api.github.com/repos/bigcommerce/docs/issues/116/events,https://github.com/bigcommerce/docs/pull/116,2143189759,PR_kwDOI7BBSM5nVQhh,116,DEVDOCS-5347: [update] add note about entityId,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-19T21:44:38Z,2024-02-22T18:42:19Z,2024-02-22T18:42:19Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/116,https://github.com/bigcommerce/docs/pull/116,https://github.com/bigcommerce/docs/pull/116.diff,https://github.com/bigcommerce/docs/pull/116.patch,2024-02-22T18:42:19Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5347] + + +## What changed? +Added note about entityId + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5347]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5347?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/116/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/116/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/115,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/115/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/115/comments,https://api.github.com/repos/bigcommerce/docs/issues/115/events,https://github.com/bigcommerce/docs/pull/115,2143166349,PR_kwDOI7BBSM5nVLQT,115,DEVDOCS-5801: Fix wording for metafields endpoints,jordanarldt,19815878,MDQ6VXNlcjE5ODE1ODc4,https://avatars.githubusercontent.com/u/19815878?v=4,,https://api.github.com/users/jordanarldt,https://github.com/jordanarldt,https://api.github.com/users/jordanarldt/followers,https://api.github.com/users/jordanarldt/following{/other_user},https://api.github.com/users/jordanarldt/gists{/gist_id},https://api.github.com/users/jordanarldt/starred{/owner}{/repo},https://api.github.com/users/jordanarldt/subscriptions,https://api.github.com/users/jordanarldt/orgs,https://api.github.com/users/jordanarldt/repos,https://api.github.com/users/jordanarldt/events{/privacy},https://api.github.com/users/jordanarldt/received_events,User,false,[],closed,false,,[],,0,2024-02-19T21:28:09Z,2024-02-19T21:30:45Z,2024-02-19T21:30:44Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/115,https://github.com/bigcommerce/docs/pull/115,https://github.com/bigcommerce/docs/pull/115.diff,https://github.com/bigcommerce/docs/pull/115.patch,2024-02-19T21:30:44Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5801](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5801?atlOrigin=eyJpIjoiMGQ2ZGZhMjg5NDAxNDZiOGEwYmZhZDNhZTI4OWU0OTciLCJwIjoiamlyYS1zbGFjay1pbnQifQ) + + +## What changed? +* Rename `Get All Metafields` reference titles to be more relevant to the resource type being retrieved. + +## Release notes draft +* The metafield endpoints in the reference will be more relevant to the resource being fetched, and there won't be duplicate names across different schemas. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bigcommerce/dev-docs + + +[DEVDOCS-5801]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5801?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/115/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/115/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/114,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/114/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/114/comments,https://api.github.com/repos/bigcommerce/docs/issues/114/events,https://github.com/bigcommerce/docs/pull/114,2142701414,PR_kwDOI7BBSM5nTl_W,114,DEVDOCS-5771-Nataliaa-catalog-updates: [update] custom field updates,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-19T16:01:39Z,2024-02-21T15:50:51Z,2024-02-21T15:50:50Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/114,https://github.com/bigcommerce/docs/pull/114,https://github.com/bigcommerce/docs/pull/114.diff,https://github.com/bigcommerce/docs/pull/114.patch,2024-02-21T15:50:50Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5771] + + +## What changed? +Updated PUT Custom Fields endpoint + +## Release notes draft + +not needed +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5771]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5771?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/114/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/114/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/113,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/113/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/113/comments,https://api.github.com/repos/bigcommerce/docs/issues/113/events,https://github.com/bigcommerce/docs/pull/113,2139622697,PR_kwDOI7BBSM5nJGf4,113,"[DEVDOCS-5066]: [revise] OrdersV3, Revise Create a Refund Example schema, and body request to remove 'reason' from the items level",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-16T23:19:05Z,2024-02-16T23:21:55Z,2024-02-16T23:21:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/113,https://github.com/bigcommerce/docs/pull/113,https://github.com/bigcommerce/docs/pull/113.diff,https://github.com/bigcommerce/docs/pull/113.patch,2024-02-16T23:21:54Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5066] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Revise Create a Refund schema examples and response body and remove `reason` from the item levels in Orders V3 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Correct schema is now available for Create a Refund. Previous Request Body and Body Response examples displayed `reason` in both the order level and items level. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5066]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5066?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/113/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/113/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/112,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/112/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/112/comments,https://api.github.com/repos/bigcommerce/docs/issues/112/events,https://github.com/bigcommerce/docs/pull/112,2139273841,PR_kwDOI7BBSM5nH5GV,112,"[DEVDOCS-5795] - [new] Update Deprecations and Sunsets to include Customer V2, Delete All Customer Groups",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-16T19:19:59Z,2024-02-16T20:20:28Z,2024-02-16T20:20:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/112,https://github.com/bigcommerce/docs/pull/112,https://github.com/bigcommerce/docs/pull/112.diff,https://github.com/bigcommerce/docs/pull/112.patch,2024-02-16T20:20:27Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5795] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add Customer V2, Delete All Customer Groups endpoint to the deprecations and sunsets document + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No comms please. :) + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5795]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5795?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/112/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/112/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/111,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/111/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/111/comments,https://api.github.com/repos/bigcommerce/docs/issues/111/events,https://github.com/bigcommerce/docs/pull/111,2139221958,PR_kwDOI7BBSM5nHtX2,111,DEVDOCS-5771-custom-fields: [update] update POST and PUT endpoints,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-16T18:52:57Z,2024-02-19T15:37:51Z,2024-02-19T15:37:51Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/111,https://github.com/bigcommerce/docs/pull/111,https://github.com/bigcommerce/docs/pull/111.diff,https://github.com/bigcommerce/docs/pull/111.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5771] + + +## What changed? +Updated POST and PUT endpoints per the ticket + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5771]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5771?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/111/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/111/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/110,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/110/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/110/comments,https://api.github.com/repos/bigcommerce/docs/issues/110/events,https://github.com/bigcommerce/docs/pull/110,2139182241,PR_kwDOI7BBSM5nHkci,110,[DEVDOCS-5768]: [deprecate] CustomersV2: Delete All Customer Groups endpoint,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-16T18:31:08Z,2024-02-16T20:23:07Z,2024-02-16T20:23:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/110,https://github.com/bigcommerce/docs/pull/110,https://github.com/bigcommerce/docs/pull/110.diff,https://github.com/bigcommerce/docs/pull/110.patch,2024-02-16T20:23:06Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5768] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove the DELETE endpoint in the Customer Groups path + +## Release notes draft + +Release notes are not needed. See slack conversation for details. +https://bigcommerce.slack.com/archives/C039JSWHH50/p1708108312150699?thread_ts=1708108271.060429&cid=C039JSWHH50 + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5768]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5768?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/110/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/110/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/109,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/109/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/109/comments,https://api.github.com/repos/bigcommerce/docs/issues/109/events,https://github.com/bigcommerce/docs/pull/109,2138968407,PR_kwDOI7BBSM5nG0ed,109,"DEVDOCS-5793: Catalog API, update 207 response description",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-02-16T16:36:22Z,2024-02-16T17:23:44Z,2024-02-16T17:23:43Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/109,https://github.com/bigcommerce/docs/pull/109,https://github.com/bigcommerce/docs/pull/109.diff,https://github.com/bigcommerce/docs/pull/109.patch,2024-02-16T17:23:43Z,"# [DEVDOCS-5793] + +## What changed? +- Update 207 response description + + +[DEVDOCS-5793]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5793?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/109/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/109/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/108,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/108/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/108/comments,https://api.github.com/repos/bigcommerce/docs/issues/108/events,https://github.com/bigcommerce/docs/pull/108,2137621668,PR_kwDOI7BBSM5nCPYo,108,"DEVDOCS-5790: [new] Channels, add catalyst platform type",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-02-15T23:38:26Z,2024-02-22T17:42:10Z,2024-02-22T17:42:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/108,https://github.com/bigcommerce/docs/pull/108,https://github.com/bigcommerce/docs/pull/108.diff,https://github.com/bigcommerce/docs/pull/108.patch,2024-02-22T17:42:09Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5790] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update channels type and platform information + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational +language. Don't be too technical. Explain how the change will benefit +the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be +able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y +action]. +* [X feature] helps you to create [Y response] using the [Z query +parameter]. Now, you can deliver [ex, localized shopping experiences for +your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when +you click [Z option]. --> +* We've added a new `catalyst` [channel platform](/docs/rest-management/channels) specifically for Catalyst storefronts. Using this type will more seamlessly connect your Catalyst storefront to the store control panel. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-andreadao + + +[DEVDOCS-5790]: +https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5790?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ + +[DEVDOCS-5790]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5790?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[DEVDOCS-5790]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5790?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/108/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/108/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/107,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/107/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/107/comments,https://api.github.com/repos/bigcommerce/docs/issues/107/events,https://github.com/bigcommerce/docs/pull/107,2137343737,PR_kwDOI7BBSM5nBTJj,107,DEVDOCS-5592: [update] add query_params,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,4,2024-02-15T20:00:32Z,2024-02-22T20:02:51Z,2024-02-21T15:50:17Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/107,https://github.com/bigcommerce/docs/pull/107,https://github.com/bigcommerce/docs/pull/107.diff,https://github.com/bigcommerce/docs/pull/107.patch,2024-02-21T15:50:17Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5592] + + +## What changed? +Update the Redirect Url endpoint with info regarding Query Params + +## Release notes draft +We're happy to announce that when redirecting the shopper, you can add a set of `query_parameters` to the Create Cart Redirect URL. +<!-- +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5592]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5592?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/107/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/107/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/106,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/106/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/106/comments,https://api.github.com/repos/bigcommerce/docs/issues/106/events,https://github.com/bigcommerce/docs/pull/106,2137095748,PR_kwDOI7BBSM5nAdbM,106,DEVDOCS-5771: [repo] Add archive directory ,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-15T17:41:56Z,2024-02-15T17:43:40Z,2024-02-15T17:43:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/106,https://github.com/bigcommerce/docs/pull/106,https://github.com/bigcommerce/docs/pull/106.diff,https://github.com/bigcommerce/docs/pull/106.patch,2024-02-15T17:43:39Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5771] & [CATALOG-9219] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* create archive directory + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* not needed + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* Supports #97 + +ping @olysenko @bc-traciporter + + +[DEVDOCS-5771]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5771?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ +[CATALOG-9219]: https://bigcommercecloud.atlassian.net/browse/CATALOG-9219?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/106/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/106/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/105,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/105/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/105/comments,https://api.github.com/repos/bigcommerce/docs/issues/105/events,https://github.com/bigcommerce/docs/pull/105,2135395511,PR_kwDOI7BBSM5m6orJ,105,"DEVDOCS-4636: [remove] Global Refs, remove unused yml file",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-15T00:00:27Z,2024-02-15T18:26:38Z,2024-02-15T18:26:37Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/105,https://github.com/bigcommerce/docs/pull/105,https://github.com/bigcommerce/docs/pull/105.diff,https://github.com/bigcommerce/docs/pull/105.patch,2024-02-15T18:26:37Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4636] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* remove unused global refs file + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* none needed AFAIK + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-4636]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4636?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/105/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/105/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/104,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/104/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/104/comments,https://api.github.com/repos/bigcommerce/docs/issues/104/events,https://github.com/bigcommerce/docs/pull/104,2135222864,PR_kwDOI7BBSM5m6C6X,104,"DEVDOCS-5598: [update] Headless Guide - Creating Channels, update and re-order steps",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-14T21:19:53Z,2024-02-15T18:30:06Z,2024-02-15T18:30:05Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/104,https://github.com/bigcommerce/docs/pull/104,https://github.com/bigcommerce/docs/pull/104.diff,https://github.com/bigcommerce/docs/pull/104.patch,2024-02-15T18:30:05Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5598] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update creating channels per several backlog tickets + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've updated the Creating Channels section of the Headless Guide to provide more clarity around the order of the steps in the channel creation process. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5598]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5598?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/104/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/104/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/103,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/103/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/103/comments,https://api.github.com/repos/bigcommerce/docs/issues/103/events,https://github.com/bigcommerce/docs/pull/103,2135197943,PR_kwDOI7BBSM5m59b8,103,"DEVDOCS-5761: [update]fix typo, change primary_images to primary_image",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-14T21:01:28Z,2024-02-16T17:24:16Z,2024-02-16T17:24:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/103,https://github.com/bigcommerce/docs/pull/103,https://github.com/bigcommerce/docs/pull/103.diff,https://github.com/bigcommerce/docs/pull/103.patch,2024-02-16T17:24:16Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5761] + + +## What changed? +Changed `primary_images` to `primary_image` + +## Release notes draft +fixed typo +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5761]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5761?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/103/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/103/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/102,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/102/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/102/comments,https://api.github.com/repos/bigcommerce/docs/issues/102/events,https://github.com/bigcommerce/docs/pull/102,2135173581,PR_kwDOI7BBSM5m54C7,102,DEVDOCS-5652: [update] correct URL,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-02-14T20:44:35Z,2024-02-14T21:06:12Z,2024-02-14T21:06:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/102,https://github.com/bigcommerce/docs/pull/102,https://github.com/bigcommerce/docs/pull/102.diff,https://github.com/bigcommerce/docs/pull/102.patch,2024-02-14T21:06:11Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5652] + + +## What changed? +Correcting the processing payments URL + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5652]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5652?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/102/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/102/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/101,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/101/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/101/comments,https://api.github.com/repos/bigcommerce/docs/issues/101/events,https://github.com/bigcommerce/docs/pull/101,2134869635,PR_kwDOI7BBSM5m40sb,101,PSE-911: [update] Title schema for products v3 API docs,bc-NikitaPuzanenko,20911717,MDQ6VXNlcjIwOTExNzE3,https://avatars.githubusercontent.com/u/20911717?v=4,,https://api.github.com/users/bc-NikitaPuzanenko,https://github.com/bc-NikitaPuzanenko,https://api.github.com/users/bc-NikitaPuzanenko/followers,https://api.github.com/users/bc-NikitaPuzanenko/following{/other_user},https://api.github.com/users/bc-NikitaPuzanenko/gists{/gist_id},https://api.github.com/users/bc-NikitaPuzanenko/starred{/owner}{/repo},https://api.github.com/users/bc-NikitaPuzanenko/subscriptions,https://api.github.com/users/bc-NikitaPuzanenko/orgs,https://api.github.com/users/bc-NikitaPuzanenko/repos,https://api.github.com/users/bc-NikitaPuzanenko/events{/privacy},https://api.github.com/users/bc-NikitaPuzanenko/received_events,User,false,[],closed,false,,[],,1,2024-02-14T17:53:06Z,2024-02-14T18:34:43Z,2024-02-14T18:34:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/101,https://github.com/bigcommerce/docs/pull/101,https://github.com/bigcommerce/docs/pull/101.diff,https://github.com/bigcommerce/docs/pull/101.patch,2024-02-14T18:34:42Z,"# [PSE-911] + + +## What changed? +* Adding titles to response schema + +## Release notes draft +These changes will make return types more readable for users using our docs to generate clients. + +## Anything else? +I am not 100% sure on the titles, I tried to use existing language but open to other ideas. + +ping @bc-tgomez + + +[PSE-911]: https://bigcommercecloud.atlassian.net/browse/PSE-911?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/101/reactions,1,0,0,0,0,0,1,0,0,https://api.github.com/repos/bigcommerce/docs/issues/101/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/100,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/100/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/100/comments,https://api.github.com/repos/bigcommerce/docs/issues/100/events,https://github.com/bigcommerce/docs/issues/100,2133029413,I_kwDOI7BBSM5_I3Il,100,Feedback for “Orders” -- Updating,CPANinjaDoug,19492219,MDQ6VXNlcjE5NDkyMjE5,https://avatars.githubusercontent.com/u/19492219?v=4,,https://api.github.com/users/CPANinjaDoug,https://github.com/CPANinjaDoug,https://api.github.com/users/CPANinjaDoug/followers,https://api.github.com/users/CPANinjaDoug/following{/other_user},https://api.github.com/users/CPANinjaDoug/gists{/gist_id},https://api.github.com/users/CPANinjaDoug/starred{/owner}{/repo},https://api.github.com/users/CPANinjaDoug/subscriptions,https://api.github.com/users/CPANinjaDoug/orgs,https://api.github.com/users/CPANinjaDoug/repos,https://api.github.com/users/CPANinjaDoug/events{/privacy},https://api.github.com/users/CPANinjaDoug/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-02-13T19:52:58Z,2024-02-15T18:23:53Z,,NONE,,,,,,,,"Hi. Your order API docs say that updating an order removes all applied promotions. There's no mention as to how to re-apply promotions. If we're giving 10% off with a coupon code, and someone adds or removes a product from their order, how do we reapply that coupon?",https://api.github.com/repos/bigcommerce/docs/issues/100/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/100/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/99,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/99/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/99/comments,https://api.github.com/repos/bigcommerce/docs/issues/99/events,https://github.com/bigcommerce/docs/pull/99,2133024298,PR_kwDOI7BBSM5myh-q,99,DEVDOCS-5567: [update] added store/customer/address/*,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-02-13T19:48:44Z,2024-02-14T21:05:26Z,2024-02-14T21:05:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/99,https://github.com/bigcommerce/docs/pull/99,https://github.com/bigcommerce/docs/pull/99.diff,https://github.com/bigcommerce/docs/pull/99.patch,2024-02-14T21:05:25Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5567] + + +## What changed? +Added store/customer/address/* per the ticket. See screenshot in ticket for confirmation. + +## Release notes draft +Bug Fix: Added missing documentation. +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5567]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5567?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/99/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/99/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/98,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/98/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/98/comments,https://api.github.com/repos/bigcommerce/docs/issues/98/events,https://github.com/bigcommerce/docs/pull/98,2132438367,PR_kwDOI7BBSM5mwi56,98,SBD-955: [remove] legacy channel app references,becomevocal,2677921,MDQ6VXNlcjI2Nzc5MjE=,https://avatars.githubusercontent.com/u/2677921?v=4,,https://api.github.com/users/becomevocal,https://github.com/becomevocal,https://api.github.com/users/becomevocal/followers,https://api.github.com/users/becomevocal/following{/other_user},https://api.github.com/users/becomevocal/gists{/gist_id},https://api.github.com/users/becomevocal/starred{/owner}{/repo},https://api.github.com/users/becomevocal/subscriptions,https://api.github.com/users/becomevocal/orgs,https://api.github.com/users/becomevocal/repos,https://api.github.com/users/becomevocal/events{/privacy},https://api.github.com/users/becomevocal/received_events,User,false,[],closed,false,,[],,0,2024-02-13T14:20:55Z,2024-02-14T15:35:22Z,2024-02-14T15:35:21Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/98,https://github.com/bigcommerce/docs/pull/98,https://github.com/bigcommerce/docs/pull/98.diff,https://github.com/bigcommerce/docs/pull/98.patch,2024-02-14T15:35:21Z," +## What changed? +Removes the initial sample app for channels that was created in 2019. That repo is now archived. + +## Release notes draft +_Release note not needed_ +",https://api.github.com/repos/bigcommerce/docs/issues/98/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/98/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/97,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/97/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/97/comments,https://api.github.com/repos/bigcommerce/docs/issues/97/events,https://github.com/bigcommerce/docs/pull/97,2129724069,PR_kwDOI7BBSM5mnRHp,97,"CATALOG-9219: [update] Catalog, update all Product Custom Fields endpoints",olysenko,8058039,MDQ6VXNlcjgwNTgwMzk=,https://avatars.githubusercontent.com/u/8058039?v=4,,https://api.github.com/users/olysenko,https://github.com/olysenko,https://api.github.com/users/olysenko/followers,https://api.github.com/users/olysenko/following{/other_user},https://api.github.com/users/olysenko/gists{/gist_id},https://api.github.com/users/olysenko/starred{/owner}{/repo},https://api.github.com/users/olysenko/subscriptions,https://api.github.com/users/olysenko/orgs,https://api.github.com/users/olysenko/repos,https://api.github.com/users/olysenko/events{/privacy},https://api.github.com/users/olysenko/received_events,User,false,[],closed,false,,[],,1,2024-02-12T09:29:11Z,2024-02-19T14:30:11Z,2024-02-19T14:30:10Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/97,https://github.com/bigcommerce/docs/pull/97,https://github.com/bigcommerce/docs/pull/97.diff,https://github.com/bigcommerce/docs/pull/97.patch,2024-02-19T14:30:10Z,"<!-- Ticket number or summary of work --> +# CATALOG-9219 Review and update public API documentation for the POST|GET|PUT|DELETE v3/catalog/products/:productId/custom-fields + + +## What changed? +* Updated v3 custom-fields swagger scheme + +## Release notes draft +* updated error messaging for custom fields; +* clarified info about limitation of 250 max allowed characters for the name and value in custom fields. + + +ping @bigcommerce/team-catalog +",https://api.github.com/repos/bigcommerce/docs/issues/97/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/97/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/96,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/96/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/96/comments,https://api.github.com/repos/bigcommerce/docs/issues/96/events,https://github.com/bigcommerce/docs/pull/96,2127972035,PR_kwDOI7BBSM5mho8Q,96,"DEVDOCS-5740: [update] OrdersV2, Update schemas to include Consignments return objects, update example request and responses",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-02-09T23:21:33Z,2024-06-17T19:12:30Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/96,https://github.com/bigcommerce/docs/pull/96,https://github.com/bigcommerce/docs/pull/96.diff,https://github.com/bigcommerce/docs/pull/96.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5740] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update the v2 Orders consignments schema to include return objects `pickups`, `shipping`, `downloads`, and `email` +* Add consignment schema to the request and response + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Now you can return consignment objects such as, `pickups`, `shipping`, `downloads`, and `email`. The /orders/ GET and POST endpoints have been updated to optionally include a consignment array. Use /orders/{order_id} GET/PUT to fetch or update orders that include consignments. +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @BC-SEven + + +[DEVDOCS-5740]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5740?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/96/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/96/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/95,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/95/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/95/comments,https://api.github.com/repos/bigcommerce/docs/issues/95/events,https://github.com/bigcommerce/docs/pull/95,2127864667,PR_kwDOI7BBSM5mhR5O,95,DEVDOCS-5045: [update] Remove non-token oauth scopes from token creation docs,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-09T21:21:39Z,2024-02-14T20:12:23Z,2024-02-14T20:12:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/95,https://github.com/bigcommerce/docs/pull/95,https://github.com/bigcommerce/docs/pull/95.diff,https://github.com/bigcommerce/docs/pull/95.patch,2024-02-14T20:12:22Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5045] + + +## What changed? +Specific OAuths are not needed + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5045]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5045?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/95/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/95/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/94,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/94/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/94/comments,https://api.github.com/repos/bigcommerce/docs/issues/94/events,https://github.com/bigcommerce/docs/pull/94,2126570043,PR_kwDOI7BBSM5mc3M5,94,"DEVDOCS-5765: [update] Embedded Checkout tutorial, add channel_id to Customer Login JWT",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,2,2024-02-09T06:46:33Z,2024-02-09T18:21:05Z,2024-02-09T18:21:04Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/94,https://github.com/bigcommerce/docs/pull/94,https://github.com/bigcommerce/docs/pull/94.diff,https://github.com/bigcommerce/docs/pull/94.patch,2024-02-09T18:21:04Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5765] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've updated the Embedded Checkout tutorial to indicate that the `channel_id` is required for a Customer Login JWT used in the embedded checkout process. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5765]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5765?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/94/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/94/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/93,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/93/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/93/comments,https://api.github.com/repos/bigcommerce/docs/issues/93/events,https://github.com/bigcommerce/docs/pull/93,2123977025,PR_kwDOI7BBSM5mUAOp,93,"DEVDOCS-5708: [new] Customers V3, GET/ POST/ PUT singular endpoints for metafield customers",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-07T22:03:58Z,2024-02-15T14:41:30Z,2024-02-15T14:41:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/93,https://github.com/bigcommerce/docs/pull/93,https://github.com/bigcommerce/docs/pull/93.diff,https://github.com/bigcommerce/docs/pull/93.patch,2024-02-15T14:41:29Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5708] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-tayvs + + +[DEVDOCS-5708]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5708?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/93/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/93/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/92,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/92/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/92/comments,https://api.github.com/repos/bigcommerce/docs/issues/92/events,https://github.com/bigcommerce/docs/pull/92,2123958051,PR_kwDOI7BBSM5mT8DL,92,DEVDOCS-5707: [Update} update sale price definition,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-07T21:48:31Z,2024-02-09T17:03:59Z,2024-02-09T17:03:59Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/92,https://github.com/bigcommerce/docs/pull/92,https://github.com/bigcommerce/docs/pull/92.diff,https://github.com/bigcommerce/docs/pull/92.patch,2024-02-09T17:03:59Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5707] + + +## What changed? +Updated the definition for sale price + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5707]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5707?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/92/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/92/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/91,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/91/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/91/comments,https://api.github.com/repos/bigcommerce/docs/issues/91/events,https://github.com/bigcommerce/docs/pull/91,2121566742,PR_kwDOI7BBSM5mL4CQ,91,"DEVDOCS-5631: [new] Guide to API Accounts, add metafields scopes",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-02-06T19:58:02Z,2024-02-07T16:29:06Z,2024-02-07T16:29:05Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/91,https://github.com/bigcommerce/docs/pull/91,https://github.com/bigcommerce/docs/pull/91.diff,https://github.com/bigcommerce/docs/pull/91.patch,2024-02-07T16:29:05Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5631] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* add metafields scopes per my best understanding of the following: +<img width=""207"" alt=""Screenshot 2024-02-02 at 13 11 57"" src=""https://github.com/bigcommerce/docs/assets/15839167/ef0fb3af-165b-4cca-baf7-681e33e2b0ef""> + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Store-level API accounts now have dedicated scopes for working with metafields. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bookernath @kskomro @bc-andreadao @zvuki + + +[DEVDOCS-5631]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5631?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/91/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/91/timeline,,,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/90,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/90/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/90/comments,https://api.github.com/repos/bigcommerce/docs/issues/90/events,https://github.com/bigcommerce/docs/pull/90,2121329274,PR_kwDOI7BBSM5mLEBF,90,DEVDOCS-5760: [Update] change URL to reflect embedded checkout,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-06T17:25:12Z,2024-02-09T17:03:29Z,2024-02-09T17:03:29Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/90,https://github.com/bigcommerce/docs/pull/90,https://github.com/bigcommerce/docs/pull/90.diff,https://github.com/bigcommerce/docs/pull/90.patch,2024-02-09T17:03:29Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5760] + + +## What changed? +Changed redirect URL + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5760]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5760?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/90/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/90/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/89,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/89/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/89/comments,https://api.github.com/repos/bigcommerce/docs/issues/89/events,https://github.com/bigcommerce/docs/pull/89,2121102698,PR_kwDOI7BBSM5mKR3Q,89,"(no ticket): [update] Webhooks, remove empty allOf sections",funivan,425208,MDQ6VXNlcjQyNTIwOA==,https://avatars.githubusercontent.com/u/425208?v=4,,https://api.github.com/users/funivan,https://github.com/funivan,https://api.github.com/users/funivan/followers,https://api.github.com/users/funivan/following{/other_user},https://api.github.com/users/funivan/gists{/gist_id},https://api.github.com/users/funivan/starred{/owner}{/repo},https://api.github.com/users/funivan/subscriptions,https://api.github.com/users/funivan/orgs,https://api.github.com/users/funivan/repos,https://api.github.com/users/funivan/events{/privacy},https://api.github.com/users/funivan/received_events,User,false,[],closed,false,,[],,0,2024-02-06T15:47:05Z,2024-02-06T17:40:26Z,2024-02-06T17:40:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/89,https://github.com/bigcommerce/docs/pull/89,https://github.com/bigcommerce/docs/pull/89.diff,https://github.com/bigcommerce/docs/pull/89.patch,2024-02-06T17:40:26Z,"## What changed? +Remove empty `allOf` sections. +Moreover a lot of these schemas are unused so it is safe to merge. + +Rule: disallow empty `allOf`, `oneOf` sections + +## Release notes draft +none +",https://api.github.com/repos/bigcommerce/docs/issues/89/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/89/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/88,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/88/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/88/comments,https://api.github.com/repos/bigcommerce/docs/issues/88/events,https://github.com/bigcommerce/docs/pull/88,2119484842,PR_kwDOI7BBSM5mEvcq,88,DEVDOCS-5687: [Update] changed option-id to an integer,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,4,2024-02-05T21:27:05Z,2024-02-06T22:40:28Z,2024-02-05T21:44:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/88,https://github.com/bigcommerce/docs/pull/88,https://github.com/bigcommerce/docs/pull/88.diff,https://github.com/bigcommerce/docs/pull/88.patch,2024-02-05T21:44:42Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5687] + + +## What changed? +changed option id from a number to an integer + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5687]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5687?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/88/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/88/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/87,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/87/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/87/comments,https://api.github.com/repos/bigcommerce/docs/issues/87/events,https://github.com/bigcommerce/docs/pull/87,2119357914,PR_kwDOI7BBSM5mETd0,87,"DEVDOCS-5679: [update] Payments, clarify stored cards + housekeeping",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-02-05T19:58:03Z,2024-02-06T18:07:35Z,2024-02-06T18:07:34Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/87,https://github.com/bigcommerce/docs/pull/87,https://github.com/bigcommerce/docs/pull/87.diff,https://github.com/bigcommerce/docs/pull/87.patch,2024-02-06T18:07:34Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5679] + + +## What changed? +Add the updates listed in the ticket + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5679]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5679?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/87/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/87/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/86,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/86/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/86/comments,https://api.github.com/repos/bigcommerce/docs/issues/86/events,https://github.com/bigcommerce/docs/pull/86,2119026047,PR_kwDOI7BBSM5mDJdt,86,"ISSUE-79: [update] Stencil Frontmatter, fix category attributes schema",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-02-05T16:57:39Z,2024-02-05T18:10:38Z,2024-02-05T16:59:12Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/86,https://github.com/bigcommerce/docs/pull/86,https://github.com/bigcommerce/docs/pull/86.diff,https://github.com/bigcommerce/docs/pull/86.patch,2024-02-05T16:59:12Z,"<!-- Ticket number or summary of work --> +# ISSUE-79 +* #79 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* remove mistaken products value from category attributes example schema +* fix spacing + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We fixed an error in the category attributes schema in the Stencil frontmatter reference. Setting product limits should now be clearer! + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #79 + +ping @loganwoolf +",https://api.github.com/repos/bigcommerce/docs/issues/86/reactions,1,1,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/86/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/85,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/85/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/85/comments,https://api.github.com/repos/bigcommerce/docs/issues/85/events,https://github.com/bigcommerce/docs/pull/85,2118994895,PR_kwDOI7BBSM5mDCjP,85,"ISSUE-83: [update] Orders V2, abstract shipping provider schemas",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-05T16:42:27Z,2024-02-05T16:44:43Z,2024-02-05T16:44:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/85,https://github.com/bigcommerce/docs/pull/85,https://github.com/bigcommerce/docs/pull/85.diff,https://github.com/bigcommerce/docs/pull/85.patch,2024-02-05T16:44:42Z,"<!-- Ticket number or summary of work --> +# ISSUE-83 2 +* #83 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* create dedicated schemas for order shipping providers + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* See release notes for #84 + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #83 +* #84 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/85/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/85/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/84,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/84/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/84/comments,https://api.github.com/repos/bigcommerce/docs/issues/84/events,https://github.com/bigcommerce/docs/pull/84,2117443469,PR_kwDOI7BBSM5l9s1O,84,"ISSUE-83: [update] Orders V2, change shipping_provider to anyOf",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-05T01:02:29Z,2024-02-05T01:03:54Z,2024-02-05T01:03:54Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/84,https://github.com/bigcommerce/docs/pull/84,https://github.com/bigcommerce/docs/pull/84.diff,https://github.com/bigcommerce/docs/pull/84.patch,2024-02-05T01:03:54Z,"<!-- Ticket number or summary of work --> +# ISSUE-83 +* #83 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* change shipping_provider to anyOf to accommodate custom providers and support autogeneration +* add examples + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We've updated the shipping_provider property throughout the Orders V2 spec to allow arbitrary strings. This better indicates support for new and custom shipping providers, and improves API client autogeneration. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #83 + +ping FYI @bc-andreadao @theromulans +",https://api.github.com/repos/bigcommerce/docs/issues/84/reactions,1,1,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/84/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/83,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/83/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/83/comments,https://api.github.com/repos/bigcommerce/docs/issues/83/events,https://github.com/bigcommerce/docs/issues/83,2117110765,I_kwDOI7BBSM5-MIvt,83,Missing Royal Mail from Shipping Providers,Charlieface,124264953,U_kgDOB2gh-Q,https://avatars.githubusercontent.com/u/124264953?v=4,,https://api.github.com/users/Charlieface,https://github.com/Charlieface,https://api.github.com/users/Charlieface/followers,https://api.github.com/users/Charlieface/following{/other_user},https://api.github.com/users/Charlieface/gists{/gist_id},https://api.github.com/users/Charlieface/starred{/owner}{/repo},https://api.github.com/users/Charlieface/subscriptions,https://api.github.com/users/Charlieface/orgs,https://api.github.com/users/Charlieface/repos,https://api.github.com/users/Charlieface/events{/privacy},https://api.github.com/users/Charlieface/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,3,2024-02-04T14:02:33Z,2024-02-05T11:53:16Z,2024-02-05T01:11:53Z,NONE,,,,,,,,"The YAML and the docs for `/orders/{order_id}/shipments` says +> Acceptable values for `shipping_provider` include an empty string (`""""`), `auspost`, `carrier_{your_carrier_id}` (only used if the carrier is a [third-party Shipping Provider](/docs/integrations/shipping)), `canadapost`, `endicia`, `usps`, `fedex`, **`royalmail`**, `ups`, `upsready`, `upsonline`, or `shipperhq`. + +But `royalmail` is missing from [the YAML spec](https://github.com/bigcommerce/docs/blob/735852537eba7bc684bff9b56cdecfdd78739fdc/reference/orders.v2.oas2.yml#L3564C1-L3577C24) for `shipping_provider` + +``` + shipping_provider: + type: string + description: Enum of the BigCommerce shipping-carrier integration/module. + enum: + - auspost + - canadapost + - carrier_{your_carrier_id} (only used if the carrier is a [third-party Shipping Provider](/docs/integrations/shipping)) + - endicia + - usps + - fedex + - ups + - upsready + - upsonline + - shipperhq +``` +To be honest, given that it allows custom `carrier_` values, I don't understand why this is an `enum` at all. It should just be a normal string. + +No model generator is going to understand the line `carrier_{your_carrier_id}`, and forcing it to be an `enum` means you can't add your own values anyway, as it would be out of spec.",https://api.github.com/repos/bigcommerce/docs/issues/83/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/83/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/82,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/82/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/82/comments,https://api.github.com/repos/bigcommerce/docs/issues/82/events,https://github.com/bigcommerce/docs/pull/82,2115942378,PR_kwDOI7BBSM5l4vcS,82,"[DEVDOCS-5745]: [new] Users GQL, Update the Account Stores Users example query to include `collectionInfo`",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-02-02T22:46:19Z,2024-02-02T22:51:05Z,2024-02-02T22:51:05Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/82,https://github.com/bigcommerce/docs/pull/82,https://github.com/bigcommerce/docs/pull/82.diff,https://github.com/bigcommerce/docs/pull/82.patch,2024-02-02T22:51:05Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5745] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update the Account Stores Users example to include 'collectionInfo' to the query + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* New updates for Account Admin Users GraphQL query examples. Include `collectionInfo` and `totalItems` in your query requests to collect the total number of items in the collection. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @exeDog + + +[DEVDOCS-5745]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5745?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/82/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/82/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/81,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/81/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/81/comments,https://api.github.com/repos/bigcommerce/docs/issues/81/events,https://github.com/bigcommerce/docs/pull/81,2115913750,PR_kwDOI7BBSM5l4ox0,81,"DEVDOCS-5756: [update] Store Information, update descriptions + example",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-02T22:31:51Z,2024-02-02T22:35:28Z,2024-02-02T22:35:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/81,https://github.com/bigcommerce/docs/pull/81,https://github.com/bigcommerce/docs/pull/81.diff,https://github.com/bigcommerce/docs/pull/81.patch,2024-02-02T22:35:27Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5756] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update example to include recently-added properties +* Add descriptions for recently added properties + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* none needed + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #78 +* #80 + +ping {names} + + +[DEVDOCS-5756]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5756?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/81/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/81/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/80,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/80/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/80/comments,https://api.github.com/repos/bigcommerce/docs/issues/80/events,https://github.com/bigcommerce/docs/pull/80,2115796690,PR_kwDOI7BBSM5l4OjR,80,"DEVDOCS-5756: [update] Store Information, fix suboptimal syntax",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-02T21:02:09Z,2024-02-02T21:04:55Z,2024-02-02T21:04:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/80,https://github.com/bigcommerce/docs/pull/80,https://github.com/bigcommerce/docs/pull/80.diff,https://github.com/bigcommerce/docs/pull/80.patch,2024-02-02T21:04:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5756] - 2 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update things that didn't look good + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* see previous PR, no specific follow on note here + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #78 + +ping {names} + + +[DEVDOCS-5756]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5756?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/80/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/80/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/79,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/79/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/79/comments,https://api.github.com/repos/bigcommerce/docs/issues/79/events,https://github.com/bigcommerce/docs/issues/79,2115733360,I_kwDOI7BBSM5-G4dw,79,Feedback for “Front Matter Reference”,loganwoolf,64603789,MDQ6VXNlcjY0NjAzNzg5,https://avatars.githubusercontent.com/u/64603789?v=4,,https://api.github.com/users/loganwoolf,https://github.com/loganwoolf,https://api.github.com/users/loganwoolf/followers,https://api.github.com/users/loganwoolf/following{/other_user},https://api.github.com/users/loganwoolf/gists{/gist_id},https://api.github.com/users/loganwoolf/starred{/owner}{/repo},https://api.github.com/users/loganwoolf/subscriptions,https://api.github.com/users/loganwoolf/orgs,https://api.github.com/users/loganwoolf/repos,https://api.github.com/users/loganwoolf/events{/privacy},https://api.github.com/users/loganwoolf/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-02-02T20:20:00Z,2024-02-05T17:25:17Z,2024-02-05T17:25:17Z,NONE,,,,,,,,"I'm having a difficult time understanding the difference between what comes after products and what comes after limit. +``` +category: + shop_by_price: true # displays shop by price controls + products: 10 # displays 10 products per page for this category + limit: 10 # limits products per page for this category to 10 +```",https://api.github.com/repos/bigcommerce/docs/issues/79/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/79/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/78,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/78/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/78/comments,https://api.github.com/repos/bigcommerce/docs/issues/78/events,https://github.com/bigcommerce/docs/pull/78,2115697963,PR_kwDOI7BBSM5l34W-,78,"DEVDOCS-5756: [new] Store Information, add storefront limits",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-02-02T20:08:04Z,2024-02-02T20:34:59Z,2024-02-02T20:34:59Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/78,https://github.com/bigcommerce/docs/pull/78,https://github.com/bigcommerce/docs/pull/78.diff,https://github.com/bigcommerce/docs/pull/78.patch,2024-02-02T20:34:58Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5756] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Store Information + * add storefront limits + * add detail to the rest of the schema +* Store Settings + * add schema title + + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* The [Get store information](/docs/rest-management/store-information) endpoint now returns information about storefront limits! The new data includes the number of active storefronts and the total number of storefronts, including inactive ones. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @njb and @bc-traciporter this one has release notes + + +[DEVDOCS-5756]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5756?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/78/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/78/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/77,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/77/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/77/comments,https://api.github.com/repos/bigcommerce/docs/issues/77/events,https://github.com/bigcommerce/docs/pull/77,2115267157,PR_kwDOI7BBSM5l2Y8l,77,Devdocs 5748(b),bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,,[],,0,2024-02-02T16:12:22Z,2024-02-02T16:12:31Z,2024-02-02T16:12:27Z,MEMBER,,true,https://api.github.com/repos/bigcommerce/docs/pulls/77,https://github.com/bigcommerce/docs/pull/77,https://github.com/bigcommerce/docs/pull/77.diff,https://github.com/bigcommerce/docs/pull/77.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/77/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/77/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/76,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/76/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/76/comments,https://api.github.com/repos/bigcommerce/docs/issues/76/events,https://github.com/bigcommerce/docs/pull/76,2114053336,PR_kwDOI7BBSM5lyNNQ,76,Fix invalid schema in categories_catalog.v3.yml,jordanarldt,19815878,MDQ6VXNlcjE5ODE1ODc4,https://avatars.githubusercontent.com/u/19815878?v=4,,https://api.github.com/users/jordanarldt,https://github.com/jordanarldt,https://api.github.com/users/jordanarldt/followers,https://api.github.com/users/jordanarldt/following{/other_user},https://api.github.com/users/jordanarldt/gists{/gist_id},https://api.github.com/users/jordanarldt/starred{/owner}{/repo},https://api.github.com/users/jordanarldt/subscriptions,https://api.github.com/users/jordanarldt/orgs,https://api.github.com/users/jordanarldt/repos,https://api.github.com/users/jordanarldt/events{/privacy},https://api.github.com/users/jordanarldt/received_events,User,false,[],closed,false,,[],,1,2024-02-02T04:50:21Z,2024-02-02T15:55:41Z,2024-02-02T15:55:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/76,https://github.com/bigcommerce/docs/pull/76,https://github.com/bigcommerce/docs/pull/76.diff,https://github.com/bigcommerce/docs/pull/76.patch,2024-02-02T15:55:41Z,"<!-- Ticket number or summary of work --> +n/a + +## Current issue: +`categories_catalog.v3.yml` does not pass Swagger validation + +## What changed? +Remove invalid `title` schema field in `categories_catalog.v3.yml` + +While working on an internal tool, I noticed that the swagger parser began failing after pulling the latest API schema due to this file. + +## Release notes draft + * Fixed `categories_catalog.v3.yml` to ensure it is a valid Swagger format + +## Anything else? +n/a + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/76/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/76/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/75,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/75/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/75/comments,https://api.github.com/repos/bigcommerce/docs/issues/75/events,https://github.com/bigcommerce/docs/pull/75,2113977985,PR_kwDOI7BBSM5lx8jD,75,PSE-909: [update] Better return type for Mult-Status response,huntario,5630999,MDQ6VXNlcjU2MzA5OTk=,https://avatars.githubusercontent.com/u/5630999?v=4,,https://api.github.com/users/huntario,https://github.com/huntario,https://api.github.com/users/huntario/followers,https://api.github.com/users/huntario/following{/other_user},https://api.github.com/users/huntario/gists{/gist_id},https://api.github.com/users/huntario/starred{/owner}{/repo},https://api.github.com/users/huntario/subscriptions,https://api.github.com/users/huntario/orgs,https://api.github.com/users/huntario/repos,https://api.github.com/users/huntario/events{/privacy},https://api.github.com/users/huntario/received_events,User,false,[],closed,false,,[],,0,2024-02-02T03:37:55Z,2024-02-05T21:36:21Z,2024-02-05T21:36:20Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/75,https://github.com/bigcommerce/docs/pull/75,https://github.com/bigcommerce/docs/pull/75.diff,https://github.com/bigcommerce/docs/pull/75.patch,2024-02-05T21:36:20Z,"<!-- Ticket number or summary of work --> +# [PSE-909](https://bigcommercecloud.atlassian.net/browse/PSE-909) + +## What changed? +Added some missing title fields to catalog product-variants API spec. + +## Release notes draft +These additions will allow for better type naming for code clients +Changes types ""InlineResponse2007"" to ""MultiStatus"" + +[PSE-909]: https://bigcommercecloud.atlassian.net/browse/PSE-909?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/75/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/75/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/74,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/74/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/74/comments,https://api.github.com/repos/bigcommerce/docs/issues/74/events,https://github.com/bigcommerce/docs/pull/74,2111378559,PR_kwDOI7BBSM5lo6jI,74,PSE-908: [update] Add some missing titles for catalog tree api spec,huntario,5630999,MDQ6VXNlcjU2MzA5OTk=,https://avatars.githubusercontent.com/u/5630999?v=4,,https://api.github.com/users/huntario,https://github.com/huntario,https://api.github.com/users/huntario/followers,https://api.github.com/users/huntario/following{/other_user},https://api.github.com/users/huntario/gists{/gist_id},https://api.github.com/users/huntario/starred{/owner}{/repo},https://api.github.com/users/huntario/subscriptions,https://api.github.com/users/huntario/orgs,https://api.github.com/users/huntario/repos,https://api.github.com/users/huntario/events{/privacy},https://api.github.com/users/huntario/received_events,User,false,[],closed,false,,[],,1,2024-02-01T02:46:21Z,2024-02-05T22:06:41Z,2024-02-05T22:06:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/74,https://github.com/bigcommerce/docs/pull/74,https://github.com/bigcommerce/docs/pull/74.diff,https://github.com/bigcommerce/docs/pull/74.patch,2024-02-05T22:06:40Z,"<!-- Ticket number or summary of work --> +# [PSE-908](https://bigcommercecloud.atlassian.net/browse/PSE-908) + +## What changed? +Added some missing title fields to catalog tree API spec. + +## Release notes draft +These additions will allow for better type naming for code clients auto-generated from the spec. + +Changes types ""InlineResponse200"" to ""CategoryTreeList"", etc. + + +[PSE-908]: https://bigcommercecloud.atlassian.net/browse/PSE-908?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/74/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/74/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/73,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/73/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/73/comments,https://api.github.com/repos/bigcommerce/docs/issues/73/events,https://github.com/bigcommerce/docs/pull/73,2110832543,PR_kwDOI7BBSM5lnEFm,73,[DEVDOCS-5748]:[update] Add `external_order_id` component,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-31T19:40:48Z,2024-02-01T15:37:47Z,2024-01-31T19:42:45Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/73,https://github.com/bigcommerce/docs/pull/73,https://github.com/bigcommerce/docs/pull/73.diff,https://github.com/bigcommerce/docs/pull/73.patch,2024-01-31T19:42:45Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5748] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add component for `external_order_id` +* Add the ref to the Get All Orders Parameters + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Now includes `external_order_id` in the Get All Orders parameters. Add the parameter to your request to include Order IDs from external systems. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bigcommerce/team-orders + + +[DEVDOCS-5748]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5748?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/73/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/73/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/72,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/72/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/72/comments,https://api.github.com/repos/bigcommerce/docs/issues/72/events,https://github.com/bigcommerce/docs/pull/72,2110779930,PR_kwDOI7BBSM5lm4jH,72,DEVDOCS-5755: [Update] remove jan 31 date,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-01-31T19:07:39Z,2024-02-05T17:47:47Z,2024-02-05T17:47:46Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/72,https://github.com/bigcommerce/docs/pull/72,https://github.com/bigcommerce/docs/pull/72.diff,https://github.com/bigcommerce/docs/pull/72.patch,2024-02-05T17:47:46Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5755] + + +## What changed? +remove jan 31 deadline + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5755]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5755?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/72/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/72/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/71,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/71/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/71/comments,https://api.github.com/repos/bigcommerce/docs/issues/71/events,https://github.com/bigcommerce/docs/pull/71,2110287647,PR_kwDOI7BBSM5llMHS,71,no ticket-update per Jaime,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-31T14:55:39Z,2024-01-31T18:09:02Z,2024-01-31T18:09:02Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/71,https://github.com/bigcommerce/docs/pull/71,https://github.com/bigcommerce/docs/pull/71.diff,https://github.com/bigcommerce/docs/pull/71.patch,2024-01-31T18:09:02Z,"<!-- Ticket number or summary of work --> +No Ticket + +## What changed? +for scenario 1, we can change ""Please review and publish anytime prior to January 31, 2024."" to ""Please review and publish at your convenience"" + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/71/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/71/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/70,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/70/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/70/comments,https://api.github.com/repos/bigcommerce/docs/issues/70/events,https://github.com/bigcommerce/docs/pull/70,2110272071,PR_kwDOI7BBSM5llIla,70,DEVDOCS-5747: [Update] clean up,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-31T14:50:32Z,2024-01-31T18:08:50Z,2024-01-31T18:08:49Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/70,https://github.com/bigcommerce/docs/pull/70,https://github.com/bigcommerce/docs/pull/70.diff,https://github.com/bigcommerce/docs/pull/70.patch,2024-01-31T18:08:49Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5747] + + +## What changed? +It is more accurate to say ""For non-MSF storefronts, navigate to Storefront"" since step 3 starts with Themes. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5747]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5747?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/70/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/70/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/69,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/69/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/69/comments,https://api.github.com/repos/bigcommerce/docs/issues/69/events,https://github.com/bigcommerce/docs/pull/69,2109379684,PR_kwDOI7BBSM5liFa_,69,"PSE-904:[update] Catalog Brands, add some missing titles",huntario,5630999,MDQ6VXNlcjU2MzA5OTk=,https://avatars.githubusercontent.com/u/5630999?v=4,,https://api.github.com/users/huntario,https://github.com/huntario,https://api.github.com/users/huntario/followers,https://api.github.com/users/huntario/following{/other_user},https://api.github.com/users/huntario/gists{/gist_id},https://api.github.com/users/huntario/starred{/owner}{/repo},https://api.github.com/users/huntario/subscriptions,https://api.github.com/users/huntario/orgs,https://api.github.com/users/huntario/repos,https://api.github.com/users/huntario/events{/privacy},https://api.github.com/users/huntario/received_events,User,false,[],closed,false,,[],,0,2024-01-31T06:27:19Z,2024-02-01T14:21:47Z,2024-02-01T14:21:46Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/69,https://github.com/bigcommerce/docs/pull/69,https://github.com/bigcommerce/docs/pull/69.diff,https://github.com/bigcommerce/docs/pull/69.patch,2024-02-01T14:21:46Z,"<!-- Ticket number or summary of work --> +# [PSE-904](https://bigcommercecloud.atlassian.net/browse/PSE-904) + +## What changed? +Added some missing title fields to catalog brands API spec. + +## Release notes draft +These additions will allow for better type naming for code clients auto-generated from the spec. + +Changes types ""InlineResponse200"" to ""BrandImageResponse"" + + +[PSE-904]: https://bigcommercecloud.atlassian.net/browse/PSE-904?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/69/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/69/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/68,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/68/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/68/comments,https://api.github.com/repos/bigcommerce/docs/issues/68/events,https://github.com/bigcommerce/docs/pull/68,2108626212,PR_kwDOI7BBSM5lfiMl,68,DEVDOCS-5747: [update]update for non-msf,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-01-30T19:42:09Z,2024-01-30T20:38:14Z,2024-01-30T20:38:13Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/68,https://github.com/bigcommerce/docs/pull/68,https://github.com/bigcommerce/docs/pull/68.diff,https://github.com/bigcommerce/docs/pull/68.patch,2024-01-30T20:38:13Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5747] + + +## What changed? +Updated to reflect menus for non-msf stores. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5747]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5747?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/68/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/68/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/67,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/67/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/67/comments,https://api.github.com/repos/bigcommerce/docs/issues/67/events,https://github.com/bigcommerce/docs/pull/67,2108562548,PR_kwDOI7BBSM5lfUXe,67,"[DEVDOCS-5709]:[update] Headless Overview, Remove broken resource link",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-30T19:03:04Z,2024-01-30T19:12:36Z,2024-01-30T19:12:35Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/67,https://github.com/bigcommerce/docs/pull/67,https://github.com/bigcommerce/docs/pull/67.diff,https://github.com/bigcommerce/docs/pull/67.patch,2024-01-30T19:12:35Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5709] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove broken link that leads to a different URL + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5709]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5709?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/67/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/67/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/66,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/66/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/66/comments,https://api.github.com/repos/bigcommerce/docs/issues/66/events,https://github.com/bigcommerce/docs/pull/66,2108195453,PR_kwDOI7BBSM5leEwJ,66,DEVDOCS-5705: [Update] changed ID from integer to string,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-30T15:51:19Z,2024-01-30T18:49:35Z,2024-01-30T18:49:34Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/66,https://github.com/bigcommerce/docs/pull/66,https://github.com/bigcommerce/docs/pull/66.diff,https://github.com/bigcommerce/docs/pull/66.patch,2024-01-30T18:49:34Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5705] + + +## What changed? +changing the return type on the entity id property to return a string, instead of an integer. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5705]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5705?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/66/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/66/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/65,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/65/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/65/comments,https://api.github.com/repos/bigcommerce/docs/issues/65/events,https://github.com/bigcommerce/docs/pull/65,2106437511,PR_kwDOI7BBSM5lYGjz,65,"ISSUE-59: [update] Catalog Category Trees Categories, significant improvements",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,1,2024-01-29T21:10:56Z,2024-01-30T01:33:16Z,2024-01-30T01:33:15Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/65,https://github.com/bigcommerce/docs/pull/65,https://github.com/bigcommerce/docs/pull/65.diff,https://github.com/bigcommerce/docs/pull/65.patch,2024-01-30T01:33:15Z,"<!-- Ticket number or summary of work --> +# ISSUE-59 +* #59 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* attempt to address issue-59 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/65/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/65/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/64,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/64/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/64/comments,https://api.github.com/repos/bigcommerce/docs/issues/64/events,https://github.com/bigcommerce/docs/pull/64,2106172884,PR_kwDOI7BBSM5lXMsi,64,"(no ticket): [update] Node Sass Sunset, CTA",jamie-mckenzie,119447194,U_kgDOBx6emg,https://avatars.githubusercontent.com/u/119447194?v=4,,https://api.github.com/users/jamie-mckenzie,https://github.com/jamie-mckenzie,https://api.github.com/users/jamie-mckenzie/followers,https://api.github.com/users/jamie-mckenzie/following{/other_user},https://api.github.com/users/jamie-mckenzie/gists{/gist_id},https://api.github.com/users/jamie-mckenzie/starred{/owner}{/repo},https://api.github.com/users/jamie-mckenzie/subscriptions,https://api.github.com/users/jamie-mckenzie/orgs,https://api.github.com/users/jamie-mckenzie/repos,https://api.github.com/users/jamie-mckenzie/events{/privacy},https://api.github.com/users/jamie-mckenzie/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,1,2024-01-29T18:34:26Z,2024-01-30T18:50:00Z,2024-01-30T18:49:59Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/64,https://github.com/bigcommerce/docs/pull/64,https://github.com/bigcommerce/docs/pull/64.diff,https://github.com/bigcommerce/docs/pull/64.patch,2024-01-30T18:49:59Z,"<!-- Ticket number or summary of work --> +# (no ticket): [update] Node Sass Sunset, CTA + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update call to action. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-traciporter @slsriehl ",https://api.github.com/repos/bigcommerce/docs/issues/64/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/64/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/63,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/63/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/63/comments,https://api.github.com/repos/bigcommerce/docs/issues/63/events,https://github.com/bigcommerce/docs/pull/63,2104447203,PR_kwDOI7BBSM5lRRt1,63,"DEVDOCS-5710 [add]: Metafields, add metafields batch endpoints",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,7,2024-01-29T01:04:49Z,2024-02-29T19:05:06Z,2024-02-09T17:55:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/63,https://github.com/bigcommerce/docs/pull/63,https://github.com/bigcommerce/docs/pull/63.diff,https://github.com/bigcommerce/docs/pull/63.patch,2024-02-09T17:55:03Z,"# [DEVDOCS-5710] + +## What changed? +- Add endpoints of batch management of metafields + +## Release notes draft +* The newly-released Metafield endpoints are now available to use. Now, you’ll be able to manage metafields in batches for all types of metafield, including those for product, product variants, and more. + +## Related PR +- [PR 281](https://github.com/bigcommerce/api-specs-ssot/pull/281) for batch metafield endpoint for Locations API +- [PR 790](https://github.com/bigcommerce/developer-center/pull/790) for redirects + +[DEVDOCS-5710]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5710?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/63/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/63/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/62,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/62/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/62/comments,https://api.github.com/repos/bigcommerce/docs/issues/62/events,https://github.com/bigcommerce/docs/pull/62,2103456079,PR_kwDOI7BBSM5lONR_,62,"(external): [update] Catalog Products, fix categories:in schema",pvaladez,10084927,MDQ6VXNlcjEwMDg0OTI3,https://avatars.githubusercontent.com/u/10084927?v=4,,https://api.github.com/users/pvaladez,https://github.com/pvaladez,https://api.github.com/users/pvaladez/followers,https://api.github.com/users/pvaladez/following{/other_user},https://api.github.com/users/pvaladez/gists{/gist_id},https://api.github.com/users/pvaladez/starred{/owner}{/repo},https://api.github.com/users/pvaladez/subscriptions,https://api.github.com/users/pvaladez/orgs,https://api.github.com/users/pvaladez/repos,https://api.github.com/users/pvaladez/events{/privacy},https://api.github.com/users/pvaladez/received_events,User,false,[],closed,false,,[],,2,2024-01-27T08:46:40Z,2024-03-07T20:08:03Z,2024-02-05T01:17:03Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/62,https://github.com/bigcommerce/docs/pull/62,https://github.com/bigcommerce/docs/pull/62.diff,https://github.com/bigcommerce/docs/pull/62.patch,2024-02-05T01:17:03Z,"<!-- Ticket number or summary of work --> +API SPECS ISSUE + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* For `GET` `/v3/catalog/products` endpoint, define `categories:in` query parameter schema as array of integers +* Schema currently defines an integer but it should be an array of integers. For example, this is valid: `/v3/catalog/products?categories:in=24,25` +* See `id:in` schema: https://github.com/bigcommerce/docs/blob/47b47056ddb3274a7ab16c3db7b7c7749eacefd8/reference/catalog/products_catalog.v3.yml#L71-L78 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Allow multiple categories to be used with `categories:in` parameter on `/v3/catalog/products` endpoint. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @slsriehl + +",https://api.github.com/repos/bigcommerce/docs/issues/62/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/62/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/61,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/61/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/61/comments,https://api.github.com/repos/bigcommerce/docs/issues/61/events,https://github.com/bigcommerce/docs/pull/61,2102888428,PR_kwDOI7BBSM5lMfQX,61,"DEVDOCS-5180: [update] PriceListsV3, Update parameter `id:in` name and description",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-26T20:54:04Z,2024-01-30T19:29:42Z,2024-01-30T19:29:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/61,https://github.com/bigcommerce/docs/pull/61,https://github.com/bigcommerce/docs/pull/61.diff,https://github.com/bigcommerce/docs/pull/61.patch,2024-01-30T19:29:42Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5180] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update the Delete All Pricelist endpoint's parameter to include the `in` value +* Update the parameter's description + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Cleared up confusion around the Delete All Pricelists endpoint parameters. To run a request where multiple pricelists need to be deleted, the `in` value must be paired with the `id` value: `id:in`. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @megdesko + + +[DEVDOCS-5180]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5180?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/61/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/61/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/60,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/60/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/60/comments,https://api.github.com/repos/bigcommerce/docs/issues/60/events,https://github.com/bigcommerce/docs/pull/60,2101381268,PR_kwDOI7BBSM5lHhaC,60,"[DEVDOCS-5379]: [update] OrdersV2, Order/id/ PUT needs clarification about the default behavior in the description",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6477539063,""node_id"":""LA_kwDOI7BBSM8AAAABghdm9w"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/awaiting-SME-review"",""name"":""awaiting-SME-review"",""color"":""0052cc"",""default"":false,""description"":""PR is waiting on an SME review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-26T00:29:46Z,2024-01-26T22:44:56Z,2024-01-26T22:44:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/60,https://github.com/bigcommerce/docs/pull/60,https://github.com/bigcommerce/docs/pull/60.diff,https://github.com/bigcommerce/docs/pull/60.patch,2024-01-26T22:44:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5379] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add the default PUT behavior for OrdersV2 in the endpoint description + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Does this need one if it's an omission? + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-vincent-zhao + + +[DEVDOCS-5379]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5379?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/60/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/60/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/59,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/59/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/59/comments,https://api.github.com/repos/bigcommerce/docs/issues/59/events,https://github.com/bigcommerce/docs/issues/59,2100940506,I_kwDOI7BBSM59Oc7a,59,Feedback for “Categories”,atensoftware,20326471,MDQ6VXNlcjIwMzI2NDcx,https://avatars.githubusercontent.com/u/20326471?v=4,,https://api.github.com/users/atensoftware,https://github.com/atensoftware,https://api.github.com/users/atensoftware/followers,https://api.github.com/users/atensoftware/following{/other_user},https://api.github.com/users/atensoftware/gists{/gist_id},https://api.github.com/users/atensoftware/starred{/owner}{/repo},https://api.github.com/users/atensoftware/subscriptions,https://api.github.com/users/atensoftware/orgs,https://api.github.com/users/atensoftware/repos,https://api.github.com/users/atensoftware/events{/privacy},https://api.github.com/users/atensoftware/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-25T18:25:22Z,2024-01-30T01:52:35Z,2024-01-30T01:52:35Z,NONE,,,,,,,,"Example JSON for POST /catalog/trees/categories currently is missing category_id in the sample response. +Instead, it should include category_id just above ""parent_id"" + +CURRENTLY: +``` +{ + ""data"": [ + { + ""parent_id"": 2, + ""name"": ""Bath"", +``` + +INSTEAD: +``` +{ + ""data"": [ + { + ""category_id"": 6, + ""parent_id"": 2, + ""name"": ""Bath"", +```",https://api.github.com/repos/bigcommerce/docs/issues/59/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/59/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/58,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/58/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/58/comments,https://api.github.com/repos/bigcommerce/docs/issues/58/events,https://github.com/bigcommerce/docs/pull/58,2100874057,PR_kwDOI7BBSM5lF0rI,58,"ISSUE-57: [update] Catalog Category Tree Categories, change id to category_id",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-25T17:38:42Z,2024-01-25T17:40:10Z,2024-01-25T17:40:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/58,https://github.com/bigcommerce/docs/pull/58,https://github.com/bigcommerce/docs/pull/58.diff,https://github.com/bigcommerce/docs/pull/58.patch,2024-01-25T17:40:09Z,"<!-- Ticket number or summary of work --> +# ISSUE-57 +* #57 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* change id to category_id where appropriate + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* We fixed a bug in the Category Trees spec that incorrectly described a category response object as containing `id`s, rather than `category_id`s. Thanks to @atensoftware for raising this in Issue 57! + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/58/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/58/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/57,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/57/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/57/comments,https://api.github.com/repos/bigcommerce/docs/issues/57/events,https://github.com/bigcommerce/docs/issues/57,2100821447,I_kwDOI7BBSM59N_3H,57,Feedback for “Categories”,atensoftware,20326471,MDQ6VXNlcjIwMzI2NDcx,https://avatars.githubusercontent.com/u/20326471?v=4,,https://api.github.com/users/atensoftware,https://github.com/atensoftware,https://api.github.com/users/atensoftware/followers,https://api.github.com/users/atensoftware/following{/other_user},https://api.github.com/users/atensoftware/gists{/gist_id},https://api.github.com/users/atensoftware/starred{/owner}{/repo},https://api.github.com/users/atensoftware/subscriptions,https://api.github.com/users/atensoftware/orgs,https://api.github.com/users/atensoftware/repos,https://api.github.com/users/atensoftware/events{/privacy},https://api.github.com/users/atensoftware/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-25T17:06:03Z,2024-01-25T17:41:11Z,2024-01-25T17:41:10Z,NONE,,,,,,,,"The POST catalog/trees/categories response object contains ""category_id"" as the ID of the category. +Currently, the documentation lists it as ""id"" in the 201 response example. +""id integer +Unique ID of the Category. Increments sequentially. Read-Only."" + +Instead, it should list it as ""category_id"".",https://api.github.com/repos/bigcommerce/docs/issues/57/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/57/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/56,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/56/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/56/comments,https://api.github.com/repos/bigcommerce/docs/issues/56/events,https://github.com/bigcommerce/docs/pull/56,2100695072,PR_kwDOI7BBSM5lFN1N,56,DEVDOCS-5747: [update] update steps,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-25T15:59:53Z,2024-01-30T17:19:37Z,2024-01-30T17:19:36Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/56,https://github.com/bigcommerce/docs/pull/56,https://github.com/bigcommerce/docs/pull/56.diff,https://github.com/bigcommerce/docs/pull/56.patch,2024-01-30T17:19:36Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5747] + + +## What changed? +Updated the steps + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5747]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5747?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/56/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/56/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/55,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/55/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/55/comments,https://api.github.com/repos/bigcommerce/docs/issues/55/events,https://github.com/bigcommerce/docs/pull/55,2099581820,PR_kwDOI7BBSM5lBb-e,55,"PSE-896: [update] Catalog Categories, add some missing titles",huntario,5630999,MDQ6VXNlcjU2MzA5OTk=,https://avatars.githubusercontent.com/u/5630999?v=4,,https://api.github.com/users/huntario,https://github.com/huntario,https://api.github.com/users/huntario/followers,https://api.github.com/users/huntario/following{/other_user},https://api.github.com/users/huntario/gists{/gist_id},https://api.github.com/users/huntario/starred{/owner}{/repo},https://api.github.com/users/huntario/subscriptions,https://api.github.com/users/huntario/orgs,https://api.github.com/users/huntario/repos,https://api.github.com/users/huntario/events{/privacy},https://api.github.com/users/huntario/received_events,User,false,[],closed,false,,[],,2,2024-01-25T05:09:49Z,2024-01-29T20:41:02Z,2024-01-29T20:41:01Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/55,https://github.com/bigcommerce/docs/pull/55,https://github.com/bigcommerce/docs/pull/55.diff,https://github.com/bigcommerce/docs/pull/55.patch,2024-01-29T20:41:01Z,"<!-- Ticket number or summary of work --> +# [PSE-896](https://bigcommercecloud.atlassian.net/browse/PSE-896) + + +## What changed? +Added some missing title fields to catalog categories API spec. + +## Release notes draft +These additions will allow for better type naming for code clients auto-generated from the spec. + +Changes types ""InlineResponse200"" to ""CreateImageResponse"" +and ""InlineResponse2001"" to ""ProductSortOrder"". + +[PSE-896]: https://bigcommercecloud.atlassian.net/browse/PSE-896?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/55/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/55/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/54,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/54/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/54/comments,https://api.github.com/repos/bigcommerce/docs/issues/54/events,https://github.com/bigcommerce/docs/pull/54,2098916118,PR_kwDOI7BBSM5k_Lm9,54,"DEVDOCS-5714: Tax Zone API, add tax zone check endpoint",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-01-24T19:14:42Z,2024-01-26T15:17:59Z,2024-01-26T15:17:58Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/54,https://github.com/bigcommerce/docs/pull/54,https://github.com/bigcommerce/docs/pull/54.diff,https://github.com/bigcommerce/docs/pull/54.patch,2024-01-26T15:17:58Z,"# [DEVDOCS-5714] + +This PR is a continuation of [PR 12](https://github.com/bigcommerce/docs/pull/12) + +## What changed? +- Add Tax Zone Check endpoint to Tax Zones API reference +- Add new endpoint examples to Tax Zones doc +- Deleted (unused) file + +## Release notes draft + +The newly-released Tax Zone Check endpoint is now available to use. Now, you’ll be able to check the tax zone that applies to a given region and customer group. + + +## Anything else? + +cc @bigcommerce/team-tax + + +[DEVDOCS-5714]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5714?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/54/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/54/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/53,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/53/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/53/comments,https://api.github.com/repos/bigcommerce/docs/issues/53/events,https://github.com/bigcommerce/docs/pull/53,2092624894,PR_kwDOI7BBSM5kp253,53,feat(payment): PAYPAL-3377 Add support of braintree.ach in payments API,alstarodubtcev,63665327,MDQ6VXNlcjYzNjY1MzI3,https://avatars.githubusercontent.com/u/63665327?v=4,,https://api.github.com/users/alstarodubtcev,https://github.com/alstarodubtcev,https://api.github.com/users/alstarodubtcev/followers,https://api.github.com/users/alstarodubtcev/following{/other_user},https://api.github.com/users/alstarodubtcev/gists{/gist_id},https://api.github.com/users/alstarodubtcev/starred{/owner}{/repo},https://api.github.com/users/alstarodubtcev/subscriptions,https://api.github.com/users/alstarodubtcev/orgs,https://api.github.com/users/alstarodubtcev/repos,https://api.github.com/users/alstarodubtcev/events{/privacy},https://api.github.com/users/alstarodubtcev/received_events,User,false,[],closed,false,"{""login"":""alstarodubtcev"",""id"":63665327,""node_id"":""MDQ6VXNlcjYzNjY1MzI3"",""avatar_url"":""https://avatars.githubusercontent.com/u/63665327?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/alstarodubtcev"",""html_url"":""https://github.com/alstarodubtcev"",""followers_url"":""https://api.github.com/users/alstarodubtcev/followers"",""following_url"":""https://api.github.com/users/alstarodubtcev/following{/other_user}"",""gists_url"":""https://api.github.com/users/alstarodubtcev/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/alstarodubtcev/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/alstarodubtcev/subscriptions"",""organizations_url"":""https://api.github.com/users/alstarodubtcev/orgs"",""repos_url"":""https://api.github.com/users/alstarodubtcev/repos"",""events_url"":""https://api.github.com/users/alstarodubtcev/events{/privacy}"",""received_events_url"":""https://api.github.com/users/alstarodubtcev/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""alstarodubtcev"",""id"":63665327,""node_id"":""MDQ6VXNlcjYzNjY1MzI3"",""avatar_url"":""https://avatars.githubusercontent.com/u/63665327?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/alstarodubtcev"",""html_url"":""https://github.com/alstarodubtcev"",""followers_url"":""https://api.github.com/users/alstarodubtcev/followers"",""following_url"":""https://api.github.com/users/alstarodubtcev/following{/other_user}"",""gists_url"":""https://api.github.com/users/alstarodubtcev/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/alstarodubtcev/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/alstarodubtcev/subscriptions"",""organizations_url"":""https://api.github.com/users/alstarodubtcev/orgs"",""repos_url"":""https://api.github.com/users/alstarodubtcev/repos"",""events_url"":""https://api.github.com/users/alstarodubtcev/events{/privacy}"",""received_events_url"":""https://api.github.com/users/alstarodubtcev/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-21T15:03:38Z,2024-01-23T20:47:35Z,2024-01-23T20:47:34Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/53,https://github.com/bigcommerce/docs/pull/53,https://github.com/bigcommerce/docs/pull/53.diff,https://github.com/bigcommerce/docs/pull/53.patch,2024-01-23T20:47:34Z,"<!-- Ticket number or summary of work --> +# [PAYPAL-3377] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Added bank account instrument to payments API doc. +* Added Braintree ACH block to payments overview. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[PAYPAL-3377]: https://bigcommercecloud.atlassian.net/browse/PAYPAL-3377?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/53/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/53/timeline,,,alstarodubtcev,63665327,MDQ6VXNlcjYzNjY1MzI3,https://avatars.githubusercontent.com/u/63665327?v=4,,https://api.github.com/users/alstarodubtcev,https://github.com/alstarodubtcev,https://api.github.com/users/alstarodubtcev/followers,https://api.github.com/users/alstarodubtcev/following{/other_user},https://api.github.com/users/alstarodubtcev/gists{/gist_id},https://api.github.com/users/alstarodubtcev/starred{/owner}{/repo},https://api.github.com/users/alstarodubtcev/subscriptions,https://api.github.com/users/alstarodubtcev/orgs,https://api.github.com/users/alstarodubtcev/repos,https://api.github.com/users/alstarodubtcev/events{/privacy},https://api.github.com/users/alstarodubtcev/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/52,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/52/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/52/comments,https://api.github.com/repos/bigcommerce/docs/issues/52/events,https://github.com/bigcommerce/docs/pull/52,2086355633,PR_kwDOI7BBSM5kUmaA,52,DEVDOCS-5111-Johan-feedback,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-01-17T14:49:13Z,2024-01-18T14:48:27Z,2024-01-18T14:48:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/52,https://github.com/bigcommerce/docs/pull/52,https://github.com/bigcommerce/docs/pull/52.diff,https://github.com/bigcommerce/docs/pull/52.patch,2024-01-18T14:48:26Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5111] + + +## What changed? +Johan asked for additional changes + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5111]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5111?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/52/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/52/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/51,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/51/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/51/comments,https://api.github.com/repos/bigcommerce/docs/issues/51/events,https://github.com/bigcommerce/docs/pull/51,2084901264,PR_kwDOI7BBSM5kPsPi,51,remove extra space,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,[],closed,false,,[],,0,2024-01-16T20:52:30Z,2024-01-16T22:16:29Z,2024-01-16T22:16:28Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/51,https://github.com/bigcommerce/docs/pull/51,https://github.com/bigcommerce/docs/pull/51.diff,https://github.com/bigcommerce/docs/pull/51.patch,2024-01-16T22:16:28Z,"<!-- Ticket number or summary of work --> +# No ticket + + +## What changed? +Removed space to fix the link + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/51/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/51/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/50,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/50/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/50/comments,https://api.github.com/repos/bigcommerce/docs/issues/50/events,https://github.com/bigcommerce/docs/pull/50,2084799191,PR_kwDOI7BBSM5kPUsz,50,"(external): [update] Catalog Brands, update meta_keywords descriptions and examples",Eli-Caraballo,59987371,MDQ6VXNlcjU5OTg3Mzcx,https://avatars.githubusercontent.com/u/59987371?v=4,,https://api.github.com/users/Eli-Caraballo,https://github.com/Eli-Caraballo,https://api.github.com/users/Eli-Caraballo/followers,https://api.github.com/users/Eli-Caraballo/following{/other_user},https://api.github.com/users/Eli-Caraballo/gists{/gist_id},https://api.github.com/users/Eli-Caraballo/starred{/owner}{/repo},https://api.github.com/users/Eli-Caraballo/subscriptions,https://api.github.com/users/Eli-Caraballo/orgs,https://api.github.com/users/Eli-Caraballo/repos,https://api.github.com/users/Eli-Caraballo/events{/privacy},https://api.github.com/users/Eli-Caraballo/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-16T20:15:05Z,2024-01-25T16:34:45Z,2024-01-25T16:34:44Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/50,https://github.com/bigcommerce/docs/pull/50,https://github.com/bigcommerce/docs/pull/50.diff,https://github.com/bigcommerce/docs/pull/50.patch,2024-01-25T16:34:44Z,"While working through the API I noticed the description and examples for meta_kaywords don't reflect what is received back from the actual request. This hopefully should fix that. + +- Sorry for accidentally deleting the last one. + +<!-- Ticket number or summary of work --> +# Update meta_keywords Descriptions and Examples + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Changed description from ""Comma-separated list of meta keywords to include in the HTML."" to ""An array of meta keywords to include in the HTML."" +* Changed examples to be an array of keywords and not a comma-separated string + +## Release notes draft +Update Brand's V3 documentation to correctly represent what is returned in the response.",https://api.github.com/repos/bigcommerce/docs/issues/50/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/50/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/49,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/49/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/49/comments,https://api.github.com/repos/bigcommerce/docs/issues/49/events,https://github.com/bigcommerce/docs/pull/49,2084682078,PR_kwDOI7BBSM5kO56-,49,Update meta_keywords descriptions and examples for brands_catalog.v3,Eli-Caraballo,59987371,MDQ6VXNlcjU5OTg3Mzcx,https://avatars.githubusercontent.com/u/59987371?v=4,,https://api.github.com/users/Eli-Caraballo,https://github.com/Eli-Caraballo,https://api.github.com/users/Eli-Caraballo/followers,https://api.github.com/users/Eli-Caraballo/following{/other_user},https://api.github.com/users/Eli-Caraballo/gists{/gist_id},https://api.github.com/users/Eli-Caraballo/starred{/owner}{/repo},https://api.github.com/users/Eli-Caraballo/subscriptions,https://api.github.com/users/Eli-Caraballo/orgs,https://api.github.com/users/Eli-Caraballo/repos,https://api.github.com/users/Eli-Caraballo/events{/privacy},https://api.github.com/users/Eli-Caraballo/received_events,User,false,[],closed,false,,[],,0,2024-01-16T19:27:48Z,2024-01-16T19:38:06Z,2024-01-16T19:38:06Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/49,https://github.com/bigcommerce/docs/pull/49,https://github.com/bigcommerce/docs/pull/49.diff,https://github.com/bigcommerce/docs/pull/49.patch,,While working through the API I noticed the description and examples for meta_kaywords don't reflect what is received back from the actual request. This hopefully should fix that.,https://api.github.com/repos/bigcommerce/docs/issues/49/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/49/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/48,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/48/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/48/comments,https://api.github.com/repos/bigcommerce/docs/issues/48/events,https://github.com/bigcommerce/docs/pull/48,2084123896,PR_kwDOI7BBSM5kM-Y7,48,DEVDOCS-5729: [update] fix typo,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-16T14:34:56Z,2024-01-16T19:14:00Z,2024-01-16T19:14:00Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/48,https://github.com/bigcommerce/docs/pull/48,https://github.com/bigcommerce/docs/pull/48.diff,https://github.com/bigcommerce/docs/pull/48.patch,2024-01-16T19:14:00Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5729] + + +## What changed? +{{{stylesheet '/assets/css/theme.scss'}}} + +should be + +{{{stylesheet '/assets/css/theme.css'}}} + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5729]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5729?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/48/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/48/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/47,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/47/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/47/comments,https://api.github.com/repos/bigcommerce/docs/issues/47/events,https://github.com/bigcommerce/docs/pull/47,2082470089,PR_kwDOI7BBSM5kHU6A,47,"ISSUE-1468: [update] Catalog, remove caveat about swatch defaults",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-15T17:51:16Z,2024-01-26T16:36:26Z,2024-01-26T16:36:25Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/47,https://github.com/bigcommerce/docs/pull/47,https://github.com/bigcommerce/docs/pull/47.diff,https://github.com/bigcommerce/docs/pull/47.patch,2024-01-26T16:36:25Z,"# [bigcommerce/api-specs issue-1468](https://github.com/bigcommerce/api-specs/issues/1468) + +## What changed? +* remove incorrect caveat about swatch defaults + +## Release notes draft +* Removed an incorrect caveat about swatch defaults. It is possible to set a default value for swatch options and modifiers. + +## Anything else? +* [bigcommerce/api-specs issue-1468](https://github.com/bigcommerce/api-specs/issues/1468) + +ping @bobbyshaw @kristinapototska +",https://api.github.com/repos/bigcommerce/docs/issues/47/reactions,1,1,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/47/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/46,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/46/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/46/comments,https://api.github.com/repos/bigcommerce/docs/issues/46/events,https://github.com/bigcommerce/docs/pull/46,2082448256,PR_kwDOI7BBSM5kHQM3,46,"ISSUE-1073: [update] Catalog, clarify Add a Product supports creating multiple variants",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-15T17:33:32Z,2024-01-15T17:37:44Z,2024-01-15T17:37:43Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/46,https://github.com/bigcommerce/docs/pull/46,https://github.com/bigcommerce/docs/pull/46.diff,https://github.com/bigcommerce/docs/pull/46.patch,2024-01-15T17:37:43Z,"<!-- Ticket number or summary of work --> +# [bigcommerce/api-specs issue-1073](https://github.com/bigcommerce/api-specs/issues/1073) + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* add notes to add a product indicating support for multiple variant creation + +## Release notes draft +* N/A + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* [bigcommerce/api-specs issue-1073](https://github.com/bigcommerce/api-specs/issues/1073) + +ping @armpogart +",https://api.github.com/repos/bigcommerce/docs/issues/46/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/46/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/45,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/45/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/45/comments,https://api.github.com/repos/bigcommerce/docs/issues/45/events,https://github.com/bigcommerce/docs/pull/45,2081074569,PR_kwDOI7BBSM5kCnnF,45,"DEVDOCS-4878: [external] API specs, update Operation IDs to be consistent & programmatic",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,"[{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""},{""id"":6431302373,""node_id"":""LA_kwDOI7BBSM8AAAABf1Xi5Q"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/breaking-changes"",""name"":""breaking-changes"",""color"":""2F0E16"",""default"":false,""description"":""""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-15T01:18:17Z,2024-01-15T16:37:29Z,2024-01-15T16:37:28Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/45,https://github.com/bigcommerce/docs/pull/45,https://github.com/bigcommerce/docs/pull/45.diff,https://github.com/bigcommerce/docs/pull/45.patch,2024-01-15T16:37:28Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4878] +* Original PR [bigcommerce/api-specs 1469](https://github.com/bigcommerce/api-specs/pull/1469) by @bobbyshaw. + +> As per OpenAPI specification guidance for operationID field, follow programmatic conventions for operationId field. To me that means as if I were defining a method or function name. +> This field is not used in the API docs as far as I can tell. There were +many different naming conventions across APIs. I've aligned to be camel case. +> This helps facilitate API SDK generation as all endpoints can have a function name based on the operation ID and have it have sufficient context to be unique amongst all APIs. + +## What changed? +* Make operation IDs consistent and follow programmatic conventions + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* A valued partner has put in the heroic work to make the OAS operation IDs programmatic across our public APIs. The operationId property is now consistently camelCase and relates to the plain-language name of the endpoint. Thanks, @bobbyshaw! + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* PR [bigcommerce/api-specs 1469](https://github.com/bigcommerce/api-specs/pull/1469) +* Issue [bigcommerce/api-specs 1143](https://github.com/bigcommerce/api-specs/issues/1143) + +ping @bobbyshaw @bc-hnbarr @becomevocal @bigcommerce/dev-docs-team + + +[DEVDOCS-4878]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4878?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/45/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/45/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/44,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/44/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/44/comments,https://api.github.com/repos/bigcommerce/docs/issues/44/events,https://github.com/bigcommerce/docs/pull/44,2080857908,PR_kwDOI7BBSM5kB4y-,44,"SELFDEV-494: [update] Tax Rates & Zones, reconcile spec overrides",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-14T19:03:59Z,2024-01-17T22:58:28Z,2024-01-17T22:58:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/44,https://github.com/bigcommerce/docs/pull/44,https://github.com/bigcommerce/docs/pull/44.diff,https://github.com/bigcommerce/docs/pull/44.patch,2024-01-17T22:58:27Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-494] + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Merge in the override changes that revert the file to OAS 3.0.0 +* Remove old callout artifacts +* Reconcile with recent changes + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping @bc-andreadao + + +[SELFDEV-494]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-494?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/44/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/44/timeline,,,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/43,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/43/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/43/comments,https://api.github.com/repos/bigcommerce/docs/issues/43/events,https://github.com/bigcommerce/docs/issues/43,2080594370,I_kwDOI7BBSM58A1nC,43,Feedback for “Live Previewing a Theme”,RightFootConsulting,136657887,U_kgDOCCU73w,https://avatars.githubusercontent.com/u/136657887?v=4,,https://api.github.com/users/RightFootConsulting,https://github.com/RightFootConsulting,https://api.github.com/users/RightFootConsulting/followers,https://api.github.com/users/RightFootConsulting/following{/other_user},https://api.github.com/users/RightFootConsulting/gists{/gist_id},https://api.github.com/users/RightFootConsulting/starred{/owner}{/repo},https://api.github.com/users/RightFootConsulting/subscriptions,https://api.github.com/users/RightFootConsulting/orgs,https://api.github.com/users/RightFootConsulting/repos,https://api.github.com/users/RightFootConsulting/events{/privacy},https://api.github.com/users/RightFootConsulting/received_events,User,false,"[{""id"":6404039725,""node_id"":""LA_kwDOI7BBSM8AAAABfbXkLQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/stencil"",""name"":""stencil"",""color"":""65B9F5"",""default"":false,""description"":""""},{""id"":6404041419,""node_id"":""LA_kwDOI7BBSM8AAAABfbXqyw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/bug-report"",""name"":""bug-report"",""color"":""9D12DF"",""default"":false,""description"":""""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-14T05:47:36Z,2024-01-14T17:59:44Z,2024-01-14T17:59:43Z,NONE,,,,,,,,"Your instructions direct us to install latest node LTS version which is currently 20.11.0. However + +$ npm install @bigcommerce/stencil-utils +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-utils@6.15.1', +npm WARN EBADENGINE required: { node: '>=14.0.0 <19.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.11.0', npm: '10.2.4' } +npm WARN EBADENGINE } + +up to date, audited 1763 packages in 5s + +137 packages are looking for funding + run `npm fund` for details + +24 vulnerabilities (21 moderate, 3 high) + +To address issues that do not require attention, run: + npm audit fix + +To address all issues (including breaking changes), run: + npm audit fix --force + +Run `npm audit` for details.",https://api.github.com/repos/bigcommerce/docs/issues/43/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/43/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/42,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/42/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/42/comments,https://api.github.com/repos/bigcommerce/docs/issues/42/events,https://github.com/bigcommerce/docs/pull/42,2079487228,PR_kwDOI7BBSM5j9b--,42,"(no ticket): [external] node-sass, correct scss-autofix commands",joshhedstrom,32422725,MDQ6VXNlcjMyNDIyNzI1,https://avatars.githubusercontent.com/u/32422725?v=4,,https://api.github.com/users/joshhedstrom,https://github.com/joshhedstrom,https://api.github.com/users/joshhedstrom/followers,https://api.github.com/users/joshhedstrom/following{/other_user},https://api.github.com/users/joshhedstrom/gists{/gist_id},https://api.github.com/users/joshhedstrom/starred{/owner}{/repo},https://api.github.com/users/joshhedstrom/subscriptions,https://api.github.com/users/joshhedstrom/orgs,https://api.github.com/users/joshhedstrom/repos,https://api.github.com/users/joshhedstrom/events{/privacy},https://api.github.com/users/joshhedstrom/received_events,User,false,[],closed,false,,[],,1,2024-01-12T18:49:32Z,2024-01-14T18:03:01Z,2024-01-14T18:03:01Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/42,https://github.com/bigcommerce/docs/pull/42,https://github.com/bigcommerce/docs/pull/42.diff,https://github.com/bigcommerce/docs/pull/42.patch,2024-01-14T18:03:01Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] +These commands are not recognized using the latest version of the stencil-cli. The command that works is `stencil scss-autofix`. + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Updated the autofix-scss commands since the listed commands do not work in the latest version of the stencil cli + +## Release notes draft + +Fixed typos in the stencil cli autofix-scss commands + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/42/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/42/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/41,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/41/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/41/comments,https://api.github.com/repos/bigcommerce/docs/issues/41/events,https://github.com/bigcommerce/docs/issues/41,2077300027,I_kwDOI7BBSM570RU7,41,Application error on docs site for Channels API,Tigatok,3906461,MDQ6VXNlcjM5MDY0NjE=,https://avatars.githubusercontent.com/u/3906461?v=4,,https://api.github.com/users/Tigatok,https://github.com/Tigatok,https://api.github.com/users/Tigatok/followers,https://api.github.com/users/Tigatok/following{/other_user},https://api.github.com/users/Tigatok/gists{/gist_id},https://api.github.com/users/Tigatok/starred{/owner}{/repo},https://api.github.com/users/Tigatok/subscriptions,https://api.github.com/users/Tigatok/orgs,https://api.github.com/users/Tigatok/repos,https://api.github.com/users/Tigatok/events{/privacy},https://api.github.com/users/Tigatok/received_events,User,false,[],closed,false,,[],,1,2024-01-11T17:57:33Z,2024-01-11T19:22:09Z,2024-01-11T19:22:09Z,NONE,,,,,,,,"Hi there, + +This page shows an application error: +https://developer.bigcommerce.com/docs/rest-management/channels + +<img width=""1293"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/3906461/3f84e6a3-f608-4696-a89c-ea61b8d5112e""> +",https://api.github.com/repos/bigcommerce/docs/issues/41/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/41/timeline,,completed,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/40,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/40/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/40/comments,https://api.github.com/repos/bigcommerce/docs/issues/40/events,https://github.com/bigcommerce/docs/pull/40,2077203963,PR_kwDOI7BBSM5j1mZ_,40,"DEVDOCS-5641 [update]: Tax Provider API, remove full refund from Adjust endpoint",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,,[],,0,2024-01-11T17:14:53Z,2024-01-12T22:15:04Z,2024-01-12T22:15:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/40,https://github.com/bigcommerce/docs/pull/40,https://github.com/bigcommerce/docs/pull/40.diff,https://github.com/bigcommerce/docs/pull/40.patch,2024-01-12T22:15:03Z,"# [DEVDOCS-5641] + +## What changed? +* remove full refund for description of Adjust endpoint (Tax Provider API) +* add full refund for description of Void endpoint (Tax Provider API) + +[DEVDOCS-5641]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5641?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/40/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/40/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/39,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/39/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/39/comments,https://api.github.com/repos/bigcommerce/docs/issues/39/events,https://github.com/bigcommerce/docs/pull/39,2075441879,PR_kwDOI7BBSM5jvfs7,39,"ISSUE-1376: [update] Webhooks, update datatypes for ID and timestamps",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-01-11T00:11:44Z,2024-01-11T00:13:27Z,2024-01-11T00:13:27Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/39,https://github.com/bigcommerce/docs/pull/39,https://github.com/bigcommerce/docs/pull/39.diff,https://github.com/bigcommerce/docs/pull/39.patch,2024-01-11T00:13:26Z,"<!-- Ticket number or summary of work --> +# ISSUE-1376: [update] Webhooks, update datatypes for ID and timestamps +* https://github.com/bigcommerce/api-specs/issue/1376 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update datatypes for id and timestamps + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Updated datatypes in the Webhooks V3 specifications. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* https://github.com/bigcommerce/api-specs/issue/1376 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/39/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/39/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/38,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/38/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/38/comments,https://api.github.com/repos/bigcommerce/docs/issues/38/events,https://github.com/bigcommerce/docs/pull/38,2075367992,PR_kwDOI7BBSM5jvPiZ,38,"ISSUE-1358: [update] Store Information, update logo datatype",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-01-10T23:02:35Z,2024-01-10T23:10:13Z,2024-01-10T23:10:13Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/38,https://github.com/bigcommerce/docs/pull/38,https://github.com/bigcommerce/docs/pull/38.diff,https://github.com/bigcommerce/docs/pull/38.patch,2024-01-10T23:10:12Z,"<!-- Ticket number or summary of work --> +# ISSUE-1358: [update] Store Information, update logo datatype +* from https://github.com/bigcommerce/api-specs/issue/1358 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update logo datatype +* file cleanup + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Update Store Information logo datatype + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* https://github.com/bigcommerce/api-specs/issue/1358 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/38/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/38/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/37,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/37/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/37/comments,https://api.github.com/repos/bigcommerce/docs/issues/37/events,https://github.com/bigcommerce/docs/pull/37,2075252108,PR_kwDOI7BBSM5ju13G,37,"DEVDOCS-4552: [add] Orders, Add Gift Certificate consignment to POST",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-10T21:37:49Z,2024-02-26T18:56:57Z,2024-02-26T18:56:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/37,https://github.com/bigcommerce/docs/pull/37,https://github.com/bigcommerce/docs/pull/37.diff,https://github.com/bigcommerce/docs/pull/37.patch,,"# [DEVDOCS-4552] + +## What changed? +* Add Post to include Gift Certificate Consignment + +## Anything else? +Related PRs: [#1013](https://github.com/bigcommerce/api-specs/pull/1013/files#diff-1ab2519be19e393be2d64b422785c01ff83ea4d351f22b4557c98d3d734e3080L5041) + +[DEVDOCS-4552]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4552?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/37/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/37/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/36,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/36/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/36/comments,https://api.github.com/repos/bigcommerce/docs/issues/36/events,https://github.com/bigcommerce/docs/pull/36,2075246846,PR_kwDOI7BBSM5ju0s_,36,"DEVDOCS-4469: [add] Orders, PUT - Support Single Shipping Consignment",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-10T21:33:53Z,2024-02-26T17:30:34Z,2024-02-26T17:30:29Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/36,https://github.com/bigcommerce/docs/pull/36,https://github.com/bigcommerce/docs/pull/36.diff,https://github.com/bigcommerce/docs/pull/36.patch,,"# [DEVDOCS-4469] + +## What changed? +* Add put update to include shipping consignments +* Clean email examples + +## Anything else? +Related PRs, salient notes, etc + + +[DEVDOCS-4469]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4469?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/36/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/36/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/35,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/35/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/35/comments,https://api.github.com/repos/bigcommerce/docs/issues/35/events,https://github.com/bigcommerce/docs/pull/35,2075242716,PR_kwDOI7BBSM5juzw3,35,"DEVDOCS-4634: [new] Orders V2, Update an order; gift cert consignment",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-10T21:31:18Z,2024-02-26T21:01:25Z,2024-02-26T21:01:22Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/35,https://github.com/bigcommerce/docs/pull/35,https://github.com/bigcommerce/docs/pull/35.diff,https://github.com/bigcommerce/docs/pull/35.patch,,"# [DEVDOCS-4634] + +## What changed? +* Add GC consignment support for Update an Order. + +## Anything else? +Related PRs: https://github.com/BC-SEven/api-specs/tree/ORDERS-4981 + + +[DEVDOCS-4634]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4634?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/35/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/35/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/34,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/34/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/34/comments,https://api.github.com/repos/bigcommerce/docs/issues/34/events,https://github.com/bigcommerce/docs/pull/34,2075234104,PR_kwDOI7BBSM5juxyV,34,"DEVDOCS-4416: [new] OrdersV2, Get all orders; download and shipping consignments ",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-10T21:27:18Z,2024-02-26T17:44:37Z,2024-02-26T17:44:34Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/34,https://github.com/bigcommerce/docs/pull/34,https://github.com/bigcommerce/docs/pull/34.diff,https://github.com/bigcommerce/docs/pull/34.patch,,"# [DEVDOCS-4416] + +## What changed? +* Add updated required field info for Get All Orders +* Add usage notes to Get All Orders +* Add Shipping and Consignment examples to the body request + +## Anything else? +Related to PR: +- [Orders-4833](https://github.com/bigcommerce/api-specs/commit/248788eb72bcd619fd4a57dce567408010d0d627) + + +[DEVDOCS-4416]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4416?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/34/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/34/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/33,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/33/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/33/comments,https://api.github.com/repos/bigcommerce/docs/issues/33/events,https://github.com/bigcommerce/docs/issues/33,2075223525,I_kwDOI7BBSM57sWXl,33,Feedback for “Installing Stencil CLI”,bobghkuranda,89850935,MDQ6VXNlcjg5ODUwOTM1,https://avatars.githubusercontent.com/u/89850935?v=4,,https://api.github.com/users/bobghkuranda,https://github.com/bobghkuranda,https://api.github.com/users/bobghkuranda/followers,https://api.github.com/users/bobghkuranda/following{/other_user},https://api.github.com/users/bobghkuranda/gists{/gist_id},https://api.github.com/users/bobghkuranda/starred{/owner}{/repo},https://api.github.com/users/bobghkuranda/subscriptions,https://api.github.com/users/bobghkuranda/orgs,https://api.github.com/users/bobghkuranda/repos,https://api.github.com/users/bobghkuranda/events{/privacy},https://api.github.com/users/bobghkuranda/received_events,User,false,"[{""id"":6404039725,""node_id"":""LA_kwDOI7BBSM8AAAABfbXkLQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/stencil"",""name"":""stencil"",""color"":""65B9F5"",""default"":false,""description"":""""},{""id"":6404041419,""node_id"":""LA_kwDOI7BBSM8AAAABfbXqyw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/bug-report"",""name"":""bug-report"",""color"":""9D12DF"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-10T21:19:33Z,2024-01-14T17:37:45Z,2024-01-14T17:37:44Z,NONE,,,,,,,,"Following this guide at the time of writing install gives a couple unsupported versions warnings on MacOS Sonoma + +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-cli@7.3.1', +npm WARN EBADENGINE required: { node: '>=16.0.0 <19.0.0', npm: '>=8.0.0 <10.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.10.0', npm: '10.2.3' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-styles@5.2.0', +npm WARN EBADENGINE required: { node: '>=16.0.0 <19.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.10.0', npm: '10.2.3' } +npm WARN EBADENGINE } +npm WARN deprecated @npmcli/move-file@1.1.2: This functionality has been moved to @npmcli/fs +npm WARN deprecated @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs +npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue +npm WARN deprecated mkdirp@0.3.5: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) +npm WARN deprecated coffee-script@1.7.1: CoffeeScript on NPM has moved to ""coffeescript"" (no hyphen) + +Running stencil bundle then conflicts with the Node version the instructions listed to install + +Error: You are running an unsupported version of node. Please upgrade to >=16.0.0 <19.0.0",https://api.github.com/repos/bigcommerce/docs/issues/33/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/33/timeline,,completed,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/32,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/32/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/32/comments,https://api.github.com/repos/bigcommerce/docs/issues/32/events,https://github.com/bigcommerce/docs/pull/32,2074894799,PR_kwDOI7BBSM5jtnS5,32,"ISSUE-30: [update] Embedded Checkout tutorial, update callout about where to find channels",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-01-10T17:59:06Z,2024-01-10T18:02:42Z,2024-01-10T18:02:41Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/32,https://github.com/bigcommerce/docs/pull/32,https://github.com/bigcommerce/docs/pull/32.diff,https://github.com/bigcommerce/docs/pull/32.patch,2024-01-10T18:02:41Z,"<!-- Ticket number or summary of work --> +# Fix for +* #30 + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* update callout about where to find channels + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Updated channels information in the Embedded Checkout tutorial + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* #30 +* #23 +* #25 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/32/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/32/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/31,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/31/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/31/comments,https://api.github.com/repos/bigcommerce/docs/issues/31/events,https://github.com/bigcommerce/docs/issues/31,2074204925,I_kwDOI7BBSM57odr9,31,Migrate open issues from api-specs,Charlieface,124264953,U_kgDOB2gh-Q,https://avatars.githubusercontent.com/u/124264953?v=4,,https://api.github.com/users/Charlieface,https://github.com/Charlieface,https://api.github.com/users/Charlieface/followers,https://api.github.com/users/Charlieface/following{/other_user},https://api.github.com/users/Charlieface/gists{/gist_id},https://api.github.com/users/Charlieface/starred{/owner}{/repo},https://api.github.com/users/Charlieface/subscriptions,https://api.github.com/users/Charlieface/orgs,https://api.github.com/users/Charlieface/repos,https://api.github.com/users/Charlieface/events{/privacy},https://api.github.com/users/Charlieface/received_events,User,false,"[{""id"":5127839170,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdwg"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/wip"",""name"":""wip"",""color"":""006b75"",""default"":false,""description"":""work in progress PRs, not ready for review""}]",open,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-10T11:49:41Z,2024-01-16T16:34:35Z,,NONE,,,,,,,,"All open issues from the old archived repo bigcommerce/api-specs should be migrated. + +it would be helpful if they were actually responded to as well, because most of them have been open for some time with no response.",https://api.github.com/repos/bigcommerce/docs/issues/31/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/31/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/30,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/30/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/30/comments,https://api.github.com/repos/bigcommerce/docs/issues/30/events,https://github.com/bigcommerce/docs/issues/30,2073351250,I_kwDOI7BBSM57lNRS,30,Inaccuracy in documentation for embedded checkout,Tigatok,3906461,MDQ6VXNlcjM5MDY0NjE=,https://avatars.githubusercontent.com/u/3906461?v=4,,https://api.github.com/users/Tigatok,https://github.com/Tigatok,https://api.github.com/users/Tigatok/followers,https://api.github.com/users/Tigatok/following{/other_user},https://api.github.com/users/Tigatok/gists{/gist_id},https://api.github.com/users/Tigatok/starred{/owner}{/repo},https://api.github.com/users/Tigatok/subscriptions,https://api.github.com/users/Tigatok/orgs,https://api.github.com/users/Tigatok/repos,https://api.github.com/users/Tigatok/events{/privacy},https://api.github.com/users/Tigatok/received_events,User,false,"[{""id"":6404041419,""node_id"":""LA_kwDOI7BBSM8AAAABfbXqyw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/bug-report"",""name"":""bug-report"",""color"":""9D12DF"",""default"":false,""description"":""""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-09T23:54:28Z,2024-01-10T19:06:45Z,2024-01-10T19:06:45Z,NONE,,,,,,,,"Under [creating a Channel](https://developer.bigcommerce.com/docs/storefront/cart-checkout/embedded-checkout/tutorial#creating-a-channel), it is mentioned that +>Channels created by API are visible in the store control panel in Products > Listed On. The Orders section also includes a channel filter. + +However, I cannot seem to find where that is. Screenshot shows the Product menu, with no ""Listed On"" spot: +<img width=""255"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/3906461/251b795f-1b85-41be-9d14-3ef4ae64115f""> + +I _think_ you can view the channels when you go to the channels manager, listed here: *.mybigcommerce.com/manage/channel-manager",https://api.github.com/repos/bigcommerce/docs/issues/30/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/30/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/29,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/29/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/29/comments,https://api.github.com/repos/bigcommerce/docs/issues/29/events,https://github.com/bigcommerce/docs/pull/29,2073322995,PR_kwDOI7BBSM5joQ8I,29,[No-Ticket] Child PR,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",open,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-09T23:18:41Z,2024-06-17T19:12:30Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/29,https://github.com/bigcommerce/docs/pull/29,https://github.com/bigcommerce/docs/pull/29.diff,https://github.com/bigcommerce/docs/pull/29.patch,,"<!-- Ticket number or summary of work --> +No ticket. A child PR branch to fix grammar issues. + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/29/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/29/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/28,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/28/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/28/comments,https://api.github.com/repos/bigcommerce/docs/issues/28/events,https://github.com/bigcommerce/docs/pull/28,2073277571,PR_kwDOI7BBSM5joHIo,28,"DEVDOCS-3806: [update] Orders, Get transaction orders endpoint to include BigCommerce",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-09T22:31:40Z,2024-04-26T23:40:10Z,2024-04-26T23:40:09Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/28,https://github.com/bigcommerce/docs/pull/28,https://github.com/bigcommerce/docs/pull/28.diff,https://github.com/bigcommerce/docs/pull/28.patch,2024-04-26T23:40:09Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-3806] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove giftcertificate and storecredit values from gateway +* Add bigcommerce as a gateway value +* Remove status field from gift_certificate object + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* The latest updates are available for the Get Transactions APIs which now allows merchants to select BigCommerce as a Gateway type. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-3806]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-3806?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/28/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/28/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/27,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/27/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/27/comments,https://api.github.com/repos/bigcommerce/docs/issues/27/events,https://github.com/bigcommerce/docs/pull/27,2073198869,PR_kwDOI7BBSM5jn1u6,27,DEVDOCS-5718: [update] change back to node 18,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-09T21:29:11Z,2024-01-14T17:34:24Z,2024-01-14T17:34:23Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/27,https://github.com/bigcommerce/docs/pull/27,https://github.com/bigcommerce/docs/pull/27.diff,https://github.com/bigcommerce/docs/pull/27.patch,2024-01-14T17:34:23Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5718] + + +## What changed? +See [Issue 17](https://github.com/bigcommerce/docs/issues/17) + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5718]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5718?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/27/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/27/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/26,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/26/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/26/comments,https://api.github.com/repos/bigcommerce/docs/issues/26/events,https://github.com/bigcommerce/docs/pull/26,2073177325,PR_kwDOI7BBSM5jnw9Y,26,"DEVDOCS-5706: [update] Orders V2, update order_source definition",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-09T21:13:00Z,2024-01-15T02:10:44Z,2024-01-15T02:10:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/26,https://github.com/bigcommerce/docs/pull/26,https://github.com/bigcommerce/docs/pull/26.diff,https://github.com/bigcommerce/docs/pull/26.patch,2024-01-15T02:10:30Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5706] + + +## What changed? +Updated the `order_source` definition. +See Slack conversation: https://bigcommerce.slack.com/archives/C96P5T3J4/p1704292037915419 + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5706]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5706?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/26/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/26/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/25,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/25/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/25/comments,https://api.github.com/repos/bigcommerce/docs/issues/25/events,https://github.com/bigcommerce/docs/pull/25,2073137305,PR_kwDOI7BBSM5jnoRp,25,"(no ticket): [update] Embedded Checkout, update channel name",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-01-09T20:41:04Z,2024-01-09T20:42:29Z,2024-01-09T20:42:28Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/25,https://github.com/bigcommerce/docs/pull/25,https://github.com/bigcommerce/docs/pull/25.diff,https://github.com/bigcommerce/docs/pull/25.patch,2024-01-09T20:42:28Z,"<!-- Ticket number or summary of work --> +# Fix for #23 + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update channel name to an allowed value + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/25/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/25/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/24,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/24/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/24/comments,https://api.github.com/repos/bigcommerce/docs/issues/24/events,https://github.com/bigcommerce/docs/pull/24,2072934434,PR_kwDOI7BBSM5jm7Z1,24,"[DEVDOCS-5378]: [update] Price lists, Price lists records",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-09T18:30:17Z,2024-01-09T18:32:56Z,2024-01-09T18:32:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/24,https://github.com/bigcommerce/docs/pull/24,https://github.com/bigcommerce/docs/pull/24.diff,https://github.com/bigcommerce/docs/pull/24.patch,2024-01-09T18:32:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5378] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Remove duplicate sentence in the parameters of the Price List Records GET + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* No release notes for this ticket. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5378]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5378?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/24/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/24/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/23,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/23/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/23/comments,https://api.github.com/repos/bigcommerce/docs/issues/23/events,https://github.com/bigcommerce/docs/issues/23,2072856362,I_kwDOI7BBSM57jUcq,23,Bug in documentation for “Embedded Checkout”,Tigatok,3906461,MDQ6VXNlcjM5MDY0NjE=,https://avatars.githubusercontent.com/u/3906461?v=4,,https://api.github.com/users/Tigatok,https://github.com/Tigatok,https://api.github.com/users/Tigatok/followers,https://api.github.com/users/Tigatok/following{/other_user},https://api.github.com/users/Tigatok/gists{/gist_id},https://api.github.com/users/Tigatok/starred{/owner}{/repo},https://api.github.com/users/Tigatok/subscriptions,https://api.github.com/users/Tigatok/orgs,https://api.github.com/users/Tigatok/repos,https://api.github.com/users/Tigatok/events{/privacy},https://api.github.com/users/Tigatok/received_events,User,false,"[{""id"":6404041419,""node_id"":""LA_kwDOI7BBSM8AAAABfbXqyw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/bug-report"",""name"":""bug-report"",""color"":""9D12DF"",""default"":false,""description"":""""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-09T17:40:21Z,2024-01-09T21:01:19Z,2024-01-09T21:01:19Z,NONE,,,,,,,,"In the ""Creating Channel"" section, it says this: + +Creating a channel +To allow an external website to serve the BigCommerce checkout, create a new channel by sending a POST request to the /channels endpoint. + +POST https://api.bigcommerce.com/stores/{{store_hash}}/v3/channels + +Create a Channel POST request + +{ + ""type"": ""storefront"", + ""platform"": ""custom"", + ""name"": ""https://{your-site}.com"" +} + +The response will contain an id which we will use as the channel_id in future requests. + + +That post does not work. It appears that name cannot contain those items. See from postman: + +<img width=""1103"" alt=""image"" src=""https://github.com/bigcommerce/docs/assets/3906461/aea5bf51-503b-41d8-aaa1-9f464073d850""> +",https://api.github.com/repos/bigcommerce/docs/issues/23/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/23/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/22,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/22/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/22/comments,https://api.github.com/repos/bigcommerce/docs/issues/22/events,https://github.com/bigcommerce/docs/pull/22,2072829083,PR_kwDOI7BBSM5jmkNk,22,"(no ticket): [update] Tax Rates & Zones, file cleanup",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2024-01-09T17:24:30Z,2024-01-09T17:26:12Z,2024-01-09T17:26:11Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/22,https://github.com/bigcommerce/docs/pull/22,https://github.com/bigcommerce/docs/pull/22.diff,https://github.com/bigcommerce/docs/pull/22.patch,2024-01-09T17:26:11Z,"<!-- Ticket number or summary of work --> +# (no ticket): [update] Tax Rates & Zones, file cleanup + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* attempt linting fix to ghost theme: info tag + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Cleaned up syntax in the Tax Rates and Zones file. Artifacts from previous syntax should no longer appear in the site build. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/22/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/22/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/21,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/21/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/21/comments,https://api.github.com/repos/bigcommerce/docs/issues/21/events,https://github.com/bigcommerce/docs/pull/21,2071210615,PR_kwDOI7BBSM5jhDyN,21,"DEVDOCS-5646, [update] Checkouts V3, Add line item discount limits to Add discount to checkout endpoint",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,"[{""id"":5127839043,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdQw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/do%20not%20merge"",""name"":""do not merge"",""color"":""b60205"",""default"":false,""description"":""""},{""id"":6407254365,""node_id"":""LA_kwDOI7BBSM8AAAABfebxXQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/Pending%20cue%20from%20CSS"",""name"":""Pending cue from CSS"",""color"":""CD9523"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-08T20:57:55Z,2024-03-26T20:57:48Z,2024-03-26T20:57:20Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/21,https://github.com/bigcommerce/docs/pull/21,https://github.com/bigcommerce/docs/pull/21.diff,https://github.com/bigcommerce/docs/pull/21.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5646] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Add discount limitations to the Add Discount to Checkout endpoint's description + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* New Checkout promotion feature allows merchants to add a manual discount on select items. + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5646]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5646?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/21/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/21/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/20,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/20/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/20/comments,https://api.github.com/repos/bigcommerce/docs/issues/20/events,https://github.com/bigcommerce/docs/pull/20,2070945856,PR_kwDOI7BBSM5jgJ0K,20,"SELFDEV-415: [repo] deploy.yml, fix deploy cache undefined error",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-08T17:44:57Z,2024-01-08T18:29:17Z,2024-01-08T18:29:16Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/20,https://github.com/bigcommerce/docs/pull/20,https://github.com/bigcommerce/docs/pull/20.diff,https://github.com/bigcommerce/docs/pull/20.patch,2024-01-08T18:29:16Z,"<!-- Ticket number or summary of work --> +# [SELFDEV-415] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Specify that the site should build using a fresh copy of the docs, not a cached version + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[SELFDEV-415]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-415?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/20/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/20/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/19,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/19/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/19/comments,https://api.github.com/repos/bigcommerce/docs/issues/19/events,https://github.com/bigcommerce/docs/pull/19,2070938377,PR_kwDOI7BBSM5jgIJh,19,"[DEVDOCS-5319]: [revise] Catalog/Products/Metafields, Update platform limits across Metafield endpoints",bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false,[],closed,false,"{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-tgomez"",""id"":94003415,""node_id"":""U_kgDOBZpg1w"",""avatar_url"":""https://avatars.githubusercontent.com/u/94003415?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-tgomez"",""html_url"":""https://github.com/bc-tgomez"",""followers_url"":""https://api.github.com/users/bc-tgomez/followers"",""following_url"":""https://api.github.com/users/bc-tgomez/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-tgomez/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-tgomez/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-tgomez/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-tgomez/orgs"",""repos_url"":""https://api.github.com/users/bc-tgomez/repos"",""events_url"":""https://api.github.com/users/bc-tgomez/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-tgomez/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-08T17:40:21Z,2024-01-08T17:44:32Z,2024-01-08T17:44:14Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/19,https://github.com/bigcommerce/docs/pull/19,https://github.com/bigcommerce/docs/pull/19.diff,https://github.com/bigcommerce/docs/pull/19.patch,2024-01-08T17:44:14Z,"# [DEVDOCS-5319] + + +## What changed? + +* Update limit from 50 to 250 across the metafield endpoints + +## Release notes draft + +* Correction: Corrected Metafield endpoint limits to reflect accurate limits from 50 to 250. + +## Anything else? + + + +[DEVDOCS-5319]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5319?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/19/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/19/timeline,,,bc-tgomez,94003415,U_kgDOBZpg1w,https://avatars.githubusercontent.com/u/94003415?v=4,,https://api.github.com/users/bc-tgomez,https://github.com/bc-tgomez,https://api.github.com/users/bc-tgomez/followers,https://api.github.com/users/bc-tgomez/following{/other_user},https://api.github.com/users/bc-tgomez/gists{/gist_id},https://api.github.com/users/bc-tgomez/starred{/owner}{/repo},https://api.github.com/users/bc-tgomez/subscriptions,https://api.github.com/users/bc-tgomez/orgs,https://api.github.com/users/bc-tgomez/repos,https://api.github.com/users/bc-tgomez/events{/privacy},https://api.github.com/users/bc-tgomez/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/18,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/18/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/18/comments,https://api.github.com/repos/bigcommerce/docs/issues/18/events,https://github.com/bigcommerce/docs/pull/18,2070914415,PR_kwDOI7BBSM5jgC_s,18,"DEVDOCS-5575 [update]: Catalog API, categories",bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false,[],closed,false,"{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}]",,1,2024-01-08T17:24:09Z,2024-01-24T16:01:04Z,2024-01-16T17:04:39Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/18,https://github.com/bigcommerce/docs/pull/18,https://github.com/bigcommerce/docs/pull/18.diff,https://github.com/bigcommerce/docs/pull/18.patch,2024-01-16T17:04:39Z,"# [DEVDOCS-5575] + + +## What changed? +* Mark deprecated Categories endpoint, add to Sunsets & Deprecations page +* Mark (main undeprecated) Categories endpoint as the primary endpoint to use +* Change sidebar dividers to the following in the draft screenshot (divider may end up being alphabetical) + +![Screenshot 2024-01-08 at 18 18 03](https://github.com/bigcommerce/docs/assets/96258747/0910a839-643c-4f03-94cf-32f9d2d84a44) + +* Fixed: Get a Category Tree should be under Category Trees divider + +## Release notes draft +* Categories endpoint under the Catalog API helps you to manage Categories, in replace of deprecated Categories endpoint. + +## Relevant PR +* [PR 752](https://github.com/bigcommerce/developer-center/pull/752) -- dev center PR for sidebar + + +Other slack [conversation](https://bigcommerce.slack.com/archives/CN94313CH/p1704391148707289) + + +[DEVDOCS-5575]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5575?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/18/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/18/timeline,,,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/17,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/17/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/17/comments,https://api.github.com/repos/bigcommerce/docs/issues/17/events,https://github.com/bigcommerce/docs/issues/17,2067367554,I_kwDOI7BBSM57OYaC,17,Stencil CLI Node Version 20.10 not supported (yet?),AndrewBarber,135927,MDQ6VXNlcjEzNTkyNw==,https://avatars.githubusercontent.com/u/135927?v=4,,https://api.github.com/users/AndrewBarber,https://github.com/AndrewBarber,https://api.github.com/users/AndrewBarber/followers,https://api.github.com/users/AndrewBarber/following{/other_user},https://api.github.com/users/AndrewBarber/gists{/gist_id},https://api.github.com/users/AndrewBarber/starred{/owner}{/repo},https://api.github.com/users/AndrewBarber/subscriptions,https://api.github.com/users/AndrewBarber/orgs,https://api.github.com/users/AndrewBarber/repos,https://api.github.com/users/AndrewBarber/events{/privacy},https://api.github.com/users/AndrewBarber/received_events,User,false,"[{""id"":6404039725,""node_id"":""LA_kwDOI7BBSM8AAAABfbXkLQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/stencil"",""name"":""stencil"",""color"":""65B9F5"",""default"":false,""description"":""""},{""id"":6404041419,""node_id"":""LA_kwDOI7BBSM8AAAABfbXqyw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/bug-report"",""name"":""bug-report"",""color"":""9D12DF"",""default"":false,""description"":""""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,2,2024-01-05T13:37:37Z,2024-01-14T18:00:02Z,2024-01-14T18:00:01Z,CONTRIBUTOR,,,,,,,,"### Issue +The [stencil-cli install documentation](https://developer.bigcommerce.com/docs/storefront/stencil/cli/install) advises to use node version `20.10.0`, however, most @bigcommerce libraries do not support v20. Instead looking for node versions lower than 19 and higher than 16. + +Using node v20 results in the following errors when using Cornerstone. + +``` +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-cli@7.3.1', +npm WARN EBADENGINE required: { node: '>=16.0.0 <19.0.0', npm: '>=8.0.0 <10.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.10.0', npm: '10.2.3' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-styles@5.2.0', +npm WARN EBADENGINE required: { node: '>=16.0.0 <19.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.10.0', npm: '10.2.3' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@bigcommerce/stencil-utils@6.15.1', +npm WARN EBADENGINE required: { node: '>=14.0.0 <19.0.0' }, +npm WARN EBADENGINE current: { node: 'v20.10.0', npm: '10.2.3' } +npm WARN EBADENGINE } +``` + +The PR seems to be [here](https://github.com/bigcommerce/docs/pull/14). + +### Resolution + +The PR should be reverted to advise to use node v18.15.",https://api.github.com/repos/bigcommerce/docs/issues/17/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/17/timeline,,completed,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/16,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/16/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/16/comments,https://api.github.com/repos/bigcommerce/docs/issues/16/events,https://github.com/bigcommerce/docs/pull/16,2066215700,PR_kwDOI7BBSM5jQNC_,16,DEVDOCS-5111 : [update] add localization information,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,0,2024-01-04T19:26:31Z,2024-01-16T19:26:02Z,2024-01-16T19:26:02Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/16,https://github.com/bigcommerce/docs/pull/16,https://github.com/bigcommerce/docs/pull/16.diff,https://github.com/bigcommerce/docs/pull/16.patch,2024-01-16T19:26:02Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5111] + + +## What changed? +Provide information and a reference to how to localize the files. + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5111]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5111?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/16/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/16/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/15,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/15/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/15/comments,https://api.github.com/repos/bigcommerce/docs/issues/15/events,https://github.com/bigcommerce/docs/pull/15,2065820786,PR_kwDOI7BBSM5jO3-p,15,DEVDOCS-5689: [update] 3DS comment,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-04T15:05:48Z,2024-01-04T17:21:53Z,2024-01-04T17:21:53Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/15,https://github.com/bigcommerce/docs/pull/15,https://github.com/bigcommerce/docs/pull/15.diff,https://github.com/bigcommerce/docs/pull/15.patch,2024-01-04T17:21:52Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5689] + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5689]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5689?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/15/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/15/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/14,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/14/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/14/comments,https://api.github.com/repos/bigcommerce/docs/issues/14/events,https://github.com/bigcommerce/docs/pull/14,2064395515,PR_kwDOI7BBSM5jKGgW,14,DEVDOCS-5703: node sass version,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""}]",closed,false,,[],,0,2024-01-03T17:28:32Z,2024-01-04T15:14:00Z,2024-01-04T15:13:59Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/14,https://github.com/bigcommerce/docs/pull/14,https://github.com/bigcommerce/docs/pull/14.diff,https://github.com/bigcommerce/docs/pull/14.patch,2024-01-04T15:13:59Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5703] + + +## What changed? +Ensuring the node sass versions are consistent + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} + + +[DEVDOCS-5703]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5703?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/14/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/14/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/13,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/13/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/13/comments,https://api.github.com/repos/bigcommerce/docs/issues/13/events,https://github.com/bigcommerce/docs/pull/13,2060038866,PR_kwDOI7BBSM5i8EQf,13,"(no ticket): [external] Stencil, clarify that similar_by_views property is inactive",Bobspadger,1614970,MDQ6VXNlcjE2MTQ5NzA=,https://avatars.githubusercontent.com/u/1614970?v=4,,https://api.github.com/users/Bobspadger,https://github.com/Bobspadger,https://api.github.com/users/Bobspadger/followers,https://api.github.com/users/Bobspadger/following{/other_user},https://api.github.com/users/Bobspadger/gists{/gist_id},https://api.github.com/users/Bobspadger/starred{/owner}{/repo},https://api.github.com/users/Bobspadger/subscriptions,https://api.github.com/users/Bobspadger/orgs,https://api.github.com/users/Bobspadger/repos,https://api.github.com/users/Bobspadger/events{/privacy},https://api.github.com/users/Bobspadger/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2023-12-29T13:50:23Z,2024-01-08T17:21:45Z,2024-01-08T17:21:45Z,CONTRIBUTOR,,false,https://api.github.com/repos/bigcommerce/docs/pulls/13,https://github.com/bigcommerce/docs/pull/13,https://github.com/bigcommerce/docs/pull/13.diff,https://github.com/bigcommerce/docs/pull/13.patch,2024-01-08T17:21:45Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-] + +Updates to status related to similar_by_views being disabled on the platform currently. + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Contributing.md updated with latest repository url. +* Added callouts to pages referencing the `similar_by_views` being currently disabled on BC platform and that no data will be returned. + +## Release notes draft +Reduce requests to BC support asking why the `customers also viewed` functionality is not working. + + +## Anything else? + +Related to Merchant support ticket #07492972 + +",https://api.github.com/repos/bigcommerce/docs/issues/13/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/13/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/12,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/12/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/12/comments,https://api.github.com/repos/bigcommerce/docs/issues/12/events,https://github.com/bigcommerce/docs/pull/12,2058938621,PR_kwDOI7BBSM5i6WTZ,12,feat(tax): TAX-1995 Add specs for new TaxZone check endpoint,benpratt77,40374950,MDQ6VXNlcjQwMzc0OTUw,https://avatars.githubusercontent.com/u/40374950?v=4,,https://api.github.com/users/benpratt77,https://github.com/benpratt77,https://api.github.com/users/benpratt77/followers,https://api.github.com/users/benpratt77/following{/other_user},https://api.github.com/users/benpratt77/gists{/gist_id},https://api.github.com/users/benpratt77/starred{/owner}{/repo},https://api.github.com/users/benpratt77/subscriptions,https://api.github.com/users/benpratt77/orgs,https://api.github.com/users/benpratt77/repos,https://api.github.com/users/benpratt77/events{/privacy},https://api.github.com/users/benpratt77/received_events,User,false,[],closed,false,"{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-andreadao"",""id"":96258747,""node_id"":""U_kgDOBbzKuw"",""avatar_url"":""https://avatars.githubusercontent.com/u/96258747?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-andreadao"",""html_url"":""https://github.com/bc-andreadao"",""followers_url"":""https://api.github.com/users/bc-andreadao/followers"",""following_url"":""https://api.github.com/users/bc-andreadao/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-andreadao/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-andreadao/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-andreadao/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-andreadao/orgs"",""repos_url"":""https://api.github.com/users/bc-andreadao/repos"",""events_url"":""https://api.github.com/users/bc-andreadao/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-andreadao/received_events"",""type"":""User"",""site_admin"":false}]",,1,2023-12-28T23:29:55Z,2024-01-24T20:40:20Z,2024-01-18T02:47:40Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/12,https://github.com/bigcommerce/docs/pull/12,https://github.com/bigcommerce/docs/pull/12.diff,https://github.com/bigcommerce/docs/pull/12.patch,2024-01-18T02:47:40Z,"# [DEVDOCS-5714] +Add documentation in api-specs repo for our new ZoneCheck endpoint +https://bigcommercecloud.atlassian.net/browse/TAX-1995 + +## What changed? +* Added new spec file for the `tax/zonecheck` endpoint + +## Anything else? +https://github.com/bigcommerce/api-proxy-java/pull/2659#issuecomment-1859527805 +Specs match the response: +<img width=""1309"" alt=""Screenshot 2023-12-29 at 10 28 52 am"" src=""https://github.com/bigcommerce/docs/assets/40374950/c84912fd-bb52-45af-962c-30c2cdb49b82""> + +ping @bigcommerce/team-shipping + +[DEVDOCS-5714]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5714?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/12/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/12/timeline,,,bc-andreadao,96258747,U_kgDOBbzKuw,https://avatars.githubusercontent.com/u/96258747?v=4,,https://api.github.com/users/bc-andreadao,https://github.com/bc-andreadao,https://api.github.com/users/bc-andreadao/followers,https://api.github.com/users/bc-andreadao/following{/other_user},https://api.github.com/users/bc-andreadao/gists{/gist_id},https://api.github.com/users/bc-andreadao/starred{/owner}{/repo},https://api.github.com/users/bc-andreadao/subscriptions,https://api.github.com/users/bc-andreadao/orgs,https://api.github.com/users/bc-andreadao/repos,https://api.github.com/users/bc-andreadao/events{/privacy},https://api.github.com/users/bc-andreadao/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/11,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/11/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/11/comments,https://api.github.com/repos/bigcommerce/docs/issues/11/events,https://github.com/bigcommerce/docs/pull/11,2058776119,PR_kwDOI7BBSM5i5yhU,11,"Issue-2016 from dev-docs: Orders Overview, remove links that don't fit",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2023-12-28T19:55:49Z,2023-12-28T19:57:04Z,2023-12-28T19:57:03Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/11,https://github.com/bigcommerce/docs/pull/11,https://github.com/bigcommerce/docs/pull/11.diff,https://github.com/bigcommerce/docs/pull/11.patch,2023-12-28T19:57:03Z,"<!-- Ticket number or summary of work --> +# Issue-2016 from dev-docs: Orders Overview, remove links that don't fit + + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* remove links that don't fit + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> +* https://github.com/bigcommerce/dev-docs/issues/2016 + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/11/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/11/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/10,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/10/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/10/comments,https://api.github.com/repos/bigcommerce/docs/issues/10/events,https://github.com/bigcommerce/docs/pull/10,2058736900,PR_kwDOI7BBSM5i5qDt,10,"DEVDOCS-5274:[update] GQL Overview, clarify no multiple sign in support",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""}]",closed,false,,[],,0,2023-12-28T19:01:14Z,2024-01-04T17:24:27Z,2024-01-04T17:24:26Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/10,https://github.com/bigcommerce/docs/pull/10,https://github.com/bigcommerce/docs/pull/10.diff,https://github.com/bigcommerce/docs/pull/10.patch,2024-01-04T17:24:26Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5274] + + +## What changed? +Document the fact that a customer can only be logged into one device at a time + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +Old PR: https://github.com/bigcommerce/dev-docs/pull/2122 + +ping {names} + + +[DEVDOCS-5274]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5274?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/10/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/10/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/9,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/9/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/9/comments,https://api.github.com/repos/bigcommerce/docs/issues/9/events,https://github.com/bigcommerce/docs/pull/9,2058731283,PR_kwDOI7BBSM5i5o6n,9,"DEVDOCS-5665: [Update] Headless, add end-to-end GQL guide",bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":5127839108,""node_id"":""LA_kwDOI7BBSM8AAAABMaSdhA"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/ready%20for%20review"",""name"":""ready for review"",""color"":""6be5b6"",""default"":false,""description"":""This PR is complete and awaiting review""},{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,1,2023-12-28T18:53:30Z,2024-03-20T13:39:55Z,2024-03-20T13:39:55Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/9,https://github.com/bigcommerce/docs/pull/9,https://github.com/bigcommerce/docs/pull/9.diff,https://github.com/bigcommerce/docs/pull/9.patch,2024-03-20T13:39:55Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5665] + + +## What changed? +Create end-to-end GraphQL Guide + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +OLD PR: https://github.com/bigcommerce/dev-docs/pull/2115 + +ping {names} + + +[DEVDOCS-5665]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5665?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/9/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/9/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/8,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/8/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/8/comments,https://api.github.com/repos/bigcommerce/docs/issues/8/events,https://github.com/bigcommerce/docs/pull/8,2058728254,PR_kwDOI7BBSM5i5oSb,8,DEVDOCS-5373: update Add Square v2,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,0,2023-12-28T18:49:00Z,2024-01-25T15:18:07Z,2024-01-25T15:18:06Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/8,https://github.com/bigcommerce/docs/pull/8,https://github.com/bigcommerce/docs/pull/8.diff,https://github.com/bigcommerce/docs/pull/8.patch,2024-01-25T15:18:06Z,"<!-- Ticket number or summary of work --> +# [DEVDOCS-5373] + + +## What changed? +Add Square v2 + +## Release notes draft + +Draft +The newly-released Square V2 payment gateway is available for stored instrument data. See the list of [compatible payment gateways]. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* + +## Anything else? +Old PR: https://github.com/bigcommerce/dev-docs/pull/2085 + +ping {names} + + +[DEVDOCS-5373]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5373?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/8/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/8/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/7,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/7/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/7/comments,https://api.github.com/repos/bigcommerce/docs/issues/7/events,https://github.com/bigcommerce/docs/pull/7,2058716888,PR_kwDOI7BBSM5i5l8W,7,DEVDOCS-4905: [update] Add BlueSnap Direct Payment Gateway,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""}]",closed,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,0,2023-12-28T18:32:42Z,2024-02-27T15:02:43Z,2024-02-27T15:02:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/7,https://github.com/bigcommerce/docs/pull/7,https://github.com/bigcommerce/docs/pull/7.diff,https://github.com/bigcommerce/docs/pull/7.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4905] + + +## What changed? +Add BlueSnap Direct Payment Gateway + +## Release notes draft + +Draft +The newly-released BlueSnap Direct payment gateway is available for raw card and stored instrument data. See the list of [compatible payment gateways]. + + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + + +## Anything else? +OLD PR: https://github.com/bigcommerce/dev-docs/pull/1918 + +ping {names} + + +[DEVDOCS-4905]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4905?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/7/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/7/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/6,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/6/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/6/comments,https://api.github.com/repos/bigcommerce/docs/issues/6/events,https://github.com/bigcommerce/docs/pull/6,2058664736,PR_kwDOI7BBSM5i5a58,6,DEVDOCS-4028: [update] add Access WorldPay to list of payment gateways,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false,"[{""id"":6371419313,""node_id"":""LA_kwDOI7BBSM8AAAABe8QksQ"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/legacy-pr"",""name"":""legacy-pr"",""color"":""B5B08E"",""default"":false,""description"":""PR moved from api-specs and dev-docs""}]",open,false,"{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""bc-traciporter"",""id"":64287776,""node_id"":""MDQ6VXNlcjY0Mjg3Nzc2"",""avatar_url"":""https://avatars.githubusercontent.com/u/64287776?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/bc-traciporter"",""html_url"":""https://github.com/bc-traciporter"",""followers_url"":""https://api.github.com/users/bc-traciporter/followers"",""following_url"":""https://api.github.com/users/bc-traciporter/following{/other_user}"",""gists_url"":""https://api.github.com/users/bc-traciporter/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/bc-traciporter/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/bc-traciporter/subscriptions"",""organizations_url"":""https://api.github.com/users/bc-traciporter/orgs"",""repos_url"":""https://api.github.com/users/bc-traciporter/repos"",""events_url"":""https://api.github.com/users/bc-traciporter/events{/privacy}"",""received_events_url"":""https://api.github.com/users/bc-traciporter/received_events"",""type"":""User"",""site_admin"":false}]",,0,2023-12-28T17:22:35Z,2024-06-17T19:12:29Z,,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/6,https://github.com/bigcommerce/docs/pull/6,https://github.com/bigcommerce/docs/pull/6.diff,https://github.com/bigcommerce/docs/pull/6.patch,,"<!-- Ticket number or summary of work --> +# [DEVDOCS-4028] + + +## What changed? +Add Access WorldPay to list of payment gateways + +## Release notes draft + +Draft: +The newly-released Access WorldPay payment gateway is available for raw card and stored instrument data. See the list of [compatible payment gateways]. + +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + + +## Anything else? +Old PR: https://github.com/bigcommerce/dev-docs/pull/1897 + +ping {names} + + +[DEVDOCS-4028]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-4028?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/6/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/6/timeline,,,bc-traciporter,64287776,MDQ6VXNlcjY0Mjg3Nzc2,https://avatars.githubusercontent.com/u/64287776?v=4,,https://api.github.com/users/bc-traciporter,https://github.com/bc-traciporter,https://api.github.com/users/bc-traciporter/followers,https://api.github.com/users/bc-traciporter/following{/other_user},https://api.github.com/users/bc-traciporter/gists{/gist_id},https://api.github.com/users/bc-traciporter/starred{/owner}{/repo},https://api.github.com/users/bc-traciporter/subscriptions,https://api.github.com/users/bc-traciporter/orgs,https://api.github.com/users/bc-traciporter/repos,https://api.github.com/users/bc-traciporter/events{/privacy},https://api.github.com/users/bc-traciporter/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/5,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/5/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/5/comments,https://api.github.com/repos/bigcommerce/docs/issues/5/events,https://github.com/bigcommerce/docs/issues/5,2058311322,I_kwDOI7BBSM56r1aa,5,Feedback for “Regions”,tvlgiao,1865930,MDQ6VXNlcjE4NjU5MzA=,https://avatars.githubusercontent.com/u/1865930?v=4,,https://api.github.com/users/tvlgiao,https://github.com/tvlgiao,https://api.github.com/users/tvlgiao/followers,https://api.github.com/users/tvlgiao/following{/other_user},https://api.github.com/users/tvlgiao/gists{/gist_id},https://api.github.com/users/tvlgiao/starred{/owner}{/repo},https://api.github.com/users/tvlgiao/subscriptions,https://api.github.com/users/tvlgiao/orgs,https://api.github.com/users/tvlgiao/repos,https://api.github.com/users/tvlgiao/events{/privacy},https://api.github.com/users/tvlgiao/received_events,User,false,"[{""id"":6404027583,""node_id"":""LA_kwDOI7BBSM8AAAABfbW0vw"",""url"":""https://api.github.com/repos/bigcommerce/docs/labels/feature-request"",""name"":""feature-request"",""color"":""ECD1C6"",""default"":false,""description"":""""}]",closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,1,2023-12-28T11:13:42Z,2024-01-09T21:01:40Z,2024-01-09T21:01:40Z,NONE,,,,,,,,"There is no accessible API for obtaining widget layouts, which makes the backup and restoration of widgets impractical. Please add an API endpoint such as `https://api.bigcommerce.com/stores/{store_hash}/v3/content/layouts` for retrieving widget layouts from a specified page.",https://api.github.com/repos/bigcommerce/docs/issues/5/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/5/timeline,,completed,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/4,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/4/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/4/comments,https://api.github.com/repos/bigcommerce/docs/issues/4/events,https://github.com/bigcommerce/docs/pull/4,2057777029,PR_kwDOI7BBSM5i2cm1,4,"(no ticket): [update] Various, fix Customers Overview link",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2023-12-27T21:12:21Z,2023-12-27T21:13:51Z,2023-12-27T21:13:50Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/4,https://github.com/bigcommerce/docs/pull/4,https://github.com/bigcommerce/docs/pull/4.diff,https://github.com/bigcommerce/docs/pull/4.patch,2023-12-27T21:13:50Z,"<!-- Ticket number or summary of work --> +# No ticket: Fix Customers Overview link + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* Update the link to the Customers Overview + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> +* Update broken links + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/4/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/4/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/3,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/3/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/3/comments,https://api.github.com/repos/bigcommerce/docs/issues/3/events,https://github.com/bigcommerce/docs/pull/3,2057750518,PR_kwDOI7BBSM5i2W8Q,3,"(no ticket): [repo] Issue templates, new",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,"{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}","[{""login"":""slsriehl"",""id"":15839167,""node_id"":""MDQ6VXNlcjE1ODM5MTY3"",""avatar_url"":""https://avatars.githubusercontent.com/u/15839167?v=4"",""gravatar_id"":"""",""url"":""https://api.github.com/users/slsriehl"",""html_url"":""https://github.com/slsriehl"",""followers_url"":""https://api.github.com/users/slsriehl/followers"",""following_url"":""https://api.github.com/users/slsriehl/following{/other_user}"",""gists_url"":""https://api.github.com/users/slsriehl/gists{/gist_id}"",""starred_url"":""https://api.github.com/users/slsriehl/starred{/owner}{/repo}"",""subscriptions_url"":""https://api.github.com/users/slsriehl/subscriptions"",""organizations_url"":""https://api.github.com/users/slsriehl/orgs"",""repos_url"":""https://api.github.com/users/slsriehl/repos"",""events_url"":""https://api.github.com/users/slsriehl/events{/privacy}"",""received_events_url"":""https://api.github.com/users/slsriehl/received_events"",""type"":""User"",""site_admin"":false}]",,0,2023-12-27T20:27:41Z,2024-06-14T20:49:43Z,2024-06-14T20:49:42Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/3,https://github.com/bigcommerce/docs/pull/3,https://github.com/bigcommerce/docs/pull/3.diff,https://github.com/bigcommerce/docs/pull/3.patch,2024-06-14T20:49:42Z,"<!-- Ticket number or summary of work --> +# No ticket: issue templates + +## What changed? +<!-- Provide a bulleted list in the present tense --> +* add issue template config and bug report template + +## Release notes draft +<!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. + +Examples: +* The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. +* We're happy to announce [X feature], which can help you [perform Y action]. +* [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. +* Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> + +## Anything else? +<!-- Add related PRs, salient notes, additional ticket numbers, etc. --> + +ping {names} +",https://api.github.com/repos/bigcommerce/docs/issues/3/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/3/timeline,,,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false +https://api.github.com/repos/bigcommerce/docs/issues/2,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/2/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/2/comments,https://api.github.com/repos/bigcommerce/docs/issues/2/events,https://github.com/bigcommerce/docs/pull/2,2049408952,PR_kwDOI7BBSM5iaQfs,2,DEVDOCS-5691: [migration] Add docs from current public repos,slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2023-12-19T20:47:00Z,2023-12-27T17:38:31Z,2023-12-27T17:38:30Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/2,https://github.com/bigcommerce/docs/pull/2,https://github.com/bigcommerce/docs/pull/2.diff,https://github.com/bigcommerce/docs/pull/2.patch,2023-12-27T17:38:30Z,"# [DEVDOCS-5691] + +## What changed? +Provide a bulleted list in the present tense +* dev-docs +* api-specs +* theme-context-object-schemas + +## Anything else? +Add related PRs, salient notes, ticket numbers, etc. + +ping @becomevocal + +[DEVDOCS-5691]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5691?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ",https://api.github.com/repos/bigcommerce/docs/issues/2/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/2/timeline,,,,,,,,,,,,,,,,,,,, +https://api.github.com/repos/bigcommerce/docs/issues/1,https://api.github.com/repos/bigcommerce/docs,https://api.github.com/repos/bigcommerce/docs/issues/1/labels{/name},https://api.github.com/repos/bigcommerce/docs/issues/1/comments,https://api.github.com/repos/bigcommerce/docs/issues/1/events,https://github.com/bigcommerce/docs/pull/1,1581101697,PR_kwDOI7BBSM5JyTt-,1,"(no ticket): [migrate] Specs, remove path parameters",slsriehl,15839167,MDQ6VXNlcjE1ODM5MTY3,https://avatars.githubusercontent.com/u/15839167?v=4,,https://api.github.com/users/slsriehl,https://github.com/slsriehl,https://api.github.com/users/slsriehl/followers,https://api.github.com/users/slsriehl/following{/other_user},https://api.github.com/users/slsriehl/gists{/gist_id},https://api.github.com/users/slsriehl/starred{/owner}{/repo},https://api.github.com/users/slsriehl/subscriptions,https://api.github.com/users/slsriehl/orgs,https://api.github.com/users/slsriehl/repos,https://api.github.com/users/slsriehl/events{/privacy},https://api.github.com/users/slsriehl/received_events,User,false,[],closed,false,,[],,0,2023-02-12T03:15:55Z,2023-12-07T20:21:36Z,2023-12-07T20:21:35Z,MEMBER,,false,https://api.github.com/repos/bigcommerce/docs/pulls/1,https://github.com/bigcommerce/docs/pull/1,https://github.com/bigcommerce/docs/pull/1.diff,https://github.com/bigcommerce/docs/pull/1.patch,,"# (no ticket): [migrate] Specs, remove path parameters + +## What changed? + +* All the server definitions and a lot of auth stuff also + +## Anything else? + +Related PRs, salient notes, etc +",https://api.github.com/repos/bigcommerce/docs/issues/1/reactions,0,0,0,0,0,0,0,0,0,https://api.github.com/repos/bigcommerce/docs/issues/1/timeline,,,,,,,,,,,,,,,,,,,, \ No newline at end of file From d6f954b9130630b8b3090d1bf77ff6b516a01b01 Mon Sep 17 00:00:00 2001 From: Chris Nanninga <chris.nanninga@bigcommerce.com> Date: Wed, 24 Jul 2024 09:45:49 -0500 Subject: [PATCH 097/221] Remove inaccurate note about deleting consignment unassociated a cart from a customer (#395) The API reference for deleting a Consignment contains a note that deleting a checkout's last consignment removes the cart from its assigned customer. This has been tested and found to be inaccurate, and Valentin Dellangela verified it should be removed. --- reference/checkouts.v3.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index 58f5a5120..d52507797 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -5608,8 +5608,6 @@ paths: summary: Delete Checkout Consignment description: |- Removes an existing consignment from a checkout. - - Removing the last consignment will remove the cart from the customer it is assigned to. Create a new redirect URL for the customer so they can access the cart again. operationId: deleteCheckoutConsignment responses: '200': From 4b0da286abcafafd42bee02f7242b7c7b4ae163a Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 24 Jul 2024 10:46:03 -0500 Subject: [PATCH 098/221] DEVDOCS-5558 [new]: Widget theme regions, add channel_id query parameter (#376) --- reference/widgets.v3.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/reference/widgets.v3.yml b/reference/widgets.v3.yml index 7c5fead88..7d9f9417c 100644 --- a/reference/widgets.v3.yml +++ b/reference/widgets.v3.yml @@ -469,8 +469,16 @@ paths: parameters: - $ref: '#/components/parameters/Accept' - $ref: '#/components/parameters/RequiredTemplateFile' + - $ref: '#/components/parameters/ChannelID' components: parameters: + ChannelID: + name: channel_id + description: The channel ID. + required: false + in: query + schema: + type: string TemplateUUID: name: uuid description: The identifier for a specific template. @@ -509,7 +517,7 @@ components: type: string RequiredTemplateFile: in: query - name: templateFile + name: template_file description: 'The template file, for example: `templateFile=pages/home`.' required: true schema: From 2cab53f1d618f071d3fdd9e254e87ed255be7ff2 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Wed, 24 Jul 2024 11:47:11 -0500 Subject: [PATCH 099/221] [DEVDOCS-6041]: [update] Storefront GQL Orders object, Remove beta flags (#396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6041] ## What changed? <!-- Provide a bulleted list in the present tense --> * Remove beta flag * Remove beta callout ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Storefront GraphQL Orders capabilities are now available to the public. You can now perform queries that fetch a customer's orders history, a specific customer order, and access order details. See a list of examples in [GraphQL Storefront API: Customers](https://developer.bigcommerce.com/docs/storefront/graphql/customers) and try them in the [BigCommerce GraphQL Playground](https://developer.bigcommerce.com/graphql-storefront/playground). ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @jamie-mckenzie [DEVDOCS-6041]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6041?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/storefront/graphql/customers.mdx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/storefront/graphql/customers.mdx b/docs/storefront/graphql/customers.mdx index da380ae92..995f6a961 100644 --- a/docs/storefront/graphql/customers.mdx +++ b/docs/storefront/graphql/customers.mdx @@ -1,8 +1,4 @@ -# GraphQL Storefront API: Customers (Beta) - -<Callout type="info"> - This feature is currently in beta and is only available to participants. -</Callout> +# GraphQL Storefront API: Customers BigCommerce's GraphQL Storefront API Customers powers access to customer objects such as the ability to update a customer, get a customer address book, reset a password, and more. Developers can use GraphQL Storefront API to create an end-to-end shopper experience and manage some customer account use cases. From 600d8fed0a7320cf18d25177dd31356e6c1e9bb3 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:59:23 -0500 Subject: [PATCH 100/221] DEVDOCS-5654 [new]: Page Widgets, add docs & reference (#390) --- .../storefront/widgets/page-widgets/guide.mdx | 997 ++++++++++++++++++ .../storefront/widgets/page-widgets/index.mdx | 80 ++ reference/page-widgets.v3.yml | 870 +++++++++++++++ 3 files changed, 1947 insertions(+) create mode 100644 docs/storefront/widgets/page-widgets/guide.mdx create mode 100644 docs/storefront/widgets/page-widgets/index.mdx create mode 100644 reference/page-widgets.v3.yml diff --git a/docs/storefront/widgets/page-widgets/guide.mdx b/docs/storefront/widgets/page-widgets/guide.mdx new file mode 100644 index 000000000..79d11d476 --- /dev/null +++ b/docs/storefront/widgets/page-widgets/guide.mdx @@ -0,0 +1,997 @@ +# Guide to page widgets + +<Callout type="warning"> + A POST request to [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) deletes any and all existing data for the requested page and replaces it with the data in the request payload. +</Callout> + +## Prerequisites + +- A BigCommerce sandbox store, staging store, or trial store +- A store-level or app-level API Account with [OAuth scopes](/docs/start/authentication#oauth-scopes) that include the following. Pass the API account's access token as the value of the `X-Auth-Token` header. For more information, see [Authentication and Example Requests](/docs/start/authentication#access-tokens). + +| UI Name | Permission | Parameter | Description | +|:--------|:-----------|:----------|:------------| +| Content | modify | `store_v2_content` | View and modify store content | + +## Get a page snapshot + +To download a snapshot of a single page's regions, layouts, dropzones, and widgets, use the [Get a page snapshot](/docs/rest-content/page-widgets#get-a-page-snapshot) endpoint. + +You can use a number of query parameters to describe the page features you want to retrieve. See more descriptions, defaults, and examples in the [REST Content API reference](/docs/rest-content/page-widgets#get-a-page-snapshot) + +| Parameter | Required | Description | +|:----------|:---------|:------------| +| `channel_id` | no | The channel ID of the subject storefront. | +| `template_file` | no | The name of the subject theme template file. If you want a snapshot of global regions in a storefront, do not include a value for the `template_file` query parameter. | +| `entity_id` | no | If you want a snapshot of global regions in a storefront, do not include a value for the `entity_id` query parameter. | + +<Callout type="info"> + Some template files don't have an entity ID. For example, the `pages/home` + template file doesn't have an entity ID. +</Callout> + +<Tabs items={["Request", "Response"]}> + <Tab> + ```http filename="Get a page snapshot" copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/page-widgets?channel_id={{CHANNEL_ID}}&template_file={{TEMPLATE_FILE}}&entity_id={{ENTITY_ID}} + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + </Tab> + + <Tab> + ```json filename="Get a page snapshot" showLineNumbers copy + { + "data": { + "regions": [ + { + "name": "home_below_menu", + "children": [ + { + "widget_template_uuid": "d181ebd5-f42c-4f96-8f9d-c605023f5cb6", + "configuration": { + "title": "Hero Banner Title", + "subtitle": "Add a description for this hero banner. This is a great place to highlight a promotion.", + "buttonText": "Shop now", + "contentAlignment": { + "horizontal": "left" + }, + "containerHeight": "small", + "backgroundType": "image", + "backgroundColor": "#444444", + "imageUrl": { + "src": "https://images.unsplash.com/photo-1533038590840-1cde6e668a91?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2000&q=100", + "type": "IMAGE_MANAGER" + }, + "imageFit": "fill", + "imageParallax": "off", + "imageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "imageOpacity": 100, + "titleVisible": "show", + "titleStyle": "default", + "titleFontFamily": "inherit", + "titleFontWeight": "400", + "titleFontSize": { + "value": 36, + "type": "px" + }, + "descriptionVisible": "show", + "descriptionStyle": "default", + "descriptionFontFamily": "inherit", + "descriptionFontWeight": "400", + "descriptionFontSize": { + "value": 21, + "type": "px" + }, + "textColor": "#444444", + "mobileTextColor": "#444444", + "buttonVisible": "show", + "buttonFont": "default", + "buttonFontFamily": "inherit", + "buttonStyle": "round", + "buttonColor": "#444444", + "mobileButtonColor": "#444444", + "buttonTextColor": "rgba(255,255,255,1)", + "mobileButtonTextColor": "rgba(255,255,255,1)" + }, + "storefront_api_query_params": {}, + "name": "Hero Banner", + "description": "", + "type": "widget" + } + ] + }, + { + "name": "header_bottom", + "children": [ + { + "layout_template_uuid": "7d42d0b1-1152-4ce3-a6c1-3709f786f295", + "configuration": { + "columnWeights": ["33.333333%", "33.333333%", "33.333333%"], + "layoutBackgroundColor": "rgba(0,0,0,0)", + "layoutBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "layoutBackgroundImageFit": "fill", + "layoutBackgroundImageOpacity": 100, + "layoutBackgroundImageUrl": "", + "layoutBorderColor": "#333333", + "layoutBorderStyle": "solid", + "layoutBorderThickness": 0, + "layoutHeight": "", + "layoutMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "layoutPadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "numberOfDropzones": 3, + "layoutBackgroundType": "", + "layoutZIndex": "auto", + "name": "layout" + }, + "name": "Layout", + "dropzones": [ + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "77" + }, + "storefront_api_query_params": { + "productId": 77 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + }, + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "80" + }, + "storefront_api_query_params": { + "productId": 80 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + }, + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "93" + }, + "storefront_api_query_params": { + "productId": 93 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + } + ], + "type": "layout" + } + ] + } + ] + }, + "meta": {} + } + ``` + </Tab> +</Tabs> + +## Publish or overwrite a page + +To publish or overwrite the content of a page, use the [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) endpoint. One way to prepare a publication payload is to [Get a snapshot](#get-a-page-snapshot) of a page that you want to copy or modify. The snapshot contains region data that you can use as a request body payload for the [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) endpoint. + +<Callout type="warning"> + When starting with a snapshot from another storefront, make sure to replace + any store or channel-specific data in the request body. +</Callout> + +| Property | Required | Description | +|:---------|:---------|:------------| +| `channel_id` | yes | The channel ID of the target storefront. | +| `template_file` | no | The name of the target theme template file. | +| `entity_id` | no | | + +Ensure that you have the `widget_template_uuid` of each widget you want to publish. The `widget_template_uuid` is unique to each store channel. If you are publishing to a different store or channel than you got the page snapshot from, you must re-register any widget templates you use in the target store channel using the [Create a widget template](/docs/rest-content/widgets/widget-template#create-a-widget-template) endpoint. In your payload for the [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) endpoint, substitute the correct `widget_template_uuid` for the target store or channel. + +In addition, some widgets might require store or channel-specific data in the `configuration` or `storefront_api_query_params` objects. Notice `productId` in `configuration` or `storefront_api_query_params` in the following example. In this case, the correct `productId` corresponds with the desired product on the target store and channel. + +A successful request to the [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) endpoint returns a `201 Created` status code, and does not return a response body. + +<Tabs items={["Request", "Response"]}> + <Tab> + ```http filename="Publish or overwrite a page" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/content/page-widgets + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + Content-Type: application/json + + { + "channel_id": 1, + "template_file": "pages/page", + "entity_id": "5", + "regions": [ + { + "name": "home_below_menu", + "children": [ + { + "widget_template_uuid": "d181ebd5-f42c-4f96-8f9d-c605023f5cb6", + "configuration": { + "title": "Hero Banner Title", + "subtitle": "Add a description for this hero banner. This is a great place to highlight a promotion.", + "buttonText": "Shop now", + "contentAlignment": { + "horizontal": "left" + }, + "containerHeight": "small", + "backgroundType": "image", + "backgroundColor": "#444444", + "imageUrl": { + "src": "https://images.unsplash.com/photo-1533038590840-1cde6e668a91?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2000&q=100", + "type": "IMAGE_MANAGER" + }, + "imageFit": "fill", + "imageParallax": "off", + "imageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "imageOpacity": 100, + "titleVisible": "show", + "titleStyle": "default", + "titleFontFamily": "inherit", + "titleFontWeight": "400", + "titleFontSize": { + "value": 36, + "type": "px" + }, + "descriptionVisible": "show", + "descriptionStyle": "default", + "descriptionFontFamily": "inherit", + "descriptionFontWeight": "400", + "descriptionFontSize": { + "value": 21, + "type": "px" + }, + "textColor": "#444444", + "mobileTextColor": "#444444", + "buttonVisible": "show", + "buttonFont": "default", + "buttonFontFamily": "inherit", + "buttonStyle": "round", + "buttonColor": "#444444", + "mobileButtonColor": "#444444", + "buttonTextColor": "rgba(255,255,255,1)", + "mobileButtonTextColor": "rgba(255,255,255,1)" + }, + "storefront_api_query_params": {}, + "name": "Hero Banner", + "description": "", + "type": "widget" + } + ] + }, + { + "name": "header_bottom", + "children": [ + { + "layout_template_uuid": "7d42d0b1-1152-4ce3-a6c1-3709f786f295", + "configuration": { + "columnWeights": [ + "33.333333%", + "33.333333%", + "33.333333%" + ], + "layoutBackgroundColor": "rgba(0,0,0,0)", + "layoutBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "layoutBackgroundImageFit": "fill", + "layoutBackgroundImageOpacity": 100, + "layoutBackgroundImageUrl": "", + "layoutBorderColor": "#333333", + "layoutBorderStyle": "solid", + "layoutBorderThickness": 0, + "layoutHeight": "", + "layoutMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "layoutPadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "numberOfDropzones": 3, + "layoutBackgroundType": "", + "layoutZIndex": "auto", + "name": "Layout" + }, + "name": "Layout", + "dropzones": [ + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "77" + }, + "storefront_api_query_params": { + "productId": 77 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + }, + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "80" + }, + "storefront_api_query_params": { + "productId": 80 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + }, + { + "configuration": { + "dropzoneBackgroundColor": "rgba(0,0,0,0)", + "dropzoneBackgroundImageAlignment": { + "horizontal": "center", + "vertical": "middle" + }, + "dropzoneBackgroundImageFit": "fill", + "dropzoneBackgroundImageOpacity": 100, + "dropzoneBackgroundImageUrl": "", + "dropzoneBorderColor": "#333333", + "dropzoneBorderStyle": "solid", + "dropzoneBorderThickness": 0, + "dropzoneHeight": "", + "dropzoneJustifyContent": "center", + "dropzoneMargin": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "0" + }, + "right": { + "type": "px", + "value": "0" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzonePadding": { + "bottom": { + "type": "px", + "value": "0" + }, + "left": { + "type": "px", + "value": "10.5" + }, + "right": { + "type": "px", + "value": "10.5" + }, + "top": { + "type": "px", + "value": "0" + } + }, + "dropzoneZIndex": "auto", + "dropzoneBackgroundType": "" + }, + "widgets": [ + { + "widget_template_uuid": "e59c1412-2d85-4f18-ab4b-8a55412d945c", + "configuration": { + "productCardContentAlignment": { + "horizontal": "center" + }, + "productImage": { + "visibility": "show", + "imageFit": "fill" + }, + "brand": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productName": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "price": { + "visibility": "show", + "textStyle": "default", + "color": "#444444" + }, + "productRating": { + "visibility": "hide", + "starColorFilled": "#3C64F4", + "starColorEmpty": "#ECEEF5", + "reviewsColor": "#8C93AD" + }, + "button": { + "visibility": "hide", + "shape": "round", + "buttonColor": "rgba(68,68,68,1)", + "textStyle": "default", + "buttonTextColor": "rgba(255,255,255,1)", + "buttonActionType": "addToCart" + }, + "productId": "93" + }, + "storefront_api_query_params": { + "productId": 93 + }, + "name": "Product", + "description": "", + "type": "widget" + } + ] + } + ], + "type": "layout" + } + ] + } + ] + } + ``` + </Tab> + + <Tab> + ```http filename="Publish or overwrite a page" copy + 201 Created + ``` + </Tab> +</Tabs> + +## Resources + +- [Page widgets overview](/docs/storefront/widgets/page-widgets) + +### REST Content API reference + +- [Page widgets](/docs/rest-content/page-widgets) +- [Widgets](/docs/rest-content/widgets) + diff --git a/docs/storefront/widgets/page-widgets/index.mdx b/docs/storefront/widgets/page-widgets/index.mdx new file mode 100644 index 000000000..5dc64dfa9 --- /dev/null +++ b/docs/storefront/widgets/page-widgets/index.mdx @@ -0,0 +1,80 @@ +# Overview: Page widgets + +<Callout type="warning"> + A POST request to [Publish or overwrite a page](/docs/rest-content/page-widgets#publish-or-overwrite-page-content) deletes any and all existing data for the requested page and replaces it with the data in the request payload. +</Callout> + +The page widgets feature supports the following actions: + +* Duplicating pages +* Modifying widget content for an entire page using a single API call +* Migrating page widgets and layout configurations from a staging store to production store +* Moving page widgets from store to store or channel to channel +* Storing snapshots of page widgets and layout configurations +* Restoring page widgets and layout configurations + +## Concepts and limits + +Page widgets make page layouts portable by dividing pages into **regions**, **layouts**, **dropzones**, and **widgets**. The following sections describe the properties and relationships of the page widgets objects. + +![Diagram of conceptual relationships in the page widgets feature](https://storage.googleapis.com/bigcommerce-production-dev-center/images/page-widgets/conceptual-relationships.png) + +### Regions + +A region object contains the following properties: + +| Property | Type | Description | +|:---------|:-----|:------------| +| `name` | string | Matches the name specified as `{{{region_name="..."}}}` in a theme template file. | +| `children` | array | Consists of [layout](#layouts) and/or [widget](#widgets) objects.| + +### Layouts + +<Callout type="info"> + **Limits** for layout objects: - per page: 150 - per channel: 10,000 +</Callout> + +A layout object contains the following properties: + +| Property | Type | Description | +|:---------|:-----|:------------| +| `layout_template_uuid` | UUID string | Set by BigCommerce. Read-only. | +| `configuration` | object | A JSON object that describes the Page Builder options menu that corresponds with the layout. | +| `name` | string | A human-readable label for the layout; displays in Page Builder. | +| `dropzones` | array | Consists of [dropzone](#dropzones) objects. | +| `type` | string, enum | `layout` | + +### Dropzones + +Dropzones are any areas in a layout in which a widget can be dropped. A dropzone object contains the following properties: + +| Property | Type | Description | +|:---------|:-----|:------------| +| `configuration` | object | A JSON object that describes the Page Builder options menu that corresponds with the dropzone. | +| `widgets` | array | Consists of [widget](#widgets) objects. | + +### Widgets + +<Callout type="info"> + **Limits** for widget objects: - per page: 150 - per channel: 50,000 +</Callout> + +A widget object contains the following properties: + +| Property | Type | Description | +|:---------|:-----|:------------| +| `widget_template_uuid` | UUID string | The unique identifier of the parent widget template; set by the store or channel where the widget template originated. | +| `configuration` | object | A JSON object that describes the Page Builder options menu that corresponds with the widget. | +| `storefront_api_query_params` | string | A comma-separated list of parameters used to query the GraphQL Storefront API. Used when the parent widget template is configured to request data directly from the GraphQL Storefront API; in this case, the parent widget template has the `storefront_api_query` property. | +| `name` | string | A human-readable label for the widget. Retrievable using either the [Get a widget](/docs/rest-content/widgets/widget#get-a-widget) or the [Get all widgets](/docs/rest-content/widgets/widget#get-all-widgets) endpoint. | +| `description` | string | A description of the widget. Retrievable using either the [Get a widget](/docs/rest-content/widgets/widget#get-a-widget) or the [Get all widgets](/docs/rest-content/widgets/widget#get-all-widgets) endpoint. | +| `type` | string, enum | `widget` | + +## Resources + +- [Guide to page widgets](/docs/storefront/widgets/page-widgets/guide) + +### REST Content API reference + +- [Page widgets](/docs/rest-content/page-widgets) +- [Widgets](/docs/rest-content/widgets) diff --git a/reference/page-widgets.v3.yml b/reference/page-widgets.v3.yml new file mode 100644 index 000000000..7b81542ad --- /dev/null +++ b/reference/page-widgets.v3.yml @@ -0,0 +1,870 @@ +openapi: '3.0.3' +info: + title: Page widgets + version: '1.0' + description: |- + The page widgets feature of the REST Content API makes page layouts portable by dividing pages into **regions**, **layouts**, **dropzones**, and **widgets**. + + ![Diagram of conceptual relationships in the page widgets feature](https://storage.googleapis.com/bigcommerce-production-dev-center/images/page-widgets/conceptual-relationships.png) + + The page widgets feature is an extension of the [widgets feature](/docs/rest-content/widgets). You can work with widget objects using either set of endpoints. For more about using page widgets, see the [Page widgets overview](/docs/storefront/widgets/page-widgets). + + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Page Widgets +paths: + '/content/page-widgets': + parameters: + - $ref: '#/components/parameters/Accept' + - $ref: '#/components/parameters/User-Agent' + - $ref: '#/components/parameters/X-Correlation-Id' + get: + tags: + - Page Widgets + summary: Get a page snapshot + description: Get a snapshot of all the page widget regions for a given channel, template file, or entity. + operationId: getPageWidgets + parameters: + - $ref: '#/components/parameters/ChannelId' + - $ref: '#/components/parameters/TemplateFile' + - $ref: '#/components/parameters/EntityId' + responses: + '200': + $ref: '#/components/responses/GetPageSnapshot_Response' + '422': + $ref: '#/components/responses/GetErrorResponse' + post: + tags: + - Page Widgets + summary: Publish or overwrite page content + description: Publish or overwrite the content of a page that uses page widgets. + operationId: createPageWidgets + parameters: + - $ref: '#/components/parameters/Content-Type' + requestBody: + $ref: '#/components/requestBodies/PublishOrOverwrite_Request' + responses: + '204': + description: The request was successful. No response body is returned. + '422': + $ref: '#/components/responses/CreateErrorResponse' +components: + schemas: + publish: + title: Publish or overwrite request + type: object + properties: + regions: + type: array + items: + $ref: '#/components/schemas/region' + template_file: + type: string + description: The template file that you would like to target. Leave it empty if the request is for Global regions. + entity_id: + type: string + description: The identifier of a page you would like to target. For product pages, choose product ID. For category pages, choose category ID. Home page does not support `entity_id`. Leave it empty if the request is for Global regions. + channel_id: + type: integer + description: The id of the channel on which to create this placement. Defaults to the first channel created on the store. + example: 1 + required: + - regions + example: + template_file: pages/page + entity_id: '5' + channel_id: 1 + regions: + - name: home_below_menu + children: + - widget_template_uuid: d181ebd5-f42c-4f96-8f9d-c605023f5cb6 + configuration: + title: Hero Banner Title + subtitle: Add a description for this hero banner. This is a great place to highlight + a promotion. + buttonText: Shop now + contentAlignment: + horizontal: left + containerHeight: small + backgroundType: image + backgroundColor: "#444444" + imageUrl: + src: https://images.unsplash.com/photo-1533038590840-1cde6e668a91?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=2000&q=100 + type: IMAGE_MANAGER + imageFit: fill + imageParallax: 'off' + imageAlignment: + horizontal: center + vertical: middle + imageOpacity: 100 + titleVisible: show + titleStyle: default + titleFontFamily: inherit + titleFontWeight: '400' + titleFontSize: + value: 36 + type: px + descriptionVisible: show + descriptionStyle: default + descriptionFontFamily: inherit + descriptionFontWeight: '400' + descriptionFontSize: + value: 21 + type: px + textColor: "#444444" + mobileTextColor: "#444444" + buttonVisible: show + buttonFont: default + buttonFontFamily: inherit + buttonStyle: round + buttonColor: "#444444" + mobileButtonColor: "#444444" + buttonTextColor: rgba(255,255,255,1) + mobileButtonTextColor: rgba(255,255,255,1) + storefront_api_query_params: {} + name: Hero Banner + description: '' + type: widget + - name: header_bottom + children: + - layout_template_uuid: 7d42d0b1-1152-4ce3-a6c1-3709f786f295 + configuration: + columnWeights: + - 33.333333% + - 33.333333% + - 33.333333% + layoutBackgroundColor: rgba(0,0,0,0) + layoutBackgroundImageAlignment: + horizontal: center + vertical: middle + layoutBackgroundImageFit: fill + layoutBackgroundImageOpacity: 100 + layoutBackgroundImageUrl: '' + layoutBorderColor: "#333333" + layoutBorderStyle: solid + layoutBorderThickness: 0 + layoutHeight: '' + layoutMargin: + bottom: + type: px + value: '0' + left: + type: px + value: '0' + right: + type: px + value: '0' + top: + type: px + value: '0' + layoutPadding: + bottom: + type: px + value: '0' + left: + type: px + value: '0' + right: + type: px + value: '0' + top: + type: px + value: '0' + numberOfDropzones: 3 + layoutBackgroundType: '' + layoutZIndex: auto + name: Layout + name: Layout + dropzones: + - configuration: + dropzoneBackgroundColor: rgba(0,0,0,0) + dropzoneBackgroundImageAlignment: + horizontal: center + vertical: middle + dropzoneBackgroundImageFit: fill + dropzoneBackgroundImageOpacity: 100 + dropzoneBackgroundImageUrl: '' + dropzoneBorderColor: "#333333" + dropzoneBorderStyle: solid + dropzoneBorderThickness: 0 + dropzoneHeight: '' + dropzoneJustifyContent: center + dropzoneMargin: + bottom: + type: px + value: '0' + left: + type: px + value: '0' + right: + type: px + value: '0' + top: + type: px + value: '0' + dropzonePadding: + bottom: + type: px + value: '0' + left: + type: px + value: '10.5' + right: + type: px + value: '10.5' + top: + type: px + value: '0' + dropzoneZIndex: auto + dropzoneBackgroundType: '' + widgets: + - widget_template_uuid: e59c1412-2d85-4f18-ab4b-8a55412d945c + configuration: + productCardContentAlignment: + horizontal: center + productImage: + visibility: show + imageFit: fill + brand: + visibility: show + textStyle: default + color: "#444444" + productName: + visibility: show + textStyle: default + color: "#444444" + price: + visibility: show + textStyle: default + color: "#444444" + productRating: + visibility: hide + starColorFilled: "#3C64F4" + starColorEmpty: "#ECEEF5" + reviewsColor: "#8C93AD" + button: + visibility: hide + shape: round + buttonColor: rgba(68,68,68,1) + textStyle: default + buttonTextColor: rgba(255,255,255,1) + buttonActionType: addToCart + productId: '77' + storefront_api_query_params: + productId: 77 + name: Product + description: '' + type: widget + - configuration: + dropzoneBackgroundColor: rgba(0,0,0,0) + dropzoneBackgroundImageAlignment: + horizontal: center + vertical: middle + dropzoneBackgroundImageFit: fill + dropzoneBackgroundImageOpacity: 100 + dropzoneBackgroundImageUrl: '' + dropzoneBorderColor: "#333333" + dropzoneBorderStyle: solid + dropzoneBorderThickness: 0 + dropzoneHeight: '' + dropzoneJustifyContent: center + dropzoneMargin: + bottom: + type: px + value: '0' + left: + type: px + value: '0' + right: + type: px + value: '0' + top: + type: px + value: '0' + dropzonePadding: + bottom: + type: px + value: '0' + left: + type: px + value: '10.5' + right: + type: px + value: '10.5' + top: + type: px + value: '0' + dropzoneZIndex: auto + dropzoneBackgroundType: '' + widgets: + - widget_template_uuid: e59c1412-2d85-4f18-ab4b-8a55412d945c + configuration: + productCardContentAlignment: + horizontal: center + productImage: + visibility: show + imageFit: fill + brand: + visibility: show + textStyle: default + color: "#444444" + productName: + visibility: show + textStyle: default + color: "#444444" + price: + visibility: show + textStyle: default + color: "#444444" + productRating: + visibility: hide + starColorFilled: "#3C64F4" + starColorEmpty: "#ECEEF5" + reviewsColor: "#8C93AD" + button: + visibility: hide + shape: round + buttonColor: rgba(68,68,68,1) + textStyle: default + buttonTextColor: rgba(255,255,255,1) + buttonActionType: addToCart + productId: '80' + storefront_api_query_params: + productId: 80 + name: Product + description: '' + type: widget + - configuration: + dropzoneBackgroundColor: rgba(0,0,0,0) + dropzoneBackgroundImageAlignment: + horizontal: center + vertical: middle + dropzoneBackgroundImageFit: fill + dropzoneBackgroundImageOpacity: 100 + dropzoneBackgroundImageUrl: '' + dropzoneBorderColor: "#333333" + dropzoneBorderStyle: solid + dropzoneBorderThickness: 0 + dropzoneHeight: '' + dropzoneJustifyContent: center + dropzoneMargin: + bottom: + type: px + value: '0' + left: + type: px + value: '0' + right: + type: px + value: '0' + top: + type: px + value: '0' + dropzonePadding: + bottom: + type: px + value: '0' + left: + type: px + value: '10.5' + right: + type: px + value: '10.5' + top: + type: px + value: '0' + dropzoneZIndex: auto + dropzoneBackgroundType: '' + widgets: + - widget_template_uuid: e59c1412-2d85-4f18-ab4b-8a55412d945c + configuration: + productCardContentAlignment: + horizontal: center + productImage: + visibility: show + imageFit: fill + brand: + visibility: show + textStyle: default + color: "#444444" + productName: + visibility: show + textStyle: default + color: "#444444" + price: + visibility: show + textStyle: default + color: "#444444" + productRating: + visibility: hide + starColorFilled: "#3C64F4" + starColorEmpty: "#ECEEF5" + reviewsColor: "#8C93AD" + button: + visibility: hide + shape: round + buttonColor: rgba(68,68,68,1) + textStyle: default + buttonTextColor: rgba(255,255,255,1) + buttonActionType: addToCart + productId: '93' + storefront_api_query_params: + productId: 93 + name: Product + description: '' + type: widget + type: layout + region: + title: Region object + type: object + properties: + name: + type: string + description: |- + Matches the name specified as `{{{region_name="..."}}}` in a theme template file. + children: + type: array + description: Consists of layout and widget objects. + items: + anyOf: + - $ref: '#/components/schemas/layout' + - $ref: '#/components/schemas/widget' + layout: + title: Layout object + type: object + properties: + layout_template_uuid: + type: string + format: uuid + readOnly: true + description: Set by BigCommerce. Read-only. + configuration: + type: object + properties: {} + description: JSON object of necessary configuration to construct a layout. + name: + type: string + description: A human-readable label for the layout; displays in Page Builder. + dropzones: + type: array + description: Consists of dropzone objects. + items: + $ref: '#/components/schemas/dropzone' + type: + type: string + enum: + - layout + example: layout + dropzone: + title: Dropzone object + type: object + properties: + configuration: + type: object + properties: {} + description: JSON object of necessary configuration to construct a dropzone. + widgets: + type: array + description: Consists of [widget](#widgets) objects. + items: + $ref: '#/components/schemas/widget' + widget: + title: Widget object + type: object + properties: + widget_template_uuid: + type: string + format: uuid + readOnly: true + description: The unique identifier of the parent widget template; set by the store or channel where the widget template originated. + configuration: + type: object + properties: {} + description: JSON object of necessary configuration to construct a widget. + storefront_api_query_params: + type: object + properties: {} + additionalProperties: true + description: A set of parameters used to query the GraphQL Storefront API. Used when the parent widget template is configured to request data directly from the GraphQL Storefront API; in this case, the parent widget template has the `storefront_api_query` property. + name: + type: string + description: A human-readable label for the widget. Retrievable using either the [Get a widget](/docs/rest-content/widgets/widget#get-a-widget) or the [Get all widgets](/docs/rest-content/widgets/widget#get-all-widgets) endpoint. + description: + type: string + description: A description of the widget. Retrievable using either the [Get a widget](/docs/rest-content/widgets/widget#get-a-widget) or the [Get all widgets](/docs/rest-content/widgets/widget#get-all-widgets) endpoint. + type: + type: string + enum: + - widget + example: widget + metaCollection: + title: Meta object + type: object + description: |- + Data about the response, including pagination and collection totals. + properties: + pagination: + $ref: '#/components/schemas/pagination' + pagination: + title: Pagination object + type: object + description: | + Data about the response, including pagination and collection totals. + properties: + total: + type: integer + description: | + Total number of items in the result set. + count: + type: integer + description: | + Total number of items in the collection response. + per_page: + type: integer + description: | + The amount of items returned in the collection per page, controlled by the limit parameter. + current_page: + type: integer + description: | + The page you are currently on within the collection. + total_pages: + type: integer + description: | + The total number of pages in the collection. + links: + type: object + description: | + Pagination links for the previous and next parts of the whole collection. + properties: + previous: + type: string + description: | + Link to the previous page returned in the response. + current: + type: string + description: | + Link to the current page returned in the response. + next: + type: string + description: | + Link to the next page returned in the response. + ErrorResponse: + title: Error response + allOf: + - $ref: '#/components/schemas/BaseError' + - type: object + properties: + errors: + $ref: '#/components/schemas/DetailedErrors' + x-tags: + - Models + BaseError: + title: Base error + type: object + description: | + Error payload for the BigCommerce API. + properties: + status: + description: | + The HTTP status code. + type: integer + title: + description: | + The error title describing the particular error. + type: string + type: + type: string + instance: + type: string + x-tags: + - Models + DetailedErrors: + title: Detailed errors + type: object + properties: { } + additionalProperties: true + x-tags: + - Models + requestBodies: + PublishOrOverwrite_Request: + content: + application/json: + schema: + $ref: '#/components/schemas/publish' + responses: + GetPageSnapshot_Response: + description: '' + headers: + Date: + $ref: '#/components/headers/Date' + Last-Modified: + $ref: '#/components/headers/Last-Modified' + Content-Encoding: + $ref: '#/components/headers/Content-Encoding' + Transfer-Encoding: + $ref: '#/components/headers/Transfer-Encoding' + X-Rate-Limit-Time-Window-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Window-Ms' + X-Rate-Limit-Time-Reset-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Reset-Ms' + X-Rate-Limit-Requests-Quota: + $ref: '#/components/headers/X-Rate-Limit-Requests-Quota' + X-Rate-Limit-Requests-Left: + $ref: '#/components/headers/X-Rate-Limit-Requests-Left' + X-Retry-After: + $ref: '#/components/headers/X-Retry-After' + X-BC-ApiLimit-Remaining: + $ref: '#/components/headers/X-BC-ApiLimit-Remaining' + X-BC-Store-Version: + $ref: '#/components/headers/X-BC-Store-Version' + content: + application/json: + schema: + type: object + properties: + data: + type: object + properties: + regions: + type: array + items: + $ref: '#/components/schemas/region' + meta: + $ref: '#/components/schemas/metaCollection' + examples: + response: + value: + data: + regions: + - name: "home_below_menu" + children: [] + meta: + pagination: + count: 1 + current_page: 1 + per_page: 50 + total: 1 + total_pages: 1 + GetErrorResponse: + description: Failure due to an invalid query parameter + headers: + Date: + $ref: '#/components/headers/Date' + Last-Modified: + $ref: '#/components/headers/Last-Modified' + Content-Encoding: + $ref: '#/components/headers/Content-Encoding' + Transfer-Encoding: + $ref: '#/components/headers/Transfer-Encoding' + X-Rate-Limit-Time-Window-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Window-Ms' + X-Rate-Limit-Time-Reset-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Reset-Ms' + X-Rate-Limit-Requests-Quota: + $ref: '#/components/headers/X-Rate-Limit-Requests-Quota' + X-Rate-Limit-Requests-Left: + $ref: '#/components/headers/X-Rate-Limit-Requests-Left' + X-Retry-After: + $ref: '#/components/headers/X-Retry-After' + X-BC-ApiLimit-Remaining: + $ref: '#/components/headers/X-BC-ApiLimit-Remaining' + X-BC-Store-Version: + $ref: '#/components/headers/X-BC-Store-Version' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + CreateErrorResponse: + description: The request payload was invalid. + headers: + Date: + $ref: '#/components/headers/Date' + Last-Modified: + $ref: '#/components/headers/Last-Modified' + Content-Encoding: + $ref: '#/components/headers/Content-Encoding' + Transfer-Encoding: + $ref: '#/components/headers/Transfer-Encoding' + X-Rate-Limit-Time-Window-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Window-Ms' + X-Rate-Limit-Time-Reset-Ms: + $ref: '#/components/headers/X-Rate-Limit-Time-Reset-Ms' + X-Rate-Limit-Requests-Quota: + $ref: '#/components/headers/X-Rate-Limit-Requests-Quota' + X-Rate-Limit-Requests-Left: + $ref: '#/components/headers/X-Rate-Limit-Requests-Left' + X-Retry-After: + $ref: '#/components/headers/X-Retry-After' + X-BC-ApiLimit-Remaining: + $ref: '#/components/headers/X-BC-ApiLimit-Remaining' + X-BC-Store-Version: + $ref: '#/components/headers/X-BC-Store-Version' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + parameters: + Accept: + name: Accept + in: header + required: true + schema: + type: string + default: 'application/json' + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + Content-Type: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + User-Agent: + name: User-Agent + in: header + required: true + schema: + type: string + example: 'PostmanRuntime/7.32.3' + description: Please specify a user agent to identify your integration or client. + X-Correlation-Id: + name: X-Correlation-Id + in: header + required: false + schema: + type: string + format: uuid + description: |- + An identifier unique to a set of related requests. For use on headless storefronts, excluding BigCommerce for WordPress. For more information, see [Best Practices](/docs/start/best-practices#correlating-requests) or the [Headless Guide](/docs/storefront/headless#correlating-requests). + ChannelId: + name: channel_id + description: The ID of the channel for which you want to retrieve page widgets. Defaults to the first channel created on the store. + required: false + in: query + schema: + type: integer + default: 1 + example: 12 + TemplateFile: + name: template_file + description: The template file that you would like to target. Leave it empty if the request is for Global regions. + required: false + in: query + schema: + type: string + EntityId: + name: entity_id + description: The identifier of a page you would like to target. For product pages, choose product ID. For category pages, choose category ID. Home page does not support `entity_id`. Leave empty if the request is for global regions. + required: false + in: query + schema: + type: string + headers: + Date: + schema: + type: string + example: 'Tue, 15 Nov 2011 12:45:26 GMT' + description: |- + An [RFC 2822](a href="http://tools.ietf.org/html/rfc2822#section-3.3) date. + Last-Modified: + schema: + type: string + example: Tue, 15 Nov 2011 12:45:26 GMT + description: |- + An [RFC 2822](a href="http://tools.ietf.org/html/rfc2822#section-3.3) date. The date the resource was last modified. + Content-Encoding: + schema: + type: string + enum: + - gzip + example: gzip + description: |- + Lets API clients request compressed responses. + Transfer-Encoding: + schema: + type: string + example: chunked + description: |- + Specifies the form of encoding used to transfer the resource. + X-Rate-Limit-Time-Window-Ms: + schema: + type: integer + example: 30000 + description: |- + number | Shows the size of your current rate-limiting window, in milliseconds. + X-Rate-Limit-Time-Reset-Ms: + schema: + type: integer + example: 15000 + description: |- + Shows how many milliseconds are remaining in the window. In this case, 15000 milliseconds – so, 15000 milliseconds after this request, the API quota will be refreshed. + X-Rate-Limit-Requests-Quota: + schema: + type: integer + example: 150 + description: |- + Shows how many API requests are allowed in the current window for your client. + X-Rate-Limit-Requests-Left: + schema: + type: integer + example: 35 + description: |- + Details how many remaining requests your client can make in the current window before being rate-limited. In this case, you would expect to be able to make 35 more requests in the next 15000 milliseconds; on the 36th request within 15000 milliseconds, you would be rate-limited and receive an HTTP 429 response. + X-Retry-After: + schema: + type: integer + example: 15 + description: |- + Rate limited response, indicating the number of seconds before the quota refreshes. See [Rate Limits](/docs/start/best-practices#api-rate-limits). + X-BC-ApiLimit-Remaining: + schema: + type: integer + example: 987 + description: |- + The number of API requests remaining for the current period (rolling one hour). + X-BC-Store-Version: + schema: + type: string + example: 7.3.6 + description: |- + The version of BigCommerce on which the store is running. This header is available on versions 7.3.6+. + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Add scopes ++++ | modify | `...` | + | Add | read-only | `store_v2_marketing_read_only` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate access tokens, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header From 103b35617ac5b9a34c4cf8b8a14e9aa4ab6b3fa0 Mon Sep 17 00:00:00 2001 From: Brett Daniels <theromulans@gmail.com> Date: Fri, 26 Jul 2024 08:50:49 +1000 Subject: [PATCH 101/221] Update description of TaxQuote::id (#399) ## What changed? * Adjust description of the `TaxQuote::id` field to describe that we also accept external ID values. * Also describe how this value is used with adjust and void requests. * Bonus: adjust remaining outlier casing concerns for "Tax Provider" => "tax provider". Based on tax partner feedback and a significant confusion internally. ## Release notes draft * Clarify accepted Tax Provider API quote ID values and usages. --- reference/tax_provider.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reference/tax_provider.yml b/reference/tax_provider.yml index f5007d07c..b75b3cf10 100644 --- a/reference/tax_provider.yml +++ b/reference/tax_provider.yml @@ -1120,7 +1120,7 @@ components: properties: code: type: string - description: 'The provider-specific tax code for this item. Items can be classified with tax codes relevant to each Tax Provider, configured by the merchant, and assigned to their products within BigCommerce. A tax code is intended to apply to multiple products. This code should match the tax codes provided by the third-party integration.' + description: 'The provider-specific tax code for this item. Items can be classified with tax codes relevant to each tax provider, configured by the merchant, and assigned to their products within BigCommerce. A tax code is intended to apply to multiple products. This code should match the tax codes provided by the third-party integration.' class_id: type: string description: The ID of the tax class defined in the merchant’s BigCommerce store. May have a UUID value. @@ -1137,7 +1137,7 @@ components: properties: id: type: string - description: The unique identifier of the tax quote that was requested. This must match the ID of the requested quote. + description: The unique identifier of the tax quote that was requested. This value must either match the ID of the requested quote or be an external ID on the tax provider’s system. This value will be used for future adjust and void operations. documents: type: array description: 'Represents an order quote or part of an order quote of tax-relevant items fulfilled from a single origin address to a single destination address, including arrays of shipping and handling fee objects for each item. Most order quotes contain a single document; however, BigCommerce supports "multi-address orders", which may come from or go to distinct sets of addresses and thus require multiple documents per quote.' @@ -1273,11 +1273,11 @@ components: id: type: string description: |- - Optional unique identifier for this sales tax, describing the relevant tax classification rule on the Tax Provider platform. + Optional unique identifier for this sales tax, describing the relevant tax classification rule on the tax provider platform. Supplying an identifier allows BigCommerce to group related taxes together from all items in the order. - This identifier is persisted by BigCommerce and may be desirable for auditing purposes between BigCommerce and the Tax Provider. Currently supports persisting integer values only (the string type indicates we may support UUID values in the future). + This identifier is persisted by BigCommerce and may be desirable for auditing purposes between BigCommerce and the tax provider. Currently supports persisting integer values only (the string type indicates we may support UUID values in the future). example: '1701' required: - name @@ -1317,7 +1317,7 @@ components: type: http scheme: basic description: |- - The [HTTP Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication) (developer.mozilla.org) credentials used to authenticate each API request to the Tax Provider from the associated store; set and update `username`, `password`, and optionally `profile`, using the [Update a Connection](/docs/rest-contracts/tax-app-connection#update-a-connection) request. `profile` is an optional field and will be used with supporting providers only. + The [HTTP Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication) (developer.mozilla.org) credentials used to authenticate each API request to the tax provider from the associated store; set and update `username`, `password`, and optionally `profile`, using the [Update a Connection](/docs/rest-contracts/tax-app-connection#update-a-connection) request. `profile` is an optional field and will be used with supporting providers only. For more, see [developer-configured authentication](/docs/start/authentication#developer-configured-authentication) for Provider APIs. From b9a1acae4593ea7938a0c7f235a8e46074d0bfbb Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:13:58 +0100 Subject: [PATCH 102/221] [DEVDOCS-6033] - Arrange callback attributes in correct order (#386) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6033] Webhooks reference overhaul - Arrange callback attributes in correct order ## What changed? <!-- Provide a bulleted list in the present tense --> * Arranged the order of attributes to be accurate with our payload format for the following events: store/cart/abandoned store/cart/converted store/cart/couponApplied store/cart/created store/cart/deleted store/cart/lineItem/created store/cart/lineItem/updated store/cart/lineItem/deleted store/cart/updated store/category/created store/category/updated store/category/deleted store/customer/deleted store/customer/address/created store/customer/address/updated store/customer/address/deleted store/customer/payment/instrument/default/updated store/information/updated store/inventory/location/created store/inventory/location/updated store/modifier/updated store/option/updated store/order/archived store/order/created store/order/updated store/order/message/created store/order/refund/created store/order/statusUpdated store/product/created store/product/updated store/product/deleted store/product/inventory/order/updated store/product/inventory/updated store/shipment/created store/shipment/updated store/shipment/deleted store/sku/created store/sku/updated store/sku/deleted store/sku/inventory/order/updated store/sku/inventory/updated store/subscriber/created store/subscriber/updated store/subscriber/deleted * Note that other callbacks would have their order re-arranged by pull request for DEVDOCS-6029: https://github.com/bigcommerce/docs/pull/380 ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Re-ordered the attributes of callbacks in our documentation so they match the order of webhook payloads. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {@bc-traciporter} [DEVDOCS-6033]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6033?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../callbacks/store_cart_abandoned.yml | 15 +++++++-------- .../callbacks/store_cart_converted.yml | 15 +++++++-------- .../callbacks/store_cart_couponApplied.yml | 15 +++++++-------- .../webhooks/callbacks/store_cart_created.yml | 15 +++++++-------- .../webhooks/callbacks/store_cart_deleted.yml | 15 +++++++-------- .../callbacks/store_cart_lineItem_created.yml | 15 +++++++-------- .../callbacks/store_cart_lineItem_deleted.yml | 15 +++++++-------- .../callbacks/store_cart_lineItem_updated.yml | 15 +++++++-------- .../webhooks/callbacks/store_cart_updated.yml | 15 +++++++-------- .../callbacks/store_category_created.yml | 15 +++++++-------- .../callbacks/store_category_deleted.yml | 15 +++++++-------- .../store_customer_address_created.yml | 15 +++++++-------- .../store_customer_address_deleted.yml | 15 +++++++-------- .../store_customer_address_updated.yml | 15 +++++++-------- .../callbacks/store_customer_deleted.yml | 15 +++++++-------- ...mer_payment_instrument_default_updated.yml | 19 +++++++++---------- .../callbacks/store_information_updated.yml | 15 +++++++-------- .../callbacks/store_modifier_updated.yml | 14 +++++++------- .../callbacks/store_option_updated.yml | 14 +++++++------- .../callbacks/store_order_archived.yml | 15 +++++++-------- .../callbacks/store_order_created.yml | 15 +++++++-------- .../callbacks/store_order_message_created.yml | 15 +++++++-------- .../callbacks/store_order_refund_created.yml | 15 +++++++-------- .../callbacks/store_order_statusUpdated.yml | 15 +++++++-------- .../callbacks/store_product_created.yml | 15 +++++++-------- .../callbacks/store_product_deleted.yml | 15 +++++++-------- .../store_product_inventory_order_updated.yml | 15 +++++++-------- .../store_product_inventory_updated.yml | 15 +++++++-------- .../callbacks/store_shipment_created.yml | 15 +++++++-------- .../callbacks/store_shipment_deleted.yml | 15 +++++++-------- .../callbacks/store_shipment_updated.yml | 15 +++++++-------- docs/webhooks/callbacks/store_sku_created.yml | 15 +++++++-------- docs/webhooks/callbacks/store_sku_deleted.yml | 15 +++++++-------- .../store_sku_inventory_order_updated.yml | 15 +++++++-------- .../callbacks/store_sku_inventory_updated.yml | 15 +++++++-------- docs/webhooks/callbacks/store_sku_updated.yml | 15 +++++++-------- .../callbacks/store_subscriber_created.yml | 15 +++++++-------- .../callbacks/store_subscriber_deleted.yml | 15 +++++++-------- .../callbacks/store_subscriber_updated.yml | 15 +++++++-------- 39 files changed, 275 insertions(+), 312 deletions(-) diff --git a/docs/webhooks/callbacks/store_cart_abandoned.yml b/docs/webhooks/callbacks/store_cart_abandoned.yml index b4d658be6..44e284274 100644 --- a/docs/webhooks/callbacks/store_cart_abandoned.yml +++ b/docs/webhooks/callbacks/store_cart_abandoned.yml @@ -4,10 +4,16 @@ properties: description: Fires when a cart is abandoned. A cart is considered abandoned when no changes have been made to its properties or contents for one hour. This webhook is available for all store plans, regardless of whether the Abandoned Cart Saver feature is enabled. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string token: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_converted.yml b/docs/webhooks/callbacks/store_cart_converted.yml index d0b8fee0e..f8487d604 100644 --- a/docs/webhooks/callbacks/store_cart_converted.yml +++ b/docs/webhooks/callbacks/store_cart_converted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a cart is converted into an order, which typically follows the payment step of checkout. At this point, the cart is no longer accessible and has been deleted. This webhook returns both the cart ID and the order ID for correlation purposes. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string orderId: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_couponApplied.yml b/docs/webhooks/callbacks/store_cart_couponApplied.yml index ad04d5f65..ce5cd69f7 100644 --- a/docs/webhooks/callbacks/store_cart_couponApplied.yml +++ b/docs/webhooks/callbacks/store_cart_couponApplied.yml @@ -4,10 +4,16 @@ properties: description: Fires when a new coupon code is applied to a cart. The payload includes the ID of the coupon code. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string couponId: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_created.yml b/docs/webhooks/callbacks/store_cart_created.yml index e6d00418c..ea961acac 100644 --- a/docs/webhooks/callbacks/store_cart_created.yml +++ b/docs/webhooks/callbacks/store_cart_created.yml @@ -10,10 +10,16 @@ properties: The store/cart/updated webhook fires simultaneously with store/cart/created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -21,10 +27,3 @@ properties: type: string id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_deleted.yml b/docs/webhooks/callbacks/store_cart_deleted.yml index 7fe010676..c2927b2bb 100644 --- a/docs/webhooks/callbacks/store_cart_deleted.yml +++ b/docs/webhooks/callbacks/store_cart_deleted.yml @@ -10,10 +10,16 @@ properties: The store/cart/updated webhook fires simultaneously with store/cart/deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -21,10 +27,3 @@ properties: type: string id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_lineItem_created.yml b/docs/webhooks/callbacks/store_cart_lineItem_created.yml index 0844c7b3c..a01e6fd61 100644 --- a/docs/webhooks/callbacks/store_cart_lineItem_created.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a new item is added to a cart. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string cartId: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml b/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml index 8916302fe..3d3c5e0e1 100644 --- a/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when an item is deleted from a cart. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string cartId: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_lineItem_updated.yml b/docs/webhooks/callbacks/store_cart_lineItem_updated.yml index 78bcd7a8e..731b2a3f7 100644 --- a/docs/webhooks/callbacks/store_cart_lineItem_updated.yml +++ b/docs/webhooks/callbacks/store_cart_lineItem_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when a line item’s quantity or product options change. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: string cartId: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_cart_updated.yml b/docs/webhooks/callbacks/store_cart_updated.yml index 8a11b932d..5d4ab46dc 100644 --- a/docs/webhooks/callbacks/store_cart_updated.yml +++ b/docs/webhooks/callbacks/store_cart_updated.yml @@ -14,10 +14,16 @@ properties: The payload includes the ID of the cart being updated. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -25,10 +31,3 @@ properties: type: string id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_category_created.yml b/docs/webhooks/callbacks/store_category_created.yml index a0054ce25..af9ce51e6 100644 --- a/docs/webhooks/callbacks/store_category_created.yml +++ b/docs/webhooks/callbacks/store_category_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a category is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_category_deleted.yml b/docs/webhooks/callbacks/store_category_deleted.yml index a4dbffc56..779f67bda 100644 --- a/docs/webhooks/callbacks/store_category_deleted.yml +++ b/docs/webhooks/callbacks/store_category_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a category is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_customer_address_created.yml b/docs/webhooks/callbacks/store_customer_address_created.yml index f1a2fd5b6..6c47693cc 100644 --- a/docs/webhooks/callbacks/store_customer_address_created.yml +++ b/docs/webhooks/callbacks/store_customer_address_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a customer address is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,3 @@ properties: properties: customer_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_customer_address_deleted.yml b/docs/webhooks/callbacks/store_customer_address_deleted.yml index 647edb235..b2a6aa483 100644 --- a/docs/webhooks/callbacks/store_customer_address_deleted.yml +++ b/docs/webhooks/callbacks/store_customer_address_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a customer address is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,3 @@ properties: properties: customer_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_customer_address_updated.yml b/docs/webhooks/callbacks/store_customer_address_updated.yml index df88780a2..e0fa2ddd7 100644 --- a/docs/webhooks/callbacks/store_customer_address_updated.yml +++ b/docs/webhooks/callbacks/store_customer_address_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when a customer address is updated type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,3 @@ properties: properties: customer_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_customer_deleted.yml b/docs/webhooks/callbacks/store_customer_deleted.yml index c226b0c99..5a86a18d3 100644 --- a/docs/webhooks/callbacks/store_customer_deleted.yml +++ b/docs/webhooks/callbacks/store_customer_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a customer is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml b/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml index 0878bb9e6..730f9f3f3 100644 --- a/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml +++ b/docs/webhooks/callbacks/store_customer_payment_instrument_default_updated.yml @@ -4,21 +4,20 @@ properties: description: Fires when a customer default payment instrument is updated type: object properties: - scope: + producer: type: string + hash: + type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: - type: - type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - + type: + type: string diff --git a/docs/webhooks/callbacks/store_information_updated.yml b/docs/webhooks/callbacks/store_information_updated.yml index de4078af0..2b723b01c 100644 --- a/docs/webhooks/callbacks/store_information_updated.yml +++ b/docs/webhooks/callbacks/store_information_updated.yml @@ -4,19 +4,18 @@ properties: description: Fires when changes are made to store settings. For a full list of fields that can trigger this event, see the store information updated events that follow. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: type: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_modifier_updated.yml b/docs/webhooks/callbacks/store_modifier_updated.yml index 2bd689ff2..cca6ff7a1 100644 --- a/docs/webhooks/callbacks/store_modifier_updated.yml +++ b/docs/webhooks/callbacks/store_modifier_updated.yml @@ -7,10 +7,16 @@ properties: For shared modifiers, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -34,9 +40,3 @@ properties: locale: type: string description: '`null` if the attribute that was overridden applies to the entire channel.' - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_option_updated.yml b/docs/webhooks/callbacks/store_option_updated.yml index c0e2cad86..6abff405e 100644 --- a/docs/webhooks/callbacks/store_option_updated.yml +++ b/docs/webhooks/callbacks/store_option_updated.yml @@ -7,10 +7,16 @@ properties: For shared options, the maximum number of product IDs in a payload is 100. If a shared modifier is assigned to more than 100 products, the payload includes a link to the API so you can query all the event data. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -33,9 +39,3 @@ properties: type: integer locale: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_order_archived.yml b/docs/webhooks/callbacks/store_order_archived.yml index 7e309cf9b..e47ee6c07 100644 --- a/docs/webhooks/callbacks/store_order_archived.yml +++ b/docs/webhooks/callbacks/store_order_archived.yml @@ -4,10 +4,16 @@ properties: description: Order is archived type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_order_created.yml b/docs/webhooks/callbacks/store_order_created.yml index bb1bb5115..b89e8c78b 100644 --- a/docs/webhooks/callbacks/store_order_created.yml +++ b/docs/webhooks/callbacks/store_order_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when an order is created either in the control panel or by API. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_order_message_created.yml b/docs/webhooks/callbacks/store_order_message_created.yml index 3746ab028..3f1ea14d7 100644 --- a/docs/webhooks/callbacks/store_order_message_created.yml +++ b/docs/webhooks/callbacks/store_order_message_created.yml @@ -4,10 +4,16 @@ properties: description: Order message is created by customer or in control panel type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,3 @@ properties: properties: order_message_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_order_refund_created.yml b/docs/webhooks/callbacks/store_order_refund_created.yml index 2da52c92e..e45295f7e 100644 --- a/docs/webhooks/callbacks/store_order_refund_created.yml +++ b/docs/webhooks/callbacks/store_order_refund_created.yml @@ -4,10 +4,16 @@ properties: description: A refund has been submitted against an order type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,3 @@ properties: properties: refund_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_order_statusUpdated.yml b/docs/webhooks/callbacks/store_order_statusUpdated.yml index f71ba6a2a..25060293e 100644 --- a/docs/webhooks/callbacks/store_order_statusUpdated.yml +++ b/docs/webhooks/callbacks/store_order_statusUpdated.yml @@ -4,10 +4,16 @@ properties: description: Fires when the order status has changed, such as from Pending to Awaiting Payment. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -22,10 +28,3 @@ properties: type: integer new_status_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_product_created.yml b/docs/webhooks/callbacks/store_product_created.yml index e29e3af91..0e3ad5ce9 100644 --- a/docs/webhooks/callbacks/store_product_created.yml +++ b/docs/webhooks/callbacks/store_product_created.yml @@ -4,10 +4,16 @@ properties: description: A new product is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_product_deleted.yml b/docs/webhooks/callbacks/store_product_deleted.yml index 56d033bed..c3714eccf 100644 --- a/docs/webhooks/callbacks/store_product_deleted.yml +++ b/docs/webhooks/callbacks/store_product_deleted.yml @@ -4,10 +4,16 @@ properties: description: Product is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_product_inventory_order_updated.yml b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml index 0f2614018..ffc4038a7 100644 --- a/docs/webhooks/callbacks/store_product_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_product_inventory_order_updated.yml @@ -7,10 +7,16 @@ properties: The webhook always fires for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _product_. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -27,10 +33,3 @@ properties: type: string value: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_product_inventory_updated.yml b/docs/webhooks/callbacks/store_product_inventory_updated.yml index bbb9a2073..bb8dee1bd 100644 --- a/docs/webhooks/callbacks/store_product_inventory_updated.yml +++ b/docs/webhooks/callbacks/store_product_inventory_updated.yml @@ -9,10 +9,16 @@ properties: Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -29,10 +35,3 @@ properties: type: string value: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_shipment_created.yml b/docs/webhooks/callbacks/store_shipment_created.yml index 02a689a69..a116d0bc7 100644 --- a/docs/webhooks/callbacks/store_shipment_created.yml +++ b/docs/webhooks/callbacks/store_shipment_created.yml @@ -4,10 +4,16 @@ properties: description: Shipment is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: integer orderId: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_shipment_deleted.yml b/docs/webhooks/callbacks/store_shipment_deleted.yml index 38789354b..2b1f86b52 100644 --- a/docs/webhooks/callbacks/store_shipment_deleted.yml +++ b/docs/webhooks/callbacks/store_shipment_deleted.yml @@ -4,10 +4,16 @@ properties: description: Shipment is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: integer orderId: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_shipment_updated.yml b/docs/webhooks/callbacks/store_shipment_updated.yml index 0ee0c1900..3c2b38511 100644 --- a/docs/webhooks/callbacks/store_shipment_updated.yml +++ b/docs/webhooks/callbacks/store_shipment_updated.yml @@ -4,10 +4,16 @@ properties: description: Shipment is updated type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,10 +23,3 @@ properties: type: integer orderId: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_sku_created.yml b/docs/webhooks/callbacks/store_sku_created.yml index d185a1e61..e70a3cd9a 100644 --- a/docs/webhooks/callbacks/store_sku_created.yml +++ b/docs/webhooks/callbacks/store_sku_created.yml @@ -4,10 +4,16 @@ properties: description: A new sku is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -22,10 +28,3 @@ properties: type: integer variant_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_sku_deleted.yml b/docs/webhooks/callbacks/store_sku_deleted.yml index c01c6d17b..ed7b6806d 100644 --- a/docs/webhooks/callbacks/store_sku_deleted.yml +++ b/docs/webhooks/callbacks/store_sku_deleted.yml @@ -4,10 +4,16 @@ properties: description: SKU is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -22,10 +28,3 @@ properties: type: integer variant_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml index 4d3abcf4f..97324b6ab 100644 --- a/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml +++ b/docs/webhooks/callbacks/store_sku_inventory_order_updated.yml @@ -7,10 +7,16 @@ properties: The webhook does not fire for products without variants. For products with variants, the webhook only fires when the product's inventory properties are configured to track by _variant_. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -29,10 +35,3 @@ properties: type: integer variant_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_sku_inventory_updated.yml b/docs/webhooks/callbacks/store_sku_inventory_updated.yml index 42c80a9f5..3c1c8742b 100644 --- a/docs/webhooks/callbacks/store_sku_inventory_updated.yml +++ b/docs/webhooks/callbacks/store_sku_inventory_updated.yml @@ -9,10 +9,16 @@ properties: Inventory updates made in the control panel and by API trigger the webhook. This includes changes made by apps. In the control panel, you can bulk import inventory updates or make inventory updates to single products on the **Products > View** page. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -31,10 +37,3 @@ properties: type: integer variant_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_sku_updated.yml b/docs/webhooks/callbacks/store_sku_updated.yml index d0b3236e0..060d0a8b4 100644 --- a/docs/webhooks/callbacks/store_sku_updated.yml +++ b/docs/webhooks/callbacks/store_sku_updated.yml @@ -4,10 +4,16 @@ properties: description: SKU is updated type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -22,10 +28,3 @@ properties: type: integer variant_id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_subscriber_created.yml b/docs/webhooks/callbacks/store_subscriber_created.yml index ba49d4cd9..e8063fac6 100644 --- a/docs/webhooks/callbacks/store_subscriber_created.yml +++ b/docs/webhooks/callbacks/store_subscriber_created.yml @@ -4,10 +4,16 @@ properties: description: Subscriber is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_subscriber_deleted.yml b/docs/webhooks/callbacks/store_subscriber_deleted.yml index 2a68a30a3..371a5cf95 100644 --- a/docs/webhooks/callbacks/store_subscriber_deleted.yml +++ b/docs/webhooks/callbacks/store_subscriber_deleted.yml @@ -4,10 +4,16 @@ properties: description: Subscriber is deleted type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - diff --git a/docs/webhooks/callbacks/store_subscriber_updated.yml b/docs/webhooks/callbacks/store_subscriber_updated.yml index 980134d2f..f83e71346 100644 --- a/docs/webhooks/callbacks/store_subscriber_updated.yml +++ b/docs/webhooks/callbacks/store_subscriber_updated.yml @@ -4,10 +4,16 @@ properties: description: Subscriber is updated type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,3 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - From 8f568c449aaadbb1eaa5a82d8337774be4923f1f Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 29 Jul 2024 10:13:23 -0500 Subject: [PATCH 103/221] DEVDOCS-6025 [update]: Price Lists, remove id query parameter (#403) --- reference/price_lists.v3.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index da87b4ba6..84218b0a5 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -80,12 +80,6 @@ paths: description: Returns a list of *Price Lists*. Optional parameters can be passed in. operationId: getPriceLists parameters: - - name: id - in: query - description: | - Filter items by ID. - schema: - type: integer - name: name in: query description: | From 8f2a77284603828b42e434a7175ee2dce9f6d678 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:55:28 +0100 Subject: [PATCH 104/221] Devdocs 6030 remove store/order/transaction/updated callback (#381) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6030] Remove store/order/transaction/updated callback ## What changed? <!-- Provide a bulleted list in the present tense --> * Deleted store/order/transaction/updated YAML file * Removed store/order/transaction/updated from callbacks list ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Removed invalid event store/order/transaction/updated from documentation ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {@bc-traciporter} [DEVDOCS-6030]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6030?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- docs/webhooks/callbacks/_all.yml | 6 ----- .../store_order_transaction_updated.yml | 24 ------------------- 2 files changed, 30 deletions(-) delete mode 100644 docs/webhooks/callbacks/store_order_transaction_updated.yml diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index 6d5259a95..781c30a2d 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -338,12 +338,6 @@ properties: properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_transaction_created.yml - store/order/transaction/updated: - description: Fires when an order transaction is changed. - type: object - properties: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_transaction_updated.yml store/order/updated: description: Fires when an already created order is updated. Any change to an existing order fires this webhook. Updates can include changing the status, updating a coupon, or changing an address. type: object diff --git a/docs/webhooks/callbacks/store_order_transaction_updated.yml b/docs/webhooks/callbacks/store_order_transaction_updated.yml deleted file mode 100644 index 9ce2d7fbf..000000000 --- a/docs/webhooks/callbacks/store_order_transaction_updated.yml +++ /dev/null @@ -1,24 +0,0 @@ -properties: - store/order/transaction/updated: - description: Fires when a new order transaction is updated. - type: object - properties: - scope: - type: string - store_id: - type: string - data: - type: object - properties: - type: - type: string - order_id: - type: integer - transaction_id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string From a9a7efc4ea3d490db01b748e281402ecf4f1bd15 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:57:43 +0100 Subject: [PATCH 105/221] Devdocs 6029 fix attributes missing from/added by the documentation (#380) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6029] Webhooks reference overhaul - Fix attributes missing from/added by the documentation ## What changed? <!-- Provide a bulleted list in the present tense --> * Removed `id` from store/app/uninstalled * Added `namespace` to: store/brand/metafield/created store/brand/metafield/deleted store/brand/metafield/updated store/cart/metafield/created store/cart/metafield/deleted store/cart/metafield/updated store/category/metafield/created store/category/metafield/updated store/category/metafield/deleted store/channel/metafield/created store/channel/metafield/updated store/channel/metafield/deleted store/inventory/location/metafield/created store/inventory/location/metafield/updated store/inventory/location/metafield/deleted store/metafield/created store/metafield/updated store/metafield/deleted store/order/metafield/created store/order/metafield/updated store/order/metafield/deleted *Added `namespace` to and removed `resource_type` from: store/product/metafield/created store/product/metafield/updated store/product/metafield/deleted *Added `namespace` to, removed `resource_type` from, and correct scope name for: store/product/variant/metafield/created store/product/variant/metafield/updated store/product/variant/metafield/deleted *Added `origin_channel_id` and `channel_ids` to: store/customer/created store/customer/updated *Added `platform_transaction_id` and `provider_transaction_id` to store/order/transaction/created *For all events above, re-arranged the order of attributes so they're accurate with the order of actual payloads ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * All metafield events now correctly include the namespace attribute. * Customer created and updated events now correctly include channel attributes. * Transaction created events now correctly include platform and provider transaction ID attributes. * Product and Variant metafield events no longer include an incorrect resource_type attribute. * Variant metafield events now present the correct scope name. * The app uninstalled event no longer includes an incorrect id attribute. * All above events now list attributes in the correct order ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {traci porter} [DEVDOCS-6029]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6029?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../callbacks/store_app_uninstalled.yml | 16 ++++++------ .../store_brand_metafield_created.yml | 16 ++++++------ .../store_brand_metafield_deleted.yml | 16 ++++++------ .../store_brand_metafield_updated.yml | 16 ++++++------ .../store_cart_metafield_created.yml | 16 ++++++------ .../store_cart_metafield_deleted.yml | 16 ++++++------ .../store_cart_metafield_updated.yml | 16 ++++++------ .../store_category_metafield_created.yml | 16 ++++++------ .../store_category_metafield_deleted.yml | 16 ++++++------ .../store_category_metafield_updated.yml | 16 ++++++------ .../store_channel_metafield_created.yml | 16 ++++++------ .../store_channel_metafield_deleted.yml | 16 ++++++------ .../store_channel_metafield_updated.yml | 16 ++++++------ .../callbacks/store_customer_created.yml | 21 ++++++++++------ .../callbacks/store_customer_updated.yml | 21 ++++++++++------ ...e_inventory_location_metafield_created.yml | 17 +++++++------ ...e_inventory_location_metafield_deleted.yml | 17 +++++++------ ...e_inventory_location_metafield_updated.yml | 16 ++++++------ .../callbacks/store_metafield_created.yml | 16 ++++++------ .../callbacks/store_metafield_deleted.yml | 16 ++++++------ .../callbacks/store_metafield_updated.yml | 16 ++++++------ .../store_order_metafield_created.yml | 16 ++++++------ .../store_order_metafield_deleted.yml | 16 ++++++------ .../store_order_metafield_updated.yml | 16 ++++++------ .../store_order_transaction_created.yml | 25 +++++++++++-------- .../store_product_metafield_created.yml | 16 ++++++------ .../store_product_metafield_deleted.yml | 16 ++++++------ .../store_product_metafield_updated.yml | 16 ++++++------ .../store_variant_metafield_created.yml | 18 ++++++------- .../store_variant_metafield_deleted.yml | 20 +++++++-------- .../store_variant_metafield_updated.yml | 18 ++++++------- 31 files changed, 291 insertions(+), 234 deletions(-) diff --git a/docs/webhooks/callbacks/store_app_uninstalled.yml b/docs/webhooks/callbacks/store_app_uninstalled.yml index 5eb565617..d3c10bc3d 100644 --- a/docs/webhooks/callbacks/store_app_uninstalled.yml +++ b/docs/webhooks/callbacks/store_app_uninstalled.yml @@ -4,20 +4,18 @@ properties: description: Fires when a client store is cancelled and uninstalled from the platform. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: type: type: string - id: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_brand_metafield_created.yml b/docs/webhooks/callbacks/store_brand_metafield_created.yml index ee7053d71..4d98821c1 100644 --- a/docs/webhooks/callbacks/store_brand_metafield_created.yml +++ b/docs/webhooks/callbacks/store_brand_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a new metafield on any object is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_brand_metafield_deleted.yml b/docs/webhooks/callbacks/store_brand_metafield_deleted.yml index c3ef54bbd..28d858be8 100644 --- a/docs/webhooks/callbacks/store_brand_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_brand_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a brand metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_brand_metafield_updated.yml b/docs/webhooks/callbacks/store_brand_metafield_updated.yml index d09441d1b..043128887 100644 --- a/docs/webhooks/callbacks/store_brand_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_brand_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when a brand metafield is modified. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_cart_metafield_created.yml b/docs/webhooks/callbacks/store_cart_metafield_created.yml index 7bc684fe0..cb36a56b2 100644 --- a/docs/webhooks/callbacks/store_cart_metafield_created.yml +++ b/docs/webhooks/callbacks/store_cart_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a new cart metafield is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_cart_metafield_deleted.yml b/docs/webhooks/callbacks/store_cart_metafield_deleted.yml index 1d8b095a4..e451c018c 100644 --- a/docs/webhooks/callbacks/store_cart_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_cart_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a cart metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_cart_metafield_updated.yml b/docs/webhooks/callbacks/store_cart_metafield_updated.yml index 609f9bf0f..7161a5a45 100644 --- a/docs/webhooks/callbacks/store_cart_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_cart_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when a cart metafield is modified through the changes in its line items. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_category_metafield_created.yml b/docs/webhooks/callbacks/store_category_metafield_created.yml index 35b433979..83509bc7c 100644 --- a/docs/webhooks/callbacks/store_category_metafield_created.yml +++ b/docs/webhooks/callbacks/store_category_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires if a category metafield is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_category_metafield_deleted.yml b/docs/webhooks/callbacks/store_category_metafield_deleted.yml index 93cfc7b89..90eb9aceb 100644 --- a/docs/webhooks/callbacks/store_category_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_category_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires if a category metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_category_metafield_updated.yml b/docs/webhooks/callbacks/store_category_metafield_updated.yml index af21c3f53..558af197e 100644 --- a/docs/webhooks/callbacks/store_category_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_category_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires if a category metafield is updated. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_channel_metafield_created.yml b/docs/webhooks/callbacks/store_channel_metafield_created.yml index 99f64bb5b..05914ed72 100644 --- a/docs/webhooks/callbacks/store_channel_metafield_created.yml +++ b/docs/webhooks/callbacks/store_channel_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a metafield is created per a specified channel. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_channel_metafield_deleted.yml b/docs/webhooks/callbacks/store_channel_metafield_deleted.yml index 6ce0f2285..5ad22365f 100644 --- a/docs/webhooks/callbacks/store_channel_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_channel_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: Fires when a metafield is deleted per a specified channel. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_channel_metafield_updated.yml b/docs/webhooks/callbacks/store_channel_metafield_updated.yml index 8dd1c6758..8057d7610 100644 --- a/docs/webhooks/callbacks/store_channel_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_channel_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when a metafield is updated per a specified channel. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_customer_created.yml b/docs/webhooks/callbacks/store_customer_created.yml index 812819f33..c44d32085 100644 --- a/docs/webhooks/callbacks/store_customer_created.yml +++ b/docs/webhooks/callbacks/store_customer_created.yml @@ -4,10 +4,16 @@ properties: description: A new customer is created type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,10 +21,9 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - + origin_channel_id: + type: integer + channel_ids: + type: array + items: + type: integer diff --git a/docs/webhooks/callbacks/store_customer_updated.yml b/docs/webhooks/callbacks/store_customer_updated.yml index 5ef1bf648..ff436f19d 100644 --- a/docs/webhooks/callbacks/store_customer_updated.yml +++ b/docs/webhooks/callbacks/store_customer_updated.yml @@ -9,10 +9,16 @@ properties: type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -20,10 +26,9 @@ properties: type: string id: type: integer - hash: - type: string - created_at: - type: integer - producer: - type: string - + origin_channel_id: + type: integer + channel_ids: + type: array + items: + type: integer diff --git a/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml index 144f35ff7..f9c1a2731 100644 --- a/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml +++ b/docs/webhooks/callbacks/store_inventory_location_metafield_created.yml @@ -1,12 +1,19 @@ +type: object properties: store/inventory/location/metafield/created: description: Fires when a new inventory location metafield is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -14,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml index 3834bbc99..31e4eb469 100644 --- a/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_inventory_location_metafield_deleted.yml @@ -1,12 +1,19 @@ +type: object properties: store/inventory/location/metafield/deleted: description: Fires when a inventory location metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -14,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml b/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml index dfe40b974..42209730f 100644 --- a/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_inventory_location_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when an existing inventory location metafield is updated. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_metafield_created.yml b/docs/webhooks/callbacks/store_metafield_created.yml index 0cfe1336e..6ff7dd202 100644 --- a/docs/webhooks/callbacks/store_metafield_created.yml +++ b/docs/webhooks/callbacks/store_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: This webhook will fire whenever a new metafield on any object is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,9 +23,5 @@ properties: type: string resource_type: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_metafield_deleted.yml b/docs/webhooks/callbacks/store_metafield_deleted.yml index f0bc56cbc..66f68552f 100644 --- a/docs/webhooks/callbacks/store_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: When a metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,9 +23,5 @@ properties: type: string resource_type: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_metafield_updated.yml b/docs/webhooks/callbacks/store_metafield_updated.yml index d61e00380..22a6f5b31 100644 --- a/docs/webhooks/callbacks/store_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when an already created metafield is updated. Any changes to an existing metafield on any object (such as inventory, carts, brands, categories, channels, orders, ShipperHQ, etc.) will fire this webhook. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -17,9 +23,5 @@ properties: type: string resource_type: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_order_metafield_created.yml b/docs/webhooks/callbacks/store_order_metafield_created.yml index b31c20d97..e1cafa5b1 100644 --- a/docs/webhooks/callbacks/store_order_metafield_created.yml +++ b/docs/webhooks/callbacks/store_order_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires if an order metafield is created using the control panel, an app, or the API. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_order_metafield_deleted.yml b/docs/webhooks/callbacks/store_order_metafield_deleted.yml index 67eb5ab80..f0ebd5149 100644 --- a/docs/webhooks/callbacks/store_order_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_order_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: An order metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_order_metafield_updated.yml b/docs/webhooks/callbacks/store_order_metafield_updated.yml index 76318ffe6..23ce7be32 100644 --- a/docs/webhooks/callbacks/store_order_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_order_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Fires when an existing order metafield is updated. Any changes to an existing order metafield will fire this webhook. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,9 +21,5 @@ properties: type: integer resource_id: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + namespace: + type: string diff --git a/docs/webhooks/callbacks/store_order_transaction_created.yml b/docs/webhooks/callbacks/store_order_transaction_created.yml index af43bd9be..3c216d4cd 100644 --- a/docs/webhooks/callbacks/store_order_transaction_created.yml +++ b/docs/webhooks/callbacks/store_order_transaction_created.yml @@ -1,21 +1,28 @@ +type: object properties: store/order/transaction/created: description: Fires when a new order transaction is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: - type: - type: string order_id: type: integer transaction_id: type: string + type: + type: string transaction_status: type: string transaction_type: @@ -28,10 +35,8 @@ properties: message: type: string type: - type: string - hash: - type: string - created_at: - type: integer - producer: - type: string + type: string + platform_transaction_id: + type: string + provider_transaction_id: + type: string diff --git a/docs/webhooks/callbacks/store_product_metafield_created.yml b/docs/webhooks/callbacks/store_product_metafield_created.yml index b0e8a3aa6..85f16ce74 100644 --- a/docs/webhooks/callbacks/store_product_metafield_created.yml +++ b/docs/webhooks/callbacks/store_product_metafield_created.yml @@ -4,10 +4,16 @@ properties: description: Fires when a new product metafield is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_product_metafield_deleted.yml b/docs/webhooks/callbacks/store_product_metafield_deleted.yml index 464126be6..e7a88cb67 100644 --- a/docs/webhooks/callbacks/store_product_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_product_metafield_deleted.yml @@ -4,10 +4,16 @@ properties: description: Occurs when a product metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_product_metafield_updated.yml b/docs/webhooks/callbacks/store_product_metafield_updated.yml index 7985090fd..5f4386960 100644 --- a/docs/webhooks/callbacks/store_product_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_product_metafield_updated.yml @@ -4,10 +4,16 @@ properties: description: Occurs when product metafield details are edited. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_variant_metafield_created.yml b/docs/webhooks/callbacks/store_variant_metafield_created.yml index 5321fedc2..e289e12aa 100644 --- a/docs/webhooks/callbacks/store_variant_metafield_created.yml +++ b/docs/webhooks/callbacks/store_variant_metafield_created.yml @@ -1,13 +1,19 @@ type: object properties: - store/variant/metafield/created: + store/product/variant/metafield/created: description: Occurs when a new product variant metafield is created. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_variant_metafield_deleted.yml b/docs/webhooks/callbacks/store_variant_metafield_deleted.yml index 25f0b28d0..3d3d51fd2 100644 --- a/docs/webhooks/callbacks/store_variant_metafield_deleted.yml +++ b/docs/webhooks/callbacks/store_variant_metafield_deleted.yml @@ -1,13 +1,19 @@ type: object properties: - store/variant/metafield/deleted: - description: Occurs when a product variant metafield is deleted. + store/product/variant/metafield/deleted: + description: Occurs when a product variant metafield is deleted. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string diff --git a/docs/webhooks/callbacks/store_variant_metafield_updated.yml b/docs/webhooks/callbacks/store_variant_metafield_updated.yml index 291e343ac..e8a736748 100644 --- a/docs/webhooks/callbacks/store_variant_metafield_updated.yml +++ b/docs/webhooks/callbacks/store_variant_metafield_updated.yml @@ -1,13 +1,19 @@ type: object properties: - store/variant/metafield/updated: + store/product/variant/metafield/updated: description: Occurs when product variant metafield details are edited. type: object properties: - scope: + producer: + type: string + hash: type: string + created_at: + type: integer store_id: type: string + scope: + type: string data: type: object properties: @@ -15,11 +21,5 @@ properties: type: integer resource_id: type: string - resource_type: + namespace: type: string - hash: - type: string - created_at: - type: integer - producer: - type: string From 0766051ccfcabeab2b0328fe61189e8a0ec22490 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Mon, 29 Jul 2024 19:25:01 -0500 Subject: [PATCH 106/221] [DEVDOCS-5787]: [New] GQL Storefront Orders API, Create new doc (#290) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5787] ## What changed? <!-- Provide a bulleted list in the present tense --> * Create new documentation for GraphQL Storefront Orders API ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * New feature: GQL Storefront Orders API now in beta! Access and manage order information with enhanced query and mutation operations. Try it out and share your feedback! 🚀 ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @jamie-mckenzie [DEVDOCS-5787]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5787?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: jamie-mckenzie <119447194+jamie-mckenzie@users.noreply.github.com> Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- docs/storefront/graphql/orders.mdx | 352 +++++++++++++++++++++++++++++ 1 file changed, 352 insertions(+) create mode 100644 docs/storefront/graphql/orders.mdx diff --git a/docs/storefront/graphql/orders.mdx b/docs/storefront/graphql/orders.mdx new file mode 100644 index 000000000..b74b48388 --- /dev/null +++ b/docs/storefront/graphql/orders.mdx @@ -0,0 +1,352 @@ +# GraphQL Storefront API: Orders (beta) + +<Callout type="info"> + This feature is currently in beta and the following operation is only available to participants. +</Callout> + +## Overview + +The GraphQL Storefront `orders` object schema can power requests to your [headless](/docs/storefront/headless) storefront or [Stencil](/docs/storefront/stencil/start) theme supplying you with instant access to your Orders storefront data. To learn more about how the BigCommerce Storefront graph works, see [GraphQL Storefront API overview](/docs/storefront/graphql). + +In this document, you can learn how to use queries and operation types to fetch order data using the BigCommerce Storefront graph. Create arguments for fields like filtering `orders` by `entity_Id`. You're encouraged to read on and put these example queries into practice by using the [BigCommerce GraphQL Playground](/graphql-storefront/playground). + +### Fetch `orders` detail + +Use the `orders` object type to fetch data in order to display the orders and details on the storefront graph. + +Use the `GetAllOrders` query field to fetch all orders for a specific customer. You can get a customer's order history, and get details like: + +- Billing address, including the customer's details +- Order status +- Consignment orders information +- Specific discounts, and coupons (when applied) +- Pricing + +<Callout type="info"> + **The following features are coming soon** + - Payment/Payments information + - Order specific messages +</Callout> + +### Fetch `order` details + +Use the `order` object type to get detailed information on the storefront graph. + +Use the `GetOrderDetails` field query to fetch order details like: + +- Specific customer orders +- Specific order data filtered by date, or status + +Note: Don't forget to include cursor [pagination](/docs/storefront/graphql#pagination) to refine the fetched information. + +## Authorization + +Use your bearer token to perform the example queries on your storefront instance in the next section. + +To learn more about authenticating requests to the GraphQL Storefront API, see [Authenticating requests to the GraphQL Storefront API](/docs/start/authentication/graphql-storefront). + +## Example queries + +### Get all orders and details + +#### Filter by order status +In this example, the query is set up to return a filtered list of all orders with a `COMPLETED` status. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example query: Get all orders and details" showLineNumbers copy + query GetAllOrders { + site { + orders(filters: {status: COMPLETED}) { + edges { + node { + consignments { + shipping { + edges { + node { + lineItems { + edges { + node { + brand + entityId + imageUrl + name + productOptions { + name + value + } + quantity + } + } + } + } + } + } + } + subTotal { + currencyCode + value + } + } + } + } + } + } + ``` + </Tab> + <Tab> + ```graphql filename="Example response: Get all orders and details" showLineNumbers copy + { + "data": { + "site": { + "orders": { + "edges": [ + { + "node": { + "consignments": { + "shipping": { + "edges": [ + { + "node": { + "lineItems": { + "edges": [ + { + "node": { + "brand": "default", + "entityId": "1", + "imageUrl": "https://cdn11.bigcommerce.com/s-xyzfeyee1r/products/111/images/371/smithjournal1.1721236910.386.513.jpg?c=1null", + "name": "[Sample] Smith Journal 13", + "productOptions": [ + { + "name": "Color", + "value": "Yellow" + } + ], + "quantity": "3" + } + } + ] + } + } + } + ] + } + }, + "subTotal": { + "currencyCode": "USD", + "value": 25.0 + } + } + } + ] + } + } + } + } + ``` + </Tab> +</Tabs> + +### Get order details +In this example, the query is set up to get details for order #106. Use `entityId` to query by customer. + +<Tabs items={[`Request`, `Response`]}> + <Tab> + ```graphql filename="Example query: Get order details" showLineNumbers copy + query GetOrderDetails { + site { + order(filter: { entityId: 106 }) { + billingAddress { + address1 + city + company + country + countryCode + email + firstName + lastName + phone + postalCode + stateOrProvince + } + consignments { + shipping { + edges { + cursor + node { + lineItems { + edges { + node { + brand + entityId + imageUrl + name + subTotalListPrice { + currencyCode + value + } + } + } + } + shipments { + edges { + node { + shippingProviderName + tracking { + ... on OrderShipmentUrlOnlyTracking { + __typename + } + } + } + } + } + shippingAddress { + address1 + city + firstName + lastName + postalCode + stateOrProvince + } + shippingCost { + currencyCode + value + } + } + } + } + } + subTotal { + currencyCode + value + } + taxTotal { + currencyCode + value + } + totalIncTax { + currencyCode + value + } + updatedAt { + utc + } + } + } + } + ``` + </Tab> + <Tab> + ``` graphQL filename="Example response: Get order details" + { + "data": { + "site": { + "order": { + "billingAddress": { + "address1": "1800 Amphibious Blvd.", + "city": "Mountain View", + "company": "ExampleOrganization", + "country": "United States", + "countryCode": "US", + "email": "jane.doe@example.com", + "firstName": "Jane", + "lastName": "Doe", + "phone": "(800) 555-0100", + "postalCode": "94045", + "stateOrProvince": "California" + }, + "consignments": { + "shipping": { + "edges": [ + { + "cursor": "ABcYXgjb25uZWN0aW9uOjA=", + "node": { + "lineItems": { + "edges": [ + { + "node": { + "brand": "default", + "entityId": 1, + "imageUrl": "https://cdn11.bigcommerce.com/s-xyzfeyee1r/products/111/images/371/smithjournal1.1721236910.386.513.jpg?c=1null", + "name": "[Sample] Smith Journal 13", + "subTotalListPrice": { + "currencyCode": "USD", + "value": 25.0 + } + } + } + ] + }, + "shipments": { + "edges": [] + }, + "shippingAddress": { + "address1": "Avenida da Pastelaria, 1903", + "city": "Lisbon", + "firstName": "Kai", + "lastName": "N.", + "postalCode": "1229-076", + "stateOrProvince": "Rio del chocolate" + }, + "shippingCost": { + "currencyCode": "USD", + "value": 0.0 + } + } + } + ] + } + }, + "subTotal": { + "currencyCode": "USD", + "value": 25.0 + }, + "taxTotal": { + "currencyCode": "USD", + "value": 0.0 + }, + "totalIncTax": { + "currencyCode": "USD", + "value": 0.0 + }, + "updatedAt": { + "utc": "2024-04-02T15:04:08Z" + } + } + } + } + } + ``` + </Tab> +</Tabs> + +Join our [Developer community](/community) to share your feedback with us in the BigCommerceDevs Slack or on our Discord server. + +## Resources + +### Documentation + +* [GraphQL storefront API overview](/docs/storefront/graphql) +* [Guide to API Accounts: Store-level API accounts](/docs/start/authentication/api-accounts#store-level-api-accounts) +* [Guide to API accounts: OAuth token creation scopes](/docs/start/authentication/api-accounts#token-creation-scopes) +* [Authentication and example requests: BigCommerce-generated JWTs](/docs/start/authentication#bigcommerce-generated-jwts) + +### API reference + +#### Storefront tokens + +* [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) +* [Create a customer impersonation token](/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token) + +#### GraphQL Storefront API: orders + +* [Storefront Orders](/docs/rest-storefront/orders) + +#### REST Management API: orders + +* [Orders V2](/docs/rest-management/orders/) +* [Orders V3](/docs/rest-management/transactions) + +### Community + +* [Developer community](/community) \ No newline at end of file From a6bf3c2d824938b8479daa30a1f2884c0b8b383a Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 30 Jul 2024 12:05:17 -0500 Subject: [PATCH 107/221] DEVDOCS-6046: [New] Create https-webhook-overview (#405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6046] ## What changed? Moved file over from api-spec-ssot ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6046]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6046?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../webhooks/https-webhook-overview | 280 ++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 docs/integrations/webhooks/https-webhook-overview diff --git a/docs/integrations/webhooks/https-webhook-overview b/docs/integrations/webhooks/https-webhook-overview new file mode 100644 index 000000000..0e32266da --- /dev/null +++ b/docs/integrations/webhooks/https-webhook-overview @@ -0,0 +1,280 @@ +# HTTPS Webhooks Overview + +HTTPS webhooks are push APIs delivered over HTTPS, triggered by an event on the BigCommerce platform, and sent to a destination system. + +## Creating a webhook + +<Tabs items={['HTTPS example', 'GraphQL example']}> +<Tab> +To create a webhook, send a `POST` request to the [Create a webhook](/docs/webhooks/webhooks/manage-webhooks-bulk#create-a-webhooks) endpoint. Set the `scope` property value equal to the **Name / Scope** of the webhook you want to create. If a hook fires twice for the same event, both request bodies rely on the same hash. + + +```http filename="Example request: Create a webhook" showLineNumbers copy +POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/hooks +X-Auth-Token: {{ACCESS_TOKEN}} +Content-Type: application/json +Accept: application/json + +{ + "scope": "store/order/updated", + "destination": "https://yourapp.example.com/webhooks", // custom ports are not supported + "is_active": true, + "headers": { + "username": "My-Custom-Header" + "value": "My custom header value" + } +} +``` + +{/* <!-- Consult the Webhooks API reference for more about the differences. --> */} + +```json filename="Example response: Create a webhook" showLineNumbers copy +{ + "created_at": 1580329317, + "destination": "https://yourapp.example.com/webhooks", // custom ports are not supported + "headers": { + "username": "My-Custom-Header", + "value": "My custom header value" + }, + "id": 20172984, + "is_active": true, + "scope": "store/order/updated", + "store_hash": "{{STORE_HASH}}", + "updated_at": 1580329317 +} +``` + +<Callout type="info"> + * The `destination` URL must be served on port **443**; custom ports are not currently supported. + * It can take up to one minute for a newly created webhook to work. +</Callout> +</Tab> + +<Tab> +```graphql filename="Example mutation: Create a GraphQL webhook" showLineNumbers copy + +mutation CreateHTTPWebhook($input:CreateHttpsWebhookInput!) { + webhook { + createHttpsWebhook(input: $input) { + webhook { + id + scope + destination + status + isActive + createdAt + } + } + } +} +``` +```graphql filename="Example GraphQL variables: Create a GraphQL webhook" showLineNumbers copy + +{ + "input": { + + "scope": "store/order/updated", + "destination": "https://6676-8-29-231-139.ngrok-free.app/" + } +} +``` + +```json filename="Example response: Create a GraphQL webhook" showLineNumbers copy + +{ + "data": { + "webhook": { + "createHttpsWebhook": { + "webhook": { + "id": "bc/store/webhook/26713462", + "scope": "store/order/updated", + "destination": "https://yourapp.example.com/", + "status": ACTIVE, + "isActive": true, + "createdAt": "2023-07-05T20:14:05Z" + } + } + } + } +} +``` +</Tab> +</Tabs> + +## Callback payload + +<Tabs items={['HTTPS example', 'GraphQL example']}> +<Tab> + +When a webhook is triggered, BigCommerce will `POST` a light payload containing event details to the destination server. For example, the `data` object for `store/order/statusUpdated` contains only the order `id`. + +```json filename="HTTPS example: store/order/statusUpdated payload object" showLineNumbers copy +{ + "store_id":"11111", + "producer":"stores/abcde", + "scope":"store/order/statusUpdated", + "data":{ + "type":"order", + "id":173331 + }, + "hash":"3f9ea420af83450d7ef9f78b08c8af25b2213637" + } +``` + +You can then make a request to the [Get an order](/docs/rest-management/orders#get-an-order) endpoint to obtain full order details. + +For more information on specific webhook events and their payloads, see [Webhook Events](/docs/integrations/webhooks/events). +</Tab> + +<Tab> +```json filename="GraphQL example: store/order/updated payload object" showLineNumbers copy + +{ + "producer": "stores/abcde", + "hash": "0f1b5800def7b505369b08b4a3503a1db2c4b1a6", + "created_at": 1688588419, + "store_id": "1001197568", + "scope": "store/order/updated", + "data": { + "type": "order", + "id": 272 + } +} +``` +</Tab> +</Tabs> + +## Handling callbacks + +To acknowledge a callback has been received without issue, the destination server must return an `HTTP 200` response — no response, or any response outside the `200` range indicates the callback was not received. If this happens, the webhook service will use the [retry mechanism](#callback-retry-mechanism) described below. + +Need to set up a quick webhook destination URL for testing? See [Tools for Debugging and Testing Webhooks](#tools). + +## Callback retry mechanism + +The webhooks service will do its best to deliver events to the destination callback URI. It is best practice for the application to respond to the callback before taking any other action that would slow its response. Doing otherwise triggers BigCommerce's callback retry mechanism. + +The webhook service may send many payloads to a single URI in quick succession. Because of this, we use a sliding scale across a ** two-minute window** to calculate a callback response success rate for each remote destination. When the webhook service receives a `2xx` response, the destination's success count is increased. If there's no response or the remote server times out, the destination's failure count is increased. Based on these two numbers, a success ratio is calculated. + + +The following process will determine whether the destination URI gets blocklisted: + +1. Once a webhook is triggered, the service checks if your callback URI is on the blocklist. +2. If not, we calculate a success ratio for the remote server based on its success/failure count in a **two-minute window**. +3. If at any point in the two-minute window, the success/failure ratio dips below **90%**, the destination URI's domain will be blocklisted for **three minutes**. +4. Webhook events triggered during this time are sent to our retry queues to be executed later when the domain is no longer blocklisted and once the retry queue time has elapsed. + +Once a domain is no longer blocklisted, all new webhook requests will be sent as they occur. Event requests sent to the retry queue during a blocklisting period will be delivered according to the retry queue schedule. + +The webhook dispatcher will then attempt several retries (at increasing intervals) until the maximum retry limit is reached. + +| Intervals | +|:---| +| Retries after 60 seconds | +| Retries after 180 seconds | +| Retries after 300 seconds | +| Retries after 600 seconds | +| Retries after 900 seconds | +| Retries after 1800 seconds | +| Retries after 3600 seconds | +| Retries after 7200 seconds | +| Retries after 21600 seconds | +| Retries after 50400 seconds | +| Retries after 86400 seconds | + +After the final retry attempt (cumulatively **48 hours** after the first delivery attempt), the webhook will be deactivated, and an email will be sent to the email address registered for the subscribing app. You can reactivate the webhook by setting it to active using the [Update a webhook](/docs/webhooks/webhooks/manage-webhooks-single#update-a-webhook) endpoint. + +<Callout type="info"> + * A domain's success rate for a given sliding window is not calculated until `100` webhook requests are sent - this means the domain will not be blocklisted for the first `100` webhooks sent within the time window (regardless of response), as all webhooks are sent until the minimum threshold has been reached for the current time window. + * The webhook dispatcher determines whether retries are needed based on responses from the subscribed domain as a whole, not by specific hooks. For example, `domain.com/webhook-1` and `domain.com/webhook-2` will affect each other for failures and retries, as both URLs belong to the same domain. +</Callout> + +## Security + +To ensure webhook callback requests are secure, BigCommerce takes the following precautions: + +* Create webhook requests to accept an optional header object in every HTTP webhook, which you can use to authenticate callback requests. +* A timestamp is used to protect against replay attacks. +* We recommend validating the signature and timestamp before processing any webhook event. + +### Webhook signature + +You can verify the signature is legitimate by using the [Webhook Verifer](https://www.standardwebhooks.com/verify) provided by Standard Webhook or the code samples provided below. + +The code samples below show how to validate the webhook signature in different programming languages. + +<Tabs items={['Python', 'Node.js']}> + +<Tab> +Use the following command to run the calculation: + +```py filename="Python" showLineNumbers copy +import functions_framework +from standardwebhooks.webhooks import Webhook +from os import getenv +import base64 + +# Fetch the client secret from environment variables +client_secret = getenv('CLIENT_SECRET') + +# Encode the client secret in base64 +encoded_client_secret = base64.b64encode(client_secret.encode()).decode() + +@functions_framework.http +def hello_http(request): + webhook_payload = request.get_data() + webhook_headers = request.headers + print(str(webhook_payload)) + print(str(webhook_headers)) + + result = 'no_result' + + # Use the encoded client secret + wh = Webhook(encoded_client_secret) + try: + result = str(wh.verify(webhook_payload, webhook_headers)) + print('verified') + except Exception as e: + result = f"Could not verify: {e}" + + print(result) + return result +``` +</Tab> + +<Tab> +Use the following command to run the calculation: + +```js filename="Node.js" showLineNumbers copy +const functions = require('@google-cloud/functions-framework'); +const { Webhook } = require('standardwebhooks'); + +// Fetch the client secret from environment variables and encode it in base64 +const client_secret = process.env.CLIENT_SECRET; +const encoded_client_secret = Buffer.from(client_secret).toString('base64'); + +functions.http('helloHttp', (req, res) => { + + try { + const webhook_headers = req.headers; + console.log(webhook_headers); + + const webhook_payload = req.rawBody; + console.log(webhook_payload); + console.log(typeof(webhook_payload)); + + // Use the encoded client secret + const wh = new Webhook(encoded_client_secret); + console.log(JSON.stringify(wh.verify(webhook_payload, webhook_headers))); + } catch (error) { + console.error(error); + } + + res.send(`Success`); +}); +``` +</Tab> +</Tabs> + +## Resources +* [Verify Standard Webhooks](https://www.standardwebhooks.com/verify) From 26fe812e2c9e07a59a217d83e2d65a656f189b69 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Tue, 30 Jul 2024 13:02:32 -0500 Subject: [PATCH 108/221] (no ticket): Channels feature, update allowed PUT statuses (#406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # (no ticket): Channels feature, update allowed PUT statuses ## What changed? <!-- Provide a bulleted list in the present tense --> * Indicate that Update a channel does not support restoring a channel to `prelaunch` status. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Fixed a bug to indicate that the Update a channel endpoint does not support restoring a channel to `prelaunch` status. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping FYI @bc-tgomez thanks @mattcoy-arcticleaf! --- reference/channels.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index edabf6835..d4d5a805b 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -3024,7 +3024,7 @@ components: x-internal: false ChannelStatus: type: string - description: 'The status of the channel; channel `type`, `platform`, and `status` must be a [valid combination](/docs/rest-management/channels#status). `terminated` is not valid for `PUT` or `POST` requests. `deleted` is not valid for `POST` requests.' + description: 'The status of the channel; channel `type`, `platform`, and `status` must be a [valid combination](/docs/rest-management/channels#status). `terminated` is not valid for `PUT` or `POST` requests. `deleted` is not valid for `POST` requests. `prelaunch` is not valid for `PUT` requests.' enum: - active - prelaunch From df73de730e8a45e6dbc313de7858f03e920c92fb Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 30 Jul 2024 13:32:02 -0500 Subject: [PATCH 109/221] DEVDOCS-5923: [update] add customer access token (#365) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5923] ## What changed? Added customer access token to documentation ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5923]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5923?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../authentication/graphql-storefront.mdx | 223 +++++++++++++++++- docs/storefront/graphql/index.mdx | 2 +- 2 files changed, 219 insertions(+), 6 deletions(-) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx index 1d93d1e74..b451d5376 100644 --- a/docs/start/authentication/graphql-storefront.mdx +++ b/docs/start/authentication/graphql-storefront.mdx @@ -1,6 +1,6 @@ # Authenticating requests to the GraphQL Storefront API -Authenticate GraphQL Storefront API requests using bearer tokens passed with the `Authorization` header. You can authenticate using two different kinds of tokens: [storefront tokens](#storefront-tokens) or [customer impersonation tokens](#customer-impersonation-tokens). +Authenticate GraphQL Storefront API requests using bearer tokens passed with the `Authorization` header. You can authenticate using two different kinds of tokens: [storefront tokens](#storefront-tokens) or [customer impersonation tokens](#customer-impersonation-tokens). ```http filename="Example request configuration" showLineNumbers copy POST https://your_store.example.com/graphql @@ -29,7 +29,7 @@ For security reasons, GraphQL Storefront API tokens are scoped to particular [CO You can create storefront tokens by API. On Stencil storefronts, you can also [access an autogenerated token](#using-auto-generated-tokens-on-stencil-storefronts) using in-page context. -Use the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) REST endpoint to create storefront bearer tokens. Add the [storefront API tokens creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. +Use the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) REST endpoint to create storefront bearer tokens. Add the [storefront API tokens creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. You can use a storefront bearer token to create a [customer access token](#customer-access-token). <Callout type="info"> The channel ID for the default Stencil storefront is `1`. To learn more about channels, see [the channels section of the multi-storefront overview](/docs/storefront/multi-storefront#channels). For more about using the GraphQL Storefront API on custom channels, consult the GraphQL Storefront API overview's [FAQ section on alternate channels](/docs/storefront/graphql#i-want-to-run-requests-in-the-context-of-another-channel). @@ -66,17 +66,230 @@ content-type: application/json </Tab> </Tabs> +#### Customer access tokens + +A customer access token is unique to an individual user's account because it represents an authenticated storefront session for GraphQL requests. You can obtain and use a customer access token only for server-to-server requests. Therefore, you must use the customer access token with a regular storefront token. A customer access token becomes invalid on all devices when you log out of a single device. + +<Callout type="warning"> +Do not use this token for browser-side or client-side requests. +</Callout> + +##### Obtaining a customer access token + +There are two options to obtain a customer access token. + +1. Login mutation +2. Login with a JWT + +###### Login mutation + +Enter your user email and password to use the login mutation. When using the login mutation in a server-to-server context, the mutation will return a customer access token in response to login actions as part of the GraphQL body instead of a cookie header. From there, you can store the customer access token in the presentation layer's session management system and send it with future GraphQL requests. If the login mutation request is from a browser, we will not return the customer access token in the body, and will instead set a cookie. + +<Callout type="info"> +Use the [Create a Token](/docs/rest-authentication/tokens#create-a-token) endpoint to generate the storefront bearer token needed to run the login mutation call. If you still have issues creating a customer access token, we recommend clearing your cookies to resolve any loading issues. +</Callout> + +<Tabs items={['Request', 'Response']}> +<Tab> +```graphql filename="Example login mutation: Create a customer access token" showLineNumbers copy +# Creates a customer access token +POST https://{{storeDomain}}/graphql +Authorization: Bearer {Storefront token} +accept: application/json +content-type: application/json + +mutation Login($email: String!, $pass: String!) { + login(email: $email, password: $pass) { + result + customer { + entityId + email + } + customerAccessToken { + value + expiresAt + } + } +} +``` + +```json filename="GraphQL variables" showLineNumbers copy +{ +"email": "user@email.com", +"pass": "password" +} +``` +</Tab> +<Tab> + +```json filename="Example login mutation: Create a customer access token" showLineNumbers copy +{ + "data": { + "login": { + "result": "success", + "customer": { + "entityId": 21, + "email": "user@email.com" + }, + "customerAccessToken": { + "value": "53ea9099d5484cdedddbf8f59a73bc284afefd7943c4dbe578db52435e0c0de7_1721406629", + "expiresAt": "2024-07-19T16:30:29Z" + } + } + } +} +``` +</Tab> +</Tabs> + +###### Login with a JWT + +The second option is to use the `loginWithCustomerLoginJwt` mutation to pass your customer JSON web token instead of the user's email and password. In this scenario, you will generate a JWT that contains key information in the payload for the login to be successful. You will use this JWT in the login mutation to receive a customer access token. + +<Callout type="info"> +For information on creating a JWT, see the [Customer Login API](/docs/start/authentication/customer-login) article for instructions. +</Callout> + +<Tabs items={['Request', 'Response']}> +<Tab> + +```graphql filename="Example JWT login mutation: Create a customer access token" showLineNumbers copy +# Creates a customer access token +POST https://{{storeDomain}}/graphql +Authorization: Bearer {Storefront token} +accept: application/json +content-type: application/json + +mutation Login($jwt: String!) { + loginWithCustomerLoginJwt(jwt: $jwt) { + customer { + entityId + email + } + customerAccessToken { + value + expiresAt + } + } +} +``` + +```json filename="GraphQL variables" showLineNumbers copy +{"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3MjM3Mzc2Y3JiNnJrcTFhY2h3MmdrdTQ2M2FjeGk4IiwiaWF0IjoxNzIwODE0NjgyLCJqdGkiOiJhMDA1OGQ0MC0zNmExLTAxM2ItOTBmNC03ZThiMTE1MDA4YTIiLCJvcGVyYXRpb24iOiJjdXN0b21lcl9sb2dpbiIsInN0b3JlX2hhc2giOiJ3MGFzdGVlOWpvIiwiY3VzdG9tZXJfaWQiOjIyfQ.bfiEpk-IDCqQ4DqpErVCEUUQDjs-vtWxHsEufkUFqMs" +} +``` +</Tab> +<Tab> + +```json filename="Example JWT login mutation: Create a customer access token" showLineNumbers copy +{ + "data": { + "loginWithCustomerLoginJwt": { + "customer": { + "entityId": 22, + "email": "user@email.com" + }, + "customerAccessToken": { + "value": "ee973d6566a7c691af4602f344d866ecaa45bdcbdf2075d29d5e70fd0716b7c5_1721657159", + "expiresAt": "2024-07-22T14:05:59Z" + } + } + } +} +``` +</Tab> +</Tabs> + + +##### Using a Customer Access Token + +You can assign the customer access token obtained using one of the mutations described above to the `X-Bc-Customer-Access-Token` header for future queries. You can use this token for a specific shopper session access until it is invalidated or if it expires due to time. The token is invalidated when you use the logout mutation with the `X-Bc-Customer-Access-Token` header. + +<Tabs items={['Request', 'Response']}> +<Tab> + +```graphql filename="Example customer query" showLineNumbers copy +POST https://{{storeDomain}}/graphql +Authorization: Bearer {Storefront token} +X-Bc-Customer-Access-Token: {Customer access token} +accept: application/json +content-type: application/json + +query CustomerAttributes { + customer { + firstName + lastName + email + entityId + customerGroupId + attributeCount + attributes { + shirtSize: attribute(entityId:123) { + entityId + value + } + favoriteColor: attribute(entityId:456) { + entityId + value + } + } + } +} +``` +</Tab> +<Tab> + +```json filename="Example customer query" showLineNumbers copy +{ + "data": { + "customer": { + "firstName": "string", + "lastName": "string", + "email": "user@email.com", + "entityId": 21, + "customerGroupId": 2, + "attributeCount": 0, + "attributes": { + "shirtSize": { + "entityId": 123, + "value": medium + }, + "favoriteColor": { + "entityId": 456, + "value": blue + } + } + } + } +} +``` +</Tab> +</Tabs> + + ### Using auto-generated tokens on Stencil storefronts On Stencil storefronts, you can access a token at render time and pass the token to client-side code using the `{{settings.storefront_api.token}}` Handlebars property. This auto-generated token has an expiry period of 24-48 hours and will rotate before expiration. + ## Customer impersonation tokens -You can use customer impersonation tokens to authenticate requests to the GraphQL Storefront API in server-to-server and headless interactions. The API will reject any customer impersonation token-authenticated requests that originate from a web browser and are not proxied. Use these tokens in NextJS applications; NextJS proxies requests by default. +<Callout type="warning"> +Because of the flexible use of the customer impersonation token, BigCommerce recommends using a more secure option like the [customer access token](#customer-access-tokens). Customer impersonation tokens allow you to access any customer by simply changing the `X-Bc-Customer-Id` value in the header for server-to-server communications. However, the customer access token is tied directly to a specific customer as part of the token payload providing a more secure experience. In addition, customer access tokens have the following added benefits: +* A customer access token is unique to an individual user's account. +* A customer access token allows users to act on different systems. +* A customer access token becomes invalid on all devices when you log out on a single device. +</Callout> + +You can use customer impersonation tokens to authenticate requests to the GraphQL Storefront API in server-to-server and headless interactions. The API will reject any customer impersonation token-authenticated requests that originate from a web browser and are not proxied. + +<Callout type="warning"> +In the future, we will not support all customer features when using a customer impersonation token. More security-sensitive features will only work with the customer access token. For example, features like exposing a customer's Saved Payment Methods will only work with a customer access token. +</Callout> -Customer impersonation token-authenticated requests can query store information for any customer by passing the customer ID using the `X-Bc-Customer-Id` header. Information that you request will be specific to the subject customer, including product pricing and availability, customer account details, and more. +Customer impersonation token-authenticated requests will be specific to the customer, including product pricing and availability, customer account details, and more. -It is not necessary to generate a new token for each customer ID. You may use a single token at any given time for your application, and specify a distinct customer ID for each set of requests. +It is not necessary to generate a new token for each customer ID. You may use a single token at any given time for your application and specify a distinct customer ID for each set of requests. Using a customer impersonation token does not automatically sign a customer in. For that, use the [customer login mutation](#signing-customers-in) or the [Customer Login API](/docs/rest-authentication/customer-login). diff --git a/docs/storefront/graphql/index.mdx b/docs/storefront/graphql/index.mdx index 5f3c02418..2837fbb57 100644 --- a/docs/storefront/graphql/index.mdx +++ b/docs/storefront/graphql/index.mdx @@ -591,7 +591,7 @@ Use normal GraphQL Storefront API tokens. According to the [Principle of least p ### I want to run requests from a server, and I need to support customer login -Use a Customer Impersonation token and store it securely on your server like other secrets. When you need to run requests in the context of a particular customer (for example, if they've logged in to your application), send their BigCommerce Customer ID along with the request as the `x-bc-customer-id` header. +The recommended option is to use a regular storefront token with a customer access token. You can exchange customer credentials for a customer access token using the login mutation and send the token on future requests using the `X-Bc-Customer-Access-Token` header. The other possible but least preferred option is to use a customer impersonation token and store it securely on your server like other secrets. When you need to run requests in the context of a particular customer (for example, if they've logged in to your application), send their BigCommerce Customer ID along with the request as the `X-Bc-Customer-Id` header. This option provides less security but is available to use. ### I want a list of GraphQL error messages From 7466d837453e2ffdbf6b1db57b0fb7749edc9b41 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:35:29 -0500 Subject: [PATCH 110/221] DEVDOCS-5921 [update]: Price List Records, fix incorrect schema (#402) --- reference/price_lists.v3.yml | 46 +++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index 84218b0a5..a19ec138b 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -771,7 +771,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/PriceRecordBatchItem' + type: array + items: + $ref: '#/components/schemas/PriceRecordBatchItem' required: true responses: '200': @@ -2782,27 +2784,27 @@ components: meta: $ref: '#/components/schemas/Meta' PriceRecordBatchItem: - type: object - properties: - price_list_id: - type: integer - description: The price list ID the price record is associated with. - example: 1 - variant_id: - type: integer - description: The price list with which the price record is associated. Either `variant_id` or `sku` is required. - example: 5 - sku: - type: string - description: The SKU for the variant with which this price record is associated. Either `sku` or `variant_id` is required. - example: SKU-001 - currency: - type: string - description: The 3-letter country code with which this price record is associated. - format: ISO:4217 - example: usd - items: - $ref: '#/components/schemas/PriceRecordBase' + allOf: + - type: object + properties: + price_list_id: + type: integer + description: The price list ID the price record is associated with. + example: 1 + variant_id: + type: integer + description: The price list with which the price record is associated. Either `variant_id` or `sku` is required. + example: 5 + sku: + type: string + description: The SKU for the variant with which this price record is associated. Either `sku` or `variant_id` is required. + example: SKU-001 + currency: + type: string + description: The 3-letter country code with which this price record is associated. + format: ISO:4217 + example: usd + - $ref: '#/components/schemas/PriceRecordBase' PriceRecordBase: type: object properties: From 9a49e959135cb731a90da91962c1adaa352b9d1b Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:38:21 -0500 Subject: [PATCH 111/221] DEVDOCS-5938 [update]: Price Lists, deleting price record (#400) --- docs/store-operations/pricing/price-lists.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/store-operations/pricing/price-lists.mdx b/docs/store-operations/pricing/price-lists.mdx index 294b4dc7f..4b0ccab2e 100644 --- a/docs/store-operations/pricing/price-lists.mdx +++ b/docs/store-operations/pricing/price-lists.mdx @@ -91,7 +91,9 @@ Under `discount_rules` the `type` is set to `price_list`. The `price_list_id` is - Bulk pricing tiers may additionally be associated with a Price Record to indicate different pricing as the quantity in cart increases. -- If a variant has a `Price Record`, any existing product-level bulk pricing will not apply in the cart. For variants without `Price Records`, any existing product bulk pricing will apply. +- If a variant has a `Price Record`, any existing product-level bulk pricing will not apply in the cart. For variants without `Price Records`, any existing product bulk pricing will apply. + +- Deleting a `Price Record` defaults the bulk price back to product bulk pricing. - `Price Lists Records` accepts bulk upsert. You can only do one [Bulk upsert](/docs/rest-management/price-lists/price-lists-records#upsert-price-list-records) at a time. Running more than one in parallel on the **same store** will cause a `429` error, and the request will fail. From ca460cf83a8524a764eded461b5156b8ecd7f112 Mon Sep 17 00:00:00 2001 From: Sarah Riehl <sarah.riehl@bigcommerce.com> Date: Tue, 30 Jul 2024 17:57:56 -0500 Subject: [PATCH 112/221] SELFDEV-761: [fix] API rate limits, fix 404s (#408) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # SELFDEV-761 ## What changed? <!-- Provide a bulleted list in the present tense --> * update links to fix 404s ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * N/A ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bc-tgomez --- docs/api-docs/getting-started/api-rate-limits.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/api-docs/getting-started/api-rate-limits.mdx b/docs/api-docs/getting-started/api-rate-limits.mdx index a52884e42..da052771f 100644 --- a/docs/api-docs/getting-started/api-rate-limits.mdx +++ b/docs/api-docs/getting-started/api-rate-limits.mdx @@ -113,9 +113,9 @@ By following these steps, you can ensure your requests are retried responsibly o ### Related articles -* [Platform limits - Store limits](/https://support.bigcommerce.com/s/article/Platform-Limits?language=en_US#storelimits) (BigCommerce Knowledge Base) -* [About our APIs - Response headers](/https://developer.bigcommerce.com/docs/start/about#response-headers) +* [Platform limits - Store limits](https://support.bigcommerce.com/s/article/Platform-Limits?language=en_US#storelimits) (BigCommerce Knowledge Base) +* [About our APIs - Response headers](/docs/start/about#response-headers) ## Additional resources -* [BigCommerce: Incorporated terms - API terms](/https://www.bigcommerce.com/terms/api-terms/) (BigCommerce terms of service) \ No newline at end of file +* [BigCommerce: Incorporated terms - API terms](https://www.bigcommerce.com/terms/api-terms/) (BigCommerce terms of service) From 1f2c207c1d96edac3eb1295872fc442729e9a433 Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Tue, 30 Jul 2024 19:02:44 -0400 Subject: [PATCH 113/221] Change "Big Design" to "BigDesign" (#394) ## What changed? Removed space between Big and Design, since we call it BigDesign. --- docs/integrations/apps/guide/auth.mdx | 2 +- docs/integrations/apps/guide/best-practices.mdx | 2 +- docs/integrations/apps/guide/buttons.mdx | 4 ++-- docs/integrations/apps/guide/callbacks.mdx | 4 ++-- docs/integrations/apps/guide/events.mdx | 4 ++-- docs/integrations/apps/guide/index.mdx | 2 +- docs/integrations/apps/guide/publishing.mdx | 2 +- docs/integrations/apps/guide/types.mdx | 2 +- docs/integrations/apps/guide/ui.mdx | 4 ++-- docs/integrations/apps/guide/users.mdx | 4 ++-- docs/integrations/apps/index.mdx | 4 ++-- docs/integrations/channels/guide/requirements.mdx | 2 +- docs/integrations/channels/index.mdx | 2 +- docs/integrations/channels/toolkit-reference.mdx | 2 +- docs/storefront/cart-checkout/draft/channels-sites-routes.mdx | 4 ++-- 15 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/integrations/apps/guide/auth.mdx b/docs/integrations/apps/guide/auth.mdx index 8f6981769..2638b105f 100644 --- a/docs/integrations/apps/guide/auth.mdx +++ b/docs/integrations/apps/guide/auth.mdx @@ -202,7 +202,7 @@ The following BigCommerce API clients expose helper methods for BigCommerce's co * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts diff --git a/docs/integrations/apps/guide/best-practices.mdx b/docs/integrations/apps/guide/best-practices.mdx index 35f7f86f3..304393e60 100644 --- a/docs/integrations/apps/guide/best-practices.mdx +++ b/docs/integrations/apps/guide/best-practices.mdx @@ -98,7 +98,7 @@ BigCommerce hosts [Google Cloud Platform](https://cloud.google.com/) in the [us- * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts diff --git a/docs/integrations/apps/guide/buttons.mdx b/docs/integrations/apps/guide/buttons.mdx index 213a04a34..6694a6f09 100644 --- a/docs/integrations/apps/guide/buttons.mdx +++ b/docs/integrations/apps/guide/buttons.mdx @@ -86,10 +86,10 @@ end * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/integrations/apps/guide/callbacks.mdx b/docs/integrations/apps/guide/callbacks.mdx index b995175c1..82d3c1e2f 100644 --- a/docs/integrations/apps/guide/callbacks.mdx +++ b/docs/integrations/apps/guide/callbacks.mdx @@ -150,10 +150,10 @@ The following BigCommerce API clients expose helper methods for verifying the `s * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/integrations/apps/guide/events.mdx b/docs/integrations/apps/guide/events.mdx index ba86c78ae..bf3be6aed 100644 --- a/docs/integrations/apps/guide/events.mdx +++ b/docs/integrations/apps/guide/events.mdx @@ -71,10 +71,10 @@ Accept: application/json * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/integrations/apps/guide/index.mdx b/docs/integrations/apps/guide/index.mdx index b9d90fdcc..e9645f941 100644 --- a/docs/integrations/apps/guide/index.mdx +++ b/docs/integrations/apps/guide/index.mdx @@ -85,7 +85,7 @@ Any store registered to the same email as your [Developer Portal](https://devtoo * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts diff --git a/docs/integrations/apps/guide/publishing.mdx b/docs/integrations/apps/guide/publishing.mdx index 97f459af0..d0cd087ad 100644 --- a/docs/integrations/apps/guide/publishing.mdx +++ b/docs/integrations/apps/guide/publishing.mdx @@ -138,7 +138,7 @@ can take up to 24 hours to appear on the App Marketplace. Feel free to use this * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts diff --git a/docs/integrations/apps/guide/types.mdx b/docs/integrations/apps/guide/types.mdx index dac64b20c..c66c0dd56 100644 --- a/docs/integrations/apps/guide/types.mdx +++ b/docs/integrations/apps/guide/types.mdx @@ -63,7 +63,7 @@ There are three visibility options for apps: **Draft**, **Unlisted**, and **Publ * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts diff --git a/docs/integrations/apps/guide/ui.mdx b/docs/integrations/apps/guide/ui.mdx index 79c7afe86..9dcfb957b 100644 --- a/docs/integrations/apps/guide/ui.mdx +++ b/docs/integrations/apps/guide/ui.mdx @@ -83,11 +83,11 @@ To load inside the control panel iFrame, your app must do the following: * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/integrations/apps/guide/users.mdx b/docs/integrations/apps/guide/users.mdx index ed8481961..6cfa7bbff 100644 --- a/docs/integrations/apps/guide/users.mdx +++ b/docs/integrations/apps/guide/users.mdx @@ -53,10 +53,10 @@ For details about remove user and load requests, see [Single-click App Callbacks * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) diff --git a/docs/integrations/apps/index.mdx b/docs/integrations/apps/index.mdx index 82ecdb96a..3237ed83e 100644 --- a/docs/integrations/apps/index.mdx +++ b/docs/integrations/apps/index.mdx @@ -88,10 +88,10 @@ Here's how to get started with BigCommerce development: * [PHP API Client](https://github.com/bigcommerce/bigcommerce-api-php) * [Ruby API Client](https://github.com/bigcommerce/bigcommerce-api-ruby) * [Ruby OmniAuth Gem](https://github.com/bigcommerce/omniauth-bigcommerce) -* [Big Design Developer Playground](https://developer.bigcommerce.com/big-design) +* [BigDesign Developer Playground](https://developer.bigcommerce.com/big-design) * [Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1/duplicate) ### Blog posts * [How to Test App Authentication Locally with ngrok](https://medium.com/bigcommerce-developer-blog/how-to-test-app-authentication-locally-with-ngrok-149150bfe4cf) (BigCommerce Developer Blog) * [Building a BigCommerce App Using Laravel and React](https://medium.com/bigcommerce-developer-blog/building-a-bigcommerce-app-using-laravel-and-react-711ceceb5006) (BigCommerce Developer Blog) -* [Big Design Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) (BigCommerce Developer Blog) +* [BigDesign Tutorial](https://medium.com/bigcommerce-developer-blog/bigdesign-build-native-looking-uis-with-the-bigcommerce-design-system-fb06a01a24f2) (BigCommerce Developer Blog) diff --git a/docs/integrations/channels/guide/requirements.mdx b/docs/integrations/channels/guide/requirements.mdx index 22a26ff5c..9ba37d462 100644 --- a/docs/integrations/channels/guide/requirements.mdx +++ b/docs/integrations/channels/guide/requirements.mdx @@ -22,7 +22,7 @@ All Partners: Select Partners: -- Uses [Big Design](https://developer.bigcommerce.com/big-design). +- Uses [BigDesign](https://developer.bigcommerce.com/big-design). - Includes `config_meta.app.id` in the [create channel](/docs/rest-management/channels#create-a-channel) request. diff --git a/docs/integrations/channels/index.mdx b/docs/integrations/channels/index.mdx index 1711b90b5..e86e29294 100644 --- a/docs/integrations/channels/index.mdx +++ b/docs/integrations/channels/index.mdx @@ -19,7 +19,7 @@ With the Channels Toolkit, developers can quickly create an app that provides me While external channel integrations were possible to build by third parties previously, the BigCommerce's Channels Toolkit provides additional capabilities that extend the functionality a third party can offer to merchants and the value that third parties can get from providing such integrations via BigCommerce. -- **Big Design UI components** - These reusable components are built to be compatible with BigCommerce design guidelines and color palette, fully flexible, responsive, and accessible. They enable you to create an app that looks and feels native to BigCommerce, which ultimately allows merchants to scale their business as they can focus more on selling products and less on learning a new workflow every time they extend their offerings. BigDesign also enables you, as a technology partner, to launch your app more quickly, as it provides the building blocks and components needed to create a user experience. These components can be used for any type of app, not just channels. +- **BigDesign UI components** - These reusable components are built to be compatible with BigCommerce design guidelines and color palette, fully flexible, responsive, and accessible. They enable you to create an app that looks and feels native to BigCommerce, which ultimately allows merchants to scale their business as they can focus more on selling products and less on learning a new workflow every time they extend their offerings. BigDesign also enables you, as a technology partner, to launch your app more quickly, as it provides the building blocks and components needed to create a user experience. These components can be used for any type of app, not just channels. - **Channels and listings API endpoints** - These API endpoints allow product data to now be managed for specific channels and product listings, rather than just at the BigCommerce product catalog level. This includes overriding fields with different values, whether necessary for merchandising, external channel requirements, enabling a different language, or more. They also provide merchants with greater flexibility in creating differentiated shopping experiences, as they can track and analyze how their products are performing for each individual sales channel. diff --git a/docs/integrations/channels/toolkit-reference.mdx b/docs/integrations/channels/toolkit-reference.mdx index 4a1efaf7e..66bd1719c 100644 --- a/docs/integrations/channels/toolkit-reference.mdx +++ b/docs/integrations/channels/toolkit-reference.mdx @@ -58,7 +58,7 @@ To assist in the rapid development of apps that match the native UI and UX of th |-|-| |[BigDesign Developer Playground](https://developer.bigcommerce.com/big-design)| BigDesign react component documentation and playground | |[CodeSandbox app](https://codesandbox.io/s/mkvv7)| CodeSandbox app showcasing BigDesign components| -|[Big Design Repo](https://github.com/bigcommerce/big-design)|GitHub repository for BigDesign components| +|[BigDesign Repo](https://github.com/bigcommerce/big-design)|GitHub repository for BigDesign components| |[Figma UI Kit](https://figma.com/file/jTVuUkiZ1j3rux8WHG4IKK/BigDesign-UI-Kit?node-id=0%3A1)|Figma UI kit for BigDesign components| ### Required UI components diff --git a/docs/storefront/cart-checkout/draft/channels-sites-routes.mdx b/docs/storefront/cart-checkout/draft/channels-sites-routes.mdx index 6552bd141..53d9dba08 100644 --- a/docs/storefront/cart-checkout/draft/channels-sites-routes.mdx +++ b/docs/storefront/cart-checkout/draft/channels-sites-routes.mdx @@ -69,7 +69,7 @@ These APIs are not always required, but highly recommended for app developers ba | | Channel Manager | App Marketplace | |-|-|-| | Preferred app placement & discovery in the control panel | Yes | No | -| Required to use BigCommerce’s Big Design UI components | Yes | No| +| Required to use BigCommerce’s BigDesign UI components | Yes | No| | Must be express-installable app | Yes | No | | Must build and submit app according to BigCommerce requirements | Yes | Yes | @@ -79,7 +79,7 @@ Currently, certain channel apps, including native BigCommerce apps and specific ### BigDesign -In order to make an app feel and look native to BigCommerce, our Big Design UI components must be used, as they conform to our design and style guidelines. Any app that is in the channel manager must use these in order to maintain consistency with the BigCommerce control panel. +In order to make an app feel and look native to BigCommerce, our BigDesign UI components must be used, as they conform to our design and style guidelines. Any app that is in the channel manager must use these in order to maintain consistency with the BigCommerce control panel. ### Must be an Express-Installable App From 83f7165d6a399c7c821a644d69702db321a86658 Mon Sep 17 00:00:00 2001 From: Clem Blanco <clement.blanco@gmail.com> Date: Wed, 31 Jul 2024 01:15:13 +0200 Subject: [PATCH 114/221] Delete a Price List Record - currency and sku:in undocumented parameters (#341) Looks like these were missing, and maybe more? ## What changed? * `[DELETE] /v3/pricelists/{ID}/records` * added `currency` undocumented parameter * added `sku:in` undocumented parameter ## Release notes draft * Document query parameters `currency` and `sku:in` for `[DELETE] /v3/pricelists/{ID}/records` --------- Co-authored-by: Sarah Riehl <sarah.riehl@bigcommerce.com> --- reference/price_lists.v3.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index a19ec138b..5ab1cbec5 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -1635,15 +1635,29 @@ paths: required: true schema: type: integer + - name: 'currency' + in: query + description: The 3-letter currency code with which this set of prices is associated. + schema: + type: string - name: 'variant_id:in' in: query - description: A comma-separated list of IDs for one or more variants for which prices were requested. + description: A comma-separated list of IDs for one or more variants for which prices exist. style: form explode: false schema: type: array items: type: integer + - name: 'sku:in' + in: query + description: A comma-separated list of SKUs for one or more variants for which prices exist. + style: form + explode: false + schema: + type: array + items: + type: string responses: '204': description: '' From 71bf200861fd492e92f496efa1a8fb263bb12ba8 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 31 Jul 2024 09:50:28 -0500 Subject: [PATCH 115/221] update file extension (#409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> #NO TICKET ## What changed? Adding mdx extension ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} Co-authored-by: Sarah Riehl <sarah.riehl@bigcommerce.com> --- .../{https-webhook-overview => https-webhook-overview.mdx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/integrations/webhooks/{https-webhook-overview => https-webhook-overview.mdx} (100%) diff --git a/docs/integrations/webhooks/https-webhook-overview b/docs/integrations/webhooks/https-webhook-overview.mdx similarity index 100% rename from docs/integrations/webhooks/https-webhook-overview rename to docs/integrations/webhooks/https-webhook-overview.mdx From 5b218fe624bc6ec20734b34a18626782de6d75c7 Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Wed, 31 Jul 2024 13:11:46 -0400 Subject: [PATCH 116/221] Change location of theme uuiid path param to be endpoint-wide & remove site_id:in query param (#410) ## What changed? * `/themes/{uuid}/configurations` only has a single method, so you'd think it wouldn't matter whether you put the `uuid` path param to be method-specific or endpoint-wide. Still, the request runner expects it to be in the endpoint-scoped param object. * removed `site_id:in` because it is marked as required, yet not accepted by the endpoint (see screenshot below). Also, I could find no mention of it in the api-proxy-java repo. You might want to confirm with that team, though. <img width="694" alt="image" src="https://github.com/user-attachments/assets/f0ec4aa4-0da4-41b4-a42a-2add8063140e"> --- reference/themes.v3.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/reference/themes.v3.yml b/reference/themes.v3.yml index 6cc42d3b1..91f19d317 100644 --- a/reference/themes.v3.yml +++ b/reference/themes.v3.yml @@ -493,7 +493,6 @@ paths: **Usage Notes**: * At least one filter must be provided. parameters: - - $ref: '#/components/parameters/ThemeIdParam' - schema: type: array items: @@ -520,18 +519,9 @@ paths: in: query name: variation_uuid description: Filter configurations by a variation_uuid. - parameters: + parameters: + - $ref: '#/components/parameters/ThemeIdParam' - $ref: '#/components/parameters/Accept' - - in: query - name: 'site_id:in' - description: Filter configurations by passing a comma-separated list of site IDs. - required: true - style: form - explode: false - schema: - type: array - items: - type: integer - in: query name: 'uuid:in' description: Filter configurations by a list of configuration UUIDs. From b7d05aa92abc5585e86983100e4f16146bd43157 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 1 Aug 2024 10:20:09 -0500 Subject: [PATCH 117/221] Update graphql-storefront.mdx per Chancellor (#411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5923] ## What changed? Addressed comments left by @chanceaclark https://bigcommerce.slack.com/archives/C056HLZC36W/p1722371294497539?thread_ts=1722370409.269799&cid=C056HLZC36W ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5923]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5923?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/start/authentication/graphql-storefront.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx index b451d5376..62789a8d1 100644 --- a/docs/start/authentication/graphql-storefront.mdx +++ b/docs/start/authentication/graphql-storefront.mdx @@ -15,7 +15,7 @@ Content-Type: application/json ## Storefront tokens -Storefront tokens are most appropriate to use directly from the web browser. If you're creating a token for an application that will make server-to-server or proxied requests to the GraphQL Storefront API, or you work with customer data, use a [customer impersonation token](#customer-impersonation-tokens). If you only wish to query information from an anonymous shopper's perspective, use a storefront token. +Storefront tokens are most appropriate to use directly from the web browser but you can use them in server-to-server communications. If you're creating a token for an application that will make server-to-server or proxied requests to the GraphQL Storefront API, or you work with customer data, use a [customer impersonation token](#customer-impersonation-tokens). If you only wish to query information from an anonymous shopper's perspective, use a storefront token. ### Storefront token security @@ -23,7 +23,7 @@ Generally speaking, vanilla storefront tokens are not considered sensitive, and It is possible to create a long-lived token that does not expire. For greater security, we recommend creating shorter-lived tokens and rotating them periodically. -For security reasons, GraphQL Storefront API tokens are scoped to particular [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) origins, so you must supply the origin or origins on which you intend to use the token. If you have more than two origins, you will need multiple tokens. If you do not supply any CORS origins, the API will reject requests originating from web browsers, although you can still use it in other contexts. +For security reasons, GraphQL Storefront API tokens are scoped to particular [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) origins, so you must supply the origin or origins on which you intend to use the token. If you have more than two origins, you will need multiple tokens. If you do not supply any CORS origins, the API will reject requests originating from web browsers, although you can still use it in other contexts. GraphQL server-to-server requests do not require `allowed_cors_origins`. ### Create a storefront token @@ -32,7 +32,7 @@ You can create storefront tokens by API. On Stencil storefronts, you can also [a Use the [Create a storefront token](/docs/rest-authentication/tokens#create-a-token) REST endpoint to create storefront bearer tokens. Add the [storefront API tokens creation scope](/docs/start/authentication/api-accounts#token-creation-scopes) to the [store-level or app-level API account](/docs/start/authentication/api-accounts) you use to generate tokens. You can use a storefront bearer token to create a [customer access token](#customer-access-token). <Callout type="info"> - The channel ID for the default Stencil storefront is `1`. To learn more about channels, see [the channels section of the multi-storefront overview](/docs/storefront/multi-storefront#channels). For more about using the GraphQL Storefront API on custom channels, consult the GraphQL Storefront API overview's [FAQ section on alternate channels](/docs/storefront/graphql#i-want-to-run-requests-in-the-context-of-another-channel). + The channel ID for the default Stencil storefront is `1`. Storefront tokens don't require you to pass in channel IDs if you want to make the request on behalf of all the stores channels IDs. To learn more about channels, see [the channels section of the multi-storefront overview](/docs/storefront/multi-storefront#channels). For more about using the GraphQL Storefront API on custom channels, consult the GraphQL Storefront API overview's [FAQ section on alternate channels](/docs/storefront/graphql#i-want-to-run-requests-in-the-context-of-another-channel). </Callout> <Tabs items={['Request', 'Response']}> From bfcf626b035025409d6b3fd6052fa1c6fb795dd6 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 1 Aug 2024 14:49:53 -0500 Subject: [PATCH 118/221] DEVDOCS-5957 [update]: MSF International Enhancements, update set product custom fields (#412) --- .../graphql-admin/product-custom-fields.mdx | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx index f9bafb054..0051a4a68 100644 --- a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx @@ -37,9 +37,9 @@ The following example sets custom fields for the global store and the specified Content-Type: application/json Accept: application/json - mutation ($input: SetProductCustomFieldsInformationInput!) { + mutation ($input: UpdateProductCustomFieldsInput!) { product { - setProductCustomFieldsInformation(input: $input) { + updateProductCustomFields (input: $input) { product { customFields { edges { @@ -83,23 +83,25 @@ The following example sets custom fields for the global store and the specified "customFieldId": "bc/store/productCustomField/1", // For the global store - "name": "Custom Field Name", - "value": "Custom Field Value", + "name": "Global custom field name", + "value": "Global custom field value", // For the channel locale - "overrides": { - "channelLocaleContextData": { - "context": { - "channelId": "bc/store/channel/1", - "locale": "en-US" - }, - "data": { - "name": "Custom Field Name Override", - "value": "Custom Field Value Override", - "isVisible": true + "overrides": [ + { + "channelLocaleOverrides": { + "context": { + "channelId": "bc/store/channel/1", + "locale": "en-US" + }, + "data": { + "name": "Custom field name override", + "value": "Custom field value override", + "isVisible": true + } } } - } + ] } ] } @@ -112,25 +114,25 @@ The following example sets custom fields for the global store and the specified { "data": { "product": { - "setProductCustomFieldsInformation": { + "updateProductCustomFields": { "product": { "customFields": { "edges": [ { "node": { "id": "bc/store/productCustomField/1", - + // For the global store - "name": "Custom Field Name", - "value": "Custom Field Value", + "name": "Global custom field name", + "value": "Global custom field value", // For the channel locale "overrides": { "edges": [ { "node": { - "name": "Custom Field Name Override", - "value": "Custom Field Value Override", + "name": "Custom field name override", + "value": "Custom field value override", "isVisible": true, "context": { "channelId": "bc/store/channel/1", From 7664010fad2f56508e266389fce4572f4b54aef8 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 1 Aug 2024 15:44:51 -0500 Subject: [PATCH 119/221] Revert "DEVDOCS-5957: Revert Admin GQL API's custom fields" (#415) --- .../catalog/graphql-admin/product-basic-info.mdx | 1 + docs/store-operations/catalog/msf-international-enhancements.mdx | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx index f72c86683..6cc4f1a35 100644 --- a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx @@ -33,6 +33,7 @@ The following table describes the ID fields that you can use in inputs for mutat | | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | | `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | | | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | +| `customFieldId` | ID for a product custom field | [Get product custom fields](/docs/rest-catalog/products/custom-fields#get-product-custom-fields) | `"bc/store/productCustomField/1"` | ## Set basic product information at the global level diff --git a/docs/store-operations/catalog/msf-international-enhancements.mdx b/docs/store-operations/catalog/msf-international-enhancements.mdx index 48f5fb94e..61b14caf1 100644 --- a/docs/store-operations/catalog/msf-international-enhancements.mdx +++ b/docs/store-operations/catalog/msf-international-enhancements.mdx @@ -18,6 +18,7 @@ The following pages provide sample queries: - [Product modifier options](/docs/store-operations/catalog/graphql-admin/product-modifier-options) - [Product URL](/docs/store-operations/catalog/graphql-admin/product-url) - [Additional product attributes](/docs/store-operations/catalog/graphql-admin/product-attributes) +- [Product custom fields](/docs/store-operations/catalog/graphql-admin/product-custom-fields) You can create webhooks that trigger for the following events: - [Product updated](/docs/integrations/webhooks/events#products) From 70a202df92050ff093b62ea36a385dfa1cf2eb4f Mon Sep 17 00:00:00 2001 From: Brett Daniels <theromulans@gmail.com> Date: Fri, 2 Aug 2024 07:11:41 +1000 Subject: [PATCH 120/221] TAX-2153 [new]: Tax Provider API, add performance guidance (#404) # [TAX-2153] ## What changed? * Set context of the intention of the Tax Provider API request model supporting required inputs for standard tax requests. * Add advice on obtaining additional data that is not part of the Tax Provider API request model. * Add guidance on Tax Properties, relating to performance and the topic of "additional data". * Adjust `e.g.` to `e.g.,` as advised. ## Release notes draft * Added guidance on how to best achieve a performant solution with the Tax Provider API. [TAX-2153]: https://bigcommercecloud.atlassian.net/browse/TAX-2153?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/integrations/tax.mdx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/integrations/tax.mdx b/docs/integrations/tax.mdx index 6573be202..b0862ed29 100644 --- a/docs/integrations/tax.mdx +++ b/docs/integrations/tax.mdx @@ -26,7 +26,7 @@ Once your tax provider configuration is ready, we'll let you know through email. | Tax Provider Details | Required / Optional | Value(s) | Description | Example | | :--- | :--- | :--- | :--- | :--- | | App ID | Required | Integer | Tells us which tax provider configuration to use after the app is installed. | `123456` | -| Tax provider name | Required | String | Displayed in the control panel (e.g. **Settings > Setup > Tax > Add tax service**). | `Sample Tax` | +| Tax provider name | Required | String | Displayed in the control panel (e.g., **Settings > Setup > Tax > Add tax service**). | `Sample Tax` | | Transaction type | Required | Production, Test | Whether your tax provider will be handling production traffic or conducting test transactions. | `Production` | | Partner support email | Required | Email | Contact email that BigCommerce uses to send merchant support requests or discuss integration improvements with you. | `support@sampletax.example.com` | **Coverage** | | | | | @@ -147,12 +147,20 @@ BigCommerce sends requests for tax estimates on product item, shipping, and hand Merchants expect fast tax estimate responses to facilitate a streamlined checkout experience for their shoppers. Hence performance is an essential consideration for a tax provider. -To protect the shopper checkout experience from overly slow tax responses, tax estimate requests will time out after a set period of time. The default timeout threshold of four seconds is intended to support a wide variety of use cases (e.g. large tax estimate requests). +To protect the shopper checkout experience from overly slow tax responses, tax estimate requests will time out after a set period of time. The default timeout threshold of four seconds is intended to support a wide variety of use cases (e.g., large tax estimate requests). <Callout type="info"> You may request a lower timeout threshold to provide a better service to merchants. </Callout> +#### Handling additional inputs + +The Tax Provider API's request specification includes all necessary inputs for a standard tax estimation. If your solution needs extra inputs beyond what the request model, ensure this data is readily accessible on your system. + +Avoid synchronous calls to external systems when preparing your tax estimate response. We recommend you keep a copy of external data on your system and update it asynchronously through background jobs or queues as required (e.g., [subscribing to BigCommerce webhooks](https://developer.bigcommerce.com/docs/integrations/webhooks)). + +Using [Tax Properties](/docs/store-operations/tax/tax-properties) to enhance the initial Tax Provider API request can help you avoid looking up additional tax estimate inputs on external systems. + ## Document submission Document submission enables you to persist a tax quote request, replace it with another one, or invalidate it if necessary. From 6252c6ad2016a2183f632c64f51079c34fb7270c Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 2 Aug 2024 10:33:09 -0500 Subject: [PATCH 121/221] DEVDOCS-6015: [Update] upc, mpn, gtin (#401) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6015] ## What changed? Updated upc, mpn, and gtin fields ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6016]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6016?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [DEVDOCS-6015]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6015?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../catalog/product-variants_catalog.v3.yml | 28 +++++++++++++++---- reference/catalog/products_catalog.v3.yml | 26 ++++++++++++++--- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 7627a6dab..93d2a925e 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1132,7 +1132,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: false + maxLength: 13 + minLength: 0 inventory_level: type: integer description: |- @@ -1347,7 +1349,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: false + maxLength: 13 + minLength: 0 example: "1234" inventory_level: type: integer @@ -1472,7 +1476,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: false + maxLength: 13 + minLength: 0 inventory_level: type: integer description: |- @@ -1989,7 +1995,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 13 + minLength: 0 image_url: type: string description: Publicly available image url @@ -2019,9 +2027,13 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. + nullable: false gtin: type: string example: '012345678905' + nullable: false + maxLength: 13 + minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -2186,7 +2198,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 13 + minLength: 0 inventory_level: type: integer description: |- @@ -2217,10 +2231,14 @@ components: type: string description: Global Trade Item Number example: '012345678905' + nullable: false + maxLength: 13 + minLength: 0 mpn: type: string description: Manufacturer Part Number example: HV-HM02 + nullable: false description: Common Variant properties. - type: object properties: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index ccd3c7a60..70556add6 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -5367,7 +5367,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 13 + minLength: 0 inventory_level: type: integer description: |- @@ -5394,9 +5396,13 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. + nullable: false gtin: type: string example: '012345678905' + nullable: false + maxLength: 13 + minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -5559,7 +5565,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 13 + minLength: 0 inventory_level: type: integer description: |- @@ -7052,8 +7060,9 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 32 + maxLength: 13 minLength: 0 + nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7218,9 +7227,13 @@ components: gtin: type: string description: Global Trade Item Number + nullable: false + maxLength: 13 + minLength: 0 mpn: type: string description: Manufacturer Part Number + nullable: false date_last_imported: type: string description: the date when the Product had been imported @@ -7544,8 +7557,9 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 32 + maxLength: 13 minLength: 0 + nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7710,9 +7724,13 @@ components: gtin: type: string description: Global Trade Item Number + nullable: false + maxLength: 13 + minLength: 0 mpn: type: string description: Manufacturer Part Number + nullable: false date_last_imported: type: string description: the date when the Product had been imported From 0715ce0e7966ed70dc55ba44651ee058ffdfe328 Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Mon, 5 Aug 2024 12:39:56 -0400 Subject: [PATCH 122/221] Merge in B2B Edition documentation (#419) ## What changed? This PR merges in the B2B Edition documentation downloaded from the https://github.com/B3BC/boson repo. --- docs/b2b-edition/models/address/address.yaml | 172 + .../models/address/address_with_channel.yaml | 177 + docs/b2b-edition/models/company/company.yaml | 66 + .../models/company/company_base.yaml | 115 + .../extra_fields/extra_field_values.yaml | 23 + .../models/extra_fields/extra_fields.yaml | 54 + .../extra_fields/user_extra_field_values.yaml | 23 + .../models/invoice_portal/invoice.yaml | 487 ++ .../models/invoice_portal/receipt.yaml | 86 + .../models/invoice_portal/receipt_line.yaml | 84 + .../b2b-edition/models/order/order-extra.yaml | 74 + .../models/order/order-product.yaml | 55 + docs/b2b-edition/models/order/order.yaml | 120 + .../models/payment/invoice-payments.yaml | 196 + docs/b2b-edition/models/payment/payment.yaml | 25 + .../models/super_admin/super_admin.yaml | 29 + .../models/super_admin/super_admin_base.yaml | 23 + .../user/user-base-without-company.yaml | 60 + docs/b2b-edition/models/user/user-base.yaml | 63 + .../models/user/user-without-company.yaml | 43 + docs/b2b-edition/models/user/user.yaml | 75 + docs/b2b-edition/models/utils/pagination.yaml | 30 + .../models/utils/response-413.yaml | 23 + .../models/utils/response-object.yaml | 15 + docs/b2b-edition/specs/api-v2/openAPI.json | 7690 +++++++++++++++++ docs/b2b-edition/specs/api-v2/openAPI.yaml | 7222 ++++++++++++++++ .../specs/api-v3/address/address.yaml | 1319 +++ .../specs/api-v3/authentication.yaml | 604 ++ .../specs/api-v3/channel/channel.yaml | 208 + .../specs/api-v3/company/company.yaml | 3083 +++++++ .../invoice_management/config/config.yaml | 364 + .../invoice_management/invoice/invoice.yaml | 1537 ++++ .../invoice_management/payment/payment.yaml | 1520 ++++ .../invoice_management/receipt/receipt.yaml | 1308 +++ .../b2b-edition/specs/api-v3/order/order.yaml | 841 ++ .../specs/api-v3/payment/payment.yaml | 726 ++ .../b2b-edition/specs/api-v3/quote/quote.yaml | 1956 +++++ .../specs/api-v3/sales_staff/sales_staff.yaml | 371 + .../api-v3/shopping_list/shopping_list.yaml | 859 ++ .../specs/api-v3/super_admin/super_admin.yaml | 1264 +++ docs/b2b-edition/specs/api-v3/task/task.yaml | 407 + docs/b2b-edition/specs/api-v3/user/user.yaml | 985 +++ .../specs/storefront/app/address.yaml | 1596 ++++ .../specs/storefront/app/backend.yaml | 1532 ++++ .../specs/storefront/app/bc-api.yaml | 58 + .../specs/storefront/app/catalog.yaml | 130 + .../specs/storefront/app/company.yaml | 4215 +++++++++ .../specs/storefront/app/inner-sales-rep.yaml | 631 ++ .../specs/storefront/app/integrations.yaml | 595 ++ .../specs/storefront/app/notification.yaml | 439 + .../specs/storefront/app/order.yaml | 501 ++ .../specs/storefront/app/other.yaml | 59 + .../specs/storefront/app/product.yaml | 615 ++ .../specs/storefront/app/proxy.yaml | 135 + .../specs/storefront/app/quantity-limit.yaml | 185 + .../specs/storefront/app/quote.yaml | 277 + .../specs/storefront/app/sales-rep.yaml | 697 ++ .../specs/storefront/app/store-config.yaml | 1979 +++++ .../specs/storefront/app/store.yaml | 75 + .../specs/storefront/app/subscription.yaml | 88 + .../specs/storefront/app/webhooks.yaml | 420 + .../specs/storefront/authentication.yaml | 199 + .../invoice_protal/invoice/invoice.yaml | 1006 +++ .../invoice_protal/payment/payment.yaml | 147 + .../payment_bc_order/payment_bc_order.yaml | 321 + .../invoice_protal/receipet/receipt.yaml | 495 ++ .../specs/storefront/storefront.yaml | 5015 +++++++++++ .../specs/storefront/storefront/catalog.yaml | 371 + .../specs/storefront/storefront/company.yaml | 5157 +++++++++++ .../specs/storefront/storefront/order.yaml | 2056 +++++ .../specs/storefront/storefront/quote.yaml | 1435 +++ .../specs/storefront/storefront/rfq.yaml | 2134 +++++ .../storefront/storefront/sales-rep.yaml | 556 ++ .../specs/storefront/storefront/shopping.yaml | 1099 +++ .../storefront/storefront/store-config.yaml | 98 + .../specs/storefront/storefront/store.yaml | 411 + .../catalog/product-modifiers_catalog.v3.yml | 522 +- 77 files changed, 69356 insertions(+), 275 deletions(-) create mode 100644 docs/b2b-edition/models/address/address.yaml create mode 100644 docs/b2b-edition/models/address/address_with_channel.yaml create mode 100644 docs/b2b-edition/models/company/company.yaml create mode 100644 docs/b2b-edition/models/company/company_base.yaml create mode 100644 docs/b2b-edition/models/extra_fields/extra_field_values.yaml create mode 100644 docs/b2b-edition/models/extra_fields/extra_fields.yaml create mode 100644 docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml create mode 100644 docs/b2b-edition/models/invoice_portal/invoice.yaml create mode 100644 docs/b2b-edition/models/invoice_portal/receipt.yaml create mode 100644 docs/b2b-edition/models/invoice_portal/receipt_line.yaml create mode 100644 docs/b2b-edition/models/order/order-extra.yaml create mode 100644 docs/b2b-edition/models/order/order-product.yaml create mode 100644 docs/b2b-edition/models/order/order.yaml create mode 100644 docs/b2b-edition/models/payment/invoice-payments.yaml create mode 100644 docs/b2b-edition/models/payment/payment.yaml create mode 100644 docs/b2b-edition/models/super_admin/super_admin.yaml create mode 100644 docs/b2b-edition/models/super_admin/super_admin_base.yaml create mode 100644 docs/b2b-edition/models/user/user-base-without-company.yaml create mode 100644 docs/b2b-edition/models/user/user-base.yaml create mode 100644 docs/b2b-edition/models/user/user-without-company.yaml create mode 100644 docs/b2b-edition/models/user/user.yaml create mode 100644 docs/b2b-edition/models/utils/pagination.yaml create mode 100644 docs/b2b-edition/models/utils/response-413.yaml create mode 100644 docs/b2b-edition/models/utils/response-object.yaml create mode 100644 docs/b2b-edition/specs/api-v2/openAPI.json create mode 100644 docs/b2b-edition/specs/api-v2/openAPI.yaml create mode 100644 docs/b2b-edition/specs/api-v3/address/address.yaml create mode 100644 docs/b2b-edition/specs/api-v3/authentication.yaml create mode 100644 docs/b2b-edition/specs/api-v3/channel/channel.yaml create mode 100644 docs/b2b-edition/specs/api-v3/company/company.yaml create mode 100644 docs/b2b-edition/specs/api-v3/invoice_management/config/config.yaml create mode 100644 docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml create mode 100644 docs/b2b-edition/specs/api-v3/invoice_management/payment/payment.yaml create mode 100644 docs/b2b-edition/specs/api-v3/invoice_management/receipt/receipt.yaml create mode 100644 docs/b2b-edition/specs/api-v3/order/order.yaml create mode 100644 docs/b2b-edition/specs/api-v3/payment/payment.yaml create mode 100644 docs/b2b-edition/specs/api-v3/quote/quote.yaml create mode 100644 docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml create mode 100644 docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml create mode 100644 docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml create mode 100644 docs/b2b-edition/specs/api-v3/task/task.yaml create mode 100644 docs/b2b-edition/specs/api-v3/user/user.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/address.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/backend.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/bc-api.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/catalog.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/company.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/inner-sales-rep.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/integrations.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/notification.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/order.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/other.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/product.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/proxy.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/quantity-limit.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/quote.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/sales-rep.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/store-config.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/store.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/subscription.yaml create mode 100644 docs/b2b-edition/specs/storefront/app/webhooks.yaml create mode 100644 docs/b2b-edition/specs/storefront/authentication.yaml create mode 100644 docs/b2b-edition/specs/storefront/invoice_protal/invoice/invoice.yaml create mode 100644 docs/b2b-edition/specs/storefront/invoice_protal/payment/payment.yaml create mode 100644 docs/b2b-edition/specs/storefront/invoice_protal/payment_bc_order/payment_bc_order.yaml create mode 100644 docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/catalog.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/company.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/order.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/quote.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/rfq.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/sales-rep.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/shopping.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/store-config.yaml create mode 100644 docs/b2b-edition/specs/storefront/storefront/store.yaml diff --git a/docs/b2b-edition/models/address/address.yaml b/docs/b2b-edition/models/address/address.yaml new file mode 100644 index 000000000..bbd291eac --- /dev/null +++ b/docs/b2b-edition/models/address/address.yaml @@ -0,0 +1,172 @@ +type: object +title: Address Model +properties: + id: + type: integer + example: 1 + format: int32 + description: Unique numeric ID of this Address. + readOnly: true + addressLine1: + type: string + minLength: 1 + example: 1600 Pennsylvania Avenue NW + maxLength: 200 + description: Address line 1 of the Address Model. + addressLine2: + type: string + minLength: 1 + example: 'Washington, DC 22202' + maxLength: 200 + description: Address line 2 of the Address Model. + city: + type: string + minLength: 1 + example: Austin + maxLength: 100 + description: City of the Address Model. + firstName: + type: string + minLength: 1 + example: Jane + description: First name of the Address Model. + maxLength: 50 + lastName: + type: string + minLength: 1 + example: Doe + description: Last name of the Address Model. + maxLength: 50 + isBilling: + type: boolean + description: Is this address use for billing + isDefaultBilling: + type: boolean + description: Is default billing address of company + isDefaultShipping: + type: boolean + description: Is default shipping address of company + isShipping: + type: boolean + description: Is this address use for shipping + phoneNumber: + type: string + minLength: 1 + example: '11111111111' + maxLength: 50 + description: Contact phone number of this address + zipCode: + type: string + minLength: 1 + maxLength: 50 + example: '78751' + description: Zip code + companyId: + type: string + example: 1840 + description: The company ID of this address owner + countryName: + type: string + description: 'Country name of the Address Model. You can pass only one of country name and country code, but when you pass both, either error will be corrected automatically when another is right' + minLength: 1 + maxLength: 150 + example: United States + countryCode: + type: string + description: 'Country code of the Address Model.You can pass only one of country name and country code, but when you pass both, either error will be corrected automatically when another is right' + minLength: 1 + maxLength: 50 + example: US + stateCode: + type: string + description: 'State code of the Address Model.State code and State name can not be required,but whether it is required will be determined according to the country' + example: TX + minLength: 1 + maxLength: 50 + stateName: + type: string + description: 'State name of the Address Model.State code and State name can not be required,but whether it is required will be determined according to the country' + example: Texas + minLength: 1 + maxLength: 150 + label: + type: string + description: Label of the Address Model + extraFields: + type: array + description: Extra fields of the address + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + fieldType: + type: number + externalId: + type: string +required: + - addressLine1 + - city + - firstName + - lastName + - companyId + - countryName + - countryCode +examples: + example-1: + value: + id: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + zipCode: '78751' + companyId: 1840 + extraFields: + - fieldName: fax + fieldValue: 111-222 + fieldType: 0 + - fieldName: tax code + fieldValue: apple + fieldType: 0 + countryName: United States + countryCode: US + stateCode: TX + stateName: Texas + example-2: + value: + id: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + zipCode: '78751' + companyId: 1840 + countryName: United States + countryCode: US + stateCode: TX + stateName: Texas + label: string + extraFields: + - fieldName: string + fieldValue: string + fieldType: 0 + externalId: '1' + channelId: 1 +x-internal: false diff --git a/docs/b2b-edition/models/address/address_with_channel.yaml b/docs/b2b-edition/models/address/address_with_channel.yaml new file mode 100644 index 000000000..74e55c366 --- /dev/null +++ b/docs/b2b-edition/models/address/address_with_channel.yaml @@ -0,0 +1,177 @@ +type: object +x-stoplight: + id: nymidwe06nds4 +x-examples: + example-1: + id: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + zipCode: '78751' + companyId: 1840 + extraFields: + - fieldName: fax + fieldValue: 111-222 + fieldType: 0 + - fieldName: tax code + fieldValue: apple + fieldType: 0 + countryName: United States + countryCode: US + stateCode: TX + stateName: Texas +title: Address Model +examples: + - id: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + zipCode: '78751' + companyId: 1840 + countryName: United States + countryCode: US + stateCode: TX + stateName: Texas + label: string + extraFields: + - fieldName: string + fieldValue: string + fieldType: 0 + externalId: '1' + channelId: 1 + channelName: test +properties: + id: + type: integer + example: 1 + format: int32 + description: Unique numeric ID of this Address. + readOnly: true + addressLine1: + type: string + minLength: 1 + example: 1600 Pennsylvania Avenue NW + maxLength: 200 + description: Address line 1 of the Address Model. + addressLine2: + type: string + minLength: 1 + example: 'Washington, DC 22202' + maxLength: 200 + description: Address line 2 of the Address Model. + city: + type: string + minLength: 1 + example: Austin + maxLength: 100 + description: City of the Address Model. + firstName: + type: string + minLength: 1 + example: Jane + description: First name of the Address Model. + maxLength: 50 + lastName: + type: string + minLength: 1 + example: Doe + description: Last name of the Address Model. + maxLength: 50 + isBilling: + type: boolean + description: Is this address use for billing + isDefaultBilling: + type: boolean + description: Is default billing address of company + isDefaultShipping: + type: boolean + description: Is default shipping address of company + isShipping: + type: boolean + description: Is this address use for shipping + phoneNumber: + type: string + minLength: 1 + example: '11111111111' + maxLength: 50 + description: Contact phone number of this address + zipCode: + type: string + minLength: 1 + maxLength: 50 + example: '78751' + description: Zip code + companyId: + type: integer + example: 1840 + description: The company ID of this address owner + countryName: + type: string + description: 'Country name of the Address Model. You can pass only one of country name and country code, but when you pass both, either error will be corrected automatically when another is right' + minLength: 1 + maxLength: 150 + example: United States + countryCode: + type: string + description: 'Country code of the Address Model.You can pass only one of country name and country code, but when you pass both, either error will be corrected automatically when another is right' + minLength: 1 + maxLength: 50 + example: US + stateCode: + type: string + description: 'State code of the Address Model.State code and State name can not be required,but whether it is required will be determined according to the country' + example: TX + minLength: 1 + maxLength: 50 + stateName: + type: string + description: 'State name of the Address Model.State code and State name can not be required,but whether it is required will be determined according to the country' + example: Texas + minLength: 1 + maxLength: 150 + label: + type: string + description: Label of the Address Model + extraFields: + type: array + description: Extra fields of the address + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + fieldType: + type: number + externalId: + type: string + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string +required: + - addressLine1 + - city + - firstName + - lastName + - countryName + - countryCode +x-internal: false diff --git a/docs/b2b-edition/models/company/company.yaml b/docs/b2b-edition/models/company/company.yaml new file mode 100644 index 000000000..0fcbfdcc5 --- /dev/null +++ b/docs/b2b-edition/models/company/company.yaml @@ -0,0 +1,66 @@ +description: '' +allOf: + - type: object + properties: + id: + type: integer + description: Unique numeric ID of this Company. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + uuid: + type: string + description: UUID of Company + example: 095be615 + readOnly: true + customerGroupId: + description: Customer group ID of this company in bigcommerce. + example: 42 + type: integer + readOnly: true + catalogId: + type: integer + description: Unique numeric ID of company's catalog. + example: 1 + createdAt: + type: integer + description: Create timestamp of the Company + example: 1620872672 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the Company + example: 1620872672 + readOnly: true + required: + - id + - uuid + - createdAt + - updatedAt + - catalogId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml +x-examples: + example-1: + id: 1 + uuid: 095be615 + customerGroupId: 42 + catalogId: 1 + createdAt: 1620872672 + updatedAt: 1620872672 + companyName: Tesla + bcGroupName: Tesla-RandomStr + companyStatus: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: 'Detroit ' + state: State of Texas + zipCode: '100000' + country: US + companyEmail: dev.b2b@test.net + phoneNumber: '9090980' + catalogName: catalog + adminFirstName: Tom + adminLastName: Cat + adminEmail: dev.b2b@test.net + adminPhoneNumber: 1223312 +title: Company Model +x-internal: false diff --git a/docs/b2b-edition/models/company/company_base.yaml b/docs/b2b-edition/models/company/company_base.yaml new file mode 100644 index 000000000..696669bcd --- /dev/null +++ b/docs/b2b-edition/models/company/company_base.yaml @@ -0,0 +1,115 @@ +description: '' +type: object +title: Company Base Model +properties: + companyName: + type: string + description: Name of this company + example: Tesla + minLength: 1 + maxLength: 200 + bcGroupName: + type: string + minLength: 1 + maxLength: 250 + example: Tesla-RandomStr + description: Corresponding group name in BigCommerce. It must be unique. It will be same as company name or additional a random string. + readOnly: true + companyStatus: + type: integer + description: The status of this company + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + example: 1 + readOnly: true + addressLine1: + type: string + description: Address line 1 of ths company. + maxLength: 200 + example: 1600 Pennsylvania Avenue NW + addressLine2: + type: string + description: Address line 2 of ths company. + maxLength: 200 + example: 'Washington, DC 22202' + city: + type: string + description: City name of the company. + example: 'Detroit ' + maxLength: 100 + state: + type: string + description: State of the company. + example: State of Texas + maxLength: 50 + zipCode: + type: string + description: Zip code of the company. + example: '100000' + maxLength: 50 + country: + type: string + description: Country of the company + example: US + maxLength: 200 + companyEmail: + type: string + format: email + example: dev.b2b@test.net + maxLength: 200 + description: Contact email of this company. + companyPhone: + type: string + description: Phone number of the company + maxLength: 50 + example: '9090980' + catalogName: + type: string + description: Name of this company's catalog. + example: catalog + adminFirstName: + type: string + minLength: 1 + maxLength: 100 + description: First name of the company's administrator + example: Tom + adminLastName: + type: string + minLength: 1 + maxLength: 100 + description: Last name of the company's administrator + example: Cat + adminEmail: + type: string + minLength: 1 + maxLength: 100 + description: Email address of the company's administrator + example: dev.b2b@test.net + adminPhoneNumber: + type: string + minLength: 1 + maxLength: 100 + description: Phone number of the company's administrator + example: '1223312' +example: + companyName: Tesla + bcGroupName: Tesla-RandomStr + companyStatus: 1 + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: 'Detroit ' + state: State of Texas + zipCode: '100000' + country: US + companyEmail: dev.b2b@test.net + companyPhone: '9090980' + catalogName: catalog + adminFirstName: Tom + adminLastName: Cat + adminEmail: dev.b2b@test.net + adminPhoneNumber: '1223312' +x-internal: false diff --git a/docs/b2b-edition/models/extra_fields/extra_field_values.yaml b/docs/b2b-edition/models/extra_fields/extra_field_values.yaml new file mode 100644 index 000000000..175e9c4aa --- /dev/null +++ b/docs/b2b-edition/models/extra_fields/extra_field_values.yaml @@ -0,0 +1,23 @@ +title: Extra field values +type: object +description: Extra Field Values +properties: + extraFields: + type: array + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + required: + - fieldName + - fieldValue +example: + extraFields: + - fieldName: string + fieldValue: string +x-internal: false diff --git a/docs/b2b-edition/models/extra_fields/extra_fields.yaml b/docs/b2b-edition/models/extra_fields/extra_fields.yaml new file mode 100644 index 000000000..50063d4c5 --- /dev/null +++ b/docs/b2b-edition/models/extra_fields/extra_fields.yaml @@ -0,0 +1,54 @@ +title: extra_fields +type: object +description: Extra Fields +properties: + id: + type: number + description: Unique id + uuid: + type: string + description: UUID of the extra field + fieldName: + type: string + description: Field name that config in you store + fieldType: + type: number + description: Field type of the extra field.0 means text type. 1 means textarea type. 2 means number type. 3 means dropdown type. + enum: + - 0 + - 1 + - 2 + - 3 + isRequired: + type: boolean + description: Is this field is required + isUnique: + type: boolean + description: Is the value of this field is unique + visibleToEnduser: + type: boolean + description: Is this field visible to end-user + configType: + type: number + description: Extra field config type.1 means built in. 2 means user defined. + enum: + - 1 + - 2 + defaultValue: + type: string + description: Default value of this field. + maximumLength: + type: string + description: The maximum length of the value of this field. fieldType == 0 + numberOfRows: + type: string + description: The maximum number of rows of the value of this field. fieldType == 1 + maximumValue: + type: string + description: Maximum value of the field value. fieldType == 2 + listOfValue: + type: array + description: List of all optional values for the field value. fieldType == 3 + items: + type: string +x-internal: false diff --git a/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml b/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml new file mode 100644 index 000000000..7f8a8c5f6 --- /dev/null +++ b/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml @@ -0,0 +1,23 @@ +title: User Extra field values +type: object +description: User Extra Field Values +properties: + userExtraFields: + type: array + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + required: + - fieldName + - fieldValue +example: + userExtraFields: + - fieldName: string + fieldValue: string +x-internal: false diff --git a/docs/b2b-edition/models/invoice_portal/invoice.yaml b/docs/b2b-edition/models/invoice_portal/invoice.yaml new file mode 100644 index 000000000..bf6061fb2 --- /dev/null +++ b/docs/b2b-edition/models/invoice_portal/invoice.yaml @@ -0,0 +1,487 @@ +title: invoice +type: object +x-examples: + example-1: + id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: string + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string +x-internal: false +examples: + - id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - addressIndex: string + shipDate: string + shipVia: string + trackingNumber: string + comments: string + customFields: {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: USA + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string + createdAt: string + updatedAt: string + channelId: string + channelName: string +properties: + id: + type: number + description: Invoice ID + readOnly: true + customerId: + type: string + minLength: 1 + description: B2B Edition Company ID + externalCustomerId: + type: string + minLength: 1 + description: ID of a company associated with a third party + externalId: + type: string + minLength: 1 + description: The ID of the invoice associated with the third party + invoiceNumber: + type: string + minLength: 1 + description: Invoice no. + type: + type: string + minLength: 1 + description: Invoice Type + dueDate: + type: number + description: Invoice due date + status: + type: number + description: 'Invoice status. If the balance is less than or equal to 0, then it will automatically update to status "2".' + orderNumber: + type: string + minLength: 1 + description: BigCommerce order ID + purchaseOrderNumber: + type: string + minLength: 1 + description: PO no. + details: + type: object + description: Invoice details + properties: + type: + type: string + minLength: 1 + description: Invoice details type + header: + type: object + required: + - costLines + - orderDate + - billingAddress + - shippingAddresses + properties: + costLines: + type: array + uniqueItems: true + minItems: 1 + description: Invoice cost information + items: + type: object + properties: + amount: + type: object + description: cost amount + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + description: + type: string + minLength: 1 + description: cost description + required: + - amount + - description + orderDate: + type: number + description: Invoice order creation time + billingAddress: + type: object + description: Invoice billing address + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + customFields: + type: object + customerFields: + type: object + description: User-defined additional fields + shippingAddresses: + type: array + uniqueItems: true + minItems: 1 + description: Invoice shipping addresses + items: + type: object + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + customFields: + type: object + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + details: + type: object + properties: + shipments: + type: array + uniqueItems: true + minItems: 1 + description: Invoice shipments information + items: + type: object + properties: + addressIndex: + type: string + description: address ID + shipDate: + type: string + description: Time of shipment + shipVia: + type: string + trackingNumber: + type: string + description: tracking number + comments: + type: string + description: comments + customFields: + type: object + required: + - addressIndex + - shipDate + - shipVia + - trackingNumber + - comments + lineItems: + type: array + uniqueItems: true + minItems: 1 + description: Invoice Product Information + items: + type: object + properties: + sku: + type: string + minLength: 1 + description: Product sku + type: + type: string + minLength: 1 + description: product type + comments: + type: string + minLength: 1 + quantity: + type: string + minLength: 1 + description: product qyantity + unitPrice: + type: object + description: product unit price + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + example: USA + value: + type: string + minLength: 1 + description: amount + description: + type: string + minLength: 1 + description: product description or product name + customFields: + type: object + unitDiscount: + type: object + description: product unit discount + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + required: + - sku + - type + - comments + - quantity + - unitPrice + - description + - unitDiscount + required: + - lineItems + required: + - type + - header + isPendingPayment: + type: number + readOnly: true + source: + type: number + description: Source of invoice 0 for B2B Edition 1 for External + enum: + - 0 + - 1 + example: 0 + originalBalance: + type: object + description: Origin balance + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + openBalance: + type: object + description: Invoice open balance + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + customerName: + type: string + minLength: 1 + description: BigCommerce customer group name + readOnly: true + createdAt: + type: string + description: Invoice creation time + updatedAt: + type: string + description: Invoice last updated time + readOnly: true + channelId: + type: string + description: BigCommerce channel id + channelName: + type: string + description: Store Channel Name + termsConditions: + type: string + description: Terms & Conditions. Visible on the default Invoice PDF. +required: + - customerId + - originalBalance + - openBalance diff --git a/docs/b2b-edition/models/invoice_portal/receipt.yaml b/docs/b2b-edition/models/invoice_portal/receipt.yaml new file mode 100644 index 000000000..7cd13f376 --- /dev/null +++ b/docs/b2b-edition/models/invoice_portal/receipt.yaml @@ -0,0 +1,86 @@ +title: receipt +type: object +properties: + id: + type: integer + description: The unique Id + createdAt: + type: integer + description: Create timestamp + updatedAt: + type: integer + description: Update timestamp + storeHash: + type: string + description: Store hash + customerId: + type: string + description: B2B Edition company Id + externalId: + type: string + description: The Id in ERP system + externalCustomerId: + type: string + description: The customer Id in ERP system + payerName: + type: string + description: Name of the payer + payerCustomerId: + type: string + description: The B2B Edition company Id of the payer + details: + type: object + description: The detail of the receipt + properties: + paymentDetails: + type: object + description: Payment details of the receipt + properties: + memo: + type: string + transactionType: + type: string + description: Transaction of the receipt + example: 'Paid, Refund' + paymentType: + type: string + description: Payment of the receipt + example: 'Offline, Visa' + referenceNumber: + type: string + description: Reference number of the receipt + paymentId: + type: integer + description: Payment id of the receipt + total: + type: object + description: Total amount + properties: + code: + type: string + description: Currency code + value: + type: string + description: Price value +description: '' +examples: + - id: 85 + createdAt: 1630658187 + updatedAt: 1630658187 + storeHash: 1i6zpxpe3g + customerId: '5485' + externalId: '10' + externalCustomerId: '15' + payerName: k Admin + payerCustomerId: '5485' + details: + paymentDetails: + memo: CHECK + transactionType: Paid + paymentType: Visa ending in 1111 + referenceNumber: '375026' + paymentId: 92 + total: + code: USD + value: '122.9500' +x-internal: false diff --git a/docs/b2b-edition/models/invoice_portal/receipt_line.yaml b/docs/b2b-edition/models/invoice_portal/receipt_line.yaml new file mode 100644 index 000000000..33db14346 --- /dev/null +++ b/docs/b2b-edition/models/invoice_portal/receipt_line.yaml @@ -0,0 +1,84 @@ +title: receipt_line +type: object +properties: + id: + type: integer + description: The unique Id + createdAt: + type: integer + description: Create timestamp + updatedAt: + type: integer + description: Update timestamp + storeHash: + type: string + description: Store hash + customerId: + type: string + description: B2B Edition company Id + externalId: + type: string + description: The Id in ERP system + externalCustomerId: + type: string + description: The customer Id in ERP system + receiptId: + type: integer + description: The id of receipt + invoiceId: + type: integer + description: The if of invoice + amount: + type: object + description: Amount info + properties: + code: + type: string + description: Currency code + value: + type: string + description: Price value + paymentStatus: + type: integer + description: 'Payment processing status. 0 means ‘Incomplete’ status, 1 means ‘Awaiting Processing’ status, 2 means ‘Processing’ status, 3 means ‘Completed’ status, 4 means ‘Refunded'' status' + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + paymentType: + type: string + description: Payment of the receipt + invoiceNumber: + type: string + description: Reference invoice number + paymentId: + type: integer + description: The id of the payment + referenceNumber: + type: string + description: Reference number of the receipt + transactionType: + type: string + description: Transaction of the receipt +examples: + - id: 93 + createdAt: 1630638069 + updatedAt: 1630638069 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 84 + invoiceId: 34 + amount: + code: CNY + value: '0.8000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000034' + paymentId: 91 + referenceNumber: test + transactionType: Paid +x-internal: false diff --git a/docs/b2b-edition/models/order/order-extra.yaml b/docs/b2b-edition/models/order/order-extra.yaml new file mode 100644 index 000000000..b2bea297c --- /dev/null +++ b/docs/b2b-edition/models/order/order-extra.yaml @@ -0,0 +1,74 @@ +title: orderExtra +type: object +example: + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test +properties: + extraInt1: + type: integer + description: Extra field of this order + example: 42 + extraInt2: + type: integer + description: Extra field of this order + example: 42 + extraInt3: + type: integer + description: Extra field of this order + example: 42 + extraInt4: + type: integer + description: Extra field of this order + example: 42 + extraInt5: + type: integer + description: Extra field of this order + example: 42 + extraStr1: + type: string + description: Extra string field of this order + example: customize additional information + extraStr2: + type: string + description: Extra string field of this order + example: customize additional information + extraStr3: + type: string + description: Extra string field of this order + example: customize additional information + extraStr4: + type: string + description: Extra string field of this order + example: customize additional information + extraStr5: + type: string + description: Extra string field of this order + example: customize additional information + extraText: + type: string + description: Extra text field of this order + example: customize additional information + extraInfo: + description: Extra info of this order such as address extra fields + example: customize additional information + oneOf: + - type: string + - type: object +x-internal: false diff --git a/docs/b2b-edition/models/order/order-product.yaml b/docs/b2b-edition/models/order/order-product.yaml new file mode 100644 index 000000000..d45533088 --- /dev/null +++ b/docs/b2b-edition/models/order/order-product.yaml @@ -0,0 +1,55 @@ +title: orderProduct +type: object +properties: + id: + type: integer + example: 1 + format: int32 + description: Unique numeric ID of this order in B2B Edition. + readOnly: true + createdAt: + type: integer + description: Create timestamp of the order + example: 1574999690 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the order + example: 1574999690 + readOnly: true + productName: + type: string + description: 'Name of this product ' + example: LGM Spicy Chili Crisp + variantSKU: + type: string + description: SKU name + example: 7.41 Ounce (Pack of 12) + variantId: + type: integer + example: 12 + description: SKU's ID + options: + type: string + description: Detail infomation of SKU + example: '[{"id": 715, "option_id": 41, "order_product_id": 670, "product_option_id": 121, "display_name": "Gauge", "display_value": "12", "value": "123", "type": "Multiple choice", "name": "Gauge1576218034-477", "display_style": "Dropdown"}, {"id": 716, "option_id": 42, "order_product_id": 670, "product_option_id": 122, "display_name": "Leg 1 (inches)", "display_value": "5", "value": "5", "type": "Text field", "name": "Leg-1-(inches)1576218034-477", "display_style": ""}]' + productBrandName: + type: string + example: LGM + description: Brand name of this product + quantity: + type: integer + description: Quantity number of product in this order + example: 10 +x-examples: + example-1: + id: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + productName: LGM Spicy Chili Crisp + variantSKU: 7.41 Ounce (Pack of 12) + variantId: 12 + options: '[{"id": 715, "option_id": 41, "order_product_id": 670, "product_option_id": 121, "display_name": "Gauge", "display_value": "12", "value": "123", "type": "Multiple choice", "name": "Gauge1576218034-477", "display_style": "Dropdown"}, {"id": 716, "option_id": 42, "order_product_id": 670, "product_option_id": 122, "display_name": "Leg 1 (inches)", "display_value": "5", "value": "5", "type": "Text field", "name": "Leg-1-(inches)1576218034-477", "display_style": ""}]' + productBrandName: LGM + quantity: 10 +x-internal: false diff --git a/docs/b2b-edition/models/order/order.yaml b/docs/b2b-edition/models/order/order.yaml new file mode 100644 index 000000000..1758b9241 --- /dev/null +++ b/docs/b2b-edition/models/order/order.yaml @@ -0,0 +1,120 @@ +title: order +description: Order entity +type: object +properties: + createdAt: + type: integer + description: Create timestamp of the order + example: 1574999690 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the order + example: 1574999690 + readOnly: true + bcOrderId: + type: integer + description: Unique numeric ID of this order in bigcommerce. + example: 11 + readOnly: true + totalIncTax: + type: number + format: float + example: 10.5 + minimum: 0 + description: Total price of order which include tax + poNumber: + type: string + example: bj256 + description: PO payment method message. + cartId: + type: integer + example: 1 + readOnly: true + companyId: + type: integer + format: int32 + description: Company ID + example: 12 + usdIncTax: + type: number + example: 11 + format: float + description: Total price of usd with order tax. + readOnly: true + currencyCode: + type: string + example: USD + description: Currency code of this order + readOnly: true + items: + type: integer + example: 4 + format: int32 + description: Total product item of this order. + readOnly: true + status: + type: string + example: completed + description: Status of this order + readOnly: true + customStatus: + type: string + example: my-completed + description: Custom status of this order.set by store manage. + readOnly: true + money: + type: string + description: Price display settings. + example: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + readOnly: true + id: + type: integer + description: Unique numeric ID of this order. + example: 1 + readOnly: true + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Order channel's name. + example: msf1 + readOnly: true +required: + - bcOrderId +x-examples: + example-1: + id: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + statusCode: 0 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + example-2: + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + id: 1 + channelId: 1 + channelName: msf1 +x-internal: false diff --git a/docs/b2b-edition/models/payment/invoice-payments.yaml b/docs/b2b-edition/models/payment/invoice-payments.yaml new file mode 100644 index 000000000..40977e364 --- /dev/null +++ b/docs/b2b-edition/models/payment/invoice-payments.yaml @@ -0,0 +1,196 @@ +description: '' +type: object +examples: + - id: 20 + createdAt: 1617761431 + updatedAt: 1617762957 + storeHash: jexy81vb0h + customerId: '95075' + externalId: null + externalCustomerId: null + payerName: Hannah Admin + payerCustomerId: '95075' + details: + memo: '' + moduleName: payments_bigcommerce_sales_order + fees: [] + moduleData: + cartId: d0afeab8-ff76-4b4e-867a-0675c0ea6e6e + orderId: 121 + transactions: + - type: UnknownTransaction + rawTransaction: null + processingStatus: 4 + appliedStatus: 0 + fundingStatus: 2 + total: + code: USD + value: '11.0000' + lineItems: + - paymentId: 20 + invoiceId: 9 + amount: + code: USD + value: '11.0000' + customerName: silk + bcId: '6418' + bcGroupName: Bundle Company + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 +title: Invoice Payment +properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + description: B2B Edition Company Id + externalId: + type: string + externalCustomerId: + type: string + payerName: + type: string + minLength: 1 + payerCustomerId: + type: string + minLength: 1 + details: + type: object + required: + - memo + properties: + memo: + type: string + moduleName: + type: string + minLength: 1 + fees: + type: array + items: + type: object + moduleData: + type: object + required: + - cartId + - orderId + - transactions + properties: + cartId: + type: string + minLength: 1 + orderId: + type: number + transactions: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + type: + type: string + minLength: 1 + rawTransaction: + type: string + required: + - type + processingStatus: + type: number + appliedStatus: + type: number + fundingStatus: + type: number + total: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + lineItems: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + paymentId: + type: number + invoiceId: + type: number + amount: + type: object + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + required: + - paymentId + - invoiceId + customerName: + type: string + description: B2B Edition Company Name + bcId: + type: string + bcGroupName: + type: string + minLength: 1 + description: BigCommerce Customer Group Name + allowedOperations: + type: array + description: A list of allowable action codes for current payments + items: + type: object + allowedStatuses: + type: array + description: The list of states that the current payment allows to modify + items: + type: object +required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - externalId + - externalCustomerId + - payerName + - payerCustomerId + - details + - moduleName + - fees + - moduleData + - processingStatus + - appliedStatus + - fundingStatus + - total + - lineItems + - customerName + - bcId + - bcGroupName + - allowedOperations + - allowedStatuses +x-internal: false diff --git a/docs/b2b-edition/models/payment/payment.yaml b/docs/b2b-edition/models/payment/payment.yaml new file mode 100644 index 000000000..f22f9054c --- /dev/null +++ b/docs/b2b-edition/models/payment/payment.yaml @@ -0,0 +1,25 @@ +title: Payment +type: object +x-examples: + example-1: + code: cheque + paymentTitle: Check +properties: + code: + type: string + description: Payment code + minLength: 1 + maxLength: 50 + example: cheque + readOnly: true + paymentTitle: + type: string + minLength: 1 + maxLength: 50 + example: Check + description: Payment method name + readOnly: true +required: + - code + - paymentTitle +x-internal: false diff --git a/docs/b2b-edition/models/super_admin/super_admin.yaml b/docs/b2b-edition/models/super_admin/super_admin.yaml new file mode 100644 index 000000000..f752c8253 --- /dev/null +++ b/docs/b2b-edition/models/super_admin/super_admin.yaml @@ -0,0 +1,29 @@ +title: SuperAdmin +allOf: + - type: object + properties: + id: + type: integer + description: Unique numeric ID of this SuperAdmin. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + createdAt: + type: integer + description: Create timestamp of the SuperAdmin + example: 1620872672 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the SuperAdmin + example: 1620872672 + readOnly: true + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin_base.yaml +x-examples: + example-1: + id: 1 + createdAt: 0 + updateAt: 0 + firstName: Arthur + lastName: Morgan +description: Super Admin model +x-internal: false diff --git a/docs/b2b-edition/models/super_admin/super_admin_base.yaml b/docs/b2b-edition/models/super_admin/super_admin_base.yaml new file mode 100644 index 000000000..3b47cc387 --- /dev/null +++ b/docs/b2b-edition/models/super_admin/super_admin_base.yaml @@ -0,0 +1,23 @@ +title: SuperAdminBase +type: object +x-examples: + example-1: + firstName: Arthur + lastName: Morgan +properties: + firstName: + type: string + minLength: 1 + example: Tom + description: First name of the SuperAdmin + maxLength: 100 + lastName: + type: string + minLength: 1 + example: Cat + description: Last name of the SuperAdmin + maxLength: 100 +required: + - firstName + - lastName +x-internal: false diff --git a/docs/b2b-edition/models/user/user-base-without-company.yaml b/docs/b2b-edition/models/user/user-base-without-company.yaml new file mode 100644 index 000000000..6a0d96ff1 --- /dev/null +++ b/docs/b2b-edition/models/user/user-base-without-company.yaml @@ -0,0 +1,60 @@ +title: UserBase +x-stoplight: + id: rwusdom3yd3qh +type: object +x-examples: + example-1: + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + example-2: + companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + customerId: 12 +properties: + email: + type: string + description: Email address of the user + example: user@example.com + maxLength: 150 + firstName: + type: string + description: First name of the user + example: Tom + maxLength: 150 + lastName: + type: string + description: Last name of the user + example: Cat + maxLength: 150 + phoneNumber: + type: string + description: Phone number of the user + example: '112233' + maxLength: 150 + role: + type: integer + description: User role (0=admin 1=senior_buyer 2=junior_buyer) + example: 1 + enum: + - 0 + - 1 + - 2 + customerId: + type: integer + description: The BigCommerce customer ID + example: 12 + readOnly: true +required: + - email + - firstName + - lastName + - role +x-internal: false diff --git a/docs/b2b-edition/models/user/user-base.yaml b/docs/b2b-edition/models/user/user-base.yaml new file mode 100644 index 000000000..d957ce669 --- /dev/null +++ b/docs/b2b-edition/models/user/user-base.yaml @@ -0,0 +1,63 @@ +title: UserBase +type: object +properties: + companyId: + type: integer + description: Company ID + example: 2 + email: + type: string + description: Email address of the user + example: user@example.com + maxLength: 150 + firstName: + type: string + description: First name of the user + example: Tom + maxLength: 150 + lastName: + type: string + description: Last name of the user + example: Cat + maxLength: 150 + phoneNumber: + type: string + description: Phone number of the user + example: '112233' + maxLength: 150 + role: + type: integer + description: User role (0=admin 1=senior_buyer 2=junior_buyer) + example: 1 + enum: + - 0 + - 1 + - 2 + customerId: + type: integer + description: The BigCommerce customer ID + example: 12 + readOnly: true +required: + - companyId + - email + - firstName + - lastName + - role +x-examples: + example-1: + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + example-2: + companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + customerId: 12 +x-internal: false diff --git a/docs/b2b-edition/models/user/user-without-company.yaml b/docs/b2b-edition/models/user/user-without-company.yaml new file mode 100644 index 000000000..fdd609b17 --- /dev/null +++ b/docs/b2b-edition/models/user/user-without-company.yaml @@ -0,0 +1,43 @@ +title: User +x-stoplight: + id: tih8wvg0pkifj +description: Company user base model. +allOf: + - type: object + properties: + id: + type: integer + description: Unique numeric ID of this User. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + uuid: + type: string + description: UUID of user + example: 095be615 + createdAt: + type: integer + description: Create timestamp of the user + example: 1574999690 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the user + example: 1574999690 + readOnly: true + required: + - id + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base-without-company.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml +x-examples: + example-1: + id: 1 + uuid: 095be615 + createdAt: 1574999690 + updatedAt: 1574999690 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 +x-internal: false diff --git a/docs/b2b-edition/models/user/user.yaml b/docs/b2b-edition/models/user/user.yaml new file mode 100644 index 000000000..b75b2f684 --- /dev/null +++ b/docs/b2b-edition/models/user/user.yaml @@ -0,0 +1,75 @@ +title: User +description: Company user base model. +allOf: + - type: object + properties: + id: + type: integer + description: Unique numeric ID of this User. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + uuid: + type: string + description: UUID of user + example: 095be615 + readOnly: true + createdAt: + type: integer + description: Create timestamp of the user + example: 1574999690 + readOnly: true + updatedAt: + type: integer + description: Update timestamp of the user + example: 1574999690 + readOnly: true + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Store Channel Name + iconUrl: + type: string + description: Channel icon url + required: + - id + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml +x-examples: + example-1: + id: 1 + uuid: 095be615 + createdAt: 1574999690 + updatedAt: 1574999690 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + example-2: + id: 1 + uuid: 095be615 + createdAt: 1574999690 + updatedAt: 1574999690 + channelList: + - channelId: 1 + channelName: string + bcChannelId: 1 + companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + customerId: 12 + extraFields: + - fieldName: string + fieldValue: string +x-internal: false diff --git a/docs/b2b-edition/models/utils/pagination.yaml b/docs/b2b-edition/models/utils/pagination.yaml new file mode 100644 index 000000000..c47b4b23e --- /dev/null +++ b/docs/b2b-edition/models/utils/pagination.yaml @@ -0,0 +1,30 @@ +title: Pagination +type: object +description: Used to response pagination information +properties: + pagination: + type: object + properties: + limit: + type: integer + maximum: 250 + exclusiveMaximum: true + minimum: 1 + exclusiveMinimum: true + description: 'Pagination limit default: 10' + example: 10 + offset: + type: integer + minimum: 0 + description: 'Pagination offset default: 0' + example: 0 + totalCount: + type: integer + example: 998 + description: The total number of the all data +example: + pagination: + limit: 10 + offset: 0 + totalCount: 1 +x-internal: false diff --git a/docs/b2b-edition/models/utils/response-413.yaml b/docs/b2b-edition/models/utils/response-413.yaml new file mode 100644 index 000000000..0b5df7272 --- /dev/null +++ b/docs/b2b-edition/models/utils/response-413.yaml @@ -0,0 +1,23 @@ +title: response-413 +type: object +description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' +x-examples: + example-1: + code: 413 + meta: + message: Request Entity Too Large + data: {} +properties: + code: + type: number + example: 413 + meta: + type: object + properties: + message: + type: string + example: Request Entity Too Large + description: Response message + data: + type: object +x-internal: false diff --git a/docs/b2b-edition/models/utils/response-object.yaml b/docs/b2b-edition/models/utils/response-object.yaml new file mode 100644 index 000000000..9820d37e5 --- /dev/null +++ b/docs/b2b-edition/models/utils/response-object.yaml @@ -0,0 +1,15 @@ +title: response-object +description: Response for successful request +type: object +properties: + code: + type: integer + description: Response code of success request. + example: 200 + meta: + type: object + properties: + message: + type: string + example: SUCCESS +x-internal: false diff --git a/docs/b2b-edition/specs/api-v2/openAPI.json b/docs/b2b-edition/specs/api-v2/openAPI.json new file mode 100644 index 000000000..b39aacfa6 --- /dev/null +++ b/docs/b2b-edition/specs/api-v2/openAPI.json @@ -0,0 +1,7690 @@ +{ + "swagger": "2.0", + "info": { + "title": "Open API", + "description": "BigCommerce B2B Edition Open API Docs", + "license": {}, + "version": "v3" + }, + "host": "api-b2b.bigcommerce.com", + "schemes": [ + "https" + ], + "basePath": "/api/v2/io", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "securityDefinitions": { + "authToken": { + "name": "authToken", + "type": "apiKey", + "in": "header" + } + }, + "security": [ + { + "Basic": [] + } + ], + "tags": [ + { + "name": "Address" + }, + { + "name": "Company" + }, + { + "name": "Order" + }, + { + "name": "Payment" + }, + { + "name": "Proxy" + }, + { + "name": "SalesRep" + }, + { + "name": "User" + } + ], + "paths": { + "/addresses/country_state": { + "get": { + "operationId": "addresses_country_state_list", + "summary": "Convert Country State", + "description": "Convert country/state name to their code or code to name", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header", + "required": true, + "type": "string" + }, + { + "name": "country", + "in": "query", + "description": "Country code/name", + "type": "string" + }, + { + "name": "state", + "in": "query", + "description": "Country code/name", + "type": "string" + }, + { + "name": "search_type", + "in": "query", + "description": "Convert type, code means transfer the input country/state name to their code, name means transfer the input country/state code to their name", + "type": "string", + "enum": [ + "code", + "name" + ] + } + ], + "responses": { + "200": { + "description": "Response success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "countryCode": { + "description": "The converted country code from input country name", + "type": "string" + }, + "countryName": { + "description": "The converted country name from input country code", + "type": "string" + }, + "stateCode": { + "description": "The converted state code from input state name", + "type": "string" + }, + "stateName": { + "description": "The converted state name from input country code", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "countryName": "United States", + "stateName": "New York" + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Response record not found", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": {}, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United%20States&state=New%20York' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Cookie: csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"localhost:8000/api/v2/io/addresses/country_state?search_type=name&country=US&state=NY\"\n\npayload={}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js',\n 'Cookie': 'csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data=payload)\n\nprint(response.text)\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js\");\nmyHeaders.append(\"Cookie\", \"csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United States&state=New York\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/companies/convert-from-customer-group": { + "post": { + "operationId": "companies_convert-from-customer-group_create", + "summary": "Create Company From CG", + "description": "Create company from bigCommerce customer group. This API only enable for non-MSF store.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "allOf": [ + { + "type": "object", + "properties": { + "acceptWelcomeEmail": { + "description": "(0=will not receive email 1=will receive email)", + "type": "string", + "enum": [ + 0, + 1 + ] + }, + "addressLine1": { + "description": "Address string line 1", + "type": "string" + }, + "addressLine2": { + "description": "Address string line 2", + "type": "string" + }, + "adminEmail": { + "description": "Company admin user email", + "type": "string" + }, + "adminFirstName": { + "description": "Company admin user's first name", + "type": "string" + }, + "adminLastName": { + "description": "Company admin user's last name", + "type": "string" + }, + "adminPhoneNumber": { + "description": "Company admin user phone number", + "type": "string" + }, + "city": { + "type": "string" + }, + "companyEmail": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "customerGroupId": { + "description": "BC customer group ID", + "type": "string" + }, + "extraFields": { + "description": "To use customized extra fields with field names you need to first add company extra fields in Settings > Extra fields inside B2B edition. eg. If you want to create a new company with an extra integer field named licenseNO, you can use this structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}] in the request body.", + "type": "array", + "items": { + "type": "object", + "properties": { + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "string" + } + } + } + }, + "extraInt1": { + "description": "The default extra integer field, you can also use this field to create a company with it.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there is an important point you need to know. After the B3 team helped you configure the custom extra fields, if you still need to use these default fields, you need to know the correspondence between the custom extra fields and the default extra fields. Otherwise, when you pass in both custom and default extra fields, if the custom extra field is bound to the default extra field you pass in, the value of the custom extra field will override the default extra field.", + "type": "number" + }, + "extraInt2": { + "description": "Company create extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt3": { + "description": "Company create extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt4": { + "description": "Company create extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt5": { + "description": "Company create extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraStr1": { + "description": "Company create extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr2": { + "description": "Company create extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr3": { + "description": "Company create extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr4": { + "description": "Company create extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr5": { + "description": "Company create extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraText": { + "description": "Company create extra text value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "state": { + "type": "string" + }, + "zipCode": { + "type": "string" + } + }, + "required": [ + "adminEmail", + "adminFirstName", + "adminLastName", + "companyEmail", + "companyName", + "customerGroupId", + "phoneNumber" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml" + } + ] + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Created company Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2" + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "message": "Enter a valid email address." + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Customer group does not exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n \"city\": \"xxxx\",\n \"state\": \"xxxx\",\n \"zipCode\": \"12333\",\n \"country\": \"China\",\n \"adminFirstName\": \"test\",\n \"adminLastName\": \"sdfsd\",\n \"adminEmail\": \"test1@test.com\",\n \"adminPhoneNumber\": \"3838288282\",\n \"customerGroupId\": 4\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group\"\n\npayload = {\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n \"city\": \"xxxx\",\n \"state\": \"xxxx\",\n \"zipCode\": \"12333\",\n \"country\": \"China\",\n \"adminFirstName\": \"test\",\n \"adminLastName\": \"sdfsd\",\n \"adminEmail\": \"test1@test.com\",\n \"adminPhoneNumber\": \"3838288282\",\n \"customerGroupId\": 4\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"companyName\":\"test3.23-22\",\"phoneNumber\":122331212,\"companyEmail\":\"test@test.com\",\"addressLine1\":\"xxxx\",\"addressLine2\":\"\",\"city\":\"xxxx\",\"state\":\"xxxx\",\"zipCode\":\"12333\",\"country\":\"China\",\"adminFirstName\":\"test\",\"adminLastName\":\"sdfsd\",\"adminEmail\":\"test1@test.com\",\"adminPhoneNumber\":\"3838288282\",\"customerGroupId\":4});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/companies/users/{customerId}/orders": { + "post": { + "operationId": "companies_users_orders_create", + "summary": "Create Order Without CompanyID", + "description": "Create an order from bigCommerce, you must known order id", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "allOf": [ + { + "type": "object", + "properties": { + "orderId": { + "description": "BigCommerce order id", + "type": "string" + }, + "poNumber": { + "description": "PoNumber", + "type": "string" + }, + "totalIncTax": { + "description": "Total incTax", + "type": "number" + } + }, + "required": [ + "orderId", + "totalIncTax" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + } + ] + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Created order id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "orderId": 2 + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "data": { + "bc_order_id": "orderId can not be null" + }, + "message": "Bad Request Error" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}' \n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders\"\n\npayload = {\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"totalIncTax\":\"111\",\"orderId\":\"111\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "customerId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/addresses": { + "get": { + "operationId": "companies_addresses_list", + "summary": "Get Company Addresses", + "description": "Get all addresses for a company", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "minLastModifiedTime", + "in": "query", + "description": "Company filter condition: timestamp string e.g. 01/01/2000", + "type": "number" + }, + { + "name": "maxLastModifiedTime", + "in": "query", + "description": "Company filter condition: timestamp string e.g. 01/01/2000", + "type": "number" + }, + { + "name": "minLastCreatedTime", + "in": "query", + "description": "Company filter condition: timestamp string e.g. 01/01/2000", + "type": "number" + }, + { + "name": "maxLastCreatedTime", + "in": "query", + "description": "Company filter condition: timestamp string e.g. 01/01/2000", + "type": "number" + }, + { + "name": "q", + "in": "query", + "description": "Company query string", + "type": "string" + }, + { + "name": "firstName", + "in": "query", + "description": "Address first name filter", + "type": "number" + }, + { + "name": "lastName", + "in": "query", + "description": "Address first name filter", + "type": "number" + }, + { + "name": "address", + "in": "query", + "description": "Address line 1 filter", + "type": "number" + }, + { + "name": "city", + "in": "query", + "description": "Address city filter", + "type": "number" + }, + { + "name": "country", + "in": "query", + "description": "Address country filter", + "type": "number" + }, + { + "name": "state", + "in": "query", + "description": "Address state filter", + "type": "number" + }, + { + "name": "zipCode", + "in": "query", + "description": "Address zip code filter", + "type": "number" + }, + { + "name": "phoneNumber", + "in": "query", + "description": "Address phone number filter", + "type": "number" + }, + { + "name": "isShipping", + "in": "query", + "description": "Address is shipping filter", + "type": "number" + }, + { + "name": "isBilling", + "in": "query", + "description": "Address is billing filter", + "type": "number" + }, + { + "type": "array", + "in": "query", + "name": "externalId[]", + "description": "Address external id filter" + }, + { + "type": "number", + "in": "query", + "name": "offset", + "description": "Address pagination offset, default 0" + }, + { + "type": "number", + "in": "query", + "name": "limit", + "description": "Address pagination limit, default 4. ", + "minimum": 4, + "maximum": 500 + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addresses": { + "description": "All addresses", + "type": "object", + "properties": { + "[address_id]": { + "description": "The map from address ID to address", + "type": "object", + "properties": { + "addressId": { + "description": "Identifier for the address (same as URL parameter addressId)", + "type": "string" + }, + "addressLine1": { + "description": "Typically the street address", + "type": "string" + }, + "addressLine2": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "city": { + "type": "string" + }, + "country": { + "type": "object", + "properties": { + "countryCode": { + "description": "ISO 3166-1 Alpha 2 Country Code", + "type": "string" + }, + "countryName": { + "description": "Human readable country name", + "type": "string" + } + } + }, + "firstName": { + "type": "string" + }, + "isBilling": { + "description": "Indicates whether the address is a billing address", + "type": "boolean" + }, + "isDefaultBilling": { + "type": "boolean" + }, + "isDefaultShipping": { + "type": "boolean" + }, + "isShipping": { + "description": "Indicates whether the address is a shipping address", + "type": "boolean" + }, + "lastName": { + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "state": { + "type": "object", + "properties": { + "stateCode": { + "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", + "type": "string" + }, + "stateName": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + } + } + }, + "zipCode": { + "description": "A valid postal code used by the country that was specified", + "type": "string" + }, + "externalId": { + "type": "string" + } + } + }, + "defaultBillingId": { + "description": "The identifier of the default shipping address", + "type": "number" + }, + "defaultShippingId": { + "description": "The identifier of the default shipping address", + "type": "number" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addresses": { + "7": { + "addressId": "7", + "addressLine1": "123 Main Street", + "addressLine2": "Blvd", + "city": "Austin", + "country": { + "countryCode": "US", + "countryName": "United States" + }, + "firstName": "Jane", + "isBilling": true, + "isDefaultBilling": true, + "isDefaultShipping": true, + "isShipping": true, + "lastName": "Doe", + "phoneNumber": "11111111111", + "state": { + "stateCode": "TX", + "stateName": "Texas" + }, + "zipCode": "78751", + "channelId": 1, + "channelName": "test" + } + }, + "defaultBillingId": "7", + "defaultShippingId": "7" + }, + "message": "SUCCESS" + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' \n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "post": { + "operationId": "companies_addresses_create", + "summary": "Create A Company Address", + "description": "Creates a new address for a company. You will specify the address fields and the type of address. The address can be billing, shipping, or both. You can also request that this address becomes the new default billing or shipping address for the company.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "addressLine1": { + "description": "Typically the street address", + "type": "string" + }, + "addressLine2": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "city": { + "type": "string" + }, + "country": { + "type": "object", + "properties": { + "countryCode": { + "description": "ISO 3166-1 Alpha 2 Country Code", + "type": "string" + }, + "countryName": { + "description": "Human readable country name", + "type": "string" + } + } + }, + "firstName": { + "description": "Address first name", + "type": "string" + }, + "isBilling": { + "description": "Indicates whether the address is a billing address", + "type": "boolean" + }, + "isDefaultBilling": { + "description": "Indicates whether the address is the default billing address", + "type": "boolean" + }, + "isDefaultShipping": { + "description": "Indicates whether the address is the default shipping address", + "type": "boolean" + }, + "isShipping": { + "description": "Indicates whether the address is a shipping address", + "type": "boolean" + }, + "label": { + "description": "Address label", + "type": "string" + }, + "lastName": { + "description": "Address last name", + "type": "string" + }, + "phoneNumber": { + "description": "Address phone number", + "type": "string" + }, + "state": { + "type": "object", + "properties": { + "stateCode": { + "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", + "type": "string" + }, + "stateName": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + } + } + }, + "zipCode": { + "type": "string" + }, + "externalId": { + "type": "string" + } + }, + "required": [ + "addressLine1", + "city", + "country", + "firstName", + "lastName", + "state", + "zipCode" + ] + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "number", + "description": "Response status code", + "example": 200 + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addressId": { + "type": "integer", + "description": "Created address Id", + "example": 12 + } + } + }, + "meta": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Response message", + "example": "Success" + } + } + } + } + }, + "examples": { + "example-1": { + "code": 200, + "data": { + "addressId": 12 + }, + "meta": { + "message": "Success" + } + } + } + }, + "422": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "type": "number", + "description": "Response status error code", + "example": 422 + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "errMsg": { + "description": "Message about problem with field 'field'", + "type": "array", + "items": { + "type": "object", + "properties": { + "[field]": { + "type": "string", + "description": "field error description.", + "example": "xxx field is too long." + } + } + } + } + } + }, + "meta": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "Response error message", + "example": "Parameter Error" + } + } + } + } + }, + "examples": { + "example-1": { + "code": 422, + "data": { + "errMsg": [ + { + "[field]": "xxx field is too long." + } + ] + }, + "meta": { + "message": "Parameter Error" + } + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses' --header 'Content-Type: application/json' --data-raw '{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": true,\n \"isDefaultBilling\": true\n}'\n" + }, + { + "lang": "Python", + "source": "\n import requests\n\n url = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\"\n\n payload = \"{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": true,\n \"isDefaultBilling\": true\n}\"\n headers = {\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"POST\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"label\":\"12dxqwdsa\",\"firstName\":\"Bundle\",\"lastName\":\"Test\",\"addressLine1\":\"Street.1\",\"addressLine2\":\"\",\"city\":\"New York\",\"zipCode\":\"110202\",\"phoneNumber\":\"\",\"country\":{\"countryName\":\"United States\",\"countryCode\":\"US\"},\"state\":{\"stateName\":\"New York\",\"stateCode\":\"NY\"},\"isShipping\":\"1\",\"isBilling\":\"1\",\"isDefaultShipping\":\"1\",\"isDefaultBilling\":\"0\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/addresses/{addressId}": { + "get": { + "operationId": "companies_addresses_read", + "summary": "Get A Company Address", + "description": "Get an address for a company", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addresses": { + "description": "All addresses", + "type": "object", + "properties": { + "addressId": { + "description": "Identifier for the address (same as URL parameter addressId)", + "type": "string" + }, + "addressLine1": { + "description": "Typically the street address", + "type": "string" + }, + "addressLine2": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "city": { + "type": "string" + }, + "country": { + "type": "object", + "properties": { + "countryCode": { + "description": "ISO 3166-1 Alpha 2 Country Code", + "type": "string" + }, + "countryName": { + "description": "Human readable country name", + "type": "string" + } + } + }, + "firstName": { + "type": "string" + }, + "isBilling": { + "description": "Indicates whether the address is a billing address", + "type": "boolean" + }, + "isDefaultBilling": { + "type": "boolean" + }, + "isDefaultShipping": { + "type": "boolean" + }, + "isShipping": { + "description": "Indicates whether the address is a shipping address", + "type": "boolean" + }, + "lastName": { + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "state": { + "type": "object", + "properties": { + "stateCode": { + "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", + "type": "string" + }, + "stateName": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + } + } + }, + "zipCode": { + "description": "A valid postal code used by the country that was specified", + "type": "string" + }, + "externalId": { + "type": "string" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addressId": "6", + "addressLine1": "123 Main Street", + "addressLine2": "Blvd", + "city": "Austin", + "country": { + "countryCode": "US", + "countryName": "United States" + }, + "firstName": "Jane", + "isBilling": true, + "isDefaultBilling": true, + "isDefaultShipping": true, + "isShipping": true, + "lastName": "Doe", + "phoneNumber": "11111111111", + "state": { + "stateCode": "TX", + "stateName": "Texas" + }, + "zipCode": "78751", + "channelId": 1, + "channelName": "test" + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Response record not found", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": {}, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "companies_addresses_update", + "summary": "Update A Company Address", + "description": "Updates an address for a company. You can change whether the address is for billing, shipping, or both. You can also update the address to be the default billing or shipping address for the company.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "addressLine1": { + "description": "Typically the street address", + "type": "string" + }, + "addressLine2": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "city": { + "type": "string" + }, + "country": { + "type": "object", + "properties": { + "countryCode": { + "description": "ISO 3166-1 Alpha 2 Country Code", + "type": "string" + }, + "countryName": { + "description": "Human readable country name", + "type": "string" + } + } + }, + "firstName": { + "description": "Address first name", + "type": "string" + }, + "isBilling": { + "description": "Indicates whether the address is a billing address", + "type": "boolean" + }, + "isDefaultBilling": { + "description": "Indicates whether the address is the default billing address", + "type": "boolean" + }, + "isDefaultShipping": { + "description": "Indicates whether the address is the default shipping address", + "type": "boolean" + }, + "isShipping": { + "description": "Indicates whether the address is a shipping address", + "type": "boolean" + }, + "label": { + "description": "Address label", + "type": "string" + }, + "lastName": { + "description": "Address last name", + "type": "string" + }, + "phoneNumber": { + "description": "Address phone number", + "type": "string" + }, + "state": { + "type": "object", + "properties": { + "stateCode": { + "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", + "type": "string" + }, + "stateName": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + } + } + }, + "zipCode": { + "type": "string" + }, + "externalId": { + "type": "string" + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addressId": { + "description": "Updated address Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addressId": 4 + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "data": { + "address_line_1": "Address not allow None", + "last_name": "Last name not allow None" + }, + "message": "Bad Requests Error" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Address Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": \"1\",\n \"isDefaultBilling\": \"0\"\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\"\npayload = {\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": \"1\",\n \"isDefaultBilling\": \"0\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"label\":\"12dxqwdsa\",\"firstName\":\"Bundle\",\"lastName\":\"Test\",\"addressLine1\":\"Street.1\",\"addressLine2\":\"\",\"city\":\"New York\",\"zipCode\":\"110202\",\"phoneNumber\":\"\",\"country\":{\"countryName\":\"United States\",\"countryCode\":\"US\"},\"state\":{\"stateName\":\"New York\",\"stateCode\":\"NY\"},\"isShipping\":\"1\",\"isBilling\":\"1\",\"isDefaultShipping\":\"1\",\"isDefaultBilling\":\"0\"});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "delete": { + "operationId": "companies_addresses_delete", + "summary": "Delete A Company Address", + "description": "Deletes an address from a company.", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Deleted successful", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addressId": { + "description": "Deleted address Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addressId": 2 + }, + "message": "Success" + } + } + }, + "404": { + "description": "Company not found", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Address Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Address" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"DELETE\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'DELETE',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "addressId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/basic-info": { + "get": { + "operationId": "companies_basic-info_list", + "summary": "Get Company Basic Information", + "description": "Get company's basic information", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addressLine1": { + "description": "Company address line 1", + "type": "string" + }, + "addressLine2": { + "description": "Company address line 2", + "type": "string" + }, + "catalogId": { + "description": "Catalog Id", + "type": "string" + }, + "catalogName": { + "description": "Catalog Id", + "type": "string" + }, + "city": { + "description": "Company city", + "type": "string" + }, + "companyEmail": { + "description": "Company email", + "type": "string" + }, + "companyId": { + "description": "Company Id", + "type": "string" + }, + "companyName": { + "description": "Company name", + "type": "string" + }, + "companyStatus": { + "description": "Company status", + "type": "string" + }, + "country": { + "description": "Company country", + "type": "string" + }, + "description": { + "description": "Company description", + "type": "string" + }, + "extraFields": { + "description": "Company extra fields", + "type": "array", + "items": { + "type": "object", + "properties": { + "dataType": { + "description": "Field data type, 0=text, 1=number, 2=textarea.", + "type": "string" + }, + "fieldName": { + "description": "Field name", + "type": "string" + }, + "fieldValue": { + "description": "Field value", + "type": "string" + }, + "isRequired": { + "description": "Is field required or not, 0=not required, 1=required", + "type": "string" + }, + "labelName": { + "description": "Field label name", + "type": "string" + } + } + } + }, + "phoneNumber": { + "description": "Company phone number", + "type": "string" + }, + "state": { + "description": "Company state", + "type": "string" + }, + "updatedAt": { + "description": "Company updated timestamp", + "type": "string" + }, + "uuid": { + "description": "UUID", + "type": "string" + }, + "zipCode": { + "description": "Company zip code", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addressLine1": "", + "addressLine2": "", + "catalogId": "1", + "catalogName": "testCatalogName", + "city": "Paris", + "companyEmail": "test@bundleb2b.com", + "companyId": "35", + "companyName": "CropTest1", + "companyStatus": "1", + "country": "French", + "description": "CropTest", + "extraFields": [ + { + "dataType": "2", + "fieldName": "extraStr1", + "fieldValue": "extra_text", + "isRequired": "0", + "labelName": "Enter your license" + } + ], + "phoneNumber": "10030212001", + "state": "BC", + "updatedAt": "1594192159", + "uuid": "111", + "zipCode": "1032332" + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "companies_basic-info_update", + "summary": "Update Company Basic Information", + "description": "Update a company's basic info, you can update on or more options", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "addressLine1": { + "description": "Address string line 1", + "type": "string" + }, + "addressLine2": { + "description": "Address string line 2", + "type": "string" + }, + "catalogId": { + "description": "BigCommerce price list Id that company related(If put its 0 will clear the catalog).", + "type": "string" + }, + "city": { + "type": "string" + }, + "companyEmail": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "companyStatus": { + "description": "Company status: \n\n 0=PENDING 1=APPROVED 2=REJECTED 3=INACTIVE 4=DELETED", + "type": "string" + }, + "country": { + "description": "\nCountry full name or ISO2 country code. For Example: \n\nA Country full name: Afghanistan \n\nISO2 Country code: AF\n", + "type": "string" + }, + "description": { + "type": "string" + }, + "extraFields": { + "description": "To use customized extra fields with field names you need to first add company extra fields in Settings > Extra fields inside B2B edition. eg. If you want to create a new company with an extra integer field named licenseNO, you can use this structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}] in the request body.", + "type": "array", + "items": { + "type": "object", + "properties": { + "fieldName": { + "type": "string" + }, + "fieldValue": { + "type": "string" + } + } + } + }, + "extraInt1": { + "description": "The default extra integer field, you can also use this field to create a company with it.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there is an important point you need to know. After the B3 team helped you configure the custom extra fields, if you still need to use these default fields, you need to know the correspondence between the custom extra fields and the default extra fields. Otherwise, when you pass in both custom and default extra fields, if the custom extra field is bound to the default extra field you pass in, the value of the custom extra field will override the default extra field.", + "type": "number" + }, + "extraInt2": { + "description": "Company update extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt3": { + "description": "Company update extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt4": { + "description": "Company update extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraInt5": { + "description": "Company update extra integer value, please refer to the description of extraInt1 above.", + "type": "number" + }, + "extraStr1": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr2": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr3": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr4": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraStr5": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "extraText": { + "description": "Company update extra string value, please refer to the description of extraInt1 above.", + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "state": { + "type": "string" + }, + "zipCode": { + "type": "string" + }, + "priceListAssign": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channelId": { + "type": "integer", + "description": "BigCommerce channel id" + }, + "priceListId": { + "type": "integer", + "description": "BC price list ID" + } + } + } + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Updated company Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2" + }, + "message": "Success" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n\n}'\n" + }, + { + "lang": "Python", + "source": "\n import requests\n\n url = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23\"\n\n payload = \"{\n\t\"companyName\": \"test3.23-22\",\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\",\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"PUT\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\n var myHeaders = new Headers();\n myHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n myHeaders.append(\"Content-Type\", \"application/json\");\n\n var raw = \"{\n\t\"companyName\": \"test3.23-22\",\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\",\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\";\n\n var requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n };\n\n fetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/force-del": { + "delete": { + "operationId": "companies_force-del_delete", + "summary": "Delete Company With Related", + "description": "Force Delete A Company and its Related Information.", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Deleted successful", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Deleted company Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2" + }, + "message": "Success" + } + } + }, + "404": { + "description": "Company not found", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/orderBCIds": { + "get": { + "operationId": "companies_orderBCIds_list", + "summary": "Get BC Order Id List By Company Id", + "description": "Get bC order ID list by company id", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "offset", + "in": "query", + "description": "Pagination offset default: 0", + "type": "number" + }, + { + "name": "limit", + "in": "query", + "description": "Pagination limit default: 10", + "type": "number" + }, + { + "name": "beginDateAt", + "in": "query", + "description": "End date filter, in format '12/31/2019'", + "type": "string" + }, + { + "name": "endDateAt", + "in": "query", + "description": "End date filter, in format '12/31/2019'", + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "type": "object", + "properties": { + "list": { + "description": "", + "type": "array", + "items": { + "type": "object", + "properties": { + "orderId": { + "description": "Order id", + "type": "string" + } + } + } + }, + "pagination": { + "description": "Response data pagination", + "type": "object", + "properties": { + "limit": { + "description": "Response pagination limit", + "type": "number" + }, + "offset": { + "description": "Response pagination offset", + "type": "number" + }, + "totalCount": { + "description": "Response data items number", + "type": "number" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "list": [ + { + "orderId": "1" + } + ], + "pagination": { + "limit": 10, + "offset": 0, + "totalCount": 3 + } + }, + "message": "Success" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/orders": { + "get": { + "operationId": "companies_orders_list", + "summary": "Get Company Orders", + "description": "Get company all orders, with pagination data", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "offset", + "in": "query", + "description": "Pagination offset default: 0", + "type": "number" + }, + { + "name": "limit", + "in": "query", + "description": "Pagination limit default: 10", + "type": "number" + }, + { + "name": "orderBy", + "in": "query", + "description": "in ['bcOrderId', 'totalIncTax', 'createdAt']", + "type": "string" + }, + { + "name": "beginDateAt", + "in": "query", + "description": "End date filter, in format '12/31/2019'", + "type": "string" + }, + { + "name": "endDateAt", + "in": "query", + "description": "End date filter, in format '12/31/2019'", + "type": "string" + }, + { + "name": "includeExtra", + "in": "query", + "description": "Switch show extra fields, allow: 0, 1", + "type": "string" + }, + { + "name": "extraStr1", + "in": "query", + "description": "Extra field filter", + "type": "string" + }, + { + "name": "extraStr2", + "in": "query", + "description": "Extra field filter", + "type": "string" + }, + { + "name": "extraStr3", + "in": "query", + "description": "Extra field filter", + "type": "string" + }, + { + "name": "extraStr4", + "in": "query", + "description": "Extra field filter", + "type": "string" + }, + { + "name": "extraStr5", + "in": "query", + "description": "Extra field filter", + "type": "string" + }, + { + "name": "extraInt1", + "in": "query", + "description": "Extra field filter", + "type": "number" + }, + { + "name": "extraInt2", + "in": "query", + "description": "Extra field filter", + "type": "number" + }, + { + "name": "extraInt3", + "in": "query", + "description": "Extra field filter", + "type": "number" + }, + { + "name": "extraInt4", + "in": "query", + "description": "Extra field filter", + "type": "number" + }, + { + "name": "extraInt5", + "in": "query", + "description": "Extra field filter", + "type": "number" + }, + { + "type": "number", + "in": "query", + "name": "channelId", + "description": "BigComerce channel id" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "object", + "properties": { + "OrderStatus": { + "description": "Order status, eg. Awaiting Payment", + "type": "string" + }, + "companyName": { + "description": "User phone number", + "type": "string" + }, + "createdAt": { + "description": "Order created date.", + "type": "string" + }, + "firstName": { + "description": "Order's user first name.", + "type": "string" + }, + "isInvoiceOrder": { + "description": "Is a invoice order", + "type": "string" + }, + "lastName": { + "description": "Order's user last name", + "type": "string" + }, + "orderId": { + "description": "Order id", + "type": "string" + }, + "totalIncTax": { + "description": "Order's total invoice taxes.", + "type": "string" + }, + "updatedAt": { + "description": "Order updated date.", + "type": "string" + }, + "channelName": { + "type": "string", + "description": "BigCommerce channel name" + }, + "channelId": { + "type": "string", + "description": "BigCommerce channel id" + } + } + } + }, + "pagination": { + "description": "Response data pagination", + "type": "object", + "properties": { + "limit": { + "description": "Response pagination limit", + "type": "number" + }, + "offset": { + "description": "Response pagination offset", + "type": "number" + }, + "totalCount": { + "description": "Response data items number", + "type": "number" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "list": [ + { + "companyName": "fkkfcctest", + "createdAt": "1572323610", + "firstName": "james", + "isInvoiceOrder": "0", + "lastName": "liu", + "orderId": "126", + "orderStatus": "Awaiting Payment", + "totalIncTax": "100.0000", + "updatedAt": "1572323610", + "channelId": 1, + "channelName": "test" + }, + { + "companyName": "fkkfcctest", + "createdAt": "1572323432", + "firstName": "james", + "isInvoiceOrder": "0", + "lastName": "liu", + "orderId": "124", + "orderStatus": "Awaiting Payment", + "totalIncTax": "50.0000", + "updatedAt": "1572323432", + "channelId": 1, + "channelName": "test" + }, + { + "companyName": "fkkfcctest", + "createdAt": "1572321777", + "firstName": "james", + "isInvoiceOrder": "0", + "lastName": "liu", + "orderId": "125", + "orderStatus": "Awaiting Payment", + "totalIncTax": "50.0000", + "updatedAt": "1572321777", + "channelId": 1, + "channelName": "test" + } + ], + "paginator": { + "limit": 10, + "offset": 0, + "totalCount": 3 + } + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/payments": { + "get": { + "operationId": "companies_payments_list", + "summary": "Get Company Payments Methods", + "description": "Get company payments methods, include inactive", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "", + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "description": "Payment code", + "type": "string" + }, + "isEnabled": { + "description": "Payment method status", + "type": "string" + }, + "name": { + "description": "Payment name", + "type": "string" + }, + "paymentId": { + "description": "Payment id", + "type": "number" + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": [ + { + "code": "cheque", + "isEnabled": "1", + "name": "Check", + "paymentId": 3 + }, + { + "code": "bankdeposit", + "isEnabled": "0", + "name": "Bank Deposit", + "paymentId": 6 + }, + { + "code": "cod", + "isEnabled": "0", + "name": "Cash on Delivery", + "paymentId": 7 + }, + { + "code": "moneyorder", + "isEnabled": "0", + "name": "Money Order", + "paymentId": 8 + }, + { + "code": "testgateway", + "isEnabled": "0", + "name": "Test Payment Gateway", + "paymentId": 5 + } + ], + "message": "SUCCESS" + } + } + } + }, + "tags": [ + "Payment" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "companies_payments_update", + "summary": "Update Company Payments Methods", + "description": "Update Company payments methods' status, change them active or not", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "payments": { + "type": "array", + "items": { + "required": [ + "paymentId", + "isEnabled" + ], + "type": "object", + "properties": { + "isEnabled": { + "description": "payment active or not('1' for active, others for inactive)", + "type": "string" + }, + "paymentId": { + "description": "Payment Id", + "type": "string" + } + } + } + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Updated company Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "customerId": 2 + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "data": { + "payments": [ + { + "isEnabled": [ + "This field is required." + ] + } + ] + }, + "message": "Bad Request Error" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Payment" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"payments\": [\n {\n \"paymentId\": \"6\",\n \"isEnabled\": \"1\"\n }\n ]\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\"\npayload = {\n \"payments\": [\n {\n \"paymentId\": \"6\",\n \"isEnabled\": \"1\"\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"payments\":[{\"paymentId\":\"6\",\"isEnabled\":\"1\"}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/sales-reps": { + "get": { + "operationId": "companies_sales-reps_list", + "summary": "Get Company Sales Reps", + "description": "Get company sales reps' basic info", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "firstName": { + "description": "Sales rep's first name", + "type": "string" + }, + "id": { + "description": "Sales rep's Id", + "type": "string" + }, + "lastName": { + "description": "Sales rep's last name", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "firstName": "kobe", + "id": "74", + "lastName": "tiantian" + }, + "message": "Success" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "SalesRep" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "companies_sales-reps_update", + "summary": "Update Company Sales reps", + "description": "Update company reps", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "salesReps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "description": "Sales rep's Id", + "type": "string" + } + } + } + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Updated company Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2" + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field [field]", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "message": "This field is required." + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "SalesRep" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"salesReps\": [\n {\n \"id\": \"74\"\n }\n ]\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\"\npayload = {\n \"salesReps\": [\n {\n \"id\": \"74\"\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"salesReps\":[{\"id\":\"74\"}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/user/{customerId}/orders": { + "post": { + "operationId": "companies_user_orders_create", + "summary": "Create An Order", + "description": "Create an order from bigCommerce, you must known order id", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "allOf": [ + { + "type": "object", + "properties": { + "orderId": { + "description": "BigCommerce order id", + "type": "string" + }, + "poNumber": { + "description": "PoNumber", + "type": "string" + }, + "totalIncTax": { + "description": "Total incTax", + "type": "number" + } + }, + "required": [ + "orderId", + "totalIncTax" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + } + ] + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "orderId": { + "description": "Created order id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "orderId": 2 + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "data": { + "bc_order_id": "orderId can not be null" + }, + "message": "Bad Request Error" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}' \n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders\"\n\npayload = {\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"totalIncTax\":\"111\",\"orderId\":\"111\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "customerId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/user/{userId}": { + "put": { + "operationId": "companies_user_update", + "summary": "Update A Company User", + "description": "Update a company user info", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "email": { + "type": "string" + }, + "uuid": { + "type": "string" + }, + "userRole": { + "type": "string" + }, + "acceptWelcomeEmail": { + "type": "string" + }, + "channelIds": { + "type": "array", + "description": "BigCommerce channel id list.", + "items": { + "type": "integer" + } + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "kac8dnjf5qza1" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." + } + } + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + } + } + ], + "responses": { + "200": { + "description": "", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "customerId": { + "type": "integer" + }, + "userId": { + "type": "integer" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": {} + } + }, + "tags": [ + "User" + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/users": { + "get": { + "operationId": "companies_users_list", + "summary": "Get Company Users", + "description": "Get company users, with pagination data", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "offset", + "in": "query", + "description": "Pagination offset default: 0", + "type": "number" + }, + { + "name": "limit", + "in": "query", + "description": "Pagination limit default: 10", + "type": "number" + }, + { + "name": "role[]", + "in": "query", + "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep) eg. role[]=1, 2", + "type": "string" + }, + { + "type": "string", + "in": "query", + "name": "isIncludeExtraFields", + "description": "0 or 1" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "allOf": [ + { + "type": "object", + "properties": { + "catalogId": { + "description": "Catalog Id", + "type": "string" + }, + "createdAt": { + "description": "User create time", + "type": "string" + }, + "email": { + "description": "User email", + "type": "string" + }, + "firstName": { + "description": "User's first name", + "type": "string" + }, + "id": { + "description": "User Id", + "type": "string" + }, + "lastName": { + "description": "User's last name", + "type": "string" + }, + "phoneNumber": { + "description": "User phone number", + "type": "string" + }, + "role": { + "description": "user role (0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", + "type": "string" + }, + "updatedAt": { + "description": "user update time", + "type": "string" + }, + "uuid": { + "description": "user UUID", + "type": "string" + }, + "channelList": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channelId": { + "type": "integer", + "description": "BigCommerce channel id" + }, + "channelName": { + "type": "string", + "description": "Channel name" + }, + "iconUrl": { + "type": "string", + "description": "Channel icon url" + } + } + } + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "iz7buf5a5b5bq" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." + }, + "companyRoleName": { + "type": "string", + "x-stoplight": { + "id": "jfmg9izfe2w7t" + }, + "description": "The company role name. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." + } + } + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + } + }, + "pagination": { + "description": "Response data pagination", + "type": "object", + "properties": { + "limit": { + "description": "Response pagination limit", + "type": "number" + }, + "offset": { + "description": "Response pagination offset", + "type": "number" + }, + "totalCount": { + "description": "Response data items number", + "type": "number" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "list": [ + { + "catalogId": "1", + "createdAt": "1574999690", + "email": "test323@test.com", + "firstName": "test", + "id": "123", + "lastName": "test2", + "phoneNumber": "", + "role": "1", + "updatedAt": "1574999690", + "uuid": "A123456", + "channelList": [] + } + ], + "pagination": { + "limit": 10, + "offset": 0, + "totalCount": 1 + } + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "post": { + "operationId": "companies_users_create", + "summary": "Create A Company User", + "description": "Create a company user, which belongs company", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "acceptWelcomeEmail": { + "description": "(0=will not receive email 1=will receive email)", + "type": "string", + "enum": [ + 0, + 1 + ] + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userRole": { + "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", + "type": "string" + }, + "uuid": { + "type": "string" + }, + "channelIds": { + "type": "array", + "description": "BigCommerce channel id list", + "items": { + "type": "integer" + } + }, + "originChannelId": { + "type": "integer", + "description": "BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured" + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "1qhsxeqqydfte" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." + } + }, + "required": [ + "email", + "firstName", + "lastName", + "phone" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + }, + "description": "" + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "customerId": { + "description": "Created bc customer Id", + "type": "string" + }, + "userId": { + "description": "Created user Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "customerId": "2", + "userId": "2" + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 10012, + "data": {}, + "message": "PARAMETER VALUE ERROR" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"firstName\":\"test\",\"lastName\":\"test2\",\"email\":\"test323@test.com\",\"phone\":\"122331212\",\"userRole\":1});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "companies_users_update_or_create", + "summary": "Update Company User", + "description": "Update company user's field, user identified by email field.fields can not omit", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "acceptWelcomeEmail": { + "description": "(0=will not receive email 1=will receive email)", + "type": "string", + "enum": [ + 0, + 1 + ] + }, + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userRole": { + "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", + "type": "string" + }, + "uuid": { + "type": "string" + }, + "channelIds": { + "type": "array", + "description": "BigCommerce channel id list", + "items": { + "type": "integer" + } + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "apzeyjj6m09cp" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." + } + }, + "required": [ + "email", + "firstName", + "lastName" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "customerId": { + "description": "Created bc customer Id", + "type": "string" + }, + "userId": { + "description": "Created user Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "customerId": "2", + "userId": "2" + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 10012, + "data": {}, + "message": "PARAMETER VALUE ERROR" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"userRole\": 1\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"userRole\": 1\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"firstName\":\"test\",\"lastName\":\"test2\",\"email\":\"test323@test.com\",\"userRole\":1});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/users/bulk_create": { + "post": { + "operationId": "companies_users_bulk_create_create", + "summary": "Bulk Create Company User", + "description": "Create company users in batch", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "acceptWelcomeEmail": { + "description": "(0=will not receive email 1=will receive email)", + "type": "string", + "enum": [ + 0, + 1 + ] + }, + "users": { + "type": "array", + "items": { + "allOf": [ + { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userRole": { + "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", + "type": "string" + }, + "channelIds": { + "type": "array", + "description": "BigCommerce channel id list", + "items": { + "type": "integer" + } + }, + "originChannelId": { + "type": "integer", + "description": "BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured" + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "y177z48133txw" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." + } + }, + "required": [ + "email", + "firstName", + "lastName", + "phone" + ] + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + } + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "failedItems": { + "type": "array", + "items": { + "type": "object", + "properties": { + "email": { + "description": "Created user email", + "type": "string" + }, + "firstName": { + "description": "Created user's first name", + "type": "string" + }, + "lastName": { + "description": "Created user's last name", + "type": "string" + }, + "phone": { + "description": "Created user phone", + "type": "string" + }, + "userRole": { + "description": "Created user role", + "type": "number" + } + } + } + }, + "successfulItems": { + "type": "array", + "items": { + "type": "object", + "properties": { + "customerId": { + "description": "Created customer Id", + "type": "number" + }, + "email": { + "description": "Created user email", + "type": "string" + }, + "firstName": { + "description": "Created user's first name", + "type": "string" + }, + "lastName": { + "description": "Created user's last name", + "type": "string" + }, + "phone": { + "description": "Created user phone", + "type": "string" + }, + "userRole": { + "description": "Created user role", + "type": "number" + } + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "failedItems": [], + "successfulItems": [ + { + "customerId": 2, + "email": "test323@test121.com", + "firstName": "test11", + "lastName": "test2", + "phone": "122331211", + "userRole": 1 + }, + { + "customerId": 2, + "email": "test323@test22.com", + "firstName": "test12", + "lastName": "test2", + "phone": "122331212", + "userRole": 1 + } + ] + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 10012, + "data": {}, + "message": "PARAMETER VALUE ERROR" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"users\": [\n {\n \"firstName\": \"test11\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test11.com\",\n \"phone\": \"122331211\",\n \"userRole\": 1\n },\n {\n \"firstName\": \"test12\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test12.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n }\n ]\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create\"\n\npayload = {\n \"users\": [\n {\n \"firstName\": \"test11\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test11.com\",\n \"phone\": \"122331211\",\n \"userRole\": 1\n },\n {\n \"firstName\": \"test12\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test12.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"users\":[{\"firstName\":\"test11\",\"lastName\":\"test2\",\"email\":\"test323@test11.com\",\"phone\":\"122331211\",\"userRole\":1},{\"firstName\":\"test12\",\"lastName\":\"test2\",\"email\":\"test323@test12.com\",\"phone\":\"122331212\",\"userRole\":1}]});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/companies/{companyId}/users/{customerId}": { + "get": { + "operationId": "companies_users_read", + "summary": "Get A Company User", + "description": "Get a company user's info, by company and customer id", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "allOf": [ + { + "type": "object", + "properties": { + "catalogId": { + "description": "Catalog Id", + "type": "string" + }, + "createdAt": { + "description": "User create time", + "type": "string" + }, + "email": { + "description": "User email", + "type": "string" + }, + "firstName": { + "description": "User's first name", + "type": "string" + }, + "id": { + "description": "User Id", + "type": "string" + }, + "lastName": { + "description": "User's last name", + "type": "string" + }, + "phoneNumber": { + "description": "User phone number", + "type": "string" + }, + "role": { + "description": "user role (0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", + "type": "string" + }, + "updatedAt": { + "description": "user update time", + "type": "string" + }, + "uuid": { + "description": "user UUID", + "type": "string" + }, + "channelList": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channelId": { + "type": "integer", + "description": "BigCommerce channel id" + }, + "channelName": { + "type": "string", + "description": "Channel name" + }, + "iconUrl": { + "type": "string", + "description": "Channel icon url" + } + } + } + }, + "companyRoleId": { + "type": "integer", + "x-stoplight": { + "id": "6ocmpffb3ywgh" + }, + "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." + }, + "companyRoleName": { + "type": "string", + "x-stoplight": { + "id": "8853bn9ijoqey" + }, + "description": "The company role name. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." + } + } + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + } + ] + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "catalogId": "1", + "createdAt": "1574999690", + "email": "test323@test.com", + "firstName": "test", + "id": "123", + "lastName": "test2", + "phoneNumber": "", + "role": "1", + "updatedAt": "1574999690", + "uuid": "A123456", + "channelList": [] + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "delete": { + "operationId": "companies_users_delete", + "summary": "Delete A Company User", + "description": "Delete a company user, if this user is the only one administrator of company, will return a 500 Error", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Deleted successful", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "customerId": { + "description": "Deleted user Id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "customerId": 2 + }, + "message": "Success" + } + } + }, + "404": { + "description": "Company not found", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": {} + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "User" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"DELETE\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'DELETE',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "companyId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "customerId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/orders": { + "put": { + "operationId": "orders_update", + "summary": "Update Company Order With BC OrderId", + "description": "Update order, billingAddress and products can not be omitted. products can be two format. \n 1. Product with variants. \n 2. Base product", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "type": "object", + "properties": { + "baseHandlingCost": { + "description": "The value of the base handling cost. (Float, Float-As-String, Integer).", + "type": "string" + }, + "baseShippingCost": { + "description": "The value of the base shipping cost. (Float, Float-As-String, Integer)", + "type": "string" + }, + "baseWrappingCost": { + "description": "The value of the base wrapping cost. (Float, Float-As-String, Integer).", + "type": "string" + }, + "billingAddress": { + "type": "object", + "properties": { + "city": { + "type": "string" + }, + "company": { + "description": "Company name", + "type": "string" + }, + "country": { + "description": "Human readable country name", + "type": "string" + }, + "countryIso2": { + "description": "Country ISO info.", + "type": "string" + }, + "email": { + "description": "Address email.", + "type": "string" + }, + "firstName": { + "description": "Address first name", + "type": "string" + }, + "formFields": { + "description": "Address form fields.", + "type": "string" + }, + "lastName": { + "description": "Address last name", + "type": "string" + }, + "phone": { + "description": "Address phone number", + "type": "string" + }, + "state": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + }, + "streetOne": { + "description": "Typically the street address", + "type": "string" + }, + "streetTwo": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "zip": { + "type": "string" + } + } + }, + "channelId": { + "description": "BigCommerce channel id. Shows where the order originated. The channel_id will default to 1.", + "type": "string" + }, + "creditCardType": { + "description": "Credit card type.", + "type": "string" + }, + "customerMessage": { + "description": "Message that the customer entered (number, optiona) -o the Order Comments box during checkout.", + "type": "string" + }, + "dateCreated": { + "description": "Date created.", + "type": "string" + }, + "discountAmount": { + "description": "Amount of discount for this transaction. (Float, Float-As-String, Integer)", + "type": "string" + }, + "ebayOrderId": { + "description": "If the order was placed through eBay, the eBay order number will be included. Otherwise, the value will be 0.", + "type": "string" + }, + "externalId": { + "description": "ID of the order in another system. For example, the Amazon Order ID if this is an Amazon order.This field can be updated in a /POST, but using a /PUT to update the order will return a 400 error. The field ‘external_id’ cannot be written to. Please remove it from your request before trying again. It can not be overwritten once set..", + "type": "string" + }, + "externalMerchantId": { + "description": "Id of the external merchant.", + "type": "string" + }, + "externalSource": { + "description": "For orders submitted or modified via the API, using a PUT or POST operation, you can optionally pass in a value identifying the system used to generate the order. For example: POS. Otherwise, the value will be null.", + "type": "string" + }, + "geoipCountry": { + "description": "The full name of the country where the customer made the purchase, based on the IP.", + "type": "string" + }, + "geoipCountryIso2": { + "description": "The country where the customer made the purchase, in ISO2 format, based on the IP.", + "type": "string" + }, + "giftCertificateAmount": { + "description": "A read-only value. Do not pass in a POST or PUT. (Float, Float-As-String, Integer)", + "type": "string" + }, + "handlingCostExTax": { + "description": "The value of the handling cost, excluding tax. (Float, Float-As-String, Integer)", + "type": "string" + }, + "handlingCostIncTax": { + "description": "The value of the handling cost, including tax. (Float, Float-As-String, Integer).", + "type": "string" + }, + "ipAddress": { + "description": "IP Address of the customer, if known.", + "type": "string" + }, + "isDeleted": { + "description": "Indicates whether the order was deleted (archived). Set to to true, to archive an order.", + "type": "string" + }, + "itemsShipped": { + "description": "The number of items that have been shipped.", + "type": "string" + }, + "itemsTotal": { + "description": "The total number of items in the order.", + "type": "string" + }, + "orderId": { + "description": "BigCommerce order id", + "type": "string" + }, + "orderIsDigital": { + "description": "Whether this is an order for digital products.", + "type": "string" + }, + "paymentMethod": { + "description": "The payment method for this order. Can be one of the following: Manual, Credit Card, cash, Test Payment Gateway, etc.", + "type": "string" + }, + "paymentProviderId": { + "description": "The external Transaction ID/Payment ID within this order’s payment provider (if a payment provider was used).", + "type": "string" + }, + "poNumber": { + "description": "PoNumber", + "type": "string" + }, + "products": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "priceExTax": { + "type": "string" + }, + "priceIncTax": { + "type": "string" + }, + "productId": { + "description": "Product id.", + "type": "string" + }, + "productOptions": { + "type": "string" + }, + "quantity": { + "type": "string" + }, + "sku": { + "type": "string" + }, + "upc": { + "type": "string" + }, + "variantId": { + "type": "string" + } + } + } + }, + "refundedAmount": { + "description": "The amount refunded from this transaction. (Float, Float-As-String, Integer)", + "type": "string" + }, + "shippingCostExTax": { + "description": "The value of shipping cost, excluding tax. (Float, Float-As-String, Integer).", + "type": "string" + }, + "shippingCostIncTax": { + "description": "The value of shipping cost, including tax. (Float, Float-As-String, Integer).", + "type": "string" + }, + "staffNotes": { + "description": "Any additional notes for staff.", + "type": "string" + }, + "statusId": { + "description": "The status ID of the order.", + "type": "string" + }, + "subtotalExTax": { + "description": "Override value for subtotal excluding tax. If specified, the field subtotal_inc_tax is also required. (Float, Float-As-String, Integer)", + "type": "string" + }, + "subtotalIncTax": { + "description": "TOverride value for subtotal including tax. If specified, the field subtotal_ex_tax is also required. (Float, Float-As-String, Integer)", + "type": "string" + }, + "taxProviderId": { + "description": "Tax provider id.", + "type": "string" + }, + "totalExTax": { + "description": "Override value for the total, excluding tax. If specified, the field total_inc_tax is also required. (Float, Float-As-String, Integer)", + "type": "string" + }, + "wrappingCostExTax": { + "description": "The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer).", + "type": "string" + }, + "wrappingCostIncTax": { + "description": "The value of the wrapping cost, including tax. (Float, Float-As-String, Integer).", + "type": "string" + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "companyId": { + "description": "Updated order id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "orderId": 2 + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error Message", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40010, + "data": { + "errMsg": "bc internal server error" + }, + "message": "Bad Requests Error" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"orderId\": 117,\n \"statusId\": 0,\n \"billingAddress\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"streetOne\": \"123 Main Street\",\n \"city\": \"Austin\",\n \"state\": \"Texas\",\n \"zip\": \"78751\",\n \"country\": \"United States\",\n \"countryIso2\": \"US\",\n \"email\": \"janedoe@email.com\"\n },\n \"products\": [\n {\n \"name\": \"BigCommerce Poster\",\n \"quantity\": 1,\n \"priceIncTax\": 10.98,\n \"priceExTax\": 10\n },\n {\n \"name\": \"BigCommerce Coffee Mug\",\n \"quantity\": 1,\n \"priceIncTax\": 50,\n \"priceExTax\": 45\n }\n ]\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders\"\npayload = {\n \"orderId\": 117,\n \"statusId\": 0,\n \"billingAddress\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"streetOne\": \"123 Main Street\",\n \"city\": \"Austin\",\n \"state\": \"Texas\",\n \"zip\": \"78751\",\n \"country\": \"United States\",\n \"countryIso2\": \"US\",\n \"email\": \"janedoe@email.com\"\n },\n \"products\": [\n {\n \"name\": \"BigCommerce Poster\",\n \"quantity\": 1,\n \"priceIncTax\": 10.98,\n \"priceExTax\": 10\n },\n {\n \"name\": \"BigCommerce Coffee Mug\",\n \"quantity\": 1,\n \"priceIncTax\": 50,\n \"priceExTax\": 45\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"orderId\":117,\"statusId\":0,\"billingAddress\":{\"firstName\":\"Jane\",\"lastName\":\"Doe\",\"streetOne\":\"123 Main Street\",\"city\":\"Austin\",\"state\":\"Texas\",\"zip\":\"78751\",\"country\":\"United States\",\"countryIso2\":\"US\",\"email\":\"janedoe@email.com\"},\"products\":[{\"name\":\"BigCommerce Poster\",\"quantity\":1,\"priceIncTax\":10.98,\"priceExTax\":10},{\"name\":\"BigCommerce Coffee Mug\",\"quantity\":1,\"priceIncTax\":50,\"priceExTax\":45}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/orders/company": { + "post": { + "operationId": "orders_company_create", + "summary": "Update BC Order's 'Company attribute'", + "description": "Add Company identifier for BigCommerce Customer Individual Orders, which can be used to convert BigCommerce Customer Individual Orders to Company-level Orders.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "required": [ + "customerID" + ], + "type": "object", + "properties": { + "customerID": { + "description": "BigCommerce user id.", + "type": "string" + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object" + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": {}, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40013, + "data": {}, + "message": "Store does not exist." + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'localhost:8000/api/v2/io/orders/convert-from-bc' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4' --header 'Content-Type: application/json' --data-raw '{\n \"customerID\": \"7566\"\n}'\n" + }, + { + "lang": "Python", + "source": "\n import requests\n\n url = \"localhost:8000/api/v2/io/orders/convert-from-bc\"\n\n payload = \"{\n \"customerID\": \"7566\"\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"POST\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"customerID\":\"7566\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/orders/convert-from-bc\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "put": { + "operationId": "orders_company_update", + "summary": "Update B2BE User's Orders' company attribute.", + "description": "Update the orders belong to a B2BE company to another B2BE company.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "required": [ + "customerID", + "customerGroupID" + ], + "type": "object", + "properties": { + "customerGroupID": { + "description": "BigCommerce customer group id.", + "type": "string" + }, + "customerID": { + "description": "BigCommerce user id.", + "type": "string" + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object" + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": {}, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40013, + "data": {}, + "message": "Store does not exist." + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request PUT 'localhost:8000/api/v2/io/orders/company' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Content-Type: application/json' --data-raw '{\n \"customerGroupID\": \"6406\",\n \"customerID\": \"7298\"\n}'\n" + }, + { + "lang": "Python", + "source": "\n import requests\n\n url = \"localhost:8000/api/v2/io/orders/company\"\n\n payload = \"{\n \"customerGroupID\": \"6406\",\n \"customerID\": \"7298\"\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"PUT\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n )\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"customerGroupID\":\"6406\",\"customerID\":\"7298\"});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/orders/company\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/orders/images": { + "get": { + "operationId": "orders_images_list", + "summary": "Get Orders Images", + "description": "Get all orders' images", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "orderIds", + "in": "query", + "description": "Query order ids", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "", + "type": "array", + "items": { + "type": "object", + "properties": { + "imageUrl": { + "description": "Image url.", + "type": "string" + }, + "orderId": { + "description": "Order id.", + "type": "string" + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": [ + { + "imageUrl": "https://www.google.com/imgres?imgurl=https%3A%2F%2Fimg.freepik.com%2Ffree-vector%2Fbroken-frosted-glass-realistic-icon_1284-12125.jpg%3Fsize%3D338%26ext%3Djpg&imgrefurl=https%3A%2F%2Fwww.freepik.com%2Ffree-photos-vectors%2Fpng&tbnid=tiRj4_jn2S_1DM&vet=12ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ..i&docid=kU78UyWVW14S1M&w=338&h=338&q=png&ved=2ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ", + "orderId": "1" + } + ], + "message": "Success" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/images' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/images\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/images\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/orders/{orderBCId}/companyIdBCId": { + "get": { + "operationId": "orders_companyIdBCId_list", + "summary": "Get Company By BC OrderId", + "description": "Get company basic info by bc order id", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "type": "object", + "properties": { + "companyId": { + "description": "Company id", + "type": "string" + }, + "companyName": { + "description": "Company name", + "type": "string" + }, + "customerGroupId": { + "description": "company customer group id", + "type": "string" + }, + "extraInt1": { + "description": "Extra number", + "type": "number" + }, + "extraInt2": { + "description": "Extra number", + "type": "number" + }, + "extraInt3": { + "description": "Extra number", + "type": "number" + }, + "extraInt4": { + "description": "Extra number", + "type": "number" + }, + "extraInt5": { + "description": "Extra number", + "type": "number" + }, + "extraStr1": { + "description": "Extra string", + "type": "string" + }, + "extraStr2": { + "description": "Extra string", + "type": "string" + }, + "extraStr3": { + "description": "Extra string", + "type": "string" + }, + "extraStr4": { + "description": "Extra string", + "type": "string" + }, + "extraStr5": { + "description": "Extra string", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2", + "companyName": "ABC.LLC", + "customerGroupId": "11", + "extraInt1": 0, + "extraInt2": 0, + "extraInt3": 0, + "extraInt4": 0, + "extraInt5": 0, + "extraStr1": "", + "extraStr2": "", + "extraStr3": "", + "extraStr4": "", + "extraStr5": "" + }, + "message": "Success" + } + } + }, + "400": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "data": { + "description": "Response error data", + "type": "object", + "properties": { + "[field]": { + "description": "Message about problem with field 'field'", + "type": "string" + } + } + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 40013, + "data": {}, + "message": "Order does not exist." + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "orderBCId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/orders/{orderId}/companyId": { + "get": { + "operationId": "orders_companyId_list", + "summary": "Get Company Id By Order Id", + "description": "Get company ID by order id", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "type": "object", + "properties": { + "companyId": { + "description": "Company id", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "companyId": "2" + }, + "message": "Success" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/orders/{orderId}/details": { + "get": { + "operationId": "orders_details_list", + "summary": "Get Order Detail", + "description": "Get order's Detail", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "allOf": [ + { + "type": "object", + "properties": { + "base_handling_cost": { + "description": "eg. 0.0000", + "type": "string" + }, + "base_shipping_cost": { + "description": "eg. 0.0000", + "type": "string" + }, + "base_wrapping_cost": { + "description": "eg. 0.0000", + "type": "string" + }, + "billingAddress": { + "type": "object", + "properties": { + "city": { + "type": "string" + }, + "company": { + "description": "Company name", + "type": "string" + }, + "country": { + "description": "Human readable country name", + "type": "string" + }, + "countryIso2": { + "description": "Country ISO info.", + "type": "string" + }, + "email": { + "description": "Address email.", + "type": "string" + }, + "firstName": { + "description": "Address first name", + "type": "string" + }, + "formFields": { + "description": "Address form fields.", + "type": "string" + }, + "lastName": { + "description": "Address last name", + "type": "string" + }, + "phone": { + "description": "Address phone number", + "type": "string" + }, + "state": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + }, + "streetOne": { + "description": "Typically the street address", + "type": "string" + }, + "streetTwo": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "zip": { + "type": "string" + } + } + }, + "cart_id": { + "description": "eg. 5e70bf45-9271-4737-8a80-94f7c99c2e2b", + "type": "string" + }, + "coupon_discount": { + "description": "eg. 0.00000", + "type": "string" + }, + "credit_card_type": { + "description": "eg. null", + "type": "string" + }, + "currency_code": { + "description": "eg. USD", + "type": "string" + }, + "currency_exchange_rate": { + "description": "eg. 1.0000000", + "type": "string" + }, + "currency_id": { + "description": "eg. 1", + "type": "number" + }, + "customer_id": { + "description": "eg. 168", + "type": "number" + }, + "customer_message": { + "description": "eg. 123", + "type": "string" + }, + "date_created": { + "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", + "type": "string" + }, + "date_modified": { + "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", + "type": "string" + }, + "date_shipped": { + "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", + "type": "string" + }, + "default_currency_code": { + "description": "eg. USD", + "type": "string" + }, + "default_currency_id": { + "description": "eg. 1", + "type": "number" + }, + "discount_amount": { + "description": "eg. 0.00000", + "type": "string" + }, + "ebay_order_id": { + "description": "eg. 0", + "type": "string" + }, + "external_source": { + "description": "eg. ", + "type": "string" + }, + "geoip_country": { + "description": "eg. China", + "type": "string" + }, + "geoip_country_iso2": { + "description": "eg. CN", + "type": "string" + }, + "gift_certificate_amount": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_ex_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_inc_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_tax_class_id": { + "description": "eg. 2", + "type": "number" + }, + "id": { + "description": "Order id", + "type": "string" + }, + "ip_address": { + "description": "eg. 118.112.75.229", + "type": "string" + }, + "is_deleted": { + "description": "eg. False", + "type": "boolean" + }, + "is_email_opt_in": { + "description": "eg. false", + "type": "boolean" + }, + "items_shipped": { + "description": "eg. 2", + "type": "number" + }, + "items_total": { + "description": "eg. 2", + "type": "number" + }, + "order_is_digital": { + "type": "boolean" + }, + "order_source": { + "description": "eg. www", + "type": "string" + }, + "payment_method": { + "description": "eg. PO", + "type": "string" + }, + "payment_provider_id": { + "description": "payment provider id", + "type": "string" + }, + "payment_status": { + "description": "eg. AwaitingPayment", + "type": "string" + }, + "products": { + "type": "array", + "items": { + "type": "object", + "properties": { + "applied_discounts": { + "description": "eg. []", + "type": "string" + }, + "base_cost_price": { + "description": "eg. 1.0000", + "type": "string" + }, + "base_price": { + "description": "eg. 22.5000", + "type": "string" + }, + "base_total": { + "description": "eg. 140.0000", + "type": "string" + }, + "base_wrapping_cost": { + "description": "eg. 1.0000", + "type": "string" + }, + "bin_picking_number": { + "description": "eg. 1", + "type": "string" + }, + "configurable_fields": { + "description": "eg. []", + "type": "string" + }, + "cost_price_ex_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "cost_price_inc_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "cost_price_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "coupons": { + "type": "object", + "properties": { + "resource": { + "description": "eg. /orders/123/coupons", + "type": "string" + }, + "url": { + "description": "coupon url", + "type": "string" + } + } + }, + "custom_status": { + "description": "eg. Awaiting Payment", + "type": "string" + }, + "depth": { + "description": "eg. 1.0000", + "type": "string" + }, + "ebay_item_id": { + "description": "eg. 1", + "type": "string" + }, + "ebay_transaction_id": { + "description": "eg. 1", + "type": "string" + }, + "event_date": { + "description": "eg. 1.0000", + "type": "string" + }, + "event_name": { + "description": "eg. 1.0000", + "type": "string" + }, + "external_id": { + "description": "eg. null", + "type": "string" + }, + "external_merchant_id": { + "description": "eg. null", + "type": "string" + }, + "fixed_shipping_cost": { + "description": "eg. 1.0000", + "type": "string" + }, + "fulfillment_source": { + "description": "eg. []", + "type": "string" + }, + "height": { + "description": "eg. 1.0000", + "type": "string" + }, + "id": { + "description": "eg 1.", + "type": "string" + }, + "is_bundled_product": { + "description": "eg. false", + "type": "boolean" + }, + "is_refunded": { + "description": "eg. false", + "type": "boolean" + }, + "name": { + "type": "string" + }, + "option_set_id": { + "description": "eg. 1", + "type": "string" + }, + "order_address_id": { + "description": "eg. 24", + "type": "string" + }, + "order_id": { + "description": "eg 3.", + "type": "string" + }, + "parent_order_product_id": { + "description": "eg. 1", + "type": "string" + }, + "poNumber": { + "type": "object", + "properties": { + "resource": { + "description": "eg. orders/123/shippingaddresses/24/shippingquotes", + "type": "string" + }, + "url": { + "description": "shipping quote url", + "type": "string" + } + } + }, + "priceExTax": { + "type": "string" + }, + "priceIncTax": { + "type": "string" + }, + "price_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "productId": { + "description": "Product id.", + "type": "string" + }, + "productOptions": { + "type": "string" + }, + "product_options": { + "description": "eg. []", + "type": "string" + }, + "quantity": { + "type": "string" + }, + "quantity_refunded": { + "description": "eg. 1.0000", + "type": "string" + }, + "quantity_shipped": { + "description": "eg. 1", + "type": "number" + }, + "refund_amount": { + "description": "eg. 1.0000", + "type": "string" + }, + "return_id": { + "description": "eg. 1.0000", + "type": "number" + }, + "shipments": { + "description": "eg. false", + "type": "boolean" + }, + "shipping_address": { + "type": "object", + "properties": { + "resource": { + "description": "eg. /orders/123/shippingaddresses", + "type": "string" + }, + "url": { + "description": "shipping address url", + "type": "string" + } + } + }, + "sku": { + "type": "string" + }, + "store_default_currency_code": { + "description": "eg. USD", + "type": "string" + }, + "store_default_to_transactional_exchange_rate": { + "description": "eg. 1.00000000", + "type": "string" + }, + "tax_provider_id": { + "description": "eg. BasicTaxProvider", + "type": "string" + }, + "total_ex_tax": { + "description": "eg. 140.0000", + "type": "string" + }, + "total_inc_tax": { + "description": "eg. 140.0000", + "type": "string" + }, + "total_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "type": { + "description": "eg. physical", + "type": "string" + }, + "upc": { + "type": "string" + }, + "variantId": { + "type": "string" + }, + "variant_id": { + "description": "eg. 74", + "type": "string" + }, + "weight": { + "description": "eg. 1.0000", + "type": "string" + }, + "width": { + "description": "eg. 1.0000", + "type": "string" + }, + "wrapping_cost_ex_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "wrapping_cost_inc_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "wrapping_cost_tax": { + "description": "eg. 1.0000", + "type": "string" + }, + "wrapping_message": { + "description": "eg. 1.0000", + "type": "string" + }, + "wrapping_name": { + "description": "eg. 1.0000", + "type": "string" + } + } + } + }, + "refunded_amount": { + "description": "eg. 0.0000", + "type": "string" + }, + "shippingAddress": { + "type": "object", + "properties": { + "base_cost": { + "description": "eg. 0.0000", + "type": "string" + }, + "base_handling_cost": { + "description": "eg. 0.0000", + "type": "string" + }, + "city": { + "type": "string" + }, + "company": { + "description": "Company name", + "type": "string" + }, + "cost_ex_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "cost_inc_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "cost_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "cost_tax_class_id": { + "description": "eg. 20", + "type": "string" + }, + "country": { + "description": "Human readable country name", + "type": "string" + }, + "countryIso2": { + "description": "Country ISO info.", + "type": "string" + }, + "email": { + "description": "Address email.", + "type": "string" + }, + "firstName": { + "description": "Address first name", + "type": "string" + }, + "formFields": { + "description": "Address form fields.", + "type": "string" + }, + "form_fields": { + "description": "eg. []", + "type": "string" + }, + "handling_cost_ex_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_inc_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "handling_cost_tax_class_id": { + "description": "eg. 1", + "type": "number" + }, + "items_shipped": { + "description": "eg. 6", + "type": "string" + }, + "items_total": { + "description": "eg. 6", + "type": "string" + }, + "lastName": { + "description": "Address last name", + "type": "string" + }, + "phone": { + "description": "Address phone number", + "type": "string" + }, + "shipping_method": { + "description": "eg. Free Shipping", + "type": "string" + }, + "shipping_quoteseg": { + "type": "object" + }, + "shipping_zone_id": { + "description": "eg. 1", + "type": "number" + }, + "shipping_zone_name": { + "description": "eg. United States1", + "type": "string" + }, + "state": { + "description": "Human readable state (or other subdivision) name", + "type": "string" + }, + "streetOne": { + "description": "Typically the street address", + "type": "string" + }, + "streetTwo": { + "description": "More detailed information about where to deliver mail, such as a suite or office number", + "type": "string" + }, + "zip": { + "type": "string" + } + } + }, + "shipping_address_count": { + "description": "eg. 1", + "type": "number" + }, + "shipping_cost_ex_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "shipping_cost_inc_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "shipping_cost_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "shipping_cost_tax_class_id": { + "description": "eg. 2", + "type": "number" + }, + "staff_notes": { + "type": "string" + }, + "status": { + "description": "eg. Awaiting Payment", + "type": "string" + }, + "status_id": { + "description": "eg. 8", + "type": "number" + }, + "store_credit_amount": { + "description": "eg. 0.0000", + "type": "string" + }, + "subtotal_ex_tax": { + "description": "eg. 135.0000", + "type": "string" + }, + "subtotal_inc_tax": { + "description": "eg. 135.0000", + "type": "string" + }, + "subtotal_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "total_ex_tax": { + "description": "eg. 135.0000", + "type": "string" + }, + "total_inc_tax": { + "description": "eg. 135.0000", + "type": "string" + }, + "total_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "wrapping_cost_ex_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "wrapping_cost_inc_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "wrapping_cost_tax": { + "description": "eg. 0.0000", + "type": "string" + }, + "wrapping_cost_tax_class_id": { + "description": "eg. 2", + "type": "number" + }, + "channelId": { + "type": "integer", + "description": "BigCommerce channel id" + }, + "channelName": { + "type": "string", + "description": "Channel name" + } + } + }, + { + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + } + ] + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "base_handling_cost": "0.0000", + "base_shipping_cost": "0.0000", + "base_wrapping_cost": "0.0000", + "billing_address": { + "city": "Irvine", + "company": "qqqq", + "country": "United States", + "country_iso2": "US", + "email": "15002803905@163.com", + "first_name": "sdsdsd", + "form_fields": [], + "last_name": "errte", + "phone": "9497486023", + "state": "California", + "street_1": "15440 Laguna Canyon Road, Ste 213", + "street_2": "ssadsdas", + "zip": "92618" + }, + "cart_id": "f6a167af-fdc2-4409-8282-0358c36b46c5", + "channel_id": "1", + "coupon_discount": "0.0000", + "coupons": { + "resource": "/orders/126/coupons", + "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/coupons" + }, + "credit_card_type": "", + "currency_code": "USD", + "currency_exchange_rate": "1.0000000000", + "currency_id": 1, + "custom_status": "Awaiting Payment", + "customer_id": 168, + "customer_message": "123456\n123456798", + "date_created": "Tue, 29 Oct 2019 12:33:25 +0000", + "date_modified": "Tue, 29 Oct 2019 12:33:29 +0000", + "date_shipped": "", + "default_currency_code": "USD", + "default_currency_id": 1, + "discount_amount": "0.0000", + "ebay_order_id": "0", + "external_id": null, + "external_merchant_id": null, + "external_source": "", + "geoip_country": "China", + "geoip_country_iso2": "CN", + "gift_certificate_amount": "0.0000", + "handling_cost_ex_tax": "0.0000", + "handling_cost_inc_tax": "0.0000", + "handling_cost_tax": "0.0000", + "handling_cost_tax_class_id": 2, + "id": "126", + "ip_address": "171.213.12.107", + "is_deleted": false, + "is_email_opt_in": false, + "items_shipped": 0, + "items_total": 20, + "order_is_digital": false, + "order_source": "www", + "payment_method": "PO", + "payment_provider_id": "", + "payment_status": "", + "poNumber": "123456798", + "products": [ + { + "applied_discounts": "", + "base_cost_price": "0.0000", + "base_price": "5.0019", + "base_total": "100.0000", + "base_wrapping_cost": "0.0000", + "bin_picking_number": "", + "configurable_fields": "", + "cost_price_ex_tax": "0.0000", + "cost_price_inc_tax": "0.0000", + "cost_price_tax": "0.0000", + "depth": "0.0000", + "ebay_item_id": "", + "ebay_transaction_id": "", + "event_date": "", + "event_name": "", + "external_id": "", + "fixed_shipping_cost": "0.0000", + "fulfillment_source": "", + "height": "0.0000", + "id": "39", + "is_bundled_product": false, + "is_refunded": false, + "name": "[Sample] Tiered Wire Basket", + "option_set_id": "", + "order_address_id": "27", + "order_id": "126", + "parent_order_product_id": "", + "price_ex_tax": "5.0000", + "price_inc_tax": "5.0000", + "price_tax": "0.0000", + "product_id": 97, + "product_options": "", + "quantity": "20", + "quantity_refunded": "0", + "quantity_shipped": 0, + "refund_amount": "0.0000", + "return_id": 0, + "sku": "TWB", + "total_ex_tax": "100.0000", + "total_inc_tax": "100.0000", + "total_tax": "0.0000", + "type": "physical", + "upc": "", + "variant_id": "69", + "weight": "1.0000", + "width": "0.0000", + "wrapping_cost_ex_tax": "0.0000", + "wrapping_cost_inc_tax": "0.0000", + "wrapping_cost_tax": "0.0000", + "wrapping_message": "", + "wrapping_name": "" + } + ], + "refunded_amount": "0.0000", + "shipments": false, + "shippingAddress": { + "base_cost": "0.0000", + "base_handling_cost": "0.0000", + "city": "Irvine", + "company": "qqqq", + "cost_ex_tax": "0.0000", + "cost_inc_tax": "0.0000", + "cost_tax": "0.0000", + "cost_tax_class_id": "2", + "country": "United States", + "country_iso2": "US", + "email": "15002803905@163.com", + "first_name": "sdsdsd", + "form_fields": "", + "handling_cost_ex_tax": "0.0000", + "handling_cost_inc_tax": "0.0000", + "handling_cost_tax": "0.0000", + "handling_cost_tax_class_id": 2, + "id": 27, + "items_shipped": "0", + "items_total": "20", + "last_name": "errte", + "order_id": 126, + "phone": "9497486023", + "shipping_method": "Free Shipping", + "shipping_quotes": { + "resource": "/orders/126/shippingaddresses/27/shippingquotes", + "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses/27/shippingquotes" + }, + "shipping_zone_id": 1, + "shipping_zone_name": "United States", + "state": "California", + "street_1": "15440 Laguna Canyon Road, Ste 213", + "street_2": "ssadsdas", + "zip": "92618" + }, + "shipping_address_count": 1, + "shipping_addresses": { + "resource": "/orders/126/shippingaddresses", + "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses" + }, + "shipping_cost_ex_tax": "0.0000", + "shipping_cost_inc_tax": "0.0000", + "shipping_cost_tax": "0.0000", + "shipping_cost_tax_class_id": 2, + "staff_notes": "", + "status": "Awaiting Payment", + "status_id": 7, + "store_credit_amount": "0.0000", + "store_default_currency_code": "USD", + "store_default_to_transactional_exchange_rate": "1.0000000000", + "subtotal_ex_tax": "100.0000", + "subtotal_inc_tax": "100.0000", + "subtotal_tax": "0.0000", + "tax_provider_id": "BasicTaxProvider", + "total_ex_tax": "100.0000", + "total_inc_tax": "100.0000", + "total_tax": "0.0000", + "wrapping_cost_ex_tax": "0.0000", + "wrapping_cost_inc_tax": "0.0000", + "wrapping_cost_tax": "0.0000", + "wrapping_cost_tax_class_id": 3, + "extraStr1": "customize additional information", + "extraStr2": "customize additional information", + "extraStr3": "customize additional information", + "extraStr4": "customize additional information", + "extraStr5": "customize additional information", + "extraText": "customize additional information", + "extraInfo": { + "addressExtraFields": { + "shippingAddressExtraFields": [ + { + "fieldName": "test", + "fieldValue": "test" + } + ], + "billingAddressExtraFields": [ + { + "fieldName": "test", + "fieldValue": "test" + } + ] + } + } + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Order Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/orders/{orderId}/products": { + "get": { + "operationId": "orders_products_list", + "summary": "Get Order Product", + "description": "Get order's products info", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "type": "object", + "properties": { + "optionList": { + "description": "", + "type": "array", + "items": { + "type": "object", + "properties": { + "option_id": { + "description": "Product option ID", + "type": "string" + }, + "option_value": { + "description": "Product option value", + "type": "string" + } + } + } + }, + "productId": { + "description": "Product id", + "type": "string" + }, + "quantity": { + "description": "Product quantity", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "optionList": [], + "productId": "97", + "quantity": "20", + "variantId": "69" + }, + "message": "Success" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Order Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Order" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ] + }, + "/proxy": { + "post": { + "operationId": "proxy_create", + "summary": "Third party API proxy", + "description": "Get response data of third party APIs through this API.", + "parameters": [ + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "description": "Request body", + "required": [ + "method", + "url", + "proxyType" + ], + "type": "object", + "properties": { + "data": { + "description": "Request data of your third party request", + "type": "string" + }, + "method": { + "description": "HTTP request method, get/post/put/delete", + "type": "string" + }, + "params": { + "description": "Request parameters of your third party request", + "type": "string" + }, + "proxyType": { + "description": "Third party type or name, such as BigCommerce", + "type": "string" + }, + "url": { + "description": "Url of request", + "type": "string" + } + } + } + }, + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "message": "Success" + } + } + }, + "500": { + "description": "Response Bad Request", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status error code", + "type": "number" + }, + "message": { + "description": "Response error message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 500, + "message": "Bigcommerce API error" + } + } + } + }, + "tags": [ + "Proxy" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/proxy' --header 'Content-Type: application/json' --data-raw '{\n \"method\": \"get\",\n \"url\": \"/v2/customers\",\n \"proxyType\": \"Bigcommerce\"\n}'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/proxy\"\n\npayload = \"{\"method\": \"get\", \"url\": \"/v2/customers\",\"proxyType\": \"Bigcommerce\"}\"\nheaders = {\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"method\": \"get\", \"url\": \"/v2/customers\", \"proxyType\": \"Bigcommerce\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/sales-reps/companies": { + "get": { + "operationId": "sales-reps_companies_list", + "summary": "Get Companies & Sales reps", + "description": "Get all companies and their sales reps, default order by company", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + }, + { + "name": "offset", + "in": "query", + "description": "Pagination offset default: 0", + "type": "number" + }, + { + "name": "limit", + "in": "query", + "description": "Pagination limit default: 10", + "type": "number" + }, + { + "name": "groupBy", + "in": "query", + "description": "Group by('2' for company, '1' for sales reps)", + "type": "number" + }, + { + "name": "orderBy", + "in": "query", + "description": "Order by default DESC choice (DESC ASC)", + "type": "number" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "list": { + "description": "This interface has 2 type response data type, if get with groupBy 2 will return company info, if get with groupBy 1 will return sales reps info", + "type": "array", + "items": { + "type": "object", + "properties": { + "catalogId": { + "description": "Catalog Id(groupBy: 2)", + "type": "string" + }, + "city": { + "description": "Company city(groupBy: 2)", + "type": "string" + }, + "companyCount": { + "description": "Sales rep's company count (groupBy: 1)", + "type": "string" + }, + "companyEmail": { + "description": "Company name(groupBy: 2)", + "type": "string" + }, + "companyId": { + "description": "Company Id(groupBy: 2)", + "type": "string" + }, + "companyName": { + "description": "Company name(groupBy: 2)", + "type": "string" + }, + "country": { + "description": "Company country(groupBy: 2)", + "type": "string" + }, + "email": { + "description": "Sales rep's email (groupBy: 1)", + "type": "string" + }, + "firstName": { + "description": "Sales rep's first name(groupBy: 1)", + "type": "string" + }, + "lastName": { + "description": "Sales rep's last name(groupBy: 1)", + "type": "string" + }, + "role": { + "description": "Sales rep's role (groupBy: 1)", + "type": "string" + }, + "salesRepCount": { + "description": "Company's sales reps count(groupBy: 2)", + "type": "string" + }, + "salesRepId": { + "description": "Sales rep's Id (groupBy: 1)", + "type": "string" + }, + "state": { + "description": "Company state(groupBy: 2)", + "type": "string" + }, + "zipCode": { + "description": "Company zip code(groupBy: 2)", + "type": "string" + }, + "channelList": { + "type": "array", + "items": { + "type": "object", + "properties": { + "channelId": { + "type": "integer", + "description": "BigCommerce channel id" + }, + "channelName": { + "type": "string", + "description": "Channel name" + }, + "iconUrl": { + "type": "string", + "description": "Icon url" + } + } + } + } + } + } + }, + "pagination": { + "description": "Response data pagination", + "type": "object", + "properties": { + "limit": { + "description": "Response pagination limit", + "type": "number" + }, + "offset": { + "description": "Response pagination offset", + "type": "number" + }, + "totalCount": { + "description": "Response data items number", + "type": "number" + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "list": [ + { + "addressLine1": "", + "addressLine2": "", + "catalogId": "2", + "city": "", + "companyEmail": "kobe.tian@bunldeb2b.com", + "companyId": "34", + "companyName": "KobeCropTest111", + "country": ",", + "description": "KobeCropTest111", + "salesRepCount": "2", + "state": "", + "zipCode": "" + } + ], + "pagination": { + "limit": 10, + "offset": 0, + "totalCount": 1 + } + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "SalesRep" + ] + }, + "parameters": [] + }, + "/store/payments": { + "get": { + "operationId": "store_payments_list", + "summary": "Get Store's All Payments", + "description": "Get store's all payments", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "list": { + "description": "", + "type": "array", + "items": { + "type": "object", + "properties": { + "paymentCode": { + "description": "Payment method code", + "type": "string" + }, + "paymentTitle": { + "description": "Payment method title", + "type": "string" + } + } + } + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "list": [ + { + "paymentCode": "authorizenet", + "paymentTitle": "Authorize.net" + }, + { + "paymentCode": "braintree", + "paymentTitle": "Braintree" + }, + { + "paymentCode": "cheque", + "paymentTitle": "Check" + }, + { + "paymentCode": "testgateway", + "paymentTitle": "Test Payment Gateway" + } + ] + }, + "message": "SUCCESS" + } + } + } + }, + "tags": [ + "Payment" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/store/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/store/payments\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/store/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [] + }, + "/users/{customerId}/companies": { + "get": { + "operationId": "users_companies_list", + "summary": "Get Company By CustomerId", + "description": "Get company by customer Id, if company not in bigCommerce will delete the company", + "parameters": [ + { + "name": "authToken", + "in": "header", + "description": "Auth token in header.", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "Response Success", + "schema": { + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "addressLine1": { + "description": "Company address line 1", + "type": "string" + }, + "addressLine2": { + "description": "Company address line 2", + "type": "string" + }, + "catalogId": { + "description": "Catalog Id", + "type": "string" + }, + "city": { + "description": "Company city", + "type": "string" + }, + "companyId": { + "description": "Company Id", + "type": "string" + }, + "companyName": { + "description": "Company name", + "type": "string" + }, + "companyStatus": { + "description": "Company status", + "type": "string" + }, + "country": { + "description": "Company country", + "type": "string" + }, + "description": { + "description": "Company description", + "type": "string" + }, + "state": { + "description": "Company state", + "type": "string" + }, + "zipCode": { + "description": "Company zip code", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 200, + "data": { + "addressLine1": "", + "addressLine2": "", + "catalogId": "1", + "city": "Paris", + "companyId": "35", + "companyName": "CropTest1", + "companyStatus": "1", + "country": "French", + "description": "CropTest", + "state": "BC", + "zipCode": "1032332" + }, + "message": "SUCCESS" + } + } + }, + "404": { + "description": "Not Found Error", + "schema": { + "description": "Response body", + "type": "object", + "properties": { + "code": { + "description": "Response status code", + "type": "number" + }, + "data": { + "description": "Response data", + "type": "object", + "properties": { + "errMsg": { + "description": "Error message info", + "type": "string" + } + } + }, + "message": { + "description": "Response message", + "type": "string" + } + } + }, + "examples": { + "application/json": { + "code": 404, + "data": { + "errMsg": "Companies Does not Exist" + }, + "message": "Not Found Error" + } + } + } + }, + "tags": [ + "Company" + ], + "x-code-samples": [ + { + "lang": "Shell", + "source": "\ncurl --location --request GET 'https://https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' \n" + }, + { + "lang": "Python", + "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" + }, + { + "lang": "JavaScript", + "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" + } + ] + }, + "parameters": [ + { + "name": "customerId", + "in": "path", + "required": true, + "type": "string", + "description": "BigCommerce's customer id" + } + ] + }, + "/users/{userId}/company": { + "parameters": [ + { + "type": "string", + "name": "userId", + "in": "path", + "required": true + } + ] + } + }, + "definitions": {} +} \ No newline at end of file diff --git a/docs/b2b-edition/specs/api-v2/openAPI.yaml b/docs/b2b-edition/specs/api-v2/openAPI.yaml new file mode 100644 index 000000000..291a769da --- /dev/null +++ b/docs/b2b-edition/specs/api-v2/openAPI.yaml @@ -0,0 +1,7222 @@ +openapi: 3.0.1 +info: + title: Open API + description: BigCommerce B2B Edition Open API Docs + version: v3 +servers: + - url: https://api-b2b.bigcommerce.com/api/v2/io +security: + - Basic: [] +tags: + - name: Address + - name: Company + - name: Order + - name: Payment + - name: Proxy + - name: SalesRep + - name: User +paths: + /addresses/country_state: + get: + tags: + - Address + summary: Convert Country State + description: Convert country/state name to their code or code to name + operationId: addresses_country_state_list + parameters: + - name: authToken + in: header + description: Auth token in header + required: true + schema: + type: string + - name: country + in: query + description: Country code/name + schema: + type: string + - name: state + in: query + description: Country code/name + schema: + type: string + - name: search_type + in: query + description: "Convert type, code means transfer the input country/state name\ + \ to their code, name means transfer the input country/state code to their\ + \ name" + schema: + type: string + enum: + - code + - name + responses: + "200": + description: Response success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + countryCode: + type: string + description: The converted country code from input country + name + countryName: + type: string + description: The converted country name from input country + code + stateCode: + type: string + description: The converted state code from input state name + stateName: + type: string + description: The converted state name from input country code + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + countryName: United States + stateName: New York + message: SUCCESS + "404": + description: Response record not found + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: {} + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United%20States&state=New%20York' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Cookie: csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7' + - lang: Python + source: |2 + + import requests + + url = "localhost:8000/api/v2/io/addresses/country_state?search_type=name&country=US&state=NY" + + payload={} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js', + 'Cookie': 'csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7' + } + + response = requests.request("GET", url, headers=headers, data=payload) + + print(response.text) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js"); + myHeaders.append("Cookie", "csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United States&state=New York", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /companies/convert-from-customer-group: + post: + tags: + - Company + summary: Create Company From CG + description: Create company from bigCommerce customer group. This API only enable + for non-MSF store. + operationId: companies_convert-from-customer-group_create + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + description: Request body + allOf: + - required: + - adminEmail + - adminFirstName + - adminLastName + - companyEmail + - companyName + - customerGroupId + - phoneNumber + type: object + properties: + acceptWelcomeEmail: + type: string + description: (0=will not receive email 1=will receive email) + enum: + - "0" + - "1" + addressLine1: + type: string + description: Address string line 1 + addressLine2: + type: string + description: Address string line 2 + adminEmail: + type: string + description: Company admin user email + adminFirstName: + type: string + description: Company admin user's first name + adminLastName: + type: string + description: Company admin user's last name + adminPhoneNumber: + type: string + description: Company admin user phone number + city: + type: string + companyEmail: + type: string + companyName: + type: string + country: + type: string + customerGroupId: + type: string + description: BC customer group ID + extraFields: + type: array + description: "To use customized extra fields with field names\ + \ you need to first add company extra fields in Settings > Extra\ + \ fields inside B2B edition. eg. If you want to create a new\ + \ company with an extra integer field named licenseNO, you can\ + \ use this structure [{'fieldName': 'LicenseNO', 'fieldValue':\ + \ 10342340323}] in the request body." + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + extraInt1: + type: number + description: "The default extra integer field, you can also use\ + \ this field to create a company with it.(include extraInt1\ + \ ~ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there\ + \ is an important point you need to know. After the B3 team\ + \ helped you configure the custom extra fields, if you still\ + \ need to use these default fields, you need to know the correspondence\ + \ between the custom extra fields and the default extra fields.\ + \ Otherwise, when you pass in both custom and default extra\ + \ fields, if the custom extra field is bound to the default\ + \ extra field you pass in, the value of the custom extra field\ + \ will override the default extra field." + extraInt2: + type: number + description: "Company create extra integer value, please refer\ + \ to the description of extraInt1 above." + extraInt3: + type: number + description: "Company create extra integer value, please refer\ + \ to the description of extraInt1 above." + extraInt4: + type: number + description: "Company create extra integer value, please refer\ + \ to the description of extraInt1 above." + extraInt5: + type: number + description: "Company create extra integer value, please refer\ + \ to the description of extraInt1 above." + extraStr1: + type: string + description: "Company create extra string value, please refer\ + \ to the description of extraInt1 above." + extraStr2: + type: string + description: "Company create extra string value, please refer\ + \ to the description of extraInt1 above." + extraStr3: + type: string + description: "Company create extra string value, please refer\ + \ to the description of extraInt1 above." + extraStr4: + type: string + description: "Company create extra string value, please refer\ + \ to the description of extraInt1 above." + extraStr5: + type: string + description: "Company create extra string value, please refer\ + \ to the description of extraInt1 above." + extraText: + type: string + description: "Company create extra text value, please refer to\ + \ the description of extraInt1 above." + phoneNumber: + type: string + state: + type: string + zipCode: + type: string + - $ref: '#/components/schemas/user_extra_field_values' + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Created company Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + message: Enter a valid email address. + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Customer group does not exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "companyName": "test3.23-22", + "phoneNumber": 122331212, + "companyEmail": "test@test.com", + "addressLine1": "xxxx", + "addressLine2": "", + "city": "xxxx", + "state": "xxxx", + "zipCode": "12333", + "country": "China", + "adminFirstName": "test", + "adminLastName": "sdfsd", + "adminEmail": "test1@test.com", + "adminPhoneNumber": "3838288282", + "customerGroupId": 4 + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group" + + payload = { + "companyName": "test3.23-22", + "phoneNumber": 122331212, + "companyEmail": "test@test.com", + "addressLine1": "xxxx", + "addressLine2": "", + "city": "xxxx", + "state": "xxxx", + "zipCode": "12333", + "country": "China", + "adminFirstName": "test", + "adminLastName": "sdfsd", + "adminEmail": "test1@test.com", + "adminPhoneNumber": "3838288282", + "customerGroupId": 4 + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + response = requests.request("POST", url, headers=headers, data = payload) + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"companyName":"test3.23-22","phoneNumber":122331212,"companyEmail":"test@test.com","addressLine1":"xxxx","addressLine2":"","city":"xxxx","state":"xxxx","zipCode":"12333","country":"China","adminFirstName":"test","adminLastName":"sdfsd","adminEmail":"test1@test.com","adminPhoneNumber":"3838288282","customerGroupId":4}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/users/{customerId}/orders: + post: + tags: + - Order + summary: Create Order Without CompanyID + description: "Create an order from bigCommerce, you must known order id" + operationId: companies_users_orders_create + parameters: + - name: customerId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + description: Request body + allOf: + - required: + - orderId + - totalIncTax + type: object + properties: + orderId: + type: string + description: BigCommerce order id + poNumber: + type: string + description: PoNumber + totalIncTax: + type: number + description: Total incTax + - $ref: '#/components/schemas/order-extra' + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Created order id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + orderId: 2 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + data: + bc_order_id: orderId can not be null + message: Bad Request Error + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders'\ + \ --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\ + \ --header 'Content-Type: application/json' \ + \ --data-raw '{\n \"totalIncTax\": \"111\",\n \ + \ \"orderId\": \"111\"\n}' \n" + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders" + + payload = { + "totalIncTax": "111", + "orderId": "111" + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"totalIncTax":"111","orderId":"111"}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/addresses: + get: + tags: + - Address + summary: Get Company Addresses + description: Get all addresses for a company + operationId: companies_addresses_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: minLastModifiedTime + in: query + description: "Company filter condition: timestamp string e.g. 01/01/2000" + schema: + type: number + - name: maxLastModifiedTime + in: query + description: "Company filter condition: timestamp string e.g. 01/01/2000" + schema: + type: number + - name: minLastCreatedTime + in: query + description: "Company filter condition: timestamp string e.g. 01/01/2000" + schema: + type: number + - name: maxLastCreatedTime + in: query + description: "Company filter condition: timestamp string e.g. 01/01/2000" + schema: + type: number + - name: q + in: query + description: Company query string + schema: + type: string + - name: firstName + in: query + description: Address first name filter + schema: + type: number + - name: lastName + in: query + description: Address first name filter + schema: + type: number + - name: address + in: query + description: Address line 1 filter + schema: + type: number + - name: city + in: query + description: Address city filter + schema: + type: number + - name: country + in: query + description: Address country filter + schema: + type: number + - name: state + in: query + description: Address state filter + schema: + type: number + - name: zipCode + in: query + description: Address zip code filter + schema: + type: number + - name: phoneNumber + in: query + description: Address phone number filter + schema: + type: number + - name: isShipping + in: query + description: Address is shipping filter + schema: + type: number + - name: isBilling + in: query + description: Address is billing filter + schema: + type: number + - name: "externalId[]" + in: query + description: Address external id filter + style: form + explode: false + schema: + type: array + - name: offset + in: query + description: "Address pagination offset, default 0" + schema: + type: number + - name: limit + in: query + description: "Address pagination limit, default 4. " + schema: + maximum: 500 + minimum: 4 + type: number + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addresses: + type: object + properties: + '[address_id]': + type: object + properties: + addressId: + type: string + description: Identifier for the address (same as URL + parameter addressId) + addressLine1: + type: string + description: Typically the street address + addressLine2: + type: string + description: "More detailed information about where\ + \ to deliver mail, such as a suite or office number" + city: + type: string + country: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 Alpha 2 Country Code + countryName: + type: string + description: Human readable country name + firstName: + type: string + isBilling: + type: boolean + description: Indicates whether the address is a billing + address + isDefaultBilling: + type: boolean + isDefaultShipping: + type: boolean + isShipping: + type: boolean + description: Indicates whether the address is a shipping + address + lastName: + type: string + phoneNumber: + type: string + state: + type: object + properties: + stateCode: + type: string + description: ISO 3166-2 Alpha 2 Country Subdivision + Code + stateName: + type: string + description: Human readable state (or other subdivision) + name + zipCode: + type: string + description: A valid postal code used by the country + that was specified + externalId: + type: string + description: The map from address ID to address + defaultBillingId: + type: number + description: The identifier of the default shipping address + defaultShippingId: + type: number + description: The identifier of the default shipping address + description: All addresses + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addresses: + "7": + addressId: "7" + addressLine1: 123 Main Street + addressLine2: Blvd + city: Austin + country: + countryCode: US + countryName: United States + firstName: Jane + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + lastName: Doe + phoneNumber: "11111111111" + state: + stateCode: TX + stateName: Texas + zipCode: "78751" + channelId: 1 + channelName: test + defaultBillingId: "7" + defaultShippingId: "7" + message: SUCCESS + x-code-samples: + - lang: Shell + source: "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020'\ + \ --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\ + \ --header 'Content-Type: application/json' \n" + - lang: Python + source: |2+ + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + post: + tags: + - Address + summary: Create A Company Address + description: "Creates a new address for a company. You will specify the address\ + \ fields and the type of address. The address can be billing, shipping, or\ + \ both. You can also request that this address becomes the new default billing\ + \ or shipping address for the company." + operationId: companies_addresses_create + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + required: + - addressLine1 + - city + - country + - firstName + - lastName + - state + - zipCode + type: object + properties: + addressLine1: + type: string + description: Typically the street address + addressLine2: + type: string + description: "More detailed information about where to deliver mail,\ + \ such as a suite or office number" + city: + type: string + country: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 Alpha 2 Country Code + countryName: + type: string + description: Human readable country name + firstName: + type: string + description: Address first name + isBilling: + type: boolean + description: Indicates whether the address is a billing address + isDefaultBilling: + type: boolean + description: Indicates whether the address is the default billing + address + isDefaultShipping: + type: boolean + description: Indicates whether the address is the default shipping + address + isShipping: + type: boolean + description: Indicates whether the address is a shipping address + label: + type: string + description: Address label + lastName: + type: string + description: Address last name + phoneNumber: + type: string + description: Address phone number + state: + type: object + properties: + stateCode: + type: string + description: ISO 3166-2 Alpha 2 Country Subdivision Code + stateName: + type: string + description: Human readable state (or other subdivision) name + zipCode: + type: string + externalId: + type: string + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + example: 200.0 + data: + type: object + properties: + addressId: + type: integer + description: Created address Id + example: 12 + description: Response data + meta: + type: object + properties: + message: + type: string + description: Response message + example: Success + example-1: + example: + code: 200 + data: + addressId: 12 + meta: + message: Success + "422": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + example: 422.0 + data: + type: object + properties: + errMsg: + type: array + description: Message about problem with field 'field' + items: + type: object + properties: + '[field]': + type: string + description: field error description. + example: xxx field is too long. + description: Response error data + meta: + type: object + properties: + message: + type: string + description: Response error message + example: Parameter Error + description: Response body + example-1: + example: + code: 422 + data: + errMsg: + - '[field]': xxx field is too long. + meta: + message: Parameter Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses' --header 'Content-Type: application/json' --data-raw '{ + "label": "12dxqwdsa", + "firstName": "Bundle", + "lastName": "Test", + "addressLine1": "Street.1", + "addressLine2": "", + "city": "New York", + "zipCode": "110202", + "phoneNumber": "", + "country": { + "countryName": "United States", + "countryCode": "US" + }, + "state": { + "stateName": "New York", + "stateCode": "NY" + }, + "isShipping": "1", + "isBilling": "1", + "isDefaultShipping": true, + "isDefaultBilling": true + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses" + + payload = "{ + "label": "12dxqwdsa", + "firstName": "Bundle", + "lastName": "Test", + "addressLine1": "Street.1", + "addressLine2": "", + "city": "New York", + "zipCode": "110202", + "phoneNumber": "", + "country": { + "countryName": "United States", + "countryCode": "US" + }, + "state": { + "stateName": "New York", + "stateCode": "NY" + }, + "isShipping": "1", + "isBilling": "1", + "isDefaultShipping": true, + "isDefaultBilling": true + }" + headers = { + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"label":"12dxqwdsa","firstName":"Bundle","lastName":"Test","addressLine1":"Street.1","addressLine2":"","city":"New York","zipCode":"110202","phoneNumber":"","country":{"countryName":"United States","countryCode":"US"},"state":{"stateName":"New York","stateCode":"NY"},"isShipping":"1","isBilling":"1","isDefaultShipping":"1","isDefaultBilling":"0"}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/addresses/{addressId}: + get: + tags: + - Address + summary: Get A Company Address + description: Get an address for a company + operationId: companies_addresses_read + parameters: + - name: addressId + in: path + required: true + schema: + type: string + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addresses: + type: object + properties: + addressId: + type: string + description: Identifier for the address (same as URL parameter + addressId) + addressLine1: + type: string + description: Typically the street address + addressLine2: + type: string + description: "More detailed information about where to\ + \ deliver mail, such as a suite or office number" + city: + type: string + country: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 Alpha 2 Country Code + countryName: + type: string + description: Human readable country name + firstName: + type: string + isBilling: + type: boolean + description: Indicates whether the address is a billing + address + isDefaultBilling: + type: boolean + isDefaultShipping: + type: boolean + isShipping: + type: boolean + description: Indicates whether the address is a shipping + address + lastName: + type: string + phoneNumber: + type: string + state: + type: object + properties: + stateCode: + type: string + description: ISO 3166-2 Alpha 2 Country Subdivision + Code + stateName: + type: string + description: Human readable state (or other subdivision) + name + zipCode: + type: string + description: A valid postal code used by the country that + was specified + externalId: + type: string + description: All addresses + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addressId: "6" + addressLine1: 123 Main Street + addressLine2: Blvd + city: Austin + country: + countryCode: US + countryName: United States + firstName: Jane + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + lastName: Doe + phoneNumber: "11111111111" + state: + stateCode: TX + stateName: Texas + zipCode: "78751" + channelId: 1 + channelName: test + message: SUCCESS + "404": + description: Response record not found + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: {} + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + put: + tags: + - Address + summary: Update A Company Address + description: "Updates an address for a company. You can change whether the address\ + \ is for billing, shipping, or both. You can also update the address to be\ + \ the default billing or shipping address for the company." + operationId: companies_addresses_update + parameters: + - name: addressId + in: path + required: true + schema: + type: string + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + addressLine1: + type: string + description: Typically the street address + addressLine2: + type: string + description: "More detailed information about where to deliver mail,\ + \ such as a suite or office number" + city: + type: string + country: + type: object + properties: + countryCode: + type: string + description: ISO 3166-1 Alpha 2 Country Code + countryName: + type: string + description: Human readable country name + firstName: + type: string + description: Address first name + isBilling: + type: boolean + description: Indicates whether the address is a billing address + isDefaultBilling: + type: boolean + description: Indicates whether the address is the default billing + address + isDefaultShipping: + type: boolean + description: Indicates whether the address is the default shipping + address + isShipping: + type: boolean + description: Indicates whether the address is a shipping address + label: + type: string + description: Address label + lastName: + type: string + description: Address last name + phoneNumber: + type: string + description: Address phone number + state: + type: object + properties: + stateCode: + type: string + description: ISO 3166-2 Alpha 2 Country Subdivision Code + stateName: + type: string + description: Human readable state (or other subdivision) name + zipCode: + type: string + externalId: + type: string + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addressId: + type: string + description: Updated address Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addressId: 4 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + data: + address_line_1: Address not allow None + last_name: Last name not allow None + message: Bad Requests Error + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Address Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "label": "12dxqwdsa", + "firstName": "Bundle", + "lastName": "Test", + "addressLine1": "Street.1", + "addressLine2": "", + "city": "New York", + "zipCode": "110202", + "phoneNumber": "", + "country": { + "countryName": "United States", + "countryCode": "US" + }, + "state": { + "stateName": "New York", + "stateCode": "NY" + }, + "isShipping": "1", + "isBilling": "1", + "isDefaultShipping": "1", + "isDefaultBilling": "0" + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4" + payload = { + "label": "12dxqwdsa", + "firstName": "Bundle", + "lastName": "Test", + "addressLine1": "Street.1", + "addressLine2": "", + "city": "New York", + "zipCode": "110202", + "phoneNumber": "", + "country": { + "countryName": "United States", + "countryCode": "US" + }, + "state": { + "stateName": "New York", + "stateCode": "NY" + }, + "isShipping": "1", + "isBilling": "1", + "isDefaultShipping": "1", + "isDefaultBilling": "0" + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"label":"12dxqwdsa","firstName":"Bundle","lastName":"Test","addressLine1":"Street.1","addressLine2":"","city":"New York","zipCode":"110202","phoneNumber":"","country":{"countryName":"United States","countryCode":"US"},"state":{"stateName":"New York","stateCode":"NY"},"isShipping":"1","isBilling":"1","isDefaultShipping":"1","isDefaultBilling":"0"}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + delete: + tags: + - Address + summary: Delete A Company Address + description: Deletes an address from a company. + operationId: companies_addresses_delete + parameters: + - name: addressId + in: path + required: true + schema: + type: string + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header + required: true + schema: + type: string + responses: + "200": + description: Deleted successful + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addressId: + type: string + description: Deleted address Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addressId: 2 + message: Success + "404": + description: Company not found + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Address Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("DELETE", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'DELETE', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /companies/{companyId}/basic-info: + get: + tags: + - Company + summary: Get Company Basic Information + description: Get company's basic information + operationId: companies_basic-info_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addressLine1: + type: string + description: Company address line 1 + addressLine2: + type: string + description: Company address line 2 + catalogId: + type: string + description: Catalog Id + catalogName: + type: string + description: Catalog Id + city: + type: string + description: Company city + companyEmail: + type: string + description: Company email + companyId: + type: string + description: Company Id + companyName: + type: string + description: Company name + companyStatus: + type: string + description: Company status + country: + type: string + description: Company country + description: + type: string + description: Company description + extraFields: + type: array + description: Company extra fields + items: + type: object + properties: + dataType: + type: string + description: "Field data type, 0=text, 1=number, 2=textarea." + fieldName: + type: string + description: Field name + fieldValue: + type: string + description: Field value + isRequired: + type: string + description: "Is field required or not, 0=not required,\ + \ 1=required" + labelName: + type: string + description: Field label name + phoneNumber: + type: string + description: Company phone number + state: + type: string + description: Company state + updatedAt: + type: string + description: Company updated timestamp + uuid: + type: string + description: UUID + zipCode: + type: string + description: Company zip code + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addressLine1: "" + addressLine2: "" + catalogId: "1" + catalogName: testCatalogName + city: Paris + companyEmail: test@bundleb2b.com + companyId: "35" + companyName: CropTest1 + companyStatus: "1" + country: French + description: CropTest + extraFields: + - dataType: "2" + fieldName: extraStr1 + fieldValue: extra_text + isRequired: "0" + labelName: Enter your license + phoneNumber: "10030212001" + state: BC + updatedAt: "1594192159" + uuid: "111" + zipCode: "1032332" + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + put: + tags: + - Company + summary: Update Company Basic Information + description: "Update a company's basic info, you can update on or more options" + operationId: companies_basic-info_update + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + addressLine1: + type: string + description: Address string line 1 + addressLine2: + type: string + description: Address string line 2 + catalogId: + type: string + description: BigCommerce price list Id that company related(If put + its 0 will clear the catalog). + city: + type: string + companyEmail: + type: string + companyName: + type: string + companyStatus: + type: string + description: "Company status: \n\n 0=PENDING 1=APPROVED 2=REJECTED\ + \ 3=INACTIVE 4=DELETED" + country: + type: string + description: "\nCountry full name or ISO2 country code. For Example:\ + \ \n\nA Country full name: Afghanistan \n\nISO2 Country code:\ + \ AF\n" + description: + type: string + extraFields: + type: array + description: "To use customized extra fields with field names you\ + \ need to first add company extra fields in Settings > Extra fields\ + \ inside B2B edition. eg. If you want to create a new company\ + \ with an extra integer field named licenseNO, you can use this\ + \ structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}]\ + \ in the request body." + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + extraInt1: + type: number + description: "The default extra integer field, you can also use\ + \ this field to create a company with it.(include extraInt1 ~\ + \ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there\ + \ is an important point you need to know. After the B3 team helped\ + \ you configure the custom extra fields, if you still need to\ + \ use these default fields, you need to know the correspondence\ + \ between the custom extra fields and the default extra fields.\ + \ Otherwise, when you pass in both custom and default extra fields,\ + \ if the custom extra field is bound to the default extra field\ + \ you pass in, the value of the custom extra field will override\ + \ the default extra field." + extraInt2: + type: number + description: "Company update extra integer value, please refer to\ + \ the description of extraInt1 above." + extraInt3: + type: number + description: "Company update extra integer value, please refer to\ + \ the description of extraInt1 above." + extraInt4: + type: number + description: "Company update extra integer value, please refer to\ + \ the description of extraInt1 above." + extraInt5: + type: number + description: "Company update extra integer value, please refer to\ + \ the description of extraInt1 above." + extraStr1: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + extraStr2: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + extraStr3: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + extraStr4: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + extraStr5: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + extraText: + type: string + description: "Company update extra string value, please refer to\ + \ the description of extraInt1 above." + phoneNumber: + type: string + state: + type: string + zipCode: + type: string + priceListAssign: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + priceListId: + type: integer + description: BC price list ID + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Updated company Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + message: Success + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "companyName": "test3.23-22", + "phoneNumber": 122331212, + "companyEmail": "test@test.com", + "addressLine1": "xxxx", + "addressLine2": "", + + }' + - lang: Python + source: "\n import requests\n\n \ + \ url = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23\"\n\ + \n payload = \"{\n\t\"companyName\": \"test3.23-22\"\ + ,\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\"\ + ,\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\"\n \ + \ headers = {\n 'authToken':\ + \ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n\ + \ 'Content-Type': 'application/json'\n \ + \ }\n\n response = requests.request(\"\ + PUT\", url, headers=headers, data = payload)\n\n \ + \ print(response.text.encode('utf8'))\n" + - lang: JavaScript + source: "\n var myHeaders = new Headers();\n \ + \ myHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\"\ + );\n myHeaders.append(\"Content-Type\", \"application/json\"\ + );\n\n var raw = \"{\n\t\"companyName\": \"test3.23-22\"\ + ,\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\"\ + ,\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\";\n\n\ + \ var requestOptions = {\n \ + \ method: 'PUT',\n headers: myHeaders,\n \ + \ body: raw,\n redirect:\ + \ 'follow'\n };\n\n fetch(\"\ + https://api-b2b.bigcommerce.com/api/v2/io/companies/23\", requestOptions)\n\ + \ .then(response => response.text())\n \ + \ .then(result => console.log(result))\n \ + \ .catch(error => console.log('error', error));\n" + x-codegen-request-body-name: data + /companies/{companyId}/force-del: + delete: + tags: + - Company + summary: Delete Company With Related + description: Force Delete A Company and its Related Information. + operationId: companies_force-del_delete + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header + required: true + schema: + type: string + responses: + "200": + description: Deleted successful + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Deleted company Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + message: Success + "404": + description: Company not found + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /companies/{companyId}/orderBCIds: + get: + tags: + - Company + summary: Get BC Order Id List By Company Id + description: Get bC order ID list by company id + operationId: companies_orderBCIds_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: offset + in: query + description: "Pagination offset default: 0" + schema: + type: number + - name: limit + in: query + description: "Pagination limit default: 10" + schema: + type: number + - name: beginDateAt + in: query + description: "End date filter, in format '12/31/2019'" + schema: + type: string + - name: endDateAt + in: query + description: "End date filter, in format '12/31/2019'" + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + list: + type: array + description: "" + items: + type: object + properties: + orderId: + type: string + description: Order id + pagination: + type: object + properties: + limit: + type: number + description: Response pagination limit + offset: + type: number + description: Response pagination offset + totalCount: + type: number + description: Response data items number + description: Response data pagination + message: + type: string + description: Response message + example: + code: 200 + data: + list: + - orderId: "1" + pagination: + limit: 10 + offset: 0 + totalCount: 3 + message: Success + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /companies/{companyId}/orders: + get: + tags: + - Order + summary: Get Company Orders + description: "Get company all orders, with pagination data" + operationId: companies_orders_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: offset + in: query + description: "Pagination offset default: 0" + schema: + type: number + - name: limit + in: query + description: "Pagination limit default: 10" + schema: + type: number + - name: orderBy + in: query + description: "in ['bcOrderId', 'totalIncTax', 'createdAt']" + schema: + type: string + - name: beginDateAt + in: query + description: "End date filter, in format '12/31/2019'" + schema: + type: string + - name: endDateAt + in: query + description: "End date filter, in format '12/31/2019'" + schema: + type: string + - name: includeExtra + in: query + description: "Switch show extra fields, allow: 0, 1" + schema: + type: string + - name: extraStr1 + in: query + description: Extra field filter + schema: + type: string + - name: extraStr2 + in: query + description: Extra field filter + schema: + type: string + - name: extraStr3 + in: query + description: Extra field filter + schema: + type: string + - name: extraStr4 + in: query + description: Extra field filter + schema: + type: string + - name: extraStr5 + in: query + description: Extra field filter + schema: + type: string + - name: extraInt1 + in: query + description: Extra field filter + schema: + type: number + - name: extraInt2 + in: query + description: Extra field filter + schema: + type: number + - name: extraInt3 + in: query + description: Extra field filter + schema: + type: number + - name: extraInt4 + in: query + description: Extra field filter + schema: + type: number + - name: extraInt5 + in: query + description: Extra field filter + schema: + type: number + - name: channelId + in: query + description: BigComerce channel id + schema: + type: number + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + list: + type: array + items: + type: object + properties: + OrderStatus: + type: string + description: "Order status, eg. Awaiting Payment" + companyName: + type: string + description: User phone number + createdAt: + type: string + description: Order created date. + firstName: + type: string + description: Order's user first name. + isInvoiceOrder: + type: string + description: Is a invoice order + lastName: + type: string + description: Order's user last name + orderId: + type: string + description: Order id + totalIncTax: + type: string + description: Order's total invoice taxes. + updatedAt: + type: string + description: Order updated date. + channelName: + type: string + description: BigCommerce channel name + channelId: + type: string + description: BigCommerce channel id + pagination: + type: object + properties: + limit: + type: number + description: Response pagination limit + offset: + type: number + description: Response pagination offset + totalCount: + type: number + description: Response data items number + description: Response data pagination + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + list: + - companyName: fkkfcctest + createdAt: "1572323610" + firstName: james + isInvoiceOrder: "0" + lastName: liu + orderId: "126" + orderStatus: Awaiting Payment + totalIncTax: "100.0000" + updatedAt: "1572323610" + channelId: 1 + channelName: test + - companyName: fkkfcctest + createdAt: "1572323432" + firstName: james + isInvoiceOrder: "0" + lastName: liu + orderId: "124" + orderStatus: Awaiting Payment + totalIncTax: "50.0000" + updatedAt: "1572323432" + channelId: 1 + channelName: test + - companyName: fkkfcctest + createdAt: "1572321777" + firstName: james + isInvoiceOrder: "0" + lastName: liu + orderId: "125" + orderStatus: Awaiting Payment + totalIncTax: "50.0000" + updatedAt: "1572321777" + channelId: 1 + channelName: test + paginator: + limit: 10 + offset: 0 + totalCount: 3 + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /companies/{companyId}/payments: + get: + tags: + - Payment + summary: Get Company Payments Methods + description: "Get company payments methods, include inactive" + operationId: companies_payments_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: array + description: "" + items: + type: object + properties: + code: + type: string + description: Payment code + isEnabled: + type: string + description: Payment method status + name: + type: string + description: Payment name + paymentId: + type: number + description: Payment id + message: + type: string + description: Response message + example: + code: 200 + data: + - code: cheque + isEnabled: "1" + name: Check + paymentId: 3 + - code: bankdeposit + isEnabled: "0" + name: Bank Deposit + paymentId: 6 + - code: cod + isEnabled: "0" + name: Cash on Delivery + paymentId: 7 + - code: moneyorder + isEnabled: "0" + name: Money Order + paymentId: 8 + - code: testgateway + isEnabled: "0" + name: Test Payment Gateway + paymentId: 5 + message: SUCCESS + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + put: + tags: + - Payment + summary: Update Company Payments Methods + description: "Update Company payments methods' status, change them active or\ + \ not" + operationId: companies_payments_update + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + payments: + type: array + items: + required: + - isEnabled + - paymentId + type: object + properties: + isEnabled: + type: string + description: "payment active or not('1' for active, others\ + \ for inactive)" + paymentId: + type: string + description: Payment Id + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Updated company Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + customerId: 2 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + data: + payments: + - isEnabled: + - This field is required. + message: Bad Request Error + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "payments": [ + { + "paymentId": "6", + "isEnabled": "1" + } + ] + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments" + payload = { + "payments": [ + { + "paymentId": "6", + "isEnabled": "1" + } + ] + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"payments":[{"paymentId":"6","isEnabled":"1"}]}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/sales-reps: + get: + tags: + - SalesRep + summary: Get Company Sales Reps + description: Get company sales reps' basic info + operationId: companies_sales-reps_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + firstName: + type: string + description: Sales rep's first name + id: + type: string + description: Sales rep's Id + lastName: + type: string + description: Sales rep's last name + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + firstName: kobe + id: "74" + lastName: tiantian + message: Success + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + put: + tags: + - SalesRep + summary: Update Company Sales reps + description: Update company reps + operationId: companies_sales-reps_update + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + salesReps: + type: array + items: + type: object + properties: + id: + type: string + description: Sales rep's Id + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Updated company Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + '[field]': + type: string + description: "Message about problem with field [field]" + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 40010 + message: This field is required. + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "salesReps": [ + { + "id": "74" + } + ] + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps" + payload = { + "salesReps": [ + { + "id": "74" + } + ] + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"salesReps":[{"id":"74"}]}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/user/{customerId}/orders: + post: + tags: + - Order + summary: Create An Order + description: "Create an order from bigCommerce, you must known order id" + operationId: companies_user_orders_create + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: customerId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + description: Request body + allOf: + - required: + - orderId + - totalIncTax + type: object + properties: + orderId: + type: string + description: BigCommerce order id + poNumber: + type: string + description: PoNumber + totalIncTax: + type: number + description: Total incTax + - $ref: '#/components/schemas/order-extra' + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + orderId: + type: string + description: Created order id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + orderId: 2 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + data: + bc_order_id: orderId can not be null + message: Bad Request Error + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders'\ + \ --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\ + \ --header 'Content-Type: application/json' \ + \ --data-raw '{\n \"totalIncTax\": \"111\",\n \ + \ \"orderId\": \"111\"\n}' \n" + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders" + + payload = { + "totalIncTax": "111", + "orderId": "111" + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"totalIncTax":"111","orderId":"111"}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/user/{userId}: + put: + tags: + - User + summary: Update A Company User + description: Update a company user info + operationId: companies_user_update + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: userId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + firstName: + type: string + lastName: + type: string + phone: + type: string + email: + type: string + uuid: + type: string + userRole: + type: string + acceptWelcomeEmail: + type: string + channelIds: + type: array + description: BigCommerce channel id list. + items: + type: integer + companyRoleId: + type: integer + description: "The company role id. This field is only applicable\ + \ to the company's RBAC feature. If your store doesn't utilize\ + \ this feature, please do not use this field. When it has a\ + \ value, it will override the value of the userRole field." + x-stoplight: + id: kac8dnjf5qza1 + - $ref: '#/components/schemas/extra_field_values' + required: false + responses: + "200": + description: "" + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + customerId: + type: integer + userId: + type: integer + description: Response data + message: + type: string + description: Response message + x-codegen-request-body-name: body + /companies/{companyId}/users: + get: + tags: + - User + summary: Get Company Users + description: "Get company users, with pagination data" + operationId: companies_users_list + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: offset + in: query + description: "Pagination offset default: 0" + schema: + type: number + - name: limit + in: query + description: "Pagination limit default: 10" + schema: + type: number + - name: "role[]" + in: query + description: "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)\ + \ eg. role[]=1, 2" + schema: + type: string + - name: isIncludeExtraFields + in: query + description: 0 or 1 + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + list: + type: array + items: + type: object + allOf: + - type: object + properties: + catalogId: + type: string + description: Catalog Id + createdAt: + type: string + description: User create time + email: + type: string + description: User email + firstName: + type: string + description: User's first name + id: + type: string + description: User Id + lastName: + type: string + description: User's last name + phoneNumber: + type: string + description: User phone number + role: + type: string + description: user role (0=admin 1=senior_buyer 2=junior_buyer + 3=sales_rep) + updatedAt: + type: string + description: user update time + uuid: + type: string + description: user UUID + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Channel icon url + companyRoleId: + type: integer + description: "The company role id. This field is only\ + \ applicable to the company's RBAC feature. If your\ + \ store doesn't utilize this feature, please do\ + \ not use this field." + x-stoplight: + id: iz7buf5a5b5bq + companyRoleName: + type: string + description: "The company role name. This field is\ + \ only applicable to the company's RBAC feature.\ + \ If your store doesn't utilize this feature, please\ + \ do not use this field." + x-stoplight: + id: jfmg9izfe2w7t + - $ref: '#/components/schemas/extra_field_values' + pagination: + type: object + properties: + limit: + type: number + description: Response pagination limit + offset: + type: number + description: Response pagination offset + totalCount: + type: number + description: Response data items number + description: Response data pagination + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + list: + - catalogId: "1" + createdAt: "1574999690" + email: test323@test.com + firstName: test + id: "123" + lastName: test2 + phoneNumber: "" + role: "1" + updatedAt: "1574999690" + uuid: A123456 + channelList: [] + pagination: + limit: 10 + offset: 0 + totalCount: 1 + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + put: + tags: + - User + summary: Update Company User + description: "Update company user's field, user identified by email field.fields\ + \ can not omit" + operationId: companies_users_update_or_create + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + allOf: + - required: + - email + - firstName + - lastName + type: object + properties: + acceptWelcomeEmail: + type: string + description: (0=will not receive email 1=will receive email) + enum: + - "0" + - "1" + email: + type: string + firstName: + type: string + lastName: + type: string + phone: + type: string + userRole: + type: string + description: user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep) + uuid: + type: string + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + companyRoleId: + type: integer + description: "The company role id. This field is only applicable\ + \ to the company's RBAC feature. If your store doesn't utilize\ + \ this feature, please do not use this field. When it has a\ + \ value, it will override the value of the userRole field." + x-stoplight: + id: apzeyjj6m09cp + - $ref: '#/components/schemas/extra_field_values' + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + customerId: + type: string + description: Created bc customer Id + userId: + type: string + description: Created user Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + customerId: "2" + userId: "2" + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 10012 + data: {} + message: PARAMETER VALUE ERROR + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "userRole": 1 + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users" + + payload = { + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "userRole": 1 + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"firstName":"test","lastName":"test2","email":"test323@test.com","userRole":1}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + post: + tags: + - User + summary: Create A Company User + description: "Create a company user, which belongs company" + operationId: companies_users_create + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + allOf: + - required: + - email + - firstName + - lastName + - phone + type: object + properties: + acceptWelcomeEmail: + type: string + description: (0=will not receive email 1=will receive email) + enum: + - "0" + - "1" + email: + type: string + firstName: + type: string + lastName: + type: string + phone: + type: string + userRole: + type: string + description: user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep) + uuid: + type: string + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: "BigCommerce channel id, used for BigCommerce customer\ + \ origin channel id. This field takes effect only when the store\ + \ default b2b channel is not configured" + companyRoleId: + type: integer + description: "The company role id. This field is only applicable\ + \ to the company's RBAC feature. If your store doesn't utilize\ + \ this feature, please do not use this field. When it has a\ + \ value, it will override the value of the userRole field." + x-stoplight: + id: 1qhsxeqqydfte + - $ref: '#/components/schemas/extra_field_values' + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + customerId: + type: string + description: Created bc customer Id + userId: + type: string + description: Created user Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + customerId: "2" + userId: "2" + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 10012 + data: {} + message: PARAMETER VALUE ERROR + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "phone": "122331212", + "userRole": 1 + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users" + + payload = { + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "phone": "122331212", + "userRole": 1 + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"firstName":"test","lastName":"test2","email":"test323@test.com","phone":"122331212","userRole":1}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/users/bulk_create: + post: + tags: + - User + summary: Bulk Create Company User + description: Create company users in batch + operationId: companies_users_bulk_create_create + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + acceptWelcomeEmail: + type: string + description: (0=will not receive email 1=will receive email) + enum: + - "0" + - "1" + users: + type: array + items: + type: object + allOf: + - required: + - email + - firstName + - lastName + - phone + type: object + properties: + email: + type: string + firstName: + type: string + lastName: + type: string + phone: + type: string + userRole: + type: string + description: user role(0=admin 1=senior_buyer 2=junior_buyer + 3=sales_rep) + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: "BigCommerce channel id, used for BigCommerce\ + \ customer origin channel id. This field takes effect\ + \ only when the store default b2b channel is not configured" + companyRoleId: + type: integer + description: "The company role id. This field is only applicable\ + \ to the company's RBAC feature. If your store doesn't\ + \ utilize this feature, please do not use this field.\ + \ When it has a value, it will override the value of the\ + \ userRole field." + x-stoplight: + id: y177z48133txw + - $ref: '#/components/schemas/extra_field_values' + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + failedItems: + type: array + items: + type: object + properties: + email: + type: string + description: Created user email + firstName: + type: string + description: Created user's first name + lastName: + type: string + description: Created user's last name + phone: + type: string + description: Created user phone + userRole: + type: number + description: Created user role + successfulItems: + type: array + items: + type: object + properties: + customerId: + type: number + description: Created customer Id + email: + type: string + description: Created user email + firstName: + type: string + description: Created user's first name + lastName: + type: string + description: Created user's last name + phone: + type: string + description: Created user phone + userRole: + type: number + description: Created user role + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + failedItems: [] + successfulItems: + - customerId: 2 + email: test323@test121.com + firstName: test11 + lastName: test2 + phone: "122331211" + userRole: 1 + - customerId: 2 + email: test323@test22.com + firstName: test12 + lastName: test2 + phone: "122331212" + userRole: 1 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 10012 + data: {} + message: PARAMETER VALUE ERROR + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "users": [ + { + "firstName": "test11", + "lastName": "test2", + "email": "test323@test11.com", + "phone": "122331211", + "userRole": 1 + }, + { + "firstName": "test12", + "lastName": "test2", + "email": "test323@test12.com", + "phone": "122331212", + "userRole": 1 + } + ] + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create" + + payload = { + "users": [ + { + "firstName": "test11", + "lastName": "test2", + "email": "test323@test11.com", + "phone": "122331211", + "userRole": 1 + }, + { + "firstName": "test12", + "lastName": "test2", + "email": "test323@test12.com", + "phone": "122331212", + "userRole": 1 + } + ] + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"users":[{"firstName":"test11","lastName":"test2","email":"test323@test11.com","phone":"122331211","userRole":1},{"firstName":"test12","lastName":"test2","email":"test323@test12.com","phone":"122331212","userRole":1}]}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /companies/{companyId}/users/{customerId}: + get: + tags: + - User + summary: Get A Company User + description: "Get a company user's info, by company and customer id" + operationId: companies_users_read + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: customerId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + allOf: + - type: object + properties: + catalogId: + type: string + description: Catalog Id + createdAt: + type: string + description: User create time + email: + type: string + description: User email + firstName: + type: string + description: User's first name + id: + type: string + description: User Id + lastName: + type: string + description: User's last name + phoneNumber: + type: string + description: User phone number + role: + type: string + description: user role (0=admin 1=senior_buyer 2=junior_buyer + 3=sales_rep) + updatedAt: + type: string + description: user update time + uuid: + type: string + description: user UUID + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Channel icon url + companyRoleId: + type: integer + description: "The company role id. This field is only applicable\ + \ to the company's RBAC feature. If your store doesn't\ + \ utilize this feature, please do not use this field." + x-stoplight: + id: 6ocmpffb3ywgh + companyRoleName: + type: string + description: "The company role name. This field is only\ + \ applicable to the company's RBAC feature. If your store\ + \ doesn't utilize this feature, please do not use this\ + \ field." + x-stoplight: + id: 8853bn9ijoqey + - $ref: '#/components/schemas/extra_field_values' + message: + type: string + description: Response message + example: + code: 200 + data: + catalogId: "1" + createdAt: "1574999690" + email: test323@test.com + firstName: test + id: "123" + lastName: test2 + phoneNumber: "" + role: "1" + updatedAt: "1574999690" + uuid: A123456 + channelList: [] + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + delete: + tags: + - User + summary: Delete A Company User + description: "Delete a company user, if this user is the only one administrator\ + \ of company, will return a 500 Error" + operationId: companies_users_delete + parameters: + - name: companyId + in: path + required: true + schema: + type: string + - name: customerId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header + required: true + schema: + type: string + responses: + "200": + description: Deleted successful + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + customerId: + type: string + description: Deleted user Id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + customerId: 2 + message: Success + "404": + description: Company not found + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("DELETE", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'DELETE', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /orders: + put: + tags: + - Order + summary: Update Company Order With BC OrderId + description: "Update order, billingAddress and products can not be omitted.\ + \ products can be two format. \n 1. Product with variants. \n 2. Base product" + operationId: orders_update + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + baseHandlingCost: + type: string + description: "The value of the base handling cost. (Float, Float-As-String,\ + \ Integer)." + baseShippingCost: + type: string + description: "The value of the base shipping cost. (Float, Float-As-String,\ + \ Integer)" + baseWrappingCost: + type: string + description: "The value of the base wrapping cost. (Float, Float-As-String,\ + \ Integer)." + billingAddress: + type: object + properties: + city: + type: string + company: + type: string + description: Company name + country: + type: string + description: Human readable country name + countryIso2: + type: string + description: Country ISO info. + email: + type: string + description: Address email. + firstName: + type: string + description: Address first name + formFields: + type: string + description: Address form fields. + lastName: + type: string + description: Address last name + phone: + type: string + description: Address phone number + state: + type: string + description: Human readable state (or other subdivision) name + streetOne: + type: string + description: Typically the street address + streetTwo: + type: string + description: "More detailed information about where to deliver\ + \ mail, such as a suite or office number" + zip: + type: string + channelId: + type: string + description: BigCommerce channel id. Shows where the order originated. + The channel_id will default to 1. + creditCardType: + type: string + description: Credit card type. + customerMessage: + type: string + description: "Message that the customer entered (number, optiona)\ + \ -o the Order Comments box during checkout." + dateCreated: + type: string + description: Date created. + discountAmount: + type: string + description: "Amount of discount for this transaction. (Float, Float-As-String,\ + \ Integer)" + ebayOrderId: + type: string + description: "If the order was placed through eBay, the eBay order\ + \ number will be included. Otherwise, the value will be 0." + externalId: + type: string + description: "ID of the order in another system. For example, the\ + \ Amazon Order ID if this is an Amazon order.This field can be\ + \ updated in a /POST, but using a /PUT to update the order will\ + \ return a 400 error. The field ‘external_id’ cannot be written\ + \ to. Please remove it from your request before trying again.\ + \ It can not be overwritten once set.." + externalMerchantId: + type: string + description: Id of the external merchant. + externalSource: + type: string + description: "For orders submitted or modified via the API, using\ + \ a PUT or POST operation, you can optionally pass in a value\ + \ identifying the system used to generate the order. For example:\ + \ POS. Otherwise, the value will be null." + geoipCountry: + type: string + description: "The full name of the country where the customer made\ + \ the purchase, based on the IP." + geoipCountryIso2: + type: string + description: "The country where the customer made the purchase,\ + \ in ISO2 format, based on the IP." + giftCertificateAmount: + type: string + description: "A read-only value. Do not pass in a POST or PUT. (Float,\ + \ Float-As-String, Integer)" + handlingCostExTax: + type: string + description: "The value of the handling cost, excluding tax. (Float,\ + \ Float-As-String, Integer)" + handlingCostIncTax: + type: string + description: "The value of the handling cost, including tax. (Float,\ + \ Float-As-String, Integer)." + ipAddress: + type: string + description: "IP Address of the customer, if known." + isDeleted: + type: string + description: "Indicates whether the order was deleted (archived).\ + \ Set to to true, to archive an order." + itemsShipped: + type: string + description: The number of items that have been shipped. + itemsTotal: + type: string + description: The total number of items in the order. + orderId: + type: string + description: BigCommerce order id + orderIsDigital: + type: string + description: Whether this is an order for digital products. + paymentMethod: + type: string + description: "The payment method for this order. Can be one of the\ + \ following: Manual, Credit Card, cash, Test Payment Gateway,\ + \ etc." + paymentProviderId: + type: string + description: The external Transaction ID/Payment ID within this + order’s payment provider (if a payment provider was used). + poNumber: + type: string + description: PoNumber + products: + type: array + items: + type: object + properties: + name: + type: string + priceExTax: + type: string + priceIncTax: + type: string + productId: + type: string + description: Product id. + productOptions: + type: string + quantity: + type: string + sku: + type: string + upc: + type: string + variantId: + type: string + refundedAmount: + type: string + description: "The amount refunded from this transaction. (Float,\ + \ Float-As-String, Integer)" + shippingCostExTax: + type: string + description: "The value of shipping cost, excluding tax. (Float,\ + \ Float-As-String, Integer)." + shippingCostIncTax: + type: string + description: "The value of shipping cost, including tax. (Float,\ + \ Float-As-String, Integer)." + staffNotes: + type: string + description: Any additional notes for staff. + statusId: + type: string + description: The status ID of the order. + subtotalExTax: + type: string + description: "Override value for subtotal excluding tax. If specified,\ + \ the field subtotal_inc_tax is also required. (Float, Float-As-String,\ + \ Integer)" + subtotalIncTax: + type: string + description: "TOverride value for subtotal including tax. If specified,\ + \ the field subtotal_ex_tax is also required. (Float, Float-As-String,\ + \ Integer)" + taxProviderId: + type: string + description: Tax provider id. + totalExTax: + type: string + description: "Override value for the total, excluding tax. If specified,\ + \ the field total_inc_tax is also required. (Float, Float-As-String,\ + \ Integer)" + wrappingCostExTax: + type: string + description: "The value of the wrapping cost, excluding tax. (Float,\ + \ Float-As-String, Integer)." + wrappingCostIncTax: + type: string + description: "The value of the wrapping cost, including tax. (Float,\ + \ Float-As-String, Integer)." + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Updated order id + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + orderId: 2 + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + errMsg: + type: string + description: Error Message + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40010 + data: + errMsg: bc internal server error + message: Bad Requests Error + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "orderId": 117, + "statusId": 0, + "billingAddress": { + "firstName": "Jane", + "lastName": "Doe", + "streetOne": "123 Main Street", + "city": "Austin", + "state": "Texas", + "zip": "78751", + "country": "United States", + "countryIso2": "US", + "email": "janedoe@email.com" + }, + "products": [ + { + "name": "BigCommerce Poster", + "quantity": 1, + "priceIncTax": 10.98, + "priceExTax": 10 + }, + { + "name": "BigCommerce Coffee Mug", + "quantity": 1, + "priceIncTax": 50, + "priceExTax": 45 + } + ] + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders" + payload = { + "orderId": 117, + "statusId": 0, + "billingAddress": { + "firstName": "Jane", + "lastName": "Doe", + "streetOne": "123 Main Street", + "city": "Austin", + "state": "Texas", + "zip": "78751", + "country": "United States", + "countryIso2": "US", + "email": "janedoe@email.com" + }, + "products": [ + { + "name": "BigCommerce Poster", + "quantity": 1, + "priceIncTax": 10.98, + "priceExTax": 10 + }, + { + "name": "BigCommerce Coffee Mug", + "quantity": 1, + "priceIncTax": 50, + "priceExTax": 45 + } + ] + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"orderId":117,"statusId":0,"billingAddress":{"firstName":"Jane","lastName":"Doe","streetOne":"123 Main Street","city":"Austin","state":"Texas","zip":"78751","country":"United States","countryIso2":"US","email":"janedoe@email.com"},"products":[{"name":"BigCommerce Poster","quantity":1,"priceIncTax":10.98,"priceExTax":10},{"name":"BigCommerce Coffee Mug","quantity":1,"priceIncTax":50,"priceExTax":45}]}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /orders/company: + put: + tags: + - Order + summary: Update B2BE User's Orders' company attribute. + description: Update the orders belong to a B2BE company to another B2BE company. + operationId: orders_company_update + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + required: + - customerGroupID + - customerID + type: object + properties: + customerGroupID: + type: string + description: BigCommerce customer group id. + customerID: + type: string + description: BigCommerce user id. + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: {} + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40013 + data: {} + message: Store does not exist. + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request PUT 'localhost:8000/api/v2/io/orders/company' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Content-Type: application/json' --data-raw '{ + "customerGroupID": "6406", + "customerID": "7298" + }' + - lang: Python + source: |2 + + import requests + + url = "localhost:8000/api/v2/io/orders/company" + + payload = "{ + "customerGroupID": "6406", + "customerID": "7298" + }" + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js', + 'Content-Type': 'application/json' + } + + response = requests.request("PUT", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + ) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"customerGroupID":"6406","customerID":"7298"}); + + var requestOptions = { + method: 'PUT', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("localhost:8000/api/v2/io/orders/company", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + post: + tags: + - Order + summary: Update BC Order's 'Company attribute' + description: "Add Company identifier for BigCommerce Customer Individual Orders,\ + \ which can be used to convert BigCommerce Customer Individual Orders to Company-level\ + \ Orders." + operationId: orders_company_create + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + required: + - customerID + type: object + properties: + customerID: + type: string + description: BigCommerce user id. + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: {} + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: {} + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40013 + data: {} + message: Store does not exist. + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'localhost:8000/api/v2/io/orders/convert-from-bc' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4' --header 'Content-Type: application/json' --data-raw '{ + "customerID": "7566" + }' + - lang: Python + source: |2 + + import requests + + url = "localhost:8000/api/v2/io/orders/convert-from-bc" + + payload = "{ + "customerID": "7566" + }" + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"customerID":"7566"}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("localhost:8000/api/v2/io/orders/convert-from-bc", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /orders/images: + get: + tags: + - Order + summary: Get Orders Images + description: Get all orders' images + operationId: orders_images_list + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: orderIds + in: query + description: Query order ids + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: array + description: "" + items: + type: object + properties: + imageUrl: + type: string + description: Image url. + orderId: + type: string + description: Order id. + message: + type: string + description: Response message + example: + code: 200 + data: + - imageUrl: https://www.google.com/imgres?imgurl=https%3A%2F%2Fimg.freepik.com%2Ffree-vector%2Fbroken-frosted-glass-realistic-icon_1284-12125.jpg%3Fsize%3D338%26ext%3Djpg&imgrefurl=https%3A%2F%2Fwww.freepik.com%2Ffree-photos-vectors%2Fpng&tbnid=tiRj4_jn2S_1DM&vet=12ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ..i&docid=kU78UyWVW14S1M&w=338&h=338&q=png&ved=2ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ + orderId: "1" + message: Success + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/images' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders/images" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders/images", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /orders/{orderBCId}/companyIdBCId: + get: + tags: + - Order + summary: Get Company By BC OrderId + description: Get company basic info by bc order id + operationId: orders_companyIdBCId_list + parameters: + - name: orderBCId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Company id + companyName: + type: string + description: Company name + customerGroupId: + type: string + description: company customer group id + extraInt1: + type: number + description: Extra number + extraInt2: + type: number + description: Extra number + extraInt3: + type: number + description: Extra number + extraInt4: + type: number + description: Extra number + extraInt5: + type: number + description: Extra number + extraStr1: + type: string + description: Extra string + extraStr2: + type: string + description: Extra string + extraStr3: + type: string + description: Extra string + extraStr4: + type: string + description: Extra string + extraStr5: + type: string + description: Extra string + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + companyName: ABC.LLC + customerGroupId: "11" + extraInt1: 0 + extraInt2: 0 + extraInt3: 0 + extraInt4: 0 + extraInt5: 0 + extraStr1: "" + extraStr2: "" + extraStr3: "" + extraStr4: "" + extraStr5: "" + message: Success + "400": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + data: + type: object + properties: + '[field]': + type: string + description: Message about problem with field 'field' + description: Response error data + message: + type: string + description: Response error message + description: Response body + example: + code: 40013 + data: {} + message: Order does not exist. + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /orders/{orderId}/companyId: + get: + tags: + - Order + summary: Get Company Id By Order Id + description: Get company ID by order id + operationId: orders_companyId_list + parameters: + - name: orderId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + companyId: + type: string + description: Company id + message: + type: string + description: Response message + example: + code: 200 + data: + companyId: "2" + message: Success + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /orders/{orderId}/details: + get: + tags: + - Order + summary: Get Order Detail + description: Get order's Detail + operationId: orders_details_list + parameters: + - name: orderId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + allOf: + - type: object + properties: + base_handling_cost: + type: string + description: eg. 0.0000 + base_shipping_cost: + type: string + description: eg. 0.0000 + base_wrapping_cost: + type: string + description: eg. 0.0000 + billingAddress: + type: object + properties: + city: + type: string + company: + type: string + description: Company name + country: + type: string + description: Human readable country name + countryIso2: + type: string + description: Country ISO info. + email: + type: string + description: Address email. + firstName: + type: string + description: Address first name + formFields: + type: string + description: Address form fields. + lastName: + type: string + description: Address last name + phone: + type: string + description: Address phone number + state: + type: string + description: Human readable state (or other subdivision) + name + streetOne: + type: string + description: Typically the street address + streetTwo: + type: string + description: "More detailed information about where\ + \ to deliver mail, such as a suite or office number" + zip: + type: string + cart_id: + type: string + description: eg. 5e70bf45-9271-4737-8a80-94f7c99c2e2b + coupon_discount: + type: string + description: eg. 0.00000 + credit_card_type: + type: string + description: eg. null + currency_code: + type: string + description: eg. USD + currency_exchange_rate: + type: string + description: eg. 1.0000000 + currency_id: + type: number + description: eg. 1 + customer_id: + type: number + description: eg. 168 + customer_message: + type: string + description: eg. 123 + date_created: + type: string + description: "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'" + date_modified: + type: string + description: "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'" + date_shipped: + type: string + description: "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'" + default_currency_code: + type: string + description: eg. USD + default_currency_id: + type: number + description: eg. 1 + discount_amount: + type: string + description: eg. 0.00000 + ebay_order_id: + type: string + description: eg. 0 + external_source: + type: string + description: 'eg. ' + geoip_country: + type: string + description: eg. China + geoip_country_iso2: + type: string + description: eg. CN + gift_certificate_amount: + type: string + description: eg. 0.0000 + handling_cost_ex_tax: + type: string + description: eg. 0.0000 + handling_cost_inc_tax: + type: string + description: eg. 0.0000 + handling_cost_tax: + type: string + description: eg. 0.0000 + handling_cost_tax_class_id: + type: number + description: eg. 2 + id: + type: string + description: Order id + ip_address: + type: string + description: eg. 118.112.75.229 + is_deleted: + type: boolean + description: eg. False + is_email_opt_in: + type: boolean + description: eg. false + items_shipped: + type: number + description: eg. 2 + items_total: + type: number + description: eg. 2 + order_is_digital: + type: boolean + order_source: + type: string + description: eg. www + payment_method: + type: string + description: eg. PO + payment_provider_id: + type: string + description: payment provider id + payment_status: + type: string + description: eg. AwaitingPayment + products: + type: array + items: + type: object + properties: + applied_discounts: + type: string + description: "eg. []" + base_cost_price: + type: string + description: eg. 1.0000 + base_price: + type: string + description: eg. 22.5000 + base_total: + type: string + description: eg. 140.0000 + base_wrapping_cost: + type: string + description: eg. 1.0000 + bin_picking_number: + type: string + description: eg. 1 + configurable_fields: + type: string + description: "eg. []" + cost_price_ex_tax: + type: string + description: eg. 1.0000 + cost_price_inc_tax: + type: string + description: eg. 1.0000 + cost_price_tax: + type: string + description: eg. 1.0000 + coupons: + type: object + properties: + resource: + type: string + description: eg. /orders/123/coupons + url: + type: string + description: coupon url + custom_status: + type: string + description: eg. Awaiting Payment + depth: + type: string + description: eg. 1.0000 + ebay_item_id: + type: string + description: eg. 1 + ebay_transaction_id: + type: string + description: eg. 1 + event_date: + type: string + description: eg. 1.0000 + event_name: + type: string + description: eg. 1.0000 + external_id: + type: string + description: eg. null + external_merchant_id: + type: string + description: eg. null + fixed_shipping_cost: + type: string + description: eg. 1.0000 + fulfillment_source: + type: string + description: "eg. []" + height: + type: string + description: eg. 1.0000 + id: + type: string + description: eg 1. + is_bundled_product: + type: boolean + description: eg. false + is_refunded: + type: boolean + description: eg. false + name: + type: string + option_set_id: + type: string + description: eg. 1 + order_address_id: + type: string + description: eg. 24 + order_id: + type: string + description: eg 3. + parent_order_product_id: + type: string + description: eg. 1 + poNumber: + type: object + properties: + resource: + type: string + description: eg. orders/123/shippingaddresses/24/shippingquotes + url: + type: string + description: shipping quote url + priceExTax: + type: string + priceIncTax: + type: string + price_tax: + type: string + description: eg. 0.0000 + productId: + type: string + description: Product id. + productOptions: + type: string + product_options: + type: string + description: "eg. []" + quantity: + type: string + quantity_refunded: + type: string + description: eg. 1.0000 + quantity_shipped: + type: number + description: eg. 1 + refund_amount: + type: string + description: eg. 1.0000 + return_id: + type: number + description: eg. 1.0000 + shipments: + type: boolean + description: eg. false + shipping_address: + type: object + properties: + resource: + type: string + description: eg. /orders/123/shippingaddresses + url: + type: string + description: shipping address url + sku: + type: string + store_default_currency_code: + type: string + description: eg. USD + store_default_to_transactional_exchange_rate: + type: string + description: eg. 1.00000000 + tax_provider_id: + type: string + description: eg. BasicTaxProvider + total_ex_tax: + type: string + description: eg. 140.0000 + total_inc_tax: + type: string + description: eg. 140.0000 + total_tax: + type: string + description: eg. 0.0000 + type: + type: string + description: eg. physical + upc: + type: string + variantId: + type: string + variant_id: + type: string + description: eg. 74 + weight: + type: string + description: eg. 1.0000 + width: + type: string + description: eg. 1.0000 + wrapping_cost_ex_tax: + type: string + description: eg. 1.0000 + wrapping_cost_inc_tax: + type: string + description: eg. 1.0000 + wrapping_cost_tax: + type: string + description: eg. 1.0000 + wrapping_message: + type: string + description: eg. 1.0000 + wrapping_name: + type: string + description: eg. 1.0000 + refunded_amount: + type: string + description: eg. 0.0000 + shippingAddress: + type: object + properties: + base_cost: + type: string + description: eg. 0.0000 + base_handling_cost: + type: string + description: eg. 0.0000 + city: + type: string + company: + type: string + description: Company name + cost_ex_tax: + type: string + description: eg. 0.0000 + cost_inc_tax: + type: string + description: eg. 0.0000 + cost_tax: + type: string + description: eg. 0.0000 + cost_tax_class_id: + type: string + description: eg. 20 + country: + type: string + description: Human readable country name + countryIso2: + type: string + description: Country ISO info. + email: + type: string + description: Address email. + firstName: + type: string + description: Address first name + formFields: + type: string + description: Address form fields. + form_fields: + type: string + description: "eg. []" + handling_cost_ex_tax: + type: string + description: eg. 0.0000 + handling_cost_inc_tax: + type: string + description: eg. 0.0000 + handling_cost_tax: + type: string + description: eg. 0.0000 + handling_cost_tax_class_id: + type: number + description: eg. 1 + items_shipped: + type: string + description: eg. 6 + items_total: + type: string + description: eg. 6 + lastName: + type: string + description: Address last name + phone: + type: string + description: Address phone number + shipping_method: + type: string + description: eg. Free Shipping + shipping_quoteseg: + type: object + properties: {} + shipping_zone_id: + type: number + description: eg. 1 + shipping_zone_name: + type: string + description: eg. United States1 + state: + type: string + description: Human readable state (or other subdivision) + name + streetOne: + type: string + description: Typically the street address + streetTwo: + type: string + description: "More detailed information about where\ + \ to deliver mail, such as a suite or office number" + zip: + type: string + shipping_address_count: + type: number + description: eg. 1 + shipping_cost_ex_tax: + type: string + description: eg. 0.0000 + shipping_cost_inc_tax: + type: string + description: eg. 0.0000 + shipping_cost_tax: + type: string + description: eg. 0.0000 + shipping_cost_tax_class_id: + type: number + description: eg. 2 + staff_notes: + type: string + status: + type: string + description: eg. Awaiting Payment + status_id: + type: number + description: eg. 8 + store_credit_amount: + type: string + description: eg. 0.0000 + subtotal_ex_tax: + type: string + description: eg. 135.0000 + subtotal_inc_tax: + type: string + description: eg. 135.0000 + subtotal_tax: + type: string + description: eg. 0.0000 + total_ex_tax: + type: string + description: eg. 135.0000 + total_inc_tax: + type: string + description: eg. 135.0000 + total_tax: + type: string + description: eg. 0.0000 + wrapping_cost_ex_tax: + type: string + description: eg. 0.0000 + wrapping_cost_inc_tax: + type: string + description: eg. 0.0000 + wrapping_cost_tax: + type: string + description: eg. 0.0000 + wrapping_cost_tax_class_id: + type: number + description: eg. 2 + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + - $ref: '#/components/schemas/order-extra' + message: + type: string + description: Response message + example: + code: 200 + data: + base_handling_cost: "0.0000" + base_shipping_cost: "0.0000" + base_wrapping_cost: "0.0000" + billing_address: + city: Irvine + company: qqqq + country: United States + country_iso2: US + email: 15002803905@163.com + first_name: sdsdsd + form_fields: [] + last_name: errte + phone: "9497486023" + state: California + street_1: "15440 Laguna Canyon Road, Ste 213" + street_2: ssadsdas + zip: "92618" + cart_id: f6a167af-fdc2-4409-8282-0358c36b46c5 + channel_id: "1" + coupon_discount: "0.0000" + coupons: + resource: /orders/126/coupons + url: https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/coupons + credit_card_type: "" + currency_code: USD + currency_exchange_rate: "1.0000000000" + currency_id: 1 + custom_status: Awaiting Payment + customer_id: 168 + customer_message: |- + 123456 + 123456798 + date_created: "Tue, 29 Oct 2019 12:33:25 +0000" + date_modified: "Tue, 29 Oct 2019 12:33:29 +0000" + date_shipped: "" + default_currency_code: USD + default_currency_id: 1 + discount_amount: "0.0000" + ebay_order_id: "0" + external_id: null + external_merchant_id: null + external_source: "" + geoip_country: China + geoip_country_iso2: CN + gift_certificate_amount: "0.0000" + handling_cost_ex_tax: "0.0000" + handling_cost_inc_tax: "0.0000" + handling_cost_tax: "0.0000" + handling_cost_tax_class_id: 2 + id: "126" + ip_address: 171.213.12.107 + is_deleted: false + is_email_opt_in: false + items_shipped: 0 + items_total: 20 + order_is_digital: false + order_source: www + payment_method: PO + payment_provider_id: "" + payment_status: "" + poNumber: "123456798" + products: + - applied_discounts: "" + base_cost_price: "0.0000" + base_price: "5.0019" + base_total: "100.0000" + base_wrapping_cost: "0.0000" + bin_picking_number: "" + configurable_fields: "" + cost_price_ex_tax: "0.0000" + cost_price_inc_tax: "0.0000" + cost_price_tax: "0.0000" + depth: "0.0000" + ebay_item_id: "" + ebay_transaction_id: "" + event_date: "" + event_name: "" + external_id: "" + fixed_shipping_cost: "0.0000" + fulfillment_source: "" + height: "0.0000" + id: "39" + is_bundled_product: false + is_refunded: false + name: "[Sample] Tiered Wire Basket" + option_set_id: "" + order_address_id: "27" + order_id: "126" + parent_order_product_id: "" + price_ex_tax: "5.0000" + price_inc_tax: "5.0000" + price_tax: "0.0000" + product_id: 97 + product_options: "" + quantity: "20" + quantity_refunded: "0" + quantity_shipped: 0 + refund_amount: "0.0000" + return_id: 0 + sku: TWB + total_ex_tax: "100.0000" + total_inc_tax: "100.0000" + total_tax: "0.0000" + type: physical + upc: "" + variant_id: "69" + weight: "1.0000" + width: "0.0000" + wrapping_cost_ex_tax: "0.0000" + wrapping_cost_inc_tax: "0.0000" + wrapping_cost_tax: "0.0000" + wrapping_message: "" + wrapping_name: "" + refunded_amount: "0.0000" + shipments: false + shippingAddress: + base_cost: "0.0000" + base_handling_cost: "0.0000" + city: Irvine + company: qqqq + cost_ex_tax: "0.0000" + cost_inc_tax: "0.0000" + cost_tax: "0.0000" + cost_tax_class_id: "2" + country: United States + country_iso2: US + email: 15002803905@163.com + first_name: sdsdsd + form_fields: "" + handling_cost_ex_tax: "0.0000" + handling_cost_inc_tax: "0.0000" + handling_cost_tax: "0.0000" + handling_cost_tax_class_id: 2 + id: 27 + items_shipped: "0" + items_total: "20" + last_name: errte + order_id: 126 + phone: "9497486023" + shipping_method: Free Shipping + shipping_quotes: + resource: /orders/126/shippingaddresses/27/shippingquotes + url: https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses/27/shippingquotes + shipping_zone_id: 1 + shipping_zone_name: United States + state: California + street_1: "15440 Laguna Canyon Road, Ste 213" + street_2: ssadsdas + zip: "92618" + shipping_address_count: 1 + shipping_addresses: + resource: /orders/126/shippingaddresses + url: https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses + shipping_cost_ex_tax: "0.0000" + shipping_cost_inc_tax: "0.0000" + shipping_cost_tax: "0.0000" + shipping_cost_tax_class_id: 2 + staff_notes: "" + status: Awaiting Payment + status_id: 7 + store_credit_amount: "0.0000" + store_default_currency_code: USD + store_default_to_transactional_exchange_rate: "1.0000000000" + subtotal_ex_tax: "100.0000" + subtotal_inc_tax: "100.0000" + subtotal_tax: "0.0000" + tax_provider_id: BasicTaxProvider + total_ex_tax: "100.0000" + total_inc_tax: "100.0000" + total_tax: "0.0000" + wrapping_cost_ex_tax: "0.0000" + wrapping_cost_inc_tax: "0.0000" + wrapping_cost_tax: "0.0000" + wrapping_cost_tax_class_id: 3 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Order Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /orders/{orderId}/products: + get: + tags: + - Order + summary: Get Order Product + description: Get order's products info + operationId: orders_products_list + parameters: + - name: orderId + in: path + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + optionList: + type: array + description: "" + items: + type: object + properties: + option_id: + type: string + description: Product option ID + option_value: + type: string + description: Product option value + productId: + type: string + description: Product id + quantity: + type: string + description: Product quantity + message: + type: string + description: Response message + example: + code: 200 + data: + optionList: [] + productId: "97" + quantity: "20" + variantId: "69" + message: Success + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Order Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /proxy: + post: + tags: + - Proxy + summary: Third party API proxy + description: Get response data of third party APIs through this API. + operationId: proxy_create + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + required: + - method + - proxyType + - url + type: object + properties: + data: + type: string + description: Request data of your third party request + method: + type: string + description: "HTTP request method, get/post/put/delete" + params: + type: string + description: Request parameters of your third party request + proxyType: + type: string + description: "Third party type or name, such as BigCommerce" + url: + type: string + description: Url of request + description: Request body + required: true + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + message: + type: string + description: Response message + example: + code: 200 + message: Success + "500": + description: Response Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status error code + message: + type: string + description: Response error message + description: Response body + example: + code: 500 + message: Bigcommerce API error + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/proxy' --header 'Content-Type: application/json' --data-raw '{ + "method": "get", + "url": "/v2/customers", + "proxyType": "Bigcommerce" + }' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/proxy" + + payload = "{"method": "get", "url": "/v2/customers","proxyType": "Bigcommerce"}" + headers = { + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"method": "get", "url": "/v2/customers", "proxyType": "Bigcommerce"}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /sales-reps/companies: + get: + tags: + - SalesRep + summary: Get Companies & Sales reps + description: "Get all companies and their sales reps, default order by company" + operationId: sales-reps_companies_list + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + - name: offset + in: query + description: "Pagination offset default: 0" + schema: + type: number + - name: limit + in: query + description: "Pagination limit default: 10" + schema: + type: number + - name: groupBy + in: query + description: "Group by('2' for company, '1' for sales reps)" + schema: + type: number + - name: orderBy + in: query + description: Order by default DESC choice (DESC ASC) + schema: + type: number + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + list: + type: array + description: "This interface has 2 type response data type,\ + \ if get with groupBy 2 will return company info, if get\ + \ with groupBy 1 will return sales reps info" + items: + type: object + properties: + catalogId: + type: string + description: "Catalog Id(groupBy: 2)" + city: + type: string + description: "Company city(groupBy: 2)" + companyCount: + type: string + description: "Sales rep's company count (groupBy: 1)" + companyEmail: + type: string + description: "Company name(groupBy: 2)" + companyId: + type: string + description: "Company Id(groupBy: 2)" + companyName: + type: string + description: "Company name(groupBy: 2)" + country: + type: string + description: "Company country(groupBy: 2)" + email: + type: string + description: "Sales rep's email (groupBy: 1)" + firstName: + type: string + description: "Sales rep's first name(groupBy: 1)" + lastName: + type: string + description: "Sales rep's last name(groupBy: 1)" + role: + type: string + description: "Sales rep's role (groupBy: 1)" + salesRepCount: + type: string + description: "Company's sales reps count(groupBy: 2)" + salesRepId: + type: string + description: "Sales rep's Id (groupBy: 1)" + state: + type: string + description: "Company state(groupBy: 2)" + zipCode: + type: string + description: "Company zip code(groupBy: 2)" + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Icon url + pagination: + type: object + properties: + limit: + type: number + description: Response pagination limit + offset: + type: number + description: Response pagination offset + totalCount: + type: number + description: Response data items number + description: Response data pagination + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + list: + - addressLine1: "" + addressLine2: "" + catalogId: "2" + city: "" + companyEmail: kobe.tian@bunldeb2b.com + companyId: "34" + companyName: KobeCropTest111 + country: "," + description: KobeCropTest111 + salesRepCount: "2" + state: "" + zipCode: "" + pagination: + limit: 10 + offset: 0 + totalCount: 1 + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + /store/payments: + get: + tags: + - Payment + summary: Get Store's All Payments + description: Get store's all payments + operationId: store_payments_list + parameters: + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + list: + type: array + description: "" + items: + type: object + properties: + paymentCode: + type: string + description: Payment method code + paymentTitle: + type: string + description: Payment method title + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + list: + - paymentCode: authorizenet + paymentTitle: Authorize.net + - paymentCode: braintree + paymentTitle: Braintree + - paymentCode: cheque + paymentTitle: Check + - paymentCode: testgateway + paymentTitle: Test Payment Gateway + message: SUCCESS + x-code-samples: + - lang: Shell + source: |2 + + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/store/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/store/payments" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/store/payments", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /users/{customerId}/companies: + get: + tags: + - Company + summary: Get Company By CustomerId + description: "Get company by customer Id, if company not in bigCommerce will\ + \ delete the company" + operationId: users_companies_list + parameters: + - name: customerId + in: path + description: BigCommerce's customer id + required: true + schema: + type: string + - name: authToken + in: header + description: Auth token in header. + required: true + schema: + type: string + responses: + "200": + description: Response Success + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + addressLine1: + type: string + description: Company address line 1 + addressLine2: + type: string + description: Company address line 2 + catalogId: + type: string + description: Catalog Id + city: + type: string + description: Company city + companyId: + type: string + description: Company Id + companyName: + type: string + description: Company name + companyStatus: + type: string + description: Company status + country: + type: string + description: Company country + description: + type: string + description: Company description + state: + type: string + description: Company state + zipCode: + type: string + description: Company zip code + description: Response data + message: + type: string + description: Response message + example: + code: 200 + data: + addressLine1: "" + addressLine2: "" + catalogId: "1" + city: Paris + companyId: "35" + companyName: CropTest1 + companyStatus: "1" + country: French + description: CropTest + state: BC + zipCode: "1032332" + message: SUCCESS + "404": + description: Not Found Error + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response status code + data: + type: object + properties: + errMsg: + type: string + description: Error message info + description: Response data + message: + type: string + description: Response message + description: Response body + example: + code: 404 + data: + errMsg: Companies Does not Exist + message: Not Found Error + x-code-samples: + - lang: Shell + source: "\ncurl --location --request GET 'https://https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies'\ + \ --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\ + \ --header 'Content-Type: application/json'\ + \ \n" + - lang: Python + source: |2 + + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: |2 + + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + /users/{userId}/company: {} +components: + schemas: + user_extra_field_values: + title: User Extra field values + type: object + properties: + userExtraFields: + type: array + items: + required: + - fieldName + - fieldValue + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + description: User Extra Field Values + example: + userExtraFields: + - fieldName: string + fieldValue: string + x-internal: false + order-extra: + title: orderExtra + type: object + properties: + extraInt1: + type: integer + description: Extra field of this order + example: 42 + extraInt2: + type: integer + description: Extra field of this order + example: 42 + extraInt3: + type: integer + description: Extra field of this order + example: 42 + extraInt4: + type: integer + description: Extra field of this order + example: 42 + extraInt5: + type: integer + description: Extra field of this order + example: 42 + extraStr1: + type: string + description: Extra string field of this order + example: customize additional information + extraStr2: + type: string + description: Extra string field of this order + example: customize additional information + extraStr3: + type: string + description: Extra string field of this order + example: customize additional information + extraStr4: + type: string + description: Extra string field of this order + example: customize additional information + extraStr5: + type: string + description: Extra string field of this order + example: customize additional information + extraText: + type: string + description: Extra text field of this order + example: customize additional information + extraInfo: + type: object + description: Extra info of this order such as address extra fields + example: customize additional information + example: + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test + x-internal: false + extra_field_values: + title: Extra field values + type: object + properties: + extraFields: + type: array + items: + required: + - fieldName + - fieldValue + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + description: Extra Field Values + example: + extraFields: + - fieldName: string + fieldValue: string + x-internal: false + securitySchemes: + authToken: + type: apiKey + name: authToken + in: header +x-original-swagger-version: "2.0" diff --git a/docs/b2b-edition/specs/api-v3/address/address.yaml b/docs/b2b-edition/specs/api-v3/address/address.yaml new file mode 100644 index 000000000..0a16646bb --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/address/address.yaml @@ -0,0 +1,1319 @@ +openapi: '3.0.0' +info: + title: Address + version: v3 + description: BigCommerce B2B Edition Address + contact: + name: string +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +paths: + /countries: + parameters: [] + get: + summary: Get Countries + tags: + - Address + responses: + '200': + description: OK + headers: {} + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - countryCode: US + countryName: United States + meta: + message: SUCCESS + properties: + code: + type: number + data: + required: + - countryCode + - countryName + type: object + properties: + countryCode: + type: string + minLength: 1 + countryName: + type: string + minLength: 1 + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + countryCode: US + countryName: United States + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: {} + meta: + message: Resource not found + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Resource not found + operationId: get-addresses-countries-countryName-code + description: Get a country's info via its code/name + parameters: + - schema: + type: string + enum: + - '0' + - '1' + default: '0' + example: '0' + in: query + name: searchType + description: 'The search type, 0: Get the country code via the input country name; 1: Get the country name via the input country code.' + required: true + - schema: + type: string + example: US (the searchType should be 1); United States (the searchType should be 0) + in: query + name: q + description: Input country name/code + required: true + security: + - authToken: [] + /states: + parameters: [] + get: + summary: Get States + tags: + - Address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - stateCode: TX + stateName: Texas + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - stateCode + - stateName + properties: + stateCode: + type: string + minLength: 1 + stateName: + type: string + minLength: 1 + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + Get states success: + value: + code: 200 + data: + stateCode: TX + stateName: Texas + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: {} + meta: + message: Resource not found + examples: + Resouce not found: + value: + code: 404 + data: [] + meta: + message: Please enter a valid state name or state abbreviation for the country + operationId: get-addresses-states-stateName-code + description: Get a state info via its code/name + security: + - authToken: [] + parameters: + - schema: + type: string + enum: + - '0' + - '1' + default: '0' + example: '0' + in: query + name: searchType + description: 'The search type, 0: Get the state code via the input state name; 1: Get the state name via the input state code.' + required: true + - schema: + type: string + example: TX (the searchType should be 1); Texas (the searchType should be 0) + in: query + name: q + description: Input state name/code + required: true + - schema: + type: string + example: 'US(the searchType should be 1),United States(the searchType should be 0)' + default: US / United States + in: query + name: country + description: 'Country code or name,it should correspond to the search type you have chosen.' + /addresses: + get: + summary: Get addresses + tags: + - Address + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + - addressId: '6' + addressLine1: 123 Main Street + addressLine2: Blvd + city: Austin + country: + countryCode: US + countryName: United States + firstName: Jane + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + lastName: Doe + phoneNumber: '11111111111' + state: + stateCode: TX + stateName: Texas + zipCode: '78751' + meta: + message: SUCCESS + pagination: + limit: 1 + offset: 1 + totalCount: 989 + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + meta: + type: object + required: + - message + - pagination + properties: + message: + type: string + minLength: 1 + pagination: + type: object + required: + - limit + - offset + - totalCount + properties: + limit: + type: number + offset: + type: number + totalCount: + type: number + required: + - code + - data + - meta + examples: {} + '404': + description: Not Found + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: {} + meta: + message: Resource not found + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Resource not found + operationId: get-companies + description: Get an addresses + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - name: minModified + in: query + description: Minimum modified timestamp + allowEmptyValue: true + schema: + type: number + format: time + - name: maxModified + in: query + description: Maximum modified timestamp + allowEmptyValue: true + schema: + type: number + - name: minCreated + in: query + description: Minimum created timestamp + allowEmptyValue: true + schema: + type: number + - name: maxCreated + in: query + description: Maximum created timestamp + allowEmptyValue: true + schema: + type: number + - schema: + type: integer + example: 12 + in: query + name: companyId + description: Company ID + - schema: + type: boolean + in: query + name: isBilling + - schema: + type: boolean + in: query + name: isShipping + - schema: + type: string + default: '0' + enum: + - '0' + - '1' + in: query + name: isIncludeExtraFields + description: Is show extra fields in the response + - schema: + type: string + in: query + name: firstName + description: Address first name filter + - schema: + type: string + in: query + name: lastName + description: Address last name filter + - schema: + type: string + in: query + name: address + description: Address address filter + - schema: + type: string + in: query + name: city + description: Address city filter + - schema: + type: string + in: query + name: country + description: Address country filter + - schema: + type: string + in: query + name: state + description: Address state filter + - schema: + type: string + in: query + name: zipCode + description: Address zip code filter + - schema: + type: string + in: query + name: phoneNumber + description: Address phone number filter + - schema: + type: string + in: query + name: 'externalId[]' + description: External Id filter + parameters: [] + post: + summary: Create a Company's Address + operationId: post-companies-companyId-addresses + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + properties: + code: + type: integer + data: + type: object + required: + - addressId + properties: + addressId: + type: string + minLength: 1 + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + description: Create a company's address + requestBody: + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + examples: {} + tags: + - Address + security: + - authToken: [] + '/addresses/{addressId}': + parameters: + - schema: + type: string + name: addressId + in: path + required: true + get: + summary: Get an Address + tags: + - Address + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + addressId: 6 + addressLine1: 123 Main Street + addressLine2: Blvd + city: Austin + country: + countryCode: US + countryName: United States + firstName: Jane + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + lastName: Doe + phoneNumber: '11111111111' + state: + stateCode: TX + stateName: Texas + zipCode: '78751' + companyId: 12 + meta: + message: SUCCESS + properties: + code: + type: number + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: {} + '404': + description: Not Found + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: {} + meta: + message: Resource not found + properties: + code: + type: number + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - meta + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Resource not found + operationId: get-companies-companyId-addresses-addressId + description: Get an address detail info + security: + - authToken: [] + put: + summary: Update an Address + operationId: put-companies-companyId-addresses-addressId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: integer + example: 1 + format: int32 + description: Unique numeric ID of this Address. + readOnly: true + addressLine1: + type: string + minLength: 1 + example: 1600 Pennsylvania Avenue NW + maxLength: 200 + description: Address line 1 of the Address Model. + addressLine2: + type: string + minLength: 1 + example: 'Washington, DC 22202' + maxLength: 200 + description: Address line 2 of the Address Model. + city: + type: string + minLength: 1 + example: Austin + maxLength: 100 + description: City of the Address Model. + firstName: + type: string + minLength: 1 + example: Jane + maxLength: 100 + description: First name of the Address Model. + lastName: + type: string + minLength: 1 + example: Doe + maxLength: 100 + description: Last name of the Address Model. + isBilling: + type: boolean + description: Is this address use for billing + isDefaultBilling: + type: boolean + description: Is default billing address of company + isDefaultShipping: + type: boolean + description: Is default shipping address of company + isShipping: + type: boolean + description: Is this address use for shipping + phoneNumber: + type: string + minLength: 1 + example: '11111111111' + maxLength: 50 + description: Contact phone number of this address + zipCode: + type: string + minLength: 1 + maxLength: 50 + example: '78751' + description: Zip code + companyId: + type: integer + example: 1840 + description: The company ID of this address owner + countryName: + type: string + description: Country name of the Address Model. + minLength: 1 + maxLength: 150 + example: United States + countryCode: + type: string + description: Country code of the Address Model. + minLength: 1 + maxLength: 50 + example: US + stateCode: + type: string + description: State code of the Address Model. + example: TX + minLength: 1 + maxLength: 50 + stateName: + type: string + description: State name of the Address Model. + example: Texas + minLength: 1 + maxLength: 150 + label: + type: string + description: Label of the Address Model + extraFields: + type: array + description: Extra fields of the address + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Value of the extra field. + externalId: + type: string + examples: + example-1: + value: + id: 1 + addressLine1: string + addressLine2: 'Washington, DC 22202' + city: Austin + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + zipCode: '78751' + companyId: 1840 + countryName: United States + countryCode: US + stateCode: TX + stateName: Texas + label: test + extraFields: [] + externalId: '2' + description: '' + tags: + - Address + description: Update an address attributes + security: + - authToken: [] + delete: + summary: Delete an Address + operationId: delete-companies-companyId-addresses-addressId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: + addressId: '147340' + meta: + message: SUCCESS + tags: + - Address + description: Delete an address + security: + - authToken: [] + /addresses/bulk: + post: + summary: Bulk Create Addresses + operationId: post-addresses + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: {} + meta: + message: SUCCESS + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + '400': + description: 'Bad Request, some addresses created failed' + content: + application/json: + schema: + type: object + description: '' + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + minItems: 1 + uniqueItems: true + type: array + items: + type: object + properties: + id: + minLength: 1 + type: string + _detail: + type: string + required: + - id + - _detail + meta: + type: object + required: + - message + properties: + message: + minLength: 1 + type: string + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + example-1: + example: + code: 400 + data: + errors: + - id: '42' + detail: '' + meta: + message: 'Some companies updated failed, you can see these in errors' + '404': + description: The resource was not found. + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + data: + errors: + - id: string + detail: string + meta: + message: string + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + _detail: + type: string + minLength: 1 + required: + - id + - _detail + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + example-1: + example: + code: 404 + data: + errors: + - id: '42' + detail: '' + meta: + message: 'There have some company resources not found, and the companyIds is in the errors' + '409': + description: Address was in conflict with another address. This is the result of duplicate unique values. + content: + application/json: + schema: + type: object + description: '' + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + minItems: 1 + uniqueItems: true + type: array + items: + type: object + properties: + id: + minLength: 1 + type: string + _detail: + type: string + required: + - id + - _detail + meta: + type: object + required: + - message + properties: + message: + minLength: 1 + type: string + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + example-1: + example: + code: 409 + data: + errors: + - id: '42' + detail: '' + meta: + message: Company was in conflict with another company + '413': + description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + examples: + example-1: + value: + code: 413 + meta: + message: Request Entity Too Large + data: {} + '422': + description: Address was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + data: + errors: + - id: string + detail: string + meta: + message: string + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - type: object + properties: + id: + type: integer + _detail: + type: string + minLength: 1 + required: + - id + - _detail + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: 1 + _detail: string + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + country: + countryCode: US + countryName: United States + firstName: Jane + lastName: Doe + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + phoneNumber: '11111111111' + state: + stateCode: TX + stateName: Texas + zipCode: '78751' + companyId: 1840 + meta: + message: string + tags: + - Address + description: Bulk create addresses + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + examples: {} + parameters: [] + /addresses/extra-fields: + get: + summary: Get address extra field configs + tags: + - Address + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - properties: + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + meta: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + type: object + examples: + example-1: + value: + code: 200 + data: + - id: 1 + uuid: 2af143b0-3a78-4d16-af42-1f0f9a7bc85a + fieldName: fax + fieldType: 0 + isRequired: false + isUnique: false + meta: + message: Success + pagination: + limit: 10 + offset: 0 + '422': + description: Unprocessable Entity (WebDAV) + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 422 + data: + errMsg: A valid integer is required + meta: + message: Parameter Error + operationId: get-addresses-extra-fields + description: Get address extra fields configs + security: + - authToken: [] + parameters: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit +components: + parameters: + limit: + name: limit + in: query + description: 'Pagination limit default: 10' + allowEmptyValue: true + schema: + maximum: 250 + exclusiveMaximum: true + minimum: 1 + exclusiveMinimum: true + type: integer + default: 10 + offset: + name: offset + in: query + description: 'Pagination offset default: 0' + allowEmptyValue: true + schema: + type: integer + minimum: 0 + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +tags: + - name: Address diff --git a/docs/b2b-edition/specs/api-v3/authentication.yaml b/docs/b2b-edition/specs/api-v3/authentication.yaml new file mode 100644 index 000000000..dc01b15d5 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/authentication.yaml @@ -0,0 +1,604 @@ +openapi: '3.0.0' +info: + title: authentication + version: '3.0' + description: Api auth manage +servers: + - url: 'https://api-b2b.bigcommerce.com/api/io' +tags: + - name: Auth + description: '' +paths: + /auth/backend: + parameters: [] + post: + summary: Get Server to Server OpenAPI tokens + operationId: post-auth-backend + tags: + - Auth + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + name: + type: string + minLength: 1 + description: Token name + token: + type: string + minLength: 1 + description: Your token + required: + - name + - token + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - name: fullPermsToken + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYjJjX29yZGVyX2ltcG9ydEBxcS5jb21tIiwic3RvcmVfaGFzaCI6ImYyb3N4ampueGoiLCJkYiI6ImRlZmF1bHQifQ.L_u_enljWoYBbPPskmYEQVHldHIaTcWMIB-SdFah850 + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + description: Error message + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 400 + data: + errMsg: The email or password you have entered is incorrect. Please try again. + meta: + message: API logic error + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + storeHash: + type: string + minLength: 1 + description: Your store unique store_hash + email: + type: string + minLength: 1 + description: 'Backend user email, the credential you use to log in B2B Edition APP' + password: + type: string + minLength: 1 + description: 'Backend user password, the credential you use to log in B2B Edition APP' + name: + type: string + description: The token name if you want specfiy + required: + - storeHash + - email + - password + - name + examples: + example-1: + value: + storeHash: string + email: string + password: string + name: test + application/xml: + schema: + description: '' + type: object + properties: + storeHash: + type: string + minLength: 1 + email: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - storeHash + - email + - password + examples: + example-1: + value: + storeHash: 1i5ypxdlj + email: dev.test@bundleb2b.net + password: 1mdsafu3nf9x + description: '' + description: Get Server to Server OpenAPI tokens + security: [] + delete: + summary: Delete Backend OpenAPI tokens + operationId: delete-auth-backend + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: {} + examples: + example-1: + value: + code: 200 + data: [] + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + x-examples: + example-1: + code: 404 + data: + errMsg: No matching token + meta: + message: Not Found Error + examples: + example-1: + value: + code: 404 + data: + errMsg: No matching token was found + meta: + message: Not Found Error + description: Delete backend OpenAPI tokens. + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + email: + type: string + description: | + Backend user email, the credential you use to log in B2B Edition APP. Which will be used as a query parameter. + minLength: 1 + name: + type: string + description: 'The token name, which will be used as a query parameter.' + id: + type: integer + description: Token ID + required: + - id + tags: + - Auth + /backend/tokens: + get: + summary: Get All Server to Server Tokens + tags: + - Auth + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + type: array + items: + type: object + properties: + id: + type: integer + description: Token ID + name: + type: string + description: Token name + email: + type: string + description: Token email + storeHash: + type: string + description: Token store hash + token: + type: string + description: Token + eventChannel: + type: string + description: 'The channel that token created from app,admin or api.' + meta: + type: object + properties: + pagination: + type: object + properties: + totalCount: + type: integer + description: The total number of the all data + offset: + type: integer + description: 'Pagination offset default: 0' + minimum: 0 + exclusiveMinimum: false + default: 0 + limit: + type: integer + description: 'Pagination limit default: 10' + minimum: 1 + maximum: 250 + example: 10 + default: 10 + message: + type: string + examples: + example-1: + value: + code: 0 + data: + - id: 0 + name: string + email: string + storeHash: string + token: string + eventChannel: string + meta: + pagination: + totalCount: 0 + offset: 0 + limit: 10 + message: string + application/xml: + schema: + type: object + properties: {} + examples: + example-1: + value: {} + operationId: get-backend-tokens + description: Get all Server to Server OpenAPI tokens + parameters: + - schema: + type: integer + default: 10 + in: query + name: limit + description: Pagination limit + - schema: + type: integer + default: 0 + in: query + name: offset + description: Pagination offset + /auth/storefront: + get: + summary: Get a StoreFront OpenAPI AuthToken + tags: + - Auth + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - token + properties: + token: + type: string + minLength: 1 + description: Your storefront token + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYjJjX29yZGVyX2ltcG9ydEBxcS5jb21tIiwic3RvcmVfaGFzaCI6ImYyb3N4ampueGoiLCJkYiI6ImRlZmF1bHQifQ.L_u_enljWoYBbPPskmYEQVHldHIaTcWMIB-SdFah850 + meta: + message: SUCCESS + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 401 + data: + errMsg: Invalid token header. No credentials provided. + meta: + message: Invalid token header. No credentials provided. + operationId: get-auth-storefront + description: Get a storeFront openAPI authToken + parameters: + - schema: + type: string + in: query + name: jwtToken + description: BC JWT token + required: true + - schema: + type: string + in: query + name: channelId + description: The BigCommerce channel id. Do not use this parameter if you do not have opened multi-storefront + security: [] + /auth/customers: + post: + summary: Get StoreFront authToken with Credentials + operationId: post-auth-customer + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + name: test9 + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8yNzZAc25hcG1haWwuY2MiLCJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsIm5hbWUiOiJ0ZXN0OSIsImNoYW5uZWxfaWRzIjpbMV0sInRva2VuX3R5cGUiOjMsIm5iZiI6MTAwMCwiZXhwIjoyMDAxfQ.EiR__LVAlBVNYtFCZPWJYoPv6UfGiXtULxhK-BCQZjY + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - name + - token + properties: + name: + type: string + minLength: 1 + description: The token name + token: + type: string + minLength: 1 + description: Your token + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + name: test9 + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8yNzZAc25hcG1haWwuY2MiLCJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsIm5hbWUiOiJ0ZXN0OSIsImNoYW5uZWxfaWRzIjpbMV0sInRva2VuX3R5cGUiOjMsIm5iZiI6MTAwMCwiZXhwIjoyMDAxfQ.EiR__LVAlBVNYtFCZPWJYoPv6UfGiXtULxhK-BCQZjY + meta: + message: SUCCESS + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + storeHash: '{{store_hash}}' + email: kido276@snapmail.cc + password: test12345 + channelId: 1 + name: test9 + beginAt: 1000 + endAt: 2001 + properties: + storeHash: + type: string + minLength: 1 + description: Your store unique store_hash + email: + type: string + minLength: 1 + description: BC customer email + password: + type: string + minLength: 1 + description: BC customer password + channelId: + type: number + description: BigCommerce channel id + name: + type: string + minLength: 1 + description: The token name if you want to specfiy + required: + - storeHash + - email + - password + - channelId + - name + examples: + example-1: + value: + storeHash: string + email: axe@snapmail.cc + password: test12345 + channelId: 1 + name: test + beginAt: 1000 + endAt: 1721930486 + description: '' + description: BC customer get a authentication token + tags: + - Auth + security: [] + parameters: [] + /auth/customers/storefront: + post: + summary: Get B2B storefront token + operationId: post-auth-customers-storefront + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + token: + type: string + meta: + type: object + properties: + message: + type: string + examples: + Example 1: + value: + code: 200 + data: + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6IjEyM0AxMi5jb20iLCJiY19jdXN0b21lcl9pZCI6MzEzLCJzdG9yZV9oYXNoIjoiaW1rOHp6N2ppcCIsImRiIjoiZGVmYXVsdCIsImJjX2NoYW5uZWxfaWQiOjEsImV4cCI6MTY5MDg1NDI5Mn0.97rY-1aGDFKtLbIePR5g202AHZJ0x2kDjmyzGVGK45 + meta: + message: success + description: Get B2B storefront token by v3 io token + requestBody: + content: + application/json: + schema: + type: object + properties: + customerId: + type: integer + description: BigCommerce customer id. + channelId: + type: integer + description: BigCommerce channel id + required: + - customerId + examples: + Example 1: + value: + customerId: 999 + channelId: 1 + tags: + - Auth +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] diff --git a/docs/b2b-edition/specs/api-v3/channel/channel.yaml b/docs/b2b-edition/specs/api-v3/channel/channel.yaml new file mode 100644 index 000000000..fe0ef4b4f --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/channel/channel.yaml @@ -0,0 +1,208 @@ +openapi: 3.0.0 +info: + title: channel + version: '1.0' + description: Related with BigCommerce store channels. Only support 'bigcommerce' paltform and 'storefront' type. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +paths: + /channels: + get: + summary: Get store channels + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: + $ref: '#/components/schemas/Channel' + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 200 + data: + - id: 1 + channelId: 1 + channelName: msf2 + createdAt: 1645582457 + updatedAt: 1645582457 + type: storefront + platform: bigcommerce + status: active + site: 'https://msfbeta2.mybigcommerce.com' + isVisible: true + isEnabled: true + meta: + message: SUCCESS + '422': + description: Unprocessable Entity (WebDAV) + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 422 + data: + errMsg: Multi storefront is not enabled + meta: + message: Multi storefront is not enabled + operationId: get-channels + description: get store chennels + security: + - authToken: [] + '/channels/{channelId}': + parameters: + - schema: + type: number + name: channelId + in: path + required: true + description: BigCommerce channel id + get: + summary: Get a store channel + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + $ref: '#/components/schemas/Channel' + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 200 + data: + id: 1 + channelId: 1 + channelName: msf2 + createdAt: 1645582457 + updatedAt: 1645582457 + type: storefront + platform: bigcommerce + status: active + site: 'https://msfbeta2.mybigcommerce.com' + isVisible: true + isEnabled: true + meta: + message: SUCCESS + operationId: get-channels-channelId + description: Get a store chennel +components: + schemas: + Channel: + type: object + x-examples: + example-1: + id: 1 + channelId: 1 + channelName: msf2 + createdAt: 1645582457 + updatedAt: 1645582457 + type: storefront + platform: bigcommerce + status: active + site: 'https://msfbeta2.mybigcommerce.com' + isVisible: true + isEnabled: true + properties: + id: + type: number + description: B2B Edition channel id + channelId: + type: number + description: BigCommerce channel id + channelName: + type: string + minLength: 1 + description: Channel name + createdAt: + type: number + description: The time stamp channel was created + updatedAt: + type: number + description: The time stamp channel was updated + type: + type: string + minLength: 1 + description: 'The channel type, only support "storefront" now.' + platform: + type: string + minLength: 1 + description: 'The channel platform, only support "bigcommerce" now' + status: + type: string + minLength: 1 + description: Channel status + enum: + - prelaunch + - active + - inactive + - archived + - deleted + site: + type: string + minLength: 1 + description: ' The domain associated with a channel' + isVisible: + type: boolean + isEnabled: + type: boolean + required: + - id + - channelId + - channelName + - createdAt + - updatedAt + - type + - platform + - status + - site + - isVisible + - isEnabled + x-internal: false + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +tags: + - name: channel diff --git a/docs/b2b-edition/specs/api-v3/company/company.yaml b/docs/b2b-edition/specs/api-v3/company/company.yaml new file mode 100644 index 000000000..77ddc2bca --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/company/company.yaml @@ -0,0 +1,3083 @@ +openapi: 3.0.1 +info: + title: Company + description: 'The company of BigCommerce B2B Edition corresponds to the customer group of BigCommerce one by one, and the mapping is done through field of bc_group_id. The established corresponding relationship cannot be changed and can only be deleted together. Different customer groups do not support merging in BigCommerce. The same is true for different BigCommerce B2B Edition Company. This is a simple entity diagram of customer groups and company. ![Company entity diagram](https://user-images.githubusercontent.com/81215728/124566045-424fd480-de75-11eb-8268-a15ae40fb579.jpg) The best practices to use company OpenAPI is maintaining unidirectional data flow. The operation of BigCommerce customer groups data update (add, update and delete) is completed by BigCommerce B2B Editionʼs OpenAPI operation company.' + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +security: + - authToken: [] +tags: + - name: Company + description: New version company docs + - name: Company Roles and Permissions +paths: + /companies: + get: + tags: + - Company + summary: Get Companies + description: Get all companies list + operationId: get-companies + parameters: + - name: limit + in: query + description: Pagination limit + schema: + type: integer + default: 10 + - name: offset + in: query + description: Pagination offset + schema: + type: integer + default: 0 + - name: minModified + in: query + description: Minimum modified timestamp + allowEmptyValue: true + schema: + type: number + format: time + - name: maxModified + in: query + description: Maximum modified timestamp + allowEmptyValue: true + schema: + type: number + - name: minCreated + in: query + description: Minimum created timestamp + allowEmptyValue: true + schema: + type: number + - name: maxCreated + in: query + description: Maximum created timestamp + allowEmptyValue: true + schema: + type: number + - name: sortBy + in: query + description: The response sorted by which field + schema: + type: string + default: updatedAt + enum: + - companyName + - updatedAt + example: updatedAt + - name: orderBy + in: query + description: "Allow: 'DESC', 'ASC'" + schema: + type: string + default: DESC + enum: + - ASC + - DESC + example: DESC + - name: isIncludeExtraFields + in: query + description: Is show extra fields in the response + schema: + type: string + default: '0' + enum: + - '0' + - '1' + - name: companyStatus + in: query + description: '0: PENDING 1: APPROVED 2: REJECTED 3: INACTIVE' + schema: + type: integer + enum: + - 0 + - 1 + - 2 + - 3 + - name: q + in: query + description: Company query string + schema: + type: string + - name: extraFields + in: query + description: 'Company query extra fields, you can use this value to filter the company list.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5 and other customizable) This value may be passed into the custom extra field configured by the B3 team when you create the company. If you clearly know the correspondence between the custom extra field and the default extra field, you can use the default extra field filter to obtain data, Of course, you can also filter by key-value pairs passed into custom fields. eg. https://api-b2b.bigcommerce.com/api/v2/io/companies/?extraFields=extraInt1:1&extraFields=companyTax:un42' + style: form + explode: false + schema: + type: array + - schema: + type: integer + example: 2 + in: query + name: bcOrderId + description: 'Company purchase bc order id, allow you found company by bc order id' + - schema: + type: string + in: query + name: orderId + description: Company purchase order id + - schema: + type: string + in: query + name: bcGroupId + description: BigCommerce customer group id + - schema: + type: integer + in: query + name: customerId + description: 'BigCommerce customer id, this customer should be a B2B company user' + - schema: + type: string + enum: + - search + - exact-match + default: search + in: query + name: extraFieldFilterType + description: 'extra field filter type. The search filter type allows for partial matches, while the exact-match filter type only returns results that exactly match the specified criteria.' + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + minItems: 0 + uniqueItems: true + type: array + items: + type: object + properties: + companyId: + minLength: 1 + type: string + companyName: + minLength: 1 + type: string + bcGroupName: + minLength: 1 + type: string + companyStatus: + minLength: 1 + type: string + enum: + - '0' + - '1' + - '2' + - '3' + description: Status of a company + companyEmail: + type: string + description: The email of the company + format: email + companyPhone: + type: string + description: The phone number of the company + format: phone + uuid: + type: string + catalogId: + type: string + description: The company catalog ID + catalogName: + type: string + description: The company catalog name + updatedAt: + minLength: 1 + type: string + createdAt: + minLength: 1 + type: string + extraFields: + type: array + description: Controlled by isIncludeExtraFields params + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + labelName: + type: string + description: Field label name + isRequired: + type: string + description: 'Is field required or not, 0=not required, 1=required' + enum: + - '0' + - '1' + dataType: + type: string + description: 'Field data type, 0=text, 1=number, 2=textarea, 3=dropdown' + enum: + - '0' + - '1' + - '2' + - '3' + fieldType: + type: number + description: 'Field data type, 0=text, 1=number, 2=textarea, 3=dropdown' + enum: + - 0 + - 1 + - 2 + - 3 + required: + - fieldName + - fieldValue + - labelName + - isRequired + - dataType + - fieldType + extraInt1: + type: integer + description: Extra field of this order + example: 42 + extraInt2: + type: integer + description: Extra field of this order + example: 42 + extraInt3: + type: integer + description: Extra field of this order + example: 42 + extraInt4: + type: integer + description: Extra field of this order + example: 42 + extraInt5: + type: integer + description: Extra field of this order + example: 42 + extraStr1: + type: string + description: Extra string field of this order + example: customize additional information + extraStr2: + type: string + description: Extra string field of this order + example: customize additional information + extraStr3: + type: string + description: Extra string field of this order + example: customize additional information + extraStr4: + type: string + description: Extra string field of this order + example: customize additional information + extraStr5: + type: string + description: Extra string field of this order + example: customize additional information + bcGroupId: + type: integer + priceListAssign: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + priceListId: + type: integer + description: BC price list ID + priceListName: + type: string + description: BC price list name + channelName: + type: string + description: Store Channel name + required: + - companyId + - companyName + - bcGroupName + - companyStatus + - companyEmail + - companyPhone + - uuid + - catalogId + - catalogName + - updatedAt + - createdAt + - bcGroupId + meta: + allOf: + - type: object + properties: + message: + minLength: 1 + type: string + required: + - message + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + required: + - code + - data + - meta + examples: + include extra fields: + value: + code: 200 + data: + - companyId: '147340' + companyName: Glam Squad Hair and Makeup Artistry + bcGroupName: Glam Squad Hair and Makeup Artistry + companyEmail: support@bundleb2b.net + companyPhone: '123456789' + companyStatus: '1' + uuid: '' + catalogId: '' + catalogName: '' + updatedAt: '1618794615' + createdAt: '1618787774' + extraFields: + - dataType: '2' + fieldType: 2 + fieldName: extraStr1 + fieldValue: extra_text + isRequired: '0' + labelName: Enter your license + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + bcGroupId: 0 + meta: + message: SUCCESS + pagination: + limit: 4 + offset: 1 + totalCount: 989 + standard response: + value: + code: 200 + data: + - companyId: '147340' + companyName: Glam Squad Hair and Makeup Artistry + bcGroupName: Glam Squad Hair and Makeup Artistry + companyEmail: support@bundleb2b.net + companyPhone: '123456789' + companyStatus: '1' + uuid: '' + catalogId: '' + catalogName: '' + updatedAt: '1618794615' + createdAt: '1618787774' + bcGroupId: 0 + meta: + message: SUCCESS + pagination: + limit: 10 + offset: 1 + totalCount: 989 + 200-Response-IncludeExtraFields: + example: + code: 200 + data: + - companyId: '147340' + companyName: Glam Squad Hair and Makeup Artistry + companyStatus: '1' + uuid: '' + catalogId: '' + catalogName: '' + updatedAt: '1618794615' + createdAt: '1618787774' + extraFields: + - dataType: '2' + fieldName: extraStr1 + fieldValue: extra_text + isRequired: '0' + labelName: Enter your license + meta: + message: SUCCESS + pagination: + limit: 1 + offset: 1 + totalCount: 989 + 200-Standard Response: + example: + code: 200 + data: + - companyId: '147340' + companyName: Glam Squad Hair and Makeup Artistry + companyStatus: '1' + uuid: '' + catalogId: '' + catalogName: '' + updatedAt: '1618794615' + createdAt: '1618787774' + meta: + message: SUCCESS + pagination: + limit: 1 + offset: 1 + totalCount: 989 + security: + - authToken: [] + post: + tags: + - Company + summary: Create a Company + description: Create a company + operationId: post-companies + requestBody: + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + - type: object + required: + - companyName + - companyPhone + - companyEmail + - country + - adminFirstName + - adminLastName + - adminEmail + properties: + companyName: + minLength: 1 + type: string + description: The company name you want to specify + companyPhone: + type: string + companyEmail: + type: string + minLength: 1 + format: email + addressLine1: + type: string + addressLine2: + type: string + city: + minLength: 1 + type: string + state: + minLength: 1 + type: string + country: + minLength: 1 + type: string + description: |- + Country full name or ISO2 country code. For Example: + + A Country full name: Afghanistan + + ISO2 Country code: AF + zipCode: + type: string + adminFirstName: + minLength: 1 + type: string + description: The company first admin user fist name + adminLastName: + minLength: 1 + type: string + description: The company first admin user's last name + adminEmail: + type: string + minLength: 1 + description: The company first admin user email + format: email + adminPhoneNumber: + minLength: 1 + type: string + description: The company first admin user phone number + catalogId: + minLength: 1 + type: integer + description: BC price list Id that company related + acceptCreationEmail: + type: boolean + description: 'True: Will send email company creation notification to admin user; False: Will not send' + default: false + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + examples: + example-1: + value: + companyName: string + companyPhone: string + companyEmail: user@example.com + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + adminFirstName: string + adminLastName: string + adminEmail: user@example.com + adminPhoneNumber: string + catalogId: 0 + acceptCreationEmail: false + extraFields: + - fieldName: string + fieldValue: string + uuid: string + channelIds: + - 1 + - 2 + originChannelId: 1 + responses: + '200': + description: Created + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: integer + data: + type: object + required: + - companyId + - customerId + - customerGroupId + properties: + companyId: + type: integer + customerId: + type: integer + customerGroupId: + type: integer + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + companyId: 1 + customerId: 1 + customerGroupId: 1 + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 400 + data: {} + meta: + message: Create BC customer group failed + '422': + description: 'Company was not valid. This is the result of missing required fields, or of invalid data. See the response for more details' + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 422 + data: {} + meta: + message: The company name is requird + security: + - authToken: [] + x-codegen-request-body-name: body + '/companies/{companyId}': + get: + tags: + - Company + summary: Get a Company Detail + description: Get a company detail + operationId: get-companies-companyId + parameters: + - name: companyId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + required: + - companyId + - companyName + - bcGroupName + - companyStatus + - companyEmail + - companyPhone + - uuid + - catalogId + - catalogName + - updatedAt + - createdAt + - extraFields + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + bcGroupName: + type: string + minLength: 1 + companyStatus: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + companyPhone: + type: string + minLength: 1 + uuid: + type: string + catalogId: + type: string + catalogName: + type: string + updatedAt: + type: string + minLength: 1 + createdAt: + type: string + minLength: 1 + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + dataType: + type: string + minLength: 1 + fieldName: + type: string + minLength: 1 + fieldValue: + type: string + minLength: 1 + isRequired: + type: string + minLength: 1 + labelName: + type: string + minLength: 1 + required: + - dataType + - fieldName + - fieldValue + - isRequired + - labelName + priceListAssign: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + priceListId: + type: integer + description: BC price list ID + priceListName: + type: string + description: BC price list name + channelName: + type: string + description: Store Channel name + bcGroupId: + type: string + description: BigCommerce customer group id + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + companyId: '147340' + companyName: Glam Squad Hair and Makeup Artistry + companyEmail: support@bundleb2b.net + companyPhone: '123456789' + companyStatus: '1' + uuid: '' + catalogId: '' + catalogName: '' + updatedAt: '1618794615' + createdAt: '1618787774' + extraFields: + - dataType: '2' + fieldName: extraStr1 + fieldValue: extra_text + isRequired: '0' + labelName: Enter your license + bcGroupId: '1' + bcGroupName: salons + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + example-1: + example: + code: 404 + data: {} + meta: + message: This resource is not found + security: + - authToken: [] + put: + tags: + - Company + summary: Update a Company + description: Update a company's attributes + operationId: put-companies-companyId + parameters: + - name: companyId + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + companyName: + minLength: 1 + type: string + companyPhone: + type: string + companyEmail: + minLength: 1 + type: string + addressLine1: + type: string + addressLine2: + type: string + city: + minLength: 1 + type: string + state: + minLength: 1 + type: string + country: + minLength: 1 + type: string + description: |- + Country full name or ISO2 country code. For Example: + + A Country full name: Afghanistan + + ISO2 Country code: AF + zipCode: + type: string + extraFields: + minItems: 1 + uniqueItems: true + type: array + description: |- + To use customized extra fields with field names you need to first add company extra fields in Settings > Extra fields inside B2B edition. + + eg. If you want to create a new company with an extra integer field named licenseNO, you can use this structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}] in the request body. + items: + type: object + properties: + fieldName: + minLength: 1 + type: string + description: Field name that config in you store by the B3 team + fieldValue: + minLength: 1 + type: string + description: Field value that you want to add + uuid: + type: string + description: Company UUID indicates external ID + priceListAssign: + type: array + description: This field is only enable for MSF store + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + priceListId: + type: integer + description: BC price list ID + required: false + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + meta: + type: object + properties: + message: + type: string + example: Success + data: + description: Return company ID. + type: object + properties: + companyId: + type: integer + example: 1 + required: + - code + - meta + - data + examples: + example-1: + value: + code: 200 + data: + companyId: 12 + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + example-1: + example: + code: 404 + data: {} + meta: + message: This resource is not found + application/xml: + schema: + type: object + properties: {} + security: + - authToken: [] + x-codegen-request-body-name: body + delete: + tags: + - Company + summary: Delete a Company + description: Delete A Company + operationId: delete-companies-companyId + parameters: + - name: companyId + in: path + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: integer + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + examples: + example-1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + '404': + description: Not Found + content: + application/json: + schema: + type: object + description: '' + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + minLength: 1 + type: string + required: + - code + - data + - meta + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: string + example-1: + example: + code: 404 + data: {} + meta: + message: This resource is not found + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/companyId' + '/customer-groups/{customerGroupId}/companies': + post: + tags: + - Company + summary: Convert from BigCommerce CustomerGroup into Company + description: Create company from bigCommerce customer group. This API is disabled for MSF store + operationId: post-companies-conversion-customerGroups + parameters: + - name: customerGroupId + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + companyName: + type: string + minLength: 1 + description: Company name + companyPhone: + type: string + minLength: 1 + description: Company phone number + companyEmail: + type: string + minLength: 1 + description: Company email + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + adminFirstName: + type: string + minLength: 1 + adminLastName: + type: string + minLength: 1 + adminEmail: + type: string + minLength: 1 + adminPhoneNumber: + type: string + minLength: 1 + catalogId: + type: integer + description: The company catalog ID + acceptCreationEmail: + type: boolean + description: If the company creation can accept email + default: false + required: + - companyName + - companyPhone + - companyEmail + - country + - adminEmail + - adminPhoneNumber + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + examples: + example-1: + value: + companyName: string + companyPhone: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + catalogId: 0 + acceptCreationEmail: false + description: String + extraFields: + - fieldName: string + fieldValue: string + responses: + '200': + description: OK + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: integer + data: + required: + - companyId + type: object + properties: + companyId: + minLength: 1 + type: string + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 200 + data: + companyId: '12' + meta: + message: SUCCESS + example-1: + example: + code: 200 + data: + companyId: '147340' + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + required: + - companyId + type: object + properties: + companyId: + minLength: 1 + type: string + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 200 + data: + companyId: '12' + meta: + message: SUCCESS + example-1: + example: + code: 400 + data: {} + meta: + message: Convert failed for the API call. + '404': + description: Not Found + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + example-1: + example: + code: 404 + data: {} + meta: + message: This resource is not found + security: + - authToken: [] + /companies/bulk: + parameters: [] + post: + summary: Bulk Create Companies + operationId: post-companies-bulk + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: integer + example: 200 + meta: + type: array + items: + type: object + properties: + companyId: + type: integer + example: 1 + data: + type: object + properties: + id: + type: string + description: Unique numeric ID of this Address. + required: + - id + required: + - code + - meta + examples: + example-1: + value: + code: 200 + meta: + - companyId: 1 + data: + id: string + '400': + description: 'Bad Request, some companies created failed.' + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + data: {} + meta: + message: string + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + minItems: 1 + uniqueItems: true + type: array + items: + type: object + properties: + id: + minLength: 1 + type: string + _detail: + type: string + required: + - id + - _detail + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + example: Success + required: + - code + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + example-1: + example: + code: 400 + data: + errors: + - id: '42' + detail: '' + meta: + message: 'Some companies updated failed, you can see these in errors' + '409': + description: 'Company was in conflict with another company. This is the result of duplicate unique values; A missing or invalid `companyEmail`, `phoneNumber` or other extraFields' + content: + application/json: + schema: + type: object + description: '' + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + minItems: 1 + uniqueItems: true + type: array + items: + type: object + properties: + id: + minLength: 1 + type: string + _detail: + type: string + required: + - id + - _detail + meta: + type: object + required: + - message + properties: + message: + minLength: 1 + type: string + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + example-1: + example: + code: 409 + data: + errors: + - id: '42' + detail: '' + meta: + message: Company was in conflict with another company + '413': + description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + examples: + example-1: + value: + code: 413 + meta: + message: Request Entity Too Large + data: {} + '422': + description: Company was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - type: object + properties: + id: + type: string + minLength: 1 + _detail: + type: string + minLength: 1 + required: + - id + - _detail + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + description: Bulk create companies + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml + - type: object + properties: + acceptWelcomeEmail: + type: boolean + description: is send email to company user when company created + example: false + extraFields: + type: object + description: extra fieds you want to add to the company fields + properties: + fieldName: + type: string + fieldValue: + type: string + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + examples: + example-1: + value: + - companyName: string + companyPhone: string + companyEmail: string@gmail.com + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + catalogId: string + uuid: string + acceptWelcomeEmail: false + channelIds: + - 1 + - 2 + originChannelId: 1 + description: Bulk create companies request body + tags: + - Company + put: + tags: + - Company + summary: Update Companies (Batch) + description: Batch update companies + operationId: put-companies + requestBody: + content: + application/json: + schema: + minItems: 1 + type: array + description: The bulk update companies list + items: + type: object + properties: + companyId: + minLength: 1 + type: string + companyName: + minLength: 1 + type: string + companyPhone: + type: string + companyEmail: + minLength: 1 + type: string + addressLine1: + type: string + addressLine2: + type: string + city: + minLength: 1 + type: string + state: + minLength: 1 + type: string + country: + minLength: 1 + type: string + zipCode: + type: string + extraFields: + minItems: 1 + uniqueItems: true + type: array + items: + type: object + properties: + fieldName: + minLength: 1 + type: string + fieldValue: + minLength: 1 + type: string + priceListAssign: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + priceListId: + type: integer + description: BC price list ID + required: + - companyId + examples: + example-1: + value: + - companyId: string + companyName: string + companyPhone: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + extraFields: + - fieldName: string + fieldValue: string + required: false + responses: + '200': + description: Company Update Success + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + required: + - companyId + type: object + properties: + companyId: + minLength: 1 + type: string + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: + companyId: string + meta: + message: string + example-1: + example: + code: 200 + data: + companyId: '147340' + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + example-1: + example: + code: 400 + data: {} + meta: + message: Convert failed for the API call. + '404': + description: Not Found + content: + application/json: + schema: + required: + - code + - data + - meta + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + required: + - message + type: object + properties: + message: + minLength: 1 + type: string + description: '' + examples: + example-1: + value: + code: 0 + data: {} + meta: + message: string + example-1: + example: + code: 404 + data: {} + meta: + message: This resource is not found + '413': + description: Request Entity Too Large + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + security: + - authToken: [] + x-codegen-request-body-name: body + '/companies/{companyId}/catalogs': + parameters: + - $ref: '#/components/parameters/companyId' + put: + summary: Update a Company's Catalog + operationId: put-companies-companyId-catalog + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + companyId: + type: string + minLength: 1 + required: + - companyId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + companyId: '147340' + meta: + message: SUCCESS + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + catalogId: + type: string + minLength: 1 + description: The catalog ID you want to update + required: + - catalogId + examples: + example-1: + value: + catalogId: string + description: '' + description: Update a company's catalog. + tags: + - Company + '/companies/{companyId}/status': + parameters: + - $ref: '#/components/parameters/companyId' + put: + summary: Update a Company's Status + operationId: put-companies-companyId-status + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + companyId: + type: string + minLength: 1 + required: + - companyId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + companyId: '147340' + meta: + message: SUCCESS + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + companyStatus: + type: number + description: |- + Company status you want to set + 0: PENDING 1: APPROVED 2: REJECTED 3: INACTIVE 4: DELETED + required: + - companyStatus + examples: + example-1: + value: + companyStatus: 1 + description: Update a company's status + tags: + - Company + /companies/extra-fields: + get: + summary: Get company extra field configs + tags: + - Company + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - title: response-object + description: Response for successful request + type: object + properties: + code: + type: integer + description: Response code of success request. + example: 200 + meta: + type: object + properties: + message: + type: string + example: SUCCESS + x-internal: false + - type: object + properties: + meta: + title: Pagination + type: object + description: Used to response pagination information + properties: + pagination: + type: object + properties: + limit: + type: integer + maximum: 250 + exclusiveMaximum: true + minimum: 1 + exclusiveMinimum: true + description: 'Pagination limit default: 10' + example: 10 + offset: + type: integer + minimum: 0 + description: 'Pagination offset default: 0' + example: 0 + totalCount: + type: integer + example: 998 + description: The total number of the all data + example: + pagination: + limit: 10 + offset: 0 + totalCount: 1 + x-internal: false + data: + type: array + items: + title: extra_fields + type: object + description: Extra Fields + properties: + id: + type: number + description: Unique id + uuid: + type: string + description: UUID of the extra field + fieldName: + type: string + description: Field name that config in you store + fieldType: + type: number + description: >- + Field type of the extra field.0 means text type. 1 means + textarea type. 2 means number type. 3 means dropdown + type. + enum: + - 0 + - 1 + - 2 + - 3 + isRequired: + type: boolean + description: Is this field is required + isUnique: + type: boolean + description: Is the value of this field is unique + visibleToEnduser: + type: boolean + description: Is this field visible to end-user + configType: + type: number + description: >- + Extra field config type.1 means built in. 2 means user + defined. + enum: + - 1 + - 2 + defaultValue: + type: string + description: Default value of this field. + maximumLength: + type: string + description: >- + The maximum length of the value of this field. fieldType + == 0 + numberOfRows: + type: string + description: >- + The maximum number of rows of the value of this field. + fieldType == 1 + maximumValue: + type: string + description: Maximum value of the field value. fieldType == 2 + listOfValue: + type: array + description: >- + List of all optional values for the field value. + fieldType == 3 + items: + type: string + x-internal: false + operationId: get-companies-extra-fields + description: Get company extra field configs + parameters: + - schema: + type: number + in: query + name: offset + description: 'Pagination offset default: 0' + - schema: + type: string + in: query + description: 'Pagination limit default: 10' + name: limit + security: + - authToken: [] + /companies/permissions: + get: + tags: + - Company Roles and Permissions + summary: Get All Company Permissions + description: Get all company permissions + operationId: get-stores-companies-permissions + parameters: + - name: q + in: query + schema: + type: string + description: search by permission name + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: tkd806l6sp85s + default: 200 + data: + type: array + x-stoplight: + id: dvelk7dyckvfv + items: + x-stoplight: + id: cpxubh8agzme4 + type: object + properties: + id: + type: integer + x-stoplight: + id: pdf1h2175djxl + name: + type: string + x-stoplight: + id: lsuhr6erkvbfv + description: The permission name + description: + type: string + x-stoplight: + id: qrc23ecrewfpf + description: The permission description + code: + type: string + x-stoplight: + id: 5ufcc4xw8b7la + description: The permission code + isCustom: + type: boolean + x-stoplight: + id: pyaz088347b77 + description: Whether the permission is custom + moduleName: + type: string + x-stoplight: + id: 45o1bg3ohj24b + description: The name of the module to which the permission belongs + meta: + type: object + x-stoplight: + id: oswkodks6amvb + properties: + message: + type: string + x-stoplight: + id: g9anf5jqggjek + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + - id: 1 + name: Get addresses + description: Get addresses + code: get_addresses + isCustom: false + moduleName: address + meta: + message: SUCCESS + security: + - authToken: [] + x-internal: false + parameters: [] + post: + summary: Create Company Permission + operationId: post-stores-companies-permissions + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: kpwn27gg4b1p9 + default: 200 + data: + type: object + x-stoplight: + id: ex611ljl6wjuq + properties: + id: + type: integer + x-stoplight: + id: vve44fhaf7hxg + name: + type: string + x-stoplight: + id: v30li7i8gyjp0 + description: The permission name + code: + type: string + x-stoplight: + id: azfgdyoaoxpyr + description: The permission code + description: + type: string + x-stoplight: + id: mds3aym61yosm + description: The permission description + isCustom: + type: boolean + x-stoplight: + id: cufks4wx0eou0 + description: Whether the permission is custom + moduleName: + type: string + x-stoplight: + id: epupvi81hu557 + description: The name of the module to which the permission belongs + meta: + type: object + x-stoplight: + id: 0hp7h2t89sq46 + properties: + message: + type: string + x-stoplight: + id: 4uxj69e5kd4er + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + id: 1 + name: Get addresses + description: Get addresses + code: get_addresses + isCustom: false + moduleName: address + meta: + message: SUCCESS + description: Create company permission + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + x-stoplight: + id: 3ltunpilse743 + maxLength: 200 + description: The permission name + code: + type: string + x-stoplight: + id: ah108y3oezb1g + maxLength: 50 + description: The permission code + description: + type: string + x-stoplight: + id: owp1xr3y95h1c + maxLength: 512 + description: The permission description + moduleName: + type: string + x-stoplight: + id: reqdo1j6gglrv + maxLength: 50 + description: The permission module name + required: + - name + - code + - description + examples: + Example 1: + value: + name: Get addresses + description: Get addresses + code: get_addresses + moduleName: address + description: 'name, code are unique in the same store.' + parameters: [] + tags: + - Company Roles and Permissions + x-internal: false + '/companies/permissions/{permissionId}': + parameters: + - schema: + type: integer + name: permissionId + in: path + required: true + put: + summary: Update Company Permission + operationId: put-stores-companies-permissions-permissionId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: 8ahlss6wl3sve + default: 200 + data: + type: object + x-stoplight: + id: yetu7glqovsyo + properties: + id: + type: integer + x-stoplight: + id: dykkmywtg1z99 + name: + type: string + x-stoplight: + id: 1tdhj5ncsj41p + description: The permission name + code: + type: string + x-stoplight: + id: d4yn8rbpnfu1e + description: The permission code + description: + type: string + x-stoplight: + id: 6olj9c38mv9w4 + description: The permission description + isCustom: + type: boolean + x-stoplight: + id: ctjv4ta4ljhru + description: Whether the permission is custom + moduleName: + type: string + x-stoplight: + id: 4s42w6xufbxjc + description: The name of the module to which the permission belongs + meta: + type: object + x-stoplight: + id: khawlr3n42cht + properties: + message: + type: string + x-stoplight: + id: ok1w3txjw1tkg + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + id: 1 + name: Get addresses + description: Get addresses + code: get_addresses + isCustom: false + moduleName: address + meta: + message: SUCCESS + description: |- + Update company permission + + - Predefined permissions cannot be updated. + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + x-stoplight: + id: raqpw87cjfe39 + maxLength: 200 + description: The permission name + code: + type: string + x-stoplight: + id: 3uusi0a7hl6fs + maxLength: 50 + description: The permission code + description: + type: string + x-stoplight: + id: ni669xyrv247k + maxLength: 512 + description: The permission description + moduleName: + type: string + x-stoplight: + id: bor0fn2a4h0uy + maxLength: 50 + required: + - name + - code + - description + examples: + Example 1: + value: + name: Get addresses + description: Get addresses + code: get_addresses + moduleName: address + description: 'name, code are unique in the same store' + tags: + - Company Roles and Permissions + x-internal: false + delete: + summary: Delete Company Permission + operationId: delete-stores-companies-permissions-permissionId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + data: + type: object + x-stoplight: + id: k8kb5ihx9sfha + code: + type: integer + x-stoplight: + id: c06mjoj73dvht + meta: + type: object + x-stoplight: + id: g8uoxxlbsq54j + properties: + message: + type: string + x-stoplight: + id: sgiuz09vwior0 + examples: + Example 1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + description: |- + Delete company permission + + - Predefined permissions cannot be deleted. + security: + - authToken: [] + tags: + - Company Roles and Permissions + x-internal: false + /companies/roles: + get: + summary: Get Company Roles + tags: + - Company Roles and Permissions + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: vnwpw3r1kh6ly + data: + type: array + x-stoplight: + id: fosrawav0as0t + items: + x-stoplight: + id: 7jenbzn4473yy + type: object + properties: + id: + type: integer + x-stoplight: + id: z3h3px20ik8ka + description: The role id + name: + type: string + x-stoplight: + id: rg90cavwle2bg + description: The role name + roleType: + type: integer + x-stoplight: + id: 42d1k3govhksj + enum: + - 1 - predefined + - 2 - custom + description: The role type + roleLevel: + type: integer + x-stoplight: + id: 1qnm8vdepubsn + enum: + - 1 - store level + description: The role level + required: + - id + - name + - roleType + - roleLevel + meta: + type: object + x-stoplight: + id: xxekbl89ndgip + properties: + message: + type: string + x-stoplight: + id: 2bfod2z2pdb62 + pagination: + type: object + x-stoplight: + id: za17np2r45s1i + properties: + totalCount: + type: integer + x-stoplight: + id: 4384bp8xa7oz0 + limit: + type: integer + x-stoplight: + id: gl1ohwz0ef3ic + offset: + type: integer + x-stoplight: + id: z9v82ygqfz3sy + examples: + Example 1: + value: + code: 200 + data: + - id: 1 + name: io test + roleType: 2 + roleLevel: 1 + meta: + message: success + pagination: + totalCount: 1 + limit: 10 + offset: 0 + operationId: get-stores-companies-roles + description: Get company roles + security: + - authToken: [] + parameters: + - schema: + type: string + in: query + name: q + description: Search by company role name + - schema: + type: integer + default: 0 + in: query + name: offset + description: Pagination offset + - schema: + type: integer + default: 10 + in: query + name: limit + description: Pagination limit + x-internal: false + post: + summary: Create Company Role + operationId: post-stores-companies-roles + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: 2u18iq217751m + data: + type: object + x-stoplight: + id: k9rdl02d0ntii + properties: + id: + type: integer + x-stoplight: + id: vteez52i917gg + description: The role id + name: + type: string + x-stoplight: + id: 9kk7z7qt6pf20 + description: The role name + roleType: + type: integer + x-stoplight: + id: q4gom706sxank + enum: + - 1 - predefined + - 2 - custom + description: The role type + roleLevel: + type: integer + x-stoplight: + id: k2bxlt88j8djm + description: The role level + enum: + - 1 - store level + permissions: + type: array + x-stoplight: + id: ff23hduj62asz + items: + x-stoplight: + id: 3q87taf5es29c + type: object + properties: + id: + type: integer + x-stoplight: + id: wytt7embn9dpp + description: The permission id + code: + type: string + x-stoplight: + id: hl73qdbtivoiv + description: The permission code + permissionLevel: + type: integer + x-stoplight: + id: ajbrfm6bu8hne + description: The permission level + enum: + - 1 - user level + - 2 - company level + meta: + type: object + x-stoplight: + id: r6eo53t14b5r2 + properties: + message: + type: string + x-stoplight: + id: n6884ldx3bjqv + examples: + Example 1: + value: + code: 200 + data: + id: 1 + name: io test + roleType: 2 + roleLevel: 1 + permissions: + - id: 1 + code: get_addresses + permissionLevel: 2 + meta: + message: SUCCESS + description: | + Create company role + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + x-stoplight: + id: c5ywvchzer3od + description: The role name + maxLength: 200 + permissions: + type: array + x-stoplight: + id: h4zvhyamkjskx + items: + x-stoplight: + id: nrk86m71slqq0 + type: object + properties: + code: + type: string + x-stoplight: + id: keysbujgwj3q7 + description: The permission code + permissionLevel: + type: integer + x-stoplight: + id: tw1314yueke8b + description: The permission level + enum: + - 1 - user level + - 2 - company level + required: + - code + - permissionLevel + required: + - name + - permissions + examples: + Example 1: + value: + name: io test + permissions: + - code: get_addresses + permissionLevel: 2 + tags: + - Company Roles and Permissions + x-internal: false + parameters: [] + '/companies/roles/{roleId}': + parameters: + - schema: + type: integer + name: roleId + in: path + required: true + get: + summary: Get Company Role Detail + tags: + - Company Roles and Permissions + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: hx0qsyehm1wzc + data: + type: object + x-stoplight: + id: pgneaszohuxj2 + properties: + id: + type: integer + x-stoplight: + id: k0u84z6h2f3n5 + description: The role id + name: + type: string + x-stoplight: + id: iaia723439udo + description: The role name + roleType: + type: integer + x-stoplight: + id: qek4b7xgecqmh + description: The role type + enum: + - 1 - predefined + - 2 - custom + roleLevel: + type: integer + x-stoplight: + id: g3qzopa3lhbbr + enum: + - 1 - store level + description: The role level + permissions: + type: array + x-stoplight: + id: 3urwsajlu34um + items: + x-stoplight: + id: p3s1pt7dn14sl + type: object + properties: + id: + type: integer + x-stoplight: + id: 3lsw2ehdsuv6p + description: The permission id + code: + type: string + x-stoplight: + id: grkdr749q868t + description: The permission code + permissionLevel: + type: integer + x-stoplight: + id: e60xsjrybid95 + description: The permission level + enum: + - 1 - user level + - 2 - company level + meta: + type: object + x-stoplight: + id: a6311k64rpbj0 + properties: + message: + type: string + x-stoplight: + id: ep3wt4vsinoma + examples: + Example 1: + value: + code: 200 + data: + id: 1 + name: io test + roleType: 2 + roleLevel: 1 + permissions: + - id: 1 + code: get_addresses + permissionLevel: 2 + meta: + message: SUCCESS + operationId: 'get-stores-companies-roles-int:roleId' + description: Get company role detail + security: + - authToken: [] + parameters: [] + x-internal: false + put: + summary: Update Company Role + operationId: put-stores-companies-roles-roleId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: 9x2nutwg143w2 + data: + type: object + x-stoplight: + id: v41nr6bz2brso + properties: + id: + type: integer + description: The role id + name: + type: string + description: The role name + roleType: + type: integer + description: The role type + enum: + - 1 - predefined + - 2 - custom + roleLevel: + type: integer + enum: + - 1 - store level + description: The role level + permissions: + type: array + items: + type: object + properties: + id: + type: integer + description: The permission id + code: + type: string + description: The permission code + permissionLevel: + type: integer + description: The permission level + enum: + - 1 - user level + - 2 - company level + meta: + type: object + x-stoplight: + id: qz7b2k46oetyl + properties: + message: + type: string + x-stoplight: + id: a74ssono1wggh + examples: + Example 1: + value: + code: 200 + data: + id: 1 + name: io test + roleType: 2 + roleLevel: 1 + permissions: + - id: 1 + code: get_addresses + permissionLevel: 2 + meta: + message: SUCCESS + description: |- + Update company role + + - Predefined roles cannot be updated. + - Permissions only support full updates. Please provide all the permission codes required for the role. + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + x-stoplight: + id: zzmc8ckjnqt7h + maxLength: 200 + permissions: + type: array + x-stoplight: + id: 7x2n3ou22dfs1 + description: permission only support full update + items: + x-stoplight: + id: 5i5ykudn167t5 + type: object + properties: + code: + type: string + x-stoplight: + id: 8evqzvawzsghi + description: The permission code + permissionLevel: + type: integer + x-stoplight: + id: poeycbgyot4qv + description: The ermission level + enum: + - 1 - user level + - 2 - company level + required: + - code + - permissionLevel + required: + - name + - permissions + examples: + Example 1: + value: + name: io test + permissions: + - code: get_addresses + permissionLevel: 2 + tags: + - Company Roles and Permissions + x-internal: false + delete: + summary: Delete Company Role + operationId: delete-stores-companies-roles-roleId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: mp78kz0m6y8rd + data: + type: object + x-stoplight: + id: nlkj2dhwb4y39 + meta: + type: object + x-stoplight: + id: 6ii0tzes2zxvr + properties: + message: + type: string + x-stoplight: + id: x9ee1ak53kzzk + examples: + Example 1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + description: |- + Delete company role + + - Predefined roles cannot be deleted. + - Roles associated with users cannot be deleted. + security: + - authToken: [] + parameters: [] + tags: + - Company Roles and Permissions + x-internal: false +components: + securitySchemes: + authToken: + type: apiKey + name: authToken + in: header + parameters: + companyId: + name: companyId + in: path + required: true + schema: + type: integer + description: Unique ID of company entity diff --git a/docs/b2b-edition/specs/api-v3/invoice_management/config/config.yaml b/docs/b2b-edition/specs/api-v3/invoice_management/config/config.yaml new file mode 100644 index 000000000..e78193cf1 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/invoice_management/config/config.yaml @@ -0,0 +1,364 @@ +openapi: 3.0.1 +info: + title: Config + description: BigCommerce B2B Edition Invoice Config + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io/ip' +security: + - authToken: [] +tags: + - name: Config + description: Config +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +paths: + /config: + get: + summary: Get Invoice Portal Configs + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - allMethods + - invoiceEmailTemplate + - isPaymentProcessingEnabled + - payments + - paymentsBigcommerceSalesOrder + - paymentsMinibc + - paymentsOffline + - paymentsTest + - storesBundleb2b + properties: + allMethods: + type: array + uniqueItems: true + minItems: 1 + description: Allow payment methods + items: + type: object + properties: + code: + type: string + minLength: 1 + name: + type: string + minLength: 1 + testMode: + type: boolean + required: + - code + - name + - testMode + invoiceEmailTemplate: + type: object + properties: + html: + type: string + isEnabled: + type: number + title: + type: string + isPaymentProcessingEnabled: + type: object + properties: + isEnabled: + type: number + isStorefrontMethod: + type: number + payments: + type: object + required: + - paymentHoldPolicy + - generalPaymentFees + - statusAfterPaymentIsMade + - invoiceBalanceUpdatePolicy + - onlinePaymentAutomaticInvoiceGeneration + - offlinePaymentAutomaticInvoiceGeneration + properties: + paymentHoldPolicy: + type: number + generalPaymentFees: + type: array + items: + type: object + statusAfterPaymentIsMade: + type: number + invoiceBalanceUpdatePolicy: + type: number + onlinePaymentAutomaticInvoiceGeneration: + type: number + offlinePaymentAutomaticInvoiceGeneration: + type: number + paymentsBigcommerceSalesOrder: + type: object + description: Pay Invoice Online + required: + - isEnabled + - productId + - variantId + - displayName + - allowedMethods + - isStorefrontMethod + properties: + isEnabled: + type: number + productId: + type: number + variantId: + type: number + displayName: + type: string + minLength: 1 + allowedMethods: + type: array + items: + type: object + isStorefrontMethod: + type: number + paymentsMinibc: + type: object + description: '' + required: + - apiKey + - rootUrl + - isEnabled + - displayName + - authorizeOnly + - isStorefrontMethod + properties: + apiKey: + type: string + minLength: 1 + rootUrl: + type: string + minLength: 1 + isEnabled: + type: number + displayName: + type: string + minLength: 1 + authorizeOnly: + type: number + isStorefrontMethod: + type: number + storeId: + type: string + token: + type: string + paymentsOffline: + type: object + description: '' + required: + - isEnabled + - displayName + - isStorefrontMethod + properties: + isEnabled: + type: number + displayName: + type: string + minLength: 1 + isStorefrontMethod: + type: number + paymentsTest: + type: object + description: Test Payment Gateway + required: + - isEnabled + - displayName + - isStorefrontMethod + properties: + isEnabled: + type: number + displayName: + type: string + minLength: 1 + isStorefrontMethod: + type: number + storesBundleb2b: + type: object + required: + - apiKey + - isEnabled + - internalEmail + - internalPassword + properties: + apiKey: + type: string + isEnabled: + type: number + internalEmail: + type: string + internalPassword: + type: string + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + paymentsOffline: + isEnabled: 1 + displayName: Offline Payment + isStorefrontMethod: 0 + paymentsTest: + isEnabled: 0 + displayName: Test Payment Gateway123 + isStorefrontMethod: 1 + payments: + paymentHoldPolicy: 0 + generalPaymentFees: [] + statusAfterPaymentIsMade: 3 + invoiceBalanceUpdatePolicy: 1 + onlinePaymentAutomaticInvoiceGeneration: 0 + offlinePaymentAutomaticInvoiceGeneration: 0 + paymentsBigcommerceSalesOrder: + isEnabled: 1 + productId: 113 + variantId: 78 + displayName: Pay with BigCommerce + allowedMethods: + - testgateway + - cheque + isStorefrontMethod: 1 + storesBundleb2b: + apiKey: '' + isEnabled: 0 + internalEmail: '' + internalPassword: '' + paymentsMinibc: + apiKey: MTIxNy5hcGlfNWYwNGI5xxxxxxxxOTYuMjkxMDAxNTAuMTU5NDE0NTE0NA== + rootUrl: 'https://apps.minibc.com/api/apps/recurring/v1' + isEnabled: 1 + displayName: Credit / Debit Card + authorizeOnly: 0 + isStorefrontMethod: 1 + allMethods: + - code: cheque + name: Check + testMode: false + - code: testgateway + name: Test Payment Gateway + testMode: true + invoiceEmailTemplate: + html: '<p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">Dear Customer,</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">A new invoice for your {store_name} order has been issued.</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">Order Number: {order_number}</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">Invoice Number: {invoice_number}</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">View Invoice: {invoice_detail _url}</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">sssss</p><p style="padding: 0px; margin-top: 10px; line-height: 1.5; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; letter-spacing: 0.12852px; font-size: 16px !important;">Thank you,</p>' + title: You Have a New Store Name Invoice + isEnabled: 1 + isPaymentProcessingEnabled: + isEnabled: 1 + isStorefrontMethod: 0 + meta: + message: SUCCESS + operationId: get-ip-config + description: Get invoice portal configs + parameters: [] + tags: + - Config + x-internal: true + put: + summary: Update Invoice Portal Config + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: array + items: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: [] + meta: + message: SUCCESS + operationId: put-ip-config + description: Update invoice portal config + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + type: object + properties: + visibilityLevel: + type: number + example: 1 + description: 'Reserved field, Default value is "1"' + default: 1 + path: + type: string + description: config name + value: + type: object + description: config value + required: + - visibilityLevel + - path + - value + examples: + example: + value: + data: + - visibilityLevel: 1 + path: test-config + value: + testValue: 1 + description: '' + tags: + - Config + x-internal: true +x-internal: true diff --git a/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml b/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml new file mode 100644 index 000000000..c48d1ea78 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml @@ -0,0 +1,1537 @@ +openapi: 3.0.1 +info: + title: Invoices + description: BigCommerce B2B Edition Invoice + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io/ip' +security: + - authToken: [] +tags: + - name: Invoice + description: Invoice +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + responses: + '404': + description: Example response + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + minLength: 1 + required: + - errMsg + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: + errMsg: Invoice does not exist + meta: + message: Not Found Error + examples: + example-1: + value: + code: 404 + data: + errMsg: Invoice does not exist + meta: + message: Not Found Error +paths: + '/invoices/{invoiceId}': + parameters: + - schema: + type: string + name: invoiceId + in: path + required: true + description: invoice id + get: + summary: Get invoice detail + operationId: get-invoices-invoiceId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/invoice.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - meta + examples: + '200': + value: + code: 200 + data: + id: 9 + customerId: '95075' + externalId: '23' + externalCustomerId: '123' + invoiceNumber: '00000009' + type: Invoice on Shipment + dueDate: 1617675497 + status: 1 + orderNumber: '104' + purchaseOrderNumber: '123' + details: + type: StandardInvoiceDetails + header: + costLines: + - amount: + code: USD + value: '349.5000' + description: Subtotal + - amount: + code: USD + value: '0.0000' + description: Freight + - amount: + code: USD + value: '0.0000' + description: Sales Tax + orderDate: 1616809386 + billingAddress: + city: 成都 + state: District of Columbia + country: United States + street1: tianfuwujie + street2: ruanjianyuan + zipCode: '123' + lastName: xu + firstName: stanton + customFields: {} + customerFields: '123' + shippingAddresses: + - city: 成都 + state: District of Columbia + country: United States + street1: tianfuwujie + street2: ruanjianyuan + zipCode: '123' + lastName: xu + firstName: stanton + customFields: {} + details: + shipments: [] + lineItems: + - sku: DPB + type: physical + comments: '' + quantity: '10' + unitPrice: + code: USD + value: '34.95' + description: '[Sample] Dustpan & Brush' + customFields: {} + unitDiscount: + code: USD + value: '12' + - sku: DD + type: product + comments: '' + quantity: '10' + unitPrice: + code: USD + value: '3' + description: '[Sample] Dustpan ' + customFields: {} + unitDiscount: + code: USD + value: '1' + isPendingPayment: 1 + source: 0 + originalBalance: + code: USD + value: '349.5000' + openBalance: + code: USD + value: '913.4300' + customerName: silk + meta: + message: SUCCESS + example-1: + value: + code: 0 + data: + id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - addressIndex: string + shipDate: string + shipVia: string + trackingNumber: string + comments: string + customFields: {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: USA + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string + createdAt: string + updatedAt: string + channelId: 1 + channelName: string + meta: + message: string + '404': + $ref: '#/components/responses/404' + description: get invoice detail + parameters: [] + tags: + - Invoice + put: + summary: Update an invoice + operationId: put-invoices-invoiceId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - id + properties: + id: + type: number + description: Invoice ID + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 33 + meta: + message: SUCCESS + '400': + value: + code: 400 + meta: + message: Bad Requests Error + errors: 'Please enter a valid number; ' + description: update an invoice + parameters: [] + requestBody: + content: + application/json: + schema: + description: '' + x-examples: + example-1: + id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - addressIndex: string + shipDate: string + shipVia: string + trackingNumber: string + comments: string + customFields: {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: USA + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string + createdAt: string + updatedAt: string + allOf: + - type: object + properties: + customerId: + type: string + minLength: 1 + description: B2B Edition Company ID + externalCustomerId: + type: string + minLength: 1 + description: Ext Customer ID + externalId: + type: string + minLength: 1 + description: Ext Invoice ID + invoiceNumber: + type: string + minLength: 1 + description: 'Invoice Number, must be unique' + type: + type: string + minLength: 1 + dueDate: + type: number + description: Invoice due date + status: + type: number + description: 'invoice status, noted status will be auto set to 2 when open balance is <= 0' + purchaseOrderNumber: + type: string + minLength: 1 + description: PO Number + details: + type: object + description: 'Invoice Details, noted this fields will be overridden by updating, so please get the original details values first before updating with it with entire details data' + properties: + header: + type: object + properties: + costLines: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + amount: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + description: + type: string + minLength: 1 + required: + - amount + - description + billingAddress: + type: object + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + customFields: + type: object + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + - customFields + shippingAddresses: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + details: + type: object + properties: + shipments: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + addressIndex: + type: string + minLength: 1 + shipDate: + type: string + minLength: 1 + shipVia: + type: string + minLength: 1 + trackingNumber: + type: string + minLength: 1 + comments: + type: string + minLength: 1 + required: + - addressIndex + - shipDate + - shipVia + - trackingNumber + - comments + lineItems: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + type: + type: string + minLength: 1 + comments: + type: string + minLength: 1 + quantity: + type: string + minLength: 1 + unitPrice: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + description: + type: string + description: Product description or product name. This field is required for custom product. + minLength: 1 + unitDiscount: + type: object + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + required: + - sku + - quantity + - unitPrice + source: + type: number + description: 'Mark the source of the invoice, 0 for B2B Edition, 1 for external' + originalBalance: + type: object + description: Invoice original balance + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + openBalance: + type: object + description: Invoice balance awaiting for payment + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + createdAt: + type: integer + externalPdfUrl: + type: string + description: The url of your external PDF file. The recommended file size should not exceed 5Mb. Please make sure that your file service has processed CORS. Using empty value if you want to delete it. + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + Update body with details field: + value: + customerId: '3' + dueDate: 1619826907 + details: + header: + costLines: + - amount: + code: USD + value: '400.0000' + description: Subtotal + - amount: + code: USD + value: '0.0000' + description: Freight + - amount: + code: USD + value: '0.0000' + description: Sales Tax + details: + lineItems: + - sku: CLC + type: physical + comments: '' + quantity: 2 + unitPrice: + code: USD + value: '200.0000' + description: '[Sample] Canvas Laundry Cart' + openBalance: + code: USD + value: '12.0000' + Update body without details field: + value: + openBalance: + code: USD + value: '12.0000' + tags: + - Invoice + delete: + summary: Delete an invoice + operationId: delete-invoices-invoiceId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + id: + type: number + description: Invoice ID + meta: + type: object + required: + - message + properties: + message: + type: string + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 12 + meta: + message: Success + '404': + $ref: '#/components/responses/404' + description: delete an invoice + parameters: [] + tags: + - Invoice + /invoices: + post: + summary: Create Invoice + operationId: post-invoices + description: Create Invoice + parameters: [] + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + invoiceNumber: + type: string + description: Invoice no. + type: + type: string + default: Invoice + description: Invoice type + dueDate: + type: integer + description: 'due date, if empty, it will be set to default due date which is current date + pre-configured due days' + status: + type: integer + default: 0 + enum: + - 0 + - 1 + - 2 + description: 'Invoice status 0=Open, 1=Partial paid, 2=Completed, 0 as default, will be auto set to 2 when open balance is <= 0' + orderNumber: + type: string + description: ID in BC of the order to which the current invoice + purchaseOrderNumber: + type: string + description: PO Number + originalBalance: + type: object + description: Original balance + required: + - code + - value + properties: + code: + type: string + description: Currency code + example: USD + value: + type: number + description: Amount + openBalance: + type: object + description: 'Open balance , when it is <= 0, status will be auto set to 2' + required: + - code + - value + properties: + code: + type: string + description: Currency code + example: USD + value: + type: number + description: Amount + issuedAt: + type: number + description: The creation timestamp of the invoice current timestamp as default + details: + type: object + description: Invoice details + properties: + header: + type: object + properties: + costLines: + type: array + description: 'Invoice cost infomation,not required,but if exists, some of the following sub fields will be required, this will be displayed on invoice detail page' + items: + type: object + properties: + amount: + type: object + description: cost amount + required: + - code + - value + properties: + code: + type: string + description: currency code + value: + type: string + description: amount + description: + type: string + description: price description e.g. Subtotal or other types of prices or fees + required: + - amount + - description + billingAddress: + type: object + description: 'Invoice billing address, not required,but if exists, some of the following sub fields will be required' + properties: + city: + type: string + state: + type: string + country: + type: string + street1: + type: string + street2: + type: string + zipCode: + type: string + lastName: + type: string + firstName: + type: string + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + shippingAddresses: + type: array + description: 'Invoice shipping addresses not required,but if exists, some of the following sub fields will be required, but empty string is allowed' + items: + type: object + properties: + city: + type: string + state: + type: string + country: + type: string + street1: + type: string + street2: + type: string + zipCode: + type: string + lastName: + type: string + firstName: + type: string + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + details: + type: object + properties: + shipments: + type: array + description: 'Invoice shipment information, not required,but if exists, some of the following sub fields will be required, but empty string is allowed' + items: + type: object + properties: + addressIndex: + type: string + description: address ID + shipDate: + type: string + description: shipment time + shipVia: + type: string + trackingNumber: + type: string + description: tracking number + comments: + type: string + required: + - addressIndex + - shipDate + - shipVia + - trackingNumber + - comments + lineItems: + type: array + description: 'Invoice products infomation not required,but if exists, some of the following sub fields will be required' + items: + type: object + properties: + sku: + type: string + description: product sku + type: + type: string + description: product type + comments: + type: string + quantity: + type: string + description: product quantity + unitPrice: + type: object + description: product unit price + required: + - code + - value + properties: + code: + type: string + description: currency code + value: + type: string + description: amount + description: + type: string + description: Product description or product name. This field is required for custom product. + unitDiscount: + type: object + description: 'product unit discount not required,but if exists, some of the following sub fields will be required' + properties: + code: + type: string + description: currency code + value: + type: string + description: amount + required: + - code + - value + required: + - sku + - quantity + - unitPrice + source: + type: number + default: 0 + description: 'Source of invoice Mark the source of the invoice, 0 for B2B Edition, 1 for external' + enum: + - 0 + - 1 + customerId: + type: string + description: B2B Edition Company ID + externalId: + type: string + description: ERP Invoice ID + externalCustomerId: + type: string + description: ERP Customer ID + channelId: + type: integer + description: BigCommerce channel id + externalPdfUrl: + type: string + description: The url of your external PDF file. The recommended file size should not exceed 5Mb. Please make sure that your file service has processed CORS + termsConditions: + type: string + description: Terms & Conditions. Visible on the default Invoice PDF. + required: + - invoiceNumber + - originalBalance + - openBalance + - customerId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + Invoice body with details info: + value: + invoiceNumber: '0000001' + dueDate: 1619161808 + status: 0 + originalBalance: + code: USD + value: 100 + openBalance: + code: USD + value: 100 + issuedAt: 1619161808 + details: + header: + costLines: + - amount: + code: USD + value: '90.00' + description: Subtotal + - amount: + code: USD + value: '10.00' + description: Freight + - amount: + code: USD + value: '0.00' + description: Sales Tax + billingAddress: + city: Chengdu + state: Sichuan + country: China + street1: TianFuWuJie + street2: '' + zipCode: '12345' + lastName: Test + firstName: B2B + shippingAddresses: + - city: Chengdu + state: Sichuan + country: China + street1: TianFuWuJie + street2: '' + zipCode: '12345' + lastName: Test + firstName: B2B + details: + lineItems: + - sku: Test-1 + quantity: '2' + unitPrice: + code: USD + value: '40.00' + description: Description is required for custom product + customerId: '12345' + channelId: 1 + Invoice body without details info: + value: + invoiceNumber: '0000001' + originalBalance: + code: USD + value: 100 + openBalance: + code: USD + value: 100 + customerId: '12345' + channelId: 1 + description: '' + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: '200' + data: + type: object + properties: + id: + type: number + description: invoice id + meta: + type: object + properties: + message: + type: string + description: Success + errors: + type: string + examples: + '200': + value: + code: 200 + data: + id: 12 + meta: + message: Success + '400': + value: + code: 400 + data: + errMsg: The invoice number already exist + meta: + message: Bad Requests Error + tags: + - Invoice + parameters: [] + get: + summary: Get invoices + operationId: get-invoices + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/invoice.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + type: object + x-stoplight: + id: pht8y928miqy9 + properties: + message: + type: string + x-stoplight: + id: 2jm99sqmjeuty + pagination: + type: object + x-stoplight: + id: mqkl3sn242e8h + properties: + totalCount: + type: integer + x-stoplight: + id: 9mfisvvpi367o + limit: + type: integer + x-stoplight: + id: orpbdnwbh09j8 + offset: + type: integer + x-stoplight: + id: hhcd4o48fb5k6 + examples: + example: + value: + code: 200 + data: + - id: 33 + customerId: '3' + externalId: '123' + externalCustomerId: '123' + invoiceNumber: '00000033' + type: Invoice on Shipment + dueDate: 1619826907 + status: 0 + orderNumber: '132' + purchaseOrderNumber: '123' + details: + type: StandardInvoiceDetails + header: + costLines: + - amount: + code: USD + value: '400.0000' + description: Subtotal + - amount: + code: USD + value: '0.0000' + description: Freight + - amount: + code: USD + value: '0.0000' + description: Sales Tax + orderDate: 1618246864 + billingAddress: + city: montreal + state: California + country: United States + street1: test + street2: test + zipCode: '111111' + lastName: test + firstName: test + customFields: {} + customerFields: '' + shippingAddresses: + - city: montreal + state: California + country: United States + street1: test + street2: test + zipCode: '111111' + lastName: test + firstName: test + customFields: {} + details: + lineItems: + - sku: CLC + type: physical + comments: '' + quantity: 2 + unitPrice: + code: USD + value: '200.0000' + description: '[Sample] Canvas Laundry Cart' + customFields: {} + unitDiscount: + code: USD + value: 0 + shipments: [] + isPendingPayment: 1 + source: 0 + originalBalance: + code: USD + value: '400.0000' + openBalance: + code: USD + value: '400.0000' + customerName: ABC123 + channelId: 1 + channelName: string + description: get invoices + parameters: + - schema: + type: number + in: query + name: offset + - schema: + type: number + in: query + name: limit + - schema: + type: string + enum: + - DESC + - ASC + example: DESC + in: query + name: orderBy + description: '"DESC" or "ASC"' + - schema: + type: string + enum: + - invoiceNumber + - createdAt + - customerId + - externalCustomerId + - dueDate + - updatedAt + - isPendingPayment + - openBalance + - originalBalance + - status + example: invoiceNumber + in: query + name: sortBy + description: Sort by the field value + - schema: + type: string + enum: + - invoiceNumber + - type + - orderNumber + - purchaseOrderNumber + - customerId + - externalCustomerId + example: invoiceNumber + in: query + name: searchBy + description: Filter by a field + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + in: query + name: customerName + description: Query by invoice B2B Edition company name + - schema: + type: string + in: query + name: customerId + description: Query by invoice B2B Edition company id + - schema: + type: integer + enum: + - 0 + - 1 + - 2 + example: 1 + in: query + name: status + description: Query by invoice status + - schema: + type: string + in: query + name: beginDateAt + description: 'Query by the created time period, with the "endDateAt" parameter' + - schema: + type: string + in: query + name: endDateAt + description: 'Query by the created time period, with the "beginDateAt" parameter' + - schema: + type: array + in: query + name: 'externalId[]' + description: Query by the invoice external ID + - schema: + type: string + enum: + - '0' + - '1' + in: query + name: isIncludeExtraFields + description: Is show extra fields in the response + - schema: + type: array + in: query + name: channelIds + description: BigCommerce channel ids + tags: + - Invoice + /invoices/export: {} + '/orders/{orderId}/invoices': + parameters: + - schema: + type: number + name: orderId + in: path + required: true + description: B2B Edition order id + post: + summary: Create invoice from order + tags: + - Invoice + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - invoiceNumber + - invoiceId + properties: + invoiceNumber: + type: string + minLength: 1 + description: Invoice no. + invoiceId: + type: number + description: Invoice ID + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + invoiceNumber: '00000036' + invoiceId: 36 + meta: + message: SUCCESS + '404': + value: + code: 404 + data: + errMsg: Order does not exist + meta: + message: Not Found Error + operationId: post-orders-orderId-invoices + description: create invoice from B2B Edition order + parameters: [] + '/invoices/{invoiceId}/download-pdf': + parameters: + - schema: + type: string + name: invoiceId + in: path + required: true + get: + summary: invoice download pdf + operationId: get-invoices-invoiceId-download-pdf + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + type: object + properties: + url: + type: string + externalPdfUrl: + type: string + description: The url of your external PDF file. The recommended file size should not exceed 5Mb. Please make sure that your file service has processed CORS + meta: + type: object + properties: + message: + type: string + x-examples: + example-1: + code: 200 + data: + url: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-quote-staging/B3_V3_dev_00000012.pdf' + meta: + message: SUCCESS + examples: {} + '404': + description: Not Found + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + x-examples: + example-1: + code: 404 + data: + errMsg: Invoice does not exist + meta: + message: Not Found Error + tags: + - Invoice + '/invoices/{invoiceId}/send-mail': + parameters: + - schema: + type: string + name: invoiceId + in: path + required: true + /invoices/extra-fields: + get: + summary: Get invoice extra field configs + tags: + - Invoice + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + meta: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + operationId: get-invoices-extra-fields + description: Get invoice extra field configs + parameters: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit diff --git a/docs/b2b-edition/specs/api-v3/invoice_management/payment/payment.yaml b/docs/b2b-edition/specs/api-v3/invoice_management/payment/payment.yaml new file mode 100644 index 000000000..89368c4b7 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/invoice_management/payment/payment.yaml @@ -0,0 +1,1520 @@ +openapi: '3.0.1' +info: + title: PaymentMethod + description: BigCommerce B2B Edition PaymentMethod + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io/ip' +security: + - authToken: [] +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + responses: + '400': + description: Example response + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + minLength: 1 + required: + - errMsg + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 400 + data: + errMsg: The payment operation is not allowed. + meta: + message: Not Found Error + examples: + example-1: + value: + code: 400 + data: + errMsg: The payment operation is not allowed. + meta: + message: Not Found Error + example-2: + value: + code: 400 + data: + errMsg: The payment processing status is not allowed. + meta: + message: Not Found Error + '404': + description: Example response + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + minLength: 1 + required: + - errMsg + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: + errMsg: Payment does not exist + meta: + message: Not Found Error + examples: + example: + value: + code: 404 + data: + errMsg: Payment does not exist + meta: + message: Not Found Error + '422': + description: Example response + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 422 + meta: + message: Parameter Error + data: + lineItems: + - This field is required. + properties: + code: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + data: + type: object + required: + - '{field name}' + properties: + '{field name}': + type: array + items: + type: string + required: + - code + - meta + - data + examples: + example: + value: + code: 422 + meta: + message: Parameter Error + data: + currency: + - Currency is required +paths: + /payments: + get: + summary: Get Payments + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + - id: 117 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + payerName: Check + payerCustomerId: '6041' + details: + memo: k + moduleName: payments_offline + fees: [] + moduleData: + transactions: + - memo: k + type: OfflineTransaction + rawTransaction: null + processingStatus: 3 + appliedStatus: 1 + fundingStatus: 2 + total: + code: GBP + value: '0.7800' + lineItems: + - paymentId: 117 + invoiceId: 141 + invoiceNumber: '00000141' + amount: + code: GBP + value: '0.7800' + customerName: '' + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + payerName: + type: string + minLength: 1 + payerCustomerId: + type: string + minLength: 1 + details: + type: object + properties: + memo: + type: string + minLength: 1 + required: + - memo + moduleName: + type: string + minLength: 1 + fees: + type: array + items: + type: object + moduleData: + type: object + properties: + transactions: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + memo: + type: string + minLength: 1 + type: + type: string + minLength: 1 + rawTransaction: + type: array + nullable: true + items: {} + required: + - memo + - type + required: + - transactions + processingStatus: + type: number + appliedStatus: + type: number + fundingStatus: + type: number + total: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + lineItems: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + paymentId: + type: number + invoiceId: + type: number + invoiceNumber: + type: string + minLength: 1 + amount: + type: object + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + required: + - paymentId + - invoiceId + - invoiceNumber + customerName: + type: string + allowedOperations: + type: array + items: + type: number + allowedStatuses: + type: array + items: + type: number + channelId: + type: string + description: BigCommerce channel id + channelName: + type: string + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - payerName + - payerCustomerId + - moduleName + - processingStatus + - appliedStatus + - fundingStatus + - total + - lineItems + - customerName + meta: + type: object + required: + - pagination + - message + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + - id: 70 + createdAt: 1618800393 + updatedAt: 1618803026 + storeHash: jexy81vb0h + customerId: '95075' + externalId: null + externalCustomerId: null + payerName: Store offline payment + payerCustomerId: '95075' + details: + memo: '' + moduleName: payments_offline + fees: [] + moduleData: {} + processingStatus: 3 + appliedStatus: 1 + fundingStatus: 2 + total: + code: USD + value: '6.0000' + lineItems: + - paymentId: 70 + invoiceId: 26 + amount: + code: USD + value: '6.0000' + customerName: silk + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + - id: 66 + createdAt: 1618590401 + updatedAt: 1618797215 + storeHash: jexy81vb0h + customerId: '3' + externalId: null + externalCustomerId: null + payerName: Store offline payment + payerCustomerId: '3' + details: + memo: 'Check#:12345' + moduleName: payments_offline + fees: [] + moduleData: {} + processingStatus: 2 + appliedStatus: 1 + fundingStatus: 2 + total: + code: USD + value: '30.0000' + lineItems: + - paymentId: 66 + invoiceId: 30 + amount: + code: USD + value: '10.0000' + - paymentId: 66 + invoiceId: 28 + amount: + code: USD + value: '20.0000' + customerName: ABC123 + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + - id: 65 + createdAt: 1618502653 + updatedAt: 1618502653 + storeHash: jexy81vb0h + customerId: '3' + externalId: null + externalCustomerId: null + payerName: Store offline payment + payerCustomerId: '3' + details: + memo: '123456' + moduleName: payments_offline + fees: [] + moduleData: {} + processingStatus: 3 + appliedStatus: 1 + fundingStatus: 2 + total: + code: USD + value: '30.0000' + lineItems: + - paymentId: 65 + invoiceId: 30 + amount: + code: USD + value: '10.0000' + - paymentId: 65 + invoiceId: 28 + amount: + code: USD + value: '20.0000' + customerName: ABC123 + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + channelId: 1 + channelName: string + meta: + pagination: + totalCount: 59 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-payments + description: Get payment list + parameters: + - schema: + type: number + in: query + name: offset + description: Pagination offset + - schema: + type: number + in: query + name: limit + description: Pagination limit + - schema: + type: string + enum: + - DESC + - ASC + example: DESC + in: query + name: orderBy + description: '"DESC" or "ASC"' + - schema: + type: string + example: createdAt + enum: + - moduleName + - processingStatus + - appliedStatus + - createdAt + - customerId + - externalCustomerId + - fundingStatus + - updatedAt + - totalAmount + in: query + name: sortBy + description: Sort by the field value + - schema: + type: string + enum: + - id + - customerId + - externalId + - externalCustomerId + in: query + name: searchBy + description: Filter by a field + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + in: query + name: customerName + description: Query by invoice B2B Edition company name + - schema: + type: number + in: query + name: invoiceId + description: Query by invoice id + - schema: + type: number + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + example: 3 + in: query + name: processingStatus + description: 'payment processing status(0="Incomplete", 1="Awaiting Processing", 2="Processing", 3="Completed", 4="Refunded")' + - schema: + type: array + in: query + name: channelIds + description: BigCommerce channel ids. Do not use this parameter if you do not have opened multi-storefront + '/payments/{paymentId}': + parameters: + - schema: + type: number + name: paymentId + in: path + required: true + description: Payment Id + get: + summary: Get Payment Detail + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + id: 117 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + payerName: Check + payerCustomerId: '6041' + details: + memo: k + moduleName: payments_offline + fees: [] + moduleData: + transactions: + - memo: k + type: OfflineTransaction + rawTransaction: null + processingStatus: 3 + appliedStatus: 1 + fundingStatus: 2 + total: + code: GBP + value: '0.7800' + lineItems: + - paymentId: 117 + invoiceId: 141 + invoiceNumber: '00000141' + amount: + code: GBP + value: '0.7800' + customerName: '' + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - payerName + - payerCustomerId + - details + - moduleName + - fees + - moduleData + - processingStatus + - appliedStatus + - fundingStatus + - total + - lineItems + - customerName + - allowedOperations + - allowedStatuses + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + payerName: + type: string + minLength: 1 + payerCustomerId: + type: string + minLength: 1 + details: + type: object + properties: + memo: + type: string + minLength: 1 + moduleName: + type: string + minLength: 1 + fees: + type: array + items: + type: object + moduleData: + type: object + required: + - transactions + properties: + transactions: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + memo: + type: string + minLength: 1 + type: + type: string + minLength: 1 + rawTransaction: {} + required: + - type + processingStatus: + type: number + appliedStatus: + type: number + fundingStatus: + type: number + total: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + lineItems: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + paymentId: + type: number + invoiceId: + type: number + invoiceNumber: + type: string + minLength: 1 + amount: + type: object + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + required: + - paymentId + - invoiceId + - invoiceNumber + customerName: + type: string + allowedOperations: + type: array + description: |- + allowed payment actions + operation code map as + (0, "Apply to Invoice Balances"), + (1, "Revert Invoice Balances"), + (2, "Pull Updates From Order"), + items: + type: number + allowedStatuses: + type: array + description: |- + allowed payment status + status code should be following + (1, 'Awaiting Processing'), + (2, 'Processing'), + (3, 'Completed'), + (4, 'Refunded'), + items: + type: number + channelId: + type: string + description: BigCommerce channel id + channelName: + type: string + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 20 + createdAt: 1617761431 + updatedAt: 1617762957 + storeHash: jexy81vb0h + customerId: '95075' + externalId: null + externalCustomerId: null + payerName: Hannah Admin + payerCustomerId: '95075' + details: + memo: '' + moduleName: payments_bigcommerce_sales_order + fees: [] + moduleData: + cartId: d0afeab8-ff76-4b4e-867a-0675c0ea6e6e + orderId: 121 + transactions: + - type: UnknownTransaction + rawTransaction: null + processingStatus: 4 + appliedStatus: 0 + fundingStatus: 2 + total: + code: USD + value: '11.0000' + lineItems: + - paymentId: 20 + invoiceId: 9 + amount: + code: USD + value: '11.0000' + customerName: silk + allowedOperations: [] + allowedStatuses: + - 1 + - 2 + - 3 + - 4 + channelId: 1 + channelName: string + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + operationId: get-payments-paymentId + description: Get payment detail + parameters: [] + delete: + summary: Delete a Payment + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - id + properties: + id: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 1 + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + operationId: delete-a-payment + description: Delete a payment + parameters: [] + '/payments/{paymentId}/operations': + parameters: + - schema: + type: number + name: paymentId + in: path + required: true + description: Payment Id + get: + summary: Get a Payment Operations + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - allowedOperations + - allowedStatuses + properties: + allowedOperations: + type: array + description: A list of allowable action codes for current payments + items: {} + allowedStatuses: + type: array + description: The list of states that the current payment allows to modify + items: {} + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + allowedOperations: [] + allowedStatuses: + - '1' + - '2' + - '3' + - '4' + meta: + message: Success + '404': + $ref: '#/components/responses/404' + operationId: get-payment-operations-operations + description: Get a payment all operations + parameters: [] + post: + summary: Performing Payment Operation + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - id + properties: + id: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 4 + meta: + message: SUCCESS + '400': + $ref: '#/components/responses/400' + operationId: post-payments-paymentId-operations + description: Performing payment operation + parameters: [] + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + operationCode: + type: number + description: 'Payment operation code, list of allowed operations of this payment' + enum: + - 0 + - 1 + - 2 + - 3 + example: '0' + required: + - operationCode + examples: + '200': + value: + code: 200 + data: + id: 3 + meta: + message: SUCCESS + description: '' + '/payments/{paymentId}/processing-status': + parameters: + - schema: + type: number + name: paymentId + in: path + required: true + description: Payment Id + put: + summary: Update Payment Processing Status + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - id + properties: + id: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + id: 2 + meta: + message: SUCCESS + '400': + $ref: '#/components/responses/400' + operationId: put-payments-paymentId-processing-status + description: Update payment processing status + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + processingStatus: + type: number + description: 'payment processing status(1="Awaiting Processing", 2="Processing", 3="Completed", 4="Refunded")' + required: + - processingStatus + '/payments/{paymentId}/transactions': + parameters: + - schema: + type: number + name: paymentId + in: path + required: true + description: Payment Id + get: + summary: Get Payment Transactions + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - type: CreditCardTransaction + gateway: test + transactionId: '521263' + authCode: null + event: capture + card: + type: Visa + last4: '1111' + expiryYear: 2050 + expiryMonth: 12 + rawTransaction: null + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + description: 'contains payment transaction information, varies from different payment gateway,depends on payment gateway' + items: + type: object + properties: + type: + type: string + minLength: 1 + gateway: + type: string + minLength: 1 + transactionId: + type: string + minLength: 1 + authCode: + type: string + event: + type: string + minLength: 1 + card: + type: object + properties: + type: + type: string + minLength: 1 + last4: + type: string + minLength: 1 + expiryYear: + type: number + expiryMonth: + type: number + rawTransaction: + type: string + required: + - type + - rawTransaction + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + - type: CreditCardTransaction + gateway: test + transactionId: '521263' + authCode: '' + event: capture + card: + type: Visa + last4: '1111' + expiryYear: 2050 + expiryMonth: 12 + rawTransaction: '' + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + operationId: get-payments-paymentId-transactions + description: Get payment transactions + parameters: [] + /payments/offline: + post: + summary: Create Offline Payment + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + required: + - paymentId + properties: + paymentId: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + paymentId: 112 + meta: + message: SUCCESS + '422': + $ref: '#/components/responses/422' + operationId: post-payments-offline + description: Create offline payment + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + lineItems: + type: array + items: + type: object + properties: + invoiceId: + type: number + amount: + type: string + required: + - invoiceId + - amount + currency: + type: string + details: + type: object + properties: + memo: + type: string + externalId: + type: string + customerId: + type: string + description: B2B Edition Company Id + externalCustomerId: + type: string + payerName: + type: string + default: Store offline payment + description: Default is "Store Offline Payment " if no value is passed in. + payerCustomerId: + type: string + description: The default is the same as the customerId + processingStatus: + type: number + default: 3 + enum: + - 1 + - 2 + - 3 + - 4 + example: 3 + description: 'payment status, 3 as default ' + channelId: + type: integer + description: BigCommerce channel id + required: + - lineItems + - currency + - details + - customerId + examples: + example: + value: + lineItems: + - invoiceId: 13 + amount: '20.00' + currency: USD + details: + memo: Test + customerId: '113' + payerName: Store offline payment + payerCustomerId: '113' + processingStatus: '3' + fundingStatus: '2' + '/payments/offline/{paymentId}': + parameters: + - schema: + type: number + name: paymentId + in: path + required: true + description: Payment Id + put: + summary: Update a Offline Payment + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + paymentId: + type: number + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + errors: + type: string + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + paymentId: 112 + meta: + message: SUCCESS + '422': + $ref: '#/components/responses/422' + operationId: put-payments-offline-paymentId + description: Update offline payment + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + lineItems: + type: array + items: + type: object + properties: + invoiceId: + type: number + amount: + type: string + required: + - invoiceId + - amount + currency: + type: string + details: + type: object + properties: + memo: + type: string + externalId: + type: string + customerId: + type: string + description: B2B Edition Company Id + externalCustomerId: + type: string + payerName: + type: string + default: Store offline payment + description: Default is "Store Offline Payment " if no value is passed in. + payerCustomerId: + type: string + description: The default is the same as the customerId + processingStatus: + type: number + default: 3 + enum: + - 1 + - 2 + - 3 + - 4 + example: 3 + fundingStatus: + type: number + default: 2 + enum: + - 0 + - 1 + - 2 + - 3 + required: + - lineItems + - currency + - details + - customerId + examples: + example: + value: + lineItems: + - invoiceId: 13 + amount: '20.00' + currency: USD + details: + memo: Test + customerId: '113' + payerName: Store offline payment + payerCustomerId: '113' + processingStatus: 3 + fundingStatus: 2 +tags: + - name: Payments diff --git a/docs/b2b-edition/specs/api-v3/invoice_management/receipt/receipt.yaml b/docs/b2b-edition/specs/api-v3/invoice_management/receipt/receipt.yaml new file mode 100644 index 000000000..be3adbfb7 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/invoice_management/receipt/receipt.yaml @@ -0,0 +1,1308 @@ +openapi: '3.0.1' +info: + title: Receipt + description: BigCommerce B2B Edition Invoice Receipt + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io/ip' +security: + - authToken: [] +tags: + - name: Receipt + description: Receipt +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + responses: + '404': + description: Example response + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + minLength: 1 + required: + - errMsg + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: + errMsg: Receipt does not exist + meta: + message: Not Found Error + examples: + example-1: + value: + code: 404 + data: + errMsg: Receipt does not exist + meta: + message: Not Found Error +paths: + /receipts: + get: + summary: Get receipts + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - id: 101 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + payerName: Check + payerCustomerId: '6041' + details: + paymentDetails: + memo: k + transactionType: Paid + paymentType: Offline + referenceNumber: k + paymentId: 117 + total: + code: GBP + value: '0.7800' + - id: 100 + createdAt: 1634785181 + updatedAt: 1634785181 + storeHash: rtmh8fqr05 + customerId: '6046' + externalId: null + externalCustomerId: null + payerName: Check + payerCustomerId: '6046' + details: + paymentDetails: + memo: '1' + transactionType: Paid + paymentType: Offline + referenceNumber: '1' + paymentId: 116 + total: + code: USD + value: '1.0000' + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + payerName: + type: string + minLength: 1 + payerCustomerId: + type: string + minLength: 1 + details: + type: object + properties: + paymentDetails: + type: object + required: + - memo + properties: + memo: + type: string + minLength: 1 + required: + - paymentDetails + transactionType: + type: string + minLength: 1 + paymentType: + type: string + minLength: 1 + referenceNumber: + type: string + minLength: 1 + paymentId: + type: number + total: + type: object + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + required: + - code + - value + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - payerName + - payerCustomerId + - transactionType + - paymentType + - referenceNumber + - paymentId + meta: + type: object + required: + - pagination + - message + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - id: 85 + createdAt: 1630658187 + updatedAt: 1630658187 + storeHash: 1i6zpxpe3g + customerId: '5485' + externalId: '' + externalCustomerId: '' + payerName: k Admin + payerCustomerId: '5485' + details: + paymentDetails: + memo: '' + transactionType: Paid + paymentType: Visa ending in 1111 + referenceNumber: '375026' + paymentId: 92 + total: + code: USD + value: '122.9500' + - id: 84 + createdAt: 1630638069 + updatedAt: 1630638069 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + payerName: Cash + payerCustomerId: '5707' + details: + paymentDetails: + memo: test + transactionType: Paid + paymentType: Offline + referenceNumber: test + paymentId: 91 + total: + code: CNY + value: '0.8900' + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-ip-receipts + parameters: + - schema: + type: integer + exclusiveMinimum: true + minimum: 0 + in: query + name: offset + description: 'Pagination offset default: 0' + style: form + - schema: + type: integer + default: 10 + minimum: 1 + maximum: 250 + in: query + name: limit + description: 'Pagination limit default: 10' + - schema: + type: string + default: DESC + enum: + - DESC + - ASC + in: query + name: orderBy + description: "Allow: 'DESC', 'ASC'" + - schema: + type: string + default: createdAt + enum: + - '"customerId"' + - '"externalCustomerId"' + - '"paymentId"' + - '"total"' + - '"transactionType"' + - '"referenceNumber"' + - '"createdAt"' + - '"updatedAt"' + in: query + name: sortBy + description: The response sorted by which field + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + enum: + - payerName + - referenceNumber + - customerId + - externalId + - externalCustomerId + in: query + name: searchBy + description: The response search by which field + - schema: + type: array + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + in: query + name: 'paymentStatus[]' + description: "Payment processing status. 0 means ‘Incomplete’ status, 1 means ‘Awaiting Processing’ status, 2 means ‘Processing’ status, 3 means ‘Completed’ status, 4 means ‘Refunded' status" + description: 'Get receipts, with pagination data' + tags: + - Receipt + '/receipts/{receiptId}': + parameters: + - schema: + type: string + name: receiptId + in: path + required: true + description: The unique id of receipt + get: + summary: Get a receipt + tags: + - Receipt + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + id: 101 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + payerName: Check + payerCustomerId: '6041' + details: + paymentDetails: + memo: k + transactionType: Paid + paymentType: Offline + referenceNumber: k + paymentId: 117 + total: + code: GBP + value: '0.7800' + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - externalId + - externalCustomerId + - payerName + - payerCustomerId + - details + - transactionType + - paymentType + - referenceNumber + - paymentId + - total + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + payerName: + type: string + minLength: 1 + payerCustomerId: + type: string + minLength: 1 + details: + type: object + required: + - paymentDetails + properties: + paymentDetails: + type: object + required: + - memo + properties: + memo: + type: string + minLength: 1 + transactionType: + type: string + minLength: 1 + paymentType: + type: string + minLength: 1 + referenceNumber: + type: string + minLength: 1 + paymentId: + type: number + total: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + id: 83 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + payerName: Cash + payerCustomerId: '5707' + details: + paymentDetails: + memo: test + transactionType: Paid + paymentType: Offline + referenceNumber: test + paymentId: 90 + total: + code: CNY + value: '1.2000' + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + operationId: get-ip-receipts-receiptId + description: Get a receipt detail + delete: + summary: Delete a receipt + tags: + - Receipt + operationId: delete-ip-receipts-receiptId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response code of success request + data: + type: object + properties: + id: + type: integer + description: The uniqe receipt id + meta: + type: object + properties: + message: + type: string + description: Response message of request + examples: + example-1: + value: + code: 200 + data: + id: 3 + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + description: Delete a receipt + /receipt-lines: + get: + summary: Get all receipt lines + tags: + - Receipt + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - id: 114 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + receiptId: 101 + invoiceId: 141 + amount: + code: GBP + value: '0.7800' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000141' + paymentId: 117 + referenceNumber: k + transactionType: Paid + - id: 113 + createdAt: 1634785181 + updatedAt: 1634785181 + storeHash: rtmh8fqr05 + customerId: '6046' + externalId: null + externalCustomerId: null + receiptId: 100 + invoiceId: 134 + amount: + code: USD + value: '1.0000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000134' + paymentId: 116 + referenceNumber: '1' + transactionType: Paid + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + receiptId: + type: number + invoiceId: + type: number + amount: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + paymentStatus: + type: number + paymentType: + type: string + minLength: 1 + invoiceNumber: + type: string + minLength: 1 + paymentId: + type: number + referenceNumber: + type: string + minLength: 1 + transactionType: + type: string + minLength: 1 + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - externalId + - externalCustomerId + - receiptId + - invoiceId + - amount + - paymentStatus + - paymentType + - invoiceNumber + - paymentId + - referenceNumber + - transactionType + meta: + type: object + required: + - pagination + - message + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - id: 95 + createdAt: 1630658187 + updatedAt: 1630658187 + storeHash: 1i6zpxpe3g + customerId: '5485' + externalId: '' + externalCustomerId: '' + receiptId: 85 + invoiceId: 38 + amount: + code: USD + value: '122.9500' + paymentStatus: 1 + paymentType: Visa ending in 1111 + invoiceNumber: '00000038' + paymentId: 92 + referenceNumber: '375026' + transactionType: Paid + - id: 94 + createdAt: 1630638069 + updatedAt: 1630638069 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 84 + invoiceId: 14 + amount: + code: CNY + value: '0.0900' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000014' + paymentId: 91 + referenceNumber: test + transactionType: Paid + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-ip-receipt-lines + parameters: + - schema: + type: integer + minimum: 0 + in: query + name: offset + description: 'Pagination offset default: 0' + - schema: + type: integer + minimum: 1 + maximum: 250 + default: 10 + in: query + name: limit + description: 'Pagination limit default: 10' + - schema: + type: string + enum: + - DESC + - ASC + default: DESC + in: query + name: orderBy + description: "Allow: 'DESC', 'ASC'" + - schema: + type: array + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + in: query + name: 'paymentStatus[]' + description: "Payment processing status. 0 means ‘Incomplete’ status, 1 means ‘Awaiting Processing’ status, 2 means ‘Processing’ status, 3 means ‘Completed’ status, 4 means ‘Refunded' status" + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + enum: + - customerId + - externalId + - externalCustomerId + - payerName + - payerCustomerId + - referenceNumber + - invoiceId + in: query + name: searchBy + description: The response search by which field + - schema: + type: string + default: createdAt + enum: + - '"customerId"' + - '"externalCustomerId"' + - '"receiptId"' + - '"invoiceId"' + - '"amount"' + - '"createdAt"' + - '"updatedAt"' + in: query + name: sortBy + description: The response sorted by which field + description: 'Get all receipt lines, with pagination data' + '/receipts/{receiptId}/lines': + get: + summary: Get lines of a receipt + tags: + - Receipt + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - id: 114 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + receiptId: 101 + invoiceId: 141 + amount: + code: GBP + value: '0.7800' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000141' + paymentId: 117 + referenceNumber: k + transactionType: Paid + meta: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + receiptId: + type: number + invoiceId: + type: number + amount: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + paymentStatus: + type: number + paymentType: + type: string + minLength: 1 + invoiceNumber: + type: string + minLength: 1 + paymentId: + type: number + referenceNumber: + type: string + minLength: 1 + transactionType: + type: string + minLength: 1 + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - externalId + - externalCustomerId + - receiptId + - invoiceId + - amount + - paymentStatus + - paymentType + - invoiceNumber + - paymentId + - referenceNumber + - transactionType + meta: + type: object + required: + - pagination + - message + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - id: 92 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 83 + invoiceId: 19 + amount: + code: CNY + value: '0.7000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000019' + paymentId: 90 + referenceNumber: test + transactionType: Paid + - id: 91 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 83 + invoiceId: 22 + amount: + code: CNY + value: '0.5000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000022' + paymentId: 90 + referenceNumber: test + transactionType: Paid + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + '404': + $ref: '#/components/responses/404' + operationId: get-ip-lines-of-receipt + parameters: + - schema: + type: integer + minimum: 0 + in: query + name: offset + description: 'Pagination offset default: 0' + - schema: + type: integer + minimum: 1 + maximum: 250 + default: 10 + in: query + name: limit + description: 'Pagination limit default: 10' + - schema: + type: string + enum: + - DESC + - ASC + default: DESC + in: query + name: orderBy + description: "Allow: 'DESC', 'ASC'" + - schema: + type: array + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + in: query + name: 'paymentStatus[]' + description: "Payment processing status. 0 means ‘Incomplete’ status, 1 means ‘Awaiting Processing’ status, 2 means ‘Processing’ status, 3 means ‘Completed’ status, 4 means ‘Refunded' status" + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + enum: + - customerId + - externalId + - externalCustomerId + - payerName + - payerCustomerId + - referenceNumber + - invoiceId + in: query + name: searchBy + description: The response search by which field + - schema: + type: string + default: createdAt + enum: + - '"customerId"' + - '"externalCustomerId"' + - '"receiptId"' + - '"invoiceId"' + - '"amount"' + - '"createdAt"' + - '"updatedAt"' + in: query + name: sortBy + description: The response sorted by which field + description: 'Get lines of a receipt, with pagination data' + parameters: + - schema: + type: string + name: receiptId + in: path + required: true + description: The unique id of receipt + '/receipts/{receiptId}/lines/{receiptLineId}': + parameters: + - schema: + type: string + name: receiptId + in: path + required: true + description: The unique id of receipt + - schema: + type: string + name: receiptLineId + in: path + required: true + description: The unique id of receipt line + get: + summary: Get a receipt line detail + tags: + - Receipt + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + id: 114 + createdAt: 1635932127 + updatedAt: 1635932127 + storeHash: rtmh8fqr05 + customerId: '6041' + externalId: null + externalCustomerId: null + receiptId: 101 + invoiceId: 141 + amount: + code: GBP + value: '0.7800' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000141' + paymentId: 117 + referenceNumber: k + transactionType: Paid + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - id + - createdAt + - updatedAt + - storeHash + - customerId + - externalId + - externalCustomerId + - receiptId + - invoiceId + - amount + - paymentStatus + - paymentType + - invoiceNumber + - paymentId + - referenceNumber + - transactionType + properties: + id: + type: number + createdAt: + type: number + updatedAt: + type: number + storeHash: + type: string + minLength: 1 + customerId: + type: string + minLength: 1 + externalId: + type: string + nullable: true + externalCustomerId: + type: string + nullable: true + receiptId: + type: number + invoiceId: + type: number + amount: + type: object + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + paymentStatus: + type: number + paymentType: + type: string + minLength: 1 + invoiceNumber: + type: string + minLength: 1 + paymentId: + type: number + referenceNumber: + type: string + minLength: 1 + transactionType: + type: string + minLength: 1 + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + id: 92 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 83 + invoiceId: 19 + amount: + code: CNY + value: '0.7000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000019' + paymentId: 90 + referenceNumber: test + transactionType: Paid + meta: + message: SUCCESS + operationId: get-ip-receipts-receiptId-lines-receiptLineId + description: Get a receipt line detail + delete: + summary: Delete a receipt line + tags: + - Receipt + operationId: delete-ip-receipts-receiptId-lines-receiptLineId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response code of success request + data: + type: object + properties: + id: + type: integer + description: The unique id of receipt line + meta: + type: object + properties: + message: + type: string + description: Response message of request + examples: + example-1: + value: + code: 200 + data: + id: 92 + meta: + message: SUCCESS + description: Delete a receipt line diff --git a/docs/b2b-edition/specs/api-v3/order/order.yaml b/docs/b2b-edition/specs/api-v3/order/order.yaml new file mode 100644 index 000000000..920ce0f7a --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/order/order.yaml @@ -0,0 +1,841 @@ +openapi: 3.0.0 +info: + title: Order + version: v3 + description: Order information manage. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +tags: + - name: Order + description: Customer's Orders management. +paths: + /orders: + get: + summary: Get Orders + tags: + - Order + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - properties: + code: + type: integer + x-stoplight: + id: 76gyd4yyjty80 + meta: + type: object + x-stoplight: + id: 1evuk40zom0ql + properties: + message: + type: string + x-stoplight: + id: 5yv54gqn8i67q + pagination: + type: object + x-stoplight: + id: p9f5we603fqdp + properties: + totalCount: + type: integer + x-stoplight: + id: yw154d60m18xq + limit: + type: integer + x-stoplight: + id: rpbs8dbhk2jjv + offset: + type: integer + x-stoplight: + id: tfteb0pm5evsp + data: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + type: object + examples: + without-extra-fields: + value: + code: 200 + meta: + message: SUCCESS + data: + - id: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + channelId: 1 + channelName: string + with-extra-fields: + value: + code: 200 + meta: + message: SUCCESS + data: + - id: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + channelId: 1 + channelName: string + operationId: get-orders + security: + - authToken: [] + description: Get all orders + parameters: + - schema: + type: integer + in: query + name: companyId + description: Company ID field + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/orderBy' + - $ref: '#/components/parameters/sortBy' + - name: minModified + in: query + description: Minimum modified timestamp + allowEmptyValue: true + schema: + type: number + format: time + - name: maxModified + in: query + description: Maximum modified timestamp + allowEmptyValue: true + schema: + type: number + - name: minCreated + in: query + description: Minimum created timestamp + allowEmptyValue: true + schema: + type: number + - name: maxCreated + in: query + description: Maximum created timestamp + allowEmptyValue: true + schema: + type: number + - schema: + type: boolean + default: false + example: false + in: query + name: showExtra + description: Show extra field in response + - schema: + type: integer + format: int32 + example: 42 + in: query + name: extraInt1 + description: '**Order query extra integer value, you can use this value to filter the order list.(include extraInt1 ...extraInt5, extraStr1 ...extraStr5) This value may be passed into the custom extra field configured by the B3 team when you create the order. If you clearly know the correspondence between the custom extra field and the default extra field, you can use the default extra field filter to obtain data, Of course, you can also filter by key-value pairs passed into custom fields.**' + - schema: + type: integer + format: int32 + example: 42 + in: query + name: extraInt2 + description: 'Query extra int field ' + - schema: + type: integer + format: int32 + example: 42 + in: query + name: extraInt3 + description: 'Query extra int field ' + - schema: + type: integer + format: int32 + example: 42 + in: query + name: extraInt4 + description: 'Query extra int field ' + - schema: + type: integer + format: int32 + example: 42 + in: query + name: extraInt5 + description: 'Query extra int field ' + - schema: + type: string + example: don't panic + minLength: 0 + maxLength: 200 + in: query + name: extraStr1 + description: Query extra string field + - schema: + type: string + example: don't panic + minLength: 0 + maxLength: 200 + in: query + name: extraStr2 + description: Query extra string field + - schema: + type: string + example: don't panic + minLength: 0 + maxLength: 200 + in: query + name: extraStr3 + description: Query extra string field + - schema: + type: string + example: don't panic + minLength: 0 + maxLength: 200 + in: query + name: extraStr4 + description: Query extra string field + - schema: + type: string + example: don't panic + minLength: 0 + maxLength: 200 + in: query + name: extraStr5 + description: Query extra string field + - schema: + type: integer + example: 1 + in: query + name: bcOrderId + description: Unique order ID in BigCommerce store + - schema: + type: array + in: query + name: channelIds + description: BigCommerce channel ids + post: + tags: + - Order + summary: Create an Order + operationId: post-orders + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + description: Successful created + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + id: 1 + channelName: msf1 + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + '400': + $ref: '#/components/responses/400' + description: Create an order + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + bcOrderId: + type: integer + description: Order ID in bigcommerce + customerId: + type: integer + description: Customer ID of order creater + poNumber: + type: string + description: PO payment method message. + required: + - bcOrderId + - customerId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + bcOrderId: 0 + customerId: 0 + poNumber: bc156 + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: don't panic + extraStr2: don't panic + extraStr3: don't panic + extraStr4: don't panic + extraStr5: don't panic + extraText: don't panic + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test + '/orders/{bcOrderId}': + parameters: + - $ref: '#/components/parameters/bcOrderId' + get: + summary: Get an Order + tags: + - Order + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + id: 1 + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test + channelId: 1 + channelName: string + '404': + $ref: '#/components/responses/404' + operationId: get-orders-orderId + description: Get an order detail info + security: + - authToken: [] + put: + tags: + - Order + summary: Update an Order + operationId: put-orders-orderId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + createdAt: 1574999690 + updatedAt: 1574999690 + bcOrderId: 11 + totalIncTax: 10.5 + poNumber: bj256 + cartId: 1 + companyId: 12 + usdIncTax: 11 + currencyCode: USD + items: 4 + status: completed + customStatus: my-completed + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + id: 1 + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + '404': + $ref: '#/components/responses/404' + description: Update order's poNumnber and extraFields. you shoud send least one field. + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + poNumber: + type: string + example: bj256 + description: PO number + status: + type: string + description: Status of this order + example: Awaiting Payment + statusCode: + type: integer + description: Status code of this order + example: 1 + syncChannel: + type: boolean + x-stoplight: + id: 5l2853rc7hqzc + description: Sync channel info from BC. Only can be used when MSF is enabled. + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + poNumber: bj256 + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: don't panic + extraStr2: don't panic + extraStr3: don't panic + extraStr4: don't panic + extraStr5: don't panic + extraText: don't panic + '/customers/{customerId}/orders/company': + put: + tags: + - Order + summary: Update Orders' company attribute + operationId: put-orders-company + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + total: + type: integer + description: Converted orders amount. + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + total: 10 + '404': + $ref: '#/components/responses/404' + description: |- + Update the orders belong to a B3 company to another B3 company. + Convert orders from user's former BC group into user's present BC group. + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + bcGroupId: + type: integer + description: User's former group ID in bigcommerce. + required: + - bcGroupId + description: '' + parameters: + - schema: + type: integer + name: customerId + in: path + required: true + description: BigCommerce customer id. + '/orders/{bcOrderId}/products': + parameters: + - $ref: '#/components/parameters/bcOrderId' + get: + summary: Get Order's Products + tags: + - Order + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-product.yaml + - type: object + properties: + productId: + type: integer + description: Product ID field in BigCommerce. + example: 1 + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + - id: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + productName: LGM Spicy Chili Crisp + variantSKU: 7.41 Ounce (Pack of 12) + variantId: 12 + options: '[{"id": 715, "option_id": 41, "order_product_id": 670, "product_option_id": 121, "display_name": "Gauge", "display_value": "12", "value": "123", "type": "Multiple choice", "name": "Gauge1576218034-477", "display_style": "Dropdown"}, {"id": 716, "option_id": 42, "order_product_id": 670, "product_option_id": 122, "display_name": "Leg 1 (inches)", "display_value": "5", "value": "5", "type": "Text field", "name": "Leg-1-(inches)1576218034-477", "display_style": ""}]' + productBrandName: LGM + quantity: 10 + productId: 1 + '404': + $ref: '#/components/responses/404' + operationId: get-orders-orderId-products + description: Get order's product detail. + security: + - authToken: [] + '/customers/{customerId}/orders/b2b': + parameters: + - schema: + type: integer + name: customerId + in: path + required: true + description: BigCommerce customer id. + put: + tags: + - Order + summary: Update Customer's BC Orders + operationId: put-customers-customerId-orders-bc + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + total: + type: integer + description: Converted orders amount. + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + total: 11 + '404': + $ref: '#/components/responses/404' + description: 'Add Company identifier for BigCommerce Customer Individual Orders, which can be used to convert BigCommerce Customer Individual Orders to Company-level Orders.' + security: + - authToken: [] + /orders/extra-fields: + get: + summary: Get order extra field configs + tags: + - Order + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + meta: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + operationId: get-orders-extra-fields + description: Get order extra field configs + parameters: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit +components: + schemas: {} + parameters: + limit: + name: limit + in: query + required: false + schema: + type: integer + example: 15 + default: 10 + maximum: 200 + minimum: 1 + description: Pagination limit + offset: + name: offset + in: query + schema: + type: integer + example: 5 + minimum: 0 + description: Pagination offset + orderBy: + name: orderBy + in: query + required: false + schema: + type: string + enum: + - DESC + - ASC + default: DESC + example: ASC + description: Order by + orderId: + name: orderId + in: path + required: true + schema: + type: integer + description: Unique order ID + bcOrderId: + name: bcOrderId + in: path + required: true + schema: + type: integer + description: Unique order ID in BigCommerce Store + sortBy: + name: sortBy + in: query + required: false + schema: + type: string + default: updatedAt + enum: + - createdAt + - updatedAt + example: updatedAt + description: The response sorted by which field + responses: + '400': + description: Request Error + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: array + items: + required: [] + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 400 + data: [] + meta: + message: The order already exists. + examples: + example-1: + value: + code: 400 + data: [] + meta: + message: The order already exists. + '404': + description: Resource not found error + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 404 + data: {} + meta: + message: Not Found Error + properties: + code: + type: integer + example: 404 + data: + type: object + meta: + type: object + properties: + message: + type: string + example: Not Found Error + description: Error message of this response + required: + - code + - data + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Not Found Error + examples: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +x-stoplight: + docs: + includeDownloadLink: true + showModels: false diff --git a/docs/b2b-edition/specs/api-v3/payment/payment.yaml b/docs/b2b-edition/specs/api-v3/payment/payment.yaml new file mode 100644 index 000000000..6e34318e5 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/payment/payment.yaml @@ -0,0 +1,726 @@ +openapi: 3.0.1 +info: + title: Payment + description: BigCommerce B2B Edition Payment management + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +security: + - authToken: [] +tags: + - name: Payment + description: Company payment & store payment manage. +paths: + /payments: + get: + summary: Get Payments of store + tags: + - Payment + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/payment/payment.yaml + - type: object + properties: + id: + type: integer + description: Unique payment id + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + - id: 1 + code: cheque + paymentTitle: Check + - id: 2 + code: braintree + paymentTitle: Braintree + - id: 3 + code: authorizenet + paymentTitle: Authorize.net + operationId: get-payments + description: Get all payments of stores. + security: + - authToken: [] + '/companies/{companyId}/payments': + parameters: + - schema: + type: integer + name: companyId + in: path + required: true + description: Company ID + get: + summary: Get Company Payments + tags: + - Payment + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/payment/payment.yaml + - type: object + properties: + isEnabled: + type: boolean + description: Is this code of payment enabled to the company. + paymentId: + type: integer + description: Unique payment id + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + - code: cheque + paymentTitle: Check + isEnabled: true + paymentId: 1 + - code: braintree + paymentTitle: Braintree + isEnabled: true + paymentId: 1 + - code: authorizenet + paymentTitle: Authorize.net + isEnabled: false + paymentId: 1 + operationId: get-companies-companyId-payments + description: Get all payments of one company. + security: + - authToken: [] + put: + summary: Update Company Payments + operationId: put-companies-companyId-payments + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: {} + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: [] + '400': + description: 'Update fail, double check code plz.' + content: + application/json: + schema: + type: object + properties: + code: + type: number + example: 400 + data: + type: object + properties: + errMsg: + type: string + description: Error message + meta: + type: object + properties: + message: + type: string + example: update error + description: Error message + examples: + example-1: + value: + code: 400 + message: Bad Requests Error + data: + errMsg: Invalid Is enabled + '404': + $ref: '#/components/responses/404' + description: Update payment method to the company in batch. + security: + - authToken: [] + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + payments: + type: array + items: + type: object + properties: + code: + type: string + description: Payment code + minLength: 1 + maxLength: 50 + example: cheque + isEnabled: + type: boolean + description: Is this code of payment enabled to the company. + required: + - code + - isEnabled + examples: + example-1: + value: + payments: + - code: cheque + isEnabled: true + - code: braintree + isEnabled: true + - code: authorizenet + isEnabled: false + description: '' + tags: + - Payment + /company-payment-methods: + get: + summary: Get all Company Payment Methods + tags: + - Payment + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - companyId: 25 + paymentId: 43 + createdAt: 1622430503 + updatedAt: 1622430503 + paymentMethodCode: cheque + paymentMethodTitle: Check + meta: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: number + description: Company unique ID + paymentId: + type: number + description: PaymentMethod unique ID + createdAt: + type: number + updatedAt: + type: number + paymentMethodCode: + type: string + minLength: 1 + paymentMethodTitle: + type: string + minLength: 1 + required: + - companyId + - paymentId + - createdAt + - updatedAt + - paymentMethodCode + - paymentMethodTitle + meta: + type: object + required: + - pagination + - message + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - companyId: 25 + paymentId: 43 + createdAt: 1622430503 + updatedAt: 1622430503 + paymentMethodCode: cheque + paymentMethodTitle: Check + meta: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-company-payment-methods + security: + - authToken: [] + description: 'Get all company payment methods, can use filter&search params' + parameters: + - $ref: '#/components/parameters/orderBy' + - $ref: '#/components/parameters/sortBy' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - schema: + type: string + in: query + name: companyId + description: The companyId filter + - schema: + type: string + in: query + name: q + description: 'The search params, support search in payment method code & payment method title' + '/companies/{companyId}/credit': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get company credit + tags: + - Payment + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: vyzq7e7jtihaw + meta: + type: object + x-stoplight: + id: dsycts1rsc1z5 + properties: + message: + type: string + x-stoplight: + id: lx0j25a3gz697 + data: + type: object + x-stoplight: + id: frqgnmxokjmre + properties: + creditEnabled: + type: boolean + x-stoplight: + id: tsfwhrx9xw52j + description: Whether credit is enabled for the company. + creditCurrency: + type: string + x-stoplight: + id: 20hkauy4b1085 + description: Currency code of the company's credit account. + availableCredit: + type: number + x-stoplight: + id: r7q3fz7sxf47z + description: The amount of credit available to the company. + limitPurchases: + type: boolean + x-stoplight: + id: xdjtb63kx142z + description: Whether the customer is allowed to make purchases using purchase orders when total price exceeds available credit. + creditHold: + type: boolean + x-stoplight: + id: dinylrp2y6sr7 + description: Prevents all company users from making purchases. + examples: + Example 1: + value: + code: 0 + meta: + message: string + data: + creditEnabled: true + creditCurrency: CNY + availableCredit: 200.11 + limitPurchases: false + creditHold: false + operationId: get-companies-companyId-credit + parameters: [] + security: + - authToken: [] + description: 'Get company credit configs, should enable store company credit feature first' + put: + summary: Update company credit + operationId: put-companies-companyId-credit + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + Example 1: + code: 200 + meta: + message: SUCCESS + data: + creditEnabled: true + creditCurrency: CNY + availableCredit: 200.11 + limitPurchases: false + creditHold: false + properties: + code: + type: integer + meta: + type: object + properties: + message: + type: string + data: + type: object + properties: + creditEnabled: + type: boolean + description: Whether credit is enabled for the company. + creditCurrency: + type: string + description: Currency code of the company's credit account. + availableCredit: + type: number + description: The amount of credit available to the company. + limitPurchases: + type: boolean + description: Whether the customer is allowed to make purchases using purchase orders when total price exceeds available credit. + creditHold: + type: boolean + description: Prevents all company users from making purchases. + examples: + Example 1: + value: + code: 0 + meta: + message: string + data: + creditEnabled: true + creditCurrency: CNY + availableCredit: 200.11 + limitPurchases: false + creditHold: false + tags: + - Payment + description: 'Update company credit config. All fields are optional, but please provide at least one. When company credit is not enabled, other fields cannot be updated.' + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + x-examples: + Example 1: + creditEnabled: true + creditCurrency: USD + availableCredit: 200 + limitPurchases: true + creditHold: true + properties: + creditEnabled: + type: boolean + description: Whether credit is enabled for the company. + creditCurrency: + type: string + description: Currency code of the company's credit account. + availableCredit: + type: number + description: The amount of credit available to the company. + limitPurchases: + type: boolean + description: Whether the customer is allowed to make purchases using purchase orders when total price exceeds available credit. + creditHold: + type: boolean + description: | + Prevents all company users from making purchases. + examples: + Example 1: + value: + creditEnabled: true + creditCurrency: USD + availableCredit: 200 + limitPurchases: true + creditHold: true + '/companies/{companyId}/payment-terms': + parameters: + - schema: + type: integer + name: companyId + in: path + required: true + get: + summary: Get Company Payment Terms + tags: + - Payment + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: oozbjszprbb4v + default: 200 + data: + type: object + x-stoplight: + id: p2ivk809j56g0 + properties: + isEnabled: + type: boolean + x-stoplight: + id: 13h2wiwz36wnn + description: Whether to enable company-level payment terms. + paymentTerms: + type: integer + x-stoplight: + id: 88vepawmlovy2 + description: 'When isEnabled is false, paymentTerms is the store default payment terms.' + meta: + type: object + x-stoplight: + id: oko4ob33ipz7r + properties: + message: + type: string + x-stoplight: + id: t9a95n2em61e4 + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + isEnabled: true + paymentTerms: 0 + meta: + message: SUCCESS + operationId: get-companies-companyId-payment-terms + description: Get the payment terms of the company. + security: + - authToken: [] + put: + summary: Update Company Payment Terms + operationId: put-companies-companyId-payment-terms + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + x-stoplight: + id: cbo5182p2qbxw + default: 200 + data: + type: object + x-stoplight: + id: z6lf5dpj7kben + properties: + isEnabled: + type: boolean + x-stoplight: + id: ss1mxi71f5b3u + description: Whether to enable company-level payment terms. + paymentTerms: + type: integer + x-stoplight: + id: 2dlhs6gumz5dy + description: 'When isEnabled is false, paymentTerms is the store default payment terms.' + meta: + type: object + x-stoplight: + id: 2nhtkmiqne145 + properties: + message: + type: string + x-stoplight: + id: 3qs9wx1gll29a + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + isEnabled: true + paymentTerms: 0 + meta: + message: SUCCESS + description: Edit the company's payment terms. + security: + - authToken: [] + tags: + - Payment + requestBody: + content: + application/json: + schema: + type: object + properties: + isEnabled: + type: boolean + x-stoplight: + id: qb06qbndw57fw + paymentTerms: + type: integer + x-stoplight: + id: i4jhbt59xr1kx + description: 'Payment terms must be in [0, 5, 15, 30, 45, 60].' + required: + - isEnabled + - paymentTerms +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + responses: + '404': + description: Not Found Error + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + data: + type: object + description: Response data + meta: + type: object + properties: + message: + type: string + example: Not Found Error + description: Not Found Response message + examples: + example-1: + value: + code: 404 + data: + errMsg: Data model does not Exist + message: Not Found Error + example-2: + value: + code: 0 + data: {} + meta: + message: Not Found Error + parameters: + orderBy: + name: orderBy + in: query + required: false + schema: + type: string + default: DESC + description: 'Order by, DESC or ASC, default: DESC' + sortBy: + name: sortBy + in: query + required: false + schema: + type: string + default: updatedAt + description: 'Sort by, support updatedAt & createdAt' + limit: + name: limit + in: query + required: false + schema: + type: string + default: '10' + description: 'Pagination limit default: 10' + offset: + name: offset + in: query + required: false + schema: + type: string + default: '0' + description: 'Pagination offset default: 0' diff --git a/docs/b2b-edition/specs/api-v3/quote/quote.yaml b/docs/b2b-edition/specs/api-v3/quote/quote.yaml new file mode 100644 index 000000000..6faba15a7 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/quote/quote.yaml @@ -0,0 +1,1956 @@ +openapi: 3.0.1 +info: + title: Quote + description: BigCommerce B2B Edition Quote + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +security: + - authToken: [] +tags: + - name: Quote + description: Request for Quote. +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +paths: + /rfq: + get: + summary: Get Quote Form List + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Kido Zhao + company: levi-test + salesRep: Kido Zhao + createdAt: 1622618606 + updatedAt: 1622618606 + expiredAt: 1622717999 + subtotal: 45.95 + status: 1 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + quoteId: + type: number + quoteNumber: + type: string + minLength: 1 + referenceNumber: + type: string + description: Reference number of a quote + quoteTitle: + type: string + description: Quote title created by a user + createdBy: + type: string + minLength: 1 + company: + type: string + minLength: 1 + salesRep: + type: string + minLength: 1 + createdAt: + type: number + updatedAt: + type: number + expiredAt: + type: number + subtotal: + type: number + description: Total price + status: + type: number + currency: + type: object + description: Currency information + properties: + token: + type: string + minLength: 1 + description: Currency token + location: + type: string + minLength: 1 + description: Currency token location + currencyCode: + type: string + minLength: 1 + description: 'Currency code, ex. USD, CNY' + decimalToken: + type: string + minLength: 1 + description: Decimal token + decimalPlaces: + type: number + description: Number of decimal places + currencyExchangeRate: + type: number + description: Exchange rate + thousandsToken: + type: string + minLength: 1 + description: Thousands token + required: + - token + - location + - currencyCode + - decimalToken + - decimalPlaces + - currencyExchangeRate + - thousandsToken + bcOrderId: + type: string + orderId: + type: string + extraFields: + type: array + description: extra fields of the quote + items: + type: object + properties: + fieldName: + type: string + description: Field name + fieldValue: + type: string + description: Field value + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Store Channel name + required: + - quoteId + - quoteNumber + - referenceNumber + - quoteTitle + - createdBy + - company + - salesRep + - createdAt + - updatedAt + - expiredAt + - subtotal + - status + - bcOrderId + - orderId + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Jo Sweet + company: company name + salesRep: Jo Sweet + createdAt: 1622618606 + updatedAt: 1622618606 + expiredAt: 1622717999 + subtotal: 45.95 + status: 1 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + extraField: + - fieldName: test + fieldValue: test + channelId: 1 + channelName: string + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-rfq + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: updatedAt + in: query + name: sortBy + description: Sort by desc or asc + - schema: + type: string + default: DESC + in: query + name: orderBy + description: Order by + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + in: query + name: quoteNumber + description: Quote number + - schema: + type: string + in: query + name: company + description: Company ID field + - schema: + type: string + in: query + name: salesRep + description: Super Admin ID + - schema: + type: string + in: query + name: status + description: Status of quote + - schema: + type: string + in: query + name: quoteTitle + description: Title of quote + - schema: + type: string + in: query + name: createdBy + description: Create user name + - schema: + type: number + in: query + name: maxCreated + description: Maximum created timestamp + - schema: + type: number + in: query + name: minCreated + description: Minimum created timestamp + - schema: + type: number + in: query + name: maxModified + description: Maximum modified timestamp + - schema: + type: number + in: query + name: minModified + description: Minimum modified timestamp + - schema: + type: number + in: query + name: maxExpired + description: Maximum expired timestamp + - schema: + type: number + in: query + name: minExpired + description: Minimum expired timestamp + - schema: + type: array + in: query + name: channelIds + description: BigCommerce channel ids. + description: Get quote form list + tags: + - Quote + security: + - authToken: [] + post: + summary: Create a Quote Form + operationId: post-rfq + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: number + quoteUrl: + type: string + minLength: 1 + required: + - quoteId + - quoteUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: 'https://sylvia-apptest-store.mybigcommerce.com/quote/?id=195&date=1622618606' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + '201': + description: Created + requestBody: + content: + application/json: + schema: + type: object + x-examples: + example-1: + notes: this is a note + legalTerms: for examplde + message: test message + grandTotal: 45.95 + discount: 0 + subtotal: 45.95 + referenceNumber: '' + userEmail: kido.zhao@bundleb2b.net + expiredAt: 06/02/2021 + quoteTitle: '' + shippingAddress: + country: Argentina + state: Mendoza + city: AS + zipCode: '10013' + address: line1 + apartment: line1 + contactInfo: + name: levi-test-quote + email: levi.tuo@silksoftware.com + companyName: levi-test + phoneNumber: '' + companyId: 5716 + currency: + token: ¥ + location: left + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + companyInfo: + companyId: 5716 + companyName: levi-test + productList: + - sku: e1-1 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + productId: 104 + variantId: 142 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/104/images/336/utilitybucket1.1554505753.220.290.jpg?c=2' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionValue: 95 + optionLabel: Small + optionName: Size + properties: + notes: + type: string + minLength: 1 + legalTerms: + type: string + minLength: 1 + description: Legal terms + message: + type: string + minLength: 1 + description: Extra message + grandTotal: + type: number + description: Total price after discount + discount: + type: number + totalAmount: + type: integer + description: Total price after discount + subtotal: + type: number + description: Total price + referenceNumber: + type: string + userEmail: + type: string + minLength: 1 + description: user email belong to a sales rep. + quoteTitle: + type: string + description: title for quote + expiredAt: + type: string + minLength: 1 + description: 'format time with %m/%d/%Y %H:%M:%S' + shippingAddress: + type: object + description: shipping address information for quote + properties: + country: + type: string + minLength: 1 + description: country name + state: + type: string + minLength: 1 + description: state name + city: + type: string + minLength: 1 + description: city name + zipCode: + type: string + minLength: 1 + description: zip code + address: + type: string + minLength: 1 + description: address detail information + apartment: + type: string + minLength: 1 + required: + - country + - state + - city + - zipCode + - address + - apartment + contactInfo: + type: object + properties: + name: + type: string + minLength: 1 + description: contact name + email: + type: string + minLength: 1 + description: contact email + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + required: + - name + - email + companyId: + type: number + description: company id field for quote + currency: + type: object + description: Currency info + properties: + token: + type: string + minLength: 1 + description: 'Currency token, such as $' + location: + type: string + minLength: 1 + description: 'Currency token position, left or right' + decimalToken: + type: string + minLength: 1 + description: Decimal separator + decimalPlaces: + type: number + thousandsToken: + type: string + minLength: 1 + description: Thousands separator + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + discount: + type: number + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + description: quantity for product in this quote + productId: + type: number + description: product id + variantId: + type: number + description: Variant SKU ID of the product + imageUrl: + type: string + minLength: 1 + description: image url path for product + orderQuantityMaximum: + type: number + orderQuantityMinimum: + type: number + productName: + type: string + minLength: 1 + description: name for product + options: + type: array + uniqueItems: true + minItems: 1 + description: product choices option infomation for quote item + items: + type: object + properties: + optionId: + type: number + optionValue: + type: number + optionLabel: + type: string + minLength: 1 + optionName: + type: string + minLength: 1 + required: + - optionId + - optionValue + - optionLabel + - optionName + required: + - sku + - basePrice + - discount + - offeredPrice + - quantity + - productId + extraFields: + type: array + description: Extra fields of the quote + items: + type: object + properties: + id: + type: number + description: The quote extra field config id. + fieldName: + type: string + description: Extra field name + value: + type: string + description: Extra field value + required: + - id + - fieldName + - value + channelId: + type: integer + description: BigCommerce channel id + displayDiscount: + type: boolean + x-stoplight: + id: s0wst3o47yt85 + description: Whether the quote email and PDF show discount. + default: true + allowCheckout: + type: boolean + x-stoplight: + id: w5xajgvp4yil7 + description: Whether the quote email and PDF show checkout button + default: true + required: + - grandTotal + - discount + - totalAmount + - subtotal + - expiredAt + - productList + examples: {} + application/xml: + schema: + type: object + properties: {} + description: '' + description: Create a quote form + security: + - authToken: [] + tags: + - Quote + '/rfq/{quote_id}': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + get: + summary: Get a Quote Detail + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteNumber: QN000199 + referenceNumber: '' + createdAt: 1622619778 + expiredAt: '' + status: 0 + contactInfo: + name: Hannah Admin330 + email: charles.admin@charlesco.com + companyName: CharlesCo + phoneNumber: '0000000000' + shippingAddress: + city: '' + state: '' + address: '' + country: '' + zipCode: '' + apartment: '' + subtotal: 45.95 + discount: 0 + grandTotal: 45.95 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + trackingHistory: [] + productList: + - sku: e1-3 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/images/stencil/original/products/104/336/utilitybucket1.1554505753.jpg?c=2' + productId: 104 + variantId: 144 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionName: Size + optionLabel: Large + optionValue: '97' + notes: '' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + quoteTitle: '' + notes: '' + legalTerms: '' + createdBy: Hannah Admin330 + bcOrderId: '' + orderId: '' + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5456' + companyName: CharlesCo + companyAddress: Asia China + companyCountry: '' + companyState: Sichuan + companyCity: Chengdu + companyZipCode: '10086' + phoneNumber: '123412' + salesRepInfo: {} + properties: + code: + type: number + data: + type: object + required: + - quoteNumber + - referenceNumber + - createdAt + - expiredAt + - status + - contactInfo + - shippingAddress + - subtotal + - discount + - grandTotal + - currency + - trackingHistory + - productList + - quoteTitle + - notes + - legalTerms + - createdBy + - bcOrderId + - orderId + - storeInfo + - companyInfo + - salesRepInfo + properties: + quoteNumber: + type: string + minLength: 1 + description: Quote number + referenceNumber: + type: string + description: Reference number of a quote + createdAt: + type: number + description: Created at timestamp + expiredAt: + type: number + description: Expired at timestamp + status: + type: number + description: The status of this quote + contactInfo: + type: object + required: + - name + - email + - companyName + - phoneNumber + properties: + name: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + shippingAddress: + type: object + required: + - city + - state + - address + - zipCode + - country + - apartment + properties: + city: + type: string + state: + type: string + address: + type: string + zipCode: + type: string + country: + type: string + apartment: + type: string + subtotal: + type: number + description: Total price + discount: + type: number + description: Discount + grandTotal: + type: number + description: Total price after discount + currency: + type: object + required: + - token + - location + - currencyCode + - decimalToken + - decimalPlaces + - thousandsToken + - currencyExchangeRate + properties: + token: + type: string + minLength: 1 + description: 'Currency token, such as $' + location: + type: string + minLength: 1 + description: 'Currency token location, ex. left or right' + currencyCode: + type: string + minLength: 1 + description: 'Currency code, ex. USD CNY' + decimalToken: + type: string + minLength: 1 + description: Decimal separator + decimalPlaces: + type: number + description: Number of decimal places + thousandsToken: + type: string + minLength: 1 + description: Thousands separator + currencyExchangeRate: + type: number + description: Currency rate + trackingHistory: + type: array + description: tracking message hitory + items: + type: object + properties: + date: + type: number + description: timestamp of this message + example: 1630489012 + role: + type: string + description: Role and username of this message. The role maybe start with 'Sales rep' or 'Customer' which depends on if user is a backend user + example: Customer Tom + message: + type: string + description: comments message record + example: 'record some message when update this quote ' + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + description: Base price of this product + discount: + type: number + description: Discount + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + description: Quantity of the product + imageUrl: + type: string + minLength: 1 + description: Product image URL + productId: + type: number + variantId: + type: number + description: Variant SKU ID + productName: + type: string + minLength: 1 + options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + optionId: + type: number + optionName: + type: string + minLength: 1 + optionLabel: + type: string + minLength: 1 + optionValue: + type: string + minLength: 1 + required: + - optionId + - optionName + - optionLabel + - optionValue + notes: + type: string + description: The extra message notes + orderQuantityMaximum: + type: number + description: The maximum quantity for this order + orderQuantityMinimum: + type: number + description: The minimum quantity for this order + required: + - sku + - basePrice + - discount + - offeredPrice + - quantity + - imageUrl + - productId + - variantId + - productName + - notes + - orderQuantityMaximum + - orderQuantityMinimum + quoteTitle: + type: string + description: Quote title + notes: + type: string + description: Extra message note + legalTerms: + type: string + description: Legal terms + createdBy: + type: string + minLength: 1 + bcOrderId: + type: string + description: BC order ID + orderId: + type: string + description: B2B Edition order ID + storeInfo: + type: object + required: + - storeName + - storeAddress + - storeCountry + properties: + storeName: + type: string + minLength: 1 + storeAddress: + type: string + minLength: 1 + storeCountry: + type: string + minLength: 1 + companyInfo: + type: object + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyState + - companyCity + - companyZipCode + - phoneNumber + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + companyState: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + salesRepInfo: + type: object + extraFields: + type: array + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Store Channel name + displayDiscount: + type: boolean + x-stoplight: + id: vnuwtyb6yv830 + description: Whether the quote email and PDF show discount + allowCheckout: + type: boolean + x-stoplight: + id: 2bvfpedqdfg42 + description: Whether the quote email and PDF show checkout button + meta: + type: object + properties: + message: + type: string + required: + - code + - data + examples: + example-1: + value: + code: 200 + data: + quoteNumber: QN000199 + referenceNumber: '' + createdAt: 1622619778 + expiredAt: 1722619778 + status: 0 + contactInfo: + name: Hannah Admin330 + email: charles.admin@charlesco.com + companyName: CharlesCo + phoneNumber: '0000000000' + shippingAddress: + city: '' + state: '' + address: '' + country: '' + zipCode: '' + apartment: '' + subtotal: 45.95 + discount: 0 + grandTotal: 45.95 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + trackingHistory: + - date: 1630489012 + role: Customer Tom + message: 'record some message when update this quote ' + - date: 1630490012 + role: Sales rep Cat + message: 'record some message when update this quote ' + productList: + - sku: e1-3 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/images/stencil/original/products/104/336/utilitybucket1.1554505753.jpg?c=2' + productId: 104 + variantId: 144 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionName: Size + optionLabel: Large + optionValue: '97' + notes: '' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + quoteTitle: '' + notes: '' + legalTerms: '' + createdBy: Hannah Admin330 + bcOrderId: '' + orderId: '' + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5456' + companyName: CharlesCo + companyAddress: Asia China + companyCountry: '' + companyState: Sichuan + companyCity: Chengdu + companyZipCode: '10086' + phoneNumber: '123412' + salesRepInfo: {} + extraFields: + - fieldName: test + fieldValue: test + channelId: 1 + channelName: string + meta: + message: SUCCESS + operationId: get-rfq-quote_id + parameters: + - schema: + type: string + in: query + name: date + required: true + description: quote create at + description: Get a quote form detail by quoteId + security: + - authToken: [] + tags: + - Quote + put: + summary: Update a Quote + operationId: put-rfq-quote_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: number + quoteUrl: + type: string + minLength: 1 + required: + - quoteId + - quoteUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + requestBody: + content: + application/json: + schema: + type: object + x-examples: + example-1: + notes: string + legalTerms: string + message: string + grandTotal: 0 + discount: 0 + subtotal: 0 + referenceNumber: string + userEmail: string + expiredAt: string + quoteTitle: string + shippingAddress: + country: string + state: string + city: string + zipCode: string + address: string + apartment: string + contactInfo: + name: string + email: string + companyName: string + phoneNumber: string + companyId: 0 + currency: + token: string + location: string + decimalToken: string + decimalPlaces: 0 + thousandsToken: string + companyInfo: + companyId: 0 + companyName: string + productList: + - sku: string + basePrice: 0 + discount: 0 + offeredPrice: 0 + quantity: 0 + productId: 0 + variantId: 0 + imageUrl: string + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: string + options: + - optionId: 0 + optionValue: 0 + optionLabel: string + optionName: string + properties: + notes: + type: string + minLength: 1 + description: Quote extra message + legalTerms: + type: string + minLength: 1 + message: + type: string + minLength: 1 + description: Text info from comments + grandTotal: + type: number + description: Total price after discount + discount: + type: number + subtotal: + type: number + description: Total price + referenceNumber: + type: string + minLength: 1 + description: Reference number of a quote + userEmail: + type: string + minLength: 1 + expiredAt: + type: string + minLength: 1 + quoteTitle: + type: string + minLength: 1 + shippingAddress: + type: object + properties: + country: + type: string + minLength: 1 + state: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + address: + type: string + minLength: 1 + apartment: + type: string + minLength: 1 + contactInfo: + type: object + properties: + name: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + currency: + type: object + description: 'Currency info, which can be seen when you get quote detail' + properties: + token: + type: string + minLength: 1 + location: + type: string + minLength: 1 + decimalToken: + type: string + minLength: 1 + decimalPlaces: + type: number + thousandsToken: + type: string + minLength: 1 + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + discount: + type: number + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + productId: + type: number + variantId: + type: number + imageUrl: + type: string + minLength: 1 + orderQuantityMaximum: + type: number + orderQuantityMinimum: + type: number + productName: + type: string + minLength: 1 + options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + optionId: + type: number + optionValue: + type: number + optionLabel: + type: string + minLength: 1 + optionName: + type: string + minLength: 1 + extraFields: + type: array + items: + type: object + properties: + id: + type: string + description: The quote extra field config id. + fieldName: + type: string + description: Field name + value: + type: string + description: Field value + required: + - id + - fieldName + - value + displayDiscount: + type: boolean + x-stoplight: + id: g83gkehxa1huf + description: Whether the quote email and PDF show discount + allowCheckout: + type: boolean + x-stoplight: + id: bsoxwjlgtuizi + description: Whether the quote email and PDF show checkout button + examples: + example-1: + value: + notes: string + legalTerms: string + message: string + grandTotal: 0 + discount: 0 + subtotal: 0 + referenceNumber: string + userEmail: string + expiredAt: string + quoteTitle: string + shippingAddress: + country: string + state: string + city: string + zipCode: string + address: string + apartment: string + contactInfo: + name: string + email: string + companyName: string + phoneNumber: string + currency: + token: string + location: string + decimalToken: string + decimalPlaces: 0 + thousandsToken: string + productList: + - sku: string + basePrice: 0 + discount: 0 + offeredPrice: 0 + quantity: 0 + productId: 0 + variantId: 0 + imageUrl: string + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: string + options: + - optionId: 0 + optionValue: 0 + optionLabel: string + optionName: string + description: Request body params you could find when you get quote detail + description: Update a quote + security: + - authToken: [] + tags: + - Quote + delete: + summary: Delete a Quote + operationId: delete-rfq-quote_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Delete a quote by quoteId + security: + - authToken: [] + tags: + - Quote + '/rfq/{quote_id}/checkout': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Checkout Quote Form + operationId: post-rfq-quote_id-checkout + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + checkoutUrl: url + cartId: '123' + cartUrl: url + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - checkoutUrl + - cartId + - cartUrl + properties: + checkoutUrl: + type: string + minLength: 1 + description: The checkout URL + cartId: + type: string + minLength: 1 + description: Cart ID + cartUrl: + type: string + minLength: 1 + description: The cart URL + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + checkoutUrl: url + cartId: '123' + cartUrl: url + description: Checkout quote form by quoteId + requestBody: + content: + application/json: + schema: + type: object + examples: + example-1: + value: {} + security: + - authToken: [] + tags: + - Quote + '/rfq/{quote_id}/ordered': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Ordered a Quote + operationId: post-rfq-quote_id-ordered + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: | + Ordered a quote by quoteId + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + orderId: '' + shippingTotal: 0 + taxTotal: 0 + shippingMethod: + id: kWf@Mjg + type: flat + description: Fixed (Fixed) + imageUrl: 'telnet://axcsqlcngg.cc/sfsrtyimv' + transitTime: '' + cost: 10 + additionalDescription: '' + properties: + orderId: + type: string + description: Unique order ID + required: + - orderId + examples: + example-1: + value: + orderId: '' + security: + - authToken: [] + tags: + - Quote + /rfq/emails: + post: + summary: Send a Quote Email + operationId: post-rfq-emails + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Send a quote email + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + quoteId: '195' + email: levi.tuo@silksoftware.com + properties: + quoteId: + type: string + minLength: 1 + description: The quote ID you want to use + email: + type: string + minLength: 1 + description: Which email you want to send + withAttach: + default: 0 + type: boolean + description: Whether to send the quote pdf as an attachment. + emailTemplate: + type: string + enum: + - Simple + - Simple with Pictures + - Waves with Pictures + - Sky + - Dots + description: Template for sending emails + ccTo: + type: array + description: Cc who sent the message + items: + type: string + emailLang: + type: string + enum: + - en + - nl + description: 'The language in which the message is sent. nl: Dutch' + required: + - quoteId + - email + - withAttach + - emailTemplate + examples: {} + tags: + - Quote + '/rfq/{quote_id}/pdf-export': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Quote Export PDF + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + url: + type: string + minLength: 1 + required: + - url + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + url: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-quote-staging/Sylvia_Apptest_Store:QN000195.pdf' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + url: pdf url + operationId: get-rfq-quote_id-pdf-export + requestBody: + content: + application/json: + schema: + type: object + properties: + currency: + type: object + properties: + currencyExchangeRate: + type: string + description: Currency rate + description: Export quote pdf + security: + - authToken: [] + tags: + - Quote + /rfq/extra-fields: + get: + summary: Get quote extra fields configs + tags: + - Quote + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: + type: object + properties: + id: + type: string + description: ID of the quote extra field config + fieldName: + type: string + description: Field name + fieldType: + type: number + description: Field type. 0 - text; 1 - textarea; 2 - number + enum: + - 0 + - 1 + - 2 + isRequired: + type: boolean + isUnique: + type: boolean + valueConfigs: + type: object + properties: + defaultValue: + type: string + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 200 + data: + - id: 1 + filedName: test1 + fieldType: 0 + isRequired: false + isUnique: false + valueConfigs: + defaultValue: '' + maximumLength: 65535 + - id: 2 + filedName: test2 + fieldType: 0 + isRequired: false + isUnique: false + valueConfigs: + defaultValue: '' + maximumLength: 65535 + meta: + message: SUCCESS + operationId: get-rfq-extra-fields + description: Get quote extra fields configs. It is better to cache the response results to avoid frequent API requests + security: + - authToken: [] diff --git a/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml b/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml new file mode 100644 index 000000000..19dd8b095 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml @@ -0,0 +1,371 @@ +openapi: 3.0.0 +info: + title: Sales Staff + version: '3.0' + description: Sales staff management +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +paths: + /sales-staffs: + parameters: [] + get: + summary: Get Sales Staffs + operationId: get-sales-staffs + description: Get all sales staffs with pangiation + tags: + - Sales Staff + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + data: + type: array + items: + allOf: + - $ref: '#/components/schemas/sales_staff' + meta: + allOf: + - type: object + properties: + message: + type: string + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + code: + type: integer + x-stoplight: + id: 2zlf0enukfxj2 + examples: + Arthur Mrogan assigned to the Van der Linde Gang: + value: + data: + - id: 19 + salesRepName: Arthur Morgan + email: Arthur.Morgan@rstar.com + companyCount: 1 + roleName: Sales Rep + meta: + message: Success + pagination: + totalCount: 1 + limit: 10 + offset: 0 + security: + - authToken: [] + parameters: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/orderBy + - schema: + type: string + in: query + name: companyId + description: 'Unique ID of company ' + '/sales-staffs/{salesStaffId}': + parameters: + - schema: + type: integer + name: salesStaffId + in: path + required: true + description: Sales staff ID + put: + summary: Update a Sales Staff + operationId: put-sales-staffs-salesStaffId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: {} + meta: + message: SUCCESS + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 400 + data: {} + meta: + message: Create BC customer group failed + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 400 + data: {} + meta: + message: Update failed reason + '404': + description: Not Found + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: {} + meta: + message: SUCCESS + properties: + code: + type: integer + data: + type: object + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Resource Not Found + description: Update a sales staff for company assignment + tags: + - Sales Staff + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + description: '' + type: array + x-examples: + example-1: + companies: + - companyId: '89' + isAssigned: '0' + id: '89' + assignStatus: '0' + - companyId: '84' + isAssigned: '0' + id: '84' + assignStatus: '0' + - companyId: '219' + isAssigned: '1' + id: '219' + assignStatus: '1' + - companyId: '221' + isAssigned: '1' + id: '221' + assignStatus: '1' + items: + type: object + properties: + companyId: + type: integer + assignStatus: + type: boolean + required: + - companyId + - assignStatus + get: + summary: Get a Sales Staff + operationId: get-sales-staffs-salesStaffId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + x-examples: + example-1: + data: + id: 11 + name: '' + email: robert.zha@silksoftware.com + phoneNumber: '' + assignedCompanies: + - id: 5742 + bcId: '7288' + companyName: testtesttest678 + bcGroupName: testtesttest678 + - id: 5747 + bcId: '7374' + companyName: karentest + bcGroupName: karentest + allOf: + - type: object + properties: + data: + type: object + properties: + id: + type: number + description: sales staff id + example: 12 + name: + type: string + description: name of sales staff + example: tom + email: + type: string + minLength: 1 + description: email of sales staff + format: email + phoneNumber: + type: string + description: phone number of sales staff + example: '123454321' + assignedCompanies: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + description: company info which is assigned by sales staff + properties: + id: + type: number + description: company id + example: 1 + bcId: + type: string + minLength: 1 + description: company bc group id + example: '23' + companyName: + type: string + minLength: 1 + description: name of this company + example: google + bcGroupName: + type: string + minLength: 1 + description: 'bc group name ' + example: google + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + examples: + example-1: + value: + data: + id: 12 + name: tom + email: user@example.com + phoneNumber: '123454321' + assignedCompanies: + - id: 1 + bcId: '23' + companyName: google + bcGroupName: google + code: 200 + meta: + message: SUCCESS + tags: + - Sales Staff + description: get sales staff detail infomation. include which companies is assigned. + security: + - authToken: [] +components: + schemas: + sales_staff: + title: Sales Staff + type: object + description: Sales staff basic model + x-examples: + Arthur Morgan: + id: 140 + salesRepName: Arthur Morgan + email: Arthur.Morgan@rstar.com + companyCount: 0 + roleName: Sales Rep + properties: + id: + type: integer + description: Unique identifier for the given sales staff + salesRepName: + type: string + description: Name for the given sales staff. + email: + type: string + description: Email for the given sales staff. + companyCount: + type: integer + description: The company's count which sales staff assigned. + roleName: + type: string + minLength: 1 + description: Role name for the given sales staff. + required: + - id + - salesRepName + - email + - companyCount + - roleName + x-internal: false + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +tags: + - name: Sales Staff diff --git a/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml b/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml new file mode 100644 index 000000000..5fb81533e --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml @@ -0,0 +1,859 @@ +openapi: 3.0.1 +info: + title: Shopping List + description: BigCommerce B2B Edition Shopping List + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +security: + - Basic: [] +tags: + - name: Shopping List + description: Shopping List management. +paths: + /shopping-list: + get: + summary: Get Shopping Lists + tags: + - Shopping List + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + meta: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/shopping_list' + examples: {} + '422': + $ref: '#/components/responses/422' + operationId: get-shopping-list + description: |- + Get a list of shopping lists viewable based on user permissions of a buyer user id. + + A junior buyer can see all of the lists they create and no one else's. + + A senior buyer or admin can see all of the companies approved or ready for approval lists. This would include lists sent by junior buyers. + parameters: + - schema: + type: integer + in: query + name: userId + description: 'B2B Edition buyer user id(One of userId and customerId must be passed, and only one of them can be passed)' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - schema: + type: number + in: query + name: channelId + description: BigCommerce channel id + - schema: + type: integer + in: query + name: customerId + description: 'BigCommerce customer id(One of userId and customerId must be passed, and only one of them can be passed)' + - schema: + type: integer + in: query + name: createdUserId + description: 'B2B Edition buyer user id, if the userId has permissions to view all shopping lists of the + company, entering this parameter will filter out the shopping lists created by that user.' + security: + - authToken: [] + post: + summary: Create a Shopping List + operationId: post-shopping-list + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + shoppingListId: + type: integer + description: shopping list id for created + example: 1 + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + shoppingListId: 1 + '422': + $ref: '#/components/responses/422' + tags: + - Shopping List + description: create a shopping list for a user + requestBody: + content: + application/json: + schema: + allOf: + - properties: + name: + type: string + description: + type: string + description: description information for shopping list + status: + type: integer + description: 'status of shopping list, (0: approved, 20: deleted, 30: draft, 40: ready for approval)' + enum: + - 0 + - 30 + - 40 + example: 0 + userId: + type: integer + description: 'B2B Edition buyer user id(One of userId and customerId must be passed, and only one of them can be passed)' + customerId: + type: integer + x-stoplight: + id: pb1efje3kgqqo + description: 'BigCommerce customer id(One of userId and customerId must be passed, and only one of them can be passed)' + channelId: + type: integer + description: BigCommerce channel id + items: + type: array + items: + $ref: '#/components/schemas/shopping_list_item' + required: + - name + type: object + examples: + example-1: + value: + name: my first shopping list + description: this is my first shopping list + status: 0 + userId: 0 + channelId: 1 + items: + - productId: 123 + variantId: 321 + quantity: 5 + Example 1: + value: + name: my first shopping list + description: this is my first shopping list + status: 0 + customerId: 0 + channelId: 1 + items: + - productId: 123 + variantId: 321 + quantity: 5 + description: '' + security: + - authToken: [] + '/shopping-list/{shoppingListId}': + get: + summary: Get a Shopping List + tags: + - Shopping List + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + allOf: + - $ref: '#/components/schemas/shopping_list' + - type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/shopping_list_item' + - type: object + x-stoplight: + id: zka4a8tisb66g + properties: + meta: + x-stoplight: + id: csv4ed548bp7e + type: object + properties: + pagination: + type: object + x-stoplight: + id: km5rkrtftuvgf + properties: + totalCount: + type: integer + x-stoplight: + id: x8lrr38ifqna9 + description: The total number of the all data + limit: + type: integer + x-stoplight: + id: xflcvhxtgazvp + description: 'Pagination limit ' + offset: + type: integer + x-stoplight: + id: q8znvefz4a0xc + description: Pagination offset + examples: {} + '404': + $ref: '#/components/responses/404' + operationId: get-shopping-list-shoppingListId + description: get a shopping list detail information + parameters: + - schema: + type: integer + in: query + name: userId + description: 'B2B Edition buyer user id, you can enter a user id for check if this user can view this shopping list' + - schema: + type: string + enum: + - quantity + - productName + - productSku + - sortOrder + example: sortOrder + in: query + name: sortBy + description: the field to sort by + - schema: + type: string + enum: + - DESC + - ASC + example: DESC + in: query + name: orderBy + description: desc or asc for sort by + - schema: + type: integer + in: query + description: 'BigCommerce customer id, passing this parameter will obtain the shopping list according to the b2c user' + name: customerId + - schema: + type: integer + minimum: 0 + default: 0 + in: query + name: offset + description: Pagination offset for shopping list items + - schema: + type: integer + default: 250 + minimum: 1 + maximum: 250 + in: query + name: limit + description: Pagination limit for shopping list items + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/shoppingListId' + put: + summary: Update a Shopping List + operationId: put-shopping-list-shoppingListId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + $ref: '#/components/schemas/shopping_list' + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + id: 1 + name: my first shopping list + description: this is my first shopping list + status: 0 + companyId: 1 + userId: 12 + createdAt: 1631495936 + updatedAt: 1631495936 + '404': + $ref: '#/components/responses/404' + '422': + $ref: '#/components/responses/422' + tags: + - Shopping List + description: |- + update a shopping list detail. you can also update shopping list items by update the items field by this API endpoints. + note: + 1. User id for update the shopping list is not required. You can optionally enter this field according to whether you need to judge user permissions. + 2. The id field in shopping list items is an optional field. If it is null, you can only change the quantity of this item by product id and variant id and option list, these three fields will determine an actual item. If it is not null, the id field will determine an actual item and you can change product id and variant id and option list by this way. + 3. Set a zero quantity of shopping list item will delete this item. + 4. Quantity = 0 will remove item, you can modify multiple items at one time + requestBody: + content: + application/json: + schema: + allOf: + - properties: + name: + type: string + example: my first shopping list + description: name for shopping list + description: + type: string + description: description information for shopping list + example: this is my first shopping list + status: + type: integer + description: 'status of shopping list, (0: approved, 20: deleted, 30: draft, 40: ready for approval)' + enum: + - 0 + - 30 + - 40 + example: 0 + userId: + type: integer + example: 12 + description: 'B2B Edition buyer user id, you can enter a user id for check if this user can update this shopping list' + customerId: + type: integer + x-stoplight: + id: 00y1uko9vm7c7 + description: 'BigCommerce customer id, passing this parameter will obtain the shopping list according to the b2c user' + items: + type: array + items: + type: object + properties: + id: + type: integer + description: unique id field for shopping list item + productId: + type: integer + description: product id for shopping list item + variantId: + type: integer + description: 'variant id for shopping list item.If the product has options, variant id is required, otherwise it can be left blank' + quantity: + type: integer + description: quantity of product and variant + sortOrder: + type: integer + description: The sort order for item + optionList: + type: object + description: The optionlist does not need to be input in and will be automatically obtained based on productId and variantId. + properties: + optionId: + type: string + optionValue: + type: string + productNote: + type: string + description: product note + type: object + examples: + example-1: + value: + name: test + description: develop test + status: 0 + companyId: 155576 + userId: 223437 + items: + - id: 75693 + productId: 107 + variantId: 73 + quantity: 0 + - id: 85416 + productId: 86 + variantId: 66 + quantity: 40 + - id: 76533 + productId: 112 + variantId: 79 + quantity: 1 + Example 1: + value: + name: test + description: develop test + status: 0 + companyId: 155576 + customerId: 237 + items: + - id: 76533 + productId: 112 + variantId: 79 + quantity: 1 + description: '' + security: + - authToken: [] + parameters: [] + delete: + summary: Delete a Shopping List + operationId: delete-shopping-list-shoppingListId + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + shoppingListId: + type: integer + example: 1 + description: shopping list id for deleted + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + shoppingListId: 1 + '404': + $ref: '#/components/responses/422' + tags: + - Shopping List + description: delete a shopping list. note this will not delete shopping list item. + parameters: + - schema: + type: integer + in: query + name: userId + description: 'B2B Edition buyer user id, you can enter a user id for check if this user can delete this shopping list' + security: + - authToken: [] + '/shopping-list/{shoppingListId}/items/{itemId}': + parameters: + - schema: + type: string + name: shoppingListId + in: path + required: true + - schema: + type: string + name: itemId + in: path + required: true + delete: + summary: delete a shopping list item + operationId: delete-shopping-list-shoppingListId-items-itemId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + message: + type: string + data: + type: object + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + '404': + description: Not Found + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + errMsg: + type: string + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 404 + data: + errMsg: Shopping list item matching query does not exist. + meta: + message: Not Found Error + security: + - authToken: [] + description: '' + tags: + - Shopping List + parameters: [] +components: + parameters: + shoppingListId: + name: shoppingListId + in: path + required: true + schema: + type: integer + description: unique id for shopping list + limit: + name: limit + in: query + description: 'Pagination limit default: 10' + allowEmptyValue: true + schema: + maximum: 250 + exclusiveMaximum: true + minimum: 1 + exclusiveMinimum: true + type: integer + default: 10 + offset: + name: offset + in: query + description: 'Pagination offset default: 0' + allowEmptyValue: true + schema: + type: integer + minimum: 0 + companyId: + name: companyId + in: path + description: Unique numeric ID of this company. + required: true + schema: + type: integer + schemas: + shopping_list: + title: Shopping List + type: object + x-examples: + example-1: + id: 1 + name: my first shopping list + description: this is my first shopping list + status: 0 + companyId: 1 + userId: 12 + createdAt: 1631495936 + updatedAt: 1631495936 + channelId: 1 + channelName: string + x-tags: + - Models + properties: + id: + type: integer + example: 1 + readOnly: true + name: + type: string + description: name for shopping list + example: my first shopping list + description: + type: string + description: description information for shopping list + example: this is my first shopping list + status: + type: integer + description: 'status of shopping list, (0: approved, 20: deleted, 30: draft, 40: ready for approval) ' + example: 0 + enum: + - 0 + - 30 + - 40 + companyId: + type: integer + description: id for shopping list owner company + example: 1 + readOnly: true + userId: + type: integer + description: id for shopping list creator + example: 12 + createdAt: + type: integer + example: 1631495936 + format: int32 + description: shopping list create time + readOnly: true + updatedAt: + type: integer + example: 1631495936 + format: int32 + description: update time for shopping list + readOnly: true + channelId: + type: number + description: BigCommerce channel id + channelName: + type: string + description: Store Channel name + required: + - status + x-internal: false + shopping_list_b2c: + title: B2C Shopping List + type: object + x-examples: + example-1: + id: 1 + name: my first shopping list + description: this is my first shopping list + status: 0 + companyId: 1 + userId: 12 + createdAt: 1631495936 + updatedAt: 1631495936 + channelId: 1 + channelName: string + x-tags: + - Models + properties: + id: + type: integer + example: 1 + readOnly: true + name: + type: string + description: name for shopping list + example: my first shopping list + description: + type: string + description: description information for shopping list + example: this is my first shopping list + createdAt: + type: integer + example: 1631495936 + format: int32 + description: shopping list create time + readOnly: true + updatedAt: + type: integer + example: 1631495936 + format: int32 + description: update time for shopping list + readOnly: true + channelId: + type: number + description: BigCommerce channel id + channelName: + type: string + description: Store Channel name + x-internal: false + shopping_list_item: + title: Shopping List Item + type: object + x-examples: + example-1: + value: + id: 1 + productId: 123 + variantId: 321 + quantity: 5 + option_list: '[{"filedName": "fieldvalue"}]' + x-tags: + - Models + properties: + id: + type: integer + example: 1 + description: unique id field for shopping list item + readOnly: true + productId: + type: integer + example: 123 + description: product id for shopping list item + variantId: + type: integer + example: 321 + description: 'variant id for shopping list item.If the product has options, variant id is required, otherwise it can be left blank' + quantity: + type: integer + example: 5 + description: quantity of product and variant + sortOrder: + type: integer + description: The sort order for item + optionList: + type: object + description: The optionlist does not need to be input in and will be automatically obtained based on productId and variantId. + properties: + optionId: + type: string + optionValue: + type: string + productNote: + type: string + description: product note + required: + - productId + - variantId + - quantity + x-internal: false + responses: + '404': + description: Not Found Error + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + example: 404 + data: + type: object + description: Response data + properties: + errMsg: + type: string + example: some data entry not found + description: error message detail + meta: + type: object + properties: + message: + type: string + example: Not Found Error + description: Error message of this response + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Not Found Error + '422': + description: Parameter Error + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 422 + data: + errMsg: + min_created: + - A valid integer is required. + meta: + message: Parameter Error + properties: + code: + type: number + description: response status code + example: 422 + data: + type: object + required: + - errMsg + properties: + errMsg: + type: object + description: error detail information for some parameters. + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + description: error information + example: Parameter Error + required: + - code + - data + - meta + examples: + parameter error: + value: + code: 422 + data: + errMsg: + user Id: + - user must belong to a company + meta: + message: Parameter Error + '500': + description: Server Error + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + example: 500 + data: + type: object + description: Response data + meta: + type: object + properties: + message: + type: string + example: Server Error + description: Server Error Response message + examples: + example-1: + value: + code: 500 + data: {} + meta: + message: Server Error + securitySchemes: + authToken: + type: apiKey + name: authToken + in: header diff --git a/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml b/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml new file mode 100644 index 000000000..c771e537a --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml @@ -0,0 +1,1264 @@ +openapi: '3.0.0' +info: + title: Super Admin + version: v3 + description: Super Admin manage. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +paths: + '/companies/{companyId}/super-admins': + get: + summary: Get a Company's SuperAdmins + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + - firstName: kobe + id: '74' + lastName: tiantian + meta: + message: SUCCESS + pagination: + limit: 1 + offset: 1 + totalCount: 989 + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - type: object + properties: + email: + type: string + description: Email of the super admin + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Icon url + uuid: + type: string + description: UUID of super admin + phone: + type: string + description: Phone number of super admin + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + allOf: + - type: object + properties: + message: + type: string + minLength: 1 + required: + - message + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + - id: 0 + createdAt: 0 + updateAt: 0 + firstName: string + lastName: string + email: string + meta: + message: string + pagination: + limit: 2 + offset: 0 + totalCount: 0 + '404': + $ref: '#/components/responses/404' + operationId: get-companies + description: Get a Company's all SuperAdmins + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - schema: + type: string + in: query + name: q + description: 'Super admin query string. Supported fields: email, e.g. ?q=xyz@abc.com' + - schema: + type: string + enum: + - '0' + - '1' + in: query + description: Is show extra fields in the response + name: isIncludeExtraFields + tags: + - Super Admin + parameters: + - $ref: '#/components/parameters/companyId' + put: + summary: Update Company & Super Admins Relationship + operationId: put-companies-companyId-super-admins + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: {} + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 200 + data: [] + meta: + message: success + '404': + $ref: '#/components/responses/404' + description: Create or delete the super admin relationships of a company + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + superAdmins: + type: array + items: + type: object + properties: + superAdminId: + type: integer + description: Unique Super Admin ID + isAssigned: + type: boolean + description: 'Create or delete a relationship, true means create, false means delete' + required: + - superAdminId + - isAssigned + required: + - superAdmins + examples: + example-1: + value: + superAdmins: + - superAdminId: 1 + isAssigned: true + - superAdminId: 2 + isAssigned: true + tags: + - Super Admin + '/super-admins/{superAdminId}': + parameters: + - $ref: '#/components/parameters/superAdminId' + put: + summary: Update SuperAdmin & Companies Relationship + operationId: put-super-admins-superAdminId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: {} + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + '404': + $ref: '#/components/responses/404' + description: Create or delete the company relationships of a superAdmin + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + companies: + type: array + items: + type: object + properties: + companyId: + type: integer + description: Unique Company ID + isAssigned: + type: boolean + description: 'Create or delete a relationship, true means create, false means delete' + required: + - companyId + - isAssigned + required: + - companies + examples: + example-1: + value: + companies: + - companyId: 1 + isAssigned: true + - companyId: 2 + isAssigned: false + description: '' + tags: + - Super Admin + /companies/super-admins: + get: + summary: Get SuperAdmin with Company Count + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + x-examples: + example-1: + code: 200 + data: + - firstName: zzz + lastName: aaa + email: zzz@ssalesrep.com + salesRepId: '9208' + companyCount: '6' + - firstName: Walter + lastName: White + email: Walter.White@gmail.com + salesRepId: '293' + companyCount: '3' + meta: + message: SUCCESS + pagination: + limit: 2 + offset: 0 + totalCount: 989 + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - type: object + properties: + companyCount: + type: integer + email: + type: string + description: Email of super admin + uuid: + type: string + description: UUID of super admin + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce Channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Icon url + phone: + type: string + description: Phone number of super admin + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + allOf: + - type: object + properties: + message: + type: string + minLength: 1 + required: + - message + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - firstName: zzz + lastName: aaa + email: zzz@ssalesrep.com + id: '9208' + companyCount: 7 + uuid: '' + createdAt: 1622421600 + updatedAt: 1622421600 + - firstName: Walter + lastName: White + email: Walter.White@gmail.com + id: '293' + companyCount: 3 + uuid: '' + createdAt: 1622421600 + updatedAt: 1622421600 + meta: + message: SUCCESS + pagination: + limit: 2 + offset: 0 + totalCount: 989 + operationId: get-companies-super-admins + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/orderBy' + - schema: + type: string + in: query + name: q + description: 'Super admin query string. Supported fields: email, e.g. ?q=xyz@abc.com' + - schema: + type: string + in: query + name: uuid + description: 'Uuid of super admin ' + - schema: + type: string + in: query + name: maxCreated + description: Maximum created timestamp + - schema: + type: string + in: query + name: minCreated + description: Minimum created timestamp + - schema: + type: string + in: query + name: maxModified + description: Maximum modified timestamp + - schema: + type: string + in: query + name: minModified + description: Minimum modified timestamp + - schema: + type: string + enum: + - '0' + - '1' + in: query + description: Is show extra fields in the response + name: isIncludeExtraFields + description: Get SuperAdmins with Company Count (groupby superAdmin) + tags: + - Super Admin + parameters: [] + /super-admins/companies: + get: + summary: Get Companies with SuperAdmin Count + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - addressLine1: '' + addressLine2: '' + catalogId: '2' + city: '' + companyEmail: kobe.tian@bunldeb2b.com + companyId: '34' + companyName: KobeCropTest111 + country: ',' + description: KobeCropTest111 + salesRepCount: '2' + state: '' + zipCode: '' + meta: + message: SUCCESS + pagination: + limit: 1 + offset: 1 + totalCount: 989 + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + addressLine1: + type: string + addressLine2: + type: string + catalogId: + type: integer + nullable: true + city: + type: string + companyEmail: + type: string + minLength: 1 + companyId: + type: integer + companyName: + type: string + minLength: 1 + country: + type: string + minLength: 1 + description: + type: string + minLength: 1 + superAdminCount: + type: integer + state: + type: string + zipCode: + type: string + required: + - addressLine1 + - addressLine2 + - catalogId + - city + - companyEmail + - companyId + - companyName + - country + - description + - superAdminCount + - state + - zipCode + meta: + allOf: + - type: object + properties: + message: + type: string + minLength: 1 + required: + - message + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - addressLine1: '' + addressLine2: '' + catalogId: 2 + city: '' + companyEmail: kobe.tian@bunldeb2b.com + companyId: 34 + companyName: KobeCropTest111 + country: ',' + description: KobeCropTest111 + superAdminCount: 2 + state: '' + zipCode: '' + meta: + message: SUCCESS + pagination: + limit: 3 + offset: 1 + totalCount: 989 + operationId: get-super-admins-companies + parameters: + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/orderBy' + security: + - authToken: [] + description: Get Companies with SuperAdmin Count (group by company) + tags: + - Super Admin + parameters: [] + /super-admins: + post: + summary: Create Super Admin + operationId: post-super-admins + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: object + properties: + userId: + type: integer + description: B2B Edition user id + customerId: + type: integer + description: BigCommerce customer id + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 0 + data: + userId: 1 + customerId: 1 + meta: + message: success + '400': + description: SuperAdmin was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + type: object + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 400 + data: [] + meta: + message: The user already exists. + description: Create a super admin without no company assigned + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + firstName: + type: string + description: First name of the SuperAdmin + minLength: 0 + maxLength: 100 + lastName: + type: string + description: Last name of the SuperAdmin + minLength: 0 + maxLength: 100 + phone: + type: string + description: Phone number of the SuperAdmin + minLength: 0 + maxLength: 200 + email: + type: string + description: Email of the SuperAdmin + minLength: 0 + maxLength: 200 + uuid: + type: string + description: UUID of the SuperAdmin + maxLength: 100 + minLength: 0 + channelIds: + type: array + description: 'BigCommerce channel id list. If this fields is missing, super admin can access all enabled channels.' + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + required: + - firstName + - lastName + - email + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + firstName: Tom + lastName: Cat + phone: '0000000000' + email: Tom@gmail.com + uuid: '' + description: '' + tags: + - Super Admin + '/super-admins/{superAdminId}/companies': + parameters: + - schema: + type: string + example: '11' + name: superAdminId + in: path + required: true + description: Unique SuperAdmin ID + get: + summary: Get Companies of a Super Admin + tags: + - Super Admin + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: + type: object + properties: + companyId: + type: integer + description: Unique company ID + companyName: + type: string + description: Company name + companyEmail: + type: string + description: Company email + required: + - companyId + - companyName + - companyEmail + meta: + required: + - message + - pagination + type: object + properties: + message: + type: string + pagination: + type: object + properties: + totalCount: + type: integer + description: Total count of companies + offset: + type: integer + description: Pagination offset + limit: + type: integer + description: Pagination limit + required: + - data + examples: + example-1: + value: + code: 0 + data: + - companyId: 1 + companyName: Tom company + companyEmail: Tom@gmail.com + - companyId: 1 + companyName: Jerry company + companyEmail: Jerry@gmail.com + meta: + message: success + pagination: + totalCount: 2 + offset: 0 + limit: 10 + '404': + $ref: '#/components/responses/404' + operationId: get-super-admins-superAdminId-companies + security: + - authToken: [] + description: Get companies of a super admin + parameters: + - schema: + type: integer + in: query + name: offset + description: Pagination offset + - schema: + type: integer + in: query + name: limit + description: Pagination limit + /super-admins/bulk: + post: + summary: Bulk Create Super Admins + operationId: post-super-admins-bulk + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + superAdminIds: + - 51 + - 52 + - 53 + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - superAdminIds + properties: + superAdminIds: + type: array + description: Created successful Super Admin IDs + items: + type: integer + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + superAdminIds: + - 51 + - 52 + - 53 + meta: + message: SUCCESS + '400': + description: Bad Request + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + _detail: + type: string + minLength: 1 + description: Failed detail message + required: + - _detail + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 0 + data: + errors: + - _detail: string + meta: + message: string + '413': + description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + '422': + description: SuperAdmin was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + data: + errors: + - id: string + _detail: string + meta: + message: string + properties: + code: + type: number + data: + type: object + required: + - errors + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + _detail: + type: string + minLength: 1 + required: + - _detail + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + description: Bulk create super admins + requestBody: + content: + application/json: + schema: + type: array + minItems: 1 + uniqueItems: true + x-examples: + example-1: + - firstName: Tom + lastName: Cat + phone: '0000000000' + email: Tom21@gmail.com + uuid: '21' + - firstName: Tom + lastName: Cat + phone: '0000000000' + email: Tom22@gmail.com + uuid: '22' + - firstName: Tom + lastName: Cat + phone: '0000000000' + email: Tom23@gmail.com + uuid: '23' + items: + allOf: + - type: object + properties: + firstName: + type: string + minLength: 1 + description: First name of the super admin + lastName: + type: string + minLength: 1 + description: Last name of the super admin + phone: + type: string + minLength: 1 + description: Phone number of the super admin + email: + type: string + minLength: 1 + description: Email of the super admin + uuid: + type: string + minLength: 1 + description: UUID of the super admin + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + required: + - firstName + - lastName + - phone + - email + - uuid + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + - firstName: Tom + lastName: Cat + phone: '1000000000' + email: Tom21@gmail.com + - firstName: Tom + lastName: Cat + phone: '2000000000' + email: Tom22@gmail.com + uuid: '22' + - firstName: Tom + lastName: Cat + phone: '3000000000' + email: Tom23@gmail.com + uuid: '23' + tags: + - Super Admin + security: + - authToken: [] + '/super-admins/info/{superAdminId}': + parameters: + - schema: + type: string + name: superAdminId + in: path + required: true + description: Unique SuperAdmin ID + get: + summary: Get a super admin info + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - type: object + properties: + uuid: + type: string + description: UUID of super admin + phone: + type: string + description: Phone number of super admin + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Icon url + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + type: object + properties: + message: + type: string + operationId: get-super-admins-info-superAdminId + tags: + - Super Admin + description: Get super admin info + parameters: [] + security: + - authToken: [] + put: + summary: Update a super admin info + operationId: put-super-admins-info-superAdminId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: integer + data: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - type: object + properties: + uuid: + type: string + description: UUID of super admin + phone: + type: string + description: Phone number of super admin + channelList: + type: array + items: + type: object + properties: + channelId: + type: integer + description: BigCommerce channel id + channelName: + type: string + description: Channel name + iconUrl: + type: string + description: Icon url + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + meta: + type: object + properties: + message: + type: string + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + firstName: + type: string + description: First name + lastName: + type: string + description: Last name + uuid: + type: string + description: UUID of super admin + phone: + type: string + description: Phone number of super admin + channelIds: + type: array + description: BigCommerce channel ids. + items: + type: integer + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + description: '' + description: Update super admin info + tags: + - Super Admin +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + examples: {} + parameters: + companyId: + name: companyId + in: path + required: true + schema: + type: integer + example: 14 + description: Unique ID of a comapny object + limit: + name: limit + in: query + required: false + schema: + type: integer + example: 15 + default: 10 + maximum: 200 + minimum: 1 + description: Pagination limit + offset: + name: offset + in: query + schema: + type: integer + example: 5 + minimum: 0 + description: Pagination offset + superAdminId: + name: superAdminId + in: path + required: true + schema: + type: integer + example: 11 + description: Unique SuperAdmin ID + orderBy: + name: orderBy + in: query + required: false + schema: + type: string + enum: + - DESC + - ASC + default: DESC + example: ASC + description: Order by + responses: + '404': + description: Example response + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: {} + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 404 + data: {} + meta: + message: Not Found Error + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Not Found Error +tags: + - name: Super Admin diff --git a/docs/b2b-edition/specs/api-v3/task/task.yaml b/docs/b2b-edition/specs/api-v3/task/task.yaml new file mode 100644 index 000000000..b525ebe8f --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/task/task.yaml @@ -0,0 +1,407 @@ +openapi: '3.0.0' +info: + title: Task + version: '3.0' + description: Tasks of the batch operations +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +paths: + '/batch/tasks/{taskId}': + parameters: + - schema: + type: string + name: taskId + in: path + required: true + description: The async task identify + get: + summary: Get a task Detail + tags: + - Task + operationId: get-tasks-taskId + description: Get a task detail + parameters: [] + security: + - authToken: [] + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + createdAt: 1622618228 + updatedAt: 1622618430 + taskName: test + email: kido.zhao@bundleb2b.net + startedAt: 1622618229 + finishedAt: 1622618428 + taskType: 100 + taskStatus: 9 + resultDetailUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/test-7-1i6zpxpe3g-1622618428-result.csv' + sourceFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/test-1i6zpxpe3g-1622618227.csv' + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - createdAt + - updatedAt + - taskName + - email + - startedAt + - finishedAt + - taskType + - taskStatus + - resultDetailUrl + - sourceFileUrl + properties: + createdAt: + type: number + updatedAt: + type: number + taskName: + type: string + minLength: 1 + email: + type: string + minLength: 1 + description: The operation user's email + startedAt: + type: number + finishedAt: + type: number + taskType: + type: number + description: The task type + taskStatus: + type: number + description: The task status + resultDetailUrl: + type: string + minLength: 1 + description: The task processing result file url + sourceFileUrl: + type: string + minLength: 1 + description: The source file url + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + createdAt: 1622618228 + updatedAt: 1622618430 + taskName: test + email: kido.zhao@bundleb2b.net + startedAt: 1622618229 + finishedAt: 1622618428 + taskType: 100 + taskStatus: 9 + resultDetailUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/test-7-1i6zpxpe3g-1622618428-result.csv' + sourceFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/test-1i6zpxpe3g-1622618227.csv' + meta: + message: SUCCESS + '/batch/{taskCode}/tasks/{taskName}': + parameters: + - schema: + type: string + name: taskName + in: path + required: true + description: The task name the user customized + - schema: + type: string + name: taskCode + in: path + required: true + description: The task code of the task + post: + summary: Create batch operation async task + operationId: post-tasks-batch + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 201 + data: + companyId: '147340' + meta: + message: SUCCESS + properties: + code: + type: integer + data: + type: object + required: + - taskId + properties: + taskId: + type: integer + description: The unique task identify + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + taskId: 479 + meta: + message: SUCCESS + '413': + description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + '422': + description: Company was not valid. This is the result of missing required fields or invalid data. See the response for more details. + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + errors: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - detail + properties: + id: + type: string + minLength: 1 + detail: + type: string + minLength: 1 + required: + - errors + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 0 + data: + errors: + - id: string + detail: string + meta: + message: string + description: Batch task operations + security: + - authToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + taskFile: + type: string + description: 'You should put the `taskFile` into the form, because of our API doc tool not support the file type in the form-data.' + required: + - taskFile + examples: + example-1: + value: + taskFile: task file + description: |- + There have 3 different request body for different operations. + + We need full data for the create operation; + + For update operation, need contain the updated data and resources' ID; + + And for delete operation, just need resources' ID. + + You should put the `taskFile` into the form, because of our API doc tool not support the file type in the form-data. + tags: + - Task + parameters: [] + /batch/task-codes: + get: + summary: Get module batch tasks' codes + tags: + - Task + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + - taskName: COMPANY_CREATE + taskCode: 100 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/batch_tasks_companies_create_template.csv' + - taskName: COMPANY_UPDATE + taskCode: 101 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/batch_tasks_companies_update_template.csv' + - taskName: COMPANY_DELETE + taskCode: 102 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_CREATE + taskCode: 200 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_UPDATE + taskCode: 201 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_DELETE + taskCode: 202 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_CREATE + taskCode: 300 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_UPDATE + taskCode: 301 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_DELETE + taskCode: 302 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + taskName: + type: string + minLength: 1 + taskCode: + type: number + description: Task code for create batch task + templateFileUrl: + type: string + minLength: 1 + description: File template for create task + required: + - taskName + - taskCode + - templateFileUrl + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + example-1: + value: + code: 200 + data: + - taskName: COMPANY_CREATE + taskCode: 100 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/xxx.csv' + - taskName: COMPANY_UPDATE + taskCode: 101 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/xxx.csv' + - taskName: COMPANY_DELETE + taskCode: 102 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_CREATE + taskCode: 200 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_UPDATE + taskCode: 201 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: ADDRESS_DELETE + taskCode: 202 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_CREATE + taskCode: 300 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_UPDATE + taskCode: 301 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + - taskName: USER_DELETE + taskCode: 302 + templateFileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v3.0-batch-tasks-staging/' + meta: + message: SUCCESS + operationId: get-batch-task-codes + description: 'Get all module batch task codes, use this task code to create a batch task' + security: + - authToken: [] + parameters: [] +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Task diff --git a/docs/b2b-edition/specs/api-v3/user/user.yaml b/docs/b2b-edition/specs/api-v3/user/user.yaml new file mode 100644 index 000000000..63fad93c7 --- /dev/null +++ b/docs/b2b-edition/specs/api-v3/user/user.yaml @@ -0,0 +1,985 @@ +openapi: 3.0.1 +info: + title: User + description: BigCommerce B2B Edition Company User + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v3/io' +security: + - authToken: [] +tags: + - name: User + description: Company user management. +paths: + '/users/{userId}': + get: + tags: + - User + summary: Get a User + description: Get a company user's information by user ID. + operationId: companies_user_by_id + parameters: + - name: userId + in: path + description: Unique numeric ID of this user. + required: true + schema: + type: integer + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + examples: {} + example-1: + example: + code: 200 + data: + id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + message: success + '404': + $ref: '#/components/responses/404' + '422': + $ref: '#/components/responses/422' + '500': + $ref: '#/components/responses/500' + security: + - authToken: [] + put: + tags: + - User + summary: Update a User + description: Update a company user info + operationId: companies_user_update + parameters: + - name: userId + in: path + description: Unique numeric ID of this user. + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-without-company.yaml + - type: object + properties: + channelIds: + type: array + description: BigCommerce channel id list. Do not input this field if you don't want to update user channels + items: + type: integer + companyRoleId: + type: integer + x-stoplight: + id: 0dulwi6noeq5n + description: 'The company role id. This field is only applicable to the company''s RBAC feature. If your store doesn''t utilize this feature, please do not use this field.' + examples: + example-1: + value: + id: 4 + email: string + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + uuid: 1e01472b-858f-49cd-be85-91aa0ae3bbc9 + required: false + responses: + '200': + description: Updated successful + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + id: 1 + uuid: 095be615 + createdAt: 1574999690 + updatedAt: 1574999690 + companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + customerId: 12 + example-1: + example: + code: 200 + data: + id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + message: success + '404': + $ref: '#/components/responses/404' + '422': + $ref: '#/components/responses/422' + security: + - authToken: [] + x-codegen-request-body-name: body + delete: + tags: + - User + summary: Delete a User + description: 'Delete a company user, if this user is the only one administrator of company, will return a 500 Error' + operationId: companies_user_delete + parameters: + - name: userId + in: path + description: Unique numeric ID of this user. + required: true + schema: + type: integer + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + userId: + type: integer + description: Deleted user Id + example: 1 + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + userId: 1 + example-1: + example: + code: 200 + data: + userId: 0 + message: success + '404': + $ref: '#/components/responses/404' + '500': + $ref: '#/components/responses/500' + security: + - authToken: [] + x-code-samples: + - lang: Shell + source: | + curl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY + - lang: Python + source: | + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users" + + payload = {} + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' + } + + response = requests.request("GET", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: | + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + parameters: + - $ref: '#/components/parameters/userId' + /users: + get: + tags: + - User + summary: Get Users + description: 'Get company users, with pagination data' + operationId: companies_users_list + parameters: + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - name: minModified + in: query + description: Minimum modified timestamp + allowEmptyValue: true + schema: + type: number + format: time + - name: maxModified + in: query + description: Maximum modified timestamp + allowEmptyValue: true + schema: + type: number + - name: minCreated + in: query + description: Minimum created timestamp + allowEmptyValue: true + schema: + type: number + - name: maxCreated + in: query + description: Maximum created timestamp + allowEmptyValue: true + schema: + type: number + - name: roles + in: query + description: 'user roles(0=admin 1=senior_buyer 2=junior_buyer) eg. role[]=1, 2. default empty to get all.' + schema: + type: array + - name: companyId + in: query + description: Company ID + schema: + type: integer + - schema: + type: string + in: query + name: q + description: 'User query string.Supported fields: email, e.g. ?q=xyz@abc.com' + - schema: + type: string + format: email + in: query + name: email + description: Filter users accurately by email. Should be a correct email + - schema: + type: string + enum: + - '0' + - '1' + in: query + name: isIncludeExtraFields + description: Is show extra fields in the response + - schema: + type: integer + in: query + name: channelId + description: BigCommerce channel id + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + - type: object + properties: + meta: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + examples: {} + example-1: + example: + code: 200 + data: + - id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + message: success + meta: + pagination: + limit: 10 + offset: 1 + security: + - authToken: [] + post: + tags: + - User + summary: Create a User + description: 'Create a company user, which belongs company' + operationId: companies_users_create + requestBody: + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - type: object + properties: + companyId: + type: integer + example: 2 + description: 'Company ID of this user. ' + acceptWelcomeEmail: + type: boolean + description: If send accept welcome email to user. + uuid: + type: string + description: UUID of user + channelIds: + type: array + description: BigCommerce channel id + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + companyRoleId: + type: integer + x-stoplight: + id: o1q06no6rqbjc + description: 'The company role id. This field is only applicable to the company''s RBAC feature. If your store doesn''t utilize this feature, please do not use this field. When it has a value, it will override the value of the role field.' + required: + - companyId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + acceptWelcomeEmail: true + uuid: 1e01472b-858f-49cd-be85-91aa0ae3bbc9 + channelIds: + - 1 + originChannelId: 1 + extraFields: + - fieldName: string + fieldValue: string + required: true + description: '' + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: object + properties: + bcId: + type: integer + description: Created bc customer Id + example: 1 + userId: + type: integer + description: Created user Id + example: 2 + examples: + example-1: + value: + code: 200 + data: + bcId: 1 + userId: 2 + message: success + example-1: + example: + code: 200 + data: + customerId: 0 + userId: 0 + message: success + security: + - authToken: [] + x-code-samples: + - lang: Shell + source: | + curl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{ + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "phone": "122331212", + "userRole": 1 + }' + - lang: Python + source: | + import requests + + url = "https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users" + + payload = { + "firstName": "test", + "lastName": "test2", + "email": "test323@test.com", + "phone": "122331212", + "userRole": 1 + } + headers = { + 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY', + 'Content-Type': 'application/json' + } + + response = requests.request("POST", url, headers=headers, data = payload) + + print(response.text.encode('utf8')) + - lang: JavaScript + source: | + var myHeaders = new Headers(); + myHeaders.append("authToken", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY"); + myHeaders.append("Content-Type", "application/json"); + + var raw = JSON.stringify({"firstName":"test","lastName":"test2","email":"test323@test.com","phone":"122331212","userRole":1}); + + var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' + }; + + fetch("https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users", requestOptions) + .then(response => response.text()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + x-codegen-request-body-name: data + /users/bulk: + post: + tags: + - User + summary: Bulk Create Company User + description: |- + Create company users in batch. All of the user should be in same + company. + operationId: companies_users_bulk_create_create + requestBody: + content: + application/json: + schema: + type: array + description: Request body + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - type: object + properties: + acceptWelcomeEmail: + description: (0=will not receive email 1=will receive email) + type: boolean + companyId: + type: integer + description: Company ID of this user + example: 31 + uuid: + type: string + description: UUID of user + channelIds: + type: array + description: BigCommerce channel id list + items: + type: integer + originChannelId: + type: integer + description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + companyRoleId: + type: integer + x-stoplight: + id: 04op39epp8ray + description: 'The company role id. This field is only applicable to the company''s RBAC feature. If your store doesn''t utilize this feature, please do not use this field. When it has a value, it will override the value of the role field.' + required: + - companyId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + - companyId: 31 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + acceptWelcomeEmail: true + uuid: 095be615 + channelId: 1 + extraFields: + - fieldName: string + fieldValue: string + required: true + description: 'Whether the field is required, please refer to the Create User API' + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + type: array + items: + type: object + properties: + userId: + type: number + description: Created User Id + bcId: + type: number + description: Created bc customer Id + examples: + example-1: + value: + code: 200 + meta: + message: SUCCESS + data: + - bcId: 1 + userId: 2 + - bcId: 2 + userId: 3 + example-1: + example: + code: 200 + message: success + data: + - id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + '404': + $ref: '#/components/responses/404' + '409': + description: Conflict + content: + application/json: + schema: + type: object + properties: + code: + type: integer + example: 409 + meta: + type: object + properties: + message: + type: string + example: Conflict Error + data: + type: object + properties: + errors: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - type: object + properties: + _detail: + type: string + description: Conflict error detail info. + example: email is existed + examples: + example-1: + value: + code: 409 + meta: + message: Conflict Error + data: + errors: + - companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + bcId: 12 + detail: email is existed + '413': + description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + content: + application/json: + schema: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + examples: + example-1: + value: + code: 413 + meta: + message: Request Entity Too Large + data: {} + '422': + description: 'Response Bad Request, some user created failed. plase double check user entity.' + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + example: 422 + data: + description: Response data + type: object + properties: + errors: + type: array + items: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - type: object + properties: + _detail: + type: string + example: role is non-existent + description: The detail of error info + meta: + type: object + properties: + message: + type: string + example: Unprocessable entity + description: Response message + examples: + example-1: + value: + code: 422 + data: + errors: + - companyId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + bcId: 12 + detail: role is non-existent + - id: 2 + uuid: 095be625 + createdAt: 1574999690 + updatedAt: 1574999690 + companyId: 2 + email: user2@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + bcId: '13' + meta: + message: Unprocessable entity + example-1: + example: + code: 400 + data: + id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + message: bulk create error. + security: + - authToken: [] + '/users/customer/{customerId}': + get: + tags: + - User + summary: Get a User by Customer ID + description: Get a userʼs information by BigCommerce customer ID field. + operationId: companies_user_read + responses: + '200': + description: Response Success + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + examples: {} + example-1: + example: + code: 200 + data: + id: 1 + uuid: 095be615 + catalogId: 2 + email: user@example.com + firstName: Tom + lastName: Cat + phoneNumber: '112233' + role: 1 + createdAt: 1574999690 + updatedAt: 1574999690 + message: success + '404': + $ref: '#/components/responses/404' + security: + - authToken: [] + parameters: + - schema: + type: integer + name: customerId + in: path + required: true + description: Customer ID of BigCommerce customer user. + /users/extra-fields: + get: + summary: Get user extra field configs + tags: + - User + responses: + '200': + description: OK + content: + application/json: + schema: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - type: object + properties: + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + meta: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + operationId: get-users-extra-fields + parameters: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset + security: + - authToken: [] +components: + responses: + '404': + description: Not Found Error + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + example: 404 + data: + type: object + description: Response data + meta: + type: object + properties: + message: + type: string + example: Not Found Error + description: Error message of this response + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Not Found Error + '422': + description: Parameter Error + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 422 + data: + errMsg: + min_created: + - A valid integer is required. + meta: + message: Parameter Error + properties: + code: + type: number + data: + type: object + required: + - errMsg + properties: + errMsg: + type: object + required: + - '{field name}' + properties: + '{field name}': + type: array + items: + type: string + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + min_created: + value: + code: 422 + data: + errMsg: + min_created: + - A valid integer is required. + meta: + message: Parameter Error + 'email ': + value: + code: 422 + data: + errMsg: + email: + - Enter a valid email address. + meta: + message: Parameter Error + '500': + description: Server Error + content: + application/json: + schema: + type: object + description: Response body + properties: + code: + type: number + description: Response status code + example: 500 + data: + type: object + description: Response data + meta: + type: object + properties: + message: + type: string + example: Server Error + description: Server Error Response message + examples: + example-1: + value: + code: 500 + data: {} + meta: + message: Server Error + parameters: + limit: + name: limit + in: query + description: 'Pagination limit default: 10' + allowEmptyValue: true + schema: + maximum: 250 + exclusiveMaximum: true + minimum: 1 + exclusiveMinimum: true + type: integer + default: 10 + offset: + name: offset + in: query + description: 'Pagination offset default: 0' + allowEmptyValue: true + schema: + type: integer + minimum: 0 + userId: + name: userId + in: path + description: Unique numeric ID of this user. + required: true + schema: + type: integer + companyId: + name: companyId + in: path + description: Unique numeric ID of this company. + required: true + schema: + type: integer + securitySchemes: + authToken: + type: apiKey + name: authToken + in: header diff --git a/docs/b2b-edition/specs/storefront/app/address.yaml b/docs/b2b-edition/specs/storefront/app/address.yaml new file mode 100644 index 000000000..400439ec8 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/address.yaml @@ -0,0 +1,1596 @@ +openapi: '3.0.0' +info: + title: Address + version: '1.0' + description: '' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + '/companies/{companyId}/addresses': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Company Address List + tags: + - address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + addresses: + '1414': + addressId: 1414 + firstName: Ada + lastName: Bob + isShipping: 1 + isBilling: 1 + addressLine1: line1 + addressLine2: line1 + city: AS + country: + countryName: Argentina + countryCode: AR + zipCode: '10013' + state: + stateName: Mendoza + stateCode: M + phoneNumber: '16732680944' + label: label + defaultShippingId: '1414' + defaultBillingId: '1414' + canEnterNewAddress: false + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - addresses + - defaultShippingId + - defaultBillingId + - canEnterNewAddress + properties: + addresses: + type: object + required: + - '1414' + properties: + '1414': + type: object + required: + - addressId + - firstName + - lastName + - isShipping + - isBilling + - addressLine1 + - addressLine2 + - city + - country + - zipCode + - state + - phoneNumber + - label + properties: + addressId: + type: number + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + isShipping: + type: number + isBilling: + type: number + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + label: + type: string + minLength: 1 + externalId: + type: string + defaultShippingId: + type: string + minLength: 1 + defaultBillingId: + type: string + minLength: 1 + canEnterNewAddress: + type: boolean + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + addresses: + '1414': + addressId: 1414 + firstName: Ada + lastName: Bob + isShipping: 1 + isBilling: 1 + addressLine1: line1 + addressLine2: line1 + city: AS + country: + countryName: Argentina + countryCode: AR + zipCode: '10013' + state: + stateName: Mendoza + stateCode: M + phoneNumber: '16732680944' + label: label + externalId: '2' + defaultShippingId: '1414' + defaultBillingId: '1414' + canEnterNewAddress: false + operationId: get-companies-companyId-addresses + description: Get Address List + x-internal: true + post: + summary: Create An Address + operationId: post-companies-companyId-addresses + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1418' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1418' + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + label: address label + firstName: Jo + lastName: Sweert + addressLine1: address line 1 + addressLine2: address line 2 + city: Denver + zipCode: '80022' + phoneNumber: '111111111' + country: + countryName: Aruba + countryCode: AW + state: + stateName: AS + stateCode: '' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + properties: + label: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + isShipping: + type: string + minLength: 1 + description: '"0":Not set as shipping address, "1":Set as shipping address' + isBilling: + type: string + minLength: 1 + description: '"0":Not set as billing address, "1":Set as billing address' + isDefaultShipping: + type: string + minLength: 1 + description: '"0":Not set as default shipping address, "1":Set as default shipping address' + isDefaultBilling: + type: string + minLength: 1 + description: '"0":Not set as default billing address, "1":Set as default billing address' + externalId: + type: string + required: + - label + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - zipCode + - phoneNumber + - country + - state + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + description: Create An Address + tags: + - address + x-internal: true + '/companies/{companyId}/addresses/{addressId}': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + - schema: + type: string + name: addressId + in: path + required: true + get: + summary: Get An Address + tags: + - address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1418' + firstName: Jo + lastName: Sweert + addressLine1: address line 1 + addressLine2: address line 2 + country: + countryName: Aruba + countryCode: AW + state: + stateName: AS + stateCode: '' + city: Denver + phoneNumber: '111111111' + zipCode: '80022' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + label: address label + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - country + - state + - city + - phoneNumber + - zipCode + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - label + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + city: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + label: + type: string + minLength: 1 + externalId: + type: string + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1418' + firstName: Jo + lastName: Sweert + addressLine1: address line 1 + addressLine2: address line 2 + country: + countryName: Aruba + countryCode: AW + state: + stateName: AS + stateCode: '' + city: Denver + phoneNumber: '111111111' + zipCode: '80022' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + label: address label + externalId: '4' + operationId: get-companies-companyId-addresses-addressId + description: Get An Address + x-internal: true + put: + summary: Update An Address + operationId: put-companies-companyId-addresses-addressId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1418' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1418' + description: Update An Address + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + label: address label + firstName: Jo + lastName: Sweert + addressLine1: address line 1 + addressLine2: address line 2 + city: Denver + zipCode: '80022' + phoneNumber: '111111112' + country: + countryName: Aruba + countryCode: AW + state: + stateName: AS + stateCode: '' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + addressId: '1418' + properties: + label: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + addressId: + type: string + minLength: 1 + externalId: + type: string + required: + - label + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - zipCode + - phoneNumber + - country + - state + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - addressId + tags: + - address + x-internal: true + '/companies/{companyId}/addresses/{addressId}/activation': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + - schema: + type: string + name: addressId + in: path + required: true + put: + summary: Mark An Address As Active Or Inactive + operationId: put-companies-companyId-addresses-addressId-activation + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1418' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1418' + description: Mark An Address As Active Or Inactive + tags: + - address + x-internal: true + '/companies/{companyId}/default-addresses': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Default Addresses By CompanyId + tags: + - address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + shipping: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + billing: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - shipping + - billing + properties: + shipping: + type: object + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - country + - state + - city + - phoneNumber + - zipCode + - label + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + city: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + label: + type: string + minLength: 1 + externalId: + type: string + billing: + type: object + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - country + - state + - city + - phoneNumber + - zipCode + - label + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + city: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + label: + type: string + minLength: 1 + '': + type: string + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + shipping: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + externalId: '1' + billing: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + externalId: '1' + operationId: get-companies-companyId-default-addresses + description: Get Default Addresses By CompanyId + x-internal: true + '/companies/{companyId}/addresses/searches': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Search Address + tags: + - address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + addressBookStatus: '1' + defaultAddress: + companyId: '5716' + companyName: levi-test + companyAddress: address line 1 address line 2 + companyCountry: Aruba + companyCountryCode: '' + companyState: '' + companyStateCode: '' + companyCity: Denver + companyZipCode: '80022' + firstName: '' + lastName: '' + phoneNumber: '17195453626' + label: '' + list: + - companyId: '5716' + companyName: levi-test + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '16732680944' + label: label + pagination: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - addressBookStatus + - defaultAddress + - list + - pagination + properties: + addressBookStatus: + type: string + minLength: 1 + defaultAddress: + type: object + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - firstName + - lastName + - phoneNumber + - label + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyCountryCode: + type: string + companyState: + type: string + companyStateCode: + type: string + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + firstName: + type: string + lastName: + type: string + phoneNumber: + type: string + minLength: 1 + label: + type: string + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyCountryCode: + type: string + minLength: 1 + companyState: + type: string + minLength: 1 + companyStateCode: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + label: + type: string + minLength: 1 + '': + type: string + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - firstName + - lastName + - phoneNumber + - label + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + addressBookStatus: '1' + defaultAddress: + companyId: '5716' + companyName: company name + companyAddress: address line 1 address line 2 + companyCountry: Aruba + companyCountryCode: '' + companyState: '' + companyStateCode: '' + companyCity: Denver + companyZipCode: '80022' + firstName: '' + lastName: '' + phoneNumber: '17195453626' + label: '' + list: + - companyId: '5716' + companyName: company name + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '16732680944' + label: label + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-companies-companyId-addresses-searches + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Query string + description: Search Address + x-internal: true + post: + summary: Search For Address With Multiple Search Filter + operationId: post-companies-companyId-addresses-searches + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + list: + - addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + city: AS + state: + stateName: Mendoza + stateCode: M + country: + countryName: Argentina + countryCode: AR + phoneNumber: '16732680944' + zipCode: '10013' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + label: label + defaultAddressIds: + shippingAddressId: '1414' + billingAddressId: '1414' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - pagination + - list + - defaultAddressIds + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: object + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + required: + - stateName + - stateCode + country: + type: object + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + required: + - countryName + - countryCode + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + label: + type: string + minLength: 1 + '': + type: string + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - phoneNumber + - zipCode + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - label + defaultAddressIds: + type: object + required: + - shippingAddressId + - billingAddressId + properties: + shippingAddressId: + type: string + minLength: 1 + billingAddressId: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + list: + - addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + city: AS + state: + stateName: Mendoza + stateCode: M + country: + countryName: Argentina + countryCode: AR + phoneNumber: '16732680944' + zipCode: '10013' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + label: label + externalId: '100' + defaultAddressIds: + shippingAddressId: '1414' + billingAddressId: '1414' + description: Search For Address With Multiple Search Filter + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + offset: + type: number + limit: + type: number + q: + type: string + filters: + type: object + properties: + firstName: + type: string + lastName: + type: string + address: + type: string + city: + type: string + country: + type: string + state: + type: string + phoneNumber: + type: string + zipCode: + type: string + label: + type: string + addressType: + type: object + properties: + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + required: + - isShipping + - isBilling + required: + - firstName + - lastName + - address + - city + - country + - state + - phoneNumber + - zipCode + - label + - addressType + required: + - offset + - limit + - q + - filters + x-examples: + example-1: + offset: 0 + limit: 10 + q: '' + filters: + firstName: '' + lastName: '' + address: '' + city: '' + country: '' + state: '' + phoneNumber: '' + zipCode: '' + label: '' + addressType: + isShipping: '1' + isBilling: '1' + tags: + - address + x-internal: true + /companies/addresses/bulk-creation/upload: + post: + summary: Upload Address File + tags: + - address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + operationId: get-companies-addresses-bulk-creation-upload + description: Upload Address File + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + addressFile: + type: + - object + - string + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: address +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/backend.yaml b/docs/b2b-edition/specs/storefront/app/backend.yaml new file mode 100644 index 000000000..8bd3a5f88 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/backend.yaml @@ -0,0 +1,1532 @@ +openapi: '3.0.0' +info: + title: backend + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /backend/session/status: + get: + summary: Get session status + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + authToken: + type: string + minLength: 1 + required: + - authToken + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + authToken: authToken + operationId: get-backend-session-status + parameters: + - schema: + type: string + in: query + name: storehash + required: true + description: Store Hash + description: Get session status + x-internal: true + /backend/session: + delete: + summary: Backend User Login + operationId: delete-backend-session + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Backend User Login + tags: + - backend + x-internal: true + post: + summary: Backend User Login + operationId: post-backend-session + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4 + permissionModules: + - '17100' + - '17101' + - '11114' + isPremium: '0' + userId: 3 + isSales: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - authToken + - permissionModules + - isPremium + - userId + - isSales + properties: + authToken: + type: string + minLength: 1 + permissionModules: + type: array + description: Permissions owned by backend users + items: + type: object + isPremium: + type: string + minLength: 1 + description: '"0":Not premium, "0":Is premium' + userId: + type: number + isSales: + type: string + minLength: 1 + description: '"0":Not sales, "0":Is sales' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4 + permissionModules: + - '17100' + - '17101' + - '11114' + isPremium: '0' + userId: 3 + isSales: '0' + description: Backend User Login + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + email: + type: string + minLength: 1 + password: + type: string + minLength: 1 + storeHash: + type: string + minLength: 1 + required: + - email + - password + - storeHash + x-examples: + example-1: + email: payton@b2b.net + password: test123456 + storeHash: 1i6zpxpe3g + examples: + example-1: + value: + email: payton@b2b.net + password: test123456 + storeHash: 1i6zpxpe3g + tags: + - backend + x-internal: true + /backend/user: + post: + summary: Create a backend user + operationId: post-backend-end-user-users + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: string + minLength: 1 + required: + - userId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: '123' + examples: + example-1: + value: + code: 200 + message: success + data: + userId: '12' + '': + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: string + minLength: 1 + required: + - userId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: '36' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + userId: '1' + description: Create a backend user + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + email: levi.tuo@silksoftware.com + username: levi.tuo + phoneNumber: '' + status: '1' + roleId: '23' + properties: + email: + type: string + minLength: 1 + username: + type: string + minLength: 1 + phoneNumber: + type: string + status: + type: string + minLength: 1 + description: '"0":"BLOCK", "1":"ACTIVE"' + roleId: + type: string + minLength: 1 + description: Backend role's id + required: + - email + - username + - phoneNumber + - roleId + description: '' + tags: + - backend + x-internal: true + parameters: [] + /backend/users: + get: + summary: Get backend user list + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '36' + status: '0' + email: levi.tuo@silksoftware.com + roleId: '23' + roleName: Administrator + isOwner: '0' + isInnerSalesRep: '0' + username: levi.tuo + phoneNumber: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + status: + type: string + minLength: 1 + description: 'backend user status("0":block, "1":active)' + email: + type: string + minLength: 1 + roleId: + type: string + minLength: 1 + roleName: + type: string + minLength: 1 + isOwner: + type: string + minLength: 1 + description: '"0":Not store owner, "1":Is store owner' + isInnerSalesRep: + type: string + minLength: 1 + description: '"0":Not inner sales rep, "1":Is inner sales rep' + username: + type: string + minLength: 1 + phoneNumber: + type: string + required: + - id + - status + - email + - roleId + - roleName + - isOwner + - isInnerSalesRep + - username + - phoneNumber + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '36' + status: '0' + email: example@example.com + roleId: '23' + roleName: Administrator + isOwner: '0' + isInnerSalesRep: '0' + username: username + phoneNumber: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-backend-users + description: Get backend user list + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Query string + x-internal: true + '/backend/users/{user_id}': + parameters: + - schema: + type: string + name: user_id + in: path + required: true + get: + summary: Get backend user info + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + id: '36' + status: '0' + email: levi.tuo@silksoftware.com + roleId: '23' + roleName: Administrator + username: levi.tuo + phoneNumber: '' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - id + - status + - email + - roleId + - roleName + - username + - phoneNumber + properties: + id: + type: string + minLength: 1 + status: + type: string + minLength: 1 + description: 'backend user status("0":block, "1":active)' + email: + type: string + minLength: 1 + roleId: + type: string + minLength: 1 + roleName: + type: string + minLength: 1 + username: + type: string + minLength: 1 + phoneNumber: + type: string + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + id: '36' + status: '0' + email: example@example.com + roleId: '23' + roleName: Administrator + username: username + phoneNumber: '' + operationId: get-backend-users-user_id + description: Get backend user info + x-internal: true + put: + summary: Update backend user info + operationId: put-backend-users-user_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: number + required: + - userId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: 36 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + userId: 1 + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + email: levi.tuo@silksoftware.com + username: levi.tuo + phoneNumber: '' + status: '1' + roleId: '23' + properties: + email: + type: string + minLength: 1 + username: + type: string + minLength: 1 + phoneNumber: + type: string + status: + type: string + minLength: 1 + description: 'backend user status("0":block, "1":active)' + roleId: + type: string + minLength: 1 + required: + - email + - username + - phoneNumber + - status + - roleId + description: Update backend user info + tags: + - backend + x-internal: true + delete: + summary: Delete Backend User + operationId: delete-backend-users-user_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Delete Backend User + tags: + - backend + x-internal: true + /backend/password/forget: + post: + summary: Forget Backend User Password + operationId: post-backend-password-forget + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + type: object + properties: + storeHash: + type: string + email: + type: string + description: Forget Backend User Password + tags: + - backend + x-internal: true + /backend/password/reset: + put: + summary: Reset Backend User Password + operationId: put-backend-password-reset + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Reset Backend User Password + tags: + - backend + x-internal: true + post: + summary: Reset Backend User Password + operationId: post-backend-password-reset + responses: + '200': + description: A successful request will return a web form + requestBody: + content: + application/json: + schema: + type: object + properties: + resetToken: + type: string + password: + type: string + examples: {} + description: Reset Backend User Password + tags: + - backend + x-internal: true + '/backend/password/reset/{reset_token}': + parameters: + - schema: + type: string + name: reset_token + in: path + required: true + get: + summary: Reset Backend User Password + tags: + - backend + responses: + '200': + description: A successful request will return a web form + operationId: get-backend-password-reset-reset_token + description: Reset Backend User Password html page + x-internal: true + /backend/roles: + get: + summary: Get All Backend Roles + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - roleName + - roleType + - description + - isSales + properties: + id: + type: string + minLength: 1 + roleName: + type: string + minLength: 1 + roleType: + type: string + minLength: 1 + description: + type: string + isSales: + type: string + minLength: 1 + required: + - pagination + - list + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + pagination: + totalCount: 10 + offset: 0 + limit: 10 + list: + - id: '46' + roleName: testInit + roleType: '1' + description: '' + isSales: '0' + - id: '45' + roleName: test d + roleType: '1' + description: '' + isSales: '0' + - id: '44' + roleName: test sales staff + roleType: '1' + description: '' + isSales: '1' + - id: '41' + roleName: TestIsSales + roleType: '1' + description: '' + isSales: '1' + - id: '42' + roleName: test Sales + roleType: '1' + description: '' + isSales: '1' + - id: '40' + roleName: Sales Rep + roleType: '0' + description: '' + isSales: '1' + - id: '33' + roleName: test409 + roleType: '1' + description: '' + isSales: '0' + - id: '29' + roleName: test + roleType: '1' + description: '' + isSales: '0' + - id: '21' + roleName: Store Owner + roleType: '0' + description: '' + isSales: '0' + - id: '23' + roleName: Administrator + roleType: '0' + description: '' + isSales: '0' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + pagination: + totalCount: 10 + offset: 0 + limit: 10 + list: + - id: '1' + roleName: role name + roleType: '1' + description: Desc + isSales: '0' + operationId: get-backend-roles + description: Get All Backend Roles + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: action + description: '"addUser" is available' + x-internal: true + /backend/role: + post: + summary: Create Backend Role + operationId: post-backend-role + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + roleId: + type: string + minLength: 1 + required: + - roleId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + roleId: '47' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + roleId: '1' + description: Create Backend Role + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + permissionIds: + - '314' + - '311' + - '312' + - '313' + roleName: levi-test-role + isSales: '0' + properties: + permissionIds: + type: array + description: Backend Permission's id + items: + type: string + roleName: + type: string + minLength: 1 + isSales: + type: string + minLength: 1 + default: '0' + description: '"0":Not sales, "1":Is sales' + description: + type: string + required: + - permissionIds + - roleName + tags: + - backend + x-internal: true + '/backend/roles/{role_id}': + parameters: + - schema: + type: string + name: role_id + in: path + required: true + get: + summary: Get Backend Role Info + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + roleId: '47' + roleName: levi-test-role + roleType: '1' + description: '' + permissions: + - '311' + - '314' + - '313' + - '312' + isSales: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - roleId + - roleName + - roleType + - description + - permissions + - isSales + properties: + roleId: + type: string + minLength: 1 + roleName: + type: string + minLength: 1 + roleType: + type: string + minLength: 1 + description: '"0":"Predefined", "1":"Customizable"' + description: + type: string + permissions: + type: array + description: Permissions owned by the role + items: + type: string + isSales: + type: string + minLength: 1 + description: '"0":Not sales, "1":Is sales' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + roleId: '1' + roleName: role name + roleType: '1' + description: '' + permissions: + - '311' + - '314' + - '313' + - '312' + isSales: '0' + operationId: get-backend-roles-role_id + description: Get Backend Role Info + x-internal: true + put: + summary: Update Backend Role Info + operationId: put-backend-roles-role_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + roleId: + type: string + minLength: 1 + required: + - roleId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + roleId: '47' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + roleId: '1' + description: Update Backend Role Info + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + permissionIds: + - '311' + - '314' + - '313' + - '312' + - '359' + - '360' + - '361' + - '365' + - '363' + - '367' + roleName: levi-test-role2 + isSales: '0' + properties: + permissionIds: + type: array + description: Backend Permission's id + items: + type: string + roleName: + type: string + minLength: 1 + isSales: + type: string + minLength: 1 + description: '"0":Not sales, "1":Is sales' + description: + type: string + required: + - permissionIds + - roleName + tags: + - backend + x-internal: true + delete: + summary: Delete Backend Role + operationId: delete-backend-roles-role_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Delete Backend Role + tags: + - backend + x-internal: true + /backend/permissions: + get: + summary: Get All Backend Permissions + tags: + - backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '440' + permissionModuleId: '16104' + - id: '348' + permissionModuleId: '13100' + - id: '311' + permissionModuleId: '10000' + - id: '312' + permissionModuleId: '10001' + - id: '313' + permissionModuleId: '10002' + - id: '314' + permissionModuleId: '10003' + - id: '315' + permissionModuleId: '11100' + - id: '316' + permissionModuleId: '11101' + - id: '317' + permissionModuleId: '11102' + - id: '318' + permissionModuleId: '11103' + - id: '319' + permissionModuleId: '11104' + - id: '320' + permissionModuleId: '11105' + - id: '321' + permissionModuleId: '11106' + - id: '322' + permissionModuleId: '11107' + - id: '323' + permissionModuleId: '11108' + - id: '324' + permissionModuleId: '11109' + - id: '325' + permissionModuleId: '11110' + - id: '326' + permissionModuleId: '11111' + - id: '327' + permissionModuleId: '11112' + - id: '328' + permissionModuleId: '11113' + - id: '329' + permissionModuleId: '11200' + - id: '330' + permissionModuleId: '11201' + - id: '331' + permissionModuleId: '11202' + - id: '332' + permissionModuleId: '11203' + - id: '333' + permissionModuleId: '11204' + - id: '334' + permissionModuleId: '11205' + - id: '335' + permissionModuleId: '11206' + - id: '336' + permissionModuleId: '11300' + - id: '337' + permissionModuleId: '11301' + - id: '338' + permissionModuleId: '11302' + - id: '339' + permissionModuleId: '11303' + - id: '340' + permissionModuleId: '11304' + - id: '341' + permissionModuleId: '11400' + - id: '342' + permissionModuleId: '11401' + - id: '343' + permissionModuleId: '11402' + - id: '344' + permissionModuleId: '11500' + - id: '345' + permissionModuleId: '12100' + - id: '346' + permissionModuleId: '12101' + - id: '347' + permissionModuleId: '12300' + - id: '349' + permissionModuleId: '13101' + - id: '350' + permissionModuleId: '13102' + - id: '351' + permissionModuleId: '13200' + - id: '352' + permissionModuleId: '13300' + - id: '353' + permissionModuleId: '13301' + - id: '354' + permissionModuleId: '13400' + - id: '355' + permissionModuleId: '14100' + - id: '356' + permissionModuleId: '14500' + - id: '357' + permissionModuleId: '15100' + - id: '358' + permissionModuleId: '15101' + - id: '359' + permissionModuleId: '15102' + - id: '360' + permissionModuleId: '15103' + - id: '361' + permissionModuleId: '15104' + - id: '362' + permissionModuleId: '15200' + - id: '363' + permissionModuleId: '15201' + - id: '364' + permissionModuleId: '15300' + - id: '365' + permissionModuleId: '15301' + - id: '366' + permissionModuleId: '15400' + - id: '367' + permissionModuleId: '15401' + - id: '368' + permissionModuleId: '16101' + - id: '369' + permissionModuleId: '16102' + - id: '370' + permissionModuleId: '16103' + - id: '371' + permissionModuleId: '16105' + - id: '372' + permissionModuleId: '16106' + - id: '502' + permissionModuleId: '16107' + - id: '503' + permissionModuleId: '17100' + - id: '504' + permissionModuleId: '17101' + - id: '506' + permissionModuleId: '17103' + - id: '507' + permissionModuleId: '0' + - id: '508' + permissionModuleId: '17201' + - id: '509' + permissionModuleId: '17300' + - id: '510' + permissionModuleId: '0' + - id: '511' + permissionModuleId: '17500' + - id: '590' + permissionModuleId: '18100' + - id: '591' + permissionModuleId: '18101' + - id: '592' + permissionModuleId: '18102' + - id: '593' + permissionModuleId: '18103' + - id: '594' + permissionModuleId: '18200' + - id: '595' + permissionModuleId: '18201' + - id: '596' + permissionModuleId: '18202' + - id: '597' + permissionModuleId: '18203' + - id: '598' + permissionModuleId: '18204' + - id: '599' + permissionModuleId: '18300' + - id: '600' + permissionModuleId: '18400' + - id: '601' + permissionModuleId: '16108' + - id: '602' + permissionModuleId: '16109' + - id: '505' + permissionModuleId: '11114' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Permission's id + permissionModuleId: + type: string + minLength: 1 + required: + - id + - permissionModuleId + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '440' + permissionModuleId: '16104' + - id: '348' + permissionModuleId: '13100' + operationId: get-backend-permissions + description: Get All Backend Permissions + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: backend +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/bc-api.yaml b/docs/b2b-edition/specs/storefront/app/bc-api.yaml new file mode 100644 index 000000000..6f7e0ad1a --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/bc-api.yaml @@ -0,0 +1,58 @@ +openapi: '3.0.0' +info: + title: bc-api + version: '1.0' + license: + name: 'https://api-b2b.bigcommerce.com/api/v2' + description: '' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /bcauth: + get: + summary: Get bigcommerce auth + tags: + - bc-api + responses: {} + operationId: get-bcauth + description: Get bigcommerce auth + parameters: + - schema: + type: string + in: query + name: context + - schema: + type: string + in: query + name: code + - schema: + type: string + in: query + name: scope + x-internal: true + /bcload: + get: + summary: Get bigcommerce load + tags: + - bc-api + responses: {} + operationId: get-bcload + parameters: + - schema: + type: string + in: query + name: signed_payload + description: Get bigcommerce load + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: bc-api +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/catalog.yaml b/docs/b2b-edition/specs/storefront/app/catalog.yaml new file mode 100644 index 000000000..b482f6dc4 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/catalog.yaml @@ -0,0 +1,130 @@ +openapi: '3.0.0' +info: + title: catalog + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /catalogs: + get: + summary: Get Catalog List + tags: + - catalog + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - catalogId + - catalogName + properties: + catalogId: + type: string + minLength: 1 + catalogName: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - catalogId: '1' + catalogName: Wholesale001 + - catalogId: '2' + catalogName: allenB2b + - catalogId: '5' + catalogName: test + - catalogId: '6' + catalogName: s-test1 pricelist + - catalogId: '7' + catalogName: Wholesale0011 + - catalogId: '8' + catalogName: allenB2b1 + - catalogId: '9' + catalogName: test1 + - catalogId: '10' + catalogName: s-test1 pricelist1 + - catalogId: '11' + catalogName: Wholesale group + - catalogId: '13' + catalogName: price test 1 + pagination: + totalCount: 13 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - catalogId: '1' + catalogName: Wholesale001 + - catalogId: '2' + catalogName: allenB2b + pagination: + totalCount: 2 + offset: 0 + limit: 10 + operationId: get-catalogs + description: Get Catalog List + parameters: + - schema: + type: string + in: query + name: q + description: Query string + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: catalog +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/company.yaml b/docs/b2b-edition/specs/storefront/app/company.yaml new file mode 100644 index 000000000..24c06f232 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/company.yaml @@ -0,0 +1,4215 @@ +openapi: '3.0.0' +info: + title: company + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /companies: + get: + summary: Get Companies + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - companyId: '5456' + companyName: CharlesCo + bcGroupName: CharlesCo + companyStatus: '1' + uuid: '' + catalogId: '9' + catalogName: test1 + updatedAt: '1622108658' + createdAt: '1598955819' + - companyId: '5716' + companyName: levi-test + bcGroupName: levi-test + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1622108356' + createdAt: '1622108356' + - companyId: '5712' + companyName: KobeCropTest3210 + bcGroupName: KobeCropTest3210_CFAo + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621902093' + createdAt: '1621405788' + - companyId: '5715' + companyName: sell it + bcGroupName: sell it + companyStatus: '0' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621837685' + createdAt: '1621837685' + - companyId: '5714' + companyName: jim-test-company + bcGroupName: jim-test-company_fmqT + companyStatus: '1' + uuid: '' + catalogId: '2' + catalogName: allenB2b + updatedAt: '1621492280' + createdAt: '1621408275' + - companyId: '5713' + companyName: jim-test-lose-phone + bcGroupName: jim-test-lose-phone + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621408226' + createdAt: '1621408165' + - companyId: '5711' + companyName: Hannah Test + bcGroupName: Hannah Test_lvSu + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621405517' + createdAt: '1621405209' + - companyId: '5710' + companyName: jim-test-comp-1 + bcGroupName: jim-test-comp-1_LHxy + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621394542' + createdAt: '1621394518' + - companyId: '5709' + companyName: jim-test-comp-1 + bcGroupName: jim-test-comp-1_dauk + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621394253' + createdAt: '1621394253' + - companyId: '5708' + companyName: jim-test-comp-1 + bcGroupName: jim-test-comp-1 + companyStatus: '1' + uuid: '' + catalogId: '5' + catalogName: test + updatedAt: '1621394191' + createdAt: '1621394191' + pagination: + totalCount: 5415 + offset: 0 + limit: 10 + canLogin: 0 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + - canLogin + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + bcGroupName: + type: string + minLength: 1 + companyStatus: + type: string + minLength: 1 + description: '"0": "PENDING", "1": "APPROVED", "2": "REJECTED", "3": "INACTIVE"' + uuid: + type: string + catalogId: + type: string + minLength: 1 + catalogName: + type: string + minLength: 1 + updatedAt: + type: string + minLength: 1 + createdAt: + type: string + minLength: 1 + required: + - companyId + - companyName + - bcGroupName + - companyStatus + - uuid + - catalogId + - catalogName + - updatedAt + - createdAt + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + canLogin: + type: number + required: + - code + - message + - data + examples: + standard response: + value: + code: 0 + message: string + data: + list: + - companyId: '5456' + companyName: CharlesCo + bcGroupName: CharlesCo + companyStatus: '1' + uuid: '' + catalogId: '9' + catalogName: test1 + updatedAt: '1622169445' + createdAt: '1598955819' + pagination: + totalCount: 0 + offset: 0 + limit: 0 + canLogin: 0 + include extra fields: + value: + code: 0 + message: string + data: + list: + - companyId: '5456' + companyName: CharlesCo + bcGroupName: CharlesCo + companyStatus: '1' + uuid: '' + catalogId: '9' + catalogName: test1 + updatedAt: '1622169445' + createdAt: '1598955819' + extraInt1: 0 + extraInt2: 0 + extraInt3: 0 + extraInt4: 0 + extraInt5: 0 + extraStr1: string + extraStr2: string + extraStr3: string + extraStr4: string + extraStr5: string + extraText: string + pagination: + totalCount: 0 + offset: 0 + limit: 0 + canLogin: 0 + operationId: get-companies + description: Get all companies list + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Company query string + - schema: + type: string + enum: + - updatedAt + - companyName + default: updatedAt + in: query + name: sortBy + description: The response sorted by which field + - schema: + type: string + enum: + - DESC + - ASC + default: DESC + in: query + name: orderBy + - schema: + type: integer + enum: + - '0' + - '1' + - '2' + - '3' + in: query + name: status + description: '0=PENDING, 1=APPROVED, 2=REJECTED, 3=INACTIVE, If it is null, it means get all.' + - schema: + type: string + in: query + name: minLastModifiedTime + description: Minimum last modified time + - schema: + type: string + in: query + name: maxLastModifiedTime + description: Maxinum last modified time + - schema: + type: string + in: query + name: minLastCreatedTime + description: Minimum last created time + - schema: + type: string + in: query + name: maxLastCreatedTime + description: Maxinum last created time + - schema: + type: string + enum: + - '"0"' + - '"1"' + in: query + name: includeExtra + description: Is show extra fields in the response + - schema: + type: integer + in: query + name: extraInt1 + description: Query extra int fields 1 + - schema: + type: integer + in: query + name: extraInt2 + description: Query extra int fields 2 + - schema: + type: integer + in: query + name: extraInt3 + description: Query extra int fields 3 + - schema: + type: integer + in: query + name: extraInt4 + description: Query extra int fields 4 + - schema: + type: integer + in: query + name: extraInt5 + description: Query extra int fields 5 + - schema: + type: string + in: query + name: extraStr1 + description: Query extra string fields 1 + - schema: + type: string + in: query + name: extraStr2 + description: Query extra string fields 2 + - schema: + type: string + in: query + name: extraStr3 + description: Query extra string fields 3 + - schema: + type: string + in: query + name: extraStr4 + description: Query extra string fields 4 + - schema: + type: string + in: query + name: extraStr5 + description: Query extra string fields 5 + x-internal: true + parameters: [] + post: + summary: Create A Company + operationId: post-companies + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: number + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyId: 5717 + examples: + example-1: + value: + code: 0 + message: string + data: + companyId: 1233 + description: Create a company + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companyName: string + phoneNumber: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + catalogId: string + acceptCrreationEmail: '0' + extraFields: + - fieldName: string + fieldValue: string + uuid: string + properties: + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + Country: + type: string + minLength: 1 + description: |- + Country full name or ISO2 country code. For Example: + + A Country full name: Afghanistan + + ISO2 Country code: AF + adminFirstName: + type: string + minLength: 1 + adminLastName: + type: string + minLength: 1 + adminEmail: + type: string + minLength: 1 + adminPhoneNumber: + type: string + minLength: 1 + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Field value that you want to add + catalogId: + type: string + description: BC price list Id that company related + extraInt1: + type: integer + extraInt2: + type: integer + extraInt3: + type: integer + extraInt4: + type: integer + extraInt5: + type: integer + extraStr1: + type: string + extraStr2: + type: string + extraStr3: + type: string + extraStr4: + type: string + extraStr5: + type: string + required: + - companyName + - companyEmail + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - Country + - adminFirstName + - adminLastName + - adminEmail + examples: + example-1: + value: + companyName: string + phoneNumber: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + zipCode: string + Country: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + extraFields: + - null + catalogId: string + extraInt1: 0 + extraInt2: 0 + extraInt3: 0 + extraInt4: 0 + extraInt5: 0 + extraStr1: string + extraStr2: string + extraStr3: string + extraStr4: string + extraStr5: string + tags: + - company + x-internal: true + /companies/extra_fields: + get: + summary: Get Company Extra Field + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - fieldName + - labelName + - dataType + - isRequired + properties: + fieldName: + type: string + minLength: 1 + labelName: + type: string + minLength: 1 + dataType: + type: string + minLength: 1 + isRequired: + type: string + minLength: 1 + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + operationId: get-companies-extra_fields + description: Get Company Extra Field + x-internal: true + '/companies/{companyId}/stats': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Company Stats + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - name + - count + properties: + name: + type: string + minLength: 1 + count: + type: number + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + - name: users + count: 3 + - name: assignedSalesReps + count: 1 + - name: enabledPaymentMethods + count: 4 + - name: addresses + count: 1 + examples: + example-1: + value: + code: 200 + message: Success + data: + - name: users + count: 3 + - name: assignedSalesReps + count: 1 + - name: enabledPaymentMethods + count: 4 + - name: addresses + count: 1 + operationId: get-companies-companyId-stats + description: Get Company Stats + x-internal: true + '/companies/{companyId}/basic-info': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Company Basic Info + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + bcGroupName: + type: string + minLength: 1 + companyStatus: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: string + zipCode: + type: string + minLength: 1 + country: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + updatedAt: + type: string + minLength: 1 + catalogId: + type: string + minLength: 1 + customerGroupId: + type: string + minLength: 1 + uuid: + type: string + catalogName: + type: string + minLength: 1 + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - fieldName + - labelName + - dataType + - isRequired + - fieldValue + properties: + fieldName: + type: string + minLength: 1 + labelName: + type: string + minLength: 1 + dataType: + type: string + minLength: 1 + isRequired: + type: string + minLength: 1 + fieldValue: + type: string + required: + - companyId + - companyName + - bcGroupName + - companyStatus + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - country + - companyEmail + - phoneNumber + - updatedAt + - catalogId + - customerGroupId + - uuid + - catalogName + - extraFields + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyId: '5716' + companyName: levi-test + bcGroupName: levi-test + companyStatus: '1' + addressLine1: address line 1 + addressLine2: address line 2 + city: Denver + state: '' + zipCode: '80022' + country: Aruba + companyEmail: levi.tuo@silksoftware.com + phoneNumber: '17195453626' + updatedAt: '1622615748' + catalogId: '5' + customerGroupId: '7002' + uuid: '' + catalogName: test + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyId: '5716' + companyName: company name + bcGroupName: bc group name + companyStatus: '1' + addressLine1: address line 1 + addressLine2: address line 2 + city: Denver + state: '' + zipCode: '80022' + country: Aruba + companyEmail: example@example.com + phoneNumber: '17195453626' + updatedAt: '1622615748' + catalogId: '5' + customerGroupId: '7002' + uuid: '' + catalogName: test + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + operationId: get-companies-companyId-basic-info + description: Get Company Basic Info + x-internal: true + put: + summary: Update Company Basic Info + operationId: put-companies-companyId-basic-info + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: number + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 0 + message: string + data: + companyId: 1233 + examples: + example-1: + value: + code: 0 + message: string + data: + companyId: 1233 + description: Update Company Basic Info + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companyName: string + phoneNumber: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + country: string + zipCode: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + catalogId: string + acceptCrreationEmail: '0' + extraFields: + - fieldName: string + fieldValue: string + uuid: string + properties: + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + Country: + type: string + minLength: 1 + description: |- + Country full name or ISO2 country code. For Example: + + A Country full name: Afghanistan + + ISO2 Country code: AF + adminFirstName: + type: string + minLength: 1 + adminLastName: + type: string + minLength: 1 + adminEmail: + type: string + minLength: 1 + adminPhoneNumber: + type: string + minLength: 1 + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + fieldName: + type: string + description: Field name that config in you store + fieldValue: + type: string + description: Field value that you want to add + catalogId: + type: string + description: BC price list Id that company related + extraInt1: + type: integer + extraInt2: + type: integer + extraInt3: + type: integer + extraInt4: + type: integer + extraInt5: + type: integer + extraStr1: + type: string + extraStr2: + type: string + extraStr3: + type: string + extraStr4: + type: string + extraStr5: + type: string + required: + - companyName + - companyEmail + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - Country + - adminFirstName + - adminLastName + - adminEmail + examples: + example-1: + value: + companyName: string + phoneNumber: string + companyEmail: string + addressLine1: string + addressLine2: string + city: string + state: string + zipCode: string + Country: string + adminFirstName: string + adminLastName: string + adminEmail: string + adminPhoneNumber: string + extraFields: + - null + catalogId: string + extraInt1: 0 + extraInt2: 0 + extraInt3: 0 + extraInt4: 0 + extraInt5: 0 + extraStr1: string + extraStr2: string + extraStr3: string + extraStr4: string + extraStr5: string + tags: + - company + x-internal: true + '/companies/{companyId}/users/{userId}': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + - schema: + type: string + name: userId + in: path + required: true + get: + summary: Get Company UserInfo By UserId + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + id: + type: string + minLength: 1 + customerPhone: + type: string + minLength: 1 + role: + type: string + minLength: 1 + email: + type: string + minLength: 1 + createdAt: + type: string + minLength: 1 + updatedAt: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + catalogId: + type: string + minLength: 1 + required: + - id + - customerPhone + - role + - email + - createdAt + - updatedAt + - firstName + - lastName + - catalogId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + id: '7837' + customerPhone: '11111112' + role: '0' + email: test1111@test1.com + createdAt: '1622444011' + updatedAt: '1622444501' + firstName: test + lastName: test + catalogId: '5' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + id: '7837' + customerPhone: '11111112' + role: '0' + email: example@example.com + createdAt: '1622444011' + updatedAt: '1622444501' + firstName: first name + lastName: last name + catalogId: '5' + operationId: get-companies-companyId-users-userId + description: Get Company UserInfo By UserId + x-internal: true + put: + summary: Update Company User Info + operationId: put-companies-companyId-users-userId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: string + minLength: 1 + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyId: '5716' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyId: '5716' + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + email: test1111@test1.com + role: '0' + firstName: test + lastName: test + customerPhone: '11111111' + id: '7837' + createdAt: '1622444011' + updatedAt: '1622444501' + catalogId: '5' + properties: + email: + type: string + minLength: 1 + role: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + customerPhone: + type: string + minLength: 1 + required: + - email + - role + - firstName + - lastName + - customerPhone + description: Update Company User Info + tags: + - company + x-internal: true + delete: + summary: Delete Company User + operationId: delete-companies-companyId-users-userId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: string + minLength: 1 + required: + - userId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: '7837' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + userId: '7837' + description: 'Delete Company User ' + tags: + - company + x-internal: true + '/companies/{companyId}/payments': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Company Payments + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - paymentId + - code + - name + - isEnabled + properties: + paymentId: + type: number + code: + type: string + minLength: 1 + name: + type: string + minLength: 1 + isEnabled: + type: string + minLength: 1 + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + - paymentId: 39 + code: bankdeposit + name: Bank Deposit + isEnabled: '1' + - paymentId: 43 + code: cheque + name: Check + isEnabled: '1' + - paymentId: 40 + code: cod + name: Cash on Delivery + isEnabled: '1' + - paymentId: 52 + code: moneyorder + name: Money Order + isEnabled: '1' + - paymentId: 51 + code: authorizenet + name: Authorize.Net + isEnabled: '0' + examples: + example-1: + value: + code: 200 + message: Success + data: + - paymentId: 39 + code: bankdeposit + name: Bank Deposit + isEnabled: '1' + - paymentId: 43 + code: cheque + name: Check + isEnabled: '1' + - paymentId: 40 + code: cod + name: Cash on Delivery + isEnabled: '1' + - paymentId: 52 + code: moneyorder + name: Money Order + isEnabled: '1' + - paymentId: 51 + code: authorizenet + name: Authorize.Net + isEnabled: '0' + operationId: get-companies-companyId-payments + description: Get Company Payments + x-internal: true + put: + summary: Update Company Payments + operationId: put-companies-companyId-payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update Company Payments + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + payments: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - paymentId + - code + - name + - isEnabled + properties: + paymentId: + type: number + code: + type: string + minLength: 1 + name: + type: string + minLength: 1 + isEnabled: + type: string + minLength: 1 + required: + - payments + x-examples: + example-1: + payments: + - paymentId: 39 + code: bankdeposit + name: Bank Deposit + isEnabled: '1' + - paymentId: 43 + code: cheque + name: Check + isEnabled: '1' + - paymentId: 40 + code: cod + name: Cash on Delivery + isEnabled: '1' + - paymentId: 52 + code: moneyorder + name: Money Order + isEnabled: '1' + - paymentId: 51 + code: authorizenet + name: Authorize.Net + isEnabled: '1' + tags: + - company + x-internal: true + '/companies/validations/backend/user-emails/{email}': + parameters: + - schema: + type: string + name: email + in: path + required: true + get: + summary: Check Company Email Backend + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: levi + lastName: tuo + phoneNumber: '' + role: '0' + email: levi.tuo@silksoftware.com + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isValid + - userInfo + properties: + isValid: + type: string + minLength: 1 + description: '"0":Email already exists."1":Email does not exist.' + userInfo: + type: object + required: + - id + - firstName + - lastName + - phoneNumber + - role + - email + properties: + id: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + phoneNumber: + type: string + role: + type: string + minLength: 1 + email: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + user exist: + value: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: first name + lastName: last name + phoneNumber: '' + role: '0' + email: example@example.com + user not sxist: + value: + code: 200 + message: Success + data: + isValid: '1' + userInfo: {} + operationId: get-companies-validations-backend-user-emails-email + description: Check Company Email Backend + parameters: + - schema: + type: string + in: query + name: companyId + - schema: + type: integer + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + in: query + name: role + description: User roles(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep 4=unknown) + required: true + x-internal: true + /companies/convert-from-customer-group: + post: + summary: Create A Company - convert from CG + operationId: post-companies-convert-from-customer-group + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: number + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyId: 1 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyId: 1 + description: Create A Company - convert from CG + requestBody: + content: + application/json: + schema: + type: object + properties: + companyName: + type: string + phoneNumber: + type: string + companyEmail: + type: string + addressLine1: + type: string + addressLine2: + type: string + city: + type: string + state: + type: string + zipCode: + type: string + country: + type: string + adminFirstName: + type: string + adminLastName: + type: string + adminEmail: + type: string + adminPhoneNumber: + type: string + customerGroupId: + type: string + required: + - companyName + - phoneNumber + - companyEmail + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - country + - adminFirstName + - adminLastName + - adminEmail + - adminPhoneNumber + - customerGroupId + tags: + - company + x-internal: true + /customer-groups: + get: + summary: Get Company Customer Groups + tags: + - company + responses: {} + operationId: get-customer-groups + description: Get Company Customer Groups + parameters: + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: q + description: Query string + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - name + properties: + id: + type: number + name: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: 6523 + name: kidotestccio + - id: 6528 + name: new email test company2 + - id: 6529 + name: new email test company3 + - id: 6530 + name: new email test company4 + - id: 6531 + name: new email test company5 + - id: 6532 + name: new email test company6 + - id: 6533 + name: new email test company7 + - id: 6534 + name: new email test company8 + - id: 6535 + name: new email test company11 + - id: 6536 + name: new email test company12 + pagination: + totalCount: 1249 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: 6528 + name: new email test company2 + - id: 6529 + name: new email test company3 + pagination: + totalCount: 2 + offset: 0 + limit: 10 + x-internal: true + '/companies/{company_id}/inner-sales-reps': + parameters: + - schema: + type: string + name: company_id + in: path + required: true + get: + summary: Get A Companies' SalesStaffs' List + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - innerSalesRepName + - email + - isAssigned + properties: + id: + type: string + minLength: 1 + innerSalesRepName: + type: string + minLength: 1 + email: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '25' + innerSalesRepName: SpritStorm + email: string@example.net + isAssigned: '1' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '25' + innerSalesRepName: SpritStorm + email: example@example.com + isAssigned: '1' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-companies-company_id-inner-sales-reps + description: Get A Companies' SalesStaffs' List + x-internal: true + '/companies/{companyId}/users': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + get: + summary: Get Company UserInfo + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - phoneNumber + - role + - email + - uuid + - createdAt + - updatedAt + - firstName + - lastName + - catalogId + properties: + id: + type: string + minLength: 1 + phoneNumber: + type: string + role: + type: string + minLength: 1 + email: + type: string + minLength: 1 + uuid: + type: string + createdAt: + type: string + minLength: 1 + updatedAt: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + catalogId: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '7831' + phoneNumber: '' + role: '0' + email: levi.tuo@silksoftware.com + uuid: '' + createdAt: '1622108356' + updatedAt: '1622618944' + firstName: levi + lastName: tuo + catalogId: '5' + - id: '7843' + phoneNumber: '123456789' + role: '0' + email: Jo.Sweet@example.com + uuid: '' + createdAt: '1622598722' + updatedAt: '1622599039' + firstName: Jo + lastName: Sweet + catalogId: '5' + - id: '7837' + phoneNumber: '11111112' + role: '0' + email: test1111@test1.com + uuid: '' + createdAt: '1622444011' + updatedAt: '1622444501' + firstName: test + lastName: test + catalogId: '5' + pagination: + totalCount: 3 + offset: 0 + limit: 6 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '7831' + phoneNumber: '' + role: '0' + email: exmaple@example.com + uuid: '' + createdAt: '1622108356' + updatedAt: '1622618944' + firstName: first name + lastName: last name + catalogId: '5' + pagination: + totalCount: 1 + offset: 0 + limit: 6 + operationId: get-companies-companyId-users + description: Get Company UserInfo + parameters: + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: integer + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + in: query + name: 'role[]' + description: 'user roles(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep 4=unknown), If you assign multiple values to it, please use it multiple times in the query.' + - schema: + type: string + in: query + name: minLastModifiedTime + description: Minimum last modified time + - schema: + type: string + in: query + name: maxLastModifiedTime + description: Maximum last modified time + - schema: + type: string + in: query + name: minLastCreatedTime + description: Minimum Last created time + - schema: + type: string + in: query + name: maxLastCreatedTime + description: Maximum Last created time + x-internal: true + /companies/addresses/countries: + get: + summary: Get Address Countries + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - countryName + - countryCode + properties: + id: + type: number + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + states: + type: array + items: + required: [] + properties: {} + required: + - list + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + list: + - id: 1 + countryName: Afghanistan + countryCode: AF + states: [] + - id: 2 + countryName: Albania + countryCode: AL + states: [] + - id: 3 + countryName: Algeria + countryCode: DZ + states: [] + - id: 4 + countryName: American Samoa + countryCode: AS + states: [] + - id: 5 + countryName: Andorra + countryCode: AD + states: [] + - id: 6 + countryName: Angola + countryCode: AO + states: [] + - id: 7 + countryName: Anguilla + countryCode: AI + states: [] + - id: 8 + countryName: Antarctica + countryCode: AQ + states: [] + - id: 9 + countryName: Antigua and Barbuda + countryCode: AG + states: [] + - id: 10 + countryName: Argentina + countryCode: AR + states: + - stateName: Ciudad Autónoma de Buenos Aires + stateCode: C + - stateName: Buenos Aires + stateCode: B + - stateName: Catamarca + stateCode: K + - stateName: Chaco + stateCode: H + - stateName: Chubut + stateCode: U + - stateName: Córdoba + stateCode: X + - stateName: Corrientes + stateCode: W + - stateName: Entre Ríos + stateCode: E + - stateName: Formosa + stateCode: P + - stateName: Jujuy + stateCode: 'Y' + - stateName: La Pampa + stateCode: L + - stateName: La Rioja + stateCode: F + - stateName: Mendoza + stateCode: M + - stateName: Misiones + stateCode: 'N' + - stateName: Neuquén + stateCode: Q + - stateName: Río Negro + stateCode: R + - stateName: Salta + stateCode: A + - stateName: San Juan + stateCode: J + - stateName: San Luis + stateCode: D + - stateName: Santa Cruz + stateCode: Z + - stateName: Santa Fe + stateCode: S + - stateName: Santiago del Estero + stateCode: G + - stateName: Tierra del Fuego + stateCode: V + - stateName: Tucumán + stateCode: T + - id: 11 + countryName: Armenia + countryCode: AM + states: [] + - id: 12 + countryName: Aruba + countryCode: AW + states: [] + - id: 13 + countryName: Australia + countryCode: AU + states: + - stateName: Australian Capital Territory + stateCode: ACT + - stateName: New South Wales + stateCode: NSW + - stateName: Northern Territory + stateCode: NT + - stateName: Queensland + stateCode: QLD + - stateName: South Australia + stateCode: SA + - stateName: Tasmania + stateCode: TAS + - stateName: Victoria + stateCode: VIC + - stateName: Western Australia + stateCode: WA + - id: 14 + countryName: Austria + countryCode: AT + states: + - stateName: Wien + stateCode: '9' + - stateName: Niederösterreich + stateCode: '3' + - stateName: Oberösterreich + stateCode: '4' + - stateName: Salzburg + stateCode: '5' + - stateName: Kärnten + stateCode: '2' + - stateName: Steiermark + stateCode: '6' + - stateName: Tirol + stateCode: '7' + - stateName: Burgenland + stateCode: '1' + - stateName: Vorarlberg + stateCode: '8' + - id: 15 + countryName: Azerbaijan + countryCode: AZ + states: [] + - id: 16 + countryName: Bahamas + countryCode: BS + states: [] + - id: 17 + countryName: Bahrain + countryCode: BH + states: [] + - id: 18 + countryName: Bangladesh + countryCode: BD + states: [] + - id: 19 + countryName: Barbados + countryCode: BB + states: [] + - id: 20 + countryName: Belarus + countryCode: BY + states: [] + - id: 21 + countryName: Belgium + countryCode: BE + states: [] + - id: 22 + countryName: Belize + countryCode: BZ + states: [] + - id: 23 + countryName: Benin + countryCode: BJ + states: [] + - id: 24 + countryName: Bermuda + countryCode: BM + states: [] + - id: 25 + countryName: Bhutan + countryCode: BT + states: [] + - id: 26 + countryName: Bolivia + countryCode: BO + states: [] + - id: 27 + countryName: Bosnia and Herzegovina + countryCode: BA + states: [] + - id: 28 + countryName: Botswana + countryCode: BW + states: [] + - id: 29 + countryName: Bouvet Island + countryCode: BV + states: [] + - id: 30 + countryName: Brazil + countryCode: BR + states: [] + - id: 31 + countryName: British Indian Ocean Territory + countryCode: IO + states: [] + - id: 32 + countryName: Brunei Darussalam + countryCode: BN + states: [] + - id: 33 + countryName: Bulgaria + countryCode: BG + states: [] + - id: 34 + countryName: Burkina Faso + countryCode: BF + states: [] + - id: 35 + countryName: Burundi + countryCode: BI + states: [] + - id: 36 + countryName: Cambodia + countryCode: KH + states: [] + - id: 37 + countryName: Cameroon + countryCode: CM + states: [] + - id: 38 + countryName: Canada + countryCode: CA + states: + - stateName: Alberta + stateCode: AB + - stateName: British Columbia + stateCode: BC + - stateName: Manitoba + stateCode: MB + - stateName: Newfoundland and Labrador + stateCode: NL + - stateName: New Brunswick + stateCode: NB + - stateName: Nova Scotia + stateCode: NS + - stateName: Northwest Territories + stateCode: NT + - stateName: Nunavut + stateCode: NU + - stateName: Ontario + stateCode: 'ON' + - stateName: Prince Edward Island + stateCode: PE + - stateName: Quebec + stateCode: QC + - stateName: Saskatchewan + stateCode: SK + - stateName: Yukon Territory + stateCode: YT + - id: 39 + countryName: Cape Verde + countryCode: CV + states: [] + - id: 40 + countryName: Cayman Islands + countryCode: KY + states: [] + - id: 41 + countryName: Central African Republic + countryCode: CF + states: [] + - id: 42 + countryName: Chad + countryCode: TD + states: [] + - id: 43 + countryName: Chile + countryCode: CL + states: [] + - id: 44 + countryName: China + countryCode: CN + states: [] + - id: 45 + countryName: Christmas Island + countryCode: CX + states: [] + - id: 46 + countryName: Cocos (Keeling) Islands + countryCode: CC + states: [] + - id: 47 + countryName: Colombia + countryCode: CO + states: [] + - id: 48 + countryName: Comoros + countryCode: KM + states: [] + - id: 49 + countryName: Congo + countryCode: CG + states: [] + - id: 50 + countryName: 'Congo, the Democratic Republic of the' + countryCode: CD + states: [] + - id: 51 + countryName: Cook Islands + countryCode: CK + states: [] + - id: 52 + countryName: Costa Rica + countryCode: CR + states: [] + - id: 54 + countryName: Croatia + countryCode: HR + states: [] + - id: 56 + countryName: Cyprus + countryCode: CY + states: [] + - id: 57 + countryName: Czech Republic + countryCode: CZ + states: [] + - id: 58 + countryName: Denmark + countryCode: DK + states: [] + - id: 59 + countryName: Djibouti + countryCode: DJ + states: [] + - id: 60 + countryName: Dominica + countryCode: DM + states: [] + - id: 61 + countryName: Dominican Republic + countryCode: DO + states: [] + - id: 62 + countryName: Ecuador + countryCode: EC + states: [] + - id: 63 + countryName: Egypt + countryCode: EG + states: [] + - id: 64 + countryName: El Salvador + countryCode: SV + states: [] + - id: 65 + countryName: Equatorial Guinea + countryCode: GQ + states: [] + - id: 66 + countryName: Eritrea + countryCode: ER + states: [] + - id: 67 + countryName: Estonia + countryCode: EE + states: [] + - id: 68 + countryName: Ethiopia + countryCode: ET + states: [] + - id: 69 + countryName: Falkland Islands (Malvinas) + countryCode: FK + states: [] + - id: 70 + countryName: Faroe Islands + countryCode: FO + states: [] + - id: 71 + countryName: Fiji + countryCode: FJ + states: [] + - id: 72 + countryName: Finland + countryCode: FI + states: [] + - id: 73 + countryName: France + countryCode: FR + states: [] + - id: 74 + countryName: French Guiana + countryCode: GF + states: [] + - id: 75 + countryName: French Polynesia + countryCode: PF + states: [] + - id: 76 + countryName: French Southern Territories + countryCode: TF + states: [] + - id: 77 + countryName: Gabon + countryCode: GA + states: [] + - id: 78 + countryName: Gambia + countryCode: GM + states: [] + - id: 79 + countryName: Georgia + countryCode: GE + states: [] + - id: 80 + countryName: Germany + countryCode: DE + states: + - stateName: Niedersachsen + stateCode: NI + - stateName: Baden-Württemberg + stateCode: BW + - stateName: Bayern + stateCode: BY + - stateName: Berlin + stateCode: BE + - stateName: Brandenburg + stateCode: BB + - stateName: Bremen + stateCode: HB + - stateName: Hamburg + stateCode: HH + - stateName: Hessen + stateCode: HE + - stateName: Mecklenburg-Vorpommern + stateCode: MV + - stateName: Nordrhein-Westfalen + stateCode: NW + - stateName: Rheinland-Pfalz + stateCode: RP + - stateName: Saarland + stateCode: SL + - stateName: Sachsen + stateCode: SN + - stateName: Sachsen-Anhalt + stateCode: ST + - stateName: Schleswig-Holstein + stateCode: SH + - stateName: Thüringen + stateCode: TH + - id: 81 + countryName: Ghana + countryCode: GH + states: [] + - id: 82 + countryName: Gibraltar + countryCode: GI + states: [] + - id: 83 + countryName: Greece + countryCode: GR + states: [] + - id: 84 + countryName: Greenland + countryCode: GL + states: [] + - id: 85 + countryName: Grenada + countryCode: GD + states: [] + - id: 86 + countryName: Guadeloupe + countryCode: GP + states: [] + - id: 87 + countryName: Guam + countryCode: GU + states: [] + - id: 88 + countryName: Guatemala + countryCode: GT + states: [] + - id: 89 + countryName: Guinea + countryCode: GN + states: [] + - id: 90 + countryName: Guinea-Bissau + countryCode: GW + states: [] + - id: 91 + countryName: Guyana + countryCode: GY + states: [] + - id: 92 + countryName: Haiti + countryCode: HT + states: [] + - id: 93 + countryName: Heard Island and Mcdonald Islands + countryCode: HM + states: [] + - id: 94 + countryName: Holy See (Vatican City State) + countryCode: VA + states: [] + - id: 95 + countryName: Honduras + countryCode: HN + states: [] + - id: 96 + countryName: Hong Kong + countryCode: HK + states: [] + - id: 97 + countryName: Hungary + countryCode: HU + states: [] + - id: 98 + countryName: Iceland + countryCode: IS + states: [] + - id: 99 + countryName: India + countryCode: IN + states: + - stateName: Andhra Pradesh + stateCode: AP + - stateName: Arunachal Pradesh + stateCode: AR + - stateName: Assam + stateCode: AS + - stateName: Bihar + stateCode: BR + - stateName: Chhattisgarh + stateCode: CT + - stateName: Goa + stateCode: GA + - stateName: Gujarat + stateCode: GJ + - stateName: Haryana + stateCode: HR + - stateName: Himachal Pradesh + stateCode: HP + - stateName: Jammu & Kashmir + stateCode: JK + - stateName: Jharkhand + stateCode: JH + - stateName: Karnataka + stateCode: KA + - stateName: Kerala + stateCode: KL + - stateName: Madhya Pradesh + stateCode: MP + - stateName: Maharashtra + stateCode: MH + - stateName: Manipur + stateCode: MN + - stateName: Meghalaya + stateCode: ML + - stateName: Mizoram + stateCode: MZ + - stateName: Nagaland + stateCode: NL + - stateName: Orissa + stateCode: OR + - stateName: Punjab + stateCode: PB + - stateName: Rajasthan + stateCode: RJ + - stateName: Sikkim + stateCode: SK + - stateName: Tamil Nadu + stateCode: TN + - stateName: Tripura + stateCode: TR + - stateName: Uttarakhand + stateCode: UT + - stateName: Uttar Pradesh + stateCode: UP + - stateName: West Bengal + stateCode: WB + - stateName: Andaman and Nicobar Islands + stateCode: AN + - stateName: Chandigarh + stateCode: CH + - stateName: Dadra and Nagar Haveli + stateCode: DN + - stateName: Daman & Diu + stateCode: DD + - stateName: Lakshadweep + stateCode: LD + - stateName: Delhi + stateCode: DL + - stateName: Pondicherry + stateCode: PY + - stateName: Telangana + stateCode: TS + - id: 100 + countryName: Indonesia + countryCode: ID + states: + - stateName: Bali + stateCode: BA + - stateName: Bangka Belitung + stateCode: BB + - stateName: Banten + stateCode: BT + - stateName: Bengkulu + stateCode: BE + - stateName: Daista Aceh + stateCode: AC + - stateName: Jakarta + stateCode: JK + - stateName: Sumatera Utara + stateCode: SU + - stateName: Sumatera Barat + stateCode: SB + - stateName: Riau + stateCode: RI + - stateName: Jambi + stateCode: JA + - stateName: Sumatera Selatan + stateCode: SS + - stateName: Lampung + stateCode: LA + - stateName: Jawa Barat + stateCode: JB + - stateName: Jawa Tengah + stateCode: JT + - stateName: Daista Yogyakarta + stateCode: YO + - stateName: Jawa Timur + stateCode: JI + - stateName: Kalimantan Barat + stateCode: KB + - stateName: Kalimantan Tengah + stateCode: KT + - stateName: Kalimantan Timur + stateCode: KI + - stateName: Kalimantan Selatan + stateCode: KS + - stateName: Nusa Tenggara Barat + stateCode: NB + - stateName: Nusa Tenggara Timur + stateCode: NT + - stateName: Sulawesi Selatan + stateCode: SN + - stateName: Sulawesi Tengah + stateCode: ST + - stateName: Sulawesi Utara + stateCode: SA + - stateName: Sulawesi Tenggara + stateCode: SG + - stateName: Maluku + stateCode: MA + - stateName: Maluku Utara + stateCode: MU + - stateName: Irian Jaya Timur + stateCode: IJ + - stateName: Irian Jaya Tengah + stateCode: IT + - stateName: Irian Jawa Barat + stateCode: IB + - stateName: Gorontalo + stateCode: GO + - id: 102 + countryName: Iraq + countryCode: IQ + states: [] + - id: 103 + countryName: Ireland + countryCode: IE + states: + - stateName: Carlow + stateCode: CW + - stateName: Cavan + stateCode: CN + - stateName: Clare + stateCode: CE + - stateName: Cork + stateCode: C + - stateName: Donegal + stateCode: DL + - stateName: Dublin + stateCode: D + - stateName: Galway + stateCode: G + - stateName: Kerry + stateCode: KY + - stateName: Kildare + stateCode: KE + - stateName: Kilkenny + stateCode: KK + - stateName: Laois + stateCode: LS + - stateName: Leitrim + stateCode: LM + - stateName: Limerick + stateCode: LK + - stateName: Longford + stateCode: LD + - stateName: Louth + stateCode: LH + - stateName: Mayo + stateCode: MO + - stateName: Meath + stateCode: MH + - stateName: Monaghan + stateCode: MN + - stateName: Offaly + stateCode: OY + - stateName: Roscommon + stateCode: RN + - stateName: Sligo + stateCode: SO + - stateName: Tipperary + stateCode: TA + - stateName: Waterford + stateCode: WD + - stateName: Westmeath + stateCode: WH + - stateName: Wexford + stateCode: WX + - stateName: Wicklow + stateCode: WW + - id: 104 + countryName: Israel + countryCode: IL + states: [] + - id: 105 + countryName: Italy + countryCode: IT + states: [] + - id: 106 + countryName: Jamaica + countryCode: JM + states: [] + - id: 107 + countryName: Japan + countryCode: JP + states: [] + - id: 108 + countryName: Jordan + countryCode: JO + states: [] + - id: 109 + countryName: Kazakhstan + countryCode: KZ + states: [] + - id: 110 + countryName: Kenya + countryCode: KE + states: [] + - id: 111 + countryName: Kiribati + countryCode: KI + states: [] + - id: 113 + countryName: 'Korea, Republic of' + countryCode: KR + states: [] + - id: 114 + countryName: Kuwait + countryCode: KW + states: [] + - id: 115 + countryName: Kyrgyzstan + countryCode: KG + states: [] + - id: 117 + countryName: Latvia + countryCode: LV + states: [] + - id: 118 + countryName: Lebanon + countryCode: LB + states: [] + - id: 119 + countryName: Lesotho + countryCode: LS + states: [] + - id: 120 + countryName: Liberia + countryCode: LR + states: [] + - id: 121 + countryName: Libya + countryCode: LY + states: [] + - id: 122 + countryName: Liechtenstein + countryCode: LI + states: [] + - id: 123 + countryName: Lithuania + countryCode: LT + states: [] + - id: 124 + countryName: Luxembourg + countryCode: LU + states: [] + - id: 125 + countryName: Macao + countryCode: MO + states: [] + - id: 126 + countryName: 'Macedonia, the Former Yugoslav Republic of' + countryCode: MK + states: [] + - id: 127 + countryName: Madagascar + countryCode: MG + states: [] + - id: 128 + countryName: Malawi + countryCode: MW + states: [] + - id: 129 + countryName: Malaysia + countryCode: MY + states: + - stateName: Johor + stateCode: '01' + - stateName: Kedah + stateCode: '02' + - stateName: Kelantan + stateCode: '03' + - stateName: Melaka + stateCode: '04' + - stateName: Negeri Sembilan + stateCode: '05' + - stateName: Pahang + stateCode: '06' + - stateName: Pulau Pinang + stateCode: '07' + - stateName: Perak + stateCode: '08' + - stateName: Perlis + stateCode: '09' + - stateName: Selangor + stateCode: '10' + - stateName: Terengganu + stateCode: '11' + - stateName: Sabah + stateCode: '12' + - stateName: Sarawak + stateCode: '13' + - stateName: Kuala Lumpur + stateCode: '14' + - stateName: Labuan + stateCode: '15' + - stateName: Putrajaya + stateCode: '16' + - id: 130 + countryName: Maldives + countryCode: MV + states: [] + - id: 131 + countryName: Mali + countryCode: ML + states: [] + - id: 132 + countryName: Malta + countryCode: MT + states: [] + - id: 133 + countryName: Marshall Islands + countryCode: MH + states: [] + - id: 134 + countryName: Martinique + countryCode: MQ + states: [] + - id: 135 + countryName: Mauritania + countryCode: MR + states: [] + - id: 136 + countryName: Mauritius + countryCode: MU + states: [] + - id: 137 + countryName: Mayotte + countryCode: YT + states: [] + - id: 138 + countryName: Mexico + countryCode: MX + states: + - stateName: Aguascalientes + stateCode: AGU + - stateName: Baja California + stateCode: BCN + - stateName: Baja California Sur + stateCode: BCS + - stateName: Campeche + stateCode: CAM + - stateName: Coahuila + stateCode: COA + - stateName: Colima + stateCode: COL + - stateName: Chiapas + stateCode: CHP + - stateName: Chihuahua + stateCode: CHH + - stateName: Durango + stateCode: DUR + - stateName: Guanajuato + stateCode: GUA + - stateName: Guerrero + stateCode: GRO + - stateName: Hidalgo + stateCode: HID + - stateName: Jalisco + stateCode: JAL + - stateName: Ciudad de México + stateCode: CMX + - stateName: México + stateCode: MEX + - stateName: Michoacán + stateCode: MIC + - stateName: Morelos + stateCode: MOR + - stateName: Nayarit + stateCode: NAY + - stateName: Nuevo León + stateCode: NLE + - stateName: Oaxaca + stateCode: OAX + - stateName: Puebla + stateCode: PUE + - stateName: Querétaro + stateCode: QUE + - stateName: Quintana Roo + stateCode: ROO + - stateName: San Luis Potosí + stateCode: SLP + - stateName: Sinaloa + stateCode: SIN + - stateName: Sonora + stateCode: SON + - stateName: Tabasco + stateCode: TAB + - stateName: Tamaulipas + stateCode: TAM + - stateName: Tlaxcala + stateCode: TLA + - stateName: Veracruz + stateCode: VER + - stateName: Yucatán + stateCode: YUC + - stateName: Zacatecas + stateCode: ZAC + - id: 139 + countryName: 'Micronesia, Federated States of' + countryCode: FM + states: [] + - id: 140 + countryName: 'Moldova, Republic of' + countryCode: MD + states: [] + - id: 141 + countryName: Monaco + countryCode: MC + states: [] + - id: 142 + countryName: Mongolia + countryCode: MN + states: [] + - id: 143 + countryName: Montserrat + countryCode: MS + states: [] + - id: 144 + countryName: Morocco + countryCode: MA + states: [] + - id: 145 + countryName: Mozambique + countryCode: MZ + states: [] + - id: 146 + countryName: Myanmar + countryCode: MM + states: + - stateName: Ayeyarwady + stateCode: '07' + - stateName: Bago + stateCode: '02' + - stateName: Chin + stateCode: '14' + - stateName: Kachin + stateCode: '11' + - stateName: Kayah + stateCode: '12' + - stateName: Kayin + stateCode: '13' + - stateName: Magway + stateCode: '03' + - stateName: Mandalay + stateCode: '04' + - stateName: Mon + stateCode: '15' + - stateName: Rakhine + stateCode: '16' + - stateName: Shan + stateCode: '17' + - stateName: Sagaing + stateCode: '01' + - stateName: Tanintharyi + stateCode: '05' + - stateName: Yangon + stateCode: '06' + - stateName: Naypyidaw Union + stateCode: '18' + - id: 147 + countryName: Namibia + countryCode: NA + states: [] + - id: 148 + countryName: Nauru + countryCode: NR + states: [] + - id: 149 + countryName: Nepal + countryCode: NP + states: [] + - id: 150 + countryName: Netherlands + countryCode: NL + states: [] + - id: 151 + countryName: Netherlands Antilles + countryCode: AN + states: [] + - id: 152 + countryName: New Caledonia + countryCode: NC + states: [] + - id: 153 + countryName: New Zealand + countryCode: NZ + states: [] + - id: 154 + countryName: Nicaragua + countryCode: NI + states: [] + - id: 155 + countryName: Niger + countryCode: NE + states: [] + - id: 156 + countryName: Nigeria + countryCode: NG + states: [] + - id: 157 + countryName: Niue + countryCode: NU + states: [] + - id: 158 + countryName: Norfolk Island + countryCode: NF + states: [] + - id: 159 + countryName: Northern Mariana Islands + countryCode: MP + states: [] + - id: 160 + countryName: Norway + countryCode: 'NO' + states: [] + - id: 161 + countryName: Oman + countryCode: OM + states: [] + - id: 162 + countryName: Pakistan + countryCode: PK + states: [] + - id: 163 + countryName: Palau + countryCode: PW + states: [] + - id: 164 + countryName: 'Palestinian Territory, Occupied' + countryCode: PS + states: [] + - id: 165 + countryName: Panama + countryCode: PA + states: [] + - id: 166 + countryName: Papua New Guinea + countryCode: PG + states: [] + - id: 167 + countryName: Paraguay + countryCode: PY + states: [] + - id: 168 + countryName: Peru + countryCode: PE + states: [] + - id: 169 + countryName: Philippines + countryCode: PH + states: [] + - id: 170 + countryName: Pitcairn + countryCode: PN + states: [] + - id: 171 + countryName: Poland + countryCode: PL + states: [] + - id: 172 + countryName: Portugal + countryCode: PT + states: [] + - id: 173 + countryName: Puerto Rico + countryCode: PR + states: [] + - id: 174 + countryName: Qatar + countryCode: QA + states: [] + - id: 175 + countryName: Reunion + countryCode: RE + states: [] + - id: 176 + countryName: Romania + countryCode: RO + states: [] + - id: 177 + countryName: Russian Federation + countryCode: RU + states: [] + - id: 178 + countryName: Rwanda + countryCode: RW + states: [] + - id: 179 + countryName: Saint Helena + countryCode: SH + states: [] + - id: 180 + countryName: Saint Kitts and Nevis + countryCode: KN + states: [] + - id: 181 + countryName: Saint Lucia + countryCode: LC + states: [] + - id: 182 + countryName: Saint Pierre and Miquelon + countryCode: PM + states: [] + - id: 183 + countryName: Saint Vincent and the Grenadines + countryCode: VC + states: [] + - id: 184 + countryName: Samoa + countryCode: WS + states: [] + - id: 185 + countryName: San Marino + countryCode: SM + states: [] + - id: 186 + countryName: Sao Tome and Principe + countryCode: ST + states: [] + - id: 187 + countryName: Saudi Arabia + countryCode: SA + states: [] + - id: 188 + countryName: Senegal + countryCode: SN + states: [] + - id: 189 + countryName: Serbia + countryCode: RS + states: [] + - id: 190 + countryName: Seychelles + countryCode: SC + states: [] + - id: 191 + countryName: Sierra Leone + countryCode: SL + states: [] + - id: 192 + countryName: Singapore + countryCode: SG + states: [] + - id: 193 + countryName: Slovakia + countryCode: SK + states: [] + - id: 194 + countryName: Slovenia + countryCode: SI + states: [] + - id: 195 + countryName: Solomon Islands + countryCode: SB + states: [] + - id: 196 + countryName: Somalia + countryCode: SO + states: [] + - id: 197 + countryName: South Africa + countryCode: ZA + states: + - stateName: Eastern Cape + stateCode: EC + - stateName: Free State + stateCode: FS + - stateName: Gauteng + stateCode: GT + - stateName: KwaZulu-Natal + stateCode: NL + - stateName: Limpopo + stateCode: LP + - stateName: Mpumalanga + stateCode: MP + - stateName: Northern Cape + stateCode: NC + - stateName: North-West + stateCode: NW + - stateName: Western Cape + stateCode: WC + - id: 198 + countryName: South Georgia and the South Sandwich Islands + countryCode: GS + states: [] + - id: 199 + countryName: Spain + countryCode: ES + states: + - stateName: A Coruña + stateCode: C + - stateName: Alava + stateCode: VI + - stateName: Albacete + stateCode: AB + - stateName: Alicante + stateCode: A + - stateName: Almeria + stateCode: AL + - stateName: Asturias + stateCode: O + - stateName: Avila + stateCode: AV + - stateName: Badajoz + stateCode: BA + - stateName: Baleares + stateCode: PM + - stateName: Barcelona + stateCode: B + - stateName: Burgos + stateCode: BU + - stateName: Caceres + stateCode: CC + - stateName: Cadiz + stateCode: CA + - stateName: Cantabria + stateCode: S + - stateName: Castellon + stateCode: CS + - stateName: Ceuta + stateCode: CE + - stateName: Ciudad Real + stateCode: CR + - stateName: Cordoba + stateCode: CO + - stateName: Cuenca + stateCode: CU + - stateName: Girona + stateCode: GI + - stateName: Granada + stateCode: GR + - stateName: Guadalajara + stateCode: GU + - stateName: Guipuzcoa + stateCode: SS + - stateName: Huelva + stateCode: H + - stateName: Huesca + stateCode: HU + - stateName: Jaen + stateCode: J + - stateName: La Rioja + stateCode: LO + - stateName: Las Palmas + stateCode: GC + - stateName: Leon + stateCode: LE + - stateName: Lleida + stateCode: L + - stateName: Lugo + stateCode: LU + - stateName: Madrid + stateCode: M + - stateName: Malaga + stateCode: MA + - stateName: Melilla + stateCode: ML + - stateName: Murcia + stateCode: MU + - stateName: Navarra + stateCode: NA + - stateName: Ourense + stateCode: OR + - stateName: Palencia + stateCode: P + - stateName: Pontevedra + stateCode: PO + - stateName: Salamanca + stateCode: SA + - stateName: Santa Cruz de Tenerife + stateCode: TF + - stateName: Segovia + stateCode: SG + - stateName: Sevilla + stateCode: SE + - stateName: Soria + stateCode: SO + - stateName: Tarragona + stateCode: T + - stateName: Teruel + stateCode: TE + - stateName: Toledo + stateCode: TO + - stateName: Valencia + stateCode: V + - stateName: Valladolid + stateCode: VA + - stateName: Vizcaya + stateCode: BI + - stateName: Zamora + stateCode: ZA + - stateName: Zaragoza + stateCode: Z + - id: 200 + countryName: Sri Lanka + countryCode: LK + states: [] + - id: 201 + countryName: Sudan + countryCode: SD + states: [] + - id: 202 + countryName: Suriname + countryCode: SR + states: [] + - id: 203 + countryName: Svalbard and Jan Mayen + countryCode: SJ + states: [] + - id: 204 + countryName: Swaziland + countryCode: SZ + states: [] + - id: 205 + countryName: Sweden + countryCode: SE + states: [] + - id: 206 + countryName: Switzerland + countryCode: CH + states: + - stateName: Aargau + stateCode: AG + - stateName: Appenzell Innerrhoden + stateCode: AI + - stateName: Appenzell Ausserrhoden + stateCode: AR + - stateName: Bern + stateCode: BE + - stateName: Basel-Landschaft + stateCode: BL + - stateName: Basel-Stadt + stateCode: BS + - stateName: Fribourg + stateCode: FR + - stateName: Geneva + stateCode: GE + - stateName: Glarus + stateCode: GL + - stateName: Graubünden + stateCode: GR + - stateName: Jura + stateCode: JU + - stateName: Luzern + stateCode: LU + - stateName: Neuchâtel + stateCode: NE + - stateName: Nidwalden + stateCode: NW + - stateName: Obwalden + stateCode: OW + - stateName: St. Gallen + stateCode: SG + - stateName: Schaffhausen + stateCode: SH + - stateName: Solothurn + stateCode: SO + - stateName: Schwyz + stateCode: SZ + - stateName: Thurgau + stateCode: TG + - stateName: Ticino + stateCode: TI + - stateName: Uri + stateCode: UR + - stateName: Vaud + stateCode: VD + - stateName: Valais + stateCode: VS + - stateName: Zug + stateCode: ZG + - stateName: Zürich + stateCode: ZH + - id: 208 + countryName: Taiwan + countryCode: TW + states: [] + - id: 209 + countryName: Tajikistan + countryCode: TJ + states: [] + - id: 210 + countryName: 'Tanzania, United Republic of' + countryCode: TZ + states: [] + - id: 211 + countryName: Thailand + countryCode: TH + states: [] + - id: 212 + countryName: Timor-Leste + countryCode: TL + states: [] + - id: 213 + countryName: Togo + countryCode: TG + states: [] + - id: 214 + countryName: Tokelau + countryCode: TK + states: [] + - id: 215 + countryName: Tonga + countryCode: TO + states: [] + - id: 216 + countryName: Trinidad and Tobago + countryCode: TT + states: [] + - id: 217 + countryName: Tunisia + countryCode: TN + states: [] + - id: 218 + countryName: Turkey + countryCode: TR + states: [] + - id: 219 + countryName: Turkmenistan + countryCode: TM + states: [] + - id: 220 + countryName: Turks and Caicos Islands + countryCode: TC + states: [] + - id: 221 + countryName: Tuvalu + countryCode: TV + states: [] + - id: 222 + countryName: Uganda + countryCode: UG + states: [] + - id: 223 + countryName: Ukraine + countryCode: UA + states: [] + - id: 224 + countryName: United Arab Emirates + countryCode: AE + states: + - stateName: Abu Dhabi + stateCode: AZ + - stateName: Ajman + stateCode: AJ + - stateName: Fujairah + stateCode: FU + - stateName: Sharjah + stateCode: SH + - stateName: Dubai + stateCode: DU + - stateName: Ras al-Khaimah + stateCode: RK + - stateName: Umm al-Quwain + stateCode: UQ + - id: 225 + countryName: United Kingdom + countryCode: GB + states: [] + - id: 226 + countryName: United States + countryCode: US + states: + - stateName: Alabama + stateCode: AL + - stateName: Alaska + stateCode: AK + - stateName: American Samoa + stateCode: AS + - stateName: Arizona + stateCode: AZ + - stateName: Arkansas + stateCode: AR + - stateName: Armed Forces Africa + stateCode: AE + - stateName: Armed Forces Americas + stateCode: AA + - stateName: Armed Forces Canada + stateCode: AE + - stateName: Armed Forces Europe + stateCode: AE + - stateName: Armed Forces Middle East + stateCode: AE + - stateName: Armed Forces Pacific + stateCode: AP + - stateName: California + stateCode: CA + - stateName: Colorado + stateCode: CO + - stateName: Connecticut + stateCode: CT + - stateName: Delaware + stateCode: DE + - stateName: District of Columbia + stateCode: DC + - stateName: Federated States Of Micronesia + stateCode: FM + - stateName: Florida + stateCode: FL + - stateName: Georgia + stateCode: GA + - stateName: Guam + stateCode: GU + - stateName: Hawaii + stateCode: HI + - stateName: Idaho + stateCode: ID + - stateName: Illinois + stateCode: IL + - stateName: Indiana + stateCode: IN + - stateName: Iowa + stateCode: IA + - stateName: Kansas + stateCode: KS + - stateName: Kentucky + stateCode: KY + - stateName: Louisiana + stateCode: LA + - stateName: Maine + stateCode: ME + - stateName: Marshall Islands + stateCode: MH + - stateName: Maryland + stateCode: MD + - stateName: Massachusetts + stateCode: MA + - stateName: Michigan + stateCode: MI + - stateName: Minnesota + stateCode: MN + - stateName: Mississippi + stateCode: MS + - stateName: Missouri + stateCode: MO + - stateName: Montana + stateCode: MT + - stateName: Nebraska + stateCode: NE + - stateName: Nevada + stateCode: NV + - stateName: New Hampshire + stateCode: NH + - stateName: New Jersey + stateCode: NJ + - stateName: New Mexico + stateCode: NM + - stateName: New York + stateCode: NY + - stateName: North Carolina + stateCode: NC + - stateName: North Dakota + stateCode: ND + - stateName: Northern Mariana Islands + stateCode: MP + - stateName: Ohio + stateCode: OH + - stateName: Oklahoma + stateCode: OK + - stateName: Oregon + stateCode: OR + - stateName: Palau + stateCode: PW + - stateName: Pennsylvania + stateCode: PA + - stateName: Puerto Rico + stateCode: PR + - stateName: Rhode Island + stateCode: RI + - stateName: South Carolina + stateCode: SC + - stateName: South Dakota + stateCode: SD + - stateName: Tennessee + stateCode: TN + - stateName: Texas + stateCode: TX + - stateName: Utah + stateCode: UT + - stateName: Vermont + stateCode: VT + - stateName: Virgin Islands + stateCode: VI + - stateName: Virginia + stateCode: VA + - stateName: Washington + stateCode: WA + - stateName: West Virginia + stateCode: WV + - stateName: Wisconsin + stateCode: WI + - stateName: Wyoming + stateCode: WY + - id: 227 + countryName: United States Minor Outlying Islands + countryCode: UM + states: [] + - id: 228 + countryName: Uruguay + countryCode: UY + states: [] + - id: 229 + countryName: Uzbekistan + countryCode: UZ + states: [] + - id: 230 + countryName: Vanuatu + countryCode: VU + states: [] + - id: 231 + countryName: Venezuela + countryCode: VE + states: [] + - id: 232 + countryName: Viet Nam + countryCode: VN + states: [] + - id: 233 + countryName: 'Virgin Islands, British' + countryCode: VG + states: [] + - id: 234 + countryName: 'Virgin Islands, U.S.' + countryCode: VI + states: [] + - id: 235 + countryName: Wallis and Futuna + countryCode: WF + states: [] + - id: 236 + countryName: Western Sahara + countryCode: EH + states: [] + - id: 237 + countryName: Yemen + countryCode: YE + states: [] + - id: 238 + countryName: Zambia + countryCode: ZM + states: [] + - id: 239 + countryName: Zimbabwe + countryCode: ZW + states: [] + - id: 240 + countryName: Isle of Man + countryCode: IM + states: [] + - id: 241 + countryName: Jersey + countryCode: JE + states: [] + - id: 242 + countryName: Guernsey + countryCode: GG + states: [] + - id: 243 + countryName: Lao People's Democratic Republic + countryCode: LA + states: [] + - id: 245 + countryName: Montenegro + countryCode: ME + states: [] + - id: 246 + countryName: Cote d'Ivoire + countryCode: CI + states: [] + - id: 247 + countryName: 'Bonaire, Sint Eustatius and Saba' + countryCode: BQ + states: [] + - id: 248 + countryName: Republic of Kosovo + countryCode: XK + states: [] + examples: + example-1: + value: + code: 200 + message: Success + data: + list: + - id: 10 + countryName: Argentina + countryCode: AR + states: + - stateName: Ciudad Autónoma de Buenos Aires + stateCode: C + - stateName: Buenos Aires + stateCode: B + operationId: get-companies-addresses-countries + description: Get Address Countries + x-internal: true + '/companies/{companyId}': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + delete: + summary: Physical Delete Company + operationId: delete-companies-companyId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: number + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyId: 5691 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyId: 1 + description: Physical Delete Company + tags: + - company + x-internal: true + /companies/bulk-creation/upload: + get: + summary: Get Import Company + tags: + - company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + isReady: '1' + fileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-company-staging/company_import_template.csv' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - socketId + - isReady + - fileUrl + properties: + socketId: + type: string + minLength: 1 + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + fileUrl: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + isReady: '1' + fileUrl: url.csv + operationId: get-companies-bulk-creation-upload + description: Get Import Company + x-internal: true + post: + summary: Update Companies File + operationId: post-companies-bulk-creation-upload + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + description: Update Companies File + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + companyFile: + type: object + tags: + - company + x-internal: true + /companies/begin-export: + post: + summary: Begin Export Company + operationId: post-companies-begin-export + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + socketId: + type: string + minLength: 1 + fileName: + type: string + minLength: 1 + required: + - socketId + - fileName + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + fileName: company-export-1i6zpxpe3g-9066193176477307371.csv + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + fileName: export.csv + description: Begin Export Company + tags: + - company + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: company +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/inner-sales-rep.yaml b/docs/b2b-edition/specs/storefront/app/inner-sales-rep.yaml new file mode 100644 index 000000000..fcaa6cc9f --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/inner-sales-rep.yaml @@ -0,0 +1,631 @@ +openapi: '3.0.0' +info: + title: inner-sales-rep + version: '1.0' + description: '' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /inner-sales-reps: + get: + summary: Get Sales Staffs List + tags: + - inner-sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '33' + salesRepName: super admin kiki + email: kiki@qq.com + companyCount: 2 + roleName: test sales staff + - id: '25' + salesRepName: SpritStorm + email: DoNotFuckingTouchThisOne@bundleb2b.net + companyCount: 27 + roleName: TestIsSales + pagination: + totalCount: 2 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + salesRepName: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyCount: + type: number + roleName: + type: string + minLength: 1 + required: + - id + - email + - companyCount + - roleName + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + groupBy=1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '33' + salesRepName: sale rep name + email: example@example.com + companyCount: 2 + roleName: sales staff + pagination: + totalCount: 1 + offset: 0 + limit: 10 + groupBy=2: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '5498' + companyName: company name + innerSalesRepsCount: 0 + email: example@example.com + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-inner-sales-reps + description: Get Sales Staffs List + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: username + in: query + name: sortBy + - schema: + type: string + default: DESC + in: query + name: orderBy + - schema: + type: integer + default: '1' + enum: + - '1' + - '2' + in: query + name: groupBy + description: '1=inner_sales_rep, 2=company' + - schema: + type: string + in: query + name: q + description: Query string + x-internal: true + '/inner-sales-reps/{inner_sales_rep_id}': + parameters: + - schema: + type: string + name: inner_sales_rep_id + in: path + required: true + put: + summary: Update A SalesStaff + operationId: put-inner-sales-reps-inner_sales_rep_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companies: + - companyId: '116' + isAssigned: '1' + id: '116' + assignStatus: '1' + properties: + companies: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Company ID + assignStatus: + type: string + minLength: 1 + description: '''0'': assigned, ''1'': unassigned' + required: + - id + - assignStatus + required: + - companies + examples: {} + description: '' + description: Update A SalesStaff + tags: + - inner-sales-rep + x-internal: true + '/inner-sales-reps/{inner_sales_rep_id}/companies': + parameters: + - schema: + type: string + name: inner_sales_rep_id + in: path + required: true + get: + summary: Get A SalesStaff's Companies' List + tags: + - inner-sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + message: string + data: + list: + - id: '123' + companyName: string + isAssigned: '1' + pagination: + totalCount: 0 + offset: 0 + limit: 0 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + description: '"0":assigned, "1":unassigned' + required: + - id + - companyName + - isAssigned + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 0 + message: string + data: + list: + - id: '123' + companyName: string + isAssigned: '1' + pagination: + totalCount: 0 + offset: 0 + limit: 0 + operationId: get-inner-sales-reps-inner_sales_rep_id-companies + description: Get A SalesStaff's Companies' List + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: integer + default: '1' + enum: + - 0 + - 1 + in: query + name: assignStatus + description: '0=assigned, 1=unassigned' + - schema: + type: integer + default: '1' + enum: + - '0' + - '1' + - '2' + - '3' + in: query + name: status + description: 'company status(0=PENDING, 1=APPROVED, 2=REJECTED, 3=INACTIVE)' + x-internal: true + /inner-sales-reps/companies: + get: + summary: Get SalesStaff' Companies List Based On SalesStaff Store Config + tags: + - inner-sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - companyName + - companyEmail + - customerGroupName + properties: + id: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + customerGroupName: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '5692' + companyName: Hannah Test413 + companyEmail: hannah.qi@bundleb2b.net + customerGroupName: Hannah Test413 + - id: '5693' + companyName: chengdu mozijiao + companyEmail: mozijiao@abc.com + customerGroupName: chengdu mozijiao + pagination: + totalCount: 2 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '5692' + companyName: company name + companyEmail: example@example + customerGroupName: cg name + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-inner-sales-reps-companies + description: Get SalesStaff' Companies List Based On SalesStaff Store Config + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: integer + default: '1' + enum: + - 0 + - 1 + - 2 + - 3 + in: query + name: status + description: 'company status(0=PENDING, 1=APPROVED, 2=REJECTED, 3=INACTIVE)' + x-internal: true + /inner-sales-reps/import: + post: + summary: Import Sales Staffs Files + operationId: post-inner-sales-reps-import + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + parameters: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + innerSalesRepFile: + type: object + description: '' + description: Import Sales Staffs Files + tags: + - inner-sales-rep + x-internal: true + /inner-sales-reps/export: + get: + summary: Export Sales Staffs Files + tags: + - inner-sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + operationId: get-inner-sales-reps-export + description: Export Sales Staffs Files + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: inner-sales-rep +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/integrations.yaml b/docs/b2b-edition/specs/storefront/app/integrations.yaml new file mode 100644 index 000000000..59859899a --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/integrations.yaml @@ -0,0 +1,595 @@ +openapi: '3.0.0' +info: + title: integrations + version: '1.0' + description: '' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /integrations/acumatica/configs: + get: + summary: Get acumatica configs + tags: + - integrations + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + baseUrl: + type: string + minLength: 1 + endpointName: + type: string + minLength: 1 + version: + type: string + minLength: 1 + username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - baseUrl + - endpointName + - version + - username + - password + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + baseUrl: 'http://silkweb.eicp.net:1680/ac' + endpointName: Commerce + version: 18.200.001 + username: admin + password: Abc12345678 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + baseUrl: url + endpointName: Commerce + version: 18.200.001 + username: admin + password: '12345678' + operationId: get-integrations-acumatica-configs + description: Get acumatica configs + x-internal: true + put: + summary: Update acumatica configs + operationId: put-integrations-acumatica-configs + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update acumatica configs + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + baseUrl: + type: string + minLength: 1 + endpointName: + type: string + minLength: 1 + version: + type: string + minLength: 1 + username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - baseUrl + - endpointName + - version + - username + - password + x-examples: + example-1: + baseUrl: 'http://silkweb.eicp.net:1680/ac' + endpointName: Commerce + version: 18.200.001 + username: admin + password: Abc12345678 + tags: + - integrations + x-internal: true + /integrations/acumatica/switches: + get: + summary: Get acumatica switches + tags: + - integrations + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + switches: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - switchName + - isActive + properties: + switchName: + type: string + minLength: 1 + isActive: + type: string + minLength: 1 + required: + - switches + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + switches: + - switchName: company + isActive: '0' + - switchName: address + isActive: '0' + - switchName: user + isActive: '0' + - switchName: order + isActive: '0' + - switchName: shipment + isActive: '0' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + switches: + - switchName: company + isActive: '0' + - switchName: address + isActive: '0' + - switchName: user + isActive: '0' + - switchName: order + isActive: '0' + - switchName: shipment + isActive: '0' + operationId: get-integrations-acumatica-switches + description: Get acumatica switches + x-internal: true + put: + summary: Update acumatica switch + operationId: put-integrations-acumatica-switches + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + switchName: + type: string + minLength: 1 + required: + - switchName + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + switchName: company + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + switchName: company + description: Update acumatica switch + requestBody: + content: + application/json: + schema: + type: object + properties: + switchName: + type: string + enum: + - company + - address + - user + - order + - shipment + isActive: + type: string + enum: + - '0' + - '1' + required: + - switchName + - isActive + examples: {} + tags: + - integrations + x-internal: true + /integrations/acumatica/logs: + get: + summary: Get acumatica async logs + tags: + - integrations + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - localEntity + - status + - locallyModified + - localId + - externallyModified + - externalId + - errorMessage + - latestAttempt + - attemptCount + - createdAt + properties: + localEntity: + type: string + minLength: 1 + status: + type: string + minLength: 1 + locallyModified: + type: string + minLength: 1 + localId: + type: string + minLength: 1 + externallyModified: + type: string + minLength: 1 + externalId: + type: string + minLength: 1 + errorMessage: + type: string + latestAttempt: + type: string + attemptCount: + type: string + createdAt: + type: string + minLength: 1 + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - localEntity: Company + status: '1' + locallyModified: '2020-09-18 04:50:02' + localId: 5461(price test 1) + externallyModified: '2020-09-18 04:50:01' + externalId: a9e7c85a-aff8-ea11-80d6-005056bef72c(price test 1) + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-18 04:50:02.382149' + - localEntity: Company + status: '1' + locallyModified: '2020-09-18 04:20:02' + localId: 5461(price test 1) + externallyModified: '2020-09-18 04:20:01' + externalId: a9e7c85a-aff8-ea11-80d6-005056bef72c(price test 1) + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-18 04:20:02.381721' + - localEntity: Company + status: '1' + locallyModified: '2020-09-18 03:50:12' + localId: 5461(price test 1) + externallyModified: '2020-09-18 03:50:11' + externalId: a9e7c85a-aff8-ea11-80d6-005056bef72c(price test 1) + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-18 03:50:12.025839' + - localEntity: Company + status: '1' + locallyModified: '2020-09-18 03:20:09' + localId: 5461(price test 1) + externallyModified: '2020-09-18 03:20:08' + externalId: a9e7c85a-aff8-ea11-80d6-005056bef72c(price test 1) + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-18 03:20:09.712583' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '22' + externallyModified: '' + externalId: ba852bb8-cd00-4b40-a65b-35d28beda872 + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:54:07.428831' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '21' + externallyModified: '' + externalId: f0b76126-1b1b-4c23-b743-1d092bf4b2b7 + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:54:06.535865' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '20' + externallyModified: '' + externalId: ba852bb8-cd00-4b40-a65b-35d28beda872 + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:50:10.837811' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '19' + externallyModified: '' + externalId: f0b76126-1b1b-4c23-b743-1d092bf4b2b7 + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:50:09.806422' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '' + externallyModified: '' + externalId: '' + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:46:54.446964' + - localEntity: shipment + status: '1' + locallyModified: '' + localId: '' + externallyModified: '' + externalId: '' + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-07 02:46:53.551020' + pagination: + totalCount: 181 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - localEntity: Company + status: '1' + locallyModified: '2020-09-18 04:50:02' + localId: 5461(price test 1) + externallyModified: '2020-09-18 04:50:01' + externalId: a9e7c85a-aff8-ea11-80d6-005056bef72c(price test 1) + errorMessage: '' + latestAttempt: '' + attemptCount: '' + createdAt: '2020-09-18 04:50:02.382149' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-integrations-acumatica-logs + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + enum: + - '0' + - '1' + in: query + name: status + description: Get acumatica async logs + x-internal: true + /integrations/acumatica/initial-async: + post: + summary: Async acumatica data + operationId: post-integrations-acumatica-initial-async + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Async acumatica data + tags: + - integrations + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: integrations +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/notification.yaml b/docs/b2b-edition/specs/storefront/app/notification.yaml new file mode 100644 index 000000000..376154300 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/notification.yaml @@ -0,0 +1,439 @@ +openapi: '3.0.0' +info: + title: notification + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /notifications: + get: + summary: Get Notification List With Pagination + tags: + - notification + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '458' + isRead: '1' + title: Order CSV Export Notification + createdAt: 1622711162 + - id: '457' + isRead: '0' + title: Order CSV Export Notification + createdAt: 1622711103 + - id: '456' + isRead: '0' + title: Order CSV Export Notification + createdAt: 1622711071 + - id: '455' + isRead: '1' + title: Sales Staffs Assignment Upload Summary Notification + createdAt: 1622689606 + - id: '454' + isRead: '1' + title: Sales Staffs Assignment Upload Summary Notification + createdAt: 1622689235 + - id: '453' + isRead: '1' + title: Sales Staff Assignment CSV Export Notification + createdAt: 1622689051 + - id: '452' + isRead: '1' + title: Sales Rep Upload Summary Notification + createdAt: 1619405769 + - id: '451' + isRead: '0' + title: Sales Rep Upload Summary Notification + createdAt: 1619405414 + - id: '450' + isRead: '0' + title: Sales Rep Upload Summary Notification + createdAt: 1619399443 + - id: '449' + isRead: '1' + title: Super Admin CSV Export Notification + createdAt: 1619344245 + pagination: + offset: 0 + totalCount: 394 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Notifications ID + isRead: + type: string + minLength: 1 + description: 'notifications status(0=unread, 1=Have read)' + title: + type: string + minLength: 1 + description: Notifications title + createdAt: + type: number + required: + - id + - isRead + - title + - createdAt + pagination: + type: object + required: + - offset + - totalCount + - limit + properties: + offset: + type: number + totalCount: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '458' + isRead: '1' + title: Order CSV Export Notification + createdAt: 1622711162 + pagination: + offset: 0 + totalCount: 1 + limit: 10 + operationId: get-notifications + description: Get Notification List With Pagination + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + enum: + - '0' + - '1' + default: '0' + in: query + name: isRead + description: 'notifications status(0=unread, 1=Have read)' + x-internal: true + '/notifications/{notificationId}': + parameters: + - schema: + type: string + name: notificationId + in: path + required: true + get: + summary: Get Notification Detail + tags: + - notification + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + id: 458 + title: Order CSV Export Notification + isRead: 1 + body: |2- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <div> + <p>Your File Is Ready</p> + <a href="https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-order-staging/order-export-1i6zpxpe3g-1622711162.csv">Download As A CSV File.</a> + </div> + createdAt: 1622711162 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - id + - title + - isRead + - body + - createdAt + properties: + id: + type: number + description: Notifications ID + title: + type: string + minLength: 1 + description: Notifications title + isRead: + type: number + description: 'notifications status(0=unread, 1=Have read)' + body: + type: string + minLength: 1 + description: Notifications content + createdAt: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + id: 458 + title: Order CSV Export Notification + isRead: 1 + body: |2- + + + + + + + + + + + + + + + + + + + + + + + + + + + + <div> + <p>Your File Is Ready</p> + <a href="url">Download As A CSV File.</a> + </div> + createdAt: 1622711162 + operationId: get-notifications-notificationId + description: Get Notification Detail + x-internal: true + '/notifications/{notificationId}/mark-as-read': + parameters: + - schema: + type: string + name: notificationId + in: path + required: true + put: + summary: '' + operationId: put-notifications-notificationId-mark-as-read + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + tags: + - notification + x-internal: true + /stats: + get: + summary: Get Dashboard Stats + tags: + - notification + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - title + - total + - updatedAt + properties: + title: + type: string + minLength: 1 + total: + type: number + updatedAt: + type: string + minLength: 1 + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + - title: Companies + total: 5419 + updatedAt: '1622712137' + - title: Price Lists + total: 13 + updatedAt: '1621382400' + - title: + - Super Admins + total: 1581 + updatedAt: '1622614678' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + - title: Companies + total: 5419 + updatedAt: '1622712137' + - title: Price Lists + total: 13 + updatedAt: '1621382400' + - title: + - Super Admins + total: 1581 + updatedAt: '1622614678' + operationId: get-stats + description: Get Dashboard Stats + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: notification +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/order.yaml b/docs/b2b-edition/specs/storefront/app/order.yaml new file mode 100644 index 000000000..7612876d4 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/order.yaml @@ -0,0 +1,501 @@ +openapi: '3.0.0' +info: + title: order + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /orders/backend: + get: + summary: Get Order List + tags: + - order + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '404' + bcOrderId: '637' + companyName: KobeCropTest3210 + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 60 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1622650013 + items: 5 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/637' + - id: '396' + bcOrderId: '636' + companyName: levi-test + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 91.9 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1622617316 + items: 2 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/636' + - id: '394' + bcOrderId: '635' + companyName: levi-test + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 450.45 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1622616050 + items: 11 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/635' + - id: '406' + bcOrderId: '629' + companyName: CharlesCo + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 549.95 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1622015866 + items: 6 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/629' + - id: '389' + bcOrderId: '628' + companyName: Same Company 618 + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 127.95 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1621411452 + items: 1 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/628' + - id: '388' + bcOrderId: '619' + companyName: BundleCompany + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 3004 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1619767048 + items: 20 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/619' + - id: '387' + bcOrderId: '618' + companyName: BundleCompany + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 443.9 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1619659847 + items: 3 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/618' + - id: '386' + bcOrderId: '617' + companyName: Same Company 618 + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 164 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1619601130 + items: 11 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/617' + - id: '385' + bcOrderId: '616' + companyName: Same Company 618 + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 164 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1619600269 + items: 11 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/616' + - id: '384' + bcOrderId: '615' + companyName: BundleCompany + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 7 + totalIncTax: 104 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1619592409 + items: 1 + timezone: Pacific/Apia + url: 'https://sylvia-apptest-store.mybigcommerce.com/manage/orders/615' + pagination: + totalCount: 223 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Order ID in B2B Edition + bcOrderId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + status: + type: string + minLength: 1 + description: Order status in B2B Edition + customStatus: + type: string + minLength: 1 + description: Order status in BC + statusCode: + type: number + description: '0=unpaid, 1=paid' + totalIncTax: + type: number + currencyCode: + type: string + minLength: 1 + money: + type: object + description: The style of the currency used for the order + properties: + currency_location: + type: string + minLength: 1 + currency_token: + type: string + minLength: 1 + decimal_token: + type: string + minLength: 1 + decimal_places: + type: number + thousands_token: + type: string + minLength: 1 + required: + - currency_location + - currency_token + - decimal_token + - decimal_places + - thousands_token + createdAt: + type: number + items: + type: number + description: Number of items + timezone: + type: string + minLength: 1 + url: + type: string + minLength: 1 + description: Order url in BC + required: + - id + - bcOrderId + - companyName + - status + - customStatus + - statusCode + - totalIncTax + - currencyCode + - createdAt + - items + - timezone + - url + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '404' + bcOrderId: '637' + companyName: company name + status: Awaiting Payment + customStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 60 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + createdAt: 1622650013 + items: 5 + timezone: Pacific/Apia + url: url + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-orders-backend + description: Get Order List + parameters: + - schema: + type: string + default: ASC + in: query + name: orderBy + - schema: + type: string + default: createdAt + in: query + name: sortBy + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: company + description: Company name + - schema: + type: string + in: query + name: orderId + description: Order ID in BC + - schema: + type: string + in: query + name: 'status[]' + description: Order status in B2B Edition + - schema: + type: string + enum: + - '"0"' + - '"1"' + in: query + name: 'statusCode[]' + description: '0=unpaid, 1=paid' + x-internal: true + /orders/export: + post: + summary: '' + operationId: post-orders-export + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + beginDateAt: '1111' + endDateAt: '22222' + status: + - 0 + salesRepIds: 11 + properties: + beginDateAt: + type: string + minLength: 1 + endDateAt: + type: string + minLength: 1 + status: + type: array + description: '0=unpaid, 1=paid' + items: + type: object + salesRepIds: + type: number + required: + - beginDateAt + - endDateAt + - status + - salesRepIds + examples: + example-1: + value: + beginDateAt: '1111' + endDateAt: '22222' + status: + - 0 + salesRepIds: 11 + tags: + - order + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: order +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/other.yaml b/docs/b2b-edition/specs/storefront/app/other.yaml new file mode 100644 index 000000000..177e9f94b --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/other.yaml @@ -0,0 +1,59 @@ +openapi: '3.0.0' +info: + title: other + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /health-check: + get: + summary: Check django service health + tags: + - other + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + operationId: get-health-check + description: Check django service health + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: other +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/product.yaml b/docs/b2b-edition/specs/storefront/app/product.yaml new file mode 100644 index 000000000..630370b50 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/product.yaml @@ -0,0 +1,615 @@ +openapi: '3.0.0' +info: + title: product + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /products: + get: + summary: Get products list + tags: + - product + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + products: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - name + - sku + - calculatedPrice + - orderQuantityMinimum + - orderQuantityMaximum + - imageUrl + - currencyCode + properties: + id: + type: number + name: + type: string + minLength: 1 + sku: + type: string + minLength: 1 + calculatedPrice: + type: number + orderQuantityMinimum: + type: number + orderQuantityMaximum: + type: number + imageUrl: + type: string + minLength: 1 + currencyCode: + type: string + minLength: 1 + variants: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - productId + - sku + - calculatedPrice + - imageUrl + - variantId + - currencyCode + properties: + productId: + type: number + sku: + type: string + minLength: 1 + calculatedPrice: + type: number + imageUrl: + type: string + minLength: 1 + optionValues: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - label + - optionId + - optionDisplayName + properties: + id: + type: number + label: + type: string + minLength: 1 + optionId: + type: number + optionDisplayName: + type: string + minLength: 1 + variantId: + type: number + currencyCode: + type: string + minLength: 1 + modifiers: + type: array + items: + properties: {} + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - products + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + products: + - id: 77 + name: '[Sample] Fog Linen Chambray Towel - Beige Stripe' + sku: SLCTBS + calculatedPrice: 49 + orderQuantityMinimum: 5 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 77 + sku: K1 + calculatedPrice: 10 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 149 + label: Small + optionId: 299 + optionDisplayName: Size + - id: 152 + label: red + optionId: 300 + optionDisplayName: KK + variantId: 397 + currencyCode: CNY + - productId: 77 + sku: K2 + calculatedPrice: 20 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 149 + label: Small + optionId: 299 + optionDisplayName: Size + - id: 153 + label: blue + optionId: 300 + optionDisplayName: KK + variantId: 398 + currencyCode: CNY + - productId: 77 + sku: K3 + calculatedPrice: 30 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 150 + label: Medium + optionId: 299 + optionDisplayName: Size + - id: 153 + label: blue + optionId: 300 + optionDisplayName: KK + variantId: 399 + currencyCode: CNY + modifiers: [] + - id: 80 + name: '[Sample] Orbit Terrarium - Large' + sku: OTL + calculatedPrice: 109 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/80/images/272/roundterrariumlarge.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 80 + sku: c1-1 + calculatedPrice: 109 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/80/images/272/roundterrariumlarge.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 158 + optionDisplayName: Size + variantId: 201 + currencyCode: CNY + - productId: 80 + sku: c1-2 + calculatedPrice: 109 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/80/images/272/roundterrariumlarge.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 158 + optionDisplayName: Size + variantId: 202 + currencyCode: CNY + - productId: 80 + sku: c1-3 + calculatedPrice: 109 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/80/images/272/roundterrariumlarge.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 158 + optionDisplayName: Size + variantId: 203 + currencyCode: CNY + modifiers: [] + - id: 81 + name: '[Sample] Orbit Terrarium - Small' + sku: OTS + calculatedPrice: 89 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/81/images/273/roundterrariumsmall.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 81 + sku: OTS + calculatedPrice: 89 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/81/images/273/roundterrariumsmall.1554505753.386.513.jpg?c=2' + optionValues: [] + variantId: 65 + currencyCode: CNY + modifiers: [] + - id: 86 + name: '[Sample] Able Brewing System' + sku: ABS + calculatedPrice: 225 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/86/images/286/ablebrewingsystem4.1614825453.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 86 + sku: ABS + calculatedPrice: 225 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/86/images/286/ablebrewingsystem4.1614825453.386.513.jpg?c=2' + optionValues: [] + variantId: 66 + currencyCode: CNY + modifiers: [] + - id: 88 + name: '[Sample] Chemex Coffeemaker 3 Cup' + sku: CC3C + calculatedPrice: 49.5 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/88/images/292/3cupchemex5.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 88 + sku: CC3C + calculatedPrice: 49.5 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/88/images/292/3cupchemex5.1554505753.386.513.jpg?c=2' + optionValues: [] + variantId: 67 + currencyCode: CNY + modifiers: [] + - id: 93 + name: '[Sample] 1 L Le Parfait Jar' + sku: SLLPJ + calculatedPrice: 7 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 93 + sku: SLLPJ-6088C959 + calculatedPrice: 7 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 112 + optionDisplayName: Size + variantId: 46 + currencyCode: CNY + - productId: 93 + sku: SLLPJ-9A544946 + calculatedPrice: 7 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 112 + optionDisplayName: Size + variantId: 50 + currencyCode: CNY + - productId: 93 + sku: SLLPJ-8650D0FD + calculatedPrice: 7 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 112 + optionDisplayName: Size + variantId: 54 + currencyCode: CNY + modifiers: [] + - id: 94 + name: '[Sample] Oak Cheese Grater' + sku: OCG + calculatedPrice: 34.95 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/94/images/314/oakcheesegrater2.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 94 + sku: x1-1 + calculatedPrice: 34.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/94/images/314/oakcheesegrater2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 156 + optionDisplayName: Size + variantId: 189 + currencyCode: CNY + - productId: 94 + sku: x1-2 + calculatedPrice: 34.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/94/images/314/oakcheesegrater2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 156 + optionDisplayName: Size + variantId: 190 + currencyCode: CNY + - productId: 94 + sku: x1-3 + calculatedPrice: 34.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/94/images/314/oakcheesegrater2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 156 + optionDisplayName: Size + variantId: 191 + currencyCode: CNY + modifiers: [] + - id: 97 + name: '[Sample] Tiered Wire Basket' + sku: TWB + calculatedPrice: 119.95 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/97/images/325/tieredbasket.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 97 + sku: g1-1 + calculatedPrice: 119.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/97/images/325/tieredbasket.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 154 + optionDisplayName: Size + variantId: 178 + currencyCode: CNY + - productId: 97 + sku: g1-2 + calculatedPrice: 119.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/97/images/325/tieredbasket.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 154 + optionDisplayName: Size + variantId: 179 + currencyCode: CNY + - productId: 97 + sku: g1-3 + calculatedPrice: 119.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/97/images/325/tieredbasket.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 154 + optionDisplayName: Size + variantId: 180 + currencyCode: CNY + modifiers: [] + - id: 98 + name: '[Sample] Laundry Detergent' + sku: CGLD + calculatedPrice: 29.95 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/98/images/327/CommonGoodLaundrySoap.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 98 + sku: f1-1 + calculatedPrice: 29.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/98/images/327/CommonGoodLaundrySoap.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 152 + optionDisplayName: Size + variantId: 166 + currencyCode: CNY + - productId: 98 + sku: f1-2 + calculatedPrice: 29.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/98/images/327/CommonGoodLaundrySoap.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 152 + optionDisplayName: Size + variantId: 167 + currencyCode: CNY + - productId: 98 + sku: f1-3 + calculatedPrice: 29.95 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/98/images/327/CommonGoodLaundrySoap.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 152 + optionDisplayName: Size + variantId: 168 + currencyCode: CNY + modifiers: [] + - id: 103 + name: '[Sample] Canvas Laundry Cart' + sku: CLC + calculatedPrice: 200 + orderQuantityMinimum: 0 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/103/images/334/naturalcanvascart2.1554505753.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 103 + sku: z1-1 + calculatedPrice: 200 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/103/images/334/naturalcanvascart2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 95 + label: Small + optionId: 150 + optionDisplayName: Size + variantId: 154 + currencyCode: CNY + - productId: 103 + sku: z1-2 + calculatedPrice: 200 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/103/images/334/naturalcanvascart2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 96 + label: Medium + optionId: 150 + optionDisplayName: Size + variantId: 155 + currencyCode: CNY + - productId: 103 + sku: z1-3 + calculatedPrice: 200 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/103/images/334/naturalcanvascart2.1554505753.220.290.jpg?c=2' + optionValues: + - id: 97 + label: Large + optionId: 150 + optionDisplayName: Size + variantId: 156 + currencyCode: CNY + modifiers: [] + pagination: + totalCount: 24 + offset: 0 + limit: 10 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + products: + - id: 77 + name: '[Sample] Fog Linen Chambray Towel - Beige Stripe' + sku: SLCTBS + calculatedPrice: 49 + orderQuantityMinimum: 5 + orderQuantityMaximum: 0 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + currencyCode: CNY + variants: + - productId: 77 + sku: K1 + calculatedPrice: 10 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 149 + label: Small + optionId: 299 + optionDisplayName: Size + - id: 152 + label: red + optionId: 300 + optionDisplayName: KK + variantId: 397 + currencyCode: CNY + - productId: 77 + sku: K2 + calculatedPrice: 20 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 149 + label: Small + optionId: 299 + optionDisplayName: Size + - id: 153 + label: blue + optionId: 300 + optionDisplayName: KK + variantId: 398 + currencyCode: CNY + - productId: 77 + sku: K3 + calculatedPrice: 30 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/77/images/266/foglinenbeigestripetowel1b.1554505752.220.290.jpg?c=2' + optionValues: + - id: 150 + label: Medium + optionId: 299 + optionDisplayName: Size + - id: 153 + label: blue + optionId: 300 + optionDisplayName: KK + variantId: 399 + currencyCode: CNY + modifiers: [] + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-products + description: Get products list + parameters: + - schema: + type: string + in: query + name: q + required: true + description: Query string + - schema: + type: string + in: query + name: companyId + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: product +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/proxy.yaml b/docs/b2b-edition/specs/storefront/app/proxy.yaml new file mode 100644 index 000000000..0c57e4156 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/proxy.yaml @@ -0,0 +1,135 @@ +openapi: '3.0.0' +info: + title: proxy + version: '1.0' + description: '' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /proxy/b2c: + post: + summary: BigCommerce S2S API proxy with auth + operationId: post-proxy-b2c + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 0 + message: string + data: {} + description: BigCommerce S2S API proxy with auth + requestBody: + content: + application/json: + schema: + type: object + properties: + function_name: + type: string + bc_token: + type: string + customer: + type: object + required: + - id + properties: + id: + type: string + store_hash: + type: string + required: + - function_name + - bc_token + - store_hash + tags: + - proxy + x-internal: true + /proxy: + post: + summary: Third party API proxy + operationId: post-proxy + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + description: Third party API proxy + requestBody: + content: + application/json: + schema: + type: object + properties: + method: + type: string + default: get + url: + type: string + params: + type: object + data: + type: object + proxyType: + type: string + default: Bigcommerce + tags: + - proxy + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: proxy +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/quantity-limit.yaml b/docs/b2b-edition/specs/storefront/app/quantity-limit.yaml new file mode 100644 index 000000000..024ee5332 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/quantity-limit.yaml @@ -0,0 +1,185 @@ +openapi: '3.0.0' +info: + title: quantity_limit + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /qty/upload: + get: + summary: Get Upload Quantity Limit Data + tags: + - quantity-limit + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + isReady: '1' + fileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-qty-staging/product_quantity_limit_export_1i6zpxpe3g.xls' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - socketId + - isReady + - fileUrl + properties: + socketId: + type: string + minLength: 1 + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + fileUrl: + type: string + minLength: 1 + description: File download address + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + socketId: e5e6a732b9d824565b4241f7ddd187d9 + isReady: '1' + fileUrl: url + operationId: get-qty-upload + description: Get Upload Quantity Limit Data + x-internal: true + post: + summary: Upload Quantity Limit File + operationId: post-qty-upload + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + description: Upload Quantity Limit File + parameters: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: object + examples: {} + description: '' + tags: + - quantity-limit + x-internal: true + /qty/export: + get: + summary: Get Export Quantity Limit Data + tags: + - quantity-limit + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + fileUrl: + type: string + minLength: 1 + required: + - fileUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + fileUrl: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-qty-staging/product_quantity_limit_export_1i6zpxpe3g.xls' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + fileUrl: url + operationId: get-qty-export + description: Get Export Quantity Limit Data + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: quantity-limit +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/quote.yaml b/docs/b2b-edition/specs/storefront/app/quote.yaml new file mode 100644 index 000000000..7ce61b377 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/quote.yaml @@ -0,0 +1,277 @@ +openapi: '3.0.0' +info: + title: quote + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + '/quotes/{quote_id}': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + get: + summary: Get Quote Info + operationId: get-quotes-quote_id + description: Get Quote Info + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + storeInfo: + type: object + properties: + storeName: + type: string + storeAddress: + type: string + storeCountry: + type: string + companyInfo: + type: object + properties: + companyId: + type: string + companyName: + type: string + companyAddress: + type: string + companyCountry: + type: string + companyCountryCode: + type: string + companyState: + type: string + companyStateCode: + type: string + companyCity: + type: string + companyZipCode: + type: string + firstName: + type: string + lastName: + type: string + phoneNumber: + type: string + salesRepInfo: + type: object + properties: + firstName: + type: string + lastName: + type: string + phoneNumber: + type: string + email: + type: string + quoteInfo: + type: object + properties: + quoteId: + type: string + referenceNumber: + type: string + title: + type: string + description: + type: string + createdAt: + type: string + expiredAt: + type: string + subtotal: + type: number + discount: + type: number + grandTotal: + type: number + money: + type: object + status: + type: string + orderId: + type: string + additionalInfo: + type: string + addressInfo: + type: array + items: + type: object + properties: + sku: + type: string + basePrice: + type: number + discount: + type: number + newPrice: + type: number + quantity: + type: string + productId: + type: string + variantId: + type: string + imageUrl: + type: string + productName: + type: string + options: + type: string + required: + - code + - message + - data + tags: + - quote + deprecated: true + x-internal: true + '/backend/quotes/{quote_id}': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + put: + summary: Update Quote Status in Backend(Approval) + operationId: put-backend-quotes-quote_id + responses: + '200': + description: OK + description: Update Quote Status in Backend(Approval) + requestBody: + content: + application/json: + schema: + type: object + properties: + status: + type: string + enum: + - '0' + - '6' + description: '"0": "Approve", "6": "Reject"' + tags: + - quote + deprecated: true + x-internal: true + /quotes: + get: + summary: Get Quotes List + tags: + - quote + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + quoteId: + type: string + referenceNumber: + type: string + title: + type: string + companyName: + type: string + salesRep: + type: string + createdAt: + type: string + totalPrice: + type: string + status: + type: string + money: + type: object + orderId: + type: string + backendOrderUrl: + type: string + operationId: get-quotes + description: Get Quotes List + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: createdAt + in: query + name: sortBy + - schema: + type: string + default: DESC + in: query + name: orderBy + - schema: + type: string + in: query + name: referenceNumber + - schema: + type: string + in: query + name: company + - schema: + type: string + in: query + name: salesRep + - schema: + type: array + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + - '6' + - '7' + in: query + name: 'status[]' + description: '"0": "new" "1": "sent" "2": "ordered" "3": "expired" "5": "draft" "6": "awaiting_approval" "7": "rejected"' + deprecated: true + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: quote +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/sales-rep.yaml b/docs/b2b-edition/specs/storefront/app/sales-rep.yaml new file mode 100644 index 000000000..fab185b51 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/sales-rep.yaml @@ -0,0 +1,697 @@ +openapi: '3.0.0' +info: + title: sales-reps + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + '/sales-reps/{sales_rep_id}/companies/backend': + parameters: + - schema: + type: string + name: sales_rep_id + in: path + required: true + get: + summary: Get Sales Reps Companies Backend + tags: + - sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - companyId: '5716' + companyName: levi-test + isAssigned: '1' + - companyId: '5717' + companyName: levi-test-create + isAssigned: '1' + pagination: + totalCount: 2 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + description: 'sales reps assigned to the company(0=Assigned, 1=unassigned)' + required: + - companyId + - companyName + - isAssigned + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - companyId: '5716' + companyName: company name + isAssigned: '1' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-sales-reps-sales_rep_id-companies-backend + description: Get Sales Reps Companies Backend + parameters: + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: integer + default: '1' + enum: + - 0 + - 1 + in: query + name: status + description: 'sales reps assigned to the company(0=Assigned, 1=unassigned)' + - schema: + type: string + in: query + name: q + description: Query string + x-internal: true + put: + summary: Update Sales Reps Companies Backend + operationId: put-sales-reps-sales_rep_id-companies-backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update Sales Reps Companies Backend + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companies: + - companyId: '86' + isAssigned: '1' + properties: + companies: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + description: 'sales reps assigned to the company(0=Assigned, 1=unassigned)' + required: + - companyId + - isAssigned + required: + - companies + tags: + - sales-rep + x-internal: true + '/companies/{company_id}/sales-reps/backend': + parameters: + - schema: + type: string + name: company_id + in: path + required: true + get: + summary: Get Company Sales Reps Backend + tags: + - sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - salesRepId: '7844' + firstName: levi + lastName: test + isAssigned: '1' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + salesRepId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + description: 'sales reps status(0=Assigned, 1=unassigned)' + required: + - salesRepId + - firstName + - lastName + - isAssigned + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - salesRepId: '7844' + firstName: first name + lastName: last name + isAssigned: '1' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-companies-company_id-sales-reps-backend + description: Get Company Sales Reps Backend + parameters: + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: integer + default: '1' + enum: + - 0 + - 1 + in: query + name: status + description: 'sales reps assigned to the company(0=Assigned, 1=unassigned)' + x-internal: true + put: + summary: Update Company Sales Reps Backend + operationId: put-companies-company_id-sales-reps-backend + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update Company Sales Reps Backend + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + salesReps: + - salesRepId: '104' + isAssigned: '1' + - salesRepId: '7815' + isAssigned: '1' + properties: + salesReps: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + salesRepId: + type: string + minLength: 1 + isAssigned: + type: string + minLength: 1 + description: 'sales reps assigned to the company(0=Assigned, 1=unassigned)' + required: + - salesRepId + - isAssigned + required: + - salesReps + tags: + - sales-rep + x-internal: true + /sales-reps/companies: + get: + summary: Get Company Sales Reps + tags: + - sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - companyName: company name + bcGroupName: bc group name + description: Desc + companyEmail: 1149847234@qq.com + addressLine1: '' + addressLine2: '' + city: shanxi + state: weinan + zipCode: pucheg + country: '' + companyId: '5498' + catalogId: '11' + salesRepCount: '10' + pagination: + totalCount: 5420 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyName: + type: string + minLength: 1 + bcGroupName: + type: string + minLength: 1 + description: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + addressLine1: + type: string + addressLine2: + type: string + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + country: + type: string + companyId: + type: string + minLength: 1 + catalogId: + type: string + minLength: 1 + salesRepCount: + type: string + minLength: 1 + description: The number of sales reps + required: + - companyName + - bcGroupName + - description + - companyEmail + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - country + - companyId + - catalogId + - salesRepCount + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - companyName: company name + bcGroupName: bc group name + description: '' + companyEmail: example@example.com + addressLine1: adress line 1 + addressLine2: adress line 2 + city: Sewell + state: New Jersey + zipCode: '92620' + country: '' + companyId: '376' + catalogId: '11' + salesRepCount: '10' + pagination: + totalCount: 5420 + offset: 0 + limit: 10 + operationId: get-sales-reps-companies + description: Get Company Sales Reps + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + enum: + - '1' + - '2' + default: '2' + in: query + name: groupBy + description: 'Group by(''2'' for company, ''1'' for sales reps)' + - schema: + type: string + default: 'DESC ' + in: query + description: Order by default DESC choice (DESC ASC) + name: orderBy + x-internal: true + '/sales-reps/{saleRepId}': + parameters: + - schema: + type: string + name: saleRepId + in: path + required: true + delete: + summary: Delete A Sales Rep + operationId: delete-sales-reps-saleRepId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: [] + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Delete A Sales Rep + tags: + - sales-rep + x-internal: true + /sales-reps/companies/export: + post: + summary: Export Sales Reps + operationId: post-sales-reps-companies-export + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + isReady: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isReady + properties: + isReady: + type: string + minLength: 1 + description: '"0":doing, "1":finished' + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + isReady: '0' + description: Export Sales Reps + tags: + - sales-rep + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: sales-rep +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/store-config.yaml b/docs/b2b-edition/specs/storefront/app/store-config.yaml new file mode 100644 index 000000000..3a0d5dc2f --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/store-config.yaml @@ -0,0 +1,1979 @@ +openapi: '3.0.0' +info: + title: store-config + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /store-config: + get: + summary: Get Store Config + tags: + - store-config + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + intervalQuantity: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + companyAutoApproval: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + openExpirationNotice: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + SFPAutoSaveShippingAddress: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + autoSaveOrderCompanyEmail: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + emailTemplatesConfig: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + addressSalesRep: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + addressBook: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + addressAdmin: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteSalesRepCreation: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteForGuest: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + backendPermissions: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + importConvertCompanyOrder: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + openIntegration: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteOnCartPage: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteOnProductPage: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + defaultPriceList: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteForIndividualCustomer: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + createUserEmailNotice: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteSalesRepVisibility: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + shoppingListNotifications: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + emailNotifications: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + innerSalesRep: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteAutoApproval: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quotes: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + email: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + quoteCustomer: + type: object + properties: + id: + type: number + isEnable: + type: string + minLength: 1 + required: + - id + - isEnable + listItemNum: + type: number + required: + - intervalQuantity + - companyAutoApproval + - openExpirationNotice + - SFPAutoSaveShippingAddress + - autoSaveOrderCompanyEmail + - emailTemplatesConfig + - addressSalesRep + - addressBook + - addressAdmin + - quoteSalesRepCreation + - quoteForGuest + - backendPermissions + - importConvertCompanyOrder + - openIntegration + - quoteOnCartPage + - quoteOnProductPage + - defaultPriceList + - quoteForIndividualCustomer + - createUserEmailNotice + - quoteSalesRepVisibility + - shoppingListNotifications + - emailNotifications + - innerSalesRep + - quoteAutoApproval + - quotes + - email + - quoteCustomer + - listItemNum + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + intervalQuantity: + id: 2 + isEnable: '0' + companyAutoApproval: + id: 19 + isEnable: '0' + openExpirationNotice: + id: 29 + isEnable: '0::0' + SFPAutoSaveShippingAddress: + id: 66 + isEnable: '0' + autoSaveOrderCompanyEmail: + id: 67 + isEnable: '1' + emailTemplatesConfig: + id: 69 + isEnable: '0' + addressSalesRep: + id: 8 + isEnable: '1' + addressBook: + id: 6 + isEnable: '1' + addressAdmin: + id: 7 + isEnable: '1' + quoteSalesRepCreation: + id: 78 + isEnable: '1' + quoteForGuest: + id: 75 + isEnable: '1' + backendPermissions: + id: 62 + isEnable: '1' + importConvertCompanyOrder: + id: 68 + isEnable: '1' + openIntegration: + id: 33 + isEnable: '0' + quoteOnCartPage: + id: 74 + isEnable: '1' + quoteOnProductPage: + id: 73 + isEnable: '1' + defaultPriceList: + id: 70 + isEnable: '5' + quoteForIndividualCustomer: + id: 76 + isEnable: '1' + createUserEmailNotice: + id: 52 + isEnable: '1' + quoteSalesRepVisibility: + id: 77 + isEnable: '0' + shoppingListNotifications: + id: 90 + isEnable: '1' + emailNotifications: + id: 1 + isEnable: '1' + innerSalesRep: + id: 71 + isEnable: '1' + quoteAutoApproval: + id: 54 + isEnable: '0' + quotes: + id: 12 + isEnable: '1' + email: + id: 3 + isEnable: kido.zhao@bundleb2b.net + quoteCustomer: + id: 72 + isEnable: '1' + listItemNum: 27 + examples: + key=email: + value: + code: 200 + message: SUCCESS + data: + id: 3 + key: email + isEnabled: example@example.com + key is None: + value: + code: 200 + message: SUCCESS + data: + intervalQuantity: + id: 2 + isEnable: '0' + companyAutoApproval: + id: 19 + isEnable: '0' + openExpirationNotice: + id: 29 + isEnable: '0::0' + SFPAutoSaveShippingAddress: + id: 66 + isEnable: '0' + autoSaveOrderCompanyEmail: + id: 67 + isEnable: '1' + emailTemplatesConfig: + id: 69 + isEnable: '0' + addressSalesRep: + id: 8 + isEnable: '1' + addressBook: + id: 6 + isEnable: '1' + addressAdmin: + id: 7 + isEnable: '1' + quoteSalesRepCreation: + id: 78 + isEnable: '1' + quoteForGuest: + id: 75 + isEnable: '1' + backendPermissions: + id: 62 + isEnable: '1' + importConvertCompanyOrder: + id: 68 + isEnable: '1' + openIntegration: + id: 33 + isEnable: '0' + quoteOnCartPage: + id: 74 + isEnable: '1' + quoteOnProductPage: + id: 73 + isEnable: '1' + defaultPriceList: + id: 70 + isEnable: '5' + quoteForIndividualCustomer: + id: 76 + isEnable: '1' + createUserEmailNotice: + id: 52 + isEnable: '1' + quoteSalesRepVisibility: + id: 77 + isEnable: '0' + shoppingListNotifications: + id: 90 + isEnable: '1' + emailNotifications: + id: 1 + isEnable: '1' + innerSalesRep: + id: 71 + isEnable: '1' + quoteAutoApproval: + id: 54 + isEnable: '0' + quotes: + id: 12 + isEnable: '1' + email: + id: 3 + isEnable: example@example.com + quoteCustomer: + id: 72 + isEnable: '1' + listItemNum: 27 + operationId: get-store-config + parameters: + - schema: + type: string + in: query + name: key + description: Get Store Config + x-internal: true + post: + summary: Create Store Config + operationId: post-store-config + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + configId: + type: string + minLength: 1 + required: + - configId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + configId: '12' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + configId: '12' + requestBody: + content: + application/json: + schema: + type: object + properties: + key: + type: string + description: Store config key + value: + type: string + description: Store config value + description: Create Store Config + tags: + - store-config + x-internal: true + put: + summary: Update Store Config + operationId: put-store-config + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update Store Config + requestBody: + content: + application/json: + schema: + type: object + properties: + id: + type: string + description: Store config id + value: + type: string + description: Store config value + required: + - id + - value + tags: + - store-config + x-internal: true + /store-config/price-list: + put: + summary: Update Store Config Default Price List + operationId: put-store-config-price-list + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + pricelistId: + type: string + pricelistName: + type: string + required: + - pricelistId + - pricelistName + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + pricelistId: '' + pricelistName: '' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + pricelistId: '12' + pricelistName: price name + description: Update Store Config Default Price List + requestBody: + content: + application/json: + schema: + type: object + properties: + pricelistId: + type: string + tags: + - store-config + x-internal: true + /store-config/payment-methods: + put: + summary: Update Store Config Default Payment Methods + operationId: put-store-config-payment-methods + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + paymentMethods: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - paymentCode + - paymentTitle + properties: + id: + type: number + paymentCode: + type: string + minLength: 1 + paymentTitle: + type: string + minLength: 1 + required: + - paymentMethods + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + paymentMethods: + - id: 39 + paymentCode: bankdeposit + paymentTitle: Bank Deposit + - id: 43 + paymentCode: cheque + paymentTitle: Check + - id: 40 + paymentCode: cod + paymentTitle: Cash on Delivery + - id: 52 + paymentCode: moneyorder + paymentTitle: Money Order + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + paymentMethods: + - id: 39 + paymentCode: bankdeposit + paymentTitle: Bank Deposit + - id: 43 + paymentCode: cheque + paymentTitle: Check + - id: 40 + paymentCode: cod + paymentTitle: Cash on Delivery + - id: 52 + paymentCode: moneyorder + paymentTitle: Money Order + description: Update Store Config Default Payment Methods + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + paymentCodes: + - bankdeposit + - cheque + - cod + - moneyorder + properties: + paymentCodes: + type: array + items: + type: string + required: + - paymentCodes + tags: + - store-config + x-internal: true + /store-config/inner-sales-rep: + put: + summary: Update Store's InnerSalesRep + operationId: put-store-config-inner-sales-rep + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + innerSalesRep: + type: object + properties: + userId: + type: number + email: + type: string + minLength: 1 + username: + type: string + minLength: 1 + required: + - userId + - email + - username + required: + - innerSalesRep + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + innerSalesRep: + userId: 36 + email: levi.tuo@silksoftware.com + username: levi.tuo + examples: + userId is not None: + value: + code: 200 + message: SUCCESS + data: + innerSalesRep: + userId: 36 + email: example@example.com + username: username + description: Update Store's InnerSalesRep + requestBody: + content: + application/json: + schema: + type: object + properties: + userId: + type: string + description: Backend User ID + tags: + - store-config + x-internal: true + '/store-configs/switch-status/{id}': + parameters: + - schema: + type: string + name: id + in: path + required: true + put: + summary: Update Store Config Switch Status + operationId: put-store-configs-switch-status-id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update Store Config's value. + requestBody: + content: + application/json: + schema: + type: object + properties: + isEnabled: + type: string + enum: + - '0' + - '1' + description: If this key is a checkbox use this field. + value: + type: string + example: PO Number + description: Use this field when key is a text value. + required: + - isEnabled + tags: + - store-config + x-internal: true + /store-configs/notifications-email: + put: + summary: Update Store Config Notification Email + operationId: put-store-configs-notifications-email + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + email: + type: string + minLength: 1 + required: + - email + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + email: kido.zhao@bundleb2b.net + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + email: example@example.com + requestBody: + content: + application/json: + schema: + type: object + properties: + email: + type: string + required: + - email + description: Update Store Config Notification Email + tags: + - store-config + x-internal: true + /store-configs/email/configs: + put: + summary: Update store custom email server + operationId: put-store-configs-email-configs + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + verifyOrSubmit: '0' + emailConfigs: + smtpServer: mail.s482.sureserver.com + port: '587' + security: 1 + username: hannah.qi@bundleb2b.net + password: jeidiamohsutohn + properties: + verifyOrSubmit: + type: string + minLength: 1 + emailConfigs: + type: object + required: + - smtpServer + - port + - security + - username + - password + properties: + smtpServer: + type: string + minLength: 1 + port: + type: string + minLength: 1 + security: + type: integer + description: 'use tls and ssl(0=No, 1=Yes)' + username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - verifyOrSubmit + - emailConfigs + examples: {} + description: Update store custom email server + tags: + - store-config + x-internal: true + /store-configs/email/templates: + put: + summary: Update store custom email templates + operationId: put-store-configs-email-templates + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Update store custom email templates + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + content: '<p>Dear Customer,</p><p><span style="font-size: 1em;">To view the status and details of your quote, please visit: {quote_details_url}</span><br/></p><p><span style="font-size: 1em;">Thanks,</span><br/></p><p><b></b><br/></p>' + type: 3 + properties: + content: + type: string + minLength: 1 + description: Email template content + type: + default: 3 + description: 'email type(0=customer_welcome_email, 1=customer_invited_email, 2=customer_pending_email, 3=quote_detail_email)' + type: integer + required: + - content + - type + examples: {} + tags: + - store-config + x-internal: true + /store-configs: + get: + summary: Get Store Configs + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + switchStatus: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - key + - isEnabled + properties: + id: + type: string + minLength: 1 + key: + type: string + minLength: 1 + isEnabled: + type: string + minLength: 1 + notificationsEmailTo: + type: string + minLength: 1 + defaultPriceList: + type: object + properties: + pricelistId: + type: string + minLength: 1 + pricelistName: + type: string + minLength: 1 + required: + - pricelistId + - pricelistName + priceList: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - pricelistId + - pricelistName + properties: + pricelistId: + type: number + pricelistName: + type: string + minLength: 1 + defaultPaymentMethods: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - paymentCode + - paymentTitle + properties: + id: + type: number + paymentCode: + type: string + minLength: 1 + paymentTitle: + type: string + minLength: 1 + defaultInnerSalesRep: + type: object + properties: {} + required: [] + appClientId: + type: string + minLength: 1 + listItemNum: + type: number + emailConfigs: + type: object + properties: + smtpServer: + type: string + minLength: 1 + port: + type: string + minLength: 1 + security: + type: number + username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + configId: + type: number + isEnabled: + type: string + minLength: 1 + required: + - smtpServer + - port + - security + - username + - password + - configId + - isEnabled + emailTemplates: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - title + - content + - type + - configId + - isEnabled + properties: + title: + type: string + minLength: 1 + content: + type: string + minLength: 1 + type: + type: number + configId: + type: number + isEnabled: + type: string + minLength: 1 + required: + - switchStatus + - notificationsEmailTo + - defaultPriceList + - priceList + - defaultPaymentMethods + - defaultInnerSalesRep + - appClientId + - listItemNum + - emailConfigs + - emailTemplates + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: 成功 + data: + switchStatus: + - id: '2' + key: interval_quantity + isEnabled: '0' + - id: '75' + key: quote_for_guest + isEnabled: '0' + - id: '102' + key: invite_user_email_notice + isEnabled: '1' + - id: '1' + key: email_notifications + isEnabled: '1' + - id: '29' + key: open_expiration_notice + isEnabled: '0' + - id: '8' + key: address_sales_rep + isEnabled: '1' + - id: '6' + key: address_book + isEnabled: '1' + - id: '52' + key: create_user_email_notice + isEnabled: '1' + - id: '78' + key: quote_sales_rep_creation + isEnabled: '1' + - id: '73' + key: quote_on_product_page + isEnabled: '1' + - id: '62' + key: backend_permissions + isEnabled: '1' + - id: '68' + key: import_convert_company_order + isEnabled: '1' + - id: '33' + key: open_integration + isEnabled: '0' + - id: '77' + key: quote_sales_rep_visibility + isEnabled: '0' + - id: '19' + key: company_auto_approval + isEnabled: '0' + - id: '71' + key: inner_sales_rep + isEnabled: '1' + - id: '76' + key: quote_for_individual_customer + isEnabled: '1' + - id: '72' + key: quote_customer + isEnabled: '0' + - id: '54' + key: quote_auto_approval + isEnabled: '0' + - id: '12' + key: quotes + isEnabled: '1' + - id: '104' + key: use_external_email_config + isEnabled: '1' + - id: '103' + key: shopping_list_approved_notifications + isEnabled: '1' + - id: '90' + key: shopping_list_notifications + isEnabled: '1' + - id: '7' + key: address_admin + isEnabled: '1' + - id: '74' + key: quote_on_cart_page + isEnabled: '0' + notificationsEmailTo: kido.zhao@bundleb2b.net + defaultPriceList: + pricelistId: '13' + pricelistName: price test 1 + priceList: + - pricelistId: 1 + pricelistName: Wholesale001 + - pricelistId: 2 + pricelistName: allenB2b + - pricelistId: 5 + pricelistName: test + - pricelistId: 6 + pricelistName: s-test1 pricelist + - pricelistId: 7 + pricelistName: Wholesale0011 + - pricelistId: 8 + pricelistName: allenB2b1 + - pricelistId: 9 + pricelistName: test1 + - pricelistId: 10 + pricelistName: s-test1 pricelist1 + - pricelistId: 11 + pricelistName: Wholesale group + - pricelistId: 13 + pricelistName: price test 1 + - pricelistId: 14 + pricelistName: sdg + - pricelistId: 15 + pricelistName: newtest1 + - pricelistId: 16 + pricelistName: price list1 + defaultPaymentMethods: + - id: 39 + paymentCode: bankdeposit + paymentTitle: Bank Deposit + - id: 43 + paymentCode: cheque + paymentTitle: Check + - id: 52 + paymentCode: moneyorder + paymentTitle: Money Order + defaultInnerSalesRep: {} + appClientId: npjs1ubfnbxqqhmjxazbfy0cosfq4s4 + listItemNum: 26 + emailConfigs: + smtpServer: smtp.163.com + port: '465' + security: 0 + username: liumaosen100@163.com + password: NAVBCEPHKAWYCWOK + configId: 104 + isEnabled: '1' + emailTemplates: + - title: You Have Received a Shopping List Approval Request + content: '<p>Hello,</p><br><p><font>{submitter_name}</font> has submitted a new shopping list for approval. </p><p>Please note, <span style="">this shopping list will be on hold until you or another admin user has approved it for processing.</span></p><br><p>Please use the link below to log in:</p><br><p><a href="{shoppinglist_url}"><font>LOG IN</font><span></span></a></p><br><p>Thanks!</p><p>The {store_name} Team</p>' + type: 4 + configId: 90 + isEnabled: '1' + - title: 'The Status of Your Shopping List {shoppinglist_name} Has Been Updated' + content: '<p>Hello {submitter_name},</p><br><p>The status of your shopping list {shoppinglist_name} has been updated.</p><br><p>Please use the link below to login and review your shopping list:</p><br><p><a href="{shoppinglist_url}">LOG IN</a></p><br><p>Thanks!</p><p>The {store_name} Team</p>' + type: 5 + configId: 103 + isEnabled: '1' + - title: '{inviter_name} Has Invited You to Join Their {store_name} Business Account' + content: '<p>Hi {newuser_email},</p><br><p>{inviter_name} from {company_name} would like you to join their {store_name} Business Account.</p><br><p>Here is your account email address: {newuser_email}.</p><p>Log into your business account at <a href="{store_login_url}">store</a> using your email address and password.</p><br><p>If you do not already have a password you will need to request a <a href="{password_reset_url}">password reset</a> using your account email address.</p><br><p>If you cannot see the link above, please copy this URL into your web browser to reset your password:</p><p>{password_reset_url}</p><br><p>We look forward to serving you.</p><br><p>If you think you received this email in error, please disregard.</p>' + type: 1 + configId: 102 + isEnabled: '1' + - title: 'Your {store_name} Quote {quote_number} Has Been Updated' + content: '<p>Dear Customer,</p><p><span style="font-size: 1em;">To view the status and details of your quote, please visit: {quote_details_url}</span><br></p><p><span style="font-size: 1em;">Thanks,</span></p>' + type: 3 + - title: 'Your {store_name} Business Account has been generated' + content: '<p>Hi <font>{user_email}</font>,</p><br><p>Thank you for signing up for a business account with us.</p><br><p>Here is your account email address: <font>{user_email}</font>.</p><p>Log into your business account at <a href="{store_login_url}">store</a> using your email address and password.</p><br><p>If you do not already have a password, you will need to request a <a href="{password_reset_url}">password reset</a> using your account email address.</p><br><p>If you cannot see the link above, please copy this URL into your web browser to reset your password:</p><p><font>{password_reset_url}</font></p><br><p>We look forward to serving you.</p><br><p>If you think you received this email in error, please disregard.</p>' + type: 0 + configId: 52 + isEnabled: '1' + examples: + example-1: + value: + code: 200 + message: 成功 + data: + switchStatus: + - id: '2' + key: interval_quantity + isEnabled: '0' + - id: '75' + key: quote_for_guest + isEnabled: '0' + - id: '102' + key: invite_user_email_notice + isEnabled: '1' + - id: '1' + key: email_notifications + isEnabled: '1' + - id: '29' + key: open_expiration_notice + isEnabled: '0' + - id: '8' + key: address_sales_rep + isEnabled: '1' + - id: '6' + key: address_book + isEnabled: '1' + - id: '52' + key: create_user_email_notice + isEnabled: '1' + - id: '78' + key: quote_sales_rep_creation + isEnabled: '1' + - id: '73' + key: quote_on_product_page + isEnabled: '1' + - id: '62' + key: backend_permissions + isEnabled: '1' + - id: '68' + key: import_convert_company_order + isEnabled: '1' + - id: '33' + key: open_integration + isEnabled: '0' + - id: '77' + key: quote_sales_rep_visibility + isEnabled: '0' + - id: '19' + key: company_auto_approval + isEnabled: '0' + - id: '71' + key: inner_sales_rep + isEnabled: '1' + - id: '76' + key: quote_for_individual_customer + isEnabled: '1' + - id: '72' + key: quote_customer + isEnabled: '0' + - id: '54' + key: quote_auto_approval + isEnabled: '0' + - id: '12' + key: quotes + isEnabled: '1' + - id: '104' + key: use_external_email_config + isEnabled: '1' + - id: '103' + key: shopping_list_approved_notifications + isEnabled: '1' + - id: '90' + key: shopping_list_notifications + isEnabled: '1' + - id: '7' + key: address_admin + isEnabled: '1' + - id: '74' + key: quote_on_cart_page + isEnabled: '0' + notificationsEmailTo: kido.zhao@bundleb2b.net + defaultPriceList: + pricelistId: '13' + pricelistName: price test 1 + priceList: + - pricelistId: 1 + pricelistName: Wholesale001 + - pricelistId: 2 + pricelistName: allenB2b + - pricelistId: 5 + pricelistName: test + - pricelistId: 6 + pricelistName: s-test1 pricelist + - pricelistId: 7 + pricelistName: Wholesale0011 + - pricelistId: 8 + pricelistName: allenB2b1 + - pricelistId: 9 + pricelistName: test1 + - pricelistId: 10 + pricelistName: s-test1 pricelist1 + - pricelistId: 11 + pricelistName: Wholesale group + - pricelistId: 13 + pricelistName: price test 1 + - pricelistId: 14 + pricelistName: sdg + - pricelistId: 15 + pricelistName: newtest1 + - pricelistId: 16 + pricelistName: price list1 + defaultPaymentMethods: + - id: 39 + paymentCode: bankdeposit + paymentTitle: Bank Deposit + - id: 43 + paymentCode: cheque + paymentTitle: Check + - id: 52 + paymentCode: moneyorder + paymentTitle: Money Order + defaultInnerSalesRep: {} + appClientId: npjs1ubfnbxqqhmjxazbfy0cosfq4s4 + listItemNum: 26 + emailConfigs: + smtpServer: smtp.163.com + port: '465' + security: 0 + username: liumaosen100@163.com + password: NAVBCEPHKAWYCWOK + configId: 104 + isEnabled: '1' + emailTemplates: + - title: You Have Received a Shopping List Approval Request + content: '<p>Hello,</p><br><p><font>{submitter_name}</font> has submitted a new shopping list for approval. </p><p>Please note, <span style="">this shopping list will be on hold until you or another admin user has approved it for processing.</span></p><br><p>Please use the link below to log in:</p><br><p><a href="{shoppinglist_url}"><font>LOG IN</font><span></span></a></p><br><p>Thanks!</p><p>The {store_name} Team</p>' + type: 4 + configId: 90 + isEnabled: '1' + - title: 'The Status of Your Shopping List {shoppinglist_name} Has Been Updated' + content: '<p>Hello {submitter_name},</p><br><p>The status of your shopping list {shoppinglist_name} has been updated.</p><br><p>Please use the link below to login and review your shopping list:</p><br><p><a href="{shoppinglist_url}">LOG IN</a></p><br><p>Thanks!</p><p>The {store_name} Team</p>' + type: 5 + configId: 103 + isEnabled: '1' + - title: '{inviter_name} Has Invited You to Join Their {store_name} Business Account' + content: '<p>Hi {newuser_email},</p><br><p>{inviter_name} from {company_name} would like you to join their {store_name} Business Account.</p><br><p>Here is your account email address: {newuser_email}.</p><p>Log into your business account at <a href="{store_login_url}">store</a> using your email address and password.</p><br><p>If you do not already have a password you will need to request a <a href="{password_reset_url}">password reset</a> using your account email address.</p><br><p>If you cannot see the link above, please copy this URL into your web browser to reset your password:</p><p>{password_reset_url}</p><br><p>We look forward to serving you.</p><br><p>If you think you received this email in error, please disregard.</p>' + type: 1 + configId: 102 + isEnabled: '1' + - title: 'Your {store_name} Quote {quote_number} Has Been Updated' + content: '<p>Dear Customer,</p><p><span style="font-size: 1em;">To view the status and details of your quote, please visit: {quote_details_url}</span><br></p><p><span style="font-size: 1em;">Thanks,</span></p>' + type: 3 + - title: 'Your {store_name} Business Account has been generated' + content: '<p>Hi <font>{user_email}</font>,</p><br><p>Thank you for signing up for a business account with us.</p><br><p>Here is your account email address: <font>{user_email}</font>.</p><p>Log into your business account at <a href="{store_login_url}">store</a> using your email address and password.</p><br><p>If you do not already have a password, you will need to request a <a href="{password_reset_url}">password reset</a> using your account email address.</p><br><p>If you cannot see the link above, please copy this URL into your web browser to reset your password:</p><p><font>{password_reset_url}</font></p><br><p>We look forward to serving you.</p><br><p>If you think you received this email in error, please disregard.</p>' + type: 0 + configId: 52 + isEnabled: '1' + operationId: get-store-configs + description: Get configs of this store. + parameters: [] + security: + - authToken: [] + x-internal: true + /store-configs/checkout: + get: + summary: Get Checkout Config of Store + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + checkoutShippingAllowNewAddress: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutShippingAllowSaveAddress: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutShippingAllowSameAddress: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutBillingAllowNewAddress: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutBillingAllowSaveAddress: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentPurchaseEnableExtra: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentPurchaseExtraFields: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentPurchaseExtraFieldsRequired: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentAdditionalEnableExtra: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentAdditionalExtraFields: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + checkoutPaymentAdditionalExtraFieldsRequired: + type: object + properties: + id: + type: number + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + required: + - id + - value + - type + required: + - checkoutShippingAllowNewAddress + - checkoutShippingAllowSaveAddress + - checkoutShippingAllowSameAddress + - checkoutBillingAllowNewAddress + - checkoutBillingAllowSaveAddress + - checkoutPaymentPurchaseEnableExtra + - checkoutPaymentPurchaseExtraFields + - checkoutPaymentPurchaseExtraFieldsRequired + - checkoutPaymentAdditionalEnableExtra + - checkoutPaymentAdditionalExtraFields + - checkoutPaymentAdditionalExtraFieldsRequired + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: 成功 + data: + checkoutShippingAllowNewAddress: + id: 91 + value: '1' + type: checkbox + checkoutShippingAllowSaveAddress: + id: 92 + value: '1' + type: checkbox + checkoutShippingAllowSameAddress: + id: 93 + value: '1' + type: checkbox + checkoutBillingAllowNewAddress: + id: 94 + value: '1' + type: checkbox + checkoutBillingAllowSaveAddress: + id: 95 + value: '1' + type: checkbox + checkoutPaymentPurchaseEnableExtra: + id: 96 + value: '1' + type: checkbox + checkoutPaymentPurchaseExtraFields: + id: 97 + value: PO Number / Reference Number 1 + type: text + checkoutPaymentPurchaseExtraFieldsRequired: + id: 98 + value: '1' + type: checkbox + checkoutPaymentAdditionalEnableExtra: + id: 99 + value: '1' + type: checkbox + checkoutPaymentAdditionalExtraFields: + id: 100 + value: Reference Number 2 + type: text + checkoutPaymentAdditionalExtraFieldsRequired: + id: 101 + value: '1' + type: checkbox + examples: + example-1: + value: + code: 200 + message: 成功 + data: + checkoutShippingAllowNewAddress: + id: 91 + value: '1' + type: checkbox + checkoutShippingAllowSaveAddress: + id: 92 + value: '1' + type: checkbox + checkoutShippingAllowSameAddress: + id: 93 + value: '1' + type: checkbox + checkoutBillingAllowNewAddress: + id: 94 + value: '1' + type: checkbox + checkoutBillingAllowSaveAddress: + id: 95 + value: '1' + type: checkbox + checkoutPaymentPurchaseEnableExtra: + id: 96 + value: '1' + type: checkbox + checkoutPaymentPurchaseExtraFields: + id: 97 + value: PO Number / Reference Number 1 + type: text + checkoutPaymentPurchaseExtraFieldsRequired: + id: 98 + value: '1' + type: checkbox + checkoutPaymentAdditionalEnableExtra: + id: 99 + value: '1' + type: checkbox + checkoutPaymentAdditionalExtraFields: + id: 100 + value: Reference Number 2 + type: text + checkoutPaymentAdditionalExtraFieldsRequired: + id: 101 + value: '1' + type: checkbox + operationId: get-store-configs-checkout + description: Get checkout config setting of the store. + security: + - authToken: [] + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: store-config +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/store.yaml b/docs/b2b-edition/specs/storefront/app/store.yaml new file mode 100644 index 000000000..53aff0e6b --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/store.yaml @@ -0,0 +1,75 @@ +openapi: '3.0.0' +info: + title: store + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /stores/themes: + post: + summary: Upload store theme. + operationId: post-stores-themes + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Upload store theme. + requestBody: + content: + application/json: + schema: + type: object + properties: + storeHash: + type: string + baseStoreHash: + type: string + themeName: + type: string + required: + - storeHash + - baseStoreHash + - themeName + tags: + - store + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: store +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/subscription.yaml b/docs/b2b-edition/specs/storefront/app/subscription.yaml new file mode 100644 index 000000000..e07ca0b1c --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/subscription.yaml @@ -0,0 +1,88 @@ +openapi: '3.0.0' +info: + title: subscription + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /subscription: + post: + summary: Create a subscription + operationId: post-subscription + responses: + '200': + description: OK + content: + text/html: + schema: + type: object + properties: {} + examples: {} + description: Create a subscription + parameters: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + record_id: + type: string + company: + type: string + email: + type: string + cardholder_name: + type: string + credit_card_number: + type: string + expiration_date: + type: string + cvv: + type: string + first_name: + type: string + last_name: + type: string + street_address: + type: string + city: + type: string + state: + type: string + postal_code: + type: string + country: + type: string + description: '' + tags: + - subscription + x-internal: true + '/subscriptions/{record_id}': + parameters: + - schema: + type: string + name: record_id + in: path + required: true + get: + summary: Get subscription by id + tags: + - subscription + responses: + '200': + description: OK + content: + text/html: + schema: + type: object + properties: {} + operationId: get-subscriptions-record_id + description: Get subscription by id + x-internal: true +components: + schemas: {} + securitySchemes: {} +tags: + - name: subscription +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/app/webhooks.yaml b/docs/b2b-edition/specs/storefront/app/webhooks.yaml new file mode 100644 index 000000000..0d9ca59b6 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/app/webhooks.yaml @@ -0,0 +1,420 @@ +openapi: '3.0.0' +info: + title: webhooks + version: '1.0' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /webhooks/orders: + post: + summary: Receiving and disposing web hook data + operationId: post-webhooks-orders + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 198 + quoteNumber: QN000198 + referenceNumber: '' + quoteTitle: '' + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622619765 + updatedAt: 1622619765 + expiredAt: '' + subtotal: 45.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 197 + quoteNumber: QN000197 + referenceNumber: '' + quoteTitle: '' + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622619710 + updatedAt: 1622619710 + expiredAt: '' + subtotal: 45.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 196 + quoteNumber: QN000196 + referenceNumber: '' + quoteTitle: '' + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622619698 + updatedAt: 1622619698 + expiredAt: '' + subtotal: 45.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Kido Zhao + company: levi-test + salesRep: Kido Zhao + createdAt: 1622618606 + updatedAt: 1622626110 + expiredAt: 1622717999 + subtotal: 45.95 + status: 4 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: 396 + orderId: 226 + - quoteId: 194 + quoteNumber: QN000194 + referenceNumber: '' + quoteTitle: test + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622617428 + updatedAt: 1622617428 + expiredAt: '' + subtotal: 100 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 193 + quoteNumber: QN000193 + referenceNumber: '' + quoteTitle: '' + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622616667 + updatedAt: 1622616667 + expiredAt: '' + subtotal: 45.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 192 + quoteNumber: QN000192 + referenceNumber: '' + quoteTitle: '' + createdBy: Hannah Admin330 + company: CharlesCo + salesRep: '' + createdAt: 1622616377 + updatedAt: 1622616377 + expiredAt: '' + subtotal: 45.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + - quoteId: 191 + quoteNumber: QN000191 + referenceNumber: '' + quoteTitle: '' + createdBy: wesley.sale song + company: wdawd + salesRep: '' + createdAt: 1622169388 + updatedAt: 1622169388 + expiredAt: '' + subtotal: 119.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: CNY + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: '1.0000000000' + bcOrderId: '' + orderId: '' + - quoteId: 190 + quoteNumber: QN000190 + referenceNumber: '' + quoteTitle: '' + createdBy: wesley.sale song + company: wdawd + salesRep: '' + createdAt: 1622169374 + updatedAt: 1622169374 + expiredAt: '' + subtotal: 119.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: CNY + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: '1.0000000000' + bcOrderId: '' + orderId: '' + - quoteId: 189 + quoteNumber: QN000189 + referenceNumber: '' + quoteTitle: '' + createdBy: wesley.sale song + company: wdawd + salesRep: '' + createdAt: 1622169366 + updatedAt: 1622169366 + expiredAt: '' + subtotal: 119.95 + status: 0 + currency: + token: ¥ + location: left + currencyCode: CNY + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: '1.0000000000' + bcOrderId: '' + orderId: '' + pagination: + totalCount: 186 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - code + - message + - data + examples: {} + description: Receiving and disposing web hook data + requestBody: + content: + application/json: + schema: + type: object + properties: + data: + type: object + properties: + id: + type: string + scope: + type: string + producer: + type: string + tags: + - webhooks + x-internal: true + /webhooks/customers: + post: + summary: Receiving and disposing customer web hook data + operationId: post-webhooks-customers + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + scope: store/customer/created + store_id: '1025646' + data: + type: customer + id: 32 + hash: 8768ab15aa86c6d73c7e4c3efbaee072110ad1d2 + created_at: 1561481571 + producer: 'stores/{store_hash}' + properties: + scope: + type: string + minLength: 1 + data: + type: object + required: + - id + properties: + id: + type: number + producer: + type: string + minLength: 1 + required: + - scope + - data + - producer + description: Receiving and disposing customer web hook data + tags: + - webhooks + x-internal: true + /webhooks/register: + post: + summary: Register web hooks events + operationId: post-webhooks-register + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Register web hooks events + requestBody: + content: + application/json: + schema: + type: object + properties: + scope: + type: string + destination: + type: string + required: + - scope + - destination + tags: + - webhooks + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: webhooks +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/authentication.yaml b/docs/b2b-edition/specs/storefront/authentication.yaml new file mode 100644 index 000000000..13a1bbac4 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/authentication.yaml @@ -0,0 +1,199 @@ +openapi: 3.0.0 +info: + title: Authentication + version: '1.0' + description: BigCommerce B2B Edition API auth management. +servers: + - url: 'https://api-b2b.bigcommerce.com/api' +paths: + /v2/login: + post: + summary: Get StoreFront authToken from Stencil + operationId: post-login + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + token: + type: string + minLength: 1 + required: + - token + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImxldmkudHVvQHNpbGtzb2Z0d2FyZS5jb20iLCJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCJ9.ETkUWT7Rw4eOBq6UMqq2EyWtFkhceogNyWVpr34Qwgw + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYjJjX29yZGVyX2ltcG9ydEBxcS5jb21tIiwic3RvcmVfaGFzaCI6ImYyb3N4ampueGoiLCJkYiI6ImRlZmF1bHQifQ + description: |- + Get a storeFront authToken. You need a [BigCommerce Current Customer JWT](https://developer.bigcommerce.com/docs/storefront-auth/current-customer) to make the request. See the B2B Edition [Authentication article](/docs/openapi/65687766b2725-authentication) for more details. + <br>Equivalent Storefront GraphQL API Mutation: `authorization`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + type: object + properties: + bcToken: + type: string + description: BC JWT token + customerId: + type: integer + description: Customer Id + storeHash: + type: string + description: Store Hash + channelId: + type: integer + description: BigCommerce channel id + required: + - bcToken + examples: + example-1: + value: + bcToken: string + customerId: 1234 + storeHash: string + tags: + - Authentication + parameters: [] + /io/auth/customers: + post: + summary: Get StoreFront authToken with Credentials + operationId: post-auth-customer + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + name: + type: string + minLength: 1 + token: + type: string + minLength: 1 + required: + - name + - token + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + name: test9 + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8yNzZAc25hcG1haWwuY2MiLCJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsIm5hbWUiOiJ0ZXN0OSIsImNoYW5uZWxfaWRzIjpbMV0sInRva2VuX3R5cGUiOjMsIm5iZiI6MTAwMCwiZXhwIjoyMDAxfQ.EiR__LVAlBVNYtFCZPWJYoPv6UfGiXtULxhK-BCQZjY + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: + name: test9 + token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8yNzZAc25hcG1haWwuY2MiLCJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsIm5hbWUiOiJ0ZXN0OSIsImNoYW5uZWxfaWRzIjpbMV0sInRva2VuX3R5cGUiOjMsIm5iZiI6MTAwMCwiZXhwIjoyMDAxfQ.EiR__LVAlBVNYtFCZPWJYoPv6UfGiXtULxhK-BCQZjY + meta: + message: SUCCESS + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + storeHash: '{{store_hash}}' + email: kido276@snapmail.cc + password: test12345 + channelId: 1 + name: test9 + beginAt: 1000 + endAt: 2001 + properties: + storeHash: + type: string + minLength: 1 + email: + type: string + minLength: 1 + description: BC customer email + password: + type: string + minLength: 1 + description: BC customer password + channelId: + type: number + description: Store channelId + name: + type: string + minLength: 1 + required: + - storeHash + - email + - password + - channelId + - name + examples: + example-1: + value: + storeHash: string + email: axe@snapmail.cc + password: test12345 + channelId: 1 + name: test + beginAt: 1000 + endAt: 1721930486 + description: '' + description: |- + BC customer get a authentication token. + <br>Equivalent Storefront GraphQL API Mutation: `login`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Authentication + parameters: [] +components: + schemas: {} +tags: + - name: Authentication diff --git a/docs/b2b-edition/specs/storefront/invoice_protal/invoice/invoice.yaml b/docs/b2b-edition/specs/storefront/invoice_protal/invoice/invoice.yaml new file mode 100644 index 000000000..e87fbee8c --- /dev/null +++ b/docs/b2b-edition/specs/storefront/invoice_protal/invoice/invoice.yaml @@ -0,0 +1,1006 @@ +openapi: 3.0.1 +info: + title: Invoices + description: BigCommerce B2B Edition Invoice + contact: {} + version: v2 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2/ip/storefront' +security: + - authToken: [] +tags: + - name: Invoice + description: Invoice +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + schemas: + invoice: + description: Invoice model + type: object + x-examples: + example-1: + id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: string + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string + title: '' + x-internal: false + properties: + id: + type: number + description: Invoice ID + readOnly: true + customerId: + type: string + minLength: 1 + description: B2B Edition Company ID + externalCustomerId: + type: string + minLength: 1 + description: ID of a company associated with a third party + externalId: + type: string + minLength: 1 + description: The ID of the invoice associated with the third party + invoiceNumber: + type: string + minLength: 1 + description: Invoice no. + type: + type: string + minLength: 1 + description: Invoice Type + dueDate: + type: number + description: Invoice due date + status: + type: number + description: Invoice status + orderNumber: + type: string + minLength: 1 + description: BigCommerce order ID + purchaseOrderNumber: + type: string + minLength: 1 + description: PO no. + details: + type: object + description: Invoice details + properties: + type: + type: string + minLength: 1 + description: Invoice details type + header: + type: object + required: + - costLines + - billingAddress + - shippingAddresses + properties: + costLines: + type: array + uniqueItems: true + minItems: 1 + description: Invoice cost information + items: + type: object + properties: + amount: + type: object + description: cost amount + required: + - code + - value + properties: + code: + type: string + minLength: 1 + value: + type: string + minLength: 1 + description: + type: string + minLength: 1 + description: cost description + required: + - amount + - description + orderDate: + type: number + description: Invoice order creation time + billingAddress: + type: object + description: Invoice billing address + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + customFields: + type: object + customerFields: + type: string + minLength: 1 + description: User-defined additional fields + shippingAddresses: + type: array + uniqueItems: true + minItems: 1 + description: Invoice shipping addresses + items: + type: object + properties: + city: + type: string + minLength: 1 + state: + type: string + minLength: 1 + country: + type: string + minLength: 1 + street1: + type: string + minLength: 1 + street2: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + customFields: + type: object + required: + - city + - state + - country + - street1 + - street2 + - zipCode + - lastName + - firstName + details: + type: object + properties: + shipments: + type: array + uniqueItems: true + minItems: 1 + description: Invoice shipments information + items: + type: object + properties: + addressIndex: + type: string + description: address ID + shipDate: + type: string + description: Time of shipment + shipVia: + type: string + trackingNumber: + type: string + description: tracking number + comments: + type: string + description: comments + customFields: + type: object + required: + - addressIndex + - shipDate + - shipVia + - trackingNumber + - comments + lineItems: + type: array + uniqueItems: true + minItems: 1 + description: Invoice Product Information + items: + type: object + properties: + sku: + type: string + minLength: 1 + description: Product sku + type: + type: string + minLength: 1 + description: product type + comments: + type: string + minLength: 1 + quantity: + type: string + minLength: 1 + description: product qyantity + unitPrice: + type: object + description: product unit price + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + example: USA + value: + type: string + minLength: 1 + description: amount + description: + type: string + minLength: 1 + description: product description + customFields: + type: object + unitDiscount: + type: object + description: product unit discount + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + required: + - sku + - type + - comments + - quantity + - unitPrice + - description + - unitDiscount + required: + - lineItems + required: + - type + - header + isPendingPayment: + type: number + readOnly: true + source: + type: number + description: Source of invoice 0 is B2B Edition 1 is External + enum: + - 0 + - 1 + example: 0 + originalBalance: + type: object + description: Origin balance + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + openBalance: + type: object + description: Invoice open balance + required: + - code + - value + properties: + code: + type: string + minLength: 1 + description: currency code + value: + type: string + minLength: 1 + description: amount + customerName: + type: string + minLength: 1 + description: BigCommerce customer group name + readOnly: true + createdAt: + type: string + description: Invoice creation time + updatedAt: + type: string + description: Invoice last updated time + readOnly: true + required: + - customerId + - invoiceNumber + - type + - status + - originalBalance + - openBalance +paths: + '/invoices/{invoiceId}': + parameters: + - schema: + type: string + name: invoiceId + in: path + required: true + description: invoice id + get: + summary: Get invoice detail + operationId: get-invoices-invoiceId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + $ref: '#/components/schemas/invoice' + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - meta + examples: + '200': + value: + code: 200 + data: + id: 9 + customerId: '95075' + externalId: null + externalCustomerId: null + invoiceNumber: '00000009' + type: Invoice on Shipment + dueDate: 1617675497 + status: 1 + orderNumber: '104' + purchaseOrderNumber: null + details: + type: StandardInvoiceDetails + header: + costLines: + - amount: + code: USD + value: '349.5000' + description: Subtotal + - amount: + code: USD + value: '0.0000' + description: Freight + - amount: + code: USD + value: '0.0000' + description: Sales Tax + orderDate: 1616809386 + billingAddress: + city: 成都 + state: District of Columbia + country: United States + street1: tianfuwujie + street2: ruanjianyuan + zipCode: '123' + lastName: xu + firstName: stanton + customFields: {} + customerFields: '' + shippingAddresses: + - city: 成都 + state: District of Columbia + country: United States + street1: tianfuwujie + street2: ruanjianyuan + zipCode: '123' + lastName: xu + firstName: stanton + customFields: {} + details: + shipments: [] + lineItems: + - sku: DPB + type: physical + comments: '' + quantity: '10' + unitPrice: + code: USD + value: '34.95' + description: '[Sample] Dustpan & Brush' + customFields: {} + unitDiscount: + code: USD + value: '12' + - sku: DD + type: product + comments: '' + quantity: '10' + unitPrice: + code: USD + value: '3' + description: '[Sample] Dustpan ' + customFields: {} + unitDiscount: + code: USD + value: '1' + isPendingPayment: 1 + source: 0 + originalBalance: + code: USD + value: '349.5000' + openBalance: + code: USD + value: '913.4300' + customerName: silk + meta: + message: SUCCESS + '404': + value: + code: 404 + data: [] + meta: + message: Not Found Error + errors: Invoice does not exist + example-3: + value: + code: 0 + data: + id: 0 + customerId: string + externalCustomerId: string + externalId: string + invoiceNumber: string + type: string + dueDate: 0 + status: 0 + orderNumber: string + purchaseOrderNumber: string + details: + type: string + header: + costLines: + - amount: + code: string + value: string + description: string + orderDate: 0 + billingAddress: + city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + customerFields: string + shippingAddresses: + - city: string + state: string + country: string + street1: string + street2: string + zipCode: string + lastName: string + firstName: string + customFields: {} + details: + shipments: + - {} + lineItems: + - sku: string + type: string + comments: string + quantity: string + unitPrice: + code: string + value: string + description: string + customFields: {} + unitDiscount: + code: string + value: string + isPendingPayment: 0 + source: 0 + originalBalance: + code: string + value: string + openBalance: + code: string + value: string + customerName: string + meta: + message: string + description: get invoice detail + parameters: + - schema: + type: string + in: header + name: authToken + description: API token + required: true + tags: + - Invoice + x-internal: true + /invoices: + parameters: [] + get: + summary: Get invoices + operationId: get-invoices + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + $ref: '#/components/schemas/invoice' + examples: + example: + value: + code: 200 + data: + - id: 33 + customerId: '3' + externalId: null + externalCustomerId: null + invoiceNumber: '00000033' + type: Invoice on Shipment + dueDate: 1619826907 + status: 0 + orderNumber: '132' + purchaseOrderNumber: null + details: + type: StandardInvoiceDetails + header: + costLines: + - amount: + code: USD + value: '400.0000' + description: Subtotal + - amount: + code: USD + value: '0.0000' + description: Freight + - amount: + code: USD + value: '0.0000' + description: Sales Tax + orderDate: 1618246864 + billingAddress: + city: montreal + state: California + country: United States + street1: test + street2: test + zipCode: '111111' + lastName: test + firstName: test + customFields: {} + customerFields: '' + shippingAddresses: + - city: montreal + state: California + country: United States + street1: test + street2: test + zipCode: '111111' + lastName: test + firstName: test + customFields: {} + details: + lineItems: + - sku: CLC + type: physical + comments: '' + quantity: 2 + unitPrice: + code: USD + value: '200.0000' + description: '[Sample] Canvas Laundry Cart' + customFields: {} + unitDiscount: + code: USD + value: 0 + shipments: [] + isPendingPayment: 1 + source: 0 + originalBalance: + code: USD + value: '400.0000' + openBalance: + code: USD + value: '400.0000' + customerName: ABC123 + description: get invoices + parameters: + - schema: + type: string + in: header + name: authToken + description: API Token + required: true + - schema: + type: number + in: query + name: offset + - schema: + type: number + in: query + name: limit + - schema: + type: string + enum: + - DESC + - ASC + example: DESC + in: query + name: orderBy + description: '"DESC" or "ASC"' + - schema: + type: string + enum: + - invoiceNumber + - createdAt + - customerId + - externalCustomerId + - dueDate + - updatedAt + - isPendingPayment + - openBalance + - originalBalance + - status + example: invoiceNumber + in: query + name: sortBy + description: Sort by the field value + - schema: + type: string + enum: + - invoiceNumber + - type + - orderNumber + - purchaseOrderNumber + - customerId + - externalCustomerId + example: invoiceNumber + in: query + name: searchBy + description: Filter by a field + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + in: query + name: customerName + description: Query by invoice B2B Edition company name + - schema: + type: string + in: query + name: customerId + description: Query by invoice B2B Edition company id + - schema: + type: array + enum: + - 0 is open + - 1 is partial + - 2 is completed + example: '[0, 1]' + in: query + name: status + description: Query by invoice status + - schema: + type: string + in: query + name: beginDateAt + description: 'Query by the created time period, with the "endDateAt" parameter' + - schema: + type: string + in: query + name: endDateAt + description: 'Query by the created time period, with the "beginDateAt" parameter' + - schema: + type: array + in: query + name: externalId + description: Query by the invoice external ID + tags: + - Invoice + x-internal: true + /invoices/export: + get: + summary: Export invoices + tags: + - Invoice + operationId: get-invoices-export + description: export invoices + parameters: + - schema: + type: string + in: header + name: authToken + description: API Token + required: true + - schema: + type: number + in: query + name: offset + - schema: + type: number + in: query + name: limit + - schema: + type: string + enum: + - DESC + - ASC + example: DESC + in: query + name: orderBy + description: '"DESC" or "ASC"' + - schema: + type: string + enum: + - invoiceNumber + - createdAt + - customerId + - externalCustomerId + - dueDate + - updatedAt + - isPendingPayment + - openBalance + - originalBalance + - status + example: invoiceNumber + in: query + name: sortBy + description: Sort by the field value + - schema: + type: string + enum: + - invoiceNumber + - type + - orderNumber + - purchaseOrderNumber + - customerId + - externalCustomerId + example: invoiceNumber + in: query + name: searchBy + description: Filter by a field + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - schema: + type: string + in: query + name: customerName + description: Query by invoice B2B Edition company name + - schema: + type: string + in: query + name: customerId + description: Query by invoice B2B Edition company id + - schema: + type: array + enum: + - 0 is open + - 1 is partial + - 2 is completed + example: '[0, 1]' + in: query + name: status + description: Query by invoice status + - schema: + type: string + in: query + name: beginDateAt + description: 'Query by the created time period, with the "endDateAt" parameter' + - schema: + type: string + in: query + name: endDateAt + description: 'Query by the created time period, with the "beginDateAt" parameter' + responses: + '200': + description: 'If the request is successful, a file named "invoices.csv" is returned' + x-internal: true + '/invoices/{invoiceId}/download-pdf': + parameters: + - schema: + type: string + name: invoiceId + in: path + required: true + get: + summary: Download pdf file by invoice id + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + url: + type: string + minLength: 1 + required: + - url + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + url: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-quote-staging/B3_Sandbox_Invoice_Portal_Dev:00000026.pdf' + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: + url: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-quote-staging/B3_Sandbox_Invoice_Portal_Dev:00000026.pdf' + meta: + message: SUCCESS + operationId: get-invoices-invoiceId-download-pdf + description: Download pdf file by invoice id + parameters: + - schema: + type: string + in: header + name: authToken + required: true + x-internal: true +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/invoice_protal/payment/payment.yaml b/docs/b2b-edition/specs/storefront/invoice_protal/payment/payment.yaml new file mode 100644 index 000000000..ff4a8e57a --- /dev/null +++ b/docs/b2b-edition/specs/storefront/invoice_protal/payment/payment.yaml @@ -0,0 +1,147 @@ +openapi: 3.0.1 +info: + title: PaymentMethod + description: BigCommerce B2B Edition PaymentMethod + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2/ip/storefront' +security: + - authToken: [] +tags: + - name: PaymentMethod + description: PaymentMethod +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +paths: + /payments/modules: + get: + summary: Get Payment Modules + tags: + - Payments + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - moduleName + properties: + moduleName: + type: string + minLength: 1 + value: + type: object + properties: + isEnabled: + type: number + displayName: + type: string + minLength: 1 + isStorefrontMethod: + type: number + required: + - isEnabled + - displayName + - isStorefrontMethod + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + - moduleName: payments_offline + value: + isEnabled: 1 + displayName: Offline Payment + isStorefrontMethod: 0 + - moduleName: payments_test + value: + isEnabled: 0 + displayName: Test Payment Gateway + isStorefrontMethod: 1 + - moduleName: payments_minibc + value: + apiKey: '' + rootUrl: 'https://apps.minibc.com/api/apps/recurring/v1' + isEnabled: 1 + displayName: Credit / Debit Card + authorizeOnly: 1 + isStorefrontMethod: 1 + - moduleName: payments_bigcommerce_sales_order + value: + isEnabled: 1 + productId: 112 + variantId: 77 + displayName: Pay with BigCommerce + allowedMethods: + - bigpaypay + - cheque + isStorefrontMethod: 1 + meta: + message: SUCCESS + examples: + example-1: + value: + code: 200 + data: + - moduleName: payments_offline + value: + isEnabled: 1 + displayName: Offline Payment + isStorefrontMethod: 0 + - moduleName: payments_test + value: + isEnabled: 0 + displayName: Test Payment Gateway + isStorefrontMethod: 1 + - moduleName: payments_minibc + value: + apiKey: '' + rootUrl: 'https://apps.minibc.com/api/apps/recurring/v1' + isEnabled: 1 + displayName: Credit / Debit Card + authorizeOnly: 1 + isStorefrontMethod: 1 + - moduleName: payments_bigcommerce_sales_order + value: + isEnabled: 1 + productId: 112 + variantId: 77 + displayName: Pay with BigCommerce + allowedMethods: + - bigpaypay + - cheque + isStorefrontMethod: 1 + meta: + message: SUCCESS + operationId: get-payments-modules + description: Get payment modules + parameters: [] + x-internal: true +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/invoice_protal/payment_bc_order/payment_bc_order.yaml b/docs/b2b-edition/specs/storefront/invoice_protal/payment_bc_order/payment_bc_order.yaml new file mode 100644 index 000000000..c19d4c002 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/invoice_protal/payment_bc_order/payment_bc_order.yaml @@ -0,0 +1,321 @@ +openapi: 3.0.1 +info: + title: PaymentBCOrder + description: BigCommerce B2B Edition PaymentMethod + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2/ip/storefront' +security: + - authToken: [] +tags: + - name: PaymentBCOrder + description: PaymentBCOrder +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +paths: + /payments/bigcommerce/carts: + post: + summary: Create BigCommerce Cart + tags: + - PaymentBCOrder + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + checkoutUrl: + type: string + minLength: 1 + cartId: + type: string + minLength: 1 + required: + - checkoutUrl + - cartId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + checkoutUrl: 'https://devteambundleb2bnet.mybigcommerce.com/cart.php?action=loadInCheckout&id=e1d055aa-b8c2-4c50-b0db-71f02e66f449&token=e77a3e00972f5edbcacf352d5d29c814bc98404fd7361cca687498ef72015e07&from=IP' + cartId: e1d055aa-b8c2-4c50-b0db-71f02e66f449 + meta: + message: SUCCESS + examples: + '200': + value: + code: 200 + data: + checkoutUrl: 'https://devteambundleb2bnet.mybigcommerce.com/cart.php?action=loadInCheckout&id=e1d055aa-b8c2-4c50-b0db-71f02e66f449&token=e77a3e00972f5edbcacf352d5d29c814bc98404fd7361cca687498ef72015e07&from=IP' + cartId: e1d055aa-b8c2-4c50-b0db-71f02e66f449 + meta: + message: SUCCESS + operationId: create-bigcommerce-carts + description: Create bigcommerce cart + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + details: + type: object + properties: + memo: + type: string + required: + - memo + currency: + type: string + minLength: 1 + lineItems: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - invoiceId + - amount + properties: + invoiceId: + type: number + amount: + type: string + minLength: 1 + currentCartId: {} + required: + - details + - currency + - lineItems + x-examples: + example-1: + details: + memo: '' + currency: USD + lineItems: + - invoiceId: 26 + amount: '10' + currentCartId: null + x-internal: true + '/payments/bigcommerce/carts/{payment_id}': + parameters: + - schema: + type: string + name: payment_id + in: path + required: true + get: + summary: Get Payment BigCommerce Cart + tags: + - PaymentBCOrder + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + cartId: + type: string + minLength: 1 + cartUrl: + type: string + required: + - cartId + - cartUrl + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + cartId: e1d055aa-b8c2-4c50-b0db-71f02e66f449 + cartUrl: '' + meta: + message: SUCCESS + examples: + '200': + value: + code: 200 + data: + cartId: e1d055aa-b8c2-4c50-b0db-71f02e66f449 + cartUrl: url + meta: + message: SUCCESS + operationId: get-payments-bigcommerce-carts-payment_id + description: Get payment big commerce cart + x-internal: true + /payments/bigcommerce/allowed-methods: + get: + summary: Get BigCommerce Payment Allowed Methods + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + data: + allowedMethods: + - bigpaypay + - cheque + meta: + message: SUCCESS + properties: + code: + type: number + data: + type: object + required: + - allowedMethods + properties: + allowedMethods: + type: array + items: + type: string + meta: + type: object + required: + - message + properties: + message: + type: string + minLength: 1 + required: + - code + - data + - meta + examples: + '200': + value: + code: 200 + data: + allowedMethods: + - bigpaypay + meta: + message: SUCCESS + operationId: get-payments-bigcommerce-allowed-methods + description: Get bigcommerce payment allowed methods + tags: + - PaymentBCOrder + x-internal: true + /payments/bigcommerce/orders: + post: + summary: Finish BigCommerce Payment + tags: + - PaymentBCOrder + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + paymentId: + type: number + receiptId: + type: number + required: + - paymentId + - receiptId + meta: + type: object + properties: + message: + type: string + minLength: 1 + required: + - message + required: + - code + - data + - meta + x-examples: + example-1: + code: 200 + data: + paymentId: 15 + receiptId: 4 + meta: + message: SUCCESS + examples: + '200': + value: + code: 200 + data: + paymentId: 15 + receiptId: 4 + meta: + message: SUCCESS + operationId: finish-payments-bigcommerce-orders + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + orderId: + type: number + required: + - orderId + x-examples: + example-1: + orderId: 142 + description: Finish bigcommerce payment + x-internal: true +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml b/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml new file mode 100644 index 000000000..5adba9c29 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml @@ -0,0 +1,495 @@ +openapi: 3.0.1 +info: + title: Receipt + description: BigCommerce B2B Edition Invoice Receipt + contact: {} + version: v3 +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2/ip/storefront' +security: + - authToken: [] +tags: + - name: Receipt + description: Receipt +components: + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header + parameters: + offset: + name: offset + in: query + required: false + schema: + type: integer + minimum: 0 + description: 'Pagination offset default: 0' + limit: + name: limit + in: query + required: false + schema: + type: integer + default: 10 + minimum: 1 + maximum: 250 + description: 'Pagination limit default: 10' + orderBy: + name: orderBy + in: query + required: false + schema: + type: string + default: DESC + enum: + - DESC + - ASC + description: 'Allow: ''DESC'', ''ASC''' + 'paymentStatus[]': + name: 'paymentStatus[]' + in: query + required: false + schema: + type: string + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + description: 'Payment processing status. 0 means ‘Incomplete’ status, 1 means ‘Awaiting Processing’ status, 2 means ‘Processing’ status, 3 means ‘Completed’ status, 4 means ‘Refunded'' status' + searchBy: + name: searchBy + in: query + required: false + schema: + type: string + enum: + - payerName + - referenceNumber + - customerId + - externalId + description: The response search by which field + sortBy: + name: sortBy + in: query + required: false + schema: + type: string + default: createdAt + enum: + - createdAt + - updatedAt + description: The response sorted by which field +paths: + /receipts: + get: + summary: Get receipts + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response code of success request + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt.yaml + meta: + type: object + properties: + message: + type: string + description: Response message of success request + pagination: + type: object + properties: + offset: + type: integer + description: 'Pagination offset default: 0' + limit: + type: integer + description: 'Pagination limit default: 10' + totalCount: + type: integer + description: Total count of the receipts + examples: + example-1: + value: + code: 200 + data: + - id: 85 + createdAt: 1630658187 + updatedAt: 1630658187 + storeHash: 1i6zpxpe3g + customerId: '5485' + externalId: '' + externalCustomerId: '' + payerName: k Admin + payerCustomerId: '5485' + details: + paymentDetails: + memo: '' + transactionType: Paid + paymentType: Visa ending in 1111 + referenceNumber: '375026' + paymentId: 92 + total: + code: USD + value: '122.9500' + - id: 84 + createdAt: 1630638069 + updatedAt: 1630638069 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + payerName: Cash + payerCustomerId: '5707' + details: + paymentDetails: + memo: test + transactionType: Paid + paymentType: Offline + referenceNumber: test + paymentId: 91 + total: + code: CNY + value: '0.8900' + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-receipts + description: 'Get receipts, with pagination data' + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/orderBy' + - $ref: '#/components/parameters/paymentStatus[]' + - $ref: '#/components/parameters/sortBy' + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - $ref: '#/components/parameters/searchBy' + x-internal: true + '/receipts/{receiptId}': + parameters: + - schema: + type: string + name: receiptId + in: path + required: true + description: The unique id of receipt + get: + summary: Get a receipt + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + description: Response code of success request + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt.yaml + meta: + type: object + properties: + message: + type: string + description: Response message of request + examples: + example-1: + value: + code: 200 + data: + id: 83 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + payerName: Cash + payerCustomerId: '5707' + details: + paymentDetails: + memo: test + transactionType: Paid + paymentType: Offline + referenceNumber: test + paymentId: 90 + total: + code: CNY + value: '1.2000' + meta: + message: SUCCESS + operationId: get-receipts-receiptId + description: Get a receipt detail + security: + - authToken: [] + x-internal: true + /receipt-lines: + get: + summary: Get all receipt lines + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + meta: + type: object + properties: + message: + type: string + pagination: + type: object + properties: + offset: + type: integer + limit: + type: integer + totalCount: + type: integer + examples: + example-1: + value: + code: 200 + data: + - id: 4 + createdAt: 1624258432 + updatedAt: 1624258432 + storeHash: byxn6vsd2k + customerId: '1' + externalId: '' + externalCustomerId: '' + receiptId: 4 + invoiceId: 26 + amount: + code: USD + value: '10.0000' + paymentStatus: 3 + paymentType: visa ending in 1111 + invoiceNumber: '00000026' + paymentId: 15 + referenceNumber: '' + transactionType: Paid + meta: + pagination: + totalCount: 1 + offset: 0 + limit: 100 + message: SUCCESS + operationId: get-receipt-lines + description: 'Get all receipt lines, with pagination data' + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/orderBy' + - $ref: '#/components/parameters/paymentStatus[]' + - $ref: '#/components/parameters/sortBy' + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - $ref: '#/components/parameters/searchBy' + - schema: + type: integer + in: query + name: invoiceId + description: The unique id of invoice + x-internal: true + '/receipts/{receiptId}/lines': + parameters: + - schema: + type: string + name: receiptId + in: path + required: true + description: The unique id of receipt + get: + summary: Get lines of a receipt + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + type: array + items: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + meta: + type: object + properties: + message: + type: string + pagination: + type: object + properties: + offset: + type: integer + limit: + type: integer + totalCount: + type: integer + examples: + example-1: + value: + code: 200 + data: + - id: 92 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 83 + invoiceId: 19 + amount: + code: CNY + value: '0.7000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000019' + paymentId: 90 + referenceNumber: test + transactionType: Paid + - id: 91 + createdAt: 1630570416 + updatedAt: 1630570416 + storeHash: 1i6zpxpe3g + customerId: '5707' + externalId: '' + externalCustomerId: '' + receiptId: 83 + invoiceId: 22 + amount: + code: CNY + value: '0.5000' + paymentStatus: 3 + paymentType: Offline + invoiceNumber: '00000022' + paymentId: 90 + referenceNumber: test + transactionType: Paid + meta: + pagination: + totalCount: 2 + offset: 0 + limit: 10 + message: SUCCESS + operationId: get-receipts-receiptId-lines + description: 'Get lines of a receipt, with pagination data' + security: + - authToken: [] + parameters: + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/orderBy' + - $ref: '#/components/parameters/paymentStatus[]' + - $ref: '#/components/parameters/sortBy' + - schema: + type: string + in: query + name: q + description: 'Keyword queries are performed on fields corresponding to the value of "searchBy" or, if "searchBy" is empty, on all fields supported by "searchBy"' + - $ref: '#/components/parameters/searchBy' + x-internal: true + '/receipt-lines/{receiptLineId}': + parameters: + - schema: + type: string + name: receiptLineId + in: path + required: true + description: The unique id of receipt line + get: + summary: Get a receipt line detail + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + data: + $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + meta: + type: object + properties: + message: + type: string + examples: + example-1: + value: + code: 200 + data: + id: 4 + createdAt: 1624258432 + updatedAt: 1624258432 + storeHash: byxn6vsd2k + customerId: '1' + externalId: '' + externalCustomerId: '' + receiptId: 4 + invoiceId: 26 + amount: + code: USD + value: '10.0000' + paymentStatus: 3 + paymentType: visa ending in 1111 + invoiceNumber: '00000026' + paymentId: 15 + referenceNumber: '' + transactionType: Paid + meta: + message: SUCCESS + operationId: get-receipts-receiptId-lines-receiptLineId + security: + - authToken: [] + description: Get a receipt line detail + x-internal: true +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/storefront.yaml b/docs/b2b-edition/specs/storefront/storefront.yaml new file mode 100644 index 000000000..54c1adcf2 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront.yaml @@ -0,0 +1,5015 @@ +openapi: '3.0.0' +info: + contact: {} + description: BigCommerce B2B Edition Headless Storefront APIs + title: Headless Storefront API + version: '1.0' +security: + - authToken: [] +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' + variables: + url: + default: DefaultParameterValue +tags: + - name: Company + - name: Catalog + - name: Users + - name: QtyManageMent + - name: dashboard + - name: Stores + - name: ShoppingList + - name: Sales Rep + - name: storeConfig + - name: order + - name: payments + - name: Integration + - name: Quotes + - name: Cart + - name: Order Products + - name: Websocket + - name: backendUser + - name: backendRole&Permission + - name: backendPermission + - name: Itegretion-Acumatica + - name: ip-Invoices + - name: ip-Payments + - name: ip-Receipts + - name: ip-Configs + - name: ip-Stores + - name: ip-pay + - name: proxy + - name: RequestForQuote + - name: Inner Sales Rep +paths: + /catalog/products/availablity: + get: + deprecated: false + description: Get available products + operationId: getavailableproducts + parameters: + - explode: true + in: query + name: productIds + required: true + schema: + example: 1 + format: int32 + type: integer + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: get available products + tags: + - Catalog + security: + - authToken: [] + x-internal: true + /catalogs/quick-order-pad: + get: + deprecated: false + description: Get products by sku quickly + operationId: quickorderpad + parameters: + - explode: true + in: query + name: 'variantSku[]' + required: true + schema: + example: sku001 + type: string + style: form + description: json style of sku list + responses: + '200': + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/response-ok' + - type: object + properties: + data: + type: object + properties: + variantSku: + type: string + productId: + type: string + variantId: + type: string + baseSku: + type: string + productName: + type: string + categories: + type: array + items: + type: number + option: + type: array + items: + type: object + minQuantity: + type: integer + maxQuantity: + type: integer + isVisible: + type: string + example: '1' + modifiers: + type: string + examples: + example-1: + value: + code: 200 + message: Success + data: + variantSku: string + productId: string + variantId: string + baseSku: string + productName: string + categories: [] + option: [] + minQuantity: 1 + maxQuantity: 5 + isVisible: string + modifiers: string + description: '' + headers: {} + '500': + $ref: '#/components/responses/500' + summary: quick order pad + tags: + - Catalog + security: + - authToken: [] + post: + deprecated: false + description: Get products quickly + operationId: quickorderpad(post) + parameters: [] + summary: quick order pad(post) + tags: + - Catalog + security: + - authToken: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + variantSkus: + type: array + items: {} + responses: + '200': + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/response-ok' + - type: object + properties: + data: + type: object + properties: + variantSku: + type: string + productId: + type: string + variantId: + type: string + baseSku: + type: string + productName: + type: string + categories: + type: array + items: + type: number + option: + type: array + items: + type: object + minQuantity: + type: integer + maxQuantity: + type: integer + isVisible: + type: string + example: '1' + modifiers: + type: string + examples: + example-1: + value: + code: 200 + message: Success + data: + variantSku: string + productId: string + variantId: string + baseSku: string + productName: string + categories: [] + option: [] + minQuantity: 0 + maxQuantity: 5 + isVisible: string + modifiers: string + description: '' + headers: {} + '500': + $ref: '#/components/responses/500' + /catalogs/quickProduct: + get: + deprecated: false + description: Get catalogs list quickly + operationId: searchVariantSku + parameters: + - description: '' + explode: true + in: query + name: variantSkus + required: true + schema: + example: variantSku|variantSku + type: string + style: form + responses: + '200': + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/response-ok' + - type: object + properties: + data: + type: object + properties: + variantSku: + type: string + productId: + type: string + variantId: + type: string + baseSku: + type: string + productName: + type: string + categories: + type: array + items: + type: number + option: + type: array + items: + type: object + price: + type: number + isVisible: + type: string + example: '1' + examples: + example-1: + value: + code: 200 + message: Success + data: + variantSku: string + productId: string + variantId: string + baseSku: string + productName: string + categories: + - 0 + option: + - {} + price: 0 + isVisible: '1' + description: '' + headers: {} + summary: searchVariantSku + tags: + - Catalog + security: + - authToken: [] + /catalogs/variants: + get: + deprecated: false + description: 'Get variants list ' + operationId: getproductvariantsinfobyproductid + parameters: + - explode: true + in: query + name: productId + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: get product variants info by product id + tags: + - Catalog + security: + - authToken: [] + /companies/addresses/countries: + get: + deprecated: false + description: Get countries list + operationId: getcountries + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get countries + tags: + - Company + /companies/addresses/permission: + get: + deprecated: false + description: Get whether there is permission to modify address(storefront) + operationId: getaddresseditpermission + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get address edit permission + tags: + - Company + /companies/existence: + get: + deprecated: false + description: Check the existence of a company + operationId: Checktheexistenceofacompany + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: companyName + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: Check the existence of a company + tags: + - Company + /companies/extra_fields/storefront: + get: + deprecated: false + description: Get company extra fields storefront + operationId: getcompanyextrafieldsstorefront + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: get company extra fields storefront + tags: + - Company + '/companies/validations/backend/user-emails/{email}': + get: + deprecated: false + description: Check if user email can be used for current company,user info and available status will be respond.(backend) + operationId: checkbackenduseremail + parameters: + - description: '可选参数, 更新的时候需要,新建的时候不需要' + explode: true + in: query + name: companyId + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: role + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + - '4' + items: + type: string + type: array + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: Check user email available + tags: + - Company + parameters: + - in: path + name: email + required: true + schema: + type: string + '/companies/validations/fronted/user-emails/{email}': + get: + deprecated: false + description: Check if user email can be used for current company,user info and available status will be respond.(fronted) + operationId: validatefronteduseremail + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + - description: 可选参数更新的时候需要 + explode: true + in: query + name: companyId + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: role + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + - '4' + items: + type: string + type: array + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: validate fronted user email + tags: + - Company + parameters: + - in: path + name: email + required: true + schema: + type: string + '/companies/{companyId}/addresses': + get: + deprecated: false + description: Get company address book by companyId + operationId: getcompanyaddresslist + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: authToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: Get company address list + tags: + - Company + parameters: + - in: path + name: companyId + required: true + schema: + type: string + post: + deprecated: false + description: create a new address of a company + operationId: createanaddress + parameters: + - description: '' + explode: true + in: query + name: lastName + required: true + schema: + type: string + style: form + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + addressLine1: + type: string + addressLine2: + type: string + city: + type: string + country: + type: string + countryName: + type: string + countryCode: + type: string + firstName: + type: string + isBilling: + description: 'boolean object should be "0" or "1"' + type: string + isDefaultBilling: + description: 'boolean object should be "0" or "1"' + type: string + isDefaultShipping: + description: 'boolean object should be "0" or "1"' + type: string + isShipping: + description: 'boolean object should be "0" or "1"' + type: string + label: + type: string + phoneNumber: + type: string + state: + type: string + stateCode: + type: string + stateName: + type: string + zipCode: + type: string + required: + - firstName + - addressLine2 + - city + - country + - state + - zipCode + - phoneNumber + - isShipping + - isBilling + - addressLine1 + - isDefaultShipping + - isDefaultBilling + - countryName + - countryCode + - stateName + - stateCode + - label + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create an address + tags: + - Company + '/companies/{companyId}/addresses/searches': + get: + deprecated: false + description: Get company address book by companyId + operationId: searchcompanyaddress + parameters: + - description: 关键字 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: search company address + tags: + - Company + parameters: + - in: path + name: companyId + required: true + schema: + type: string + post: + deprecated: false + description: Get address book by company ID and use this post because of we are creating a multiple search + operationId: getaddressbookbysearch + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + address: + type: string + city: + type: string + country: + type: string + filters: + description: filter object + type: string + firstName: + type: string + isBilling: + description: Boolean object should be '0' or '1' + type: string + isShipping: + description: Boolean object should be '0' or '1' + type: string + label: + type: string + lastName: + type: string + limit: + description: rows per page + type: string + offset: + description: state index + example: 0 + format: int32 + type: integer + phoneNumber: + type: string + q: + description: keywords of search + type: string + state: + type: string + type: + type: string + zipCode: + type: string + required: + - offset + - limit + - q + - filters + - firstName + - lastName + - address + - city + - country + - state + - zipCode + - phoneNumber + - type + - isShipping + - isBilling + - label + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: get address book by search + tags: + - Company + '/companies/{companyId}/addresses/{addressId}': + get: + deprecated: false + description: Get an address info by companyId + operationId: getanaddress + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get an address + tags: + - Company + parameters: + - in: path + name: addressId + required: true + schema: + type: string + - in: path + name: companyId + required: true + schema: + type: string + put: + deprecated: false + description: Update an address's info + operationId: updateanaddress + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + addressLine1: + type: string + addressLine2: + type: string + city: + type: string + country: + type: string + countryCode: + type: string + countryName: + type: string + firstName: + type: string + isBilling: + description: 'boolean object should be "0" or "1"' + type: string + isDefaultBilling: + description: 'boolean object should be "0" or "1"' + type: string + isDefaultShipping: + description: 'boolean object should be "0" or "1"' + type: string + isShipping: + description: 'boolean object should be "0" or "1"' + type: string + label: + type: string + lastName: + type: string + phoneNumber: + type: string + state: + type: string + stateCode: + type: string + stateName: + type: string + zipCode: + type: string + required: + - firstName + - lastName + - addressLine2 + - city + - country + - state + - zipCode + - phoneNumber + - isShipping + - isBilling + - addressLine1 + - isDefaultShipping + - isDefaultBilling + - countryName + - countryCode + - stateName + - stateCode + - label + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update an address + tags: + - Company + '/companies/{companyId}/addresses/{addressId}/activation': + parameters: + - in: path + name: companyId + required: true + schema: + type: string + - in: path + name: addressId + required: true + schema: + type: string + put: + deprecated: false + description: Mark an address as active or inactive + operationId: markanaddressasactiveorinactive + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + isActive: + description: 'boolean object should be "0" or "1"' + example: 0 + format: int32 + type: integer + required: + - isActive + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: mark an address as active or inactive + tags: + - Company + '/companies/{companyId}/default-addresses': + get: + deprecated: false + description: Get default addresses by companyId + operationId: getdefaultaddressesbycompanyId + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get default addresses by companyId + tags: + - Company + parameters: + - in: path + name: companyId + required: true + schema: + type: string + '/companies/{companyId}/users': + get: + deprecated: false + description: Get company user list by companyId + operationId: getcompanyusers + parameters: + - description: |- + "": 获取所有的users + "0": admin + "1": senior + "2": junior + "3": sales-rep + explode: true + in: query + name: role + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + items: + type: string + type: array + style: form + - description: '' + explode: true + in: query + name: offset + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + type: string + style: form + - description: 获取company users + explode: true + in: query + name: q + required: true + schema: + example: '"kobe"' + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: Get company user list + tags: + - Company + parameters: + - in: path + name: companyId + required: true + schema: + type: string + post: + deprecated: false + description: Create company user(s) + operationId: createcompanyuserinfo + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: authToken + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + companyId: + example: 123 + format: int32 + type: integer + email: + example: kobe.tian@bundleb2b.net + type: string + firstName: + example: kobe + type: string + lastName: + example: tian + type: string + phone: + example: 17316289569 + format: int64 + type: integer + userRole: + example: Admin + type: string + required: + - firstName + - lastName + - phone + - email + - userRole + - companyId + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: Create company user(s) + tags: + - Company + '/customers/{customerId}/companies': + get: + deprecated: false + description: Get company info by user id + operationId: getcompanybyuserid + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get company by user id + tags: + - Users + parameters: + - in: path + name: customerId + required: true + schema: + type: string + /emails/quotes: + post: + deprecated: false + description: Send a quote emails + operationId: sentemail + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + email: + example: '@email' + type: string + quoteId: + example: 1 + format: int32 + type: integer + quoteUrl: + description: quote detail页面的url + example: '@url' + type: string + required: + - email + - quoteId + - quoteUrl + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: sent email + tags: + - Quotes + /frontend/companies: + post: + deprecated: false + description: 'Create a company (fronted) ' + operationId: createcompany(fronted) + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + addressLine1: + type: string + addressLine2: + type: string + city: + type: string + companyEmail: + example: kobe@bu.com + type: string + companyFirstName: + example: xxxx + type: string + companyLastName: + example: xxxxx + type: string + companyName: + example: KobeTestCrop + type: string + companyPhoneNumber: + example: 17316289569 + format: int64 + type: integer + customerId: + type: string + extraFields: + type: string + fieldName: + example: str1 + type: string + fieldValue: + example: value1 + type: string + state: + type: string + storeHash: + example: storeHash + type: string + zipCode: + type: string + required: + - storeHash + - companyName + - companyPhoneNumber + - companyEmail + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - companyFirstName + - companyLastName + - customerId + - extraFields + - fieldName + - fieldValue + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create company (fronted) + tags: + - Company + /login: + post: + deprecated: false + description: Login + operationId: login + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + bcToken: + type: string + customerId: + type: string + storeHash: + type: string + required: + - bcToken + - customerId + - storeHash + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: login + tags: + - Users + /ordered-products: + get: + deprecated: false + description: Get ordered products + operationId: getorderproductlist + parameters: + - description: 搜索字段,默认不传或为空 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: 09/08/2020,默认不传或者为空 + explode: true + in: query + name: beginDateAt + required: true + schema: + example: '@date' + type: string + style: form + - description: 10/18/2020,默认不传或为空 + explode: true + in: query + name: endDateAt + required: true + schema: + example: '@date' + type: string + style: form + - description: 分页参数 + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: 分页参数 + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: 筛选条件,最小的被下单次数 + explode: true + in: query + name: minOrderedTimes + required: true + schema: + example: '@number' + type: string + style: form + - description: 筛选条件,最大的被下单次数 + explode: true + in: query + name: maxOrderedTimes + required: true + schema: + example: '@number' + type: string + style: form + - description: 筛选条件,产品的id + explode: true + in: query + name: productID + required: true + schema: + example: '@number' + type: string + style: form + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get order product list + tags: + - Order Products + /orders: + get: + deprecated: false + description: Get orders + operationId: orderlist + parameters: + - description: 09/08/2019 + explode: true + in: query + name: beginDateAt + required: true + schema: + example: '@date' + type: string + style: form + - description: 10/18/2019 + explode: true + in: query + name: endDateAt + required: true + schema: + example: '@date' + type: string + style: form + - description: dateCreated + explode: true + in: query + name: orderBy + required: true + schema: + example: + - bcOrderId + - totalIncTax + - createdAt + items: + type: string + type: array + style: form + - description: 默认DESC + explode: true + in: query + name: sortBy + required: true + schema: + example: + - DESC + - ASC + items: + type: string + type: array + style: form + - description: 0--N 1--Y 默认"0" + explode: true + in: query + name: isShowMy + required: true + schema: + example: + - '0' + - '1' + items: + type: string + type: array + style: form + - description: '' + explode: true + in: query + name: offset + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + type: string + style: form + - description: 默认为空 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: 筛选字段,默认为空 + explode: true + in: query + name: orderNumber + required: true + schema: + type: string + style: form + - description: 筛选字段,默认为空 + explode: true + in: query + name: companyName + required: true + schema: + type: string + style: form + - description: 筛选字段,默认为空 + explode: true + in: query + name: poNumber + required: true + schema: + type: string + style: form + - description: 筛选字段,默认为空 + explode: true + in: query + name: createdBy + required: true + schema: + type: string + style: form + - description: 筛选字段,默认为空 + explode: true + in: query + name: status + required: true + schema: + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: order list + tags: + - order + post: + deprecated: false + description: Create orders + operationId: createorder + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxxx + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + isSaveOrderComment: + description: 默认值为1,0表示不显示PO#,1表示显示PO# + example: 1 + format: int32 + type: integer + orderId: + type: string + poNumber: + type: string + totalIncTax: + type: string + required: + - orderId + - poNumber + - totalIncTax + - isSaveOrderComment + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create order + tags: + - order + /orders/images: + get: + deprecated: false + description: Get order's images + operationId: getordersimages + parameters: + - description: '' + explode: true + in: query + name: orderIds + required: true + schema: + example: + - '123' + - '123' + items: + type: string + type: array + style: form + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get orders images + tags: + - order + '/orders/{orderId}/details': + get: + deprecated: false + description: Get order detail by orderId + operationId: getorderdetail + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get order detail + tags: + - order + parameters: + - in: path + name: orderId + required: true + schema: + type: string + '/orders/{orderId}/products': + get: + deprecated: false + description: Get order products by orderId + operationId: getorderproduct + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get order product + tags: + - order + parameters: + - in: path + name: orderId + required: true + schema: + type: string + '/qty/cartLimit/{cartId}': + get: + deprecated: false + description: Get cart limit by carId + operationId: checkCartItemsQtyLimit + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: authToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: checkCartItemsQtyLimit + tags: + - QtyManageMent + parameters: + - in: path + name: cartId + required: true + schema: + type: string + /qty/quantity-limit-list: + get: + deprecated: false + description: 'Get quantity limit list ' + operationId: getAdvQtyList + parameters: + - description: '' + explode: true + in: query + name: variantSkus + required: true + schema: + example: sku001|sku002 + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: getAdvQtyList + tags: + - QtyManageMent + /quotes: + get: + deprecated: false + description: Get quote list + operationId: getquoteList + parameters: + - description: 分页参数,默认0 + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: 每页条数,默认10 + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: '排序字段,[''createdAt'', ''grandTotal'']' + explode: true + in: query + name: sortBy + required: true + schema: + example: createdAt + type: string + style: form + - description: 'DESC 或 ASC' + explode: true + in: query + name: orderBy + required: true + schema: + example: DESC + type: string + style: form + - description: quote的id值,默认为空 + explode: true + in: query + name: referenceNumber + required: true + schema: + example: 1 + format: int32 + type: integer + style: form + - description: 公司名称,默认为空 + explode: true + in: query + name: company + required: true + schema: + example: ABC + type: string + style: form + - description: sales rep的名字,默认为空 + explode: true + in: query + name: salesRep + required: true + schema: + example: Allen + type: string + style: form + - description: |- + quote的状态: + + [ + '0': 'new', + '1': 'sent', + '2': 'ordered', + '3': 'expired' , + '4': 'opened' + ] + sent为sales rep独有的状态值,opened为company user独有的状态值。 + explode: true + in: query + name: status + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + items: + type: string + type: array + style: form + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get quote List + tags: + - Quotes + post: + deprecated: false + description: Create quote + operationId: createaquote + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + additionalInfo: + description: TEXT + type: string + addressInfo: + description: 地址,这是一个json字段 + type: string + basePrice: + description: 产品原价 + example: 120 + format: int32 + type: integer + color: + type: string + companyId: + description: 需创建quote的company的id + example: 1 + format: int32 + type: integer + currency_location: + description: 符号位置 + example: left + type: string + currency_token: + description: 货币符号 + example: $ + type: string + decimal_places: + description: 小数保留位数 + example: 2 + format: int32 + type: integer + decimal_token: + description: 小数分隔符 + example: . + type: string + description: + description: quote的描述 + example: Test desciption + type: string + discount: + description: 报价优惠 + example: 30 + format: int32 + type: integer + expiredAt: + description: 01/01/2020 + example: '@date' + type: string + grandTotal: + description: 总计 + example: 270 + format: int32 + type: integer + imageUrl: + description: 产品图片地址 + example: '@url' + type: string + money: + description: BC返回的货币信息,不做驼峰处理,直接传一个对象 + type: string + newPrice: + description: 报价 + example: 100 + format: int32 + type: integer + options: + type: string + productId: + description: '' + example: + - '1' + - '2' + items: + type: string + type: array + productList: + type: string + productName: + description: 产品名字 + example: Test Product + type: string + quantity: + description: 数量 + example: 2 + format: int32 + type: integer + referenceNumber: + type: string + size: + type: string + sku: + description: 产品sku + example: + - sku-001 + - sku-002 + items: + type: string + type: array + status: + description: |- + "0", "1", "2", "3", "4", "5" + 0-new + 1-sent + 2-orderd + 3-expired + 4-opend + 5-draft + 6-await approve + 7-reject(不允许传7) + 默认为空的情况下 为new + example: 0 + format: int32 + type: integer + subtotal: + description: 小计 + example: 300 + format: int32 + type: integer + thousands_token: + description: 千位分隔符 + example: ',' + type: string + title: + description: quote的标题 + example: Test title + type: string + variantId: + description: 若没有则传空 + example: + - '1' + - '2' + items: + type: string + type: array + required: + - title + - description + - expiredAt + - subtotal + - discount + - grandTotal + - money + - productList + - sku + - basePrice + - newPrice + - quantity + - productId + - variantId + - imageUrl + - productName + - options + - size + - color + - referenceNumber + - companyId + - currency_location + - decimal_token + - decimal_places + - currency_token + - thousands_token + - status + - additionalInfo + - addressInfo + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create a quote + tags: + - Quotes + '/quotes/info/store-company/{companyId}': + get: + deprecated: false + description: Get store and company info by companyId + operationId: getstoreandcompanyinfo + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get store and company info + tags: + - Quotes + parameters: + - in: path + name: companyId + required: true + schema: + type: string + /quotes/products/upload: + post: + deprecated: false + description: Upload quote CSV file + operationId: uploadquoteCSVfile + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + companyId: + type: string + quoteFile: + type: string + required: + - companyId + - quoteFile + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: upload quote CSV file + tags: + - Quotes + '/quotes/{quoteId}': + delete: + deprecated: false + description: Delete a quote by quoteId + operationId: deleteaquote + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: delete a quote + tags: + - Quotes + get: + deprecated: false + description: Get quote info by quoteId + operationId: getaquote + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get a quote + tags: + - Quotes + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + put: + description: Update quote (to optimize) + operationId: Update quote + responses: + '200': + description: OK + summary: '' + '/quotes/{quoteId}/checkout': + delete: + deprecated: false + description: Delete a quote by quoteId + operationId: deletecheckoutinfo + parameters: + - description: '' + explode: true + in: query + name: authToken + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: delete checkout info + tags: + - Quotes + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Checkout a quote by quoteId + operationId: quotecheckout + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: quote checkout + tags: + - Quotes + '/quotes/{quoteId}/ordered': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + put: + deprecated: false + description: Update a quote status by quoteId + operationId: updateaquotestatus + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + orderId: + description: order_id + example: '@id' + type: string + required: + - orderId + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update a quote status + tags: + - Quotes + '/quotes/{quoteId}/pdf-export': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Export quote pdf by quoteId + operationId: quotesexportpdffile + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + currency: + type: string + required: + - currency + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: quotes export pdf file + tags: + - Quotes + /rfq: + get: + deprecated: false + description: Get quote form list. You can get current companyʼs quote form list in storefront, get all quote form list in backend. + operationId: quoteformlist + parameters: + - description: '' + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: 'createdAt, updatedAt, expiredAt' + explode: true + in: query + name: sortBy + required: true + schema: + example: createdAt + type: string + style: form + - description: 'DESC, ASC' + explode: true + in: query + name: orderBy + required: true + schema: + example: DESC + type: string + style: form + - description: '' + explode: true + in: query + name: quoteNumber + required: true + schema: + example: 1 + format: int32 + type: integer + style: form + - description: '' + explode: true + in: query + name: company + required: true + schema: + example: ABC + type: string + style: form + - description: '' + explode: true + in: query + name: salesRep + required: true + schema: + example: Allen + type: string + style: form + - description: 0 - new; 1 - open; 2 - in process; 3 - updated by customer; 4 - ordered; 5 - expired + explode: true + in: query + name: status + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + items: + type: string + type: array + style: form + - description: '' + explode: true + in: query + name: quoteTitle + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: createdBy + required: true + schema: + type: string + style: form + - description: 月/日/年格式, 10/01/2021,创建日期筛选:开始 + explode: true + in: query + name: dateCreatedBeginAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 月/日/年格式, 10/01/2021,创建日期筛选:结束 + explode: true + in: query + name: dateCreatedEndAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 月/日/年格式, 10/01/2021,更新日期筛选:开始 + explode: true + in: query + name: dateUpdatedBeginAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 月/日/年格式, 10/01/2021,更新日期筛选:结束 + explode: true + in: query + name: dateUpdatedEndAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 月/日/年格式, 10/01/2021,过期日期筛选:开始 + explode: true + in: query + name: dateExpiredBeginAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 月/日/年格式, 10/01/2021,过期日期筛选:结束 + explode: true + in: query + name: dateExpiredEndAt + required: true + schema: + example: 10/01/2021 + type: string + style: form + - description: 搜索参数 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: quote form list + tags: + - RequestForQuote + post: + deprecated: false + description: Create a quote form + operationId: createaquoteform + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + address: + description: 地址1,必填 + example: '@str' + type: string + apartment: + description: 地址2 + example: '@str' + type: string + basePrice: + description: 基础价格,必传 + example: '@float(0,100,2,2)' + type: string + city: + description: 城市 + example: '@city' + type: string + companyId: + description: 如果选择了Bundle公司,则必传 + example: 1 + format: int32 + type: integer + companyName: + example: '@name' + type: string + contactInfo: + type: string + country: + description: 国家,必填 + example: '@region' + type: string + currency: + description: 货币信息 + type: string + currencyExchangeRate: + description: 汇率 + type: string + decimalPlaces: + description: 小数保留位数 + example: 2 + format: int32 + type: integer + decimalToken: + description: 小数分隔符 + example: . + type: string + discount: + description: 优惠价格 + example: '@float(0,100,2,2)' + type: string + email: + description: 必填 + example: '@email' + type: string + expiredAt: + description: |- + 01/01/2021,按照这个格式; + 前台创建可以不传,后台必传 + example: 1/01/2021 + type: string + grandTotal: + description: 优惠后总价 + example: '@float(0,100,2,2)' + type: string + imageUrl: + description: 产品图片,没有传空 + type: string + isBackendUser: + description: 必传,0 - 前台用户,1 - 后台用户 + example: 0 + format: int32 + type: integer + legalTerms: + description: 后台用户填写,前台不填写, 非必填 + type: string + location: + description: '货币位置,right, left' + example: right + type: string + message: + description: 留言 + example: '@str' + type: string + name: + description: 必填 + example: '@name' + type: string + notes: + description: '后台用户填写,前台不填写, 非必填' + type: string + offeredPrice: + description: 折后价格,必传 + example: '@float(0,100,2,2)' + type: string + optionId: + description: 属性的id + example: 1 + format: int32 + type: integer + optionLabel: + description: '属性的标签,如small, red' + type: string + optionName: + description: '属性的类,如size,color' + type: string + optionValue: + description: 属性值 + type: string + options: + description: 产品属性,没有传空数组 + type: string + phoneNumber: + example: 0 + format: int32 + type: integer + productId: + description: 产品ID,必传 + example: 1 + format: int32 + type: integer + productList: + type: string + productName: + description: 产品名字,没有传空 + type: string + quantity: + description: 数量,必传 + example: '@int(1,100)' + type: string + quoteTitle: + description: title, 非必填, 长度不超过200 + type: string + referenceNumber: + type: string + shippingAddress: + type: string + sku: + description: 'sku, 必传' + example: '@str' + type: string + state: + description: 省份 + example: '@province' + type: string + storeHash: + example: '@str' + type: string + subtotal: + description: 总价 + example: '@float(0,100,2,2)' + type: string + thousandsToken: + description: 千位分隔符 + example: ',' + type: string + token: + description: 货币符号 + example: $ + type: string + userEmail: + description: 除guest以外,其余用户必传 + example: '@email' + type: string + variantId: + description: 'variantId, 没有传空' + example: 1 + format: int32 + type: integer + zipCode: + description: 邮编,必填 + example: '@zip' + type: string + required: + - storeHash + - isBackendUser + - userEmail + - contactInfo + - name + - email + - companyName + - phoneNumber + - companyId + - shippingAddress + - country + - state + - city + - zipCode + - address + - apartment + - expiredAt + - subtotal + - discount + - grandTotal + - currency + - token + - location + - decimalToken + - thousandsToken + - decimalPlaces + - message + - productList + - sku + - basePrice + - offeredPrice + - quantity + - productId + - variantId + - imageUrl + - productName + - options + - optionId + - optionValue + - optionLabel + - optionName + - referenceNumber + - currencyExchangeRate + - quoteTitle + - notes + - legalTerms + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create a quote form + tags: + - RequestForQuote + /rfq/configs: + get: + deprecated: false + description: Get quote config backend + operationId: quoteconfigs + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: quote configs + tags: + - RequestForQuote + /rfq/emails: + post: + deprecated: false + description: Send a quote email + operationId: quotesendemail + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + email: + example: '@email' + type: string + quoteId: + example: 1 + format: int32 + type: integer + required: + - email + - quoteId + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: quote send email + tags: + - RequestForQuote + /rfq/store-info: + get: + deprecated: false + description: 'Get store, company, and sales rep info. Mainly used for preview' + operationId: quotestoreinfo + parameters: + - description: 必传,用于获取店铺信息 + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + - description: 获取company信息,不需要就不传 + explode: true + in: query + name: companyId + required: true + schema: + type: string + style: form + - description: 获取Sales rep信息,不需要就不传,这个ID是后台用户的ID + explode: true + in: query + name: salesRepId + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: quote store info + tags: + - RequestForQuote + '/rfq/{quoteId}': + delete: + deprecated: false + description: Delete a quote by quoteId + operationId: Deletedeleteaquote + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: delete a quote + tags: + - RequestForQuote + get: + deprecated: false + description: Get a quote detail by quoteId + operationId: getaquotedetail + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + example: '@str' + type: string + style: form + - description: '' + explode: true + in: query + name: isBackendUser + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: get a quote detail + tags: + - RequestForQuote + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + put: + deprecated: false + description: |- + Update a quote. You don't need to pass all the parameters, It's broken down into several modules: message,expiredAt, referenceNumber, contactInfo, shippingAddress, quoteTitle, notes, legalTerms, productList(include products, currency, price and so on),you can pass the parameters that you want to modify. You can only modify message in storefront, but you can modify all of this in backend. Notice: company can not be modified + operationId: updateaquote + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + address: + type: string + apartment: + type: string + basePrice: + example: '@float(0,100,2,2)' + type: string + city: + type: string + companyName: + type: string + contactInfo: + type: string + country: + type: string + currency: + type: string + decimalPlaces: + example: 2 + format: int32 + type: integer + decimalToken: + example: . + type: string + discount: + example: '@float(0,100,2,2)' + type: string + email: + type: string + expiredAt: + example: 1/01/2021 + type: string + grandTotal: + example: '@float(0,100,2,2)' + type: string + imageUrl: + type: string + isBackendUser: + example: 0 + format: int32 + type: integer + legalTerms: + description: 新增字段,可单独传这一个参数开进行修改,只能后台修改 + type: string + location: + example: right + type: string + message: + example: '@str' + type: string + name: + type: string + notes: + description: 新增字段,可单独传这一个参数开进行修改,只能后台修改 + type: string + offeredPrice: + example: '@float(0,100,2,2)' + type: string + optionId: + example: 1 + format: int32 + type: integer + optionLabel: + type: string + optionName: + type: string + optionValue: + type: string + options: + type: string + phoneNumber: + type: string + productId: + example: 1 + format: int32 + type: integer + productList: + type: string + productName: + type: string + quantity: + example: '@int(1,100)' + type: string + quoteTitle: + description: 新增字段,可单独传这一个参数开进行修改 + type: string + referenceNumber: + type: string + shippingAddress: + type: string + sku: + example: '@str' + type: string + state: + type: string + storeHash: + type: string + subtotal: + example: '@float(0,100,2,2)' + type: string + thousandsToken: + example: ',' + type: string + token: + example: $ + type: string + userEmail: + example: '@email' + type: string + variantId: + example: 1 + format: int32 + type: integer + zipCode: + type: string + required: + - isBackendUser + - userEmail + - expiredAt + - subtotal + - discount + - grandTotal + - currency + - token + - location + - decimalToken + - thousandsToken + - decimalPlaces + - message + - productList + - sku + - basePrice + - offeredPrice + - quantity + - productId + - variantId + - imageUrl + - productName + - options + - optionId + - optionValue + - optionLabel + - optionName + - storeHash + - referenceNumber + - contactInfo + - shippingAddress + - name + - email + - companyName + - phoneNumber + - country + - state + - city + - zipCode + - address + - apartment + - quoteTitle + - notes + - legalTerms + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update a quote + tags: + - RequestForQuote + '/rfq/{quoteId}/checkout': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Checkout quote form by quoteId + operationId: quoteformcheckout + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + storeHash: + type: string + required: + - storeHash + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: quote form checkout + tags: + - RequestForQuote + '/rfq/{quoteId}/pdf-export': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Export quote pdf + operationId: quoteexportpdf + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + currency: + description: 用户货币切换,不需要切换则不传 + type: string + currencyExchangeRate: + description: 汇率 + type: string + isBackendUser: + type: string + storeHash: + type: string + token: + description: 货币符号 + type: string + required: + - currency + - storeHash + - token + - currencyExchangeRate + - isBackendUser + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: quote export pdf + tags: + - RequestForQuote + /products/inventory: + post: + deprecated: false + description: Get products inventory info + operationId: getproductsinventoryinfo + parameters: + - description: 必填 + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + productId: + description: 必填 + type: string + products: + type: string + quantity: + type: string + variantId: + description: 没有传空 + type: string + required: + - products + - productId + - variantId + - quantity + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: get products inventory info + tags: + - Order Products + '/rqf/{quoteId}/ordered': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Ordered a quote by quoteId + operationId: quoteordered + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + orderId: + type: string + storeHash: + type: string + required: + - orderId + - storeHash + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: quote ordered + tags: + - RequestForQuote + '/sales-reps/{customerId}/companies/masquerading': + get: + deprecated: false + description: Get current sales rep is masquerading company info + operationId: getmasqueradingcompanybysalesrep副本 + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get masquerading company by sales rep(copay) + tags: + - Sales Rep + parameters: + - in: path + name: customerId + required: true + schema: + type: string + '/sales-reps/{customerId}/companies/{companyId}/end-masq': + parameters: + - in: path + name: customerId + required: true + schema: + type: string + - in: path + name: companyId + required: true + schema: + type: string + put: + deprecated: false + description: Update status for when a super admin ends masquerade as a company by customerId and companyId + operationId: SalesRepEndmasquerade + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: authToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: Sales Rep End masquerade + tags: + - Sales Rep + '/sales-reps/{salesRepId}/companies': + get: + deprecated: false + description: Get company by salesRepId + operationId: getcompanylistbysalesRep + parameters: + - description: '' + explode: true + in: query + name: limit + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: offset + required: true + schema: + type: string + style: form + - description: '排序的字段 [ "companyName", "companyEmail" ]' + explode: true + in: query + name: orderBy + required: true + schema: + type: string + style: form + - description: 'DESC 或 ASC.' + explode: true + in: query + name: sortBy + required: true + schema: + example: DESC + type: string + style: form + - description: 关键字参数 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get company list by salesRep + tags: + - Sales Rep + parameters: + - in: path + name: salesRepId + required: true + schema: + type: string + put: + deprecated: false + description: Update a company by salesRepId + operationId: assigncompaniestosalesrep + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + companies: + type: string + companyId: + type: string + required: + - companies + - companyId + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: Assign Companies to Super Admin + tags: + - Sales Rep + '/sales-reps{customerId}/companies/{companyId}/begin-masq': + parameters: + - in: path + name: customerId + required: true + schema: + type: string + - in: path + name: companyId + required: true + schema: + type: string + put: + deprecated: false + description: Update status for when a super admin ends masquerade as a company by customerId and companyId + operationId: SalesRepbeginmasquerade + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: authToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: Sales Rep begin masquerade + tags: + - Sales Rep + /shoppinglists: + get: + deprecated: false + description: Get shopplist + operationId: getshopplistLists + parameters: + - description: '' + explode: true + in: query + name: offset + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get shopplist Lists + tags: + - ShoppingList + post: + deprecated: false + description: Create shoppinglist + operationId: createdshoppinglist + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + description: + example: '@title()' + type: string + name: + example: '@title()' + type: string + status: + description: '' + example: + - 0 + - 20 + - 30 + - 40 + items: + format: int32 + type: integer + type: array + required: + - name + - description + - status + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: created shoppinglist + tags: + - ShoppingList + put: + deprecated: false + description: Update shopplists + operationId: updateshopplists + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + description: + type: string + id: + type: string + name: + type: string + status: + description: 只能admin 和 seniorbuyer 能修改 shopplist的状态 + type: string + required: + - id + - name + - status + - description + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update shopplists + tags: + - ShoppingList + /shoppinglists/duplicate: + post: + deprecated: false + description: Duplicate a shoppinglist + operationId: duplicateashoppinglist + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + description: + example: '@title' + type: string + name: + example: '@title' + type: string + sampleShoppingListId: + example: 1 + format: int32 + type: integer + required: + - name + - description + - sampleShoppingListId + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: duplicate a shoppinglist + tags: + - ShoppingList + /shoppinglists/items: + get: + deprecated: false + description: Get shopplists items + operationId: getshoppingitems + parameters: + - description: shopplistid + explode: true + in: query + name: id + required: true + schema: + example: 123 + format: int32 + type: integer + style: form + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get shopping items + tags: + - ShoppingList + post: + deprecated: false + description: Add shopplists items + operationId: createdshopplistsitems + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + id: + description: shopplistId + type: string + items: + type: string + optionList: + description: 不是必须的 + type: string + option_id: + description: 下划线是为了直接添加到bc接口 addto cart这些 bc是下划线数据 + type: string + option_value: + type: string + productId: + description: 接口调试不过,暂时改为不必须 + type: string + qty: + type: string + variantId: + description: 如果是simple产品则和productId一样 + type: string + required: + - id + - items + - productId + - qty + - variantId + - optionList + - option_id + - option_value + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: created shopplists items + tags: + - ShoppingList + put: + deprecated: false + description: Edit shopplists items + operationId: updateshopplistsitems + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxx + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + itemId: + example: 123 + format: int32 + type: integer + optionList: + type: string + option_id: + type: string + option_value: + type: string + qty: + example: 13 + format: int32 + type: integer + shoppinglistId: + example: 123 + format: int32 + type: integer + variantId: + example: qadwad + type: string + required: + - shoppinglistId + - itemId + - variantId + - qty + - optionList + - option_id + - option_value + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update shopplists items + tags: + - ShoppingList + /shoppinglists/items-extension: + get: + deprecated: false + description: Get shopplists items extension + operationId: getshoppingitemsextension + parameters: + - description: '' + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: '' + explode: true + in: query + name: limit + required: true + schema: + example: 100 + format: int32 + type: integer + style: form + - description: shopplistid + explode: true + in: query + name: id + required: true + schema: + example: 123 + format: int32 + type: integer + style: form + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get shopping items extension + tags: + - ShoppingList + /shoppinglists/lists: + get: + deprecated: false + description: Get shoppinglist's ID and name + operationId: getshopplistsnameid + parameters: + - description: |- + 筛选参数: 不传时为筛选全部。 + 0: approved status + 2: draft status + 3: ready for approval status + explode: true + in: query + name: status + required: true + schema: + example: '@int(0, 3)' + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get shopplists name id + tags: + - ShoppingList + '/shoppinglists/{shoppingListId}': + delete: + deprecated: false + description: Delete shoppinglist + operationId: deleteshoppinglist + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: delete shoppinglist + tags: + - ShoppingList + parameters: + - in: path + name: shoppingListId + required: true + schema: + type: string + '/shoppinglists/{shoppingListId}/items/{itemId}': + delete: + deprecated: false + description: Delete shopping list item using shoppingListId and itemId + operationId: deleteshopplistitems + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: delete shopplist items + tags: + - ShoppingList + parameters: + - in: path + name: itemId + required: true + schema: + type: string + - in: path + name: shoppingListId + required: true + schema: + type: string + /store-configs/switch-status: + get: + deprecated: false + description: Get store configs switch status + operationId: getstoreconfig的switch-status + parameters: + - description: 可以根据key来获取单个的 + explode: true + in: query + name: key + required: true + schema: + type: string + style: form + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get store config's switch-status + tags: + - storeConfig + /stores/currencies: + get: + deprecated: false + description: Get store currencies + operationId: getstorecurrencies + parameters: + - description: '' + explode: true + in: query + name: storehash + required: true + schema: + example: sssw + type: string + style: form + - description: required + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: get store currencies + tags: + - Stores + /stores/order-statuses: + get: + deprecated: false + description: Get order status + operationId: GetStoreOrderStatuses + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: xxxxxxxxxxxxxxxxxxx + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: Get Store Order Statuses + tags: + - Stores + /users: + get: + deprecated: false + description: Get user list + operationId: userlist + parameters: + - description: '分页的参数,开始的id,默认值为0, 正常会传递(当前页-1)*limit, 比如,要请求第5页的数据,每页10条,那么这里应该传入(5 - 1) * 10' + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: 每页条数 + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: 搜索关键字 + explode: true + in: query + name: q + required: true + schema: + type: string + style: form + - description: |- + [ + "", + "0", + "1", + "2", + "3", + "4" + ] + explode: true + in: query + name: role + required: true + schema: + type: string + style: form + - description: 必选 + in: header + name: authToken + required: true + schema: + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: user list + tags: + - Users + post: + deprecated: false + description: Create users + operationId: createuser + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + email: + example: kobe@bu.com + type: string + firstName: + example: kobe + type: string + lastName: + example: tian + type: string + phoneNumber: + example: 17316289569 + format: int64 + type: integer + role: + type: string + required: + - firstName + - lastName + - email + - phoneNumber + - role + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: create user + tags: + - Users + /users/validations/existence: + get: + deprecated: false + description: Check if the email address already exists at the given store + operationId: Checktheexistenceofemailinthespecificstore + parameters: + - description: '' + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + - description: '' + explode: true + in: query + name: email + required: true + schema: + example: '@email' + type: string + style: form + - description: lable在请求中对应的fieldName,这可以在浏览器中对请求进行拦截查看。例如,Customer ID这个lable对应的是customerId。 + explode: true + in: query + name: extraFieldName + required: true + schema: + example: customerId + type: string + style: form + - description: '' + explode: true + in: query + name: extraFieldValue + required: true + schema: + type: string + style: form + responses: + default: + content: {} + description: '' + headers: {} + summary: Check the existence of email in the specific store + tags: + - Company + '/users/{userId}': + delete: + deprecated: false + description: 'Delete user ' + operationId: deleteuser + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: b3-accessToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: delete user + tags: + - Users + get: + deprecated: false + description: Get user infomation by userId + operationId: getUserInfo + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + example: b3-accessToken + type: string + style: simple + responses: + default: + content: {} + description: '' + headers: {} + summary: getUserInfo + tags: + - Users + parameters: + - in: path + name: userId + required: true + schema: + type: string + put: + deprecated: false + description: Update user infomation + operationId: updateuserinfo + parameters: + - description: '' + in: header + name: authToken + required: true + schema: + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + email: + type: string + firsName: + type: string + lastName: + type: string + phoneNumber: + type: string + role: + type: string + required: + - firsName + - lastName + - email + - phoneNumber + - role + type: object + required: false + responses: + default: + content: {} + description: '' + headers: {} + summary: update user info + tags: + - Users +components: + examples: {} + parameters: + companyId: + description: Unique numeric ID of company + in: path + name: companyId + required: true + schema: + example: 1 + type: integer + limit: + allowEmptyValue: true + description: 'Pagination limit default: 10' + in: query + name: limit + schema: + default: 10 + exclusiveMaximum: true + exclusiveMinimum: true + maximum: 250 + minimum: 1 + type: integer + offset: + allowEmptyValue: true + description: 'Pagination offset default: 0' + in: query + name: offset + schema: + minimum: 0 + type: integer + orderBy: + description: Order by + in: query + name: orderBy + required: false + schema: + default: DESC + enum: + - DESC + - ASC + example: ASC + type: string + orderId: + description: Unique numeric ID of order + in: path + name: orderId + required: true + schema: + example: 1 + type: integer + sortBy: + description: Sort order by desc or asc + in: query + name: sortBy + required: false + schema: + default: desc + enum: + - desc + - asc + example: desc + type: string + responses: + '404': + content: + application/json: + examples: + example-1: + value: + code: 404 + data: {} + meta: + message: Not Found Error + schema: + description: '' + properties: + code: + example: 404 + type: integer + data: + type: object + meta: + properties: + message: + description: error message of this response + example: Not Found Error + type: string + type: object + required: + - code + - data + type: object + x-examples: + example-1: + code: 404 + data: {} + meta: + message: Not Found Error + description: Resource not found error + '500': + content: + application/json: + examples: + example-1: + value: + code: 500 + data: + errMsg: Get xxx error. + message: Internal Server Error + schema: + description: Response body + type: object + properties: + code: + description: Response status code + example: 500 + type: integer + data: + description: Response data + type: object + properties: + errMsg: + type: string + example: Get xxx error. + description: error message detail + message: + type: string + description: Server Error Response message + example: Internal Server Error + description: Server Error + schemas: + address: + description: address base model + properties: + addressLine1: + description: Address line 1 of the Address Model. + example: 1600 Pennsylvania Avenue NW + maxLength: 200 + minLength: 1 + type: string + addressLine2: + description: Address line 2 of the Address Model. + example: 'Washington, DC 22202' + maxLength: 200 + minLength: 1 + type: string + city: + description: City of the Address Model. + example: Austin + maxLength: 100 + minLength: 1 + type: string + companyId: + description: The company ID of this address owner + example: 1840 + type: integer + country: + description: Country of the Address Model. + properties: + countryCode: + description: Country code of the Address Model. + example: US + maxLength: 50 + minLength: 1 + type: string + countryName: + description: Country name of the Address Model. + example: United States + maxLength: 200 + minLength: 1 + type: string + required: + - countryCode + - countryName + type: object + firstName: + description: First name of the Address Model. + example: Jane + maxLength: 100 + minLength: 1 + type: string + id: + description: Unique numeric ID of this Address. + example: 1 + format: int32 + readOnly: true + type: integer + isBilling: + type: boolean + isDefaultBilling: + type: boolean + isDefaultShipping: + type: boolean + isShipping: + type: boolean + lastName: + description: Last name of the Address Model. + example: Doe + maxLength: 100 + minLength: 1 + type: string + phoneNumber: + description: contact phone number of this address + example: '11111111111' + maxLength: 50 + minLength: 1 + type: string + state: + description: state of this address + properties: + stateCode: + description: State code of the Address Model. + example: TX + maxLength: 50 + minLength: 1 + type: string + stateName: + description: State name of the Address Model. + example: Texas + maxLength: 50 + minLength: 1 + type: string + required: + - stateCode + - stateName + type: object + zipCode: + description: zip code + example: '78751' + maxLength: 50 + minLength: 1 + type: string + required: + - addressLine1 + - addressLine2 + - city + - country + - firstName + - lastName + - isBilling + - isDefaultBilling + - isDefaultShipping + - isShipping + - phoneNumber + - state + - zipCode + - companyId + title: Address Model + type: object + x-examples: + example-1: + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + city: Austin + companyId: 1840 + country: + countryCode: US + countryName: United States + firstName: Jane + id: 1 + isBilling: true + isDefaultBilling: true + isDefaultShipping: true + isShipping: true + lastName: Doe + phoneNumber: '11111111111' + state: + stateCode: TX + stateName: Texas + zipCode: '78751' + company: + description: Company basic model + properties: + addressLine1: + description: Address line 1 of ths company. + example: 1600 Pennsylvania Avenue NW + maxLength: 200 + type: string + addressLine2: + description: Address line 2 of ths company. + example: 'Washington, DC 22202' + maxLength: 200 + type: string + bcGroupName: + description: Corresponding group name in bigcommerce. It must be unqiue. It will be same as company name or additional a random string. + example: Tesla-RandomStr + maxLength: 250 + minLength: 1 + readOnly: true + type: string + catalogId: + description: Unique numeric ID of company's catalog. + example: '1' + type: string + catalogName: + description: name of this company's catalog. + example: catalog + type: string + city: + description: City name of the company. + example: 'Detroit ' + maxLength: 100 + type: string + companyEmail: + description: Contact email of this company. + example: dev.b2b@test.net + format: email + maxLength: 200 + type: string + companyName: + description: name of this company + example: Tesla + maxLength: 200 + minLength: 1 + type: string + companyStatus: + description: The status of this company + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + example: '1' + readOnly: true + type: string + country: + description: county of the company + example: US + maxLength: 200 + type: string + createdAt: + description: create timestamp of the Company + example: 1620872672 + readOnly: true + type: integer + customerGroupId: + description: customer group ID of this company in bigcommerce. + example: '42' + readOnly: true + type: string + id: + description: Unique numeric ID of this Company. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + type: integer + phoneNumber: + description: Phone number of the company + example: '9090980' + maxLength: 50 + type: string + state: + description: State of the company. + example: State of Texas + maxLength: 50 + type: string + updatedAt: + description: update timestamp of the Company + example: 1620872672 + readOnly: true + type: integer + uuid: + description: UUID of Company + example: 095be615 + readOnly: true + type: string + zipCode: + description: Zip code of the company. + example: '100000' + maxLength: 50 + type: string + required: + - id + - createdAt + - updatedAt + - companyName + title: Company Model + type: object + x-examples: + example-1: + addressLine1: 1600 Pennsylvania Avenue NW + addressLine2: 'Washington, DC 22202' + bcGroupName: Tesla-RandomStr + catalogId: '1' + catalogName: catalog + city: 'Detroit ' + companyEmail: dev.b2b@test.net + companyName: Tesla + companyStatus: '1' + country: US + createdAt: 1620872672 + customerGroupId: '42' + id: 1 + phoneNumber: '9090980' + state: State of Texas + updatedAt: 1620872672 + uuid: 095be615 + zipCode: '100000' + company-extra: + description: company extra fields model + properties: + extraInt1: + description: extra field of this company + example: 42 + type: integer + extraInt2: + description: extra field of this company + example: 42 + type: integer + extraInt3: + description: extra field of this company + example: 42 + type: integer + extraInt4: + description: extra field of this company + example: 42 + type: integer + extraInt5: + description: extra field of this company + example: 42 + type: integer + extraStr1: + description: extra string field of this company + example: don't panic + type: string + extraStr2: + description: extra string field of this company + example: don't panic + type: string + extraStr3: + description: extra string field of this company + example: don't panic + type: string + extraStr4: + description: extra string field of this company + example: don't panic + type: string + extraStr5: + description: extra string field of this company + example: don't panic + type: string + title: Company Extra Fields Model + type: object + x-examples: + example-1: + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: don't panic + extraStr2: don't panic + extraStr3: don't panic + extraStr4: don't panic + extraStr5: don't panic + order: + description: order base model + properties: + bcOrderId: + description: Unique numeric ID of this order in bigcommerce. + example: 11 + readOnly: true + type: integer + cartId: + example: 1 + readOnly: true + type: integer + companyId: + description: Company ID field + example: 12 + format: int32 + type: integer + createdAt: + description: create timestamp of the order + example: 1574999690 + readOnly: true + type: integer + currencyCode: + description: Currency code of this order + example: USD + readOnly: true + type: string + customStatus: + description: custom status of this order.set by store manage. + example: my-completed + readOnly: true + type: string + id: + description: Unique numeric ID of this order in B2B Edition. + example: 1 + format: int32 + readOnly: true + type: integer + items: + description: total product item of this order. + example: 4 + format: int32 + readOnly: true + type: integer + money: + description: price display settings. + example: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + readOnly: true + type: string + poNumber: + description: po payment method message. + example: bj256 + type: string + status: + description: status of this order + example: completed + readOnly: true + type: string + statusCode: + description: Order status code + example: 0 + readOnly: true + type: integer + totalIncTax: + description: Total price of order which include tax + example: 10.5 + format: float + minimum: 0 + type: number + updatedAt: + description: update timestamp of the order + example: 1574999690 + readOnly: true + type: integer + usdIncTax: + description: Total price of usd with order tax. + example: 11 + format: float + readOnly: true + type: number + required: + - id + - bcOrderId + title: Order Model + type: object + x-examples: + example-1: + bcOrderId: 11 + cartId: 1 + companyId: 12 + createdAt: 1574999690 + currencyCode: USD + customStatus: my-completed + id: 1 + items: 4 + money: '{"currency_location": "left", "currency_token": "$", "decimal_token": ".", "decimal_places": 2, "thousands_token": ","}' + poNumber: bj256 + status: completed + statusCode: 0 + totalIncTax: 10.5 + updatedAt: 1574999690 + usdIncTax: 11 + order-extra: + description: Order extra fields model + properties: + extraInt1: + description: extra field of this order + example: 42 + type: integer + extraInt2: + description: extra field of this order + example: 42 + type: integer + extraInt3: + description: extra field of this order + example: 42 + type: integer + extraInt4: + description: extra field of this order + example: 42 + type: integer + extraInt5: + description: extra field of this order + example: 42 + type: integer + extraStr1: + description: extra string field of this order + example: don't panic + type: string + extraStr2: + description: extra string field of this order + example: don't panic + type: string + extraStr3: + description: extra string field of this order + example: don't panic + type: string + extraStr4: + description: extra string field of this order + example: don't panic + type: string + extraStr5: + description: extra string field of this order + example: don't panic + type: string + title: Order Extra Fields Model + type: object + x-examples: + example-1: + extraInt1: 42 + extraInt2: 42 + extraInt3: 42 + extraInt4: 42 + extraInt5: 42 + extraStr1: don't panic + extraStr2: don't panic + extraStr3: don't panic + extraStr4: don't panic + extraStr5: don't panic + order-product: + description: Order product base model + properties: + createdAt: + description: create timestamp of the order + example: 1574999690 + readOnly: true + type: integer + id: + description: Unique numeric ID of this order in B2B Edition. + example: 1 + format: int32 + readOnly: true + type: integer + options: + description: detail infomation of SKU + example: '[{"id": 715, "option_id": 41, "order_product_id": 670, "product_option_id": 121, "display_name": "Gauge", "display_value": "12", "value": "123", "type": "Multiple choice", "name": "Gauge1576218034-477", "display_style": "Dropdown"}, {"id": 716, "option_id": 42, "order_product_id": 670, "product_option_id": 122, "display_name": "Leg 1 (inches)", "display_value": "5", "value": "5", "type": "Text field", "name": "Leg-1-(inches)1576218034-477", "display_style": ""}]' + type: string + productBrandName: + description: brand name of this product + example: LGM + type: string + productName: + description: 'Name of this product ' + example: LGM Spicy Chili Crisp + type: string + quantity: + description: quantity number of product in this order + example: 10 + type: integer + updatedAt: + description: update timestamp of the order + example: 1574999690 + readOnly: true + type: integer + variantId: + description: SKU's ID + example: 12 + type: integer + variantSKU: + description: SKU name + example: 7.41 Ounce (Pack of 12) + type: string + title: Order Product Model + type: object + x-examples: + example-1: + createdAt: 1574999690 + id: 1 + options: '[{"id": 715, "option_id": 41, "order_product_id": 670, "product_option_id": 121, "display_name": "Gauge", "display_value": "12", "value": "123", "type": "Multiple choice", "name": "Gauge1576218034-477", "display_style": "Dropdown"}, {"id": 716, "option_id": 42, "order_product_id": 670, "product_option_id": 122, "display_name": "Leg 1 (inches)", "display_value": "5", "value": "5", "type": "Text field", "name": "Leg-1-(inches)1576218034-477", "display_style": ""}]' + productBrandName: LGM + productName: LGM Spicy Chili Crisp + quantity: 10 + updatedAt: 1574999690 + variantId: 12 + variantSKU: 7.41 Ounce (Pack of 12) + pagination: + description: used to response pagination information + properties: + pagination: + properties: + limit: + description: 'Pagination limit default: 10' + example: 10 + maximum: 250 + minimum: 0 + type: integer + offset: + description: 'Pagination offset default: 0' + example: 0 + minimum: 0 + type: integer + type: object + title: Pagination Model + type: object + response-ok: + description: success Response base model + title: Success Response Model + type: object + properties: + code: + description: response code of success request. + example: 200 + type: integer + message: + type: string + example: Success + description: success reponse message. + x-examples: + example-1: + code: 200 + message: Success + response-ok-pagination: + allOf: + - $ref: '#/components/schemas/response-ok' + - properties: + meta: + $ref: '#/components/schemas/pagination' + type: object + description: success response with pagination data + title: Success Response With Pagination Model + x-examples: + example-1: + code: 200 + meta: + message: SUCCESS + pagination: + limit: 10 + offset: 0 + super-admin: + description: super-admin model (sales rep) + properties: + createdAt: + description: create timestamp of the SuperAdmin + example: 1620872672 + readOnly: true + type: integer + firstName: + description: First name of the SuperAdmin + example: Tom + maxLength: 50 + minLength: 1 + type: string + id: + description: Unique numeric ID of this SuperAdmin. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + type: integer + lastName: + description: Last name of the SuperAdmin + example: Cat + maxLength: 50 + minLength: 1 + type: string + updatedAt: + description: update timestamp of the SuperAdmin + example: 1620872672 + readOnly: true + type: integer + required: + - firstName + - lastName + title: SuperAdmin Model + type: object + x-examples: + example-1: + createdAt: 1620872672 + firstName: Tom + id: 1 + lastName: Cat + updatedAt: 1620872672 + user: + description: user base model + properties: + bcId: + description: user ID in bigcommerce + example: 12 + readOnly: true + type: integer + companyId: + description: Company ID + example: 2 + readOnly: true + type: integer + createdAt: + description: create timestamp of the user + example: 1574999690 + readOnly: true + type: integer + email: + description: Email address of the user + example: user@example.com + type: string + firstName: + description: first name of the user + example: Tom + type: string + id: + description: Unique numeric ID of this User. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + example: 1 + readOnly: true + type: integer + lastName: + description: last name of the user + example: Cat + type: string + phoneNumber: + description: phone number of the user + example: '112233' + type: string + role: + description: user role (0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep) + example: 1 + type: integer + updatedAt: + description: update timestamp of the user + example: 1574999690 + readOnly: true + type: integer + uuid: + description: UUID of user + example: 095be615 + readOnly: true + type: string + required: + - id + title: User Model + type: object + x-examples: + example-1: + bcId: 12 + companyId: 2 + createdAt: 1574999690 + email: user@example.com + firstName: Tom + id: 1 + lastName: Cat + phoneNumber: '112233' + role: 1 + updatedAt: 1574999690 + uuid: 095be615 + securitySchemes: + authToken: + description: '' + in: header + name: authToken + type: apiKey diff --git a/docs/b2b-edition/specs/storefront/storefront/catalog.yaml b/docs/b2b-edition/specs/storefront/storefront/catalog.yaml new file mode 100644 index 000000000..89eeb72b7 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/catalog.yaml @@ -0,0 +1,371 @@ +openapi: 3.0.0 +info: + title: Catalog + version: '1.0' + description: The Catalog refers to a store’s collection of physical and digital products. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /catalogs/variants: + get: + summary: Get Product Variants Info + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + - sku: OTS + variantId: 65 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + description: Variant SKU name. + variantId: + type: number + description: Unique ID of this variant + required: + - sku + - variantId + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + - sku: OTS + variantId: 65 + operationId: get-catalogs-variants + description: |- + Get variants list. + <br>Equivalent Storefront GraphQL API Query: `productVariantsInfo`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground) + parameters: + - schema: + type: string + in: query + name: productId + description: Unique product ID + tags: + - Catalog + /catalogs/quick-product: + get: + summary: Search Variant SKU + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - product_id + - sku + - calculated_price + - image_url + - inventory_level + - variantSku + - productId + - variantId + - baseSku + - productName + - price + - isVisible + properties: + id: + type: number + product_id: + type: number + sku: + type: string + minLength: 1 + calculated_price: + type: number + image_url: + type: string + minLength: 1 + inventory_level: + type: number + option_values: + type: array + items: + properties: {} + variantSku: + type: string + minLength: 1 + productId: + type: string + minLength: 1 + variantId: + type: string + minLength: 1 + baseSku: + type: string + minLength: 1 + productName: + type: string + minLength: 1 + categories: + type: array + items: + properties: {} + price: + type: number + option: + type: array + items: + properties: {} + isVisible: + type: string + minLength: 1 + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + - id: 65 + product_id: 81 + sku: OTS + calculated_price: 89 + image_url: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/81/images/273/roundterrariumsmall.1554505753.386.513.jpg?c=2' + inventory_level: 999 + option_values: [] + variantSku: OTS + productId: '81' + variantId: '65' + baseSku: OTS + productName: '[Sample] Orbit Terrarium - Small' + categories: + - 23 + - 19 + price: 89 + option: [] + isVisible: '1' + examples: + example-1: + value: + code: 200 + message: Success + data: + - id: 65 + product_id: 81 + sku: OTS + calculated_price: 89 + image_url: url + inventory_level: 999 + option_values: [] + variantSku: OTS + productId: '81' + variantId: '65' + baseSku: OTS + productName: '[Sample] Orbit Terrarium - Small' + categories: + - 23 + - 19 + price: 89 + option: [] + isVisible: '1' + operationId: get-catalogs-quickProduct + parameters: + - schema: + type: string + example: sku-1|sku-2|sku-3 + in: query + name: variantSkus + description: 'Variant SKU names, split by "|".' + description: |- + Get the catalogʼs product info by requesting BigCommerceʼs API. Response info reference [on this page](https://developer.bigcommerce.com/api-reference/store-management/catalog/products/getproducts). + <br>Equivalent Storefront GraphQL API Query: `variantSku`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground) + tags: + - Catalog + parameters: [] + /catalogs/quick-order-pad: + post: + summary: Quick Order Pad + operationId: post-catalogs-quick-order-pad + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + - isStock: '1' + stock: 999 + variantSku: OTS + productId: '81' + variantId: 65 + baseSku: OTS + productName: '[Sample] Orbit Terrarium - Small' + categories: + - 23 + - 19 + option: [] + minQuantity: 0 + maxQuantity: 0 + isVisible: '1' + modifiers: [] + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + isStock: + type: string + minLength: 1 + stock: + type: number + description: Stock number + variantSku: + type: string + minLength: 1 + description: Variant SKU name + productId: + type: string + minLength: 1 + description: Unique product ID + variantId: + type: number + description: Unique variant ID + baseSku: + type: string + minLength: 1 + description: SKU name + productName: + type: string + minLength: 1 + description: Product name + categories: + type: array + items: + type: integer + option: + type: array + items: + type: object + minQuantity: + type: number + description: Order quantity minimum + maxQuantity: + type: number + description: Order quantity maximum + isVisible: + type: string + minLength: 1 + description: If product is visible. + modifiers: + type: array + items: + type: object + required: + - isStock + - stock + - variantSku + - productId + - variantId + - baseSku + - productName + - minQuantity + - maxQuantity + - isVisible + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + - isStock: '1' + stock: 999 + variantSku: OTS + productId: '81' + variantId: 65 + baseSku: OTS + productName: '[Sample] Orbit Terrarium - Small' + categories: + - 23 + - 19 + option: [] + minQuantity: 0 + maxQuantity: 0 + isVisible: '1' + modifiers: [] + description: |- + Get products quickly + <br>Equivalent Storefront GraphQL API Query: `variantSku`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground) + tags: + - Catalog + parameters: + - schema: + type: array + in: query + name: variantSkus + description: List of variant SKUs +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Catalog diff --git a/docs/b2b-edition/specs/storefront/storefront/company.yaml b/docs/b2b-edition/specs/storefront/storefront/company.yaml new file mode 100644 index 000000000..955aa646c --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/company.yaml @@ -0,0 +1,5157 @@ +openapi: 3.0.0 +info: + title: Company + version: '1.0' + description: Company refers to a collection of customers. BigCommerce B2B Edition special provided company member management and convenience of company purchasing. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /frontend/companies: + post: + deprecated: false + description: |- + Create a company on frontend. + <br>Equivalent Storefront GraphQL API Mutation: `companyCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + operationId: createcompany(fronted) + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + type: object + properties: + addressLine1: + type: string + description: Company address line + addressLine2: + type: string + description: Another company address line + city: + type: string + description: Company city + companyEmail: + example: kobe@bu.com + type: string + description: Company email + companyFirstName: + example: xxxx + type: string + description: First name of company admin manager + companyLastName: + example: xxxxx + type: string + description: Last name of company admin manager + companyName: + example: KobeTestCrop + type: string + description: Company name + companyPhoneNumber: + example: '17316289569' + format: int64 + type: string + description: Company phone number + customerId: + type: string + description: Company admin manager's customer user ID in BigCommerce + extraFields: + type: array + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + state: + type: string + description: Company state + storeHash: + example: storeHash + type: string + description: Store Hash + zipCode: + type: string + description: Company zip code + country: + type: string + description: Company country + required: + - addressLine1 + - addressLine2 + - city + - companyEmail + - companyFirstName + - companyLastName + - companyName + - companyPhoneNumber + - customerId + - state + - storeHash + - zipCode + - country + required: false + description: '' + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + companyId: + type: number + required: + - companyId + required: + - code + - message + - data + x-examples: + example-1: + code: 0 + message: string + data: + companyId: 1233 + examples: + example-1: + value: + code: 0 + message: string + data: + companyId: 1233 + summary: Create A Company + tags: + - Company + /companies/extra-fields/storefront: + get: + parameters: + - description: Store Hash + explode: true + in: query + name: storeHash + required: true + schema: + type: string + style: form + responses: + '200': + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + fieldName: + type: string + minLength: 1 + description: Field name of one extra field + labelName: + type: string + minLength: 1 + description: Label name of one extra field + dataType: + type: string + minLength: 1 + description: Type of this field + isRequired: + type: string + minLength: 1 + description: If this fields is requied + required: + - fieldName + - labelName + - dataType + - isRequired + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + description: '' + headers: {} + summary: Get Company Extra Fields + tags: + - Company + operationId: get-companies-extra_fields-storefront + description: |- + Get company extra fields. + <br>Equivalent Storefront GraphQL API Query: `companyExtraFields`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + security: + - authToken: [] + parameters: [] + '/customers/{userId}/companies': + get: + deprecated: false + description: |- + Get company info by user ID + <br>Equivalent Storefront GraphQL API Query: `userCompany`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + operationId: getcompanybyuserid + parameters: [] + responses: + '200': + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyName: levi-test + bcGroupName: levi-test + companyStatus: '1' + description: Levi-test + addressLine1: '' + addressLine2: '' + city: '' + state: '' + zipCode: '' + country: '' + companyId: '5716' + catalogId: '5' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - companyName + - bcGroupName + - companyStatus + - description + - addressLine1 + - addressLine2 + - city + - state + - zipCode + - country + - companyId + - catalogId + - extraFields + properties: + companyName: + type: string + minLength: 1 + description: Company name. + bcGroupName: + type: string + minLength: 1 + description: The group name in BigCommerce's group. which must be unique + companyStatus: + type: string + minLength: 1 + description: Company status + description: + type: string + minLength: 1 + description: A brief introduction to the company + addressLine1: + type: string + description: Company address line 1 + addressLine2: + type: string + description: Company address line 2 + city: + type: string + description: Company city + state: + type: string + description: Company state + zipCode: + type: string + description: Zip code of company city + country: + type: string + description: Company country + companyId: + type: string + minLength: 1 + description: Unique ID of this company + catalogId: + type: string + minLength: 1 + description: Prices list ID of this company + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + fieldName: + type: string + minLength: 1 + fieldValue: + type: string + required: + - fieldName + - fieldValue + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyName: company a + bcGroupName: company a + companyStatus: '1' + description: Company a + addressLine1: '' + addressLine2: '' + city: '' + state: '' + zipCode: '' + country: '' + companyId: '5716' + catalogId: '5' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + description: '' + headers: {} + summary: Get Company by User ID + tags: + - Company + security: + - authToken: [] + parameters: + - schema: + type: string + name: userId + in: path + required: true + description: B2B Edition user ID + '/companies/{companyId}/users': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique ID of this company + post: + summary: Create Company User + operationId: post-companies-companyId-users + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: number + required: + - userId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: 7838 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + userId: 7838 + description: |- + Create company user + <br>Equivalent Storefront GraphQL API Mutation: `userCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + firstName: Ada + lastName: MK + email: test@test12.com + phone: '1234567' + userRole: 3 + properties: + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + email: + type: string + minLength: 1 + description: User's email + phone: + type: string + minLength: 1 + description: User's phone number + userRole: + type: number + description: User role + required: + - firstName + - lastName + - email + - phone + - userRole + examples: + example-1: + value: + firstName: Ada + lastName: MK + email: test@test12.com + phone: '1234567' + userRole: 1 + tags: + - Company + security: + - authToken: [] + get: + summary: Get Company User List + operationId: get-companies-companyId-users + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '7837' + phoneNumber: '11111112' + role: '0' + email: test1111@test1.com + uuid: '' + createdAt: '1622444011' + updatedAt: '1622444501' + firstName: test + lastName: test + catalogId: '5' + - id: '7831' + phoneNumber: '' + role: '0' + email: levi.tuo@silksoftware.com + uuid: '' + createdAt: '1622108356' + updatedAt: '1622443883' + firstName: levi + lastName: tuo + catalogId: '5' + pagination: + totalCount: 2 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique user ID + phoneNumber: + type: string + minLength: 1 + description: Phone number of user + role: + type: string + minLength: 1 + description: Role of user + email: + type: string + minLength: 1 + description: User's email + uuid: + type: string + description: UUID of user + createdAt: + type: string + minLength: 1 + description: User create time + updatedAt: + type: string + minLength: 1 + description: User last modify time. + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name. + catalogId: + type: string + minLength: 1 + description: Prices list ID of user's company. + required: + - id + - phoneNumber + - role + - email + - uuid + - createdAt + - updatedAt + - firstName + - lastName + - catalogId + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '7837' + phoneNumber: '12345678' + role: '0' + email: admin@admin.com + uuid: '' + createdAt: '1622444011' + updatedAt: '1622444501' + firstName: test + lastName: test + catalogId: '5' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + description: |- + Query company's user list. + <br>Equivalent Storefront GraphQL API Query: `users`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + in: query + name: minLastModifiedTime + description: Mininum last modified time + - schema: + type: string + in: query + name: maxLastModifiedTime + description: Maxinum last modified time + - schema: + type: string + in: query + name: minLastCreatedTime + description: Mininum last created time + - schema: + type: string + in: query + name: maxLastCreatedTime + description: Maxinum last created time + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + enum: + - '0' + - '1' + - '2' + in: query + name: 'role[]' + description: 'User role, 0: Admin, 1:Senior Buyer, 2: Junior Buyer' + tags: + - Company + security: + - authToken: [] + '/companies/validations/fronted/user-emails/{email}': + parameters: + - schema: + type: string + name: email + in: path + required: true + description: Email address of the user + get: + summary: Validate Frontend User Email + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: levi + lastName: tuo + phoneNumber: '' + role: '0' + email: levi.tuo@silksoftware.com + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isValid + - userInfo + properties: + isValid: + type: string + minLength: 1 + description: If this email is valid + userInfo: + type: object + required: + - id + - firstName + - lastName + - phoneNumber + - role + - email + properties: + id: + type: string + minLength: 1 + description: Unique user ID + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + phoneNumber: + type: string + description: User's phone number + role: + type: string + minLength: 1 + description: User role + email: + type: string + minLength: 1 + description: User's email. + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: Ada + lastName: Brook + phoneNumber: '' + role: '0' + email: example@example.com + operationId: get-companies-validations-fronted-user-emails-email + description: |- + Check if user email can be used for current company,user info and available status will be respond.(fronted) + <br>Equivalent Storefront GraphQL API Query: `userEmailCheck`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + in: query + name: companyId + description: Company ID + - schema: + type: string + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + in: query + name: role + description: 'User role , 0: "Admin" 1: "Senior Buyer" 2: "Junior Buyer" 3: "Sales Rep" 4: "UNKNOWN"' + required: true + - schema: + type: string + in: query + name: storeHash + description: Store Hash + required: true + x-internal: false + tags: + - Company + /companies/addresses/countries: + get: + summary: Get Countries List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + list: + - id: 1 + countryName: Afghanistan + countryCode: AF + states: [] + - id: 2 + countryName: Albania + countryCode: AL + states: [] + - id: 3 + countryName: Algeria + countryCode: DZ + states: [] + - id: 4 + countryName: American Samoa + countryCode: AS + states: [] + - id: 5 + countryName: Andorra + countryCode: AD + states: [] + - id: 6 + countryName: Angola + countryCode: AO + states: [] + - id: 7 + countryName: Anguilla + countryCode: AI + states: [] + - id: 8 + countryName: Antarctica + countryCode: AQ + states: [] + - id: 9 + countryName: Antigua and Barbuda + countryCode: AG + states: [] + - id: 10 + countryName: Argentina + countryCode: AR + states: + - stateName: Ciudad Autónoma de Buenos Aires + stateCode: C + - stateName: Buenos Aires + stateCode: B + - stateName: Catamarca + stateCode: K + - stateName: Chaco + stateCode: H + - stateName: Chubut + stateCode: U + - stateName: Córdoba + stateCode: X + - stateName: Corrientes + stateCode: W + - stateName: Entre Ríos + stateCode: E + - stateName: Formosa + stateCode: P + - stateName: Jujuy + stateCode: 'Y' + - stateName: La Pampa + stateCode: L + - stateName: La Rioja + stateCode: F + - stateName: Mendoza + stateCode: M + - stateName: Misiones + stateCode: 'N' + - stateName: Neuquén + stateCode: Q + - stateName: Río Negro + stateCode: R + - stateName: Salta + stateCode: A + - stateName: San Juan + stateCode: J + - stateName: San Luis + stateCode: D + - stateName: Santa Cruz + stateCode: Z + - stateName: Santa Fe + stateCode: S + - stateName: Santiago del Estero + stateCode: G + - stateName: Tierra del Fuego + stateCode: V + - stateName: Tucumán + stateCode: T + - id: 11 + countryName: Armenia + countryCode: AM + states: [] + - id: 12 + countryName: Aruba + countryCode: AW + states: [] + - id: 13 + countryName: Australia + countryCode: AU + states: + - stateName: Australian Capital Territory + stateCode: ACT + - stateName: New South Wales + stateCode: NSW + - stateName: Northern Territory + stateCode: NT + - stateName: Queensland + stateCode: QLD + - stateName: South Australia + stateCode: SA + - stateName: Tasmania + stateCode: TAS + - stateName: Victoria + stateCode: VIC + - stateName: Western Australia + stateCode: WA + - id: 14 + countryName: Austria + countryCode: AT + states: + - stateName: Wien + stateCode: '9' + - stateName: Niederösterreich + stateCode: '3' + - stateName: Oberösterreich + stateCode: '4' + - stateName: Salzburg + stateCode: '5' + - stateName: Kärnten + stateCode: '2' + - stateName: Steiermark + stateCode: '6' + - stateName: Tirol + stateCode: '7' + - stateName: Burgenland + stateCode: '1' + - stateName: Vorarlberg + stateCode: '8' + - id: 15 + countryName: Azerbaijan + countryCode: AZ + states: [] + - id: 16 + countryName: Bahamas + countryCode: BS + states: [] + - id: 17 + countryName: Bahrain + countryCode: BH + states: [] + - id: 18 + countryName: Bangladesh + countryCode: BD + states: [] + - id: 19 + countryName: Barbados + countryCode: BB + states: [] + - id: 20 + countryName: Belarus + countryCode: BY + states: [] + - id: 21 + countryName: Belgium + countryCode: BE + states: [] + - id: 22 + countryName: Belize + countryCode: BZ + states: [] + - id: 23 + countryName: Benin + countryCode: BJ + states: [] + - id: 24 + countryName: Bermuda + countryCode: BM + states: [] + - id: 25 + countryName: Bhutan + countryCode: BT + states: [] + - id: 26 + countryName: Bolivia + countryCode: BO + states: [] + - id: 27 + countryName: Bosnia and Herzegovina + countryCode: BA + states: [] + - id: 28 + countryName: Botswana + countryCode: BW + states: [] + - id: 29 + countryName: Bouvet Island + countryCode: BV + states: [] + - id: 30 + countryName: Brazil + countryCode: BR + states: [] + - id: 31 + countryName: British Indian Ocean Territory + countryCode: IO + states: [] + - id: 32 + countryName: Brunei Darussalam + countryCode: BN + states: [] + - id: 33 + countryName: Bulgaria + countryCode: BG + states: [] + - id: 34 + countryName: Burkina Faso + countryCode: BF + states: [] + - id: 35 + countryName: Burundi + countryCode: BI + states: [] + - id: 36 + countryName: Cambodia + countryCode: KH + states: [] + - id: 37 + countryName: Cameroon + countryCode: CM + states: [] + - id: 38 + countryName: Canada + countryCode: CA + states: + - stateName: Alberta + stateCode: AB + - stateName: British Columbia + stateCode: BC + - stateName: Manitoba + stateCode: MB + - stateName: Newfoundland and Labrador + stateCode: NL + - stateName: New Brunswick + stateCode: NB + - stateName: Nova Scotia + stateCode: NS + - stateName: Northwest Territories + stateCode: NT + - stateName: Nunavut + stateCode: NU + - stateName: Ontario + stateCode: 'ON' + - stateName: Prince Edward Island + stateCode: PE + - stateName: Quebec + stateCode: QC + - stateName: Saskatchewan + stateCode: SK + - stateName: Yukon Territory + stateCode: YT + - id: 39 + countryName: Cape Verde + countryCode: CV + states: [] + - id: 40 + countryName: Cayman Islands + countryCode: KY + states: [] + - id: 41 + countryName: Central African Republic + countryCode: CF + states: [] + - id: 42 + countryName: Chad + countryCode: TD + states: [] + - id: 43 + countryName: Chile + countryCode: CL + states: [] + - id: 44 + countryName: China + countryCode: CN + states: [] + - id: 45 + countryName: Christmas Island + countryCode: CX + states: [] + - id: 46 + countryName: Cocos (Keeling) Islands + countryCode: CC + states: [] + - id: 47 + countryName: Colombia + countryCode: CO + states: [] + - id: 48 + countryName: Comoros + countryCode: KM + states: [] + - id: 49 + countryName: Congo + countryCode: CG + states: [] + - id: 50 + countryName: 'Congo, the Democratic Republic of the' + countryCode: CD + states: [] + - id: 51 + countryName: Cook Islands + countryCode: CK + states: [] + - id: 52 + countryName: Costa Rica + countryCode: CR + states: [] + - id: 54 + countryName: Croatia + countryCode: HR + states: [] + - id: 56 + countryName: Cyprus + countryCode: CY + states: [] + - id: 57 + countryName: Czech Republic + countryCode: CZ + states: [] + - id: 58 + countryName: Denmark + countryCode: DK + states: [] + - id: 59 + countryName: Djibouti + countryCode: DJ + states: [] + - id: 60 + countryName: Dominica + countryCode: DM + states: [] + - id: 61 + countryName: Dominican Republic + countryCode: DO + states: [] + - id: 62 + countryName: Ecuador + countryCode: EC + states: [] + - id: 63 + countryName: Egypt + countryCode: EG + states: [] + - id: 64 + countryName: El Salvador + countryCode: SV + states: [] + - id: 65 + countryName: Equatorial Guinea + countryCode: GQ + states: [] + - id: 66 + countryName: Eritrea + countryCode: ER + states: [] + - id: 67 + countryName: Estonia + countryCode: EE + states: [] + - id: 68 + countryName: Ethiopia + countryCode: ET + states: [] + - id: 69 + countryName: Falkland Islands (Malvinas) + countryCode: FK + states: [] + - id: 70 + countryName: Faroe Islands + countryCode: FO + states: [] + - id: 71 + countryName: Fiji + countryCode: FJ + states: [] + - id: 72 + countryName: Finland + countryCode: FI + states: [] + - id: 73 + countryName: France + countryCode: FR + states: [] + - id: 74 + countryName: French Guiana + countryCode: GF + states: [] + - id: 75 + countryName: French Polynesia + countryCode: PF + states: [] + - id: 76 + countryName: French Southern Territories + countryCode: TF + states: [] + - id: 77 + countryName: Gabon + countryCode: GA + states: [] + - id: 78 + countryName: Gambia + countryCode: GM + states: [] + - id: 79 + countryName: Georgia + countryCode: GE + states: [] + - id: 80 + countryName: Germany + countryCode: DE + states: + - stateName: Niedersachsen + stateCode: NI + - stateName: Baden-Württemberg + stateCode: BW + - stateName: Bayern + stateCode: BY + - stateName: Berlin + stateCode: BE + - stateName: Brandenburg + stateCode: BB + - stateName: Bremen + stateCode: HB + - stateName: Hamburg + stateCode: HH + - stateName: Hessen + stateCode: HE + - stateName: Mecklenburg-Vorpommern + stateCode: MV + - stateName: Nordrhein-Westfalen + stateCode: NW + - stateName: Rheinland-Pfalz + stateCode: RP + - stateName: Saarland + stateCode: SL + - stateName: Sachsen + stateCode: SN + - stateName: Sachsen-Anhalt + stateCode: ST + - stateName: Schleswig-Holstein + stateCode: SH + - stateName: Thüringen + stateCode: TH + - id: 81 + countryName: Ghana + countryCode: GH + states: [] + - id: 82 + countryName: Gibraltar + countryCode: GI + states: [] + - id: 83 + countryName: Greece + countryCode: GR + states: [] + - id: 84 + countryName: Greenland + countryCode: GL + states: [] + - id: 85 + countryName: Grenada + countryCode: GD + states: [] + - id: 86 + countryName: Guadeloupe + countryCode: GP + states: [] + - id: 87 + countryName: Guam + countryCode: GU + states: [] + - id: 88 + countryName: Guatemala + countryCode: GT + states: [] + - id: 89 + countryName: Guinea + countryCode: GN + states: [] + - id: 90 + countryName: Guinea-Bissau + countryCode: GW + states: [] + - id: 91 + countryName: Guyana + countryCode: GY + states: [] + - id: 92 + countryName: Haiti + countryCode: HT + states: [] + - id: 93 + countryName: Heard Island and Mcdonald Islands + countryCode: HM + states: [] + - id: 94 + countryName: Holy See (Vatican City State) + countryCode: VA + states: [] + - id: 95 + countryName: Honduras + countryCode: HN + states: [] + - id: 96 + countryName: Hong Kong + countryCode: HK + states: [] + - id: 97 + countryName: Hungary + countryCode: HU + states: [] + - id: 98 + countryName: Iceland + countryCode: IS + states: [] + - id: 99 + countryName: India + countryCode: IN + states: + - stateName: Andhra Pradesh + stateCode: AP + - stateName: Arunachal Pradesh + stateCode: AR + - stateName: Assam + stateCode: AS + - stateName: Bihar + stateCode: BR + - stateName: Chhattisgarh + stateCode: CT + - stateName: Goa + stateCode: GA + - stateName: Gujarat + stateCode: GJ + - stateName: Haryana + stateCode: HR + - stateName: Himachal Pradesh + stateCode: HP + - stateName: Jammu & Kashmir + stateCode: JK + - stateName: Jharkhand + stateCode: JH + - stateName: Karnataka + stateCode: KA + - stateName: Kerala + stateCode: KL + - stateName: Madhya Pradesh + stateCode: MP + - stateName: Maharashtra + stateCode: MH + - stateName: Manipur + stateCode: MN + - stateName: Meghalaya + stateCode: ML + - stateName: Mizoram + stateCode: MZ + - stateName: Nagaland + stateCode: NL + - stateName: Orissa + stateCode: OR + - stateName: Punjab + stateCode: PB + - stateName: Rajasthan + stateCode: RJ + - stateName: Sikkim + stateCode: SK + - stateName: Tamil Nadu + stateCode: TN + - stateName: Tripura + stateCode: TR + - stateName: Uttarakhand + stateCode: UT + - stateName: Uttar Pradesh + stateCode: UP + - stateName: West Bengal + stateCode: WB + - stateName: Andaman and Nicobar Islands + stateCode: AN + - stateName: Chandigarh + stateCode: CH + - stateName: Dadra and Nagar Haveli + stateCode: DN + - stateName: Daman & Diu + stateCode: DD + - stateName: Lakshadweep + stateCode: LD + - stateName: Delhi + stateCode: DL + - stateName: Pondicherry + stateCode: PY + - stateName: Telangana + stateCode: TS + - id: 100 + countryName: Indonesia + countryCode: ID + states: + - stateName: Bali + stateCode: BA + - stateName: Bangka Belitung + stateCode: BB + - stateName: Banten + stateCode: BT + - stateName: Bengkulu + stateCode: BE + - stateName: Daista Aceh + stateCode: AC + - stateName: Jakarta + stateCode: JK + - stateName: Sumatera Utara + stateCode: SU + - stateName: Sumatera Barat + stateCode: SB + - stateName: Riau + stateCode: RI + - stateName: Jambi + stateCode: JA + - stateName: Sumatera Selatan + stateCode: SS + - stateName: Lampung + stateCode: LA + - stateName: Jawa Barat + stateCode: JB + - stateName: Jawa Tengah + stateCode: JT + - stateName: Daista Yogyakarta + stateCode: YO + - stateName: Jawa Timur + stateCode: JI + - stateName: Kalimantan Barat + stateCode: KB + - stateName: Kalimantan Tengah + stateCode: KT + - stateName: Kalimantan Timur + stateCode: KI + - stateName: Kalimantan Selatan + stateCode: KS + - stateName: Nusa Tenggara Barat + stateCode: NB + - stateName: Nusa Tenggara Timur + stateCode: NT + - stateName: Sulawesi Selatan + stateCode: SN + - stateName: Sulawesi Tengah + stateCode: ST + - stateName: Sulawesi Utara + stateCode: SA + - stateName: Sulawesi Tenggara + stateCode: SG + - stateName: Maluku + stateCode: MA + - stateName: Maluku Utara + stateCode: MU + - stateName: Irian Jaya Timur + stateCode: IJ + - stateName: Irian Jaya Tengah + stateCode: IT + - stateName: Irian Jawa Barat + stateCode: IB + - stateName: Gorontalo + stateCode: GO + - id: 102 + countryName: Iraq + countryCode: IQ + states: [] + - id: 103 + countryName: Ireland + countryCode: IE + states: + - stateName: Carlow + stateCode: CW + - stateName: Cavan + stateCode: CN + - stateName: Clare + stateCode: CE + - stateName: Cork + stateCode: C + - stateName: Donegal + stateCode: DL + - stateName: Dublin + stateCode: D + - stateName: Galway + stateCode: G + - stateName: Kerry + stateCode: KY + - stateName: Kildare + stateCode: KE + - stateName: Kilkenny + stateCode: KK + - stateName: Laois + stateCode: LS + - stateName: Leitrim + stateCode: LM + - stateName: Limerick + stateCode: LK + - stateName: Longford + stateCode: LD + - stateName: Louth + stateCode: LH + - stateName: Mayo + stateCode: MO + - stateName: Meath + stateCode: MH + - stateName: Monaghan + stateCode: MN + - stateName: Offaly + stateCode: OY + - stateName: Roscommon + stateCode: RN + - stateName: Sligo + stateCode: SO + - stateName: Tipperary + stateCode: TA + - stateName: Waterford + stateCode: WD + - stateName: Westmeath + stateCode: WH + - stateName: Wexford + stateCode: WX + - stateName: Wicklow + stateCode: WW + - id: 104 + countryName: Israel + countryCode: IL + states: [] + - id: 105 + countryName: Italy + countryCode: IT + states: [] + - id: 106 + countryName: Jamaica + countryCode: JM + states: [] + - id: 107 + countryName: Japan + countryCode: JP + states: [] + - id: 108 + countryName: Jordan + countryCode: JO + states: [] + - id: 109 + countryName: Kazakhstan + countryCode: KZ + states: [] + - id: 110 + countryName: Kenya + countryCode: KE + states: [] + - id: 111 + countryName: Kiribati + countryCode: KI + states: [] + - id: 113 + countryName: 'Korea, Republic of' + countryCode: KR + states: [] + - id: 114 + countryName: Kuwait + countryCode: KW + states: [] + - id: 115 + countryName: Kyrgyzstan + countryCode: KG + states: [] + - id: 117 + countryName: Latvia + countryCode: LV + states: [] + - id: 118 + countryName: Lebanon + countryCode: LB + states: [] + - id: 119 + countryName: Lesotho + countryCode: LS + states: [] + - id: 120 + countryName: Liberia + countryCode: LR + states: [] + - id: 121 + countryName: Libya + countryCode: LY + states: [] + - id: 122 + countryName: Liechtenstein + countryCode: LI + states: [] + - id: 123 + countryName: Lithuania + countryCode: LT + states: [] + - id: 124 + countryName: Luxembourg + countryCode: LU + states: [] + - id: 125 + countryName: Macao + countryCode: MO + states: [] + - id: 126 + countryName: 'Macedonia, the Former Yugoslav Republic of' + countryCode: MK + states: [] + - id: 127 + countryName: Madagascar + countryCode: MG + states: [] + - id: 128 + countryName: Malawi + countryCode: MW + states: [] + - id: 129 + countryName: Malaysia + countryCode: MY + states: + - stateName: Johor + stateCode: '01' + - stateName: Kedah + stateCode: '02' + - stateName: Kelantan + stateCode: '03' + - stateName: Melaka + stateCode: '04' + - stateName: Negeri Sembilan + stateCode: '05' + - stateName: Pahang + stateCode: '06' + - stateName: Pulau Pinang + stateCode: '07' + - stateName: Perak + stateCode: '08' + - stateName: Perlis + stateCode: '09' + - stateName: Selangor + stateCode: '10' + - stateName: Terengganu + stateCode: '11' + - stateName: Sabah + stateCode: '12' + - stateName: Sarawak + stateCode: '13' + - stateName: Kuala Lumpur + stateCode: '14' + - stateName: Labuan + stateCode: '15' + - stateName: Putrajaya + stateCode: '16' + - id: 130 + countryName: Maldives + countryCode: MV + states: [] + - id: 131 + countryName: Mali + countryCode: ML + states: [] + - id: 132 + countryName: Malta + countryCode: MT + states: [] + - id: 133 + countryName: Marshall Islands + countryCode: MH + states: [] + - id: 134 + countryName: Martinique + countryCode: MQ + states: [] + - id: 135 + countryName: Mauritania + countryCode: MR + states: [] + - id: 136 + countryName: Mauritius + countryCode: MU + states: [] + - id: 137 + countryName: Mayotte + countryCode: YT + states: [] + - id: 138 + countryName: Mexico + countryCode: MX + states: + - stateName: Aguascalientes + stateCode: AGU + - stateName: Baja California + stateCode: BCN + - stateName: Baja California Sur + stateCode: BCS + - stateName: Campeche + stateCode: CAM + - stateName: Coahuila + stateCode: COA + - stateName: Colima + stateCode: COL + - stateName: Chiapas + stateCode: CHP + - stateName: Chihuahua + stateCode: CHH + - stateName: Durango + stateCode: DUR + - stateName: Guanajuato + stateCode: GUA + - stateName: Guerrero + stateCode: GRO + - stateName: Hidalgo + stateCode: HID + - stateName: Jalisco + stateCode: JAL + - stateName: Ciudad de México + stateCode: CMX + - stateName: México + stateCode: MEX + - stateName: Michoacán + stateCode: MIC + - stateName: Morelos + stateCode: MOR + - stateName: Nayarit + stateCode: NAY + - stateName: Nuevo León + stateCode: NLE + - stateName: Oaxaca + stateCode: OAX + - stateName: Puebla + stateCode: PUE + - stateName: Querétaro + stateCode: QUE + - stateName: Quintana Roo + stateCode: ROO + - stateName: San Luis Potosí + stateCode: SLP + - stateName: Sinaloa + stateCode: SIN + - stateName: Sonora + stateCode: SON + - stateName: Tabasco + stateCode: TAB + - stateName: Tamaulipas + stateCode: TAM + - stateName: Tlaxcala + stateCode: TLA + - stateName: Veracruz + stateCode: VER + - stateName: Yucatán + stateCode: YUC + - stateName: Zacatecas + stateCode: ZAC + - id: 139 + countryName: 'Micronesia, Federated States of' + countryCode: FM + states: [] + - id: 140 + countryName: 'Moldova, Republic of' + countryCode: MD + states: [] + - id: 141 + countryName: Monaco + countryCode: MC + states: [] + - id: 142 + countryName: Mongolia + countryCode: MN + states: [] + - id: 143 + countryName: Montserrat + countryCode: MS + states: [] + - id: 144 + countryName: Morocco + countryCode: MA + states: [] + - id: 145 + countryName: Mozambique + countryCode: MZ + states: [] + - id: 146 + countryName: Myanmar + countryCode: MM + states: + - stateName: Ayeyarwady + stateCode: '07' + - stateName: Bago + stateCode: '02' + - stateName: Chin + stateCode: '14' + - stateName: Kachin + stateCode: '11' + - stateName: Kayah + stateCode: '12' + - stateName: Kayin + stateCode: '13' + - stateName: Magway + stateCode: '03' + - stateName: Mandalay + stateCode: '04' + - stateName: Mon + stateCode: '15' + - stateName: Rakhine + stateCode: '16' + - stateName: Shan + stateCode: '17' + - stateName: Sagaing + stateCode: '01' + - stateName: Tanintharyi + stateCode: '05' + - stateName: Yangon + stateCode: '06' + - stateName: Naypyidaw Union + stateCode: '18' + - id: 147 + countryName: Namibia + countryCode: NA + states: [] + - id: 148 + countryName: Nauru + countryCode: NR + states: [] + - id: 149 + countryName: Nepal + countryCode: NP + states: [] + - id: 150 + countryName: Netherlands + countryCode: NL + states: [] + - id: 151 + countryName: Netherlands Antilles + countryCode: AN + states: [] + - id: 152 + countryName: New Caledonia + countryCode: NC + states: [] + - id: 153 + countryName: New Zealand + countryCode: NZ + states: [] + - id: 154 + countryName: Nicaragua + countryCode: NI + states: [] + - id: 155 + countryName: Niger + countryCode: NE + states: [] + - id: 156 + countryName: Nigeria + countryCode: NG + states: [] + - id: 157 + countryName: Niue + countryCode: NU + states: [] + - id: 158 + countryName: Norfolk Island + countryCode: NF + states: [] + - id: 159 + countryName: Northern Mariana Islands + countryCode: MP + states: [] + - id: 160 + countryName: Norway + countryCode: 'NO' + states: [] + - id: 161 + countryName: Oman + countryCode: OM + states: [] + - id: 162 + countryName: Pakistan + countryCode: PK + states: [] + - id: 163 + countryName: Palau + countryCode: PW + states: [] + - id: 164 + countryName: 'Palestinian Territory, Occupied' + countryCode: PS + states: [] + - id: 165 + countryName: Panama + countryCode: PA + states: [] + - id: 166 + countryName: Papua New Guinea + countryCode: PG + states: [] + - id: 167 + countryName: Paraguay + countryCode: PY + states: [] + - id: 168 + countryName: Peru + countryCode: PE + states: [] + - id: 169 + countryName: Philippines + countryCode: PH + states: [] + - id: 170 + countryName: Pitcairn + countryCode: PN + states: [] + - id: 171 + countryName: Poland + countryCode: PL + states: [] + - id: 172 + countryName: Portugal + countryCode: PT + states: [] + - id: 173 + countryName: Puerto Rico + countryCode: PR + states: [] + - id: 174 + countryName: Qatar + countryCode: QA + states: [] + - id: 175 + countryName: Reunion + countryCode: RE + states: [] + - id: 176 + countryName: Romania + countryCode: RO + states: [] + - id: 177 + countryName: Russian Federation + countryCode: RU + states: [] + - id: 178 + countryName: Rwanda + countryCode: RW + states: [] + - id: 179 + countryName: Saint Helena + countryCode: SH + states: [] + - id: 180 + countryName: Saint Kitts and Nevis + countryCode: KN + states: [] + - id: 181 + countryName: Saint Lucia + countryCode: LC + states: [] + - id: 182 + countryName: Saint Pierre and Miquelon + countryCode: PM + states: [] + - id: 183 + countryName: Saint Vincent and the Grenadines + countryCode: VC + states: [] + - id: 184 + countryName: Samoa + countryCode: WS + states: [] + - id: 185 + countryName: San Marino + countryCode: SM + states: [] + - id: 186 + countryName: Sao Tome and Principe + countryCode: ST + states: [] + - id: 187 + countryName: Saudi Arabia + countryCode: SA + states: [] + - id: 188 + countryName: Senegal + countryCode: SN + states: [] + - id: 189 + countryName: Serbia + countryCode: RS + states: [] + - id: 190 + countryName: Seychelles + countryCode: SC + states: [] + - id: 191 + countryName: Sierra Leone + countryCode: SL + states: [] + - id: 192 + countryName: Singapore + countryCode: SG + states: [] + - id: 193 + countryName: Slovakia + countryCode: SK + states: [] + - id: 194 + countryName: Slovenia + countryCode: SI + states: [] + - id: 195 + countryName: Solomon Islands + countryCode: SB + states: [] + - id: 196 + countryName: Somalia + countryCode: SO + states: [] + - id: 197 + countryName: South Africa + countryCode: ZA + states: + - stateName: Eastern Cape + stateCode: EC + - stateName: Free State + stateCode: FS + - stateName: Gauteng + stateCode: GT + - stateName: KwaZulu-Natal + stateCode: NL + - stateName: Limpopo + stateCode: LP + - stateName: Mpumalanga + stateCode: MP + - stateName: Northern Cape + stateCode: NC + - stateName: North-West + stateCode: NW + - stateName: Western Cape + stateCode: WC + - id: 198 + countryName: South Georgia and the South Sandwich Islands + countryCode: GS + states: [] + - id: 199 + countryName: Spain + countryCode: ES + states: + - stateName: A Coruña + stateCode: C + - stateName: Alava + stateCode: VI + - stateName: Albacete + stateCode: AB + - stateName: Alicante + stateCode: A + - stateName: Almeria + stateCode: AL + - stateName: Asturias + stateCode: O + - stateName: Avila + stateCode: AV + - stateName: Badajoz + stateCode: BA + - stateName: Baleares + stateCode: PM + - stateName: Barcelona + stateCode: B + - stateName: Burgos + stateCode: BU + - stateName: Caceres + stateCode: CC + - stateName: Cadiz + stateCode: CA + - stateName: Cantabria + stateCode: S + - stateName: Castellon + stateCode: CS + - stateName: Ceuta + stateCode: CE + - stateName: Ciudad Real + stateCode: CR + - stateName: Cordoba + stateCode: CO + - stateName: Cuenca + stateCode: CU + - stateName: Girona + stateCode: GI + - stateName: Granada + stateCode: GR + - stateName: Guadalajara + stateCode: GU + - stateName: Guipuzcoa + stateCode: SS + - stateName: Huelva + stateCode: H + - stateName: Huesca + stateCode: HU + - stateName: Jaen + stateCode: J + - stateName: La Rioja + stateCode: LO + - stateName: Las Palmas + stateCode: GC + - stateName: Leon + stateCode: LE + - stateName: Lleida + stateCode: L + - stateName: Lugo + stateCode: LU + - stateName: Madrid + stateCode: M + - stateName: Malaga + stateCode: MA + - stateName: Melilla + stateCode: ML + - stateName: Murcia + stateCode: MU + - stateName: Navarra + stateCode: NA + - stateName: Ourense + stateCode: OR + - stateName: Palencia + stateCode: P + - stateName: Pontevedra + stateCode: PO + - stateName: Salamanca + stateCode: SA + - stateName: Santa Cruz de Tenerife + stateCode: TF + - stateName: Segovia + stateCode: SG + - stateName: Sevilla + stateCode: SE + - stateName: Soria + stateCode: SO + - stateName: Tarragona + stateCode: T + - stateName: Teruel + stateCode: TE + - stateName: Toledo + stateCode: TO + - stateName: Valencia + stateCode: V + - stateName: Valladolid + stateCode: VA + - stateName: Vizcaya + stateCode: BI + - stateName: Zamora + stateCode: ZA + - stateName: Zaragoza + stateCode: Z + - id: 200 + countryName: Sri Lanka + countryCode: LK + states: [] + - id: 201 + countryName: Sudan + countryCode: SD + states: [] + - id: 202 + countryName: Suriname + countryCode: SR + states: [] + - id: 203 + countryName: Svalbard and Jan Mayen + countryCode: SJ + states: [] + - id: 204 + countryName: Swaziland + countryCode: SZ + states: [] + - id: 205 + countryName: Sweden + countryCode: SE + states: [] + - id: 206 + countryName: Switzerland + countryCode: CH + states: + - stateName: Aargau + stateCode: AG + - stateName: Appenzell Innerrhoden + stateCode: AI + - stateName: Appenzell Ausserrhoden + stateCode: AR + - stateName: Bern + stateCode: BE + - stateName: Basel-Landschaft + stateCode: BL + - stateName: Basel-Stadt + stateCode: BS + - stateName: Fribourg + stateCode: FR + - stateName: Geneva + stateCode: GE + - stateName: Glarus + stateCode: GL + - stateName: Graubünden + stateCode: GR + - stateName: Jura + stateCode: JU + - stateName: Luzern + stateCode: LU + - stateName: Neuchâtel + stateCode: NE + - stateName: Nidwalden + stateCode: NW + - stateName: Obwalden + stateCode: OW + - stateName: St. Gallen + stateCode: SG + - stateName: Schaffhausen + stateCode: SH + - stateName: Solothurn + stateCode: SO + - stateName: Schwyz + stateCode: SZ + - stateName: Thurgau + stateCode: TG + - stateName: Ticino + stateCode: TI + - stateName: Uri + stateCode: UR + - stateName: Vaud + stateCode: VD + - stateName: Valais + stateCode: VS + - stateName: Zug + stateCode: ZG + - stateName: Zürich + stateCode: ZH + - id: 208 + countryName: Taiwan + countryCode: TW + states: [] + - id: 209 + countryName: Tajikistan + countryCode: TJ + states: [] + - id: 210 + countryName: 'Tanzania, United Republic of' + countryCode: TZ + states: [] + - id: 211 + countryName: Thailand + countryCode: TH + states: [] + - id: 212 + countryName: Timor-Leste + countryCode: TL + states: [] + - id: 213 + countryName: Togo + countryCode: TG + states: [] + - id: 214 + countryName: Tokelau + countryCode: TK + states: [] + - id: 215 + countryName: Tonga + countryCode: TO + states: [] + - id: 216 + countryName: Trinidad and Tobago + countryCode: TT + states: [] + - id: 217 + countryName: Tunisia + countryCode: TN + states: [] + - id: 218 + countryName: Turkey + countryCode: TR + states: [] + - id: 219 + countryName: Turkmenistan + countryCode: TM + states: [] + - id: 220 + countryName: Turks and Caicos Islands + countryCode: TC + states: [] + - id: 221 + countryName: Tuvalu + countryCode: TV + states: [] + - id: 222 + countryName: Uganda + countryCode: UG + states: [] + - id: 223 + countryName: Ukraine + countryCode: UA + states: [] + - id: 224 + countryName: United Arab Emirates + countryCode: AE + states: + - stateName: Abu Dhabi + stateCode: AZ + - stateName: Ajman + stateCode: AJ + - stateName: Fujairah + stateCode: FU + - stateName: Sharjah + stateCode: SH + - stateName: Dubai + stateCode: DU + - stateName: Ras al-Khaimah + stateCode: RK + - stateName: Umm al-Quwain + stateCode: UQ + - id: 225 + countryName: United Kingdom + countryCode: GB + states: [] + - id: 226 + countryName: United States + countryCode: US + states: + - stateName: Alabama + stateCode: AL + - stateName: Alaska + stateCode: AK + - stateName: American Samoa + stateCode: AS + - stateName: Arizona + stateCode: AZ + - stateName: Arkansas + stateCode: AR + - stateName: Armed Forces Africa + stateCode: AE + - stateName: Armed Forces Americas + stateCode: AA + - stateName: Armed Forces Canada + stateCode: AE + - stateName: Armed Forces Europe + stateCode: AE + - stateName: Armed Forces Middle East + stateCode: AE + - stateName: Armed Forces Pacific + stateCode: AP + - stateName: California + stateCode: CA + - stateName: Colorado + stateCode: CO + - stateName: Connecticut + stateCode: CT + - stateName: Delaware + stateCode: DE + - stateName: District of Columbia + stateCode: DC + - stateName: Federated States Of Micronesia + stateCode: FM + - stateName: Florida + stateCode: FL + - stateName: Georgia + stateCode: GA + - stateName: Guam + stateCode: GU + - stateName: Hawaii + stateCode: HI + - stateName: Idaho + stateCode: ID + - stateName: Illinois + stateCode: IL + - stateName: Indiana + stateCode: IN + - stateName: Iowa + stateCode: IA + - stateName: Kansas + stateCode: KS + - stateName: Kentucky + stateCode: KY + - stateName: Louisiana + stateCode: LA + - stateName: Maine + stateCode: ME + - stateName: Marshall Islands + stateCode: MH + - stateName: Maryland + stateCode: MD + - stateName: Massachusetts + stateCode: MA + - stateName: Michigan + stateCode: MI + - stateName: Minnesota + stateCode: MN + - stateName: Mississippi + stateCode: MS + - stateName: Missouri + stateCode: MO + - stateName: Montana + stateCode: MT + - stateName: Nebraska + stateCode: NE + - stateName: Nevada + stateCode: NV + - stateName: New Hampshire + stateCode: NH + - stateName: New Jersey + stateCode: NJ + - stateName: New Mexico + stateCode: NM + - stateName: New York + stateCode: NY + - stateName: North Carolina + stateCode: NC + - stateName: North Dakota + stateCode: ND + - stateName: Northern Mariana Islands + stateCode: MP + - stateName: Ohio + stateCode: OH + - stateName: Oklahoma + stateCode: OK + - stateName: Oregon + stateCode: OR + - stateName: Palau + stateCode: PW + - stateName: Pennsylvania + stateCode: PA + - stateName: Puerto Rico + stateCode: PR + - stateName: Rhode Island + stateCode: RI + - stateName: South Carolina + stateCode: SC + - stateName: South Dakota + stateCode: SD + - stateName: Tennessee + stateCode: TN + - stateName: Texas + stateCode: TX + - stateName: Utah + stateCode: UT + - stateName: Vermont + stateCode: VT + - stateName: Virgin Islands + stateCode: VI + - stateName: Virginia + stateCode: VA + - stateName: Washington + stateCode: WA + - stateName: West Virginia + stateCode: WV + - stateName: Wisconsin + stateCode: WI + - stateName: Wyoming + stateCode: WY + - id: 227 + countryName: United States Minor Outlying Islands + countryCode: UM + states: [] + - id: 228 + countryName: Uruguay + countryCode: UY + states: [] + - id: 229 + countryName: Uzbekistan + countryCode: UZ + states: [] + - id: 230 + countryName: Vanuatu + countryCode: VU + states: [] + - id: 231 + countryName: Venezuela + countryCode: VE + states: [] + - id: 232 + countryName: Viet Nam + countryCode: VN + states: [] + - id: 233 + countryName: 'Virgin Islands, British' + countryCode: VG + states: [] + - id: 234 + countryName: 'Virgin Islands, U.S.' + countryCode: VI + states: [] + - id: 235 + countryName: Wallis and Futuna + countryCode: WF + states: [] + - id: 236 + countryName: Western Sahara + countryCode: EH + states: [] + - id: 237 + countryName: Yemen + countryCode: YE + states: [] + - id: 238 + countryName: Zambia + countryCode: ZM + states: [] + - id: 239 + countryName: Zimbabwe + countryCode: ZW + states: [] + - id: 240 + countryName: Isle of Man + countryCode: IM + states: [] + - id: 241 + countryName: Jersey + countryCode: JE + states: [] + - id: 242 + countryName: Guernsey + countryCode: GG + states: [] + - id: 243 + countryName: Lao People's Democratic Republic + countryCode: LA + states: [] + - id: 245 + countryName: Montenegro + countryCode: ME + states: [] + - id: 246 + countryName: Cote d'Ivoire + countryCode: CI + states: [] + - id: 247 + countryName: 'Bonaire, Sint Eustatius and Saba' + countryCode: BQ + states: [] + - id: 248 + countryName: Republic of Kosovo + countryCode: XK + states: [] + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + countryName: + type: string + minLength: 1 + description: Country name + countryCode: + type: string + minLength: 1 + description: A simple code of country. + states: + type: array + description: States of this country + items: + type: object + required: + - id + - countryName + - countryCode + required: + - code + - message + - data + examples: + example-1: + value: + code: 0 + message: string + data: + list: + - id: 1 + countryName: Albania + countryCode: AL + states: [] + operationId: get-companies-addresses-countries + description: |- + Get countries list. + <br>Equivalent Storefront GraphQL API Query: `countries`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + in: query + name: storeHash + description: Store hash + tags: + - Company + /companies/addresses/permission: + get: + summary: Get Address Edit Permission + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + isAllow: '1' + isEnabled: '1' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isAllow + - isEnabled + properties: + isAllow: + type: string + minLength: 1 + description: If permission is allowed + isEnabled: + type: string + minLength: 1 + description: If enabled + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + isAllow: '1' + isEnabled: '1' + operationId: get-companies-addresses-permission + description: |- + Get whether there is the permission to modify addresses(storefront). + <br>Equivalent Storefront GraphQL API Query: `addressConfig`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + '/companies/validations/backend/user-emails/{email}': + parameters: + - schema: + type: string + name: email + in: path + required: true + description: User's email + get: + summary: Check User Email Availability + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: levi + lastName: tuo + phoneNumber: '' + role: '0' + email: levi.tuo@silksoftware.com + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - isValid + - userInfo + properties: + isValid: + type: string + minLength: 1 + description: Is vaild of this email + userInfo: + type: object + required: + - id + - firstName + - lastName + - phoneNumber + - role + - email + properties: + id: + type: string + minLength: 1 + description: Unique user ID + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + phoneNumber: + type: string + description: User's phone number + role: + type: string + minLength: 1 + description: User role + email: + type: string + minLength: 1 + description: User's email + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + isValid: '0' + userInfo: + id: '7831' + firstName: Ada + lastName: Brook + phoneNumber: '' + role: '0' + email: example@example.com + operationId: get-companies-validations-backend-user-emails-email + parameters: + - schema: + type: string + in: query + name: companyId + description: Company ID + - schema: + type: string + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + in: query + name: role + description: 'User role, 0: "Admin" 1: "Senior Buyer" 2: "Junior Buyer" 3: "Sales Rep" 4: "UNKNOWN"' + required: true + description: Check if a user email can be used for a company; user info and available status will be in the reponse(backend) + tags: + - Company + x-internal: true + '/companies/{companyId}/addresses': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID + get: + summary: Get Company Address List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + addresses: + '1410': + addressId: 1410 + firstName: Ada + lastName: Bo + isShipping: 1 + isBilling: 1 + addressLine1: address 1 + addressLine2: address 2 + city: New York + country: + countryName: United States + countryCode: US + zipCode: '10013' + state: + stateName: New York + stateCode: NY + phoneNumber: '17161017095' + label: labels + defaultShippingId: '1410' + defaultBillingId: '1410' + canEnterNewAddress: false + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - addresses + - defaultShippingId + - defaultBillingId + - canEnterNewAddress + properties: + addresses: + type: object + required: + - addressId + properties: + addressId: + description: Key is a string of address ID + allOf: + - type: object + properties: + addressId: + type: number + description: Unique address ID + firstName: + type: string + minLength: 1 + description: Address first name + lastName: + type: string + minLength: 1 + description: Address last name + isShipping: + type: number + description: Is this address use for shipping + isBilling: + type: number + description: If this address use for billing. + addressLine1: + type: string + minLength: 1 + description: One address line + addressLine2: + type: string + minLength: 1 + description: Another address line + city: + type: string + minLength: 1 + description: Address city + country: + type: object + description: Address country info + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + description: Zipcode of address city + state: + type: object + description: Address state info + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + description: Address phone number + label: + type: string + minLength: 1 + description: Label of this address + required: + - addressId + - firstName + - lastName + - isShipping + - isBilling + - addressLine1 + - addressLine2 + - city + - country + - zipCode + - state + - phoneNumber + - label + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + defaultShippingId: + type: string + minLength: 1 + description: Company's default shipping address ID + defaultBillingId: + type: string + minLength: 1 + description: Company's default billing address ID + canEnterNewAddress: + type: boolean + description: If users can enter a new address + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + addresses: + addressId: + addressId: 1410 + firstName: Ada + lastName: Bo + isShipping: 1 + isBilling: 1 + addressLine1: address 1 + addressLine2: address 2 + city: New York + country: + countryName: United States + countryCode: US + zipCode: '10013' + state: + stateName: New York + stateCode: NY + phoneNumber: '17161017095' + label: labels + defaultShippingId: '1410' + defaultBillingId: '1410' + canEnterNewAddress: false + operationId: get-companies-companyId-addresses + description: |- + Get company address book by companyId. + <br>Equivalent Storefront GraphQL API Query: `addresses`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + post: + summary: Create an Address of a Company + operationId: post-companies-companyId-addresses + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + allOf: + - type: object + properties: + addressLine1: + type: string + description: One address line + addressLine2: + type: string + description: Another one address line + city: + type: string + description: Address city + country: + type: object + description: Address country info + required: + - countryName + - countryCode + properties: + countryName: + type: string + countryCode: + type: string + firstName: + type: string + description: Address first name + isBilling: + description: Boolean object should be '0' or '1' + type: string + isDefaultBilling: + description: Boolean object should be '0' or '1' + type: string + isDefaultShipping: + description: Boolean object should be '0' or '1' + type: string + isShipping: + description: Boolean object should be '0' or '1' + type: string + label: + type: string + phoneNumber: + type: string + description: Address phone number + state: + type: object + description: Address state info + properties: + stateName: + type: string + stateCode: + type: string + zipCode: + type: string + description: Zipcode of address city + required: + - addressLine1 + - city + - country + - firstName + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-1: + value: + label: label + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + city: AS + zipCode: '10013' + phoneNumber: '16732680944' + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + required: false + description: '' + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1415' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1415' + description: |- + Create a new address of a company. + <br>Equivalent Storefront GraphQL API Mutation: `addressCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + '/companies/{companyId}/addresses/searches': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID + get: + summary: Search Company Address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + addressBookStatus: '1' + defaultAddress: + companyId: '5716' + companyName: levi-test + companyAddress: '' + companyCountry: '' + companyCountryCode: '' + companyState: '' + companyStateCode: '' + companyCity: '' + companyZipCode: '' + firstName: '' + lastName: '' + phoneNumber: '17195453626' + label: '' + list: + - companyId: '5716' + companyName: levi-test + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '16732680944' + label: label + - companyId: '5716' + companyName: levi-test + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '16732680944' + label: label + - companyId: '5716' + companyName: levi-test + companyAddress: address 1 address 2 + companyCountry: United States + companyCountryCode: US + companyState: Ohio + companyStateCode: OH + companyCity: New York + companyZipCode: '10013' + firstName: Ada + lastName: Bo + phoneNumber: '17161017095' + label: labels + pagination: + totalCount: 3 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - addressBookStatus + - defaultAddress + - list + - pagination + properties: + addressBookStatus: + type: string + minLength: 1 + defaultAddress: + type: object + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - firstName + - lastName + - phoneNumber + - label + description: Company default address info + properties: + companyId: + type: string + minLength: 1 + description: Unique company ID + companyName: + type: string + minLength: 1 + description: Company name + companyAddress: + type: string + description: Company address + companyCountry: + type: string + description: Company contry + companyCountryCode: + type: string + description: Company country code + companyState: + type: string + description: Company state + companyStateCode: + type: string + companyCity: + type: string + description: Company city + companyZipCode: + type: string + firstName: + type: string + description: Company admin user's first name + lastName: + type: string + phoneNumber: + type: string + minLength: 1 + label: + type: string + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyCountryCode: + type: string + minLength: 1 + companyState: + type: string + minLength: 1 + companyStateCode: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + label: + type: string + minLength: 1 + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - firstName + - lastName + - phoneNumber + - label + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + addressBookStatus: '1' + defaultAddress: + companyId: '5716' + companyName: company name + companyAddress: '' + companyCountry: '' + companyCountryCode: '' + companyState: '' + companyStateCode: '' + companyCity: '' + companyZipCode: '' + firstName: '' + lastName: '' + phoneNumber: '123456789' + label: '' + list: + - companyId: '5716' + companyName: company name + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '123456789' + label: label + pagination: + totalCount: 3 + offset: 0 + limit: 10 + operationId: get-companies-companyId-addresses-searches + description: |- + Get company address book by companyId. + <br>Equivalent Storefront GraphQL API Query: `addresses`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + required: true + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + required: true + - schema: + type: string + in: query + name: q + description: Query string + tags: + - Company + post: + summary: Search Address with Multiple Filter + operationId: post-companies-companyId-addresses-searches + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + list: + - addressId: '1410' + firstName: Ada + lastName: Bo + addressLine1: address 1 + addressLine2: address 2 + city: New York + state: + stateName: Ohio + stateCode: OH + country: + countryName: United States + countryCode: US + phoneNumber: '17161017095' + zipCode: '10013' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '0' + isDefaultBilling: '0' + label: labels + defaultAddressIds: + shippingAddressId: '1415' + billingAddressId: '1415' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - pagination + - list + - defaultAddressIds + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + list: + type: array + uniqueItems: true + minItems: 1 + items: + allOf: + - type: object + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + state: + type: object + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + required: + - stateName + - stateCode + country: + type: object + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + required: + - countryName + - countryCode + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + label: + type: string + minLength: 1 + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - phoneNumber + - zipCode + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - label + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + defaultAddressIds: + type: object + required: + - shippingAddressId + - billingAddressId + properties: + shippingAddressId: + type: string + minLength: 1 + billingAddressId: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + pagination: + totalCount: 1 + offset: 0 + limit: 10 + list: + - addressId: '1410' + firstName: Ada + lastName: Bo + addressLine1: address 1 + addressLine2: address 2 + city: New York + state: + stateName: Ohio + stateCode: OH + country: + countryName: United States + countryCode: US + phoneNumber: '17161017095' + zipCode: '10013' + isShipping: '1' + isBilling: '1' + isDefaultShipping: '0' + isDefaultBilling: '0' + label: labels + defaultAddressIds: + shippingAddressId: '1415' + billingAddressId: '1415' + description: |- + Get address book by company ID and use this post because of we are creating a multiple search. + <br>Equivalent Storefront GraphQL API Query: `addresses`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + filters: + firstName: Ado + lastName: Bob + address: address + city: city + country: '' + state: '' + zipCode: '' + phoneNumber: '' + label: '' + addressType: + isBilling: '' + isShipping: '' + offset: 0 + limit: 10 + q: '' + properties: + filters: + type: object + properties: + firstName: + type: string + minLength: 1 + description: Address first name + lastName: + type: string + minLength: 1 + description: Address last name + address: + type: string + minLength: 1 + city: + type: string + minLength: 1 + description: Address city + country: + type: string + description: Address country + state: + type: string + description: Address state + zipCode: + type: string + description: Address zip code + phoneNumber: + type: string + description: Address phone number + label: + type: string + addressType: + type: object + properties: + isBilling: + type: string + description: Boolean object should be '0' or '1' + isShipping: + type: string + description: Boolean object should be '0' or '1' + offset: + type: number + description: Pagination offset + limit: + type: number + description: Pagination limit + q: + type: string + description: Query string + examples: {} + tags: + - Company + '/companies/{companyId}/addresses/{addressId}': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID + - schema: + type: string + name: addressId + in: path + required: true + description: Unique address ID + get: + summary: Get an Address + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 0 + message: string + data: + label: string + firstName: string + lastName: string + addressLine1: string + addressLine2: string + city: string + zipCode: string + phoneNumber: string + country: + countryName: string + countryCode: string + state: + stateName: string + stateCode: string + isShipping: string + isBilling: string + isDefaultShipping: string + isDefaultBilling: string + addressId: string + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + allOf: + - type: object + properties: + label: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + addressId: + type: string + minLength: 1 + required: + - label + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - zipCode + - phoneNumber + - country + - state + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - addressId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + required: + - code + - message + - data + examples: + example-1: + value: + code: 0 + message: string + data: + label: string + firstName: string + lastName: string + addressLine1: string + addressLine2: string + city: string + zipCode: string + phoneNumber: string + country: + countryName: string + countryCode: string + state: + stateName: string + stateCode: string + isShipping: string + isBilling: string + isDefaultShipping: string + isDefaultBilling: string + addressId: string + operationId: get-companies-companyId-addresses-addressId + description: |- + Get an address info by companyId. + <br>Equivalent Storefront GraphQL API Query: `address`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + put: + summary: Update an address's info + operationId: put-companies-companyId-addresses-addressId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1415' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1415' + description: |- + Update an address's info. + <br>Equivalent Storefront GraphQL API Mutation: `addressUpdate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + x-examples: + example-1: + label: string + firstName: string + lastName: string + addressLine1: string + addressLine2: string + city: string + zipCode: string + phoneNumber: string + country: + countryName: string + countryCode: string + state: + stateName: string + stateCode: string + isShipping: string + isBilling: string + isDefaultShipping: string + isDefaultBilling: string + addressId: string + allOf: + - type: object + properties: + label: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + addressId: + type: string + minLength: 1 + required: + - label + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - zipCode + - phoneNumber + - country + - state + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - addressId + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + examples: + example-2: + value: + label: string + firstName: string + lastName: string + addressLine1: string + addressLine2: string + city: string + zipCode: string + phoneNumber: string + country: + countryName: string + countryCode: string + state: + stateName: string + stateCode: string + isShipping: string + isBilling: string + isDefaultShipping: string + isDefaultBilling: string + addressId: string + application/xml: + schema: + description: '' + type: object + properties: + label: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + country: + type: object + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + required: + - countryName + - countryCode + state: + type: object + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + required: + - stateName + - stateCode + isShipping: + type: string + minLength: 1 + isBilling: + type: string + minLength: 1 + isDefaultShipping: + type: string + minLength: 1 + isDefaultBilling: + type: string + minLength: 1 + addressId: + type: string + minLength: 1 + required: + - label + - firstName + - lastName + - addressLine1 + - addressLine2 + - city + - zipCode + - phoneNumber + - country + - state + - isShipping + - isBilling + - isDefaultShipping + - isDefaultBilling + - addressId + x-examples: + example-1: + label: label + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line2 + city: AS + zipCode: '10013' + phoneNumber: '16732680944' + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + isShipping: '1' + isBilling: '1' + isDefaultShipping: '1' + isDefaultBilling: '1' + addressId: '1415' + description: '' + tags: + - Company + '/companies/{companyId}/addresses/{addressId}/activation': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID + - schema: + type: string + name: addressId + in: path + required: true + description: Unique address ID + put: + summary: Mark an Address as Active or Inactive + operationId: put-companies-companyId-addresses-addressId-activation + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + addressId: + type: string + minLength: 1 + required: + - addressId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + addressId: '1415' + examples: + example-1: + value: + code: 200 + message: Success + data: + addressId: '1415' + description: |- + Mark an address as active or inactive. + <br>Equivalent Storefront GraphQL API Mutation: `addressDelete`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + security: + - authToken: [] + '/companies/{companyId}/default-addresses': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID + get: + summary: Get Company Default Addresses + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + shipping: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + billing: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - shipping + - billing + properties: + shipping: + description: Company default shipping address + allOf: + - type: object + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + city: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + label: + type: string + minLength: 1 + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - country + - state + - city + - phoneNumber + - zipCode + - label + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + billing: + description: Company default billing address + allOf: + - type: object + properties: + addressId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + addressLine1: + type: string + minLength: 1 + addressLine2: + type: string + minLength: 1 + country: + type: object + required: + - countryName + - countryCode + properties: + countryName: + type: string + minLength: 1 + countryCode: + type: string + minLength: 1 + state: + type: object + required: + - stateName + - stateCode + properties: + stateName: + type: string + minLength: 1 + stateCode: + type: string + minLength: 1 + city: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + label: + type: string + minLength: 1 + required: + - addressId + - firstName + - lastName + - addressLine1 + - addressLine2 + - country + - state + - city + - phoneNumber + - zipCode + - label + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + shipping: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + billing: + addressId: '1414' + firstName: Ada + lastName: Bob + addressLine1: line1 + addressLine2: line1 + country: + countryName: Argentina + countryCode: AR + state: + stateName: Mendoza + stateCode: M + city: AS + phoneNumber: '16732680944' + zipCode: '10013' + label: label + operationId: get-companies-companyId-default-addresses + description: |- + Get default addresses by companyId. + <br>Equivalent Storefront GraphQL API Query: `defaultBillingAddress` and `defaultShippingAddress`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Company + /users/validations/existence: + get: + summary: Check Existence of Customer Email + responses: {} + operationId: get-users-validations-existence + description: |- + > This endpoint is deprecated. + + Validate extra fields. + parameters: + - schema: + type: string + in: query + name: email + description: Email address + required: true + - schema: + type: string + in: query + name: storeHash + description: Store Hash + required: true + - schema: + type: string + in: query + name: extraFieldName + description: Extra field name + - schema: + type: string + in: query + name: extraFieldValue + description: Extra field value + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 40010 + message: User does not exist + data: {} + examples: + User does not exist: + value: + code: 40010 + message: User does not exist + data: {} + example-1: + value: + code: 200 + message: SUCCESS + data: {} + tags: + - User + /users: + get: + summary: Get User List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: '248' + firstName: dfaf + lastName: hgfsh + role: '1' + createdAt: '1579243388' + updatedAt: '1607322439' + email: 10124517120@qq.com + phoneNumber: '13355229191' + - id: '7350' + firstName: dong + lastName: jiajia + role: '1' + createdAt: '1603769010' + updatedAt: '1603769014' + email: 114984728@qq.com + phoneNumber: '7380889' + - id: '7694' + firstName: first name + lastName: Senior + role: '1' + createdAt: '1611903780' + updatedAt: '1613627700' + email: 1205302301@qq.com + phoneNumber: '17313208859' + - id: '7767' + firstName: kiki + lastName: test + role: '1' + createdAt: '1618540469' + updatedAt: '1618907920' + email: 1248044068@qq.com + phoneNumber: '' + - id: '239' + firstName: judy + lastName: senior + role: '1' + createdAt: '1578985798' + updatedAt: '1587696013' + email: 18349267630@163.com + phoneNumber: '18333333333' + - id: '218' + firstName: kobe + lastName: tian + role: '1' + createdAt: '1576220007' + updatedAt: '1576220065' + email: aa@aa1111.com + phoneNumber: '' + - id: '404' + firstName: leo + lastName: test + role: '1' + createdAt: '1586247815' + updatedAt: '1586999453' + email: aa@bbc.om + phoneNumber: '11111111111' + - id: '406' + firstName: abc + lastName: cde + role: '1' + createdAt: '1586247815' + updatedAt: '1586999453' + email: adsfadsf@adgsasdg.cn + phoneNumber: '1111111177' + - id: '7117' + firstName: adsad + lastName: qeqeqwe + role: '1' + createdAt: '1594282232' + updatedAt: '1596796306' + email: allen.chen10333sss@bundleb2b.net + phoneNumber: '' + - id: '7109' + firstName: test + lastName: test + role: '1' + createdAt: '1594019538' + updatedAt: '1596796306' + email: allen.chen10test11@bundleb2b.net + phoneNumber: '13458609282' + pagination: + totalCount: 176 + offset: '0' + limit: '10' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: string + minLength: 1 + description: Unique customer user ID + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + role: + type: string + minLength: 1 + description: User role + createdAt: + type: string + minLength: 1 + description: User create time + updatedAt: + type: string + minLength: 1 + description: User last modifly time + email: + type: string + minLength: 1 + description: User email + phoneNumber: + type: string + minLength: 1 + description: User phone number + required: + - id + - firstName + - lastName + - role + - createdAt + - updatedAt + - email + - phoneNumber + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: string + minLength: 1 + limit: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: '1' + firstName: Ado + lastName: Bob + role: '1' + createdAt: '1594019538' + updatedAt: '1596796306' + email: example@example.com + phoneNumber: '123456789' + pagination: + totalCount: 1 + offset: '0' + limit: '10' + operationId: get-users + parameters: + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + enum: + - '0' + - '1' + - '2' + - '3' + - '4' + in: query + description: 'User role, "":"ALL", "0":"Admin", "1":"Senior Buyer",“2”: "Junior Buyer","3": "Sales Rep","4": "UNKNOWN"' + name: role + required: true + description: |- + Get user list. + <br>Equivalent Storefront GraphQL API Query: `users`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - User + post: + summary: Create a User + operationId: post-users + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + userId: + type: string + minLength: 1 + bcId: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + email: + type: string + minLength: 1 + role: + type: string + minLength: 1 + required: + - userId + - bcId + - firstName + - lastName + - email + - role + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + userId: '7843' + bcId: '8230' + firstName: Jo + lastName: Sweet + email: Jo.Sweet@example.com + role: '0' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + userId: '7843' + bcId: '8230' + firstName: Jo + lastName: Sweet + email: Jo.Sweet@example.com + role: '0' + description: |- + Create a user. + <br>Equivalent Storefront GraphQL API Mutation: `userCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companyId: '5716' + firstName: Jo + lastName: Sweet + email: Jo.Sweet@example.com + phoneNumber: '' + role: '0' + properties: + companyId: + type: string + minLength: 1 + description: Unique company ID + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + email: + type: string + minLength: 1 + description: User's email + phoneNumber: + type: string + description: User's phone number + role: + type: string + minLength: 1 + description: '"0":"Admin", "1":"Senior Buyer",“2”: "Junior Buyer"' + enum: + - '0' + - '1' + - '2' + required: + - companyId + - firstName + - lastName + - email + - phoneNumber + - role + tags: + - User + '/users/{userId}': + parameters: + - schema: + type: string + name: userId + in: path + required: true + description: user ID or BigCommerce customer ID + get: + summary: Get User Information + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + roleId: '0' + userId: '7843' + firstName: Jo + lastName: Sweet + phoneNumber: '' + email: Jo.Sweet@example.com + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - roleId + - userId + - firstName + - lastName + - phoneNumber + - email + properties: + roleId: + type: string + minLength: 1 + description: Role id + userId: + type: string + minLength: 1 + description: Unique user ID + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + phoneNumber: + type: string + description: User's phone number + email: + type: string + minLength: 1 + description: User's email + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + roleId: '0' + userId: '7843' + firstName: Jo + lastName: Sweet + phoneNumber: '' + email: Jo.Sweet@example.com + operationId: get-users-userId + description: |- + Get user infomation by userId. + <br>Equivalent Storefront GraphQL API Query: `user`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - User + parameters: + - schema: + type: string + in: query + name: isBcId + description: 'whether above userId as BigCommerce Customer ID, "1" for true' + put: + summary: Update User Information + operationId: put-users-userId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companyId: '5716' + firstName: Jo + lastName: Sweet + email: Jo.Sweet@example.com + phoneNumber: '123456789' + role: '0' + properties: + firstName: + type: string + minLength: 1 + description: User's first name + lastName: + type: string + minLength: 1 + description: User's last name + email: + type: string + minLength: 1 + description: User's email + phoneNumber: + type: string + minLength: 1 + description: User's phone number + role: + type: string + minLength: 1 + description: User role + required: + - firstName + - lastName + - email + - phoneNumber + - role + description: |- + Update user information. + <br>Equivalent Storefront GraphQL API Mutation: `userUpdate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - User + delete: + summary: Delete User + operationId: delete-users-userId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Delete user. + <br>Equivalent Storefront GraphQL API Mutation: `userDelete `. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - User +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Company + - name: User diff --git a/docs/b2b-edition/specs/storefront/storefront/order.yaml b/docs/b2b-edition/specs/storefront/storefront/order.yaml new file mode 100644 index 000000000..ba246fe14 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/order.yaml @@ -0,0 +1,2056 @@ +openapi: 3.0.0 +info: + title: Order + version: '1.0' + description: Company based order management. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /orders: + get: + summary: Get Orders + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - orderId: 635 + companyName: levi-test + createdAt: '1622616050' + updatedAt: '1622616050' + isInvoiceOrder: 0 + orderStatus: Awaiting Payment + customOrderStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 450.45 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + firstName: levi + lastName: tuo + poNumber: '' + paginator: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - paginator + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + orderId: + type: number + description: Unique order ID in BigCommerce store + companyName: + type: string + minLength: 1 + description: Company name + createdAt: + type: string + minLength: 1 + description: Create timestamp of this order + updatedAt: + type: string + minLength: 1 + description: User last modified timestamp + isInvoiceOrder: + type: number + description: If order is invoice order + orderStatus: + type: string + minLength: 1 + description: Order status + customOrderStatus: + type: string + minLength: 1 + description: Custom order status + statusCode: + type: number + description: Order status code + totalIncTax: + type: number + description: Total inc tax + currencyCode: + type: string + minLength: 1 + description: Currency money code + money: + type: object + properties: + currency_location: + type: string + minLength: 1 + description: Currency location + currency_token: + type: string + minLength: 1 + description: Currency token code + decimal_token: + type: string + minLength: 1 + description: Decimal token + decimal_places: + type: number + description: Decimal places + thousands_token: + type: string + minLength: 1 + description: Thousands token + required: + - currency_location + - currency_token + - decimal_token + - decimal_places + - thousands_token + firstName: + type: string + minLength: 1 + description: Company first name + lastName: + type: string + minLength: 1 + description: Company last name + poNumber: + type: string + description: PO number + required: + - orderId + - companyName + - createdAt + - updatedAt + - isInvoiceOrder + - orderStatus + - customOrderStatus + - statusCode + - totalIncTax + - currencyCode + - firstName + - lastName + - poNumber + paginator: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - orderId: 635 + companyName: company name + createdAt: '1622616050' + updatedAt: '1622616050' + isInvoiceOrder: 0 + orderStatus: Awaiting Payment + customOrderStatus: Awaiting Pay Kido Test + statusCode: 0 + totalIncTax: 450.45 + currencyCode: CNY + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + firstName: Jo + lastName: Sweet + poNumber: '' + paginator: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-orders + parameters: + - schema: + type: string + in: query + name: beginDateAt + description: Begin query date + - schema: + type: string + in: query + name: endDateAt + description: End query date + - schema: + type: string + default: createdAt + in: query + name: orderBy + description: Order by + - schema: + type: string + default: DESC + in: query + name: sortBy + description: Sort order by desc or asc + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '0' + in: query + name: isShowMy + description: Is show my orders + - schema: + type: string + default: '0' + in: query + name: includeExtra + description: Include extra field + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + in: query + name: companyName + description: Company name + - schema: + type: string + in: query + name: orderNumber + description: Order number + - schema: + type: string + in: query + name: poNumber + description: PO number + - schema: + type: string + in: query + name: 'status[]' + description: Order status + description: |- + Get orders. + <br>Equivalent Storefront GraphQL API Query: `allOrders`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order + post: + summary: Create an Order + operationId: post-orders + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + orderId: + type: string + minLength: 1 + required: + - orderId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + orderId: '123' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + orderId: '1234' + requestBody: + content: + application/json: + schema: + type: object + properties: + orderId: + type: string + description: Unique order ID in BigCommerce store + poNumber: + type: string + description: PO number + isSaveOrderComment: + type: string + description: If save order comment + extraInt1: + type: string + description: Order extra int field 1 + extraInt2: + type: string + description: Order extra int field 2 + extraInt3: + type: string + description: Order extra int field 3 + extraInt4: + type: string + description: Order extra int field 4 + extraInt5: + type: string + description: Order extra int field 5 + extraStr1: + type: string + description: Order extra str field 1 + extraStr2: + type: string + description: Order extra str field 2 + extraStr3: + type: string + description: Order extra str field 3 + extraStr4: + type: string + description: Order extra str field 4 + extraStr5: + type: string + description: Order extra str field 5 + extraText: + type: string + description: Order extra text field + extraInfo: + oneOf: + - type: string + - type: object + description: order extra info such as address extra fields + required: + - orderId + description: |- + Create an order in the BigCommerce store. + <br>Equivalent Storefront GraphQL API Mutation: `createOrder`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order + /orders/images: + get: + summary: Get Order's Images + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + - orderId: '123' + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/111/images/371/smithjournal1.1554505753.386.513.jpg?c=2' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + orderId: + type: string + minLength: 1 + description: Order ID + imageUrl: + type: string + minLength: 1 + description: Image URL address + required: + - orderId + - imageUrl + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + - orderId: '123' + imageUrl: url + operationId: get-orders-images + parameters: + - schema: + type: string + in: query + name: 'orderIds[]' + description: Unique order ID + description: |- + Get order's images. + <br>Equivalent Storefront GraphQL API Query: `orderImages`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order + x-internal: true + '/orders/{orderId}/products': + parameters: + - schema: + type: string + name: orderId + in: path + required: true + description: Unique order ID in BigCommerce store + get: + summary: Get Order Products + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: Success + data: + - productId: '104' + quantity: '2' + variantId: '142' + optionList: + - option_id: 147 + option_value: '95' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + productId: + type: string + minLength: 1 + description: Unique order product ID + quantity: + type: string + minLength: 1 + description: Product quantity in this order + variantId: + type: string + minLength: 1 + description: Unique variant ID + optionList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + option_id: + type: number + description: Product option ID + option_value: + type: string + minLength: 1 + description: Product option value + required: + - option_id + - option_value + required: + - productId + - quantity + - variantId + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: Success + data: + - productId: '104' + quantity: '2' + variantId: '142' + optionList: + - option_id: 147 + option_value: '95' + operationId: get-orders-orderId-products + description: |- + Get order products by orderId. + <br>Equivalent Storefront GraphQL API Query: `orderProducts`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order + '/orders/{orderId}/details': + parameters: + - schema: + type: string + name: orderId + in: path + required: true + description: Unique order ID in BigCommerce store + get: + summary: Get Order Detail + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + id: 636 + customer_id: 8186 + date_created: 'Wed, 02 Jun 2021 07:01:56 +0000' + date_modified: 'Wed, 02 Jun 2021 07:01:57 +0000' + date_shipped: '' + status_id: 7 + status: Awaiting Payment + subtotal_ex_tax: '91.9000' + subtotal_inc_tax: '91.9000' + subtotal_tax: '0.0000' + base_shipping_cost: '0.0000' + shipping_cost_ex_tax: '0.0000' + shipping_cost_inc_tax: '0.0000' + shipping_cost_tax: '0.0000' + shipping_cost_tax_class_id: 2 + base_handling_cost: '0.0000' + handling_cost_ex_tax: '0.0000' + handling_cost_inc_tax: '0.0000' + handling_cost_tax: '0.0000' + handling_cost_tax_class_id: 2 + base_wrapping_cost: '0.0000' + wrapping_cost_ex_tax: '0.0000' + wrapping_cost_inc_tax: '0.0000' + wrapping_cost_tax: '0.0000' + wrapping_cost_tax_class_id: 3 + total_ex_tax: '91.9000' + total_inc_tax: '91.9000' + total_tax: '0.0000' + items_total: 2 + items_shipped: 0 + payment_method: Purchase Orders + payment_provider_id: null + payment_status: '' + refunded_amount: '0.0000' + order_is_digital: false + store_credit_amount: '0.0000' + gift_certificate_amount: '0.0000' + ip_address: 193.176.211.29 + geoip_country: Hong Kong + geoip_country_iso2: HK + currency_id: 3 + currency_code: CNY + currency_exchange_rate: '1.0000000000' + default_currency_id: 3 + default_currency_code: CNY + staff_notes: '' + customer_message: '' + discount_amount: '0.0000' + coupon_discount: '0.0000' + shipping_address_count: 1 + is_deleted: false + ebay_order_id: '0' + cart_id: a5a603a2-04be-47fc-8298-27a5995251d9 + billing_address: + first_name: test + last_name: order + company: test-order + street_1: address + street_2: '' + city: HA + state: '' + zip: '80022' + country: American Samoa + country_iso2: AS + phone: '' + email: levi.tuo@silksoftware.com + form_fields: [] + is_email_opt_in: false + credit_card_type: null + order_source: www + channel_id: 1 + external_source: '' + products: + - id: 1461 + order_id: 636 + product_id: 104 + variant_id: 142 + order_address_id: 544 + name: '[Sample] Utility Caddy' + name_customer: '[Sample] Utility Caddy' + name_merchant: '[Sample] Utility Caddy' + sku: e1-1 + upc: '' + type: physical + base_price: '45.9500' + price_ex_tax: '45.9500' + price_inc_tax: '45.9500' + price_tax: '0.0000' + base_total: '91.9000' + total_ex_tax: '91.9000' + total_inc_tax: '91.9000' + total_tax: '0.0000' + weight: '1.0000' + width: '0.0000' + height: '0.0000' + depth: '0.0000' + quantity: 2 + base_cost_price: '0.0000' + cost_price_inc_tax: '0.0000' + cost_price_ex_tax: '0.0000' + cost_price_tax: '0.0000' + is_refunded: false + quantity_refunded: 0 + refund_amount: '0.0000' + return_id: 0 + wrapping_name: '' + base_wrapping_cost: '0.0000' + wrapping_cost_ex_tax: '0.0000' + wrapping_cost_inc_tax: '0.0000' + wrapping_cost_tax: '0.0000' + wrapping_message: '' + quantity_shipped: 0 + event_name: null + event_date: '' + fixed_shipping_cost: '0.0000' + ebay_item_id: '' + ebay_transaction_id: '' + option_set_id: 16 + parent_order_product_id: null + is_bundled_product: false + bin_picking_number: '' + external_id: null + fulfillment_source: '' + applied_discounts: [] + product_options: + - id: 1595 + option_id: 32 + order_product_id: 1461 + product_option_id: 147 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Small + display_value_customer: Small + display_value_merchant: Small + value: '95' + type: Multiple choice + name: Jar Size + display_style: Rectangle + configurable_fields: [] + shipping_addresses: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/shipping_addresses' + resource: /orders/636/shipping_addresses + coupons: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/coupons' + resource: /orders/636/coupons + external_id: null + external_merchant_id: null + tax_provider_id: BasicTaxProvider + customer_locale: en + store_default_currency_code: CNY + store_default_to_transactional_exchange_rate: '1.0000000000' + custom_status: Awaiting Pay Kido Test + shippingAddress: + - id: 544 + order_id: 636 + first_name: test + last_name: order + company: test-order + street_1: address + street_2: '' + city: HA + zip: '80022' + country: American Samoa + country_iso2: AS + state: '' + email: levi.tuo@silksoftware.com + phone: '' + items_total: 2 + items_shipped: 0 + shipping_method: Free Shipping + base_cost: '0.0000' + cost_ex_tax: '0.0000' + cost_inc_tax: '0.0000' + cost_tax: '0.0000' + cost_tax_class_id: 2 + base_handling_cost: '0.0000' + handling_cost_ex_tax: '0.0000' + handling_cost_inc_tax: '0.0000' + handling_cost_tax: '0.0000' + handling_cost_tax_class_id: 2 + shipping_zone_id: 4 + shipping_zone_name: American Samoa + shipping_quotes: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/shipping_addresses/544/shipping_quotes' + resource: /orders/636/shipping_addresses/544/shipping_quotes + form_fields: [] + shipments: false + poNumber: '' + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + allOf: + - type: object + properties: + id: + type: number + description: Unique order ID in BigCommerce store. + customer_id: + type: number + description: Customer ID in BigCommerce store + date_created: + type: string + minLength: 1 + description: Create date of order + date_modified: + type: string + minLength: 1 + description: Last modified datetime of order + date_shipped: + type: string + description: Shipped date + status_id: + type: number + description: Status ID + status: + type: string + minLength: 1 + description: Status + subtotal_ex_tax: + type: string + minLength: 1 + subtotal_inc_tax: + type: string + minLength: 1 + subtotal_tax: + type: string + minLength: 1 + base_shipping_cost: + type: string + minLength: 1 + shipping_cost_ex_tax: + type: string + minLength: 1 + shipping_cost_inc_tax: + type: string + minLength: 1 + shipping_cost_tax: + type: string + minLength: 1 + shipping_cost_tax_class_id: + type: number + base_handling_cost: + type: string + minLength: 1 + handling_cost_ex_tax: + type: string + minLength: 1 + handling_cost_inc_tax: + type: string + minLength: 1 + handling_cost_tax: + type: string + minLength: 1 + handling_cost_tax_class_id: + type: number + base_wrapping_cost: + type: string + minLength: 1 + wrapping_cost_ex_tax: + type: string + minLength: 1 + wrapping_cost_inc_tax: + type: string + minLength: 1 + wrapping_cost_tax: + type: string + minLength: 1 + wrapping_cost_tax_class_id: + type: number + total_ex_tax: + type: string + minLength: 1 + total_inc_tax: + type: string + minLength: 1 + total_tax: + type: string + minLength: 1 + items_total: + type: number + items_shipped: + type: number + payment_method: + type: string + minLength: 1 + payment_provider_id: {} + payment_status: + type: string + refunded_amount: + type: string + minLength: 1 + order_is_digital: + type: boolean + store_credit_amount: + type: string + minLength: 1 + gift_certificate_amount: + type: string + minLength: 1 + ip_address: + type: string + minLength: 1 + geoip_country: + type: string + minLength: 1 + geoip_country_iso2: + type: string + minLength: 1 + currency_id: + type: number + currency_code: + type: string + minLength: 1 + currency_exchange_rate: + type: string + minLength: 1 + default_currency_id: + type: number + default_currency_code: + type: string + minLength: 1 + staff_notes: + type: string + customer_message: + type: string + discount_amount: + type: string + minLength: 1 + coupon_discount: + type: string + minLength: 1 + shipping_address_count: + type: number + is_deleted: + type: boolean + ebay_order_id: + type: string + minLength: 1 + cart_id: + type: string + minLength: 1 + billing_address: + type: object + description: Billing address info of this order + required: + - first_name + - last_name + - company + - street_1 + - street_2 + - city + - state + - zip + - country + - country_iso2 + - phone + - email + - form_fields + properties: + first_name: + type: string + minLength: 1 + last_name: + type: string + minLength: 1 + company: + type: string + minLength: 1 + street_1: + type: string + minLength: 1 + street_2: + type: string + city: + type: string + minLength: 1 + state: + type: string + zip: + type: string + minLength: 1 + country: + type: string + minLength: 1 + country_iso2: + type: string + minLength: 1 + phone: + type: string + email: + type: string + minLength: 1 + form_fields: + type: array + items: + type: object + is_email_opt_in: + type: boolean + credit_card_type: {} + order_source: + type: string + minLength: 1 + channel_id: + type: number + external_source: + type: string + products: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + order_id: + type: number + product_id: + type: number + variant_id: + type: number + order_address_id: + type: number + name: + type: string + minLength: 1 + name_customer: + type: string + minLength: 1 + name_merchant: + type: string + minLength: 1 + sku: + type: string + minLength: 1 + upc: + type: string + type: + type: string + minLength: 1 + base_price: + type: string + minLength: 1 + price_ex_tax: + type: string + minLength: 1 + price_inc_tax: + type: string + minLength: 1 + price_tax: + type: string + minLength: 1 + base_total: + type: string + minLength: 1 + total_ex_tax: + type: string + minLength: 1 + total_inc_tax: + type: string + minLength: 1 + total_tax: + type: string + minLength: 1 + weight: + type: string + minLength: 1 + width: + type: string + minLength: 1 + height: + type: string + minLength: 1 + depth: + type: string + minLength: 1 + quantity: + type: number + base_cost_price: + type: string + minLength: 1 + cost_price_inc_tax: + type: string + minLength: 1 + cost_price_ex_tax: + type: string + minLength: 1 + cost_price_tax: + type: string + minLength: 1 + is_refunded: + type: boolean + quantity_refunded: + type: number + refund_amount: + type: string + minLength: 1 + return_id: + type: number + wrapping_name: + type: string + base_wrapping_cost: + type: string + minLength: 1 + wrapping_cost_ex_tax: + type: string + minLength: 1 + wrapping_cost_inc_tax: + type: string + minLength: 1 + wrapping_cost_tax: + type: string + minLength: 1 + wrapping_message: + type: string + quantity_shipped: + type: number + event_name: {} + event_date: + type: string + fixed_shipping_cost: + type: string + minLength: 1 + ebay_item_id: + type: string + ebay_transaction_id: + type: string + option_set_id: + type: number + parent_order_product_id: {} + is_bundled_product: + type: boolean + bin_picking_number: + type: string + external_id: {} + fulfillment_source: + type: string + applied_discounts: + type: array + items: + type: object + product_options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + option_id: + type: number + order_product_id: + type: number + product_option_id: + type: number + display_name: + type: string + minLength: 1 + display_name_customer: + type: string + minLength: 1 + display_name_merchant: + type: string + minLength: 1 + display_value: + type: string + minLength: 1 + display_value_customer: + type: string + minLength: 1 + display_value_merchant: + type: string + minLength: 1 + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + name: + type: string + minLength: 1 + display_style: + type: string + minLength: 1 + required: + - id + - option_id + - order_product_id + - product_option_id + - display_name + - display_name_customer + - display_name_merchant + - display_value + - display_value_customer + - display_value_merchant + - value + - type + - name + - display_style + configurable_fields: + type: array + items: + type: object + required: + - id + - order_id + - product_id + - variant_id + - order_address_id + - name + - name_customer + - name_merchant + - sku + - upc + - type + - base_price + - price_ex_tax + - price_inc_tax + - price_tax + - base_total + - total_ex_tax + - total_inc_tax + - total_tax + - weight + - width + - height + - depth + - quantity + - base_cost_price + - cost_price_inc_tax + - cost_price_ex_tax + - cost_price_tax + - is_refunded + - quantity_refunded + - refund_amount + - return_id + - wrapping_name + - base_wrapping_cost + - wrapping_cost_ex_tax + - wrapping_cost_inc_tax + - wrapping_cost_tax + - wrapping_message + - quantity_shipped + - event_date + - fixed_shipping_cost + - ebay_item_id + - ebay_transaction_id + - option_set_id + - is_bundled_product + - bin_picking_number + - fulfillment_source + shipping_addresses: + type: object + required: + - url + - resource + properties: + url: + type: string + minLength: 1 + resource: + type: string + minLength: 1 + coupons: + type: object + required: + - url + - resource + properties: + url: + type: string + minLength: 1 + resource: + type: string + minLength: 1 + external_id: {} + external_merchant_id: {} + tax_provider_id: + type: string + minLength: 1 + customer_locale: + type: string + minLength: 1 + store_default_currency_code: + type: string + minLength: 1 + store_default_to_transactional_exchange_rate: + type: string + minLength: 1 + custom_status: + type: string + minLength: 1 + shippingAddress: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + order_id: + type: number + first_name: + type: string + minLength: 1 + last_name: + type: string + minLength: 1 + company: + type: string + minLength: 1 + street_1: + type: string + minLength: 1 + street_2: + type: string + city: + type: string + minLength: 1 + zip: + type: string + minLength: 1 + country: + type: string + minLength: 1 + country_iso2: + type: string + minLength: 1 + state: + type: string + email: + type: string + minLength: 1 + phone: + type: string + items_total: + type: number + items_shipped: + type: number + shipping_method: + type: string + minLength: 1 + base_cost: + type: string + minLength: 1 + cost_ex_tax: + type: string + minLength: 1 + cost_inc_tax: + type: string + minLength: 1 + cost_tax: + type: string + minLength: 1 + cost_tax_class_id: + type: number + base_handling_cost: + type: string + minLength: 1 + handling_cost_ex_tax: + type: string + minLength: 1 + handling_cost_inc_tax: + type: string + minLength: 1 + handling_cost_tax: + type: string + minLength: 1 + handling_cost_tax_class_id: + type: number + shipping_zone_id: + type: number + shipping_zone_name: + type: string + minLength: 1 + shipping_quotes: + type: object + properties: + url: + type: string + minLength: 1 + resource: + type: string + minLength: 1 + required: + - url + - resource + form_fields: + type: array + items: + type: object + required: + - id + - order_id + - first_name + - last_name + - company + - street_1 + - street_2 + - city + - zip + - country + - country_iso2 + - state + - email + - phone + - items_total + - items_shipped + - shipping_method + - base_cost + - cost_ex_tax + - cost_inc_tax + - cost_tax + - cost_tax_class_id + - base_handling_cost + - handling_cost_ex_tax + - handling_cost_inc_tax + - handling_cost_tax + - handling_cost_tax_class_id + - shipping_zone_id + - shipping_zone_name + shipments: + type: boolean + poNumber: + type: string + money: + type: object + required: + - currency_location + - currency_token + - decimal_token + - decimal_places + - thousands_token + properties: + currency_location: + type: string + minLength: 1 + currency_token: + type: string + minLength: 1 + decimal_token: + type: string + minLength: 1 + decimal_places: + type: number + thousands_token: + type: string + minLength: 1 + required: + - id + - customer_id + - date_created + - date_modified + - date_shipped + - status_id + - status + - subtotal_ex_tax + - subtotal_inc_tax + - subtotal_tax + - base_shipping_cost + - shipping_cost_ex_tax + - shipping_cost_inc_tax + - shipping_cost_tax + - shipping_cost_tax_class_id + - base_handling_cost + - handling_cost_ex_tax + - handling_cost_inc_tax + - handling_cost_tax + - handling_cost_tax_class_id + - base_wrapping_cost + - wrapping_cost_ex_tax + - wrapping_cost_inc_tax + - wrapping_cost_tax + - wrapping_cost_tax_class_id + - total_ex_tax + - total_inc_tax + - total_tax + - items_total + - items_shipped + - payment_method + - payment_status + - refunded_amount + - order_is_digital + - store_credit_amount + - gift_certificate_amount + - ip_address + - geoip_country + - geoip_country_iso2 + - currency_id + - currency_code + - currency_exchange_rate + - default_currency_id + - default_currency_code + - staff_notes + - customer_message + - discount_amount + - coupon_discount + - shipping_address_count + - is_deleted + - ebay_order_id + - cart_id + - billing_address + - is_email_opt_in + - order_source + - channel_id + - external_source + - products + - shipping_addresses + - coupons + - tax_provider_id + - customer_locale + - store_default_currency_code + - store_default_to_transactional_exchange_rate + - custom_status + - shippingAddress + - shipments + - poNumber + - money + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + id: 636 + customer_id: 8186 + date_created: 'Wed, 02 Jun 2021 07:01:56 +0000' + date_modified: 'Wed, 02 Jun 2021 07:01:57 +0000' + date_shipped: '' + status_id: 7 + status: Awaiting Payment + subtotal_ex_tax: '91.9000' + subtotal_inc_tax: '91.9000' + subtotal_tax: '0.0000' + base_shipping_cost: '0.0000' + shipping_cost_ex_tax: '0.0000' + shipping_cost_inc_tax: '0.0000' + shipping_cost_tax: '0.0000' + shipping_cost_tax_class_id: 2 + base_handling_cost: '0.0000' + handling_cost_ex_tax: '0.0000' + handling_cost_inc_tax: '0.0000' + handling_cost_tax: '0.0000' + handling_cost_tax_class_id: 2 + base_wrapping_cost: '0.0000' + wrapping_cost_ex_tax: '0.0000' + wrapping_cost_inc_tax: '0.0000' + wrapping_cost_tax: '0.0000' + wrapping_cost_tax_class_id: 3 + total_ex_tax: '91.9000' + total_inc_tax: '91.9000' + total_tax: '0.0000' + items_total: 2 + items_shipped: 0 + payment_method: Purchase Orders + payment_provider_id: null + payment_status: '' + refunded_amount: '0.0000' + order_is_digital: false + store_credit_amount: '0.0000' + gift_certificate_amount: '0.0000' + ip_address: 193.176.211.29 + geoip_country: Hong Kong + geoip_country_iso2: HK + currency_id: 3 + currency_code: CNY + currency_exchange_rate: '1.0000000000' + default_currency_id: 3 + default_currency_code: CNY + staff_notes: '' + customer_message: '' + discount_amount: '0.0000' + coupon_discount: '0.0000' + shipping_address_count: 1 + is_deleted: false + ebay_order_id: '0' + cart_id: a5a603a2-04be-47fc-8298-27a5995251d9 + billing_address: + first_name: test + last_name: order + company: test-order + street_1: address + street_2: '' + city: HA + state: '' + zip: '80022' + country: American Samoa + country_iso2: AS + phone: '' + email: example@example.com + form_fields: [] + is_email_opt_in: false + credit_card_type: null + order_source: www + channel_id: 1 + external_source: '' + products: + - id: 1461 + order_id: 636 + product_id: 104 + variant_id: 142 + order_address_id: 544 + name: '[Sample] Utility Caddy' + name_customer: '[Sample] Utility Caddy' + name_merchant: '[Sample] Utility Caddy' + sku: e1-1 + upc: '' + type: physical + base_price: '45.9500' + price_ex_tax: '45.9500' + price_inc_tax: '45.9500' + price_tax: '0.0000' + base_total: '91.9000' + total_ex_tax: '91.9000' + total_inc_tax: '91.9000' + total_tax: '0.0000' + weight: '1.0000' + width: '0.0000' + height: '0.0000' + depth: '0.0000' + quantity: 2 + base_cost_price: '0.0000' + cost_price_inc_tax: '0.0000' + cost_price_ex_tax: '0.0000' + cost_price_tax: '0.0000' + is_refunded: false + quantity_refunded: 0 + refund_amount: '0.0000' + return_id: 0 + wrapping_name: '' + base_wrapping_cost: '0.0000' + wrapping_cost_ex_tax: '0.0000' + wrapping_cost_inc_tax: '0.0000' + wrapping_cost_tax: '0.0000' + wrapping_message: '' + quantity_shipped: 0 + event_name: null + event_date: '' + fixed_shipping_cost: '0.0000' + ebay_item_id: '' + ebay_transaction_id: '' + option_set_id: 16 + parent_order_product_id: null + is_bundled_product: false + bin_picking_number: '' + external_id: null + fulfillment_source: '' + applied_discounts: [] + product_options: + - id: 1595 + option_id: 32 + order_product_id: 1461 + product_option_id: 147 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Small + display_value_customer: Small + display_value_merchant: Small + value: '95' + type: Multiple choice + name: Jar Size + display_style: Rectangle + configurable_fields: [] + shipping_addresses: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/shipping_addresses' + resource: /orders/636/shipping_addresses + coupons: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/coupons' + resource: /orders/636/coupons + external_id: null + external_merchant_id: null + tax_provider_id: BasicTaxProvider + customer_locale: en + store_default_currency_code: CNY + store_default_to_transactional_exchange_rate: '1.0000000000' + custom_status: Awaiting Pay Kido Test + shippingAddress: + - id: 544 + order_id: 636 + first_name: test + last_name: order + company: test-order + street_1: address + street_2: '' + city: HA + zip: '80022' + country: American Samoa + country_iso2: AS + state: '' + email: example@example.com + phone: '' + items_total: 2 + items_shipped: 0 + shipping_method: Free Shipping + base_cost: '0.0000' + cost_ex_tax: '0.0000' + cost_inc_tax: '0.0000' + cost_tax: '0.0000' + cost_tax_class_id: 2 + base_handling_cost: '0.0000' + handling_cost_ex_tax: '0.0000' + handling_cost_inc_tax: '0.0000' + handling_cost_tax: '0.0000' + handling_cost_tax_class_id: 2 + shipping_zone_id: 4 + shipping_zone_name: American Samoa + shipping_quotes: + url: 'https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/636/shipping_addresses/544/shipping_quotes' + resource: /orders/636/shipping_addresses/544/shipping_quotes + form_fields: [] + shipments: false + poNumber: '' + money: + currency_location: left + currency_token: ¥ + decimal_token: . + decimal_places: 2 + thousands_token: ',' + extraStr1: customize additional information + extraStr2: customize additional information + extraStr3: customize additional information + extraStr4: customize additional information + extraStr5: customize additional information + extraText: customize additional information + extraInfo: + addressExtraFields: + shippingAddressExtraFields: + - fieldName: test + fieldValue: test + billingAddressExtraFields: + - fieldName: test + fieldValue: test + operationId: get-orders-orderId-details + description: |- + Get order detail by orderId. Please refer to [BigCommerce API](https://developer.bigcommerce.com/api-reference/store-management/orders/orders/getanorder) for detailed parameter introduction. + <br>Equivalent Storefront GraphQL API Query: `order`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order + /ordered-products: + get: + summary: Get Ordered Product List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + pagination: + totalCount: 3 + offset: 0 + limit: 10 + list: + - orderProductId: '264' + productName: '[Sample] Utility Caddy' + sku: e1-1 + productId: '104' + variantId: '142' + lastOrdered: '1622617316' + optionList: + - id: 1595 + option_id: 32 + order_product_id: 1461 + product_option_id: 147 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Small + display_value_customer: Small + display_value_merchant: Small + value: '95' + type: Multiple choice + name: Jar Size + display_style: Rectangle + orderedTimes: '1' + lastOrderedItems: '2' + productBrandName: OFS + - orderProductId: '263' + productName: '[Sample] Dustpan & Brush' + sku: d1-2 + productId: '107' + variantId: '131' + lastOrdered: '1622616050' + optionList: + - id: 1594 + option_id: 32 + order_product_id: 1460 + product_option_id: 145 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Medium + display_value_customer: Medium + display_value_merchant: Medium + value: '96' + type: Multiple choice + name: Jar Size + display_style: Rectangle + orderedTimes: '2' + lastOrderedItems: '5' + productBrandName: OFS + - orderProductId: '262' + productName: '[Sample] Utility Caddy' + sku: e1-2 + productId: '104' + variantId: '143' + lastOrdered: '1622616050' + optionList: + - id: 1593 + option_id: 32 + order_product_id: 1459 + product_option_id: 147 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Medium + display_value_customer: Medium + display_value_merchant: Medium + value: '96' + type: Multiple choice + name: Jar Size + display_style: Rectangle + orderedTimes: '2' + lastOrderedItems: '6' + productBrandName: OFS + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - pagination + - list + properties: + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + orderProductId: + type: string + minLength: 1 + description: Unique order product ID + productName: + type: string + minLength: 1 + description: Product name + sku: + type: string + minLength: 1 + description: SKU name + productId: + type: string + minLength: 1 + description: Product ID in BigCommerce store + variantId: + type: string + minLength: 1 + description: Variant ID + lastOrdered: + type: string + minLength: 1 + description: Last ordered time + optionList: + type: array + uniqueItems: true + minItems: 1 + description: Product option list + items: + type: object + properties: + id: + type: number + description: '' + option_id: + type: number + description: Option ID of product + order_product_id: + type: number + product_option_id: + type: number + display_name: + type: string + minLength: 1 + display_name_customer: + type: string + minLength: 1 + display_name_merchant: + type: string + minLength: 1 + display_value: + type: string + minLength: 1 + display_value_customer: + type: string + minLength: 1 + display_value_merchant: + type: string + minLength: 1 + value: + type: string + minLength: 1 + type: + type: string + minLength: 1 + name: + type: string + minLength: 1 + display_style: + type: string + minLength: 1 + required: + - id + - option_id + - order_product_id + - product_option_id + - display_name + - display_name_customer + - display_name_merchant + - display_value + - display_value_customer + - display_value_merchant + - value + - type + - name + - display_style + orderedTimes: + type: string + minLength: 1 + lastOrderedItems: + type: string + minLength: 1 + productBrandName: + type: string + minLength: 1 + required: + - orderProductId + - productName + - sku + - productId + - variantId + - lastOrdered + - orderedTimes + - lastOrderedItems + - productBrandName + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + pagination: + totalCount: 3 + offset: 0 + limit: 10 + list: + - orderProductId: '264' + productName: '[Sample] Utility Caddy' + sku: e1-1 + productId: '104' + variantId: '142' + lastOrdered: '1622617316' + optionList: + - id: 1595 + option_id: 32 + order_product_id: 1461 + product_option_id: 147 + display_name: Size + display_name_customer: Size + display_name_merchant: Size + display_value: Small + display_value_customer: Small + display_value_merchant: Small + value: '95' + type: Multiple choice + name: Jar Size + display_style: Rectangle + orderedTimes: '1' + lastOrderedItems: '2' + productBrandName: OFS + operationId: get-ordered-products + parameters: + - schema: + type: string + in: query + name: offset + description: Pagination offset + - schema: + type: string + in: query + name: limit + description: Pagination limit + - schema: + type: string + in: query + name: beginDateAt + description: Begin date + - schema: + type: string + in: query + name: endDateAt + description: End date + - schema: + type: string + in: query + name: minOrderedTimes + description: Minimum ordered times + - schema: + type: string + in: query + name: maxOrderedTimes + description: Maximum ordered times + - schema: + type: string + in: query + name: productID + description: Pruduct ID + - schema: + type: string + in: query + name: q + description: Query string + description: |- + Get ordered products. + <br>Equivalent Storefront GraphQL API Query: `orderedProducts`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Order +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Order diff --git a/docs/b2b-edition/specs/storefront/storefront/quote.yaml b/docs/b2b-edition/specs/storefront/storefront/quote.yaml new file mode 100644 index 000000000..4c242808a --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/quote.yaml @@ -0,0 +1,1435 @@ +openapi: 3.0.0 +info: + title: Quote + version: '1.0' + description: Quote for sale. There are some old editions API endpoints used by earlier stores. Please use new RFQ's API endpoints for new stores. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /emails/quotes: + post: + deprecated: false + description: Send a quote emails. + operationId: sentemail + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + type: object + properties: + email: + example: '@email' + type: string + quoteId: + example: 1 + format: int32 + type: integer + quoteUrl: + description: Quote detail url + example: '@url' + type: string + required: + - email + - quoteId + - quoteUrl + required: false + description: '' + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: {} + description: '' + headers: {} + summary: Send Email + tags: + - Quote + x-internal: true + /quotes: + get: + deprecated: false + description: Get quote list. + operationId: getquoteList + parameters: + - description: 'Pagination offset default: 0' + explode: true + in: query + name: offset + required: true + schema: + example: 0 + format: int32 + type: integer + style: form + - description: 'Pagination limit default: 10' + explode: true + in: query + name: limit + required: true + schema: + example: 10 + format: int32 + type: integer + style: form + - description: 'sorted fields choices is ["createdAt", "grandTotal"]' + explode: true + in: query + name: sortBy + required: true + schema: + example: createdAt + type: string + style: form + - description: Order fields can be 'DESC' or 'ASC' + explode: true + in: query + name: orderBy + required: true + schema: + example: DESC + type: string + style: form + - description: 'quote ID field, default null' + explode: true + in: query + name: referenceNumber + schema: + example: 1 + format: int32 + type: integer + style: form + - description: 'Company name field, default null' + explode: true + in: query + name: company + schema: + example: ABC + type: string + style: form + - description: 'sales repʼs name, default null' + explode: true + in: query + name: salesRep + schema: + example: Allen + type: string + style: form + - description: 'quote status choices:["0": "new", "1": "sent", "2": "ordered", "3": "expired" ,"4": "opened"] sent is a specific status of sales rep, opened is a specific status of company user' + explode: true + in: query + name: status + required: true + schema: + example: + - '0' + - '1' + - '2' + - '3' + items: + type: string + type: array + style: form + summary: Get Quote List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - quoteId + - quoteNumber + - referenceNumber + - quoteTitle + - createdBy + - company + - salesRep + - createdAt + - updatedAt + - expiredAt + - subtotal + - status + - bcOrderId + - orderId + properties: + quoteId: + type: number + quoteNumber: + type: string + minLength: 1 + referenceNumber: + type: string + quoteTitle: + type: string + createdBy: + type: string + minLength: 1 + company: + type: string + minLength: 1 + salesRep: + type: string + minLength: 1 + createdAt: + type: number + updatedAt: + type: number + expiredAt: + type: number + subtotal: + type: number + status: + type: number + currency: + type: object + properties: + token: + type: string + minLength: 1 + location: + type: string + minLength: 1 + currencyCode: + type: string + minLength: 1 + decimalToken: + type: string + minLength: 1 + decimalPlaces: + type: number + thousandsToken: + type: string + minLength: 1 + currencyExchangeRate: + type: number + required: + - token + - location + - currencyCode + - decimalToken + - decimalPlaces + - thousandsToken + - currencyExchangeRate + bcOrderId: + type: string + orderId: + type: string + pagination: + type: object + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - totalCount + - offset + - limit + required: + - list + - pagination + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Jo Sweet + company: company name + salesRep: Jo Sweet + createdAt: 1622618606 + updatedAt: 1622618606 + expiredAt: 1622717999 + subtotal: 45.95 + status: 1 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + tags: + - Quote + x-internal: true + post: + deprecated: false + description: Create a quote. + operationId: createaquote + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + properties: + additionalInfo: + description: TEXT + type: string + addressInfo: + description: Address is a json field + type: string + basePrice: + description: Origin price of the product + example: 120 + format: int32 + type: integer + color: + type: string + companyId: + description: The company ID field of this quote + example: 1 + format: int32 + type: integer + currency_location: + description: Currency location + example: left + type: string + currency_token: + description: Currency token + example: $ + type: string + decimal_places: + description: Number of decimal places reserved + example: 2 + format: int32 + type: integer + decimal_token: + description: Decimal separator + example: . + type: string + description: + description: Description of this quote + example: Test desciption + type: string + discount: + description: Offer preference + example: 30 + format: int32 + type: integer + expiredAt: + description: 01/01/2020 + example: '@date' + type: string + grandTotal: + description: Total count + example: 270 + format: int32 + type: integer + imageUrl: + description: Product photo address + example: '@url' + type: string + money: + description: 'The currency information returned by BigCommerce. Itʼs directly transferred to be an object, without humping.' + type: string + newPrice: + description: Offer + example: 100 + format: int32 + type: integer + options: + type: string + productId: + description: '' + example: + - '1' + - '2' + items: + type: string + type: array + productList: + type: string + productName: + description: Product name + example: Test Product + type: string + quantity: + description: Quantity number + example: 2 + format: int32 + type: integer + referenceNumber: + type: string + size: + type: string + sku: + description: SKU of this product + example: + - sku-001 + - sku-002 + items: + type: string + type: array + status: + description: |- + "0", "1", "2", "3", "4", "5" + 0-new + 1-sent + 2-orderd + 3-expired + 4-opend + 5-draft + 6-await approve + 7-reject (7 is not allowed) + default is new + example: 0 + format: int32 + type: integer + subtotal: + description: subtotal + example: 300 + format: int32 + type: integer + thousands_token: + description: Thousands separator + example: ',' + type: string + title: + description: Title of this quote + example: Test title + type: string + variantId: + description: Sent null if it is none + example: + - '1' + - '2' + items: + type: string + type: array + required: + - title + - description + - expiredAt + - subtotal + - discount + - grandTotal + - money + - productList + - sku + - basePrice + - newPrice + - quantity + - productId + - variantId + - imageUrl + - productName + - options + - size + - color + - referenceNumber + - companyId + - currency_location + - decimal_token + - decimal_places + - currency_token + - thousands_token + - status + - additionalInfo + - addressInfo + type: object + required: false + description: '' + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + required: + - quoteId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: '1234' + description: '' + headers: {} + summary: Create a Quote + tags: + - Quote + x-internal: true + '/quotes/info/store-company/{companyId}': + get: + deprecated: false + description: Get store and company info by companyId. + operationId: getstoreandcompanyinfo + parameters: [] + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + storeInfo: + type: object + properties: + storeName: + type: string + minLength: 1 + storeAddress: + type: string + minLength: 1 + storeCountry: + type: string + minLength: 1 + required: + - storeName + - storeAddress + - storeCountry + companyInfo: + type: object + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyCountryCode: + type: string + minLength: 1 + companyState: + type: string + minLength: 1 + companyStateCode: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - firstName + - lastName + - phoneNumber + salesRepInfo: + type: object + properties: {} + required: + - storeInfo + - companyInfo + - salesRepInfo + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5716' + companyName: levi-test + companyAddress: line1 line1 + companyCountry: Argentina + companyCountryCode: AR + companyState: Mendoza + companyStateCode: M + companyCity: AS + companyZipCode: '10013' + firstName: Ada + lastName: Bob + phoneNumber: '16732680944' + salesRepInfo: {} + description: '' + headers: {} + summary: Get Store and Company Info + tags: + - Quote + x-internal: true + parameters: + - in: path + name: companyId + required: true + schema: + type: string + /quotes/products/upload: + post: + deprecated: false + description: Upload quote CSV file. + operationId: uploadquoteCSVfile + parameters: [] + requestBody: + content: + application/x-www-form-urlencoded: + encoding: {} + schema: + properties: + companyId: + type: string + quoteFile: + type: string + required: + - companyId + - quoteFile + type: object + required: false + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + productList: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - sku + - basePrice + - newPrice + - discount + - quantity + - productId + - variantId + - imageUrl + - productName + - maxQty + - minQty + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + newPrice: + type: number + discount: + type: number + quantity: + type: number + productId: + type: number + variantId: + type: number + imageUrl: + type: string + minLength: 1 + options: + type: object + properties: {} + productName: + type: string + minLength: 1 + maxQty: + type: number + minQty: + type: number + report: + type: object + properties: + totalCount: + type: number + createCount: + type: number + errorCount: + type: number + duplicateCount: + type: number + errorMessage: + type: array + items: + properties: {} + required: + - totalCount + - createCount + - errorCount + - duplicateCount + - errorMessage + required: + - productList + - report + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + productList: + - sku: SM13 + basePrice: 5 + newPrice: 5 + discount: 0 + quantity: 5 + productId: 111 + variantId: 74 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/111/images/371/smithjournal1.1435956911.386.513.jpg?c=2' + options: {} + productName: '[Sample] Smith Journal 13' + maxQty: 0 + minQty: 5 + report: + totalCount: 4 + createCount: 1 + errorCount: 3 + duplicateCount: 1 + errorMessage: + - 'sku 111-111 are repetitive, and prices are different' + - sku ABC does not exist + description: '' + headers: {} + summary: Upload Quote CSV File + tags: + - Quote + x-internal: true + '/quotes/{quoteId}': + delete: + deprecated: false + description: Delete a quote by quoteId + operationId: deleteaquote + parameters: [] + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + required: + - quoteId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: '1' + description: '' + headers: {} + summary: Delete a Quote + tags: + - Quote + x-internal: true + get: + deprecated: false + description: Get quote info by quoteId + operationId: getaquote + parameters: [] + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + data: + type: object + properties: + storeInfo: + type: object + properties: + storeName: + type: string + minLength: 1 + storeAddress: + type: string + minLength: 1 + storeCountry: + type: string + minLength: 1 + required: + - storeName + - storeAddress + - storeCountry + companyInfo: + type: object + properties: + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyCountryCode: + type: string + minLength: 1 + companyState: + type: string + minLength: 1 + companyStateCode: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + companyId: + type: string + minLength: 1 + required: + - companyName + - companyAddress + - companyCountry + - companyCountryCode + - companyState + - companyStateCode + - companyCity + - companyZipCode + - companyId + quoteInfo: + type: object + properties: + quoteId: + type: string + minLength: 1 + referenceNumber: + type: string + minLength: 1 + createdAt: + type: string + minLength: 1 + expiredAt: + type: string + minLength: 1 + subtotal: + type: number + discount: + type: number + grandTotal: + type: number + productList: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - sku + - basePrice + - newPrice + - quantity + - productId + - variantId + - imageUrl + - productName + - discount + - croImageUrl + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + newPrice: + type: number + quantity: + type: number + productId: + type: string + minLength: 1 + variantId: + type: string + minLength: 1 + imageUrl: + type: string + minLength: 1 + productName: + type: string + minLength: 1 + options: + type: object + properties: + size: + type: string + minLength: 1 + color: + type: string + minLength: 1 + required: + - size + - color + discount: + type: number + croImageUrl: + type: string + minLength: 1 + status: + type: string + minLength: 1 + money: + type: object + properties: + currency_location: + type: string + minLength: 1 + decimal_token: + type: string + minLength: 1 + decimal_places: + type: string + minLength: 1 + currency_token: + type: string + minLength: 1 + thousands_token: + type: string + minLength: 1 + required: + - currency_location + - decimal_token + - decimal_places + - currency_token + - thousands_token + additionalInfo: + type: string + required: + - quoteId + - referenceNumber + - createdAt + - expiredAt + - subtotal + - discount + - grandTotal + - productList + - status + - money + - additionalInfo + salesRepInfo: + type: object + properties: + firstName: + type: string + lastName: + type: string + phoneNumber: + type: string + email: + type: string + required: + - firstName + - lastName + - phoneNumber + - email + addressInfo: + type: object + properties: {} + required: + - storeInfo + - companyInfo + - quoteInfo + - salesRepInfo + - addressInfo + message: + type: string + minLength: 1 + required: + - code + - data + - message + x-examples: + example-1: + code: 200 + data: + storeInfo: + storeName: Test Store + storeAddress: 123 Widget Street + storeCountry: United States + companyInfo: + companyName: CompanyA + companyAddress: 123 Widget Street + companyCountry: United States + companyCountryCode: US + companyState: Alabama + companyStateCode: AL + companyCity: city + companyZipCode: '1000000' + companyId: '13' + quoteInfo: + quoteId: '1' + referenceNumber: test-001 + createdAt: '451845645737' + expiredAt: '247815830860' + subtotal: 300 + discount: 78 + grandTotal: 270 + productList: + - sku: sku-001 + basePrice: 120 + newPrice: 100 + quantity: 2 + productId: '1' + variantId: '1' + imageUrl: 'prospero://mmiweal.net/whtwkx' + productName: Test Product + options: + size: big + color: red + discount: 20 + croImageUrl: 'news://tuxogud.ag/cys' + - sku: sku-002 + basePrice: 120 + newPrice: 100 + quantity: 2 + productId: '2' + variantId: '2' + imageUrl: 'prospero://stbgcwj.ng/copi' + productName: Test Product + options: + size: big + color: red + discount: 20 + croImageUrl: 'tn3270://eonaisdqj.kp/fsbn' + status: '0' + money: + currency_location: left + decimal_token: . + decimal_places: '2' + currency_token: $ + thousands_token: ',' + additionalInfo: '' + salesRepInfo: + firstName: '' + lastName: '' + phoneNumber: '' + email: '' + addressInfo: {} + message: SUCCESS + description: '' + headers: {} + summary: Get a Quote + tags: + - Quote + x-internal: true + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + put: + description: Update quote (to optimize) + operationId: Update quote + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + required: + - quoteId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: '820000198412112930' + summary: Update Quote Info + tags: + - Quote + x-internal: true + '/quotes/{quoteId}/checkout': + delete: + deprecated: false + description: Delete a quote by quoteId + operationId: deletecheckoutinfo + parameters: [] + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: string + minLength: 1 + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + required: + - quoteId + required: + - code + - message + - data + x-examples: + example-1: + code: '200' + message: SUCCESS + data: + quoteId: '810000201503265361' + description: '' + headers: {} + summary: Delete Checkout Info + tags: + - Quote + x-internal: true + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Checkout a quote by quoteId + operationId: quotecheckout + parameters: [] + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + checkoutUrl: + type: string + minLength: 1 + cartId: + type: string + minLength: 1 + cartUrl: + type: string + minLength: 1 + required: + - quoteId + - checkoutUrl + - cartId + - cartUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: '1' + checkoutUrl: 'mid://qbxdb.za/jwgwbskj' + cartId: 9A806cEF-B79c-cFAD-FC2c-1fC8C36838CC + cartUrl: 'mid://qvtsd.cd/pnbf' + description: '' + headers: {} + summary: Quote Checkout + tags: + - Quote + x-internal: true + '/quotes/{quoteId}/ordered': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + put: + deprecated: false + description: Update a quote status by quoteId + operationId: updateaquotestatus + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + properties: + orderId: + description: Order ID + example: '@id' + type: string + required: + - orderId + type: object + required: false + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: string + minLength: 1 + required: + - quoteId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: Success + data: + quoteId: '1' + description: '' + headers: {} + summary: Update a Quote Status + tags: + - Quote + x-internal: true + '/quotes/{quoteId}/pdf-export': + parameters: + - in: path + name: quoteId + required: true + schema: + type: string + post: + deprecated: false + description: Export quote pdf by quoteId + operationId: quotesexportpdffile + parameters: [] + requestBody: + content: + application/json: + encoding: {} + schema: + properties: + currency: + type: string + required: + - currency + type: object + required: false + responses: + default: + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + url: + type: string + minLength: 1 + required: + - url + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + url: 'mid://lrqq.gl/xkbqiier' + description: '' + headers: {} + summary: Quotes Export PDF File + tags: + - Quote + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Quote +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/storefront/rfq.yaml b/docs/b2b-edition/specs/storefront/storefront/rfq.yaml new file mode 100644 index 000000000..fae0bc5fa --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/rfq.yaml @@ -0,0 +1,2134 @@ +openapi: 3.0.0 +info: + title: RFQ + version: '1.0' + description: 'A new set of API endpoints for quote, which new data structure is used at the bottom. For more comprehensive and easy to use features.' +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /rfq: + get: + summary: Get Quote Form List + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Kido Zhao + company: levi-test + salesRep: Kido Zhao + createdAt: 1622618606 + updatedAt: 1622618606 + expiredAt: 1622717999 + subtotal: 45.95 + status: 1 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + quoteId: + type: number + quoteNumber: + type: string + minLength: 1 + referenceNumber: + type: string + description: Reference number of a quote + quoteTitle: + type: string + description: Quote title created by a user + createdBy: + type: string + minLength: 1 + company: + type: string + minLength: 1 + salesRep: + type: string + minLength: 1 + createdAt: + type: number + updatedAt: + type: number + expiredAt: + type: number + subtotal: + type: number + description: Total price + status: + type: number + currency: + type: object + description: Currency information + properties: + token: + type: string + minLength: 1 + description: Currency token + location: + type: string + minLength: 1 + description: Currency token location + currencyCode: + type: string + minLength: 1 + description: 'Currency code, ex. USD, CNY' + decimalToken: + type: string + minLength: 1 + description: Decimal token + decimalPlaces: + type: number + description: Number of decimal places + currencyExchangeRate: + type: number + description: Exchange rate + thousandsToken: + type: string + minLength: 1 + description: Thousands token + required: + - token + - location + - currencyCode + - decimalToken + - decimalPlaces + - currencyExchangeRate + - thousandsToken + bcOrderId: + type: string + orderId: + type: string + channelId: + type: integer + description: B2B Edition channel id + ChannelName: + type: string + description: Store Channel Name + required: + - quoteId + - quoteNumber + - referenceNumber + - quoteTitle + - createdBy + - company + - salesRep + - createdAt + - updatedAt + - expiredAt + - subtotal + - status + - bcOrderId + - orderId + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - quoteId: 195 + quoteNumber: QN000195 + referenceNumber: '' + quoteTitle: '' + createdBy: Jo Sweet + company: company name + salesRep: Jo Sweet + createdAt: 1622618606 + updatedAt: 1622618606 + expiredAt: 1622717999 + subtotal: 45.95 + status: 1 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + bcOrderId: '' + orderId: '' + pagination: + totalCount: 1 + offset: 0 + limit: 10 + operationId: get-rfq + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '10' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: updatedAt + in: query + name: sortBy + description: Sort by desc or asc + - schema: + type: string + default: DESC + in: query + name: orderBy + description: Order by + - schema: + type: string + in: query + name: q + description: Query string + - schema: + type: string + in: query + name: quoteNumber + description: Quote number + - schema: + type: string + in: query + name: company + description: Company ID field + - schema: + type: string + in: query + name: salesRep + description: Super Admin ID + - schema: + type: string + in: query + name: status + description: Status of quote + - schema: + type: string + in: query + name: quoteTitle + description: Title of quote + - schema: + type: string + in: query + name: createdBy + description: Create user name + - schema: + type: string + in: query + name: dateCreatedBeginAt + description: 'Create date begin.example:10/01/2022' + - schema: + type: string + in: query + name: dateCreatedEndAt + description: 'Create date end.example:10/01/2022' + - schema: + type: string + in: query + name: dateUpdatedBeginAt + description: 'Update date begin.example:10/01/2022' + - schema: + type: string + in: query + name: dateUpdatedEndAt + description: 'Update date end.example:10/01/2022' + - schema: + type: string + in: query + name: dateExpiredBeginAt + description: 'Expired date begin.example:10/01/2022' + - schema: + type: string + in: query + name: dateExpiredEndAt + description: 'Expired date end.example:10/01/2022' + description: |- + Get quote form list. + <br>Equivalent Storefront GraphQL API Query: `quotes`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + post: + summary: Create a Quote Form + operationId: post-rfq + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: number + quoteUrl: + type: string + minLength: 1 + required: + - quoteId + - quoteUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: 'https://sylvia-apptest-store.mybigcommerce.com/quote/?id=195&date=1622618606' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + notes: this is a note + legalTerms: for examplde + message: test message + grandTotal: 45.95 + discount: 0 + subtotal: 45.95 + referenceNumber: '' + userEmail: kido.zhao@bundleb2b.net + expiredAt: 06/02/2021 + quoteTitle: '' + shippingAddress: + country: Argentina + state: Mendoza + city: AS + zipCode: '10013' + address: line1 + apartment: line1 + contactInfo: + name: levi-test-quote + email: levi.tuo@silksoftware.com + companyName: levi-test + phoneNumber: '' + companyId: 5716 + currency: + token: ¥ + location: left + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + companyInfo: + companyId: 5716 + companyName: levi-test + storeHash: 1i6zpxpe3g + productList: + - sku: e1-1 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + productId: 104 + variantId: 142 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/104/images/336/utilitybucket1.1554505753.220.290.jpg?c=2' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionValue: 95 + optionLabel: Small + optionName: Size + isBackendUser: 1 + properties: + notes: + type: string + minLength: 1 + legalTerms: + type: string + minLength: 1 + description: Legal terms + message: + type: string + minLength: 1 + description: Extra message + grandTotal: + type: number + description: Total price after discount + discount: + type: number + subtotal: + type: number + description: Total price + referenceNumber: + type: string + userEmail: + type: string + minLength: 1 + expiredAt: + type: string + minLength: 1 + quoteTitle: + type: string + shippingAddress: + type: object + required: + - country + - state + - city + - zipCode + - address + - apartment + properties: + country: + type: string + minLength: 1 + state: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + address: + type: string + minLength: 1 + apartment: + type: string + minLength: 1 + contactInfo: + type: object + required: + - name + - email + - companyName + - phoneNumber + properties: + name: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + companyId: + type: number + currency: + type: object + description: Currency info + required: + - token + - location + - decimalToken + - decimalPlaces + - thousandsToken + properties: + token: + type: string + minLength: 1 + description: 'Currency token, such as $' + location: + type: string + minLength: 1 + description: 'Currency token position, left or right' + decimalToken: + type: string + minLength: 1 + description: Decimal separator + decimalPlaces: + type: number + thousandsToken: + type: string + minLength: 1 + description: Thousands separator + storeHash: + type: string + minLength: 1 + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + discount: + type: number + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + productId: + type: number + variantId: + type: number + description: Variant SKU ID of the product + imageUrl: + type: string + minLength: 1 + orderQuantityMaximum: + type: number + orderQuantityMinimum: + type: number + productName: + type: string + minLength: 1 + options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + optionId: + type: number + optionValue: + type: number + optionLabel: + type: string + minLength: 1 + optionName: + type: string + minLength: 1 + required: + - optionId + - optionValue + - optionLabel + - optionName + required: + - sku + - basePrice + - discount + - offeredPrice + - quantity + - productId + - variantId + - imageUrl + - orderQuantityMaximum + - orderQuantityMinimum + - productName + isBackendUser: + type: number + bcCustomerId: + type: integer + description: Customer bc id + channelId: + type: integer + description: B2B Edition channel id + required: + - notes + - legalTerms + - message + - grandTotal + - discount + - subtotal + - referenceNumber + - userEmail + - expiredAt + - quoteTitle + - shippingAddress + - contactInfo + - companyId + - currency + - storeHash + - productList + - isBackendUser + description: |- + Create a quote form. + <br>Equivalent Storefront GraphQL API Mutation: `quoteCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + security: + - authToken: [] + '/rfq/{quote_id}': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + get: + summary: Get a Quote Detail + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteNumber: QN000199 + referenceNumber: '' + createdAt: 1622618606 + expiredAt: 1622717999 + status: 0 + contactInfo: + name: Hannah Admin330 + email: charles.admin@charlesco.com + companyName: CharlesCo + phoneNumber: '0000000000' + shippingAddress: + city: '' + state: '' + address: '' + country: '' + zipCode: '' + apartment: '' + subtotal: 45.95 + discount: 0 + grandTotal: 45.95 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + trackingHistory: [] + productList: + - sku: e1-3 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/images/stencil/original/products/104/336/utilitybucket1.1554505753.jpg?c=2' + productId: 104 + variantId: 144 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionName: Size + optionLabel: Large + optionValue: '97' + notes: '' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + quoteTitle: '' + notes: '' + legalTerms: '' + createdBy: Hannah Admin330 + bcOrderId: '' + orderId: '' + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5456' + companyName: CharlesCo + companyAddress: Asia China + companyCountry: '' + companyState: Sichuan + companyCity: Chengdu + companyZipCode: '10086' + phoneNumber: '123412' + salesRepInfo: {} + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - quoteNumber + - referenceNumber + - createdAt + - expiredAt + - status + - contactInfo + - shippingAddress + - subtotal + - discount + - grandTotal + - currency + - trackingHistory + - productList + - quoteTitle + - notes + - legalTerms + - createdBy + - bcOrderId + - orderId + - storeInfo + - companyInfo + - salesRepInfo + properties: + quoteNumber: + type: string + minLength: 1 + description: Quote number + referenceNumber: + type: string + description: Reference number of a quote + createdAt: + type: number + description: Created at timestamp + expiredAt: + type: number + description: Expired at timestamp + status: + type: number + description: The status of this quote + contactInfo: + type: object + required: + - name + - email + - companyName + - phoneNumber + properties: + name: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + shippingAddress: + type: object + required: + - city + - state + - address + - zipCode + - country + - apartment + properties: + city: + type: string + state: + type: string + address: + type: string + zipCode: + type: string + country: + type: string + apartment: + type: string + subtotal: + type: number + description: Total price + discount: + type: number + description: Discount + grandTotal: + type: number + description: Total price after discount + currency: + type: object + required: + - token + - location + - currencyCode + - decimalToken + - decimalPlaces + - thousandsToken + - currencyExchangeRate + properties: + token: + type: string + minLength: 1 + description: 'Currency token, such as $' + location: + type: string + minLength: 1 + description: 'Currency token location, ex. left or right' + currencyCode: + type: string + minLength: 1 + description: 'Currency code, ex. USD CNY' + decimalToken: + type: string + minLength: 1 + description: Decimal separator + decimalPlaces: + type: number + description: Number of decimal places + thousandsToken: + type: string + minLength: 1 + description: Thousands separator + currencyExchangeRate: + type: number + description: Currency rate + trackingHistory: + type: array + items: + type: object + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + description: Base price of this product + discount: + type: number + description: Discount + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + description: Quantity of the product + imageUrl: + type: string + minLength: 1 + description: Product image URL + productId: + type: number + variantId: + type: number + description: Variant SKU ID + productName: + type: string + minLength: 1 + options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + optionId: + type: number + optionName: + type: string + minLength: 1 + optionLabel: + type: string + minLength: 1 + optionValue: + type: string + minLength: 1 + required: + - optionId + - optionName + - optionLabel + - optionValue + notes: + type: string + description: The extra message notes + orderQuantityMaximum: + type: number + description: The maximum quantity for this order + orderQuantityMinimum: + type: number + description: The minimum quantity for this order + required: + - sku + - basePrice + - discount + - offeredPrice + - quantity + - imageUrl + - productId + - variantId + - productName + - notes + - orderQuantityMaximum + - orderQuantityMinimum + quoteTitle: + type: string + description: Quote title + notes: + type: string + description: Extra message note + legalTerms: + type: string + description: Legal terms + createdBy: + type: string + minLength: 1 + bcOrderId: + type: string + description: BC order ID + orderId: + type: string + description: B2B Edition order ID + storeInfo: + type: object + required: + - storeName + - storeAddress + - storeCountry + properties: + storeName: + type: string + minLength: 1 + storeAddress: + type: string + minLength: 1 + storeCountry: + type: string + minLength: 1 + companyInfo: + type: object + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyState + - companyCity + - companyZipCode + - phoneNumber + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + companyState: + type: string + minLength: 1 + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + salesRepInfo: + type: object + ChannelId: + type: integer + description: B2B Edition channel id + Channel Name: + type: string + description: Store Channel name + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + quoteNumber: QN000199 + referenceNumber: '' + createdAt: 1622618606 + expiredAt: 1622717999 + status: 0 + contactInfo: + name: Hannah Admin330 + email: charles.admin@charlesco.com + companyName: CharlesCo + phoneNumber: '0000000000' + shippingAddress: + city: '' + state: '' + address: '' + country: '' + zipCode: '' + apartment: '' + subtotal: 45.95 + discount: 0 + grandTotal: 45.95 + currency: + token: ¥ + location: left + currencyCode: USD + decimalToken: . + decimalPlaces: 2 + thousandsToken: ',' + currencyExchangeRate: 1 + trackingHistory: [] + productList: + - sku: e1-3 + basePrice: 45.95 + discount: 0 + offeredPrice: 45.95 + quantity: 1 + imageUrl: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/images/stencil/original/products/104/336/utilitybucket1.1554505753.jpg?c=2' + productId: 104 + variantId: 144 + productName: '[Sample] Utility Caddy' + options: + - optionId: 147 + optionName: Size + optionLabel: Large + optionValue: '97' + notes: '' + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + quoteTitle: '' + notes: '' + legalTerms: '' + createdBy: Hannah Admin330 + bcOrderId: '' + orderId: '' + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5456' + companyName: CharlesCo + companyAddress: Asia China + companyCountry: '' + companyState: Sichuan + companyCity: Chengdu + companyZipCode: '10086' + phoneNumber: '123412' + salesRepInfo: {} + operationId: get-rfq-quote_id + parameters: + - schema: + type: string + in: query + name: storeHash + description: Store Hash + required: true + - schema: + type: string + in: query + name: date + required: true + description: 'Creation date of quote, timestamp' + description: |- + Get a quote detail by quoteId. + <br>Equivalent Storefront GraphQL API Query: `quote`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + security: + - authToken: [] + put: + summary: Update a Quote + operationId: put-rfq-quote_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + quoteId: + type: number + quoteUrl: + type: string + minLength: 1 + required: + - quoteId + - quoteUrl + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + quoteId: 195 + quoteUrl: url + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + notes: string + legalTerms: string + message: string + grandTotal: 0 + discount: 0 + subtotal: 0 + referenceNumber: string + userEmail: string + expiredAt: string + quoteTitle: string + shippingAddress: + country: string + state: string + city: string + zipCode: string + address: string + apartment: string + contactInfo: + name: string + email: string + companyName: string + phoneNumber: string + companyId: 0 + currency: + token: string + location: string + decimalToken: string + decimalPlaces: 0 + thousandsToken: string + companyInfo: + companyId: 0 + companyName: string + storeHash: string + productList: + - sku: string + basePrice: 0 + discount: 0 + offeredPrice: 0 + quantity: 0 + productId: 0 + variantId: 0 + imageUrl: string + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: string + options: + - optionId: 0 + optionValue: 0 + optionLabel: string + optionName: string + isBackendUser: 0 + properties: + notes: + type: string + minLength: 1 + description: Quote extra message + legalTerms: + type: string + minLength: 1 + message: + type: string + minLength: 1 + description: Text info from comments + grandTotal: + type: number + description: Total price after discount + discount: + type: number + subtotal: + type: number + description: Total price + referenceNumber: + type: string + minLength: 1 + description: Reference number of a quote + userEmail: + type: string + minLength: 1 + expiredAt: + type: string + minLength: 1 + quoteTitle: + type: string + minLength: 1 + shippingAddress: + type: object + required: + - country + - state + - city + - zipCode + - address + - apartment + properties: + country: + type: string + minLength: 1 + state: + type: string + minLength: 1 + city: + type: string + minLength: 1 + zipCode: + type: string + minLength: 1 + address: + type: string + minLength: 1 + apartment: + type: string + minLength: 1 + contactInfo: + type: object + required: + - name + - email + - companyName + - phoneNumber + properties: + name: + type: string + minLength: 1 + email: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + currency: + type: object + required: + - token + - location + - decimalToken + - decimalPlaces + - thousandsToken + description: 'Currency info, which can be seen when you get quote detail' + properties: + token: + type: string + minLength: 1 + location: + type: string + minLength: 1 + decimalToken: + type: string + minLength: 1 + decimalPlaces: + type: number + thousandsToken: + type: string + minLength: 1 + storeHash: + type: string + minLength: 1 + productList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + sku: + type: string + minLength: 1 + basePrice: + type: number + discount: + type: number + offeredPrice: + type: number + description: The discounted price must be passed on + quantity: + type: number + productId: + type: number + variantId: + type: number + imageUrl: + type: string + minLength: 1 + orderQuantityMaximum: + type: number + orderQuantityMinimum: + type: number + productName: + type: string + minLength: 1 + options: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + optionId: + type: number + optionValue: + type: number + optionLabel: + type: string + minLength: 1 + optionName: + type: string + minLength: 1 + required: + - optionId + - optionValue + - optionLabel + - optionName + required: + - sku + - basePrice + - discount + - offeredPrice + - quantity + - productId + - variantId + - imageUrl + - orderQuantityMaximum + - orderQuantityMinimum + - productName + isBackendUser: + type: number + required: + - notes + - legalTerms + - message + - grandTotal + - discount + - subtotal + - referenceNumber + - userEmail + - expiredAt + - quoteTitle + - shippingAddress + - contactInfo + - currency + - storeHash + - productList + - isBackendUser + examples: + example-1: + value: + notes: string + legalTerms: string + message: string + grandTotal: 0 + discount: 0 + subtotal: 0 + referenceNumber: string + userEmail: string + expiredAt: string + quoteTitle: string + shippingAddress: + country: string + state: string + city: string + zipCode: string + address: string + apartment: string + contactInfo: + name: string + email: string + companyName: string + phoneNumber: string + currency: + token: string + location: string + decimalToken: string + decimalPlaces: 0 + thousandsToken: string + storeHash: string + productList: + - sku: string + basePrice: 0 + discount: 0 + offeredPrice: 0 + quantity: 0 + productId: 0 + variantId: 0 + imageUrl: string + orderQuantityMaximum: 0 + orderQuantityMinimum: 0 + productName: string + options: + - optionId: 0 + optionValue: 0 + optionLabel: string + optionName: string + isBackendUser: 0 + description: Request body params you could find when you get quote detail + description: |- + Update a quote. + <br>Equivalent Storefront GraphQL API Mutation: `quoteUpdate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + security: + - authToken: [] + delete: + summary: Delete a Quote + operationId: delete-rfq-quote_id + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: Delete a quote by quoteId + tags: + - RFQ + security: + - authToken: [] + x-internal: true + '/rfq/{quote_id}/checkout': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Checkout Quote Form + operationId: post-rfq-quote_id-checkout + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + checkoutUrl: url + cartId: '123' + cartUrl: url + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - checkoutUrl + - cartId + - cartUrl + properties: + checkoutUrl: + type: string + minLength: 1 + description: The checkout URL + cartId: + type: string + minLength: 1 + description: Cart ID + cartUrl: + type: string + minLength: 1 + description: The cart URL + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + checkoutUrl: url + cartId: '123' + cartUrl: url + description: |- + Checkout quote form by quoteId. + <br>Equivalent Storefront GraphQL API Mutation: `quoteCheckout`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + type: object + properties: + storeHash: + type: string + description: Store Hash + required: + - storeHash + tags: + - RFQ + security: + - authToken: [] + '/rfq/{quote_id}/ordered': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Ordered a Quote + operationId: post-rfq-quote_id-ordered + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Ordered a quote by quoteId. + <br>Equivalent Storefront GraphQL API Mutation: `quoteOrdered`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + orderId: '' + storeHash: '' + shippingTotal: 0 + taxTotal: 0 + shippingMethod: + id: kWf@Mjg + type: flat + description: Fixed (Fixed) + imageUrl: 'telnet://axcsqlcngg.cc/sfsrtyimv' + transitTime: '' + cost: 10 + additionalDescription: '' + properties: + orderId: + type: string + description: Unique order ID + storeHash: + type: string + description: Store Hash + shippingTotal: + type: number + description: Shipping total price + taxTotal: + type: number + description: Tax total price + shippingMethod: + type: object + required: + - id + - type + - description + - imageUrl + - transitTime + - cost + - additionalDescription + properties: + id: + type: string + minLength: 1 + type: + type: string + minLength: 1 + description: + type: string + minLength: 1 + imageUrl: + type: string + minLength: 1 + transitTime: + type: string + cost: + type: number + additionalDescription: + type: string + required: + - orderId + - storeHash + - shippingTotal + - taxTotal + - shippingMethod + examples: + example-1: + value: + orderId: '' + storeHash: '' + shippingTotal: 0 + taxTotal: 0 + shippingMethod: + id: kWf@Mjg + type: flat + description: Fixed (Fixed) + imageUrl: 'telnet://axcsqlcngg.cc/sfsrtyimv' + transitTime: '' + cost: 10 + additionalDescription: '' + tags: + - RFQ + security: + - authToken: [] + /rfq/configs: + get: + summary: Get Quote Config + responses: {} + operationId: get-rfq-configs + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + switchStatus: + - key: quote_customer + isEnabled: '1' + - key: quote_on_product_page + isEnabled: '1' + - key: quote_on_cart_page + isEnabled: '1' + - key: quote_for_guest + isEnabled: '0' + - key: quote_for_individual_customer + isEnabled: '0' + - key: quote_sales_rep_visibility + isEnabled: '0' + - key: quote_sales_rep_creation + isEnabled: '1' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - switchStatus + properties: + switchStatus: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + key: + type: string + minLength: 1 + isEnabled: + type: string + minLength: 1 + description: Is enabled for a config + required: + - key + - isEnabled + required: + - code + - message + - data + description: |- + Get quote config. + <br>Equivalent Storefront GraphQL API Query: `quoteConfig`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + in: query + name: storeHash + description: Store Hash + tags: + - RFQ + /rfq/store-info: + get: + summary: Get Quote Store Info + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + storeUserInfo: + storeInfo: + storeName: Sylvia Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5716' + companyName: levi-test + companyAddress: address line 1 address line 2 + companyCountry: Aruba + companyState: '' + companyCity: Denver + companyZipCode: '80022' + phoneNumber: '17195453626' + salesRepInfo: + salesRepName: sales rep name + salesRepEmail: email + salesRepPhoneNumber: '123456789' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - storeUserInfo + properties: + storeUserInfo: + type: object + required: + - storeInfo + - companyInfo + - salesRepInfo + properties: + storeInfo: + type: object + required: + - storeName + - storeAddress + - storeCountry + properties: + storeName: + type: string + minLength: 1 + storeAddress: + type: string + minLength: 1 + description: Store address of the config + storeCountry: + type: string + minLength: 1 + description: Store country of config + companyInfo: + type: object + required: + - companyId + - companyName + - companyAddress + - companyCountry + - companyState + - companyCity + - companyZipCode + - phoneNumber + properties: + companyId: + type: string + minLength: 1 + companyName: + type: string + minLength: 1 + companyAddress: + type: string + minLength: 1 + companyCountry: + type: string + minLength: 1 + companyState: + type: string + companyCity: + type: string + minLength: 1 + companyZipCode: + type: string + minLength: 1 + phoneNumber: + type: string + minLength: 1 + salesRepInfo: + type: object + required: + - salesRepName + - salesRepEmail + - salesRepPhoneNumber + properties: + salesRepName: + type: string + minLength: 1 + salesRepEmail: + type: string + minLength: 1 + salesRepPhoneNumber: + type: string + minLength: 1 + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + storeUserInfo: + storeInfo: + storeName: Apptest Store + storeAddress: |- + 47 Discovery + Acmeville, AC 12345 + United States of America + storeCountry: United States + companyInfo: + companyId: '5716' + companyName: company name + companyAddress: address line 1 address line 2 + companyCountry: Aruba + companyState: '' + companyCity: Denver + companyZipCode: '80022' + phoneNumber: '123456789' + salesRepInfo: + salesRepName: sales rep name + salesRepEmail: email + salesRepPhoneNumber: '123456789' + operationId: get-rfq-store-info + parameters: + - schema: + type: string + in: query + name: storeHash + description: Store Hash + - schema: + type: string + in: query + name: companyId + description: Company ID + - schema: + type: string + in: query + name: salesRepId + description: Sales Rep ID + description: |- + Get store, company, and sales rep info. Mainly used for preview. + <br>Equivalent Storefront GraphQL API Query: `quoteUserStoreInfo`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + /rfq/emails: + post: + summary: Send a Quote Email + operationId: post-rfq-emails + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Send a quote email. + <br>Equivalent Storefront GraphQL API Mutation: `quoteEmail`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + quoteId: '195' + email: levi.tuo@silksoftware.com + properties: + quoteId: + type: string + minLength: 1 + description: The quote ID you want to use + email: + type: string + minLength: 1 + description: Which email you want to send + required: + - quoteId + - email + examples: {} + tags: + - RFQ + '/rfq/{quote_id}/pdf-export': + parameters: + - schema: + type: string + name: quote_id + in: path + required: true + description: Unique quote ID + post: + summary: Quote Export PDF + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + url: + type: string + minLength: 1 + required: + - url + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + url: 'https://s3-us-west-2.amazonaws.com/bundleb2b-v2.0-quote-staging/Sylvia_Apptest_Store:QN000195.pdf' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + url: pdf url + operationId: get-rfq-quote_id-pdf-export + requestBody: + content: + application/json: + schema: + type: object + properties: + storeHash: + type: string + description: Store Hash + currency: + type: object + properties: + currencyExchangeRate: + type: string + description: Currency rate + required: + - storeHash + - isBackendUser + description: |- + Export quote pdf. + <br>Equivalent Storefront GraphQL API Mutation: `quoteFrontendPdf`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - RFQ + security: + - authToken: [] +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: RFQ +x-internal: false diff --git a/docs/b2b-edition/specs/storefront/storefront/sales-rep.yaml b/docs/b2b-edition/specs/storefront/storefront/sales-rep.yaml new file mode 100644 index 000000000..491f723d6 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/sales-rep.yaml @@ -0,0 +1,556 @@ +openapi: 3.0.0 +info: + title: Super Admin + version: '1.0' + description: Super Admin is a group of sales representatives assigned to the company. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + '/sales-reps/{userId}/companies/{companyId}/begin-masq': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique company ID in B2B Edition + - schema: + type: string + name: userId + in: path + required: true + description: Unique user ID in B2B Edition + put: + summary: Super Admin Begin Masquerade + operationId: put-sales-reps-customerId-companies-companyId-begin-masq + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + email: + type: string + minLength: 1 + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + phoneNumber: + type: string + required: + - email + - firstName + - lastName + - phoneNumber + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + email: levi.tuo2@silksoftware.com + firstName: levi + lastName: test + phoneNumber: '' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + email: example@example.com + firstName: Jo + lastName: Sweet + phoneNumber: '123456789' + description: |- + Update status for when a super admin masquerades as a company by userId and companyId. + <br>Equivalent Storefront GraphQL API Mutation: `superAdminBeginMasquerade`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Super Admin + security: + - authToken: [] + '/sales-reps/{userId}/companies/{companyId}/end-masq': + parameters: + - schema: + type: string + name: companyId + in: path + required: true + description: Unique ID of a company in B2B Edition + - schema: + type: string + name: userId + in: path + required: true + description: Unique ID of a user in B2B Edition + put: + summary: Super Admin End Masquerade + operationId: put-sales-reps-customerId-companies-companyId-end-masq + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Update status for when a super admin masquerades as a company by userId and companyId. + <br>Equivalent Storefront GraphQL API Mutation: `superAdminEndMasquerade`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Super Admin + security: + - authToken: [] + '/sales-reps/{customerId}/companies/masquerading': + parameters: + - schema: + type: string + name: customerId + in: path + required: true + description: Unique ID of a company in BigCommerce + get: + summary: Get Masquerading Company + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + companyName: levi-test + description: '' + addressLine1: address line 1 + addressLine2: address line 2 + companyStatus: '1' + city: Denver + state: '' + zipCode: '80022' + country: Aruba + companyId: '5716' + catalogId: '5' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - companyName + - description + - addressLine1 + - addressLine2 + - companyStatus + - city + - state + - zipCode + - country + - companyId + - catalogId + properties: + companyName: + type: string + minLength: 1 + description: Company name + description: + type: string + description: Company description + addressLine1: + type: string + minLength: 1 + description: Company address line 1 + addressLine2: + type: string + minLength: 1 + description: Company address line 2 + companyStatus: + type: string + minLength: 1 + description: Company status + city: + type: string + minLength: 1 + description: Company city + state: + type: string + description: Company state + zipCode: + type: string + minLength: 1 + description: Company zip code + country: + type: string + minLength: 1 + description: Company country + companyId: + type: string + minLength: 1 + catalogId: + type: string + minLength: 1 + description: Company price list ID + extraFields: + type: array + items: + type: object + properties: + fieldName: + type: string + fieldValue: + type: string + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + companyName: company name + description: '' + addressLine1: address line 1 + addressLine2: address line 2 + companyStatus: '1' + city: Denver + state: '' + zipCode: '80022' + country: Aruba + companyId: '5716' + catalogId: '5' + extraFields: + - fieldName: test + fieldValue: test + operationId: get-sales-reps-customerId-companies-masquerading + description: |- + Get company info for the current super admin masquerading. + <br>Equivalent Storefront GraphQL API Query: `superAdminMasquerading`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Super Admin + '/sales-reps/{salesRepId}/companies': + parameters: + - schema: + type: string + name: salesRepId + in: path + required: true + description: Unique ID of super admin + get: + summary: Get Company List by Super Admin + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - companyName: stanton1112 + bcGroupName: stanton1112 + companyAdminName: judy he + companyEmail: judy.he@silksoftware.com + companyId: '84' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + - companyName: james + bcGroupName: james + companyAdminName: user btc + companyEmail: jamessen@1111.com + companyId: '53' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + - companyName: XYZ Inc.phone + bcGroupName: XYZ Inc.phone + companyAdminName: Mary Smith + companyEmail: Marketingphone@xyz.com + companyId: '376' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + pagination: + totalCount: 3 + perCount: 3 + offset: 0 + limit: 10 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + companyName: + type: string + minLength: 1 + bcGroupName: + type: string + minLength: 1 + description: Company BC customer group name + companyAdminName: + type: string + minLength: 1 + companyEmail: + type: string + minLength: 1 + companyId: + type: string + minLength: 1 + extraFields: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + fieldName: + type: string + minLength: 1 + labelName: + type: string + minLength: 1 + dataType: + type: string + minLength: 1 + isRequired: + type: string + minLength: 1 + fieldValue: + type: string + required: + - fieldName + - labelName + - dataType + - isRequired + - fieldValue + required: + - companyName + - bcGroupName + - companyAdminName + - companyEmail + - companyId + pagination: + type: object + required: + - totalCount + - perCount + - offset + - limit + properties: + totalCount: + type: number + perCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - companyName: company name + bcGroupName: bc group name + companyAdminName: judy he + companyEmail: example@example.com + companyId: '84' + extraFields: + - fieldName: company_tax_exempt_code + labelName: Company Tax Exempt Code + dataType: '0' + isRequired: '0' + fieldValue: '' + pagination: + totalCount: 1 + perCount: 1 + offset: 0 + limit: 10 + operationId: get-sales-reps-salesRepId-companies + description: |- + Get companies by Super Admin ID. + <br>Equivalent Storefront GraphQL API Query: `superAdminCompanies`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Super Admin + security: + - authToken: [] + parameters: + - schema: + type: integer + in: query + name: offset + - schema: + type: integer + in: query + name: limit + - schema: + type: string + in: query + name: orderBy + - schema: + type: string + example: 'DESC, ASC' + in: query + name: sortBy + - schema: + type: string + in: query + name: q + - schema: + type: string + in: query + name: companyId + put: + summary: Assign Companies to Super Admin + operationId: put-sales-reps-salesRepId-companies + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + companyId: + - '123' + properties: + companyId: + type: array + description: Company ID list + items: + type: string + required: + - companyId + description: Update super admin assign company. + tags: + - Super Admin + security: + - authToken: [] + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Super Admin diff --git a/docs/b2b-edition/specs/storefront/storefront/shopping.yaml b/docs/b2b-edition/specs/storefront/storefront/shopping.yaml new file mode 100644 index 000000000..4bc47265b --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/shopping.yaml @@ -0,0 +1,1099 @@ +openapi: 3.0.0 +info: + title: Shopping + version: '1.0' + description: Shopping related information. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /shoppinglists: + get: + summary: Get Shopping Lists + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: 441 + name: shopping list name + status: 0 + description: Shopping list desc + updatedAt: 1622601337 + createdAt: 1622601337 + totalCount: 0 + customerInfo: + firstName: levi + lastName: tuo + userId: 7831 + email: levi.tuo@silksoftware.com + pagination: + totalCount: 1 + offset: 0 + limit: 20 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - list + - pagination + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + name: + type: string + minLength: 1 + status: + type: number + description: |- + 0: Approved + 20: Deleted + 30: Draft + 40: Ready for approval + description: + type: string + minLength: 1 + updatedAt: + type: number + createdAt: + type: number + totalCount: + type: number + description: Total count of shopping list items + customerInfo: + type: object + properties: + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + userId: + type: number + email: + type: string + minLength: 1 + required: + - firstName + - lastName + - userId + - email + required: + - id + - name + - status + - description + - updatedAt + - createdAt + - totalCount + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: 441 + name: shopping list name + status: 0 + description: Shopping list desc + updatedAt: 1622601337 + createdAt: 1622601337 + totalCount: 0 + customerInfo: + firstName: Jo + lastName: Sweet + userId: 7831 + email: example@example.com + pagination: + totalCount: 1 + offset: 0 + limit: 20 + operationId: get-shoppinglists + parameters: + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '20' + in: query + name: limit + description: Pagination limit + - schema: + type: string + default: '1' + in: query + name: isShowAll + description: If show all + - schema: + type: string + default: '-created_at' + in: query + name: orderBy + description: Order by + description: |- + Get all shopping lists. + <br>Equivalent Storefront GraphQL API Query: `shoppingLists`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + post: + summary: Create Shopping List + operationId: post-shoppinglists + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + shopplistId: + type: number + required: + - shopplistId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + shopplistId: 442 + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + shopplistId: 442 + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + name: shopping list name + description: Shopping list desc + status: '0' + properties: + name: + type: string + minLength: 1 + description: + type: string + minLength: 1 + status: + type: string + minLength: 1 + description: |- + 0: Approved + 20: Deleted + 30: Draft + 40: Ready for approval + enum: + - '0' + - '20' + - '30' + - '40' + required: + - name + - description + - status + examples: {} + description: |- + Create a shopping list. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + put: + summary: Update Shopping List + operationId: put-shoppinglists + responses: + '200': + description: OK + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + name: shopping list name2 + description: Shopping list desc + status: 0 + id: '442' + properties: + name: + type: string + minLength: 1 + description: Shopping list name + description: + type: string + minLength: 1 + description: Description of this shopping list + status: + type: number + description: |- + 0: Approved + 20: Deleted + 30: Draft + 40: Ready for approval + id: + type: string + minLength: 1 + description: Shopping list’s ID + required: + - name + - description + - status + - id + description: |- + Update a shopping list. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsUpdate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + /shoppinglists/lists: + get: + summary: Get Shopping List's ID and Name + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + list: + type: array + uniqueItems: true + minItems: 1 + items: + required: + - id + - name + properties: + id: + type: number + name: + type: string + minLength: 1 + required: + - list + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + list: + - id: 442 + name: shopping list name2 + - id: 443 + name: shopping list name1622602668636 + - id: 441 + name: shopping list name + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + list: + - id: 443 + name: shopping list name1622602668636 + - id: 441 + name: shopping list name + operationId: get-shoppinglists-lists + description: |- + > This endpoint is deprecated. + + Get all the shopping lists that contains both ID and name. + parameters: + - schema: + type: string + in: query + name: status + description: '0:Approved 20:Deleted 30:Draft 40:Ready for approval' + tags: + - Shopping + /shoppinglists/items: + post: + summary: Add shopping List Items + operationId: post-shoppinglists-items + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + id: '441' + items: + - productId: '93' + variantId: '46' + qty: '1' + optionList: + - option_id: 'attribute[112]' + option_value: '95' + checkAddStatus: true + properties: + id: + type: string + minLength: 1 + description: Shopping list ID + items: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + productId: + type: string + minLength: 1 + variantId: + type: string + minLength: 1 + qty: + type: string + minLength: 1 + optionList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + option_id: + type: string + minLength: 1 + option_value: + type: string + minLength: 1 + required: + - option_id + - option_value + sortOrder: + type: integer + description: The sort order for item + required: + - productId + - variantId + - qty + required: + - id + - items + examples: + example-1: + value: + id: string + items: + - productId: string + variantId: string + qty: string + optionList: + - option_id: string + option_value: string + checkAddStatus: true + description: |- + Add items to an existed shopping list. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsItemsCreate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + put: + summary: Update Shopping List Items + operationId: put-shoppinglists-items + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + requestBody: + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + shoppinglistId: '441' + itemId: '1558' + qty: '2' + optionList: + - option_id: 'attribute[145]' + option_value: '95' + variantId: '130' + properties: + shoppinglistId: + type: string + minLength: 1 + description: Shopping list ID field + itemId: + type: string + minLength: 1 + description: Shopping list item ID field + qty: + type: string + minLength: 1 + description: Quantity of product in shopping list + optionList: + type: array + uniqueItems: true + minItems: 1 + description: Product option of shopping list item + items: + type: object + properties: + option_id: + type: string + minLength: 1 + option_value: + type: string + minLength: 1 + required: + - option_id + - option_value + variantId: + type: string + minLength: 1 + description: Product SKU ID + sortOrder: + type: integer + description: The sort order for item + required: + - shoppinglistId + - itemId + - qty + - optionList + - variantId + description: |- + Update shopping lists items. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsItemsUpdate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + /shoppinglists/items-extension: + get: + summary: Get Shopping List Items Extension + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + name: shopping list name + description: Shopping list desc + status: 0 + isOwner: '1' + products: + - itemId: 1558 + productId: '107' + baseSku: DPB + variantSku: d1-1 + qty: 5 + basePrice: 34.95 + productUrl: /sample-dustpan-brush/ + optionsList: + - option_id: 'attribute[145]' + option_value: '95' + variantId: '130' + primaryImage: + urlThumbnail: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/107/images/351/dustpan1.1554505753.220.290.jpg?c=2' + productName: '[Sample] Dustpan & Brush' + updatedAt: 1622603634 + createdAt: 1622603183 + - itemId: 1557 + productId: '93' + baseSku: SLLPJ + variantSku: SLLPJ-6088C959 + qty: 2 + basePrice: 7 + productUrl: /1-l-le-parfait-jar/ + optionsList: + - option_id: 'attribute[112]' + option_value: '95' + variantId: '46' + primaryImage: + urlThumbnail: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + productName: '[Sample] 1 L Le Parfait Jar' + updatedAt: 1622603542 + createdAt: 1622602889 + customerInfo: + firstName: levi + lastName: tuo + grandTotal: 188.75 + pagination: + totalCount: 2 + offset: 0 + limit: 100 + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - name + - description + - status + - isOwner + - products + - customerInfo + - grandTotal + - pagination + properties: + name: + type: string + minLength: 1 + description: Shopping list name + description: + type: string + minLength: 1 + description: Desciption of shopping list + status: + type: number + isOwner: + type: string + minLength: 1 + description: If owner of shopping list + products: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + itemId: + type: number + description: Shopping list item ID + productId: + type: string + minLength: 1 + description: 'Product ID ' + baseSku: + type: string + minLength: 1 + description: Product base SKU + variantSku: + type: string + minLength: 1 + description: SKU name + qty: + type: number + description: Qty number + basePrice: + type: number + productUrl: + type: string + minLength: 1 + optionsList: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + option_id: + type: string + minLength: 1 + option_value: + type: string + minLength: 1 + required: + - option_id + - option_value + variantId: + type: string + minLength: 1 + description: Variant SKU ID + primaryImage: + type: object + properties: + urlThumbnail: + type: string + minLength: 1 + required: + - urlThumbnail + productName: + type: string + minLength: 1 + description: Product name + updatedAt: + type: number + createdAt: + type: number + sortOrder: + type: integer + description: The sort order for item + required: + - itemId + - productId + - baseSku + - variantSku + - qty + - basePrice + - productUrl + - variantId + - productName + - updatedAt + - createdAt + customerInfo: + type: object + required: + - firstName + - lastName + properties: + firstName: + type: string + minLength: 1 + lastName: + type: string + minLength: 1 + grandTotal: + type: number + channelId: + type: integer + description: B2B Edition channel id + channelName: + type: string + description: Store Channel name + pagination: + type: object + required: + - totalCount + - offset + - limit + properties: + totalCount: + type: number + offset: + type: number + limit: + type: number + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + name: shopping list name + description: Shopping list desc + status: 0 + isOwner: '1' + products: + - itemId: 1558 + productId: '107' + baseSku: DPB + variantSku: d1-1 + qty: 5 + basePrice: 34.95 + productUrl: /sample-dustpan-brush/ + optionsList: + - option_id: 'attribute[145]' + option_value: '95' + variantId: '130' + primaryImage: + urlThumbnail: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/107/images/351/dustpan1.1554505753.220.290.jpg?c=2' + productName: '[Sample] Dustpan & Brush' + updatedAt: 1622603634 + createdAt: 1622603183 + - itemId: 1557 + productId: '93' + baseSku: SLLPJ + variantSku: SLLPJ-6088C959 + qty: 2 + basePrice: 7 + productUrl: /1-l-le-parfait-jar/ + optionsList: + - option_id: 'attribute[112]' + option_value: '95' + variantId: '46' + primaryImage: + urlThumbnail: 'https://cdn11.bigcommerce.com/s-1i6zpxpe3g/products/93/images/311/leparfaitmedium3.1554505753.220.290.jpg?c=2' + productName: '[Sample] 1 L Le Parfait Jar' + updatedAt: 1622603542 + createdAt: 1622602889 + customerInfo: + firstName: Jo + lastName: Sweet + grandTotal: 188.75 + pagination: + totalCount: 2 + offset: 0 + limit: 100 + operationId: get-shoppinglists-items-extension + parameters: + - schema: + type: string + in: query + name: id + description: Shopping list ID + - schema: + type: string + default: '0' + in: query + name: offset + description: Pagination offset + - schema: + type: string + default: '100' + in: query + name: limit + description: Pagination limit + - schema: + type: string + example: sort_order + enum: + - product_name + - quantity + - product_sku + - updated_at + - created_at + - sort_order + in: query + name: sortBy + description: the field to sort by + description: |- + Get a shopping list detail information. + <br>Equivalent Storefront GraphQL API Query: `shoppingList`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + '/shoppinglists/{shoppingListId}/items/{itemId}': + parameters: + - schema: + type: string + name: shoppingListId + in: path + required: true + description: Shopping list ID + - schema: + type: string + name: itemId + in: path + required: true + description: Item id + delete: + summary: Delete Shopping List Item + operationId: delete-shoppinglists-shoppingListId-items-itemId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Delete shopping list item using shoppingListId and itemId. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsItemsDelete`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + '/shoppinglists/{shoppingListId}': + parameters: + - schema: + type: string + name: shoppingListId + in: path + required: true + description: Shopping list ID + delete: + summary: Delete Shopping List + operationId: delete-shoppinglists-shoppingListId + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: {} + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: {} + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: {} + description: |- + Delete a shopping list. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsDelete`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Shopping + security: + - authToken: [] + /shoppinglists/duplicate: + post: + summary: Duplicate a Shopping List + operationId: post-shoppinglists-duplicate + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + properties: + shoppingListId: + type: string + minLength: 1 + required: + - shoppingListId + required: + - code + - message + - data + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + shoppingListId: '443' + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + shoppingListId: '443' + description: |- + Duplicate a shopping list. + <br>Equivalent Storefront GraphQL API Mutation: `shoppingListsDuplicate`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + requestBody: + content: + application/json: + schema: + description: '' + type: object + properties: + sampleShoppingListId: + type: number + name: + type: string + minLength: 1 + description: + type: string + minLength: 1 + required: + - sampleShoppingListId + - name + - description + x-examples: + example-1: + sampleShoppingListId: 441 + name: shopping list name1622602668636 + description: Shopping list desc + examples: {} + tags: + - Shopping + security: + - authToken: [] +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Shopping diff --git a/docs/b2b-edition/specs/storefront/storefront/store-config.yaml b/docs/b2b-edition/specs/storefront/storefront/store-config.yaml new file mode 100644 index 000000000..efe5df3bf --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/store-config.yaml @@ -0,0 +1,98 @@ +openapi: 3.0.0 +info: + title: Store Configs + version: '1.0' + description: Personalize information settings of stores. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /store-configs/switch-status: + get: + summary: Get Store Configs + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + id: '2' + key: interval_quantity + isEnabled: '0' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - id + - key + - isEnabled + properties: + id: + type: string + minLength: 1 + key: + type: string + minLength: 1 + isEnabled: + type: string + minLength: 1 + description: Is the switch config enabled + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + id: '1' + key: email_notifications + isEnabled: '1' + example-2: + value: + code: 200 + message: SUCCESS + data: + id: '2' + key: interval_quantity + isEnabled: '0' + operationId: get-store-configs-switch-status + parameters: + - schema: + type: string + enum: + - email_notifications + - interval_quantity + in: query + name: key + required: true + description: 'Key of store configs. ' + description: Get the configuration list of all stores whose types are switches + tags: + - Store Config + x-internal: true +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Store Config +x-internal: true diff --git a/docs/b2b-edition/specs/storefront/storefront/store.yaml b/docs/b2b-edition/specs/storefront/storefront/store.yaml new file mode 100644 index 000000000..a1697c5f8 --- /dev/null +++ b/docs/b2b-edition/specs/storefront/storefront/store.yaml @@ -0,0 +1,411 @@ +openapi: 3.0.0 +info: + title: Store + version: '1.0' + description: Store shopping information settings. +servers: + - url: 'https://api-b2b.bigcommerce.com/api/v2' +paths: + /stores/order-statuses: + get: + summary: Get Store Order Statuses Setting + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + orderStatuses: + - systemLabel: Incomplete + customLabel: Incomplete + statusCode: '0' + - systemLabel: Pending + customLabel: Pending Kido Test + statusCode: '1' + - systemLabel: Shipped + customLabel: Shipping + statusCode: '2' + - systemLabel: Partially Shipped + customLabel: Partially Shipped + statusCode: '3' + - systemLabel: Refunded + customLabel: Refunded Test + statusCode: '4' + - systemLabel: Cancelled + customLabel: Cancelled + statusCode: '5' + - systemLabel: Declined + customLabel: Declined + statusCode: '6' + - systemLabel: Awaiting Payment + customLabel: Awaiting Pay Kido Test + statusCode: '7' + - systemLabel: Awaiting Pickup + customLabel: Awaiting Pickup + statusCode: '8' + - systemLabel: Awaiting Shipment + customLabel: Awaiting Shipment + statusCode: '9' + - systemLabel: Completed + customLabel: Completed Kido Test + statusCode: '10' + - systemLabel: Awaiting Fulfillment + customLabel: Awaiting Fulfill + statusCode: '11' + - systemLabel: Manual Verification Required + customLabel: Manual Verification Required + statusCode: '12' + - systemLabel: Disputed + customLabel: Disputed + statusCode: '13' + - systemLabel: Partially Refunded + customLabel: Partially Refunded + statusCode: '14' + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - orderStatuses + properties: + orderStatuses: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + systemLabel: + type: string + minLength: 1 + description: Standard label name + customLabel: + type: string + minLength: 1 + description: Custom label name + statusCode: + type: string + minLength: 1 + description: Status code + required: + - systemLabel + - customLabel + - statusCode + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + orderStatuses: + - systemLabel: Incomplete + customLabel: Incomplete + statusCode: '0' + - systemLabel: Pending + customLabel: Pending Kido Test + statusCode: '1' + - systemLabel: Shipped + customLabel: Shipping + statusCode: '2' + - systemLabel: Partially Shipped + customLabel: Partially Shipped + statusCode: '3' + - systemLabel: Refunded + customLabel: Refunded Test + statusCode: '4' + - systemLabel: Cancelled + customLabel: Cancelled + statusCode: '5' + - systemLabel: Declined + customLabel: Declined + statusCode: '6' + - systemLabel: Awaiting Payment + customLabel: Awaiting Pay Kido Test + statusCode: '7' + - systemLabel: Awaiting Pickup + customLabel: Awaiting Pickup + statusCode: '8' + - systemLabel: Awaiting Shipment + customLabel: Awaiting Shipment + statusCode: '9' + - systemLabel: Completed + customLabel: Completed Kido Test + statusCode: '10' + - systemLabel: Awaiting Fulfillment + customLabel: Awaiting Fulfill + statusCode: '11' + - systemLabel: Manual Verification Required + customLabel: Manual Verification Required + statusCode: '12' + - systemLabel: Disputed + customLabel: Disputed + statusCode: '13' + - systemLabel: Partially Refunded + customLabel: Partially Refunded + statusCode: '14' + operationId: get-stores-order-statuses + description: |- + Get a list of all statuses of the order, including status codes and custom status names. + <br>Equivalent Storefront GraphQL API Query: `orderStatuses`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + tags: + - Store + /stores/currencies: + get: + summary: Get Store Currencies Setting + responses: + '200': + description: OK + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + code: 200 + message: SUCCESS + data: + currencies: + - id: 1 + is_default: false + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: USD + currency_exchange_rate: '0.1411948941' + name: USD + token: $ + auto_update: false + token_location: left + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + - id: 2 + is_default: false + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: AUD + currency_exchange_rate: '0.2077965256' + name: Australian Dollar + token: $ + auto_update: false + token_location: right + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + - id: 3 + is_default: true + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: CNY + currency_exchange_rate: '1.0000000000' + name: Chinese Yuan + token: ¥ + auto_update: false + token_location: left + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + - id: 4 + is_default: false + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: GBP + currency_exchange_rate: '0.1055431833' + name: British Pound + token: £ + auto_update: false + token_location: left + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + - id: 5 + is_default: false + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: EUR + currency_exchange_rate: '0.1164293097' + name: Euro + token: € + auto_update: false + token_location: left + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + properties: + code: + type: number + message: + type: string + minLength: 1 + data: + type: object + required: + - currencies + properties: + currencies: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + id: + type: number + is_default: + type: boolean + country_iso2: + description: 'Country code, ex. US, CN' + type: string + last_updated: + type: string + minLength: 1 + default_for_country_codes: + type: array + items: + type: object + currency_code: + type: string + minLength: 1 + description: 'Currency code, ex. USD, CNY' + currency_exchange_rate: + type: string + minLength: 1 + name: + type: string + minLength: 1 + token: + type: string + minLength: 1 + description: 'Currency token, ex. $' + auto_update: + type: boolean + token_location: + type: string + minLength: 1 + description: 'Currency token location, ex. left or right' + decimal_token: + type: string + minLength: 1 + thousands_token: + type: string + minLength: 1 + decimal_places: + type: number + enabled: + type: boolean + is_transactional: + type: boolean + description: Is transactional + required: + - id + - is_default + - last_updated + - currency_code + - currency_exchange_rate + - name + - token + - auto_update + - token_location + - decimal_token + - thousands_token + - decimal_places + - enabled + - is_transactional + channelCurrencies: + type: array + items: + type: object + properties: + channel_id: + type: integer + enabled_currencies: + type: array + items: {} + default_currency: + type: string + required: + - code + - message + - data + examples: + example-1: + value: + code: 200 + message: SUCCESS + data: + currencies: + - id: 1 + is_default: false + last_updated: 'Wed, 19 May 2021 01:35:32 +0000' + country_iso2: null + default_for_country_codes: [] + currency_code: USD + currency_exchange_rate: '0.1411948941' + name: USD + token: $ + auto_update: false + token_location: left + decimal_token: . + thousands_token: ',' + decimal_places: 2 + enabled: true + is_transactional: true + operationId: get-stores-currencies + description: |- + Get store currencies config. + <br>Equivalent Storefront GraphQL API Query: `currencies`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + parameters: + - schema: + type: string + in: query + name: storehash + description: Store Hash + required: true + - schema: + type: string + in: query + name: channelId + description: BigCommerce channel id + tags: + - Store +components: + schemas: {} + securitySchemes: + authToken: + name: authToken + type: apiKey + in: header +security: + - authToken: [] +tags: + - name: Store diff --git a/reference/catalog/product-modifiers_catalog.v3.yml b/reference/catalog/product-modifiers_catalog.v3.yml index 04bb8f13f..62dbcc624 100644 --- a/reference/catalog/product-modifiers_catalog.v3.yml +++ b/reference/catalog/product-modifiers_catalog.v3.yml @@ -359,197 +359,188 @@ paths: schema: title: Modifier Put description: The model for a PUT to update a modifier on a product. - allOf: - - title: Modifier Base - required: - - required - - type + type: object + required: + - required + - type + properties: + type: + type: string + description: | + BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. + enum: + - date + - checkbox + - file + - text + - multi_line_text + - numbers_only_text + - radio_buttons + - rectangles + - dropdown + - product_list + - product_list_with_images + - swatch + required: + type: boolean + description: | + Whether or not this modifier is required at checkout. Required in a /POST. + sort_order: + type: integer + description: The order the modifiers display on the product detail page. + config: type: object properties: - type: + default_value: type: string description: | - BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. - enum: - - date - - checkbox - - file - - text - - multi_line_text - - numbers_only_text - - radio_buttons - - rectangles - - dropdown - - product_list - - product_list_with_images - - swatch - x-required: - - post - required: + (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + checked_by_default: type: boolean description: | - Whether or not this modifier is required at checkout. Required in a /POST. - x-required: - - post - sort_order: - type: integer - description: The order the modifiers display on the product detail page. - config: - title: Option Config - type: object - properties: - default_value: - type: string - description: | - (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. - checked_by_default: - type: boolean - description: | - (checkbox) Flag for setting the checkbox to be checked by default. - checkbox_label: - type: string - description: | - (checkbox) Label displayed for the checkbox option. - date_limited: - type: boolean - description: | - (date) Flag to limit the dates allowed to be entered on a date option. - date_limit_mode: - type: string - description: | - (date) The type of limit that is allowed to be entered on a date option. - example: range - enum: - - earliest - - range - - latest - date_earliest_value: - type: string - description: | - (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date - date_latest_value: - type: string - description: | - (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. - format: date - file_types_mode: - type: string - description: | - (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. - example: specific - enum: - - specific - - all - file_types_supported: - type: array - description: | - (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: - `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). - `other` - Allows file types defined in the `file_types_other` array. - items: - type: string - example: 'images, documents, other' - file_types_other: - type: array - description: | - (file) A list of other file types allowed with the file upload option. - items: - type: string - example: pdf - file_max_size: - type: integer - description: | - (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. - example: 5 - text_characters_limited: - type: boolean - description: | - (text, multi_line_text) Flag to validate the length of a text or multi-line text input. - text_min_length: - type: integer - description: | - (text, multi_line_text) The minimum length allowed for a text or multi-line text option. - example: 1 - text_max_length: - type: integer - description: | - (text, multi_line_text) The maximum length allowed for a text or multi line text option. - example: 55 - text_lines_limited: - type: boolean - description: | - (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. - example: true - text_max_lines: - type: integer - description: | - (multi_line_text) The maximum number of lines allowed on a multi-line text input. - example: 4 - number_limited: - type: boolean - description: | - (numbers_only_text) Flag to limit the value of a number option. - example: true - number_limit_mode: - type: string - description: | - (numbers_only_text) The type of limit on values entered for a number option. - example: lowest - enum: - - lowest - - highest - - range - number_lowest_value: - type: number - description: | - (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. - example: 100 - number_highest_value: - type: number - description: | - (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. - number_integers_only: - type: boolean - description: | - (numbers_only_text) Flag to limit the input on a number option to whole numbers only. - example: false - product_list_adjusts_inventory: - type: boolean - description: | - (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. - product_list_adjusts_pricing: - type: boolean - description: | - (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. - product_list_shipping_calc: - type: string - description: | - (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. - example: weight - enum: - - none - - weight - - package - description: The values for option config can vary based on the Modifier created. - option_values: + (checkbox) Flag for setting the checkbox to be checked by default. + checkbox_label: + type: string + description: | + (checkbox) Label displayed for the checkbox option. + date_limited: + type: boolean + description: | + (date) Flag to limit the dates allowed to be entered on a date option. + date_limit_mode: + type: string + description: | + (date) The type of limit that is allowed to be entered on a date option. + example: range + enum: + - earliest + - range + - latest + date_earliest_value: + type: string + description: | + (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + format: date + date_latest_value: + type: string + description: | + (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + format: date + file_types_mode: + type: string + description: | + (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + example: specific + enum: + - specific + - all + file_types_supported: type: array + description: | + (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + `other` - Allows file types defined in the `file_types_other` array. items: - title: Modifier Value - type: object - properties: - id: - type: integer - description: | - The unique numeric ID of the value; increments sequentially. - description: 'Part of Modifier Value Response ' - display_name: + type: string + example: 'images, documents, other' + file_types_other: + type: array + description: | + (file) A list of other file types allowed with the file upload option. + items: + type: string + example: pdf + file_max_size: + type: integer + description: | + (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + example: 5 + text_characters_limited: + type: boolean + description: | + (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + text_min_length: + type: integer + description: | + (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + example: 1 + text_max_length: + type: integer + description: | + (text, multi_line_text) The maximum length allowed for a text or multi line text option. + example: 55 + text_lines_limited: + type: boolean + description: | + (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + example: true + text_max_lines: + type: integer + description: | + (multi_line_text) The maximum number of lines allowed on a multi-line text input. + example: 4 + number_limited: + type: boolean + description: | + (numbers_only_text) Flag to limit the value of a number option. + example: true + number_limit_mode: type: string description: | - The name of the option shown on the storefront. - example: Donation - description: Common Modifier properties. - required: true + (numbers_only_text) The type of limit on values entered for a number option. + example: lowest + enum: + - lowest + - highest + - range + number_lowest_value: + type: number + description: | + (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + example: 100 + number_highest_value: + type: number + description: | + (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + number_integers_only: + type: boolean + description: | + (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + example: false + product_list_adjusts_inventory: + type: boolean + description: | + (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + product_list_adjusts_pricing: + type: boolean + description: | + (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + product_list_shipping_calc: + type: string + description: | + (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + example: weight + enum: + - none + - weight + - package + description: The values for option config can vary based on the Modifier created. + option_values: + type: array + items: + type: object + properties: + id: + type: integer + description: | + The unique numeric ID of the value; increments sequentially. + description: 'Part of Modifier Value Response' + display_name: + type: string + description: | + The name of the option shown on the storefront. + example: Donation + description: Common Modifier properties. responses: '200': description: '' @@ -738,107 +729,88 @@ paths: option_values: type: array items: - title: Modifier Value - description: 'Part of Modifier Value Response ' - allOf: - - title: Modifier Value Base - allOf: - - title: Option Value Base - required: - - label - - sort_order + type: object + required: + - label + - sort_order + properties: + is_default: + type: boolean + description: | + The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + example: false + label: + type: string + description: | + The text display identifying the value on the storefront. Required in a /POST. + example: Green + sort_order: + type: integer + description: | + The order in which the value will be displayed on the product page. Required in a /POST. + example: 0 + value_data: + type: object + properties: {} + description: | + Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexadecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + adjusters: + type: object + properties: + price: type: object properties: - is_default: - type: boolean - description: | - The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. - example: false - label: + adjuster: type: string description: | - The text display identifying the value on the storefront. Required in a /POST. - example: Green - x-required: - - post - sort_order: - maximum: 2147483647 - minimum: -2147483648 - type: integer - description: | - The order in which the value will be displayed on the product page. Required in a /POST. - example: 0 - x-required: - - post - value_data: - type: object - properties: {} + The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + enum: + - relative + - percentage + x-nullable: true + adjuster_value: + type: number description: | - Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexadecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. - description: Common Option Value properties. - - type: object + The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + example: 5 + description: Adjuster for Complex Rules. + weight: + type: object properties: - adjusters: - type: object - properties: - price: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - weight: - title: Adjuster - type: object - properties: - adjuster: - type: string - description: | - The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. - enum: - - relative - - percentage - x-nullable: true - adjuster_value: - type: number - description: | - The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. - example: 5 - description: Adjuster for Complex Rules. - image_url: - type: string - description: | - The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. - example: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' - purchasing_disabled: - type: object - properties: - status: - type: boolean - description: | - Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. - message: - type: string - description: | - The message displayed on the storefront when the purchasing disabled status is `true`. - - type: object - properties: - id: - type: integer + adjuster: + type: string + description: | + The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + enum: + - relative + - percentage + x-nullable: true + adjuster_value: + type: number + description: | + The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + example: 5 + description: Adjuster for Complex Rules. + image_url: + type: string description: | - The unique numeric ID of the value; increments sequentially. + The URL for an image displayed on the storefront when the modifier value is selected. Limit of 8MB per file. + example: 'https://cdn8.bigcommerce.com/s-{{store_hash}}/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.1280.1280.jpg?c=2' + purchasing_disabled: + type: object + properties: + status: + type: boolean + description: | + Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + message: + type: string + description: | + The message displayed on the storefront when the purchasing disabled status is `true'. + id: + type: integer + description: | + The unique numeric ID of the value; increments sequentially. description: Common Modifier properties. - type: object properties: From c92cb2b4e6b13b9f7b19185dfb9560bec6f31e72 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 5 Aug 2024 15:34:19 -0500 Subject: [PATCH 123/221] DEVDOCS-6045: [update]added comparison_price and extended_comparison_price (#417) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6045] ## What changed? <!-- Provide a bulleted list in the present tense --> * ## Release notes draft * The newly-released `comparison_price` and `extended_comparison_price` fields are now available to use. Now, you’ll be able to identify the price of a single or line item (product x quantity) used for strike-through. <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6045]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6045?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/checkouts.v3.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index d52507797..cb035d0c6 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -1707,6 +1707,8 @@ paths: sale_price: 33.23 extended_list_price: 31.95 extended_sale_price: 33.23 + comparison_price: 33.23 + extended_comparison_price: 33.23 is_require_shipping: true gift_wrapping: {} is_mutable: true @@ -8091,6 +8093,14 @@ components: type: number description: Sale price of the item multiplied by the quantity. format: double + comparison_price: + type: number + description: The price of a single product used for strike-through. + format: double + extended_comparison_price: + type: number + description: The price of a line item (product * quantity) used for strike-through. + format: double is_require_shipping: type: boolean description: '' @@ -8211,6 +8221,14 @@ components: type: number description: Sale price of the item multiplied by the quantity. format: double + comparison_price: + type: number + description: The price of a single product used for strike-through. + format: double + extended_comparison_price: + type: number + description: The price of a line item (product * quantity) used for strike-through. + format: double required: - quantity gift_certificates: From 2b97481f44f70bfe7ba2ed4d502c79346b06ced0 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 5 Aug 2024 15:35:41 -0500 Subject: [PATCH 124/221] DEVDOCS-6024: [TEST SPEC] changes from testing this endpoint (#383) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? Made changes based on my testing. Outstanding issues: 1. The `is_featured` query parameter does not work as documented. Entering "1" or "true" does not work. 2. What field does the query parameter `inventory_low` related to? Is this the same as `inventory_warning_level`. 3. What field does the query paramter `out_of_stock` related to? 4. The values for the `keyword_context` query parameter give the same result. 5. What are the accepted values for the `status` query parameter? 6. Missing `reviews` and `parent_relations` from the Create a product response body. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/products_catalog.v3.yml | 120 +++++++++++++++++++--- 1 file changed, 103 insertions(+), 17 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 70556add6..fe99a3141 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -114,7 +114,6 @@ paths: - $ref: '#/components/parameters/CategoriesParam' - $ref: '#/components/parameters/KeywordParam' - $ref: '#/components/parameters/KeywordContextParam' - - $ref: '#/components/parameters/StatusParam' - $ref: '#/components/parameters/AvailabilityParam' - $ref: '#/components/parameters/SkuParam' - $ref: '#/components/parameters/SkuInParam' @@ -5318,6 +5317,9 @@ components: description: 'This variant’s retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product’s retail price (set in the Product resource’s `price` field) will be used as the retail price.' format: double nullable: true + map_price: + type: number + description: Minimum Advertised Price. weight: minimum: 0 type: number @@ -5364,6 +5366,11 @@ components: minLength: 0 type: string description: 'If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected.' + image_url: + type: string + description: | + The URL for an image displayed on the storefront when the conditions are applied. Limit of 8MB per file. + example: 'https://cdn8.bigcommerce.com/s-123456/product_images/d/fakeimage.png' upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. @@ -5439,6 +5446,9 @@ components: description: Variant ID sku: type: string + sku_id: + type: integer + example: 70 option_values: type: array description: Array of option and option values IDs that make up this variant. Will be empty if the variant is the productʼs base variant. @@ -5612,24 +5622,32 @@ components: allOf: - type: object properties: - option_display_name: + id: + type: integer + description: The option_value ID. + label: maxLength: 255 minLength: 1 type: string description: | - The name of the option. - example: Color + The label of the option value. + example: Beige x-required: - - post - label: + option_id: + type: integer + description: The option ID. + example: 151 + option_display_name: maxLength: 255 minLength: 1 type: string description: | - The label of the option value. - example: Beige + The name of the option. + example: Color x-required: - post + + - post required: - option_display_name - label @@ -6503,6 +6521,68 @@ components: format: date-time description: Common ProductImage properties. x-internal: false + primaryImage_Full: + title: primaryImage_Full + description: Common PrimaryImage properties. + allOf: + - title: productImage + type: object + properties: + id: + type: integer + description: | + The unique numeric ID of the image; increments sequentially. + product_id: + type: integer + description: | + The unique numeric identifier for the product with which the image is associated. + is_thumbnail: + type: boolean + description: | + Flag for identifying whether the image is used as the productʼs thumbnail. + sort_order: + maximum: 2147483647 + minimum: -2147483648 + type: integer + description: | + The order in which the image will be displayed on the product page. Higher integers give the image a lower priority. When updating, if the image is given a lower priority, all images with a `sort_order` the same as or greater than the imageʼs new `sort_order` value will have their `sort_order`s reordered. + description: + type: string + description: | + The description for the image. + image_file: + type: string + description: | + The local path to the original image file uploaded to BigCommerce. Use image_url when creating a product. + + Must be sent as a `multipart/form-data` field in the request body. Limit of 8 MB per file. + url_zoom: + readOnly: true + type: string + description: | + The zoom URL for this image. By default, this is used as the zoom image on product pages when zoom images are enabled. You should provide an image smaller than 1280x1280; otherwise, the API returns a resized image. + url_standard: + readOnly: true + type: string + description: | + The standard URL for this image. By default, this is used for product-page images. + url_thumbnail: + readOnly: true + type: string + description: | + The thumbnail URL for this image. By default, this is the image size used on the category page and in side panels. + url_tiny: + readOnly: true + type: string + description: | + The tiny URL for this image. By default, this is the image size used for thumbnails beneath the product image on a product page. + date_modified: + type: string + description: | + The date on which the product image was modified. + format: date-time + description: Common PrimaryImage properties. + x-internal: false product_Put_Collection: title: product_Put_Collection description: The model for batch updating products. @@ -7773,6 +7853,8 @@ components: type: array items: $ref: '#/components/schemas/productImage_Full' + primary_image: + $ref: '#/components/schemas/primaryImage_Full' videos: type: array description: | @@ -8985,6 +9067,8 @@ components: - modifiers - options - videos + - reviews + - parent_relations IdMinParam: name: 'id:min' in: query @@ -9061,10 +9145,11 @@ components: DateModifiedParam: name: date_modified in: query + example: 2024-07-18 description: 'Filter items by `date_modified`.' schema: type: string - format: date-time + format: date DateModifiedMaxParam: name: 'date_modified:max' in: query @@ -9083,31 +9168,39 @@ components: description: Filter items by date_last_imported. schema: type: string - format: date-time + format: date + example: 2020-07-18 DateLastImportedNotParam: name: 'date_last_imported:not' in: query description: 'Filter products by specifying a date they were NOT last imported. For example, `date_last_imported:not=2015-08-21T22%3A53%3A23%2B00%3A00`.' schema: type: string + format: date + example: 2020-07-18 DateLastImportedMaxParam: name: 'date_last_imported:max' in: query description: 'Filter items by date_last_imported. For example, `date_last_imported:max=2015-08-21T22%3A53%3A23%2B00%3A00`.' schema: type: string + format: date + example: 2020-07-18 DateLastImportedMinParam: name: 'date_last_imported:min' in: query description: 'Filter items by date_last_imported. For example, `date_last_imported:min=2015-08-21T22%3A53%3A23%2B00%3A00`.' schema: type: string + format: date + example: 2020-07-18 IsVisibleParam: name: is_visible in: query description: Filter items based on whether the product is currently visible on the storefront. schema: type: boolean + example: true IsFeaturedParam: name: is_featured in: query @@ -9223,13 +9316,6 @@ components: enum: - shopper - merchant - StatusParam: - name: status - in: query - description: | - Filter items by status. - schema: - type: integer AvailabilityParam: name: availability in: query From da597df8b14a0b2914eda0026e31a1d0ce094407 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 5 Aug 2024 15:41:32 -0500 Subject: [PATCH 125/221] DEVDOCS-6043: [update] add Rosetta back for Macs (#418) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6043] ## What changed? Add installation steps for Rosetta ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6043]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6043?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- docs/storefront/stencil/cli/install.mdx | 33 +++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/docs/storefront/stencil/cli/install.mdx b/docs/storefront/stencil/cli/install.mdx index d19ed3f2e..21a19f2a3 100644 --- a/docs/storefront/stencil/cli/install.mdx +++ b/docs/storefront/stencil/cli/install.mdx @@ -12,11 +12,13 @@ Stencil CLI allows developers to locally edit and preview themes without impacti This article contains detailed instructions on installing and configuring Stencil CLI, the first step towards developing Stencil themes for BigCommerce storefronts. - ## Installing on Mac -To install Stencil CLI and its dependencies on Mac, open a terminal and run the following commands. Refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli) for latest `node` version supported. +There are different options for installing Stencil CLI and its dependencies on a Mac. + +### Option 1: ARM based macs +To install Stencil CLI and its dependencies on Mac, open a terminal and run the following commands. For the latest `node` version supported, refer to [Stencil CLI README.MD](https://github.com/bigcommerce/stencil-cli). ```shell showLineNumbers copy # For ARM based macs @@ -35,6 +37,33 @@ nvm use 18.15.0 npm install -g @bigcommerce/stencil-cli ``` +### Option 2: Macs with M1 chip + +Installing Stencil CLI and its dependencies on Macs that use Apple silicon, such as the M1 chip, requires Rosetta. Rosetta allows a Mac with Apple silicon to use apps built for a Mac with an Intel processor. + +To open the Rosetta terminal: + +1. Open **Finder**. +2. Go to **Applications** > **Utilities** > **Terminal**. +3. Right-click **Terminal** and select **Get Info**. +4. Check the **Open using Rosetta** checkbox. +5. Close the window and quit all terminal instances. +6. Start a new terminal, and install Rosetta if prompted. + +Run the following commands: + +```shell showLineNumbers copy +# Install Stencil CLI supported version of Node.js +nvm install 18.15.0 + +# Switch to Stencil CLI supported version of Node.js +nvm use 18.15.0 + +# Install Stencil CLI +npm install -g @bigcommerce/stencil-cli +``` + + ## Installing on Windows There are two methods for installing Stencil CLI and its dependencies on Windows. From 0d14dcb6060e408dcd58c81aa0b3b10e5df966cf Mon Sep 17 00:00:00 2001 From: Mark Murphy <mark@murphymark.me> Date: Mon, 5 Aug 2024 16:54:36 -0400 Subject: [PATCH 126/221] Add in missing branch updates in B2B refs --- docs/b2b-edition/models/company/company.yaml | 2 +- .../models/super_admin/super_admin.yaml | 2 +- .../models/user/user-without-company.yaml | 4 +- docs/b2b-edition/models/user/user.yaml | 4 +- docs/b2b-edition/specs/api-v2/openAPI.json | 20 +++---- .../specs/api-v3/address/address.yaml | 22 ++++---- .../specs/api-v3/authentication.yaml | 2 +- .../specs/api-v3/company/company.yaml | 20 +++---- .../invoice_management/invoice/invoice.yaml | 22 ++++---- .../b2b-edition/specs/api-v3/order/order.yaml | 52 +++++++++---------- .../specs/api-v3/payment/payment.yaml | 10 ++-- .../specs/api-v3/sales_staff/sales_staff.yaml | 10 ++-- .../api-v3/shopping_list/shopping_list.yaml | 12 ++--- .../specs/api-v3/super_admin/super_admin.yaml | 30 +++++------ docs/b2b-edition/specs/api-v3/task/task.yaml | 2 +- docs/b2b-edition/specs/api-v3/user/user.yaml | 50 +++++++++--------- .../invoice_protal/receipet/receipt.yaml | 10 ++-- .../specs/storefront/storefront/company.yaml | 14 ++--- .../specs/storefront/storefront/order.yaml | 2 +- 19 files changed, 145 insertions(+), 145 deletions(-) diff --git a/docs/b2b-edition/models/company/company.yaml b/docs/b2b-edition/models/company/company.yaml index 0fcbfdcc5..532258c75 100644 --- a/docs/b2b-edition/models/company/company.yaml +++ b/docs/b2b-edition/models/company/company.yaml @@ -37,7 +37,7 @@ allOf: - createdAt - updatedAt - catalogId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/company/company_base.yaml x-examples: example-1: id: 1 diff --git a/docs/b2b-edition/models/super_admin/super_admin.yaml b/docs/b2b-edition/models/super_admin/super_admin.yaml index f752c8253..8ef20da7e 100644 --- a/docs/b2b-edition/models/super_admin/super_admin.yaml +++ b/docs/b2b-edition/models/super_admin/super_admin.yaml @@ -17,7 +17,7 @@ allOf: description: Update timestamp of the SuperAdmin example: 1620872672 readOnly: true - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin_base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/super_admin/super_admin_base.yaml x-examples: example-1: id: 1 diff --git a/docs/b2b-edition/models/user/user-without-company.yaml b/docs/b2b-edition/models/user/user-without-company.yaml index fdd609b17..ebe5dec80 100644 --- a/docs/b2b-edition/models/user/user-without-company.yaml +++ b/docs/b2b-edition/models/user/user-without-company.yaml @@ -26,8 +26,8 @@ allOf: readOnly: true required: - id - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base-without-company.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base-without-company.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml x-examples: example-1: id: 1 diff --git a/docs/b2b-edition/models/user/user.yaml b/docs/b2b-edition/models/user/user.yaml index b75b2f684..7d2c3fe06 100644 --- a/docs/b2b-edition/models/user/user.yaml +++ b/docs/b2b-edition/models/user/user.yaml @@ -39,8 +39,8 @@ allOf: description: Channel icon url required: - id - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml x-examples: example-1: id: 1 diff --git a/docs/b2b-edition/specs/api-v2/openAPI.json b/docs/b2b-edition/specs/api-v2/openAPI.json index b39aacfa6..b0a693c6c 100644 --- a/docs/b2b-edition/specs/api-v2/openAPI.json +++ b/docs/b2b-edition/specs/api-v2/openAPI.json @@ -337,7 +337,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml" } ] } @@ -511,7 +511,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" } ] } @@ -3417,7 +3417,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" } ] } @@ -3631,7 +3631,7 @@ } }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] } @@ -3823,7 +3823,7 @@ } }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] } @@ -4006,7 +4006,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] }, @@ -4208,7 +4208,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] } @@ -4427,7 +4427,7 @@ ] }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] } @@ -4752,7 +4752,7 @@ } }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" } ] }, @@ -6630,7 +6630,7 @@ } }, { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml" + "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" } ] }, diff --git a/docs/b2b-edition/specs/api-v3/address/address.yaml b/docs/b2b-edition/specs/api-v3/address/address.yaml index 0a16646bb..ee55666af 100644 --- a/docs/b2b-edition/specs/api-v3/address/address.yaml +++ b/docs/b2b-edition/specs/api-v3/address/address.yaml @@ -302,7 +302,7 @@ paths: uniqueItems: true minItems: 1 items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/address/address.yaml meta: type: object required: @@ -522,7 +522,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/address/address.yaml examples: {} tags: - Address @@ -575,7 +575,7 @@ paths: code: type: number data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/address/address.yaml meta: type: object required: @@ -1113,7 +1113,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml examples: example-1: value: @@ -1161,7 +1161,7 @@ paths: required: - id - _detail - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/address/address.yaml meta: type: object required: @@ -1213,7 +1213,7 @@ paths: schema: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/address/address.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/address/address.yaml examples: {} parameters: [] /addresses/extra-fields: @@ -1228,14 +1228,14 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - properties: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_fields.yaml meta: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml type: object examples: example-1: @@ -1285,8 +1285,8 @@ paths: security: - authToken: [] parameters: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit components: parameters: limit: diff --git a/docs/b2b-edition/specs/api-v3/authentication.yaml b/docs/b2b-edition/specs/api-v3/authentication.yaml index dc01b15d5..eb819b2f2 100644 --- a/docs/b2b-edition/specs/api-v3/authentication.yaml +++ b/docs/b2b-edition/specs/api-v3/authentication.yaml @@ -165,7 +165,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: diff --git a/docs/b2b-edition/specs/api-v3/company/company.yaml b/docs/b2b-edition/specs/api-v3/company/company.yaml index 77ddc2bca..948a63a3b 100644 --- a/docs/b2b-edition/specs/api-v3/company/company.yaml +++ b/docs/b2b-edition/specs/api-v3/company/company.yaml @@ -319,7 +319,7 @@ paths: type: string required: - message - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml required: - code - data @@ -441,8 +441,8 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml - type: object required: - companyName @@ -1169,8 +1169,8 @@ paths: - country - adminEmail - adminPhoneNumber - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml examples: example-1: value: @@ -1500,7 +1500,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml examples: example-1: value: @@ -1540,7 +1540,7 @@ paths: required: - id - _detail - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/company/company_base.yaml meta: type: object required: @@ -1573,7 +1573,7 @@ paths: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/company/company_base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/company/company_base.yaml - type: object properties: acceptWelcomeEmail: @@ -1596,7 +1596,7 @@ paths: originChannelId: type: integer description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml examples: example-1: value: @@ -1835,7 +1835,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml security: - authToken: [] x-codegen-request-body-name: body diff --git a/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml b/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml index c48d1ea78..a02064f5e 100644 --- a/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml +++ b/docs/b2b-edition/specs/api-v3/invoice_management/invoice/invoice.yaml @@ -88,8 +88,8 @@ paths: type: number data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/invoice.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/invoice.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: type: object required: @@ -665,7 +665,7 @@ paths: externalPdfUrl: type: string description: The url of your external PDF file. The recommended file size should not exceed 5Mb. Please make sure that your file service has processed CORS. Using empty value if you want to delete it. - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: Update body with details field: value: @@ -1021,7 +1021,7 @@ paths: - originalBalance - openBalance - customerId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: Invoice body with details info: value: @@ -1152,8 +1152,8 @@ paths: minItems: 1 items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/invoice.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/invoice.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: type: object x-stoplight: @@ -1521,17 +1521,17 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_fields.yaml meta: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml operationId: get-invoices-extra-fields description: Get invoice extra field configs parameters: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit diff --git a/docs/b2b-edition/specs/api-v3/order/order.yaml b/docs/b2b-edition/specs/api-v3/order/order.yaml index 920ce0f7a..26dbd5810 100644 --- a/docs/b2b-edition/specs/api-v3/order/order.yaml +++ b/docs/b2b-edition/specs/api-v3/order/order.yaml @@ -56,9 +56,9 @@ paths: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml type: object examples: without-extra-fields: @@ -260,13 +260,13 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml description: Successful created examples: example-1: @@ -323,8 +323,8 @@ paths: required: - bcOrderId - customerId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -364,14 +364,14 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -432,13 +432,13 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml examples: example-1: value: @@ -498,8 +498,8 @@ paths: x-stoplight: id: 5l2853rc7hqzc description: Sync channel info from BC. Only can be used when MSF is enabled. - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -528,7 +528,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -585,14 +585,14 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-product.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-product.yaml - type: object properties: productId: @@ -642,7 +642,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -676,20 +676,20 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_fields.yaml meta: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml operationId: get-orders-extra-fields description: Get order extra field configs parameters: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/user/user.yaml#/components/parameters/limit components: schemas: {} parameters: diff --git a/docs/b2b-edition/specs/api-v3/payment/payment.yaml b/docs/b2b-edition/specs/api-v3/payment/payment.yaml index 6e34318e5..e8f1feb61 100644 --- a/docs/b2b-edition/specs/api-v3/payment/payment.yaml +++ b/docs/b2b-edition/specs/api-v3/payment/payment.yaml @@ -24,14 +24,14 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/payment/payment.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/payment/payment.yaml - type: object properties: id: @@ -76,14 +76,14 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/payment/payment.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/payment/payment.yaml - type: object properties: isEnabled: @@ -125,7 +125,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: diff --git a/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml b/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml index 19dd8b095..a5518d916 100644 --- a/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml +++ b/docs/b2b-edition/specs/api-v3/sales_staff/sales_staff.yaml @@ -33,7 +33,7 @@ paths: properties: message: type: string - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml code: type: integer x-stoplight: @@ -56,9 +56,9 @@ paths: security: - authToken: [] parameters: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/limit - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/offset - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/orderBy + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml#/components/parameters/orderBy - schema: type: string in: query @@ -303,7 +303,7 @@ paths: minLength: 1 description: 'bc group name ' example: google - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml examples: example-1: value: diff --git a/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml b/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml index 5fb81533e..38e06cedb 100644 --- a/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml +++ b/docs/b2b-edition/specs/api-v3/shopping_list/shopping_list.yaml @@ -24,11 +24,11 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: meta: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml - type: object properties: data: @@ -81,7 +81,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -179,7 +179,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -285,7 +285,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -428,7 +428,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: diff --git a/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml b/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml index c771e537a..05b2e7812 100644 --- a/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml +++ b/docs/b2b-edition/specs/api-v3/super_admin/super_admin.yaml @@ -38,7 +38,7 @@ paths: minItems: 1 items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/super_admin/super_admin.yaml - type: object properties: email: @@ -64,7 +64,7 @@ paths: phone: type: string description: Phone number of super admin - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: allOf: - type: object @@ -74,7 +74,7 @@ paths: minLength: 1 required: - message - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml required: - code - data @@ -310,7 +310,7 @@ paths: items: allOf: - allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/super_admin/super_admin.yaml - type: object properties: companyCount: @@ -338,7 +338,7 @@ paths: phone: type: string description: Phone number of super admin - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: allOf: - type: object @@ -348,7 +348,7 @@ paths: minLength: 1 required: - message - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml required: - code - data @@ -523,7 +523,7 @@ paths: minLength: 1 required: - message - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml required: - code - data @@ -669,7 +669,7 @@ paths: - firstName - lastName - email - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -899,7 +899,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml '422': description: SuperAdmin was not valid. This is the result of missing required fields or invalid data. See the response for more details. content: @@ -1011,7 +1011,7 @@ paths: - phone - email - uuid - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -1055,7 +1055,7 @@ paths: type: integer data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/super_admin/super_admin.yaml - type: object properties: uuid: @@ -1078,7 +1078,7 @@ paths: iconUrl: type: string description: Icon url - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: type: object properties: @@ -1106,7 +1106,7 @@ paths: type: integer data: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/super_admin/super_admin.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/super_admin/super_admin.yaml - type: object properties: uuid: @@ -1129,7 +1129,7 @@ paths: iconUrl: type: string description: Icon url - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml meta: type: object properties: @@ -1161,7 +1161,7 @@ paths: description: BigCommerce channel ids. items: type: integer - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml description: '' description: Update super admin info tags: diff --git a/docs/b2b-edition/specs/api-v3/task/task.yaml b/docs/b2b-edition/specs/api-v3/task/task.yaml index b525ebe8f..7c18ef156 100644 --- a/docs/b2b-edition/specs/api-v3/task/task.yaml +++ b/docs/b2b-edition/specs/api-v3/task/task.yaml @@ -190,7 +190,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml '422': description: Company was not valid. This is the result of missing required fields or invalid data. See the response for more details. content: diff --git a/docs/b2b-edition/specs/api-v3/user/user.yaml b/docs/b2b-edition/specs/api-v3/user/user.yaml index 63fad93c7..0b80cf2ca 100644 --- a/docs/b2b-edition/specs/api-v3/user/user.yaml +++ b/docs/b2b-edition/specs/api-v3/user/user.yaml @@ -33,11 +33,11 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user.yaml examples: {} example-1: example: @@ -80,7 +80,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-without-company.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-without-company.yaml - type: object properties: channelIds: @@ -111,11 +111,11 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user.yaml examples: example-1: value: @@ -176,7 +176,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -317,18 +317,18 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user.yaml - type: object properties: meta: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml examples: {} example-1: example: @@ -362,7 +362,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base.yaml - type: object properties: companyId: @@ -390,7 +390,7 @@ paths: description: 'The company role id. This field is only applicable to the company''s RBAC feature. If your store doesn''t utilize this feature, please do not use this field. When it has a value, it will override the value of the role field.' required: - companyId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -417,7 +417,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -516,7 +516,7 @@ paths: description: Request body items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base.yaml - type: object properties: acceptWelcomeEmail: @@ -544,7 +544,7 @@ paths: description: 'The company role id. This field is only applicable to the company''s RBAC feature. If your store doesn''t utilize this feature, please do not use this field. When it has a value, it will override the value of the role field.' required: - companyId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -569,7 +569,7 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: @@ -634,7 +634,7 @@ paths: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base.yaml - type: object properties: _detail: @@ -662,7 +662,7 @@ paths: content: application/json: schema: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-413.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-413.yaml examples: example-1: value: @@ -690,7 +690,7 @@ paths: type: array items: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user-base.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user-base.yaml - type: object properties: _detail: @@ -762,11 +762,11 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/user/user.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/user/user.yaml examples: {} example-1: example: @@ -806,17 +806,17 @@ paths: application/json: schema: allOf: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/response-object.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/response-object.yaml - type: object properties: data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_fields.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_fields.yaml meta: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/utils/pagination.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/utils/pagination.yaml operationId: get-users-extra-fields parameters: - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/limit + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/specs/storefront/storefront.yaml#/components/parameters/offset security: - authToken: [] components: diff --git a/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml b/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml index 5adba9c29..408c38ad3 100644 --- a/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml +++ b/docs/b2b-edition/specs/storefront/invoice_protal/receipet/receipt.yaml @@ -102,7 +102,7 @@ paths: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/receipt.yaml meta: type: object properties: @@ -210,7 +210,7 @@ paths: type: number description: Response code of success request data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/receipt.yaml meta: type: object properties: @@ -265,7 +265,7 @@ paths: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/receipt_line.yaml meta: type: object properties: @@ -355,7 +355,7 @@ paths: data: type: array items: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/receipt_line.yaml meta: type: object properties: @@ -456,7 +456,7 @@ paths: code: type: number data: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/invoice_portal/receipt_line.yaml + $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/invoice_portal/receipt_line.yaml meta: type: object properties: diff --git a/docs/b2b-edition/specs/storefront/storefront/company.yaml b/docs/b2b-edition/specs/storefront/storefront/company.yaml index 955aa646c..8fd985b40 100644 --- a/docs/b2b-edition/specs/storefront/storefront/company.yaml +++ b/docs/b2b-edition/specs/storefront/storefront/company.yaml @@ -2956,7 +2956,7 @@ paths: - state - phoneNumber - label - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml defaultShippingId: type: string minLength: 1 @@ -3074,7 +3074,7 @@ paths: - city - country - firstName - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-1: value: @@ -3592,7 +3592,7 @@ paths: - isDefaultShipping - isDefaultBilling - label - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml defaultAddressIds: type: object required: @@ -3860,7 +3860,7 @@ paths: - isDefaultShipping - isDefaultBilling - addressId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml required: - code - message @@ -4049,7 +4049,7 @@ paths: - isDefaultShipping - isDefaultBilling - addressId - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml examples: example-2: value: @@ -4378,7 +4378,7 @@ paths: - phoneNumber - zipCode - label - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml billing: description: Company default billing address allOf: @@ -4447,7 +4447,7 @@ paths: - phoneNumber - zipCode - label - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/extra_fields/extra_field_values.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml required: - code - message diff --git a/docs/b2b-edition/specs/storefront/storefront/order.yaml b/docs/b2b-edition/specs/storefront/storefront/order.yaml index ba246fe14..b7ad274cf 100644 --- a/docs/b2b-edition/specs/storefront/storefront/order.yaml +++ b/docs/b2b-edition/specs/storefront/storefront/order.yaml @@ -1500,7 +1500,7 @@ paths: - shipments - poNumber - money - - $ref: https://raw.githubusercontent.com/bigcommerce/docs/b3-test/docs/b2b-edition/models/order/order-extra.yaml + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml required: - code - message From ffbf3ae40bf9ba2f39149469f28365b6da5f8813 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:22:54 -0500 Subject: [PATCH 127/221] DEVDOCS-6025 [update]: Get Prices (batch), add saved & reference_request fields (#392) --- reference/pricing.sf.yml | 575 +++++++++++++++++++++------------------ 1 file changed, 311 insertions(+), 264 deletions(-) diff --git a/reference/pricing.sf.yml b/reference/pricing.sf.yml index 0c58b3119..a6086a157 100644 --- a/reference/pricing.sf.yml +++ b/reference/pricing.sf.yml @@ -102,183 +102,196 @@ paths: data: type: array items: - type: object - properties: - product_id: - type: integer - description: The (required) product ID of the item. - variant_id: - type: integer - description: The (optional) variant ID of the item. - options: - type: array - description: The optional product option configuration for which this price was generated. - - items: - type: object - properties: - option_id: - type: integer - description: The ID of the variant option or modifier option configured for this price. - value_id: - type: integer - description: The selected value ID for the configured option. - retail_price: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The (optional) RRP/retail price configured for this product. Used for price comparison and storefront display purposes. - sale_price: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The merchant-entered sale price for a product overwrites the default price. The sale_price is optional. - minimum_advertised_price: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The minimum advertised price (MAP) allowed to be shown on a storefront. A value supplied by the merchant and used for display purposes. - price: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The merchant-entered price for a product could be including or excluding tax. Price must be defined when creating a product and serves as the default price. - calculated_price: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The shopper price for a product including modifier, option, and option set rules. The `calculated_price` may include or exclude estimates for tax. - price_range: - type: object - properties: - minimum: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. - maximum: - type: object - properties: - as_entered: - type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. - entered_inclusive: - type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. - tax_exclusive: - type: number - description: The estimated tax exclusive price for this product based on the provided customer group. - tax_inclusive: - type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. - description: The minimum and maximum price that will typically apply to this product. Only used for complex products (products with variants). - retail_price_range: - type: object - properties: - minimum: + allOf: + - $ref: '#/components/schemas/ReferenceRequest' + - type: object + properties: + reference_request: + $ref: '#/components/schemas/ReferenceRequest' + - type: object + properties: + retail_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. - maximum: + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The (optional) RRP/retail price configured for this product and used for price comparison and storefront display purposes. + sale_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. - description: The productʼs variants that will typically apply to this product. - bulk_pricing: - type: array - items: - $ref: '#/components/schemas/BulkPricingTier' + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The merchant-entered sale price for a product overwrites the default price. The `sale_price` is optional. + + minimum_advertised_price: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + + description: The minimum advertised price (MAP) you can display on a storefront. A value supplied by the merchant and used for display purposes. + + saved: + type: object + description: The amount that merchants save, determined by the difference between `retail_price` and `calculated_price`. + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + + price: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The merchant-entered price for a product, which could include or exclude tax. When creating a product, you must define the price, which serves as the default price. + + calculated_price: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The shopper price for a product, which includes modifier, option, and option set rules. The `calculated_price` may include or exclude estimates for tax. + price_range: + type: object + properties: + minimum: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. + maximum: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. + description: The minimum and maximum price that will typically apply to this product. Only used for complex products (products with variants). + retail_price_range: + type: object + properties: + minimum: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. + maximum: + type: object + properties: + as_entered: + type: number + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. + entered_inclusive: + type: boolean + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. + tax_exclusive: + type: number + description: The estimated tax-exclusive price for this product based on the provided customer group. + tax_inclusive: + type: number + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. + description: The productʼs variants that will typically apply to this product. + bulk_pricing: + type: array + items: + $ref: '#/components/schemas/BulkPricingTier' meta: type: object properties: {} @@ -291,6 +304,12 @@ paths: options: - option_id: 1 value_id: 1 + reference_request: + product_id: 1 + variant_id: 1 + options: + - option_id: 1 + value_id: 1 retail_price: as_entered: 1.5 entered_inclusive: true @@ -306,6 +325,11 @@ paths: entered_inclusive: true tax_exclusive: 1.1 tax_inclusive: 1.5 + saved: + as_entered: 1.5 + entered_inclusive: true + tax_exclusive: 1.1 + tax_inclusive: 1.5 price: as_entered: 1.5 entered_inclusive: true @@ -351,6 +375,29 @@ paths: meta: {} components: schemas: + ReferenceRequest: + type: object + description: You can use the original details of the request to identify the exact product variant and fetch prices. + + properties: + product_id: + type: integer + description: The (required) product ID of the item. + variant_id: + type: integer + description: The (optional) variant ID of the item. + options: + type: array + description: The optional product option configuration for this generated price. + items: + type: object + properties: + option_id: + type: integer + description: The ID of the variant option or modifier option configured for this price. + value_id: + type: integer + description: The selected value ID for the configured option. BulkPricingTier: type: object properties: @@ -376,13 +423,13 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. + description: The estimated tax-inclusive price for this product based on the provided customer group. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. entered_inclusive: type: boolean description: Determines whether the 'as_entered' price is inclusive or exclusive of tax based on the store's tax jurisdiction. @@ -418,81 +465,81 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. + description: The estimated tax-inclusive price for this product based on the provided customer group. description: The (optional) RRP/retail price configured for this product. sale_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. minimum_advertised_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. calculated_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. price_range: type: object properties: @@ -501,33 +548,33 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. maximum: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. description: For estimated prices, the minimum/maximum price that will typically apply to this product. retail_price_range: type: object @@ -537,32 +584,32 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. maximum: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. + description: The estimated tax-inclusive price for this product based on the provided customer group. description: The price for a product including estimates for tax description: For estimated prices, the minimum/maximum price that will typically apply to this product. bulk_pricing: @@ -594,13 +641,13 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. + description: The estimated tax-inclusive price for this product based on the provided customer group. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. entered_inclusive: type: boolean description: Determines whether the 'as_entered' price is inclusive or exclusive of tax based on the store's tax jurisdiction. @@ -618,33 +665,33 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. maximum: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. description: For estimated prices, the minimum/maximum price that will typically apply to this product. x-internal: false TaxPrice: @@ -652,17 +699,17 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. x-internal: false ItemPricing: type: object @@ -691,81 +738,81 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. + description: The estimated tax-inclusive price for this product based on the provided customer group. description: The (optional) RRP/retail price configured for this product. sale_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. minimum_advertised_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. calculated_price: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. price_range: type: object properties: @@ -774,33 +821,33 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. maximum: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean description: Determines whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax. jurisdiction tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. description: For estimated prices, the minimum/maximum price that will typically apply to this product. retail_price_range: type: object @@ -810,33 +857,33 @@ components: properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. maximum: type: object properties: as_entered: type: number - description: The price provided by the merchant as entered in their catalog/price list; may include or exclude tax. + description: The price provided by the merchant, as entered in their catalog/price list; may include or exclude tax. entered_inclusive: type: boolean - description: Whether the `as_entered` price is inclusive or exclusive of tax, based on the stores tax jurisdiction. + description: Whether the `as_entered` price is inclusive or exclusive of tax, based on the store's tax jurisdiction. tax_exclusive: type: number - description: The estimated tax exclusive price for this product based on the provided customer group. + description: The estimated tax-exclusive price for this product based on the provided customer group. tax_inclusive: type: number - description: The estimated tax inclusive price for this product based on the provided customer group. - description: The price for a product including estimates for tax. + description: The estimated tax-inclusive price for this product based on the provided customer group. + description: The price for a product, including estimates for tax. description: For estimated prices, the minimum/maximum price that will typically apply to this product. bulk_pricing: type: array From 1395ade30b349f6b9df889cfcf35c83cc9bff6e0 Mon Sep 17 00:00:00 2001 From: Katie Hoesley <39041092+katiehoesley@users.noreply.github.com> Date: Wed, 7 Aug 2024 08:32:35 -0600 Subject: [PATCH 128/221] updates readme (#421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-] ## What changed? <!-- Provide a bulleted list in the present tense --> * Developer relations team ReadMe updates ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- README.md | 45 ++++++++++++----- assets/images/bcdevs-logo.png | Bin 0 -> 59483 bytes .../images/testing-api-spec-rendering-1.png | Bin 0 -> 293478 bytes .../images/testing-api-spec-rendering-3.png | Bin 0 -> 247705 bytes .../images/testing-api-spec-rendering-4.png | Bin 0 -> 110546 bytes .../images/testing-api-spec-rendering-5.png | Bin 0 -> 5970 bytes .../images/testing-api-spec-rendering-6.png | Bin 0 -> 99655 bytes .../images/testing-api-spec-rendering-7.png | Bin 0 -> 461803 bytes .../images/testing-api-spec-rendering-8.png | Bin 0 -> 240406 bytes assets/images/testing-spec-rendering-2.png | Bin 0 -> 42455 bytes guides/create-a-site-preview.md | 36 ++++++++++++++ ...test-rendering-of-api-spec-file-changes.md | 47 ++++++++++++++++++ 12 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 assets/images/bcdevs-logo.png create mode 100644 assets/images/testing-api-spec-rendering-1.png create mode 100644 assets/images/testing-api-spec-rendering-3.png create mode 100644 assets/images/testing-api-spec-rendering-4.png create mode 100644 assets/images/testing-api-spec-rendering-5.png create mode 100644 assets/images/testing-api-spec-rendering-6.png create mode 100644 assets/images/testing-api-spec-rendering-7.png create mode 100644 assets/images/testing-api-spec-rendering-8.png create mode 100644 assets/images/testing-spec-rendering-2.png create mode 100644 guides/create-a-site-preview.md create mode 100644 guides/test-rendering-of-api-spec-file-changes.md diff --git a/README.md b/README.md index 843a8a1a0..83ab0806a 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,54 @@ -# BigCommerce public developer documentation +<p align="center"> + <img alt="bcdevs logo" src="./assets/images/bcdevs-logo.png" width="100px" /> + <h1 align="center">BigCommerce developer documentation</h1> +</p> -This repo is the source of truth for the public, open source BigCommerce DevDocs and API reference at [developer.bigcommerce.com](https://developer.bigcommerce.com). It consists of **Markdown React (.mdx)**, **OpenAPI Specification (.yml)**, and **JSON Schema (.json and .yml)** files. +You've found the BigCommerce documentation GitHub repository, which contains the public content for the [BigCommerce Developer Center](https://developer.bigcommerce.com/docs). + +This repo is the source of truth for our public, open source documentation and API reference at [developer.bigcommerce.com](https://developer.bigcommerce.com). It consists of **Markdown React (.mdx)**, **OpenAPI Specification (.yml)**, and **JSON Schema (.json and .yml)** files. The BigCommerce DX team maintains these open source docs; we welcome your [issues](https://github.com/bigcommerce/docs/issues), [discussions](https://github.com/bigcommerce/docs/discussions), and [pull requests](https://github.com/bigcommerce/docs/pulls)! +--- + ## Contributing +Thanks for your interest in contributing to our documentation! Below are a few quick ways to get started: + +### 👉 To make a change +Here are some quick links to our [Contribution](/CONTRIBUTING.md) guide: -If you're interested in contributing, see our [Contribution guide](CONTRIBUTING.md) and [Code of conduct](CODE_OF_CONDUCT.md). +- [Making a Quick Edit](/CONTRIBUTING.md#making-a-quick-edit) +- [Editing Locally](/CONTRIBUTING.md#editing-locally) +- [Commit Messages](/CONTRIBUTING.md/cod#commit-messages) +- [Style Guides](/CONTRIBUTING.md#style-guides) +- [Contributing to Other Projects](/CONTRIBUTING.md#contributing-to-other-projects) -## History +### 👉 To discuss something +- Start a [Discussion](https://github.com/bigcommerce/docs/discussions). Our DevDocs team monitors GitHub Discussions regularly. -On December 27, 2023, the following public documentation repositories were deprecated, and all documentation moved into this repository. We retained the `git` history of each document using the `--allow-unrelated-histories` flag. The following repositories are now read-only: +### 👉 To report a bug or an issue you've encountered +- Open a new [Issue](https://github.com/bigcommerce/docs/issues). Our DevDocs team monitors GitHub Issues regularly. -* `https://github.com/bigcommerce/api-specs` -* `https://github.com/bigcommerce/dev-docs` -* `https://github.com/bigcommerce/theme-context-object-schemas` +<br/> -### API specifications +*For more information, see our [Contribution Guidelines](./CONTRIBUTING.md) and [Code of conduct](./CODE_OF_CONDUCT.md).* + +--- + +## API specifications If you maintain API clients, this repository is your source for the most up-to-date public API specifications. -Please keep your fork up to date to ensure you're working with the newest source files. +Always update your fork to ensure you're working with the newest source files. -Significant dates include the following: +<!-- Significant dates include the following: * As of August 22, 2022, all API specification files are in OAS 3+ format. * In March 2023, we made significant changes to support a new OAS parser at [developer.bigcommerce.com](https://developer.bigcommerce.com). * In May 2023, we subdivided both the Catalog and Payments API specifications into multiple files. -* On December 27, 2023, all public docs moved into the [bigcommerce/docs](https://github.com/bigcommerce/docs) repo. +* On December 27, 2023, all public docs moved into the [bigcommerce/docs](https://github.com/bigcommerce/docs) repo. --> + -<!-- ## Directory structure ```shell diff --git a/assets/images/bcdevs-logo.png b/assets/images/bcdevs-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..591ec3815001b6b2238ece0b387168871d0b16a2 GIT binary patch literal 59483 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 LFJX$#*aZK7+Xr|9 literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-1.png b/assets/images/testing-api-spec-rendering-1.png new file mode 100644 index 0000000000000000000000000000000000000000..79884eddd4c42125c1c0a0ed44d8c250268340aa GIT binary patch literal 293478 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 H+>?8yB+_Ue$vdQ0WQb&tua@V}=Fg1PFw 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∨S4y)>E(Qa;#H#-3>fu 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 KS1bN<e)vBGD`boS literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-3.png b/assets/images/testing-api-spec-rendering-3.png new file mode 100644 index 0000000000000000000000000000000000000000..33ce4e53517f12aa034c610e79e053ddb54b71d1 GIT binary patch literal 247705 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%0D(CgCo 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 ~-sx-POZVy9Xv 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 z%0D~ymDQRjS9W*lB^Rgi6%w!RlTSZ$+jl(Y?w)_I6KTK|DwxlF^6FJ@a0LqFRsQ*_ zg{7S<fBYNw`WtV$jSoHMq#P>D;y<oxm5Ofa#4*Czve+7%H7Y)b6e-+qS_k5Xw`$(l z)vH@WbMjR-C*$Xcq-+>~f@9n}@(&aUU~BslTGK9Gc&F9px7_!sv>EHbJ2GX=U_N!d zIyGF@EScQ}7hYigg+JGSbogUiBTL=FDNxCLz`C`nyBb<E=DaqWyYk8_?7i^)_dmJ= z2j7$LvE3;xkF}v%mFwN;5d&R8*#KOHBBcta&37j?N~gdm^D(pNx)sWmcDaO4WY3<( z>eJ?}(<ZYM0p8lf{fpRRb&MS~$Te?zQv&}PJ19koTeI#V+5cI0)m2xzy0xpzcdaUa zzo3r2)@h^NiLm1iynE2Syz4dh=wn;mFTebsyW#qB=8reNsjjV?{db#GP~7~5_sP$G z%C6h7eM>if>@fSBoc~Bc$9#2gBie<{@qK7>r;e>%=MJr0j_lczQ)RM_ePH7z^Ubu$ zZR2Lrgps=E@-`N^*Ngv{cSO{(<D}wi^$#A<)5aV97pv^on8WW?K#vny!&RzS&aknH z70Nh#I>rd&P6{v@^KY3gq^6|t>&%z9RX$3-yt(5qA>zOFyHuAnrrtLnvs#r(u95mD zf4)4jUwZeCfBeI6KE@K`m}?(8bj0P#b*<|uEQ-Fo;)=_yP6cK-1!lO1guy5f$yF?0 zR{h=Fl`B)y{4%gG1?Oqa^O+NQ$%(|_6tHLG3qKeC#IGy9ktgv%3ZZVJFgX!n%xAno z*b%-uzG9x-*Sf3qY>Qaqr1tBc*YmHSF(+b-yF~LDeiHWbF+S!PZHBtpdY%FGn>A@* zI34(<-)80m>e?w^_0i2wI+4Z9m&=eoox7=F9XD(GgamhkEnd}}q(CL7v_$e>OSrDO zF3;0N8Y>rGaH0A5zyJQ5`t)ljVx0Wo-8RoOYudoIZPiS3Lv~?-|Il@QHT(j5f>%BN z!Y;=giC>#reKl-w9~%Rq4FK1iyI`r45|FDatQ23jZ0YMl53#ubU-y1J@7Mr5glD~y zp5?s4tgxY!d93~5G72PdAAWemWyz9BHfktrLin4mA6mHY=XdUMOYU7QoaJ4^jKRFX zd%(f2)Of;o#U^0NN)2zgg+H%w?8ssLUH!T>L#uU4Tc$bmX<^~-+PvIB*dOf-$8Hjw zq+gyCwhHC~_EMxs0r%yX-`IF5E!=6`m?5szb;Y7$72s5F>w4og=SV%)sxBxT9vsBS zh?$G@U>cUqJLK8tcWR96b_xd49DJVU*aq%qVF=e1FKX`^9qPXL;!7uGUEPx~SN&e9 zWHHyJV;gs^`a4?Drn_VAQOa>A6>6JzGH1$YeOTp&imsF9zi^v{*Oinp;hzKUFY=b- z{aLMQC7WLx-&D{4bNo-nAY%uti2liwJEt2lw4XhTW*Z%;;8e{GKe`UWsCZBFEDY@1 z!`0IB%J>dSV1cw|0p=%gO)zubXB6;F_79pis_(MtolKGHjC)dRwRI0XlHj<T>eqHn z^&ZKSJD28x<m2X6c`E&fb%O#5Y<+y?6_>dz@{?GbvTpI$Y5vbtx@1sIV1d8_e=`e! z4gC1?FD_S(xVbMmw-*p*l4Gqi>{u3or<*XN2zJ|$RWyV9;KReNq!#vf&z@=vQk=fj zC^(cXh`-WiCkt9YegFu_1ONQxpCVIyZ-C3w&%Pih{wH^poOYa)`E#bnJCc4ol1iBQ z=<pG@Ne(B31F4_LNh|GI3c$jViuKZ_PjKvT!p_x3CeG{(5m(rp1z=E)UN=Bary@HX z8<O3-buc2sKmKu{-^3GsDjLgxDI5tY07NCs3>`7SJ^09D2GRjw;LwF{^q)|<zEE_Q z8#r{VIjw*c?b<YReYHXEmr%mY<=S-ZEg}a1OHzxJZk$p`Iluz|!rN~f;p)`B(f#AX zKkr!)8ICc8!w8tyulLPHK=AFt!f=a-J%D*hDP>BRaBZ}C+n|1}1c#ptVWwA)F18S5 zj7KYy(RIqhZexIBS~hQF1e;4Qy(HQx_B~+G{jw1tA0SZ^Ep{i2iv#QcTmcM}a>b6N zZvnvy70e&APN}Kbcu`((Jtw~y!REfjcex8?cNU^NL+^j^k&_g+Q#6bSBL6YRzKj41 zh(_0H%%)3swY&PNs{}Ts)6Xko61!qHCXqj~SccfaSOGX<bASF_(+oHUcutMNH6SEl z7dHFj=8<3im`8pwAnlkyc%Csx5|Alytmn*{d;-BMrGy!razzUnc+9*4aH-T~ac$7& z<KKTTkm;CvTEL)E9~qgjOquI!E(3fGEwKnQ06V@t0k{Cv=FgcXfD`cas?cgq_zd6$ z=%k2O1G@n3`t<B7pfish%d<>By`?e3*qD6#C;@kkW6q15_}0F6T<7ln4cuakpDbYp zaAvQ-#Q}rI*hWI$JULwp5#R>)yEXovcz1m9<=2{X#~2U^iL-vanhx?1;BHb1^EPC? zqenk=Qjl^#|D-YW-FLRB@ZS4}3`hjjEnl{z0f^=Gu1Jh58tb~twZWhq!veqF(|noP zO`b4HpiNbKZvFFclJ8x1zX5d2sr~!jBCx2nz~w*ZRE`ZL%%o3uje*-k2KGAPz3A5~ zbus4?W+0sc_+isX1#p(JFn;14_Gbt?ZA7#Tedh#(nMjrkz6&gnHY^YjX3|DK1g$tb zED#W8Qm3EO0%3-=B?JlleKxuwQD@Ga(Lr8e1A;ZK_8GNV@wNHBuP8{v)Bo@v36x>; z&?l>a8xS<2R7iF#J{t8@lAp)ApW|425@-X?a!4DU7i!J<lh$AmGKv=~BErn91cVtZ z&9!IWy~sTx|B;Q=B83YWCXrqn=-1}RZiI&nYUg>XAJRD+sH{CVKeo;A3IaXYILwwk ztILr78rwL<FQE;PRtPd+1GQ=62Eqlp8fl(@JHKEfd`oNu&L9O|+knT%&mvo$d)~Q5 zLRUnz%c*Nss!-1EXRX>m89QpQYtgi!{mrkFpKRW<;k#IP06r|fDcA+1CF)`Go=u|n z6~J;({>(SueyepUm_QQ+Vbnf>)Sg;|8L8)3U_jr2BOSz|^K^go9c%R2cT6-g`Q?{i z7J4hG`kCOh<*U{@sq<Q2RTYs5Uml;2jcZ62zVA=aLvjf-1XY12JRs7{V_UYHe^^}P zfuj0{ufn+E7{(o&_mDC0aUn9X*^V!PZy#D9J8T!JW|as7^yO6wWGZ=GaS<1C8d(IK z2tVSp&yTqmMMxm1=wb!bK+*z-f`G&GLg5*C?e(`D!DEoFuywH_h0X3+MWEo`@#j7k zk>j0r-m~Boh#}Rr**-viBR-^GS7;kk`dP|JX0P=d9(9k)UUHIcobnvz%9-8pmVXJy zRH`QPWqDTqAtD<jwGIkGsc~Z!wK?v2!l!3r^ltg(kc%>EUZ_;Dtlir+S6^-ZH{%?v z>_a`DpJ=YQ{Ibg|2nZ~;kq9$0!w54{RMFqRaDx;u$A;@Amt5lL&+;O*;nNcQaGn17 z#2$jHHfe4kh>-q<`~zX;65(6)JGdru1M>)2%XuPWfTiRXiEZfM-YFu?;O9#{*vL)H zv*4kSjfxa5=pf>xlV8hq85fXSq>^m71mvgYnmft~gAK=QnQy_5=@+G2GHinDfbT+R zyZrJ?_4oe>kNZOR^<TrG7`N}e_o3k)#fuhpBZl=$K>h$<Vm?|b924RerKd2%wyhEd zkwh9xkerxz7cO3*@ppj*Pk|W{Fb2MIg~oCCJ%rW+8Dxh7n6M8)mDnDVPQ?mkHBQp& zzT${%;9kcxFYZ+^)i=Vy!1utR3F<3ZqNw#V^>Qyt&+VizD{{?CMr4G5v_zy#@IjuV zNQL07A4GziFnN}drm%4wnd*Or8xvSXpT#NxVJ4P!g1-e8NN54(T8P^O>b@^Ll64$w zHiCg0H;N;V@qT3wfxR5&5r~1zj}5gy!aSN53Uf|Cm`Mvg5wsz&z?o}-fG~6B_T4FM zd0HUM09+8Ip)?*wT7g({|H?(?sKrt?Ns3{(KZr71gXpI>#aPF&P|jD|1ZDC6-~atr z3xIPiN()Eo*I#jZPM$D>vn}~lw^l&Uj{=2=%)$9gN<k$8zy>FkP3C1w=GewNDjpC* z#@sg598RJn2KK*I(J!T}{n6^i4xwrhsOE$#%y5kI4+|*SV)qZrzDM_tiIOU~CW|Pg zGjZ<<u*11RRRH$AUqT5pkdcVQ86Y)_q!uE_7$XouC=<pFS2R;20~h%nr+vk$bprMl z8<BwsxNe=>8nd6jQ|Nc1zfd4aN+~Cj0r!E!8Cp(;Fw<AcIFP176%<12<};umjxUZY zg}zEkbb=q9!#PAeG?W_5JP{ly03a-eQO5DhMN(11iH=nO03c=frK&c-@0mAKpw>0< z(JByWh)N?O2*4H+4d<a80!b#X2qXCfL|!Lnx{wyxfC*PC3LP>@G^g3WUUGi2SjKKJ z;Muh28D76;u>oh{B!J}9%dtEgC{aO_VH^?tL*x}CC88T46#&QqW&@U?dIivn>Q!nH zW@rPzA(3~q0Z`-6M@J2i`9exR%w+)DI5S-Lcg<xuJ`mJWN|<5(TBms#&=SCF{hB2L z;ftI=stC8IWQ~oWH+K9qi_}DIibyw~2%$7Vrg$a!YXkp?EXDCkth}o^b;$7X20C4J z)fFdAnBjUn8}kI}Y~S&`^)Ue6JQ1w`ofx0Y-TMVX_7`D>{suteIVSoFC9;$j#s}m! zA_s|{g*d}=gRLMO5>1uTvRg_#_D<FFKp{#L;19r?!UhR_Fn8WkBUll!#e9hxO?XK_ zm=Tx_XgWymoN(ne|Ga=O<69#58Cc-&Z-Ia?^Y`!L;11J{1=0dxCS%69bwsQUxU^%j z$Sp|=gc(}Knh&DP^gHf0bw2zFHVN@(F4gAqufP3j8_DM@c;-s2dGROkA=#`5Csq5K zp7_b{D{>xnR#*?0UV5pmWtHyC>SZGoQa0)jkgC~ihg`EL0%3-B;5#bah7ragxbPhX zr5A!~uGgl!PZD6$`-?BXbTekoH&sHg7yo|nMes>DhOvVRXjW~S<FBI#f(k;k@`A`U z5C&e_wMUrF&sGPUtJnp?0=9z8!A1}FG->LcR@FEWW}0i`hfVqL0-i!p0Gr+)$(Q=& zU%%L9I=(670(>rf0Mv(2eMF6<j+8TUi2M^?Qj0J{y{OEBr@W%z8SKqQJAqTnm(Gpv z%kb-`*6;Z58z0{6R<3%$d?Wl`-wvp(tX;jx*8cQqN(eKwlXFqTMMdJnj}FKAuEKDz z^<^5X|M&0zGqnbkFS+;ZA`21mPLLF&rtrdeWK1m*wzEwef7p+p67W254#pb(7XKj6 zq!WID3JHoS&6_k#P#yQmb24Y%5(~URWfvci?;#*~^6eo&F!t~fQEx)Aga9QJcp*5Y zc7a4iaLFCB=F8_lVm=#~7bG>>1YrgR7YHiM2@rt5*l1TcxeD75IEHVJ!YcO)&I*AD z`-7K)m!PtAU5O%k)}2$DFsYUP8j&!=y%NMTXZ~WhZTqvP+=DWYKS!W8O;Dd7Bu4NJ z<U4RK$T^&gAB`<hh63XNBShsOTehrHpZd`~CEq-!$azCeVWw#U^Cp!X!F}RmPt!d6 z-UlBVW`iOxV*`AR@k1XoJ_xWv!RMBnJG!#M0U3wU3ZyoI3{mQZ9P=;r6}CD@wxq5& z3^%t0qoAg~T8hFbsBnKHhxRuGFu!hWwqVgR3;d&R=$H0wS{NQsR?l9n0{(}h@9k4& z8iA0yxCR&|fqF?P%z3D%P!HrM$Ya=u=f>|(?8SXyGstb=^(e~}E|}lOpMM>WXA@qj z-$k6+<D~Imcp!us$W*axN*ziSV;F|g=jlu*tT&UpO-eZs=D-$Xm86ad>If8OVp%fy z+u33PNQsYcc}l8#4;s#ix*vEwb07r*GRkGl(;3pIH?npUk!i>XkyZ+GPC%GRE4>l4 zBe1}kX@P(+b7uD2DQ`6n!s%9+Ii^j+Wh>Vzoz7N^WMHH4!S&1Jyv0RDoQx3w8#Zs* z<{l6rVjGeo!{8L)NOSM}W8qH(7906QydwdMBYLt5Gi<7(qCoTkPAHBB|B_N@7X^n2 zIaTZdP{79cb1%H46c%@yJR}bK@F9II>MNEL!3I826GWEKo^Zkp3k^Vw{)0ywQ3G(O zi{yXXD6#>7F0t~)oBJHH&7>*9fk$R_{Me!Kr=2WehJM+oh$NH<NH5h|;0dXXP%xkX z0<Zy$bThWQO(~K9;E-GO3lh<gnAl8CN<oT{h>36&mQzibVe=gF7*f@gl#Cm|%en%W zR^As!kU1#ul#O}PRrw{U_4;Fx^H8RlId#0tn>UvMQG91(M_>d|W5^v7O>$V|G@NX} zBOK%N&O6^o900XA*td3%OO=&c3R1L#F}_^$2*55%B<ZfX#yzreg)3Yrf0Ca&>WNhT zB>+gd(#?s-fhYO~pa+o3pG!!61W_r!(qa7~@(k&!eiGo2T7(%u;wJ@2tx*)+K><I2 zb|=hb0?Z&O0e11s5KXFN;wd7`SQ<AyQ`nQaj5*;^*%JpTv3ZOQfaf$0AmGtP!2RxB zJJ_6xeNo*)8X9TelGhb=Lk9MCb!y!h$@B@nBYJS`glX<gfjIzyC#x_+<w$z(5->e& z##|#om6OWLj48L-e9QQR)We1Wa|^&J_cCqL80%{Q#*-=7hIbS|BeK%S%3r4Wvs;(; zZp_Gm24JS7e)=Ajs@o;8Og|D8YpLKQ(@%N-!$YPnvue!-n=i+Y8EW%oq`5vI%%r3T zf^z~3oE;Vj2s39#KL>Z2HY^YjW>Tjg(h6aQyTONoWR5B$svG#2tPTBw4~4=9K@hE5 zG;zhW5sIH3sZbZGnO16T$3{2nOTVygNAZQt{adt&z3H(hwAuT(`D@V#Gn`9M1it;M z`#0FSp3P;hgKyQfQ(IFP2=(Rg83{@P(}9qJS}y*QUsyL2tigSdHn@DbQl{wO|2^7I ze0XpS(f~s?XEPVVLcxN0mD03?D=gKGe+p}P@ZrbZ#3T@AxDIVaO@)-HuPN;n{y=EK zr$Zs5WBXPju~#rZDD?0C=hP(3K;%II64C~C1p8^Bv{Hix+$ul%0{@by>?hYpeTQ^2 z2i|?pQe$y3BFRZpj@k>vk(3f<sEfWM0D&>})HBap`e%G;zcA)~Vpo5q*}?COHs<|v zz_3snCK4WX3&t(u)GuuIp^DU5*cK$MP<+Tg#{WrMz%#&2o_X#?Q*rgH;yJqLq6@7q z(tUx$q4;tt3&f>Qq(-%T<$CwD+Qa8iY=&_G_Ha}EI<AdUe}fxF3lt)_<~gN1TC{Y9 z5eBfEU${5O8DMM#<SkjY+HFyw8P9wqg&F@mh%Jw7dP3>09#bl<eev@bDSWYaXy6&a zMkw8&gi2e&=Q`4SbduVsnxc8^0R@yibJBzv+DSkWsgWS95Fm5-$k7vQ2(gZ_(NzH? zV1VE{i50LeaATesQjUH7^|vAc{liqj3+B&fseVvmdHUHGEp1yg!VK4;4g$Xj?&BQN zz0(f_EG1TU3&$WJkQ8Rv6mrSU!V<vkl2gD*pMCBn8~=w6A2D(f{m<CI9yxMkv*!`a z1|=huf+7`^+fkSy1scRnh@RcMwHJ9YN2J3Oe793dP`tx7iM)g2SVN5o)OH|eCRPH% zOkx%a{vKH1L<_K1WNw5s12HpFLFo=<L)54<WlE@69_jeM@;l!30b%B^w0Ll>zyg0i z3j~Cjzh9rG${pcwoo>Pm(yOKnp@;`I3}N=)zw#bMmRx3pk(AshFHSZJk+uYQAVmm~ z3*@0KAn*Z6N22WkL#~v3>*beUZX3&hM?^6FTMi^r#-t$ebNl-3NNP$ZfE|brL~^hY zL0thA1&hSO6HG$EQ6O>(@&}T^q_28ez}3jHlPvuaIadLks#d<<n7`4gq@Q=bv`3K( ztBm!3B4GyL=r`AQ;3$j!Ak|0{Z43jdg%d_1U4uxdiHe9K?Fj7Sc5>K9DDuoNCrg+C zY{S`{IeWg5UJB&PYfd<kE0l*fZ82pL)OS!8Sul6HyWxiNW;?$PMDj5P*i24Jxk%)L z%dfc1BA!BzKh=a8?vv*MK!Jk%b16m5B?l;j@P$)azithy0|E<CFf(T_u-}QA0btB7 z$2U0z3GAvOwDH`86SPpGAu0yRY(PE$1Y~7lu9FWM@QQXJe+zRRg(0Gj!Xu!P)1J^{ zdFD|=S-U}sC?dBohS#k^VWwDA;3)L`XrGx!wn#l^gYt-@v;z4J6(yp$^5@NCDo22} zT#vbeC`zJq0NFnN<nuoWGm}!Bl8O5Q{8+Jiy+v3u{)ij}_(r)0l0z2eGO6}3_5q^L z6VdJ=fyP90(O&u+wV~vuWMUkym0}OM<V|5_^<tB5j|Rl~HiQVXU4*aEQo^F`fc&Uc z5&cO4C_@nn0!;SoS={(B!;FaHpC9cf65YM}jWFqCz@*e5%=i(${RfRPr7XZ7a<BvL z(9eKSQ$?nMgq1B@W+M^y?{muu<3C!P6Z@XI8TBuKK{iWJe<3Pt?8w1(eL$+@7Us(x z0-<NkUg%KeK|Ymx>ei*5RRw@W-?9mEg~rUnc{7xvt(?hehhHlo%!FGc_&u;d@-4tT z^RYHL*aQk+QzpN*v~xy4m`OW*5wzs*Z-Ia?lRABzmIyQ45d?S$A#ApiLYFi%|CHJX z>I<xOd2c{kM?nH|N-VNAcmpXvzy9Vss|R8NsZugzNGIGQlQufiTYX&b`0*cX&57Cz z_z0we@M6jj@*_y2f}#RzLX=|gd)TB$X&|&ca#^ID6L&w{2LueTiywdbr?owUj^`ih zA^0RH;1C>?SYczD&3%*_*uZ7&j33J8G$~!M6}|@~2U6-#2;4zMgiYRPg-v@%{@5KK zmd_A2NUwqqkVQ5_l>}e)0$ndsLGj}&sp<HNtfVhx!#yR1_K?<h^7J`Ij6ltDsDcVA zXyY3n`cxOxDhLX}7C#CvLGc&@3HMa2SRqpeqL07R7=!3VK>-3%S5j3s={x$+#;L|U zV~cUc*acr;ykDcBmn($9urWuyp<^tP4X6`*2PIhQwf@j}<vi-7p38+R@*Lo=gYiTw z_}#RHu|S$*o)hfB_tceHbwS`kjpV8;Nj3ea+UQ#OR;0H93rR^KWzCe^M_a&=e?IpH z;o}=U)1(jjN;W&L)Mm^Pw1?*@qwb4mkzgU7<7mDk&k+~`^<Z~YYq34gBV(O=BVE%K z!bX{oNI~V_H)*yb6>t*BX4syekR@<kNySF$C{i!`1+^FEk*~gqyDsE6=0EHR(T9Gb z|0&EH^eMP0DSg6KwXg>&R?J5z)5Ogu(aD6^kUFs+_fLDlrg*l~r%R{v<K|iH8Ow(L zz3>y;(0;HMl!j>wV~+EEC1>U-lzryTUt%fdz@-RwtSiN;&_W&D4`YqAPT3X639gfr z`4N1RIgDqPHZeB+c{cPKiGB9xSn5G(;s@q@JqN1PWmMnL9>%-jO`0Pky)(E5;|zTN zOSK9ACx;Y+c!wp1A8{_22$&b@Uj*LqJU~p#9zorU<3mew#sow(2wco>U}ro(VC|6# z{R&Zy=K(b*QnX#6F^9?-1)GC+p;pG2Vt!zs0e>&CxhvB3g6{$g{FN49>@pvsFo((% z>HR_r1nDNqJOFt(RAoN&nA7>0=Pw}4oX#Eyt{qt5%(p;5m^t(N@RZyEPT1)t%;3Dh zre7j*3%L|aU02*TcXQ{;VKSj9xpABqK$_vBCt3<4oRy-Aj;VfQWkp35h|85M=N~8O zVu4S9Ab>}JEXaTUqQ&kFBFwPK9KN}cRKg4l-A5I<v{?7W0=u5b3*<}2Ax!$>`5XgC z03x^toGCVLd-WS`P8A!_uzlH(j+M5Dg%F#hYt}w!GQZ)38Q;c3MvS+OcJhK(s#wkq zS6Zc5GRd6BA_X-Gav0-)l0u4<B7J+^>{n|W(aWVMu~m^GDM`shMQ>}f96|&HB<$Bg zIdjPYjD+u$8FQ2~{YkSkU;`<ei1>*H7{oU$1s_f|VTMg?)FA*}C<B!jyIIo)2394t zxyYa5(2@Fxg46oYqmR1@Qk<Yb!f7h`YRGBHDLBTA9mZlb+xp-tPCx%pkUDboQ;Q6Q zPz87k7}>A)&6XyH{OGAs7>CRwt3*6_UJ;gnKMUrH2vDiK0lO)^1^@&yxjZ{aBNJs; zxl#oqz+J0oBtS%fRRCM0YAFjAEmxG|W{cc}&~n$TloMtEFTWPBG;YFlk;Zmv?4M(8 zxKU&|Y?oc2EY1t0ze@ySK&(Pmo4E|Nq91<vDaC{tqC;0mC5xyh=D~%sClNl0MLVIw z^QfX%=O{%Q?-+8=_wL!%A|<g8fHvwTL|Os<PnkGcB)euYNny-kuM0%!*rm4tnSf`h zL71UEv=Iq(?iZk#oaK`zjIz0!h{aLkrWgp-pl(e?(>6C*cFqeg<eUGWKwy9(3Y!!F zUD2Ku|9oV>0n_FPOar7M8gIzJUapvO!Sk%7q!85`N7#%5oI1(L9X6zo&6ks=%{B>X z6m!ayy3S1;Kir6sk=hv$W>RAP;GDn$e_DW48SjYbh&mud@Zx%|S*HNbMtbJ{JTvYS za{_B)2%8kv$beUDl$`Do5N1wy4+Pggn=Ej;2{XHQ@79K9rX<Z<X}Mq08ezt_73*Bc z7hn+o(OQ!9s*qV&Cnt9;$U2k_+_(+r3vBJjMrU&C@!Q5v*2-+C(oTGhP@+KSasFpE zBEe%w)AApwid-Nck{}@NCn@hf|C;zTw43u{71q6A1WWH*V~5S0KHiaDnvLUF1^*EO z2kpdW_*oDtSi{G{R$|qe(!ZgCao>vjEl7h6>y}DCJw|D3@w<|0vy@&t{5;6_5FD@% z{e3EI!8QK#pMRU(xnIaJm&$*~{wcX%+RE66Ou|@&xIxMxu%e_855jH0m`4!@-%vss zmI4eV&}h%m?78>2^}=wD9Qh=?swDkhLpbI7HA}7jNbwSE+!NHtI3=Y#_VUMR(y_(3 zrtoY+v_KUX`~plALPK)v@ox;<GdIvS3gg93*XAGN|KwQg3NZ=74RZ;Erlk1HejO?O z$@t*fJnz^5yo|X8TSn{GNZ0!D$DfTblGr@Rxr~YFGw+sC_?ND-0?!8a?O~~%!|P?d z@k}uHr)2zx*LSkN^F9Lm($Lp41f~HQE9tc|9(WH#Bi2N!36&@mtX`2KIQSN+oCxwu zik&0X7kn33Ah1BvECAu_3E`gXsl2)GZ954pl6?c#QUu_o#lrg}Ak3u2o(b9%Sm4aD zKtPx|bNcEpZ7B=$(@mIR({9hJZ<r%N>JMJV5Ft>qfFU2NKtuuL_=lV_@=W9C;9%f@ zktS%;)Y+C!1W8*|0Z3EBCPkzIvzBxpY!1VQKUswthyvv4oigJtW9=fVIk5k&u3VW? z<_JY<gZ~{42KN!}v~sT>iHOtf)&WLBAld`gJw%*nEOr(Vs21F<bUdh*z^0Ezn3*c# z37gs2BDXgBrz-VGWf2ZyIgkJnsQC0BJSNU=BHFamrZOAgemPl%8R{Vt=H*vjbz`Jj zK?DI3okIrovQ%1whK_YlKl7r1+>FXI-pLkqY^a}#a;gb4C=+db=rK3{p8Kr%<R5O| zu7wf4V%?7qRQS(8=&=Aj^!<p@lMEa{Cbzu^N8})lRpRPY9(NI_P&<lN7_S`5m<=B* zd=EH5-?4!YF@Wa_8E*1yH)>cnTD8ggp6fusSiE$Vh%?&_{1_>fBV^1O%dra4Ab>`3 zIj1kN=aXlTI*D{yxOj!sKekz&1N!uk`cmxNtuvHs9EbmlFTZkmPm(YLP|RFL?(NsK zVTy9lfWEhwY;a~N{zNMD_qg%XZT{i;Oo_q_?*{CN#4jX4z{Zi9m+NCsMWV(ks9*th zK+<D8^uD!=5$OE6_i0I8LkL4rg)&0KJcxf;vqYBm<rwDr=M;6>v(GRC<Z>v|D76SP z)W7NRCryrYm&PgJ`tqfB+lDl41muDwHc0a~sg00rj#R!7F%7W$8xfo+MG6;knKEav z4Ub62``;0zx#Q{Q-PAkg+I=E*4B@b1g|aCEc&V2;61B83<ELsq|4z?YJ$p}JH&X8* zxlB~3KVL>0O95fV@1@{pV1blbfOLetWl$Ue(={3h1cDRXEkJO0*Wm7Mf#B}$?(XjH z?hXqixVyW%+{s(@-RF6~s#~{eek@xH?C#8TpL4qVbdJ~@oo4N1-VTvr{yoGIa-Ly> zG;XICTnW(A<fZtoN!n^OR;h4ew$W5L+XYixAyDd~0>Dxc!!OD}31a}<)R#V<!+yRs zZSntj0o*!j5KqW5dCQasq%s@kF#kdFgH(G!p%(fBWv=QMkXN|xTk{_9Dyaa|QFDW~ z@=A7CYL$5$TGcz#bEbhJ$GzC@+&zCb19u`I(x4ce6qV2<z`;cAqi}ZvL)=dwB`)A; zbXwATohjRyCMU7%+?4&97Gi0?23#9juj9CkikhD;Swa6NNlQ+i5d8vAUz}X4X(jV0 z+c=aDJ3#^;jgKXf%Q}m5ETp#n0p&7m%Ujcyylpby6ap_KFfSQ{jZVmKlCIQ8;ARvK zE>qp0cat_(uE9ApTk@ea+q;SkMC-s`{+yp-GkE?-B9YZ4Kau%YTb*$D&h37SZ<c;6 zW+oVPI8&~f2W!MS6uU{vBOzYM-6o+BTXQX+OvLx#slY;nCk;tqTA^P1=R3yIBOG1F z@9xKKs(+Ko55SzIFu$@wSQyZoP^_jORFdI;foG>}ePr^~1m-sKBGw>R@dJ-Vgz~c( zug-6IhAm5xD}%+7uU1o8o#=S-Qj{q6CbG686exJeI)vmkuADZD?1g1Z<^w*z15)q8 zK!V`$sFK23NST3Uf)!%>h`g_2$E2F8ryLK9g+$H{e~e`YuM2n5<ACPnAxaAPwmVF{ zzw?9PXtw{lK?7m-6vq-ch*3KBs;J~=X*x}sPy^})8f-oK6)v}wP>j9eELaSk4@bVD zPeA3j`&+<lQL5x-hYJ5RV^?@CGD$c#ooy+NlY3t^Y9IpftA#4Nu*$O#yM=Oww!zZf z!loPlFsC;Tl?zj1M^KJ+g}rE0l5Q;^WHI8WThkmD3obt7+DD$2xmvx+5K3xQ=ZKe= z3{!TYCA{68Oq|gsuL+w~6mI^zFKw_?t&(+@S@05Pxj;dK?4!cWVKRBd_q(BV?e+Za z{ij6HDETLn7>Iu^s!!=T&Qk3Yjz_ci5Tn-TUmMZwlH)bg%&V2lC<;PTPx`{a5WrKp zoX!mO5bUL~3XKeCC1oVYy0c7)!z&WT;NGHn#Qo8!$XOqzJox##$qTWnzW&_>H0mLL zadtz*apZIslU$bWp-5$BgfuD|MgPl{(2uvfPV3a`=`t3aN?nC?dLisuj+>+uIC|D} z&tYK_YF?`89TEi?p)}9!$JnaWgw(#!2rm+%PJWn`t{sjSv%^hZ(RIKLH`-flAo~Rk z&HbY-cr_?8U23ekR^bvJZ*drnHsb>VTw?%+*h8ET_w5m-)BDR0f-8Ad1$#sLJ?5XO z2Gg@#A`mOqhDYln&Z%)S4bBSuDWQ6+o8>*=qcxw*n=<J-iR&(y<5^AKN7BiY(<y(^ z%m@BOZFdP07h;n&Iv6g<`ofT?(5)lAkSh)Qk{V&05hwJy4@ALWE@!Ie8-mUbIAHO( z->39R4Gd)p=za-EZP-vRh!kMhM}Q=(;n02xg1L@e{-6G58~^H_9`{)3-}D)PtR1S= zHYdPMq&*u^+T3~~!X4cd>)BS>!-a2v1cOjgkI!`<Sc<#joa-TVDL;HqBmMQ-p_!${ zYnqy$lFV;XPDw(X2<@98cV*O4!s^V%QO1ThhE9cE$sUL$y-6+2*277m+t)j{z>apT zrqAx<p<JmP^|nEKY!5M9401A{n#XMMle1z!XOhOtg;9FKYIya%|1_fgmgdU_LpGF% zw4b*8kceYwf;KQtiKMn!UHi%Gk_&ZJtwfJkwMOqfUcu~xN&^?k_#K7{Y5|)1@}UVx z^-t~()?pV2CT|W@pvySJUJD9_0;TJ_g$)hb_1gU47Bl54KK=OQ^k4dKlfDnsku&RT z51LhnKrNI~Ta07eQ&MSKvR!9x|H;F7bM3*h-tF(JdQuq0^w1^)7|oP8t#_Le?&2z; zr5vEg9Ya&0QC#lcn^-D(Jx#Y(N$j0OMxZPsFD609|CKnX)lA>%7B{F*5aY=gg`-Ey z94F<#(TVBWeZOdPkB#+O{2e%_S*B!5a%ICUftd~zi0Xrg5ua4VS>|q%CaZ+6i08?= zb(SxCgM-&R$AR9(p-wPb5facNPBWECWiw?Nl{4!TW$bo%gLni<i}9N1$|-3Wb{_IE zzoiC?bd2B+7HB4B=)~048+1w9OLaQ|_3k)>lipy0da(v<1)0{HsFg?%QfX(Gw#+{H zj%n2LCD6%^lk>O2))P6LOc;XA>;1_joHCpHjkeuLH?{|8ZnAhot%Sdw3RmDrD|_98 z+W6?n7znE4dkb$9EBNg&G>~rHS!r9ZRuBd7EQM+1N-g;Xz+xIJD><=zq5Wq<`mHKQ zVIq}kO$p01tjHL}X*8Z4ElG7clL>-|o03h5?&Drh`-S-Xv%DgWphR=h>4wTtOP{ha zd)D)aIJfhACz<#-uyTc=NuiuRx&oCV*kq?)h(Mjz8XCV+gE<ODDyL=Ok;sJVsfbJR zs6b`HtSNVNH9!LDXgf=ZlOZde^kLPsw4zV3(H8N?+^MT$b$aDt%EI2M?hnA9H+3Jx z8B1TUTE>8bziP3IKS`QbAvrw%rR%a?S1#OD-G1qmBOF)avzQ^RI{V5<K<uvR=)}Z6 zb=i+>v9o{<5Csv)#`83kMtod2j6;l*r_I@pMz~|7@CvC^k50__NByg$-Ea&6SgSnC zH7w)Ej|`~{MoFVSI*WB5<{6=5Igq}W8P&&QGy(z3UOCXqXTXp4_AQdWe}gdE)8#N^ zf6QBh)+s7dIN|o>fZU$$q0M0lyImCMs-_M*l@^KV{OJ8z<+X-g6%6>Y)8(V>_qekx z2*Ty#{SbGUb1&6@(-7s4a9Fq9`?5ji2Onz^%*$zUJr^?~_mg-o88MAmc{1qJ0R9LU z2r@Qn<&QZ(?ystC?La{#Q;~YK*qwF(N`oKmb7i?tc0&W~KC<bLu@XQSGfLcS?*SKY z{xs&3?d=7k`MX-DEw2e0k4eATpV$Ms!HgxCN_GO#*N-~-0fofu<R`11T05g`lhx9q zSk6%b!lgqpP;qN>Cv16NGV%rBx$9n{YJpTThnKcp(el4S$y*l5rvT=P{2?i)>>qzV zPxHPj&4}JL`o=G4r}Ly&mUr`bt=8U)Lf-nku3iLwXyxCEe15*GF|0R#%T|Hy`XgUR zO(u3Uob9D>JoL~|+BJ;F_wEn*4tS%=eSZrYl`x4@xwx}1#ZZHKC-_iMxO^hk|3Oho z#ZG=l!{43volCwn(ph3O?10rU2=2N%ynUHvyM{#UQqQ$yIFI=~FN$OnagNaAA@Jth z27*fz#!cc4z4#1U-f-jL9;{!z=TDOaX+#gNf~#`5!YED03&ImGg)B-^(*^HuZJ?vm z6l~p4ue2ll@xU<Fw7${eD<lk)X`{8D6C^sj;=hiv$%L%u@Rd>6D_~;wRWrz^Mm`L7 z1+DO-p7rKfd<jAs{ySB@$@sTwt*cB{OnD6#i*d#C)&u7@y6)%YJyqtR*-%5Nyew%^ zBV2VGL~QKhvN)2TPLfZ5`D0rPX7mg*lBx9gaAHb$_yt|xBAclX7``X`4#0|Pb$)ug zIuiYI+b%K&+c+1*-9+Ku`(!JDOHKPpNbfKY|8fZD1@5+_IC6oru`Ino+s)ENi)<V2 z?bFDOFRO8OVgi+EY}dyYRCok7XGt>^*^%dUisFba+zkc`u!}RXPxPK;L2J*<jHFQQ zZyz`l6Sn%Ed+DqPjUPy$lskvku5i|w5L6S29ZCP0fADVUGH~}Zg^wE!m7^@L<++hO z3?e^O1~#kDI(mygHjLiX(?RA1_HV<McxcwWu_UP)flQ!$2+c_s2FLG4p@5OA6HBA1 z@=z6mvrwi>bi7LJH&CjzSc}~4F~|8(qC~#v5H!o8@iYi_J(;{c?0S%efoN42Krcj4 zpW7szzKSFzCr5mz(#eU<CP9%TL`by5WCiz8b@dVH&paf$DvHd9Ngkte7!0)I$z>+) zC{Vg84%4VLtO`W<S@>SVg#8q5Hvz@04-rGz>mrF`vXz7*RjMjSQJFRgex-f6C!qK1 zMOn#m`aNYMWfIFPSKG3G%npf~kkkdp%ZiYG34JMVB0I(9vr5ZNR%W~S=6XO&?;)yP zb>3~S3vGF=TKj&a=zXu#$bn#%9<{)Li=c1{-W0d>0B4@R6#?6-m_RDyuNn?NR|w*7 zcUwL2oFTu7L+}bH@-8!k9Nbln%7W2s2kQGTENnzcKsg}c<sz;RIb*@RX6bS=){Vcs zd9bz$HforNB*RjSe@N>UB6F1nwUWr4s~$5Ze}Ew`-KXu7E7_(LFFO3<m7>rOa`z7r z@dUAn?ZrvJx_>+SiVQi22d%d8TL%nxxnfpyBv<HsB-b`v0dt`J)J^8CZ`FPGkUZ(j zS7kJd41t|!u|IhtFw3>KkO6pN!57^hxkIM{VB^`CJrK50SJ)J!C`Sh=_RbVEsP@`T z6{(R0Nn8(&S8sdGB(DdGZVwge?SD}X<h%$o(ew~{7TA&5&BLjOcz#lGv*C#NX;4ms z^dl=Bj;fkWDw6mcrippL^B6WzT<`t&O%l2f$=5xFv#u&)f=c~ovo*qY9oGrIqd#Be zSX}zp<p|aECb5Mas>mwb)WS?*dD=F!t}V&={O)hP_}vw7xjU6ydkmCwYb#J*Y5oZm zJ!uKQU8iSjhlmZb`kr%LXM$LpA7S)5n(vQzzFb|JcKW+I3q?`nbCh-xPmU*3;l+w& zH6#_B%LBb@j%Qf2=xT&XkU$ZR`sDkYHSpX~6Q}miy7ypq@F5?wy>=+R8vfLX>j~QS z+ixV9-!O$J$>>9?yPxMhg8afltVp|?syvKm1?9)3%OSHvU;5dGy8U*i+&=2YX%&wL zWs+F2AomnQO$(G)AkJW@V^nDPk+9gA&4#$pHt)}zH?TxAd9^tu*WhJfCVgc;&YXwW z5H~&!tI%a6k>KBX!VV#%zf3jO&(eW>t2?`7)xvAOZ*l4ADWl#(MTy7g=oL3SfB&C9 z{GTRSz$b@HlMs-WM?0NiR<eL93p+YsLo0(bgSfO$ls-d$xpYaZRpVon!-QEIFrlna zLTDT62bR9cB2t0H(a;TzpS;wUhCz-qA@oy<9(?j+v~@I#q?|uts44_iJcj%3d-+#i zh~nT|RQgpSq8fGETGqCFWMf_wd5AtZVQ|(pqT8AyFpjP5a5`HNSPX}w8C}Ely#{}2 zRn`@PrH;8Xj9wpUn*=$Daecqt-XS_4M4b8(84I+h&0qpAMi!`o2YGBl(&;Box`vKM zIx7+!!Xv6!vQJTr1+pd*gh<p~ug6pmfbfL{{h0yk8u`iTVZ_NcAeBL(sI^y&KKIVf zd#bx;oJON<nwVH_#W$qiSlSod6@pjWD7~p9JEsWjXcJf2Cv9}omq+_+p@abnPeTE^ z{=RDItp}Bf+3Fb+vr3jc!H3xsXemN)&=*yxP$KCMCUmFUu@_nLbCiiL{pg>30&g>j zif3ZySW2jGFh@CI;hVzV1%NxP=Qi_ty-Ta*yHJb)oJ}S;<n=NOp&(N0``;~+BC(sX z^M#6P@rk*7&7UN?0S}+~am^?TQuI4!hK}bb!()_3_T)K<hiKBDV*U^c<T}_3<G5SA zHe1et8qH@`N9emm<e^;mmom?-3O9WDMG~Z+>Iw^PmF7pj{m^@To#9*4N5<2M--Zbj z+wchYQ*vW75aV;sPl&Ax`xKW3c}Ee#9e$y0c}&mk9kWYlh)SW*^J_eADTEH`B19)Z zYik9Aaim7TQ+WBu_mu&7;{8~_ZwCgmbz?+)NqF7A!@)C<k+`U^{%M~}ggx#)=)k=B z)G6w8%wy;gM3N^8)a;)hM$e{F>d*-(rt3i*3#va%#+aXO_K{nO!hPu)^egO^`KlUl ze@ybb@$W%4V)1EX+kZORC6r}|)+#ta6~BRnTuo4xC~~zg%B&gX6#SksjK8t(wZN^c zS;qMpEjAR@;dgIVNd<K*k8YA1=;KJ;-=g;o<F6JJVI(dmPS2<12qFG++%)U-klzbc zj`ryXePD<o-bkY8v>L|gecY0uWZ@ve%{EapR;`zqeT<%>)1~^w2P9F#sho_N5`As9 zr+fKap!HktabzV?(7c&P2oy@f96VpDJaL+|xmlyj`|Zgl{?r!mt7fUzvY5iK>|1{T zWt(2)i^2TLoue;e{rc)9==qYEMY8|m(UyHojBh-VCT`SRe#-0m;E@-?6v7yRmyj>^ zbza7(nezwk*Y6MG!`U8Y!u3}u7d7@XCs~A2Pp0{=JAK}DTRrTCr~F@@?Ymx^m#R#n zY47o2_~>pQfb~LVk(>5<zVY>+Zb<AwC<=-Jr(@W-dM*Czl}OiWQnfN3vkG8V4dD#r zdDu|B@P)J^0j7mO!$89{iU8N-7uXD|KG6AEyR`nkRI?)>+%mbvFpE5z=<!x}-4}7? z@MFzS^1VIQ#~QW3jxaq6bdZ15DpTvKC|9|2drC^Re9KI_xV?<cmw0NIKe@rcrHp%I zdBpiQxZ!BNK(BieC%NrcIDPF2VF^oZ!>ayC>(hr@Gre354L!LZMsKutTpjZw?lD6F za@+GURiLg(L&J!2Alg4K&v*2w&<yE&*iKb&VK$0CVLnVFk$QZj0l5ZL;30CX|HgBA zz<nVN)O|Rf@=3C>MLi4e!Rw7Atle=z_3v6I9}&v3m(BlPGO6=F781=DhU=~x#GpTN zd~YKqwTc$`h>f3g{5p0Qzdu$_8`p415)DG&yh?wcTB(+G_H{|!Cb>TQ^k!1eN;WT! zwdE>ung0z~nu<8G)nE1~FaN&i121;XYz#{It5Ev-z3>w;*rE}FY^NYz3_=pMW@Tig zbEQmIehxmp<+R%9zN(YDV92L}5Ms2+RaZ&4)2kKmaQyAhFlg**@0~i|i+x|4kWj@c zQ7UT$WF;~p5iRR*7c)M7DuRqHo`rJsX0QW4hj2CE^?@2ji9sRMzQoclz6pM7AvQx_ zBgz+;^1!l9`JD1~7Y}JvixPys7H5onONQxyp(_<hxjOkJgu{Y{O8!HuKAF`!82;SQ z@-~_ajgN>e7k}FO@^`Z;z?(xN0;PZ4n&40bg3=gzm%)$?fMH@<4vN%QRzqE4#d8HW z0#sf?7oZ>20Hc65@0f5wZZXAVRWFz<@&qfj_Z{h)AWeLOMmdaVx(?Ul!gCIb91l(a z-VgRpK<V-&*-gGl06EAOPoo6ZZX#u+2rEb2{f%{~5SQy`snxq-0R0fm4nsM#h;+f9 z=|+35_@cW|irl-bQxj;VY>)d?91gd*ShdC3o0pIV{RD3c6YdQG>}{-o6gJnsAIMB~ zLlcNZk^Geq?v^p&=!9PnVp&5D@a*7@X%{2fi1u;@Zb!+p(<KmLn4Bllj0W0bC@T?W zMT$TvhI+6@WZjXtY$e{ZikrS-LIQ)qCZ53|i0`jp0<a=P%RRXL4>9R-kG>tZN&FcX z31d5esgf4X^^|-pt7ue~g>d<wCPBj7wF2fmJ=qZ6k}|0@`o2#{UExZYR3(UOoqDCQ zQgRBH+`AP!QO2N4#6(O~7dc_SiV#1<CaVGt#sqpHE*BZVS)nk&6RJ}B(-FuUZ@E#7 z|2}LMKSX@0yJh_DkY`{drTgu^onm7ZC|3>*iGAKA$;5cZv*bq$Yqj6$PbXb_P31vZ zRs8*77v=5E?Oec(!%$GYMq<X53z<l;-~N&?4QYpREW{l?e$lzIpZfd$?u3vBV+=he z?guEjzz>VDMm6u|7k|oCCFUy}bqpuE-dd0W2F1RdwV{sQ8;8hlxBVo?LgmI|NY(<4 z6T|ma@$pd&q+j(7|5}zbPGWO-yiI_m27OXRQmGbac4R9Y0OnBd#K6F{n*|3ajPZV0 zdmtYE_}v9wmRnMP6|ILR_F)>TggrhD!O7iipUmZOScCWFh&&ql9^$(eC8Xl(MGnM2 z)!K>1Cyqv9{qbm%rXb`q6PTjV980{-FTV)rG6+N%2|-vS<_7Bxu>My%<f23o7g=@4 zJOieh$^ZFfBsD??Sf6|#*bP*mz5<OXdcJD^r0v=Yd-RV;`0<9gxKJy-{$y!q);Ko4 zt~J&z`P!V!Pf#65OGXfI0u12F0b$_iA)w%isSQC`(<nJD!p@1J;cOc|@iV`+S9sAX zRjp$RB=E9TxxYM5vrI)=H~Ev{qA9sv3fZUYH$j#;ihK*XmKf$YZ3i@&1@C`GGDx~< zw4jc(75H+$)jm|d6;<_ctS$hEyQs%tEt&N^c7s&<pGv()uZ4s1D1d$o)Nbl-g-dp0 z_5+}y?$eiyCez7_k;&!wo^;ax-e9bo;8ceq8xul)661LvP&}ugc>1F=`EYjfAcR1% zq%?2LNKquW<jcRgGT-g&Rm7_Q<+^7X3cty#@EvAPBHZWie4_$3N_V7(Hzmvi0*3*x zu1WJ5i*-?+C(q{WS)!H23M7}T8g=y%nh>kd7eTw@mB@W0Q0ml?V{YO7%t4}(lhWr% z7=i5hb2%vj9EM1k!HSwDIZvHXQJAvf!@d+t0NmB%#0e+9AWlDG+W9rp8)*;*19X9H z8Xsjs(;T82J7O3E$BWLfYg&4KDwnWY9@Yd#9YWHVk>9o*qFgeDL^`#v>u7nO{|Y9* zsf3zkE5>9U^5?c7>kR`!EDoIFcIf~gjM)ZcIu$8Fu3Tc{MbZ}#tq)C{5sf{OpWeJ& z4<|4H#Z-z>SdLS!qClA`s-W(weKS&j+>QuO7%H5y)kV}AgAZjlNbCCriKZlcy6u<Y zf=+sYGNrC{H_1Y$EKcQ0g4>Dw=)w@P(R;=?dv(lnI0y1q&Ghkt#lW!fQJ{M=JyLsm zEH_LjEgKQ?^174HIK{1&97fjBT$N1(V}y6BsUiJohYzIKZT3n(Od#igY)=uU3}T6y z0%k>0#*&i8QhLY~;3iTyraHd`(hD`>`eP$}XY#pQbwe1A!nOz??KxBnWDsbpOC{dz z%zMggMMcX#m$;dKEOHA&mn_M+`#8;n@<COeZ$b=#i4#VW2R0&#DuGf&v>A$74o=I; ztIRca(&jVz+p1DX_5;8$&;;ni!@%R1;z)6h`KGq2pVIUVn0RJ*Zgec$+S-qU4(4yA zGTkoRCCbAupaQr&Up%pCf9iU^X-6OrQ$U!$zS^B5ZJKzrMA{-)Et}@s90(%Ct3T2X zF&vbcTi;*ona=;!E<)h7*|3?V47b)8PCqyHRlCl7a2wWKvFZ%W1hz(ODJZQ!6hbgj zi138-&mnDIG-U_DKXmKsgk303`w?#siNJ<qdF>-15{nuqa&*Ir^@>ssc~E@=?XE<W z@HM9LcR?HLX{~P{JaHoePu`p=Ran1v%24dy)EJP==@1iw2MY6VNCz@&9+yLh@aLjz zay7HU8e<YX?6;`)vohEze4x>J3<>@^pQw?JVDD7z?K;{R@5ttLq4Vr^@oe>y<_le6 zVjU9VRCrE2c}FTf&_RoCSc`MncY7`4>xLGikJr74W$WAuGU5Gd{HZ^gEDGM=3-=qF zEV)#Q5tGS89pnv0kR}-0nP#KemO)G-apYIF?PN`>QC(~bBdadr?@#l1P+|wY6F;rq ziGQe#&KPd?^d0M1xp-f&Rf`k!)8U+YIIp?Bw0zB&Pvo8X8Njo;OIitRR4yKeH=J&Z zDGNyNObw(nvGRL8q(VNN+Ra{5S%l<f*Ji#-6fT(Rb^GS*E6uh<uR^Bu{eiWcduwpQ z>A83D$3(iT=Q*nYCz%$y7?0xt58^TqVzByxajM%_tuL(!N~;)OQd=WQzz~>jlW&O| z`Z@a9Q=uySxg6A}22eplrhy#7nEX8K_72xqmgj7t^)v;EZri2!wG!!^GJJb2NaNJf znTbcR-T{P+Sd2z$tB-x8pPMlTsPGm}kSNeoBq!r9x;_}D_2l{31{Um*!J<UbXrPV6 z7Fb*kWw%QDITAR>ZPpuXkol>y51PE*?bZo3wh>F~U=HBQ4ZgU;WN(p(wwD-$WrueM zxTD+%Wv*su&Ut@fT`w_QU8FnF8Yui?3r-v+?=?wyE`}$I-I|X=T~lPaVC9JMt<toB zMPmGrVdoSN!<X>Y08O7YFncRr>r>CMM*t4$K6EZDcm$D9aQhCZ#U>%`g8QUhEw}VT zK1i9iw1hqQ>4}bN4S`lp&ENav$mfvCFGS>M1$$_UmJhbVVnE-xrJ3Wl82RdEWNJ&s z3Nea3&!x9FAlrLYZkwyOa>!&V3&;D%HB+BQToVmVMF}p4os>titzzN@qg5BH#V%_T zjfU_s#bmdmM<6ku^{ru5baK-ZEtS<-B(&k<rF?Ig)8iAxSrIk2EiecXQOhBl%{Dak z0PnqOx6UvHUB1chS>RtLw#5~AgGfZYQC{#z^2Fl&0N%76Nt`jcz)%Q!@L}pbEAA*; zRi{A><rT!R0Yce$tJG|ExY}X0x@k8E#lQ&1JEePkB3@hj@uBn6VekQ4D`lh3YYMeG zc)@g;6vC_~jn_~#B7W)-%W%>~bQQXJ8X~wrp>OoaFq`gqVF=O|$8wPYLSa@}r#JQ> zv^cBTB-@+RX)qARmPl~y8s<iFxpCCX>Y57$>>D_N7gT~0nadbwfD4G?=;(1Rt?fJ7 z2EpH@X#e1#oVcm!x!%-n$rM?ybGK(_h(iDDl~=EcSA<Z++h}N1B(Sarj)&}vtFpHX z|LC1|n);W;IO{#|nfxer_KX*a=eO8aZ)r<OdPT+EIV<h&ax;FZV4uG{ZYYIoiQD7- z0qwm?(8o)*m1#l<^Z)0tll8%Lv_uDi?%a|3gWzx6sq+PQ|8{x0uXx-{V6<<1{yacV z;Bo2ec{it8y9RjpMz2&UGlLDxhi+6IKJWqe`rZSs>b;9wJ<Q;6IAv)b{C4|iD1-)p zV7W_l33z=N3AF>O>)+OA$_j^4%1caNZf9iA3X^r}9yYxBmU$jl?JeskSi{{BmFI$v zDY(JEfl${olqI8Y<bh@cn`t`R8TX)#@4G{E2(%T~*6SUnuW=<7JqW$SQ(0Ca>7ar_ z{@Fh19;v%u#xH0~`$cTsIY_K>i1$5vU(s9S#oF)#AVUb!+{3<GW!NdE=o+I@yc+B# zPgv7>5u(YeQ>Pq&Wtl&`LlK0|(yk74-!z?g%w5m#?FSd)4e+)cf>Id9tpjMy5Rnns zD#vlmMTQiXJl$GnhU3pueC)v~Os!h(8CS+LwOjOc*C3lRidQd9-j8H$^#zr0LtQt& z@UpF&v?@Zf{e9xtEaEz_QNPjEc$p1#3A%}KlV3LQ9h(}2$+`|gJ5Qu(S--Srod`s1 zF&&s%8l%~Xu8n(sOl=p}KAXha@Olv{AS<_UKiwFdDeioI&7bTxQfA~MFPIeM?<L3t zq40f%HkLzGy)~gd!`UF1DQbV56k&?=?9y!e0k6zVtGa|fNwSaObjR(8)_OW#moL)6 zIC$p$<R#TT&VG@!-(HdDsXJhAb(z65JV-N{dEuAzjyFWGjkcGXH4~n2y;m=k<8ls} z9JqpLT8*&Uov!Wnx0Te1OX1<^N!nY2^Fo6AN3b>HJcs@M&_jSb`;+sW#8!<`Y8NCO zhB4zX8X5^hfiq9!g5p%i=EmE_u=7mhg7(%VTDx%7B`$)xa<~t4g3u?nI#u0^qe=bF z@Qh<54(qK+lb^Uwas|7))|DPKK+Zb>mFPCc^7BF)i;XHBiuk1pW((Zu{^wd2&Z$Bn z<kd)rWI`d6ssZe$7d5Rr_rh(9)tjx>PU9qLLtpZaR_zJ&fz#^rd{n#=f=tr)D`;?1 z`VHSuBZQ+k59^%4<^udm`d~8CGTpN2YH-04qnwF{7GugtzvZN={S@%Hz8h@sx6E{$ zuLbzQFarDLr|xQntH8a)Gn|95w}%buhc#zi8$oV|36_OLV6}jW<#I!*h2wHJI&zF& z5xTUoGD0BTf`@%d>DblWP}{3JuP{Q015z!ao!%TDo1A3(Q&`LPV6tvAdA3)t4GtlT z_(SkH%t62qZN!g+J~|EveCM^7n9j@TllS1>78|IoFZ89YN-)tq$ypCiLz?Gyj#n`@ znxn=L1-owBu`iNnAS1=%s8JfQ0VVr`3CG6QMI_qBYrd#)yT>iA(;K?3Iuw~FbLbAS z!~jVcD+)?d6tQl)ixwP{TDDcdUcLAgKrmffV>W_RPd_@Tz=`EDA#6a$SKH?IxAt^_ zm{H8h!T25Bcr_b3b4!sG%W-;SR2H0K5Ou_ay;3TRN$g^NsiZN7@W@DD|2cmA0B_U= zrj<dR59{W#+*bi69w|n{xb_h|mpz}m^qOq{cJiG^zX6fr+^jpk-A^{^NeDMSm54AB zHXbIl&rdnScwX1rbHylL+5-5xn`xR?r&Tm98y~roKL}G=U(VYNrG$duu3lX61R)xx zcwbPz8e`5#IWG)<4Py997r;Zks+I=XSJQEj<?e^!m#1mfI*7o1*<-Uhx|gEt?1d7e zN7j8%Jmf~+D;1eL)uwNS8;#F2pXI%!{Bn9zT@lJ9uXWp8Z)u4!k+5rVUEU6Cov=OH zTfm`ELt3tw>&oPL&E_Ie78O||tUI?s!w;F6xJ1rBZS!8!zj!!DDJ_cPyQk-R{qvc- zQ2d3`LR?uH15Dx4<18=rXvPHlz>Kxf@kC|baRD#<{Wqux0Z-8r;;~bRvW9KlZ9!Xh zJ^Uiq^I?5PTh@tYE;DG>n6C4>sNKjB@gR?<?c8D*&pyTRMRDQy#KpI9;DOY%qN;Pt z>Eum+14#nk`*h1G#ap*($tw~ZC$fzSyfOZh>6DoLLqq$1W&8PZlX`I^NhMyC|C7%5 zl+gz)g%2|n-!yd4?Zrm7N<~k+UJ>h?(r;=2ZT`Q9W2_GZQ#ksJ35+q4-zKKNy`;vb zumxuG8|1kfulan1O+_k$p(wT3aO-{uNmLEsO~0?j?EgD>R!o-XE&(2&dvQniWZCr~ z)5N?A*gMtF>p9@L4`P~%U{=&_bEqAs>t1bIHY+cbSeY%BC2$97w-L<!z~Z^KOz-z6 zBGj_b3aq2m!`A(;V)TkP_A$vkz{#U4E(FP3g`W=-@d0u%_T|>kw+dgbaf|jl^roHr z6^-F2JPR}o#0DF8h76OU7R!|yeUi!#AG(T#58k@acrwkEIn_udvf@mSjDtLDWn)d2 zH=+Y_Q)^)9_*rQ~k!xF;?rDDXOYo)1a|2e>)ez3&-A4zr6)lVDbW2ft`F%ZM4}nxY zH~e2~T8JIQR*Nyaahmd5#wB1$iQ!}GyYc2jEb+NF!ELQ5JdS#?G;0msD;L~Bin2!a zDQj$1+QWw!#{JG_?tJx!$$axhv8`ciVDS%*$v^^fT=#&=zpM|GkJx=mN5(T3<H+xx z;%&4F&38|aDBib-Y;`i}7Ka<jAJD$vOgof-RDbQ?lQAO8!>C}t{YmWyUp5d(hoACw zX5oQUt2Dt400tIZ<#6Z_pZ^@Qs9;}>lTbmM19sb?<f36kAXg%li1zUo+noyCZm;=z z6WNzde?*Jp*;1mkC4+F9)5o3Y=K4v_@>!9J)H|B9dq7#v*UqpJLrGL`N#?Lvr03cS zKsmjc;%mlpUj19ue$Kh#v|^boK`(?u&rcuFKRMkpXLPT+5-82@m)e)ropF~%CtYYX zhP9rd^qSso6Om0nIzx3=lXdY*hYOK1EQ4cxNIA{I1i=I=NYCW)_~Yd`-CA3`?ay*$ zZQEI$VzSt;y58p#*Q~xlZ-%{seo6VGzQFF~PqIXV(s#Lhkv7g5t@jhn8^N4TnT-o| zo^5AVCYiQ%Tqn#4?IQ{{^SS@xTuV(a#c|?-`|^o(2g*u8ywGc%82yY}tX@%8px%Bk zLGW@6QNJK}Frm#0?aCq%)R{TgSxx2p$V3Wz*AA4&{zh^qAHeb=YnIN*ST9!ut~{6Y zGaKPBvg;?=DHL=Qle*~gIW5D0FP=XY;(H1ON;EI3FC{5}+^|%3^aHj3KT;f!Mz;O1 zCehAu>hw}8Q20Jx>pcOJlh~w?Suu~MaoToaw}LXHq6BBFY5bd?L*d)CM_Mq(zmuU1 zQn$~N7EC;Kxc=QMTnCP&KL;@aA($j1Yegv^w}y#`Qnre2214We<-agYSa-kSOGtZx zG5_w#_oX?ZWv*1UGKD&CZa(Y&&}kAFb~G=TO0)#l2fN-cqD(Er(sd)#qP#NxqAstf zt2=8vuyO(+2QR0YH`f1p^+ZEP^6ewy*O@+IGS+zbnbovTa0mYv&g|lrD`G?X6|DX6 zrQDZh*g1u3>a^vJ)v1GPykbSa@{#sO2J%5yF|-lB_cn)n?1iK=kz_aB%HsoRX?Yaq zHj=FNLY0OJ+^$!HnE-@vPSL*)Hp7&2fAS5ug3FAXNK;C&qsm173nTDDn1ulWD-i`` zG>KySK%rQ)_>;gBH7^zTyz?4O7N+hOoy}`5JCWy`-3l@gq#&$wMrbE7<hc@g67z*B z?SVJsYpEM*tax%+)@dniU`^Y7KO&!6u}tP^!;B1UFcz+98nfxQHz4w<@5hX-$tcSI zMR>px8yD98l{m7xm2rrIMJMLk2)N|^e4(nS=~H0Z?iwi&k2hGoEd_SB|0O>^h)WCO zNTb&mT)h|!g)+f)N&L<%F$`w-%wxAZ(!#dd;d;Z4Fu!V&+gWQkybMZZ+IhR1*PN1u zmT<}mo*M{7=?@LDJRhz)#FADM?&pY$lteVd=kxNQFO+$n%@YYPi8tAA;S7ghniFsL z0Wx-x4_UdIs`s6)O})uft$hAan@v%&C*SXyNFeEvNoQ^AHqG$RDB6G2X%A}Ss5qLW zHZ={Ow_{c@QZ;K(cyXYX)6(e@r??)cVi3d66pZp|0z0TJC+^J`&)d(8(w&w^hNtWF zhT@Wa<|vR$1i)Y4ds)mzWcw?-xx_tBOZ~}O+|f&Ski40H*HnBUuMBnft04M<_S3Bl z+Ry6zS?(RA;R~R34fgd$AAV(bz3n{k+kbRfT!5$YJa*kWNLAi?wn8v<5`h!P@BnAM z&ZL+`B&QCzp-QQ1;~tXrii~L8RR7l%022sY0ZXvPDTdouA&f{x9RNcis!=nqY&<P3 z&Z>)KT`o~V9-Ph~2qFD~h;IRS(PY6B@UG6Q8NzezB`694^Eeaa*&YVE9#<kE6k=F` zdIgRr^Yg9tCYtVNjXUofUvMn+xK3;QEjzA;5|77vd_PxOZ*;Lb9Lfm^+wI2w#5RcC zhGal4Ejt`O{F^UC?>7R`3rCCx!DPA8)Ofd`yTQ8VFmveMWW_>_?R7K3Rw<j!D?cRw zg@@{gsbB)k?=CQqLmMw5_QDA!M&WS{Ev8Zp$#?wm7N$kyzT^*y7i$hQM>0s3<$Gfu z5Q~77hkxUHKFrTw2f1PL-7x(Ale0N!4j~ibhSW%SnoEEieOW?Gi~%7Da@8RB6y{EZ zF;)S5NK$srnpP&~wd^NA=erJ?eyJJTG^=BzDHN-%`3Inl*C$x5Ot!y@$)E;~cSvAA z4ERSOpefggwazXk`bFYYBW<S^t^U5JYZ0V)WyE7~tN5r(GloT{ji7rZi^O?R)4*Z# zhc%@R?9+Nf^*tu@`C}ON5h3d&|L^*?%=*|0Qa0*zyL)Rdm-h(H-PI`-xv@ztJ%2}& zaBm4GN~3=FY%TNFC1#y{_>~JPc%}dk6!@1rQi{WF<9rO8e6zx4t38vlfHN&Q1+;>r zfEuiEyiHW3C;qQ+Ae_Sqh+FjzeyI*oyzh^O?ZBr#O;pwSIvfk2jAa1f`yd4tyeQ4x z2zFO5l&jJK!?-wt9eyc00E>kI`vRW&6W?_}$Lnbi>Ds7CJcAhR*J<lPmeX-*@p9M8 zd3vj4>&ooQh4;tG`$PA~l397B@mjlcGk}9=op2wBkV**kfS0?UwqJC?*8T$u7!M@K zn6-#9bnPxMRL`}*t&P#zN3Eg`sUwxmyH?e*4FkONMG({Bq_TPF2H4JLIK}gzbsK0) z;<xqwgTXVy2Z8I9p6hYb-x9cV5Rqk#6>qOzF1njL@0Y1EJl<aq_*RI5alcj3MtpU~ zIu?BFf2;-)vXF<+7Cw{x?fc8cO8pcs&eWyY+R0PK6)*-aIgID5)$+~p@K3H(Gu8kr zbW)br^HGW}t~(~m-DQsSKBoLE@Qs=N#B)^IkFjf`>6MbXLbuujxcvEQ;+#EX*LYt3 z)IThe`DsHRb**RoAywf6`1zR9w~aWZm(pn{0&A!YQ^KrYa+9#$CO5lE&|nau7rw%b z=|R$;M{V1{b3C8S{&#&@aL(vKwl}^I(W1a*KDYZe$kwEN;=)yh_6>j_y~$|*Fr#{z zvc}SVAyQPiX|L4B`x}YRFo)KNcRDgE4x4_R?R({(Un&_bNCo-7C<#DMe&B+8zs4?J z#u{3@`vrF8w1qaBuGRfemUgR*<HeXPd9N<c7mcg~^20)w%XX+(zCDOxIKW)YP**rB z3U=%BQMl8xX|c_(CF69<(*YFOh8f`g`=F#WfyKZO#t9KGanJU=uLX?zW?5G(>g}Q` zUWb2uHMZe%y&A;mxBazPqffLhrrCoR$PT$3cGkSX3qjI;-e&%68<<5!oI<3G)PbBt zh`N=<VT(LXNL1IG`NafvNFW=@g&R24L|Xc>*1sf+^u8cZ&e5v4?L@NmeGPg<+0i!1 zbR_<Ta#V&+LtTY&mH!!$`;QFo(=O7GQIn<?y?+lh8*YYwNxZq9fn3Wj;r-JA--oIB zyZ28F1GR{&Rr@KHsyA0@qN>4n(=f7Q!l6O;+pUh9Nln3)_$6`!>1dvNwG6|IdQ$>S zrdk$*-vuFp!u_qmA;oQBKz<Qv>sbciQV*Hb8rpw<*}m9ha;gwaB%%>DfJG~#3Z`$y zoG>&ObX-ATxEDAQuujV5bR3dT07d1bpf&TW#Z}K(^6FFtg2W)3+De^wn;m5(+rkt? zKJ*w;#7>$GP$>*gR8Ye+f$_Bai|9uRNK4&3AFnrAI!;Qv<R*<+_g!-nL>N2e$DHOG z^h|m^KBT8<<!%vk@*5GU-HVT*e8XdH_vRJ*eyM1$TGgs}(&hh~up;>ue(z~yLs%jC z8QmOs?ow-TLpI+wmlsHR#KI<B&=*%|Q6-8{O$!8ZIAIj$HAhuwMm28xgG^`9<@_>y z7j-|Z0jv;bqym69(eghR0o&<CJPgKZnj;=zO+%10kYr1xN<;L%B;#e6*z^+N+wP~D zh;ot)Fm{l!eDmyo3-k<uiWNPw_I^pXtQ#duJd!z0r%34?3}T1gIlv0W#5KY+Z=;7r zhOI>zV6y4q*v|{6h3S>VZl|D4(Fen*cuXaNN8?s62|x;YRD8KVBUwW+B+;H$R@Fu` zz%meu_)1QY6{=c`ctBcP3+N`oui-7ow5;?#Kd-Vmj$eV;h4W_YCH~MjjPH(lBQ8NZ zG(k)|{VO&L=4t`RR=TE1OZWiYZ`w6`vi$~{z5Y6X`QI9&a8B6QS+riMi}lWa{FEMO z$n-^k33%6btcUPH<2#(pParKK#f-qs|H_ly_$k&;NejV_+q@ISH3X9f^0e=KJ8!?h zp6@2`yp@L-8L^%yYe11<CsJYFtMdfs0|J}38a|2#QH(thrG!5P<|K@51Ib@K<7ZQ~ z@f+g`0AR4o<yA?3{hArVU!}@$7+i|d91i_2x)Z{0N!Zf~a=pP=Y`JO?ec#&lEt;<r zxf#SY4%=v<Yp_*K*84&WZFJuCVuizG98uYJT!#GeBde-}@-dM#MSxvEfW1Ete;b)S z9*LyaHh^8EO_tS@LY7|Wb${8s8lD_AfchUA(6$>TC88g7*bu3>p4YSvZ29~%ZFUX{ zBY7;#KGhE^YEa&IMw$&C3J=!^DS>cy%fmzfeX^sv^In5`T2ReDXFowvCiG`pN_mT3 z&<=8A46i95ejqmE4#m?ROQ^>&e#O9q5Q0_%h!q>xb_fZviipLRd-k3`h}+uKsD@i; z#F(og??4h-ndG|A`flV$e&Y%Jzrdalj=|XdK3KYlR;?LrOEs~fme4|ZaxK^B*6J$a zUMa^|+8QT-p45C*bQbw9=~y@?=-+9DbFETGy8#G0gsqAmGE&bND~;A}G%g3@0KV3# zqS{`(X{yv8pEqcOODP*4PlaMEl@}yT{Xuvtm$G~$%-$>vSYwrBB0Y|S40{V8_l9@< zh4NET`?e$KuYK-zQi;(U@3^4Nrb6;-MHZYE*mdo?OGC~cj5Fm8jHyDu_DKJ-1%Dz; zF$MP96@K;&kIviIok(R`@XF#``|NAa^J_V5-eAypzGUl~WrN}Fzu!LaI7bUy>*r(& z%SzGX#w|QHwILO&IkstPOOs4>?Re$)Dd!TIUbw4I8M?OgTbvnzg6tVRb(E4_u*Q?@ zI}ss~gg<&a_kcz}1YdF6F9Wnl)t6ElWVmWJcBRzSQoV2ov{$6lL|YL4D3Vuw#Q9tO z!NG?G0DmTO6DYVo%#RK-gmXm20Bw@_htv0=X_<z>{`&3jN`!}Ai)EnEGWohk=Ur<U z&C?_ttnT&B`*K>Z=5n|0ei4`wgo!>$f0^?K@mTOrzw2C)bh_As$TEdilH@T|l;A)X z61=i15O&+dFx0q!9K0A%+W!B_HUA#S_5Y)rfC5+Z2@H-Zo>5hB(2O0?p~ftDjva!# z=8iNI1uUYnX?YBR=k|}<-~O_6t>jY0;-EWPUj&%muNF47@6w-ncgu>Ri?iIyJU`wZ zVo$Kkbu1j1R5g{Gs%sv1<7J6|K1}g_;8K+!@IG!r=OCTRt7rVHVIC^GSy8X|_qhz3 z&6)ygS8pwv%J1KmTFf&Qrty7;9c~o=k(Pk>>X^~v2MKFAJ*8-QpW%A-@ESIernZBI zJ?Iy$#H@H2Ql<##h)}SqIzWL!F9ZjcIJ~TDf83-Ot~L}%zia<+ij5m^miE)F5w>7x zX<E9K97h3V0|`(oP6BL9F`Nl$BYEDwd!k#>Q+xICd|60k?v%If1)*zN=noTkdr*f_ zR(`~jN!J1GnTxdTr*(^a1@SU4xv=3SW0cJsUhXZ(L=FNFLVPyq0&xB)h!j;w$8cDT z1DG?BZ0nfe`HVY;sdx20;UdO`o>{Hd%9eDIdO?#aWfAyX3|L%N3WZUBCs~AgRN2Xd zf+8ipc=3J5Vlft+a1gBgCk*`8feHsEYx!*fQA<cFjhplec6C5C{ks>k?(L71-h{t@ z|CLj&lzBsS6NdZojK5*TQaeHHILV7|(^Aw%S2Iey-&K2)cE4Va8@ycg`D2dmj>e-j zW6G>9k#Ydk00q(Edn7iC1h-tA1&~ccq0GKDw`*@NYIXEBZdRz*8%Tllulg{#WgYuc z^frCtA;?H0D<5moT+g<1F{utBC5|A1A~EAZsa(~!cy^bgKwSsrprD#ja`m1Aiblyh z5noT%D~pllN&m8Dx1GT2`l71zz4Olf&RLk||N5LtVLf@~3rnNU{y}6LFB{i8L$VUa zQ&}jr(7fd|3km0wu`T76+XzIq@LmA^8n|=be+&_5nGxR(cQhc7MMS*{lmNTS<Y|=I zmZ=X7Xa0r}Ja95LFCY6B>fiCSpN@P%ShZ;oH4rF(OduZZjFGqtplL}DTbYPaMMhG< zyI{-UrQk(n{|P|%688Z983?2kZ+AM2)9G}hv27_flHhbWM8d^pwZODZ1E46cEqN;G zePtM%mQq}X<Geb9jB~QMRskwQUfr?ryZ#|X{5HF;QDTc6X)bLTSHt&zoN*gG>2X!j zd-&kj90veK1~7gOzJmZXup0N+S5=1)I;Djae+ppm-f<DyuMyf1sM(QtT&%XqX#<KL zq_hT-9`b4f>5Nkw+whm_>e(0@-IO{nf<Tkk;g!0wa&$hfTHtt!ZG1)73TtJT#t95T zKAw4yPj(1Ub5(2R*4VuNC0(h#!pbs(+(`MqZZ={$B#2#l#kPL9rVaqhCuDlwFYUF} zY%=$UW&I;LYMDa%%2PmJnFWBdN1s~dUK#o9Sx~aKf|wi*|BR5n0jO1U()2pSy7O*c z#BiLuh!Kyr{A_Gi5#xRWDj1786SmWZaBY7w-CD7D;?_hrak(V6ayBnj%NWMfV9xtL z6#^t*4OzXc4?Mn!Ok&#ztz3B_+3IEH)n7J^Vr#$ZI$0;kUFMGHg*fpQm><s9xH62h z{~>Y|?K$r2CH<gU;I1#8?{s%|zaAxrPu8A>Zr$u(ZnDHN4HF}h);NY|Tcuy`cQrPZ zDC(E0H=a0c*@+5Q5^EVsPzlLKitoL`fWmkd9kaox5`He&MqnyfB_k6VE0~6{>MtO4 zwv{{e8;^puv=~HFr9O*s*$8B{U61(|md!Uw^bE!{xzYW0X1#AfF63@Afc$gO^I=W3 z%w8rHe($os&^9Gjk1QBPaYh-?UH=JH|2v`908CVo#ShDlKmOwxKvvOu!Cd3Qo1c4u zVv-h0Z?G2R+X%9BPS8E_H^PvfNeoH70Pgbu!=0hX@C2!@=@HQgOnp2qrwEVvQoW!C zDTw%y6>SCD<LOB=KOUeaMnBE)7twj~AElh~U{N&<o;`X16tc7<^84DJn}(_9Ur`fj zEGw%EBWcV!y&6rwtpN31YaQ~c%y{<yV$Cq=J^ut%sgD=WXOQ|nLTuM%w{6He&hy4) zszIujHkT@S=P@d%#^nIWSdq8m=QRd^G~sgwPzPn+RSyhMi+|PK#Rgx%kGJPLCg&%H zbrL+3ZR7yLf66{lhPwCL9m$&<P=_P&ik;v{rbsdUn-};`@!vo1Z@OPL2QU+67+3dl zAcoHGe{}>PTbb2*F6svlIsw5O3<?*?FBMpI+d0cAJ{YJslxa?!)qex%&e#mO3W(Q; zYD$67L8$Trz9ATR4u1qh&1@B-<EK~Fto-nH+TNc}#>=Wid4Xz&Xw89lKA@O?;Fbpe zuM`?1`%hrP?uD}t`wirlu38|9tgL?H0A~XDq4TaQnO<Bu_vCK5G3lKB6c0uo8aPG8 zyXksI>)qMP0{5K)1P9PYtFP<*=6D;fhfGzDH2R0m&hnyhL1&BG|FAGG&|L0X>)~jI z+>aN+T`f?UP~w+3I15b*k;_O1hTB%h&VeOBQt@p*2KPak1jMQPKw1pnpCG1J>-Opt zBq(~O`(Jl<W6&q>Zjz)efux8a_~d4^bhaxI40ua*3}!;L5f9Yoo^nZg{}9Mr|Kjbt zL5O;b;!Gz-S!tuIJ5u`p;{^cJ*OU`UK+e5zpG9rJ-3=IZJ@1sMsjnRX9}r(eL}4mw zMq($s*Q;Ti^S%LDN=-&cCTiZcO+Q$WqHi!^aYb9mmP=ceO&^g{pY4DR(v1;GiYp*n z3(?O2s$&bf7ocVUb}~*B&J3vGrAVMv0LIo{NVBaOK@oV^+!FM{RgKbH%#|g&O4O?1 zs?4{TZPynfgKUVE{_j-kz4iV7H<kLTcY~r%psI)fcJR%$zqRTTXIdoM4@(LQ&+)I= zwr_Y|#-x=i&QmfIqW&u1+pXeud87d!V%qnQ=Y?+KDVKe(UzY9ZlGgxg{@z7Qetb!& zyzMj+3iWG@)1s6&e+qw7EREF?+cK_wSzFiO-R<@exfO)NW~IgKglI6(1Vw`4oFu-= z$$q6Lv0a`{$)dvfc2eC<hOZ?4Px%YTSnJ}Xx>A;qj0oo5=RS7BVl|LrG_ks~yX-OD zwh|HtDBMm*3B3KLjD+pEEB#;l&M7gikOU8|-@mWlqWMTs$fd73E?~=eoZT!p%NYI} zMuhMyqYyUrG~O$Hw0o9pbnjl=_wq$bk$rHpq@FB@()NW+J>g_~noHU`#}9}ghjR4{ z-8I7^Y`byUN7y`F4HLxAS85LP0t$xowy7;;px*7_-_T;es2xvzDZ8V>WB|s%l`7$( zt)-sOIn#+Z0lf>qt;1=W#I!QvF1<8b&OZP)7YF1z#``7PVLTMslln#8qpn0(FW{Hs z0NlW2+niFM-R>k_t<yQilVK0rHSoKt<9f^pz$KF0kP6#TEumc4B5?i>9$*S82U)PT zaR8R18WPtEJQMK$lDI^-zk#7a3We{Yhx^kT-|aAWK-*-S-T7R4b&gaWnEl+bcTN%K z-cv|*?0UOj8O;sG$9_S%AVN@z#he8ax{kwnOTW}LP~Rd0R#8Vb0Wmf9PZO+fToR2Y zSr$4amFO?04jA6sS*y{IzdQA1;(n<WHG3ZduQA9K5xVR|DOeZe*6$CRJgEPzcz_|7 zV1aAVJswvffsh)~cEPBsD1Zv94!w|#;pJv;=)r&tpbjVy{`QL@Q!S+Kh4W1W98c*2 zsJjd(iJ%2P1ro+<ej(3_qqsu*{goI;H?Scfq@;saRf%4xCeTM;o9<t1fKJBBp_zRW z+aZA9|2iU*%GoK#%yc-cKYCb;^4fle@j?62DHmMg1+-iI=aS&>Md63&_w&6%At(QT z7<&t-s`f2zRFT+(u<7m+P`W#%Ll6mRq(w;yL8Lcb(nyK4C=!B&q!NNO0*bUCph!uG zZ?1Fi_r0s0@x~kDj-z-L_WH++U(BUI%$O3i*REgtnK|Wfy4hPrHKmJ%BdeB!zLm%> z&i%;;@tUm<4>*)$XZyLOr2GhU1>1eugU`#(xs;IW+uucy0&S!<>iA%xEZWXi3@RXQ zqcXh*qIJ*?5n|9YEXq7p@3>Xfq0zhCM=Qkchv9Kmpl^*YE6|!gU8*67Kqg$MiXOgg zcFGMjpR#j%)|p3adJDu2qzckU-`az1dybyRaYL5;cy@enAY{v0zFj?D_vMz&-kZUB z*@?G3@1zM-+NpkD`ZH-KPVzhvINjQ}cPnjwnP(W_0j+4-FlM7t9nBk%G)x;hT=SsV z;iiQvn(bXH%ACQOwHfrG`^V<IJq~$QCA8}=P{p56Dh8NzUC>Fz8LMKaNOJQU@$zN` z9PcluQCkPq3LB621OvbnzGdKk<|vPKZT^V;gtSvX1NB>-ILS98DpB0Bx9EhVX=QF1 zDxZLUrun7Uj)_8xXMg2sY*F0*seVq9zEQwBdhs^6yLoGg8-`zNap@dLMXX~Sa8EO3 zc*uzk&K!2$y|yp&vgsL7$ntnbs#`QI6)_Qmq@dL2!tgen2pr*?Yqjdab{&`|y&jy` zkZ?VY(WjIcjLca#Hdm`2@-Mxa<Ed_QhpFCLHx;0Xs&WHTJk9T80C)eFp+wdtFF+8v z=&wKbMBNadbiTI$?avvng}3Jg!<%rZ9W1;}S$unV$~X#wzH7QzV)j-5e3>S_*1G*+ z*o_-?J<FcJ^8r9J3Y!-{URZ{_n-jGA-pL^`!G0ygHv{7K$h~{S)ol)aO`4ZxykGxM znHoYn(S)D&He6}UV}H>-ee4`N3CmU)+i%$nGI2IG)$xJb0?FQ}rRUFgUiX*As$J&a z&~H#r*78YpxT$O!tERw^Ij8)XS${!Ruk(kzg~hW0uU^TPJ1|`lCJ|O+`f@K(x@S6Y zENJw?;H^b>|Jz-9GV7xEbX!ucGogg6E6AlD_sWRp4p@G(WBOJLWr_56uR~szXG=M5 zeGdxk`76AE<zA{tWmDLLHqdR#{mETRK>n79MbhamZyq;0w_a=cdE+KjqW6vwN+<v3 zhSZmLMJj_e5iFn9m1v-q?2Y~SFpfT7`psnZP|qdjkw=qJAwV`w&K&PbY@NtDO(V$C zALr^OtA5&3Z<7T#^_n+-zxAVcknyhrk0MGkqW-;hF~fQ+W6S&cd)(7(0ykeA>{Q<f zs#-+VRQ?XQo<((7?)>^C@l-}Ghj46u^N_hES0-=rd+#~=ais)0{;%Uvr{l9uZANWN zxj$~~V39RW@jSQ0ljA;AqPfJAy%vhcB&eTh;d57ysEztn*0Yy6&xUej`X*wy^PS5I zZUx5L$2ir5T9n&bjJE)_xkPAGe2k!+3}H8%*{M5m^p+};*P`gJJ$e~@m{WE|SU>&B zhBAVHT8OR`$6%@$;J7Yf5qj^@!@D4Q9{|&Ot3~?oi;bVHkiH3}CsmDm@JWLa&3l5L z62{(s)LT9m2dS-_uH<jL$=JKO*x5U79pauOe^CAbz@p8Rvbjd~M9DUUyPA8Ju|Ih? zXf2kn<`D>k1p4jgw5csTLYwL1+#j{#YBPLc<EEDn^6yYP*j^$3xqHWW7to8GvWdhk ztXnf7zh10EO}5m=yj8D3nl=f=d}g^oaJw4s5@AWP74?8BQIDn18h}xC0j^~}Pl}yt z?z+rpT)tMDFL$%+FfaVc$H1xwke@blUIt3@$pFaJXLLzTHqP@W^y3NAA5u!oU;2bg z(*5M-zi8P>eR8tTdTAoZt=fEr3o3Kb$8A!tI=#gMdPH-@+!}v*jMb%^S3AGW727O) zS8U@q8?P$&+df0!5DRU-Wgh@Vc^8gjS{ENwg}QQ&hRQn%jcX25zZ_H<3C@oVv7%WE z!%sxtKBa`|!L{b?DM4e4IOPX8Vm|<ob0e0x>e2>ipGI}vJX?t#hU_WwC{5!K-fGz2 z`uYCJhnOcC7w4aK+!)<a7W)lHy^Xp;h9cFGqpmoV>v6E42$w8PA>_>PW0fhUy;fhw zM!T!aJaXZ3hj2V6#C)07$rN>_<}4eo8t<bV+>}#x5!oV6Q4^sw;WEv1#q`)5(F|T1 zC@xtjd+w7^bZ}rip=Kr>*8-s8@s0J#&Yb{<025WgdH%ws4UQY1i=uO$<z<ysiTlac z-b<37ykz0onH6%7&Oc=Lj15VtSEt=yPxEw5&vH`5uxw9+{QCLUNFdTVs<tgjO_w?3 zsJ1qX;1<RoaK&E{f;fX(4qBx)Q3qxm_1#>#6Hu#AZ_U;yL}8+&iY@0<FnP`-p(Jrt z6QE!nNU(R2ffV_g)m14u@^)+^deT55?mi85TTwkT$`egg`^ar=qE<*fzh`Rq<IU@C z?;mrHcKV8V2h2uNcVV6Ls{$<q8-2e~gk*d|fzz%^#|{)pQId(?P5+lhnT_+FjL$yq z+>86UYK_*-6>S{jdq}}oL2&iVYR&(ob4cxq#P}Zb{!7)?ee2q9*Ha&K#=dQ{j2gAF z_*{0fn&C!~c~uR-ntYz7`yE=sm-uTdEBwBGM4GB)juTm5!)UR5s;{vrLff);@yqk& z%l7}ktAQyuJsiUC?RTaAP&XrCaHM)vIa+}KskUv$#CoM?|BWZ_Z~YMqma+QnFN910 zs?HN9owi7x<xe_({yYvfp=VFDaw~gaJ8Zn60(yYWJN;w#wKF@hMKDTeMHVj_xj-Mu zXGC<OXDqJFM$*hhkn0KNIg+|j2)G1cg`R%RZqv$1m7=>!V04r<WCh#bUTfhE?EASn zmTi*dyf}fEk`^W&EwdJiO-9*<88%U0WFokl3S<F3ed%xavQ^l((QNpxJ^F^=tq4wx z1BSG9Z1_^N3K211`Z)mME$%dpEy?NEQG}%<wWz8PChz6JYL%(R4)BYwgW68uW#wLb z%A+c`vS0APCaQTKHmc15<wUaz74h4(NA1LQmN(vaj+whXK<gs1oL%5k@lHkPHk}$K z={Ub#;on+8lR~t4Zi&(gO4LFjaf^g3Yiu*g=~wBEH7&;nbE6Au4cH=5DwiiHx9%%S zbA^5MUh0bzxGgr>h=0?U!3oiH{r0~TSk-5<WgP-7WFD=?`RFwDq2KT_HC3MOsJtxL z-otd&*KBbFqAp4UUDB=A4gH%vmyPm?7#1^2ekdAOW?FvPRXimK=GP+Y6Xg2HofSQ= z^Ym^L`&VX^gMaz|TPOZgGhUQC*`oRN*X5sqJ8{^;)4A1dcC@b?*|TPIvVGpIu;Hz0 zK6Iiwhh<9Rl0_Qv$uTVV+)6Gqa!=5zS4#7iObK}IX%1@haz@ajR5b3zn{rXQoSm#Y z3gP3;Dk`12_UxQ0RmrguN4O%M1oe<4YZHrup@SBXXREUZNNXH-Q5RG?H!kYtHcg7U zjh&_X#v;vTxieB>)b1Wl^LFOf@t#IV{c2^p{z@9qW4gG5WO1dKK|$;1(eor*Vs05_ z#9qgki=Pq?Pb-%x{9MtG!_Rz7+2@fjI1aE}q~-d`Q_`+?#BHpq=L8G&B~K4h(>!X5 zyLhpLLfyc~u;^>a4X&4we5aRB>jW4Gc;_a@Nt2$_6f`2!d|~nc8*_NpqUn`mU!Hs2 zt!zfV3iFzJJJTwlH;a!vM<-duxPC8Tk~6WXntS^m1MB3^w7DpE*Ug)HQh>VnCcfjY zpqD_M^q2B`iLpV0*bjKkHM&(doWcwi%DDW*8lO!tEf-US*^~m4K+3@x5@5*>LcX7C z<TMLPnoow8`}XXjfBn*b8nSeA@{c;$R2nNAE8a&&<Yn@;VXdWQ?Qz#zOm`FDr2;7| z;>rvvI$?Mf9%zZ={%F&7sCeBma$4STN`1G(QN?)J3>f3by6G0Qtwj8i7z=bQ_yZ(Z z4Q8d|C3|aMGtpPv(xSWW@->}1YgTdyS4a<Aq{MMfEciSoqMc}tBo9>3F7|h2{2HO< z66iROy5rID;3@#|$vvMTGowO#oC<=e*2$}Ek4+y%72>s`+0reiBOPXf_r&JdK~dIY z_tudwtB7opg$bt$l4`Fhl&r*G+gV=dMV;iAEU}q8N%-T=CG>kiuIZZ^PGXLIH0{k8 z`*LcSPIDVP+59n*<}SX*JBMCb6|Th%<?<AE-b?-7t$hrBx!KfXPS`D)0}(&7WB-Vx zA2?q{3Rh?Xn<Qr_G`dI0{WeE@S3RxCO5>F2inlwf@m*q(3C{VF?_KoQJ67)^LS!bW zWFEbLi!-1MonFa&o}ICgCI3EKmM!tn3E!dt_0k`lr%wo%&P`>{_sMc?1-t*&jX?_4 zXW61-|FG0t;%=@vGw`zWNREt~)WY&$cbz_wsl;5ml~GMNlD5N%OE>3=#I%RXn$eK6 zO#}^>FTT=r?Z(qDQJ+rEs+$p2Fq=?X=%61Z7cWCWV|8}XNYg!Imx(9dBR&8GL<tw= z+@7isCbB_((z`-6c|04<tZWlHfn`FzVLg8k*83LzAiw!$^Hf2|aX^W`9Ya%No>vb~ zidE&0(57mjI5_5nP%`M7ENn{kSSk!A=m(#C!aZ<I@*mSsJyh88Eww2%uDWysUeg-s zP0SOEQ4+efYdif->Edv$z518QhN=e;?OM;($v3|Dn{M)~Ma9)#eYwBX2pn@q5cSNH z`f<q@ufC+|%L@&O%vOe@@j?j`1-HXD;XS|oDbmkHYmFU$cKFZ?06b(9jz>ZqO}Dx* zNf(7`*4T?gW47x4n>kNR%@VqWRyAvMiw>)a5K^5ba@zs;%XhGkz@f5(z@usP@gIAR zgMT#3qiMP?WWOXJZa*gAIYN*?HwnCx>O045hgJ2$+cruE<u;=MEth@q9Z>|NXjXJr z5B;V0Xd>2Sk=AO9JFxQ$cGHojPP&ASrta#u#inlC$cyN!39g6)J3RaGC5S2f;P-IQ z5ULpX;=-hey^ccF>G`+gLg-(ua!)QlxwaX9uLr?6Wj31Z8*XGDjt!UU5}J@<)0b@V z@IUHSi$)i)SSg8O$BB)ZvUjjil435FC~$(T<eO5m%2kw7_nQ=Ul}BOa*b=l6Vxz`1 z3d)%=<lJ2%cIPI`n43OaITU%*G#g73<7vq3iMu2|C0*wLlyBq0>MPIkg<HSw8sE$B zy|z1zirC6g^w-XFl%?tCH3T*1|2Ej6Pt|U3Yl~Q(6>*r1r|}1N&dj?--g&6$g2f2c z0H0Ov=Zip~Up5~SWQ1nB_8^K<9OGo#*~wdO0m6JQB{2!#rEr_lrbX{-=gmbLGB^{v zkE$I5%P##6j$cEcxi$R!`M7Vm)=m;xE%pXKcfP+}Q$}9kYQ?N$c)Nx#bp$0vf8^Y< z3jd+<vlV3mJ1g1B$~&A{MW-iqr=0p+`W{qHKGcxQ4z~GKPogb?*IZu5X3yiojPIyb zT)Y={B8*n=Qhu#@(uhueG5%m5G)G@Dj1t)8$fu0=J6VqYC~)@GSzaXHm2;~3`Mq~q zW9Fdh;fBj|<@P3i)7FAaU$+TS=al`tkbB)P)ki@j@ccX28K%G>!d&H#F!ax$-eTt# z<@5Kt05}lN==4Z7Nm%yes-O`J6xraj(h7X|Lq71_?@8m44|eQKyufkbitG3wCFkur zje&f*b>?3`)ET~Kwj6cxzt|pf_4KQ7W+n`1`Hn3TDch*L@(g|zHWGWMKjK<pcRGbA zL%&W=ZrH+FH+G#;+yr_*<|KF(27lQ6!a42raks)=SHs^6jKWxyN0OxG@uQg|^V==I zYHjXHgcMz#>3<UW^6hE+HK*L>DxG`hd#7ON57`hkb<arS?MuEW$2a7lbG!a*r8JjK zK{DeR6!REMfc0&q`g~3JwOCP(hDFNmG7ouW3LrWb&G_2#4{g;v-YWU|+qNrWS4JsX zHf@yC85&y?uH0q{Ir4l4dbz96={1P-OSUJ%)u_B)o;Y@<Rp+h#b8HbY1-yW%Q&`Fs zHeA8^EjC4OcTPwpMG}T=4TK1g^(WU|ZFZnHJw@_y%$twb!L4Vi!ua)X^%RH#P>#p1 z+`o^{u<7!RV__UtM;}s;pEzwPs?W=%3Oa!wVy}KZY1eg!DebP84fry{XltIq7yz<M zuLWNID3$|0b#|#4;5&7}Rj3;EYnK+9*}}5H97S`;2-!j0<CEePNE_C{s2n@J2%_J& zPpvVJ0WR3}7^Ri=DMunBLOq&A6Eha;O+Z5|APx}nn-tyT8h&bg$L~(NoTc3b%?A4a z`@sov72V^QDR!?OS%1X?*{a`6@RJvyY;D~8cykIrpFc-3Qfm|q>Ty>|eqHcWojv`+ z{MK2ef<ATLoc+;LOIy_Z_4{g7+NAwwduUC1Q=I*OJMach_~<6{uE@=%Zc(2UqA*&f z3Pmm>!8GN{gw~p?*dl-x)iMTe58eQv=Q1!-MzV2o-ntF%9@c?2(&5X;7teyfwc>f+ zjYQ!n5uB_@zhv%GYww?8Rabkr|K!yBJFzIorGbL$_FeI{?Zh&DF9F{9GE$Lt_vS|P zjZdL?851qByZ2;U`#>GK2Go87V%nK}a{V8_m0DFz`r%?6xKobf$9u@nhm-wpe1hMH zp2Y`a5G=%e&QX?qVlCW5g__>FYQ1Pmc0u@&m_tNFHwOMj1eOW&oN9EBTd&A$MqEra zZ^ps`hhOmxP~_v!l_qHn*MBp4;^=pC_mT6jbJdfzSM`$~;LwO-{}vR>)3BRJ6BTjy zvK-_X-A?(XS&Ti&+!NI~ow0MVdgqq_qZ{vtM#0HTm#>#Nu_Nl0hJS33_>N7EY;Q+F z)7@^28#fOM3fYb`^RJU6@+{2joo#`ZF)y)K_E9mP?o&2cL`vd$k5V)H1hL}NlkF$# zAKzz#vxo=ITgIv$Tp}8q2j&g2=?)+P%s{}7F_4)%XYBHM6W`&^+W+t&5tJj2)RsOe zVs2x7P&w4}5I?-MZVk>+efj+ksMw4uq-u=G3tRu_0x*h<tcq)Ppm1-rX$@;y;&%7h z{GrOIl#*sUSK8ZFVPX}~nIm!iS`*<{XowmC4_YpfGk(f}xJs@R`w62;+Nkq+vLC)b zejA>FaytI@x_EuY(xC25cGq5ixn}Nf=MIeRDuwxcR(-4NIcB9V70|C)Qf;3dlhp`U z7;sT)lng|Qe2m=_h4y=n6pIllF#p&h)2}n`>JSYPY+tIB=p%htB@15@@DBl?Z z1F(knMZ>4;5kRVXC%}<akBa<?=sl8TziXh}ALCmYs|u<t<7cp11c2?;y)6R2v4^*6 z0xV{f1M8Cwbx4`lICV|NkKOg6?W09}M?)(Tg(D9^*_DzsUJF0>>Dp2pk)MZqB&|B` zSE_{mz(|nARP-ffVG?#7DaSlS_p;W64eN*#7FAXaG(2F$cXXYKU$T*{(1@xWcF*Uj z<}WFEIK1p{^y`mZ7$Lx_V2NrinOgB)y161g(9i(wG*1G~N;Uf3+2tC!(_orTH*abO zYM%8HIb+bb)|91k(am0PJ+6V0tQJvTuD%C>k)5$&qf&Y-0laQ22oz=OAV;nPwZnUG z5~v)t@7Mq^y#B47BuP}4^L{dKf?7aW_I49cEuB)BTwSF57+HKjKJiD?{!e78M7$Qp zYL7F<(+F&Z3*Pe|OOvY{nEl<Fya~bTWV9O^uh1y{@x@1V<#6T8<d68=-uWbjYY<fJ zh`tVK3p9Y`(n&~yGSB{e5|cX~qmMx~8E?#~YIGY5ukGSH2&b;VBIdIOvi>wwtM-c~ zq9qG>pt;;pi!%1OrD=Ip%k@e1UitD{iJ5wcRzeonADujYt#C{l%p?CKo|H;1a2r!^ zP?D^y5kA!i8o8@TbsgE2yc>N0UH;4R>p#BDveLDka{@?E&u`Eh7jed&;WX;H;%xML z#{5r*UTA~ZQ63qY{AAR}f!a^bMke^Ke3=~Iv2?KYz#oTvU$?MHk}cSBQskbdLhsj< zbHQIV3RDm7(TX^#I-pd|8(b+}Du*VUso2~}i3JI%`E_Qj=4c%;jv9WEZ*ZJw3<YMz zjdH4V%<*@K86@995N1ByUoJq9)Ei@FPVd2rO1*Rc(0D0Zx?5Y`WvB$*!m?x=#JLkG z#FiR*N>+nM%x}YjJyUA8)vdbr{QU@-5ebK$JLO5YUWEmE%v>-_MU?cygED`7?*D#i zV20SqGE5m~TAEN%<Jn&wu8n(Mq<i^WZ4D<jTRF=|CRh*8^vL(%Wxluii6X6*TR+zz zCgZmf447DWs!7%*uU1GCj)%f{SHcwZT*3JSI)`(U75%rUy)OR;uxM#;87@sGt^E4$ zpT&l(?=wfaXy{yV*4#rr%Oc|6s#Oqr(_nRW3Uyjj_bC!QzXv2=0|59_{7s+2OglV4 zc{_>dVu=NC<VAg3u&}=?35Fjg-#X?KG@Jb0Nc7+2%W@sIIqiv&5e;LSX{q3n=8NB$ zztBpyLiz<`HLsObgg$+sp2TzmT4(hGc5D%VgZqb!EAJ6TDMG98Pr$zXgxKmp?@ZS4 zdB#7G-Tyqrne*Usuv6TA?24~pVALRMocr4nFXY_5c56AuV|3&f?EYmC$E-tlUI%W2 zNkq4U$Katjda=g*dp@GY+YV0ID~pvr^Lvr`A8)4tE=22|+xL?Gx5W5APt1(J4KfBM z|4%1D?Xb57g1E<Ef|^Ej?Lljm2X{^(l1x_4v_IPEe;_1?Vidygy$J$#NBn-vnaBf% zN^9DH&0rUr&q)YWSH~^=PS@&GU3##}5%*N`^M9<UGe~Np9(3#b*Zpt6z)5Xz78axU z>$@XAU{W6za8ltlUD0m~_ut^ExPffu%`U`F_6N@P&zF_)NI;7+r2Lnlej7Dn3%6io zwtM{DzeYoXr2n(cfM{sVh8iXP>t9o435Op-D_H-#6!QN*?7kj6K~Mqfj{d)W#zHhA zB0|-b$p0a%`|lIJ`o+!C8n1`*Z;Nx1)HD#D;H;d==>Ir;|L+fm-;ADTVa67L6q>j> zR%P;Vvg<+Azpj&)Hj5@%mG<}nh-Y?#4A=knd;Gt@H@J`OYA!h35)yLRA>G(c$Cn3l z>3&*y&%b<2mL!x86v{|27%tOKayuS1vHpNS{IaXI*PcSpdabGQ(!W2`8+;^C6VV73 z!q%pptTg<$zZUAs{tfh=rXW&Z2kff>yc;9CVC9$DUr2L@x~sBLe&nJG>@Gz>1K8mI zZF$U~xaJ~smR9}OZBfNSrV>EQ+ExRK?p%rM`C`{UPS-qL<&^>TwEKI9%yXMrliy3> z>^g9X5&!FFlveuh>JyJ?bzkJxlREuJtEPxekoXFSd-pfVtcU>a5ST~z!}TXm5KtNv zaF;#oyM3dfK6HoD^0_6Lmc%{hRHvXYLgpjXvM0$7t&Tq|__E|ye+vo`iWWNRKPu_} zd>Pt<Of&F$UjO8;OQiULT`>5-=gV+e(p{e+P4ST9AerMI^Xt(5J^@B>RE}mbUQ&~c zUecow3`uU{Pz2eGG`NkU`|o%=w}zZ;)oIl)!u_}PWi!Y`Eri=RrW;?X(0(KK_il$` zvEQ~?3MY|&1l%q!wn$l?S1h7oY=j<^YC@y(;WKEla$DU&xL3VXk!4s()>p!@efHmX z6Gstl8CDjD?}fj%v+z7Vau(%5kN~{JKh<^Pdq=Z9LT;-2T>W&`R!q=~TIt0}bN>6c z<|Hrwk2C23^nRRvdSCy(sTc7>p<kRxW>vY`8iq6WJiyxxdW43n?}b;HWNuU^Fv(3q z$7$Dlwk{rQS*@_OZVB`fH9k`y@r_HM73nGm)*$=BYs7AbNa`Nc4{2Qp+0-IUjHeN5 zL*G9FS_0~KkuMXq_eLLDxBRHtq#IAgC+C`orxlsok^WL`54{6#?KKNM7}38xQE*YK z>25V_SR-_!CK}bk0pG9Win_oobJ*8)KtJmv38^Om`?N*MvXpkB{t7{4^2JX`dE(cm zo18P(sm__x1ef&X%gL<L$@+UVJzN9BY-1Oln`($%bbQDy03~gHKxaq$^Y&@q`?B<6 zt`~Xl#k*2XmFSs@sP~b?XVWj`ZrL_3W?a7d>#DWRU1_l)q1HV4hhWEOeOZ0*nPjV{ zxxHDj`u45X2F)}s2gV$U0!_g*38SLKKT7BS6YTd99ehE`?jHpLI#iikFzAQJGZ0Fu z9Myuq|1vm#RXR4o&G8;#nxP|m((Jt)g~6W1W{U(}%$T8)y4k!sMHuG3$wRB%PHO82 zmWXi-C)x(!(IdrYh~5Qt31C}>Ur@)IL6A{#ehf;2NkrGl7L%$f0weKmttGvQR?gvA zJ;(Dwpe>Ht%D)vrUpGtu(rX-kvHnH(lXu_)4l9ZK&f5E7M7)H4@J%O#^ft@`l#h_! zwgs!mV-P*cMaW}PowtAk1$JTSJ+RR(!0nd4fIbZDT?O>sp^`BJNZ|Q0bYB~jRUREC zxP<rv<%178rdcwIzHZ||e_sp~>w9n#qJ7y5c^<wBZJZUnI`POEhTNBvv<?E5k6@Db zd^e`w(}_A8SfxAMI))0v6e^DSpnJ%N8)%%ci{nh3Wl&;i571~qOMteNuV1a7zQfWZ zYPR5boBOhDBqi@TGV|g=hL^0ZI>fV;uKyPHKs)7%RF`5GM!EmIQ2Xki;CK_*{)2O3 zhuh$8wn8PsfJLmzg5f}Weku$*ML3s=6eq+|3&|e%t-+-wVSK2$WZ;Tg&dXpN$_b<C zut`V8AK9v02Kk0N)H99OK0J-|$9+Og;I06n`3CqK=#}FT(QG~lP$!r}H5^-67l9|Q z11hkaOD~Ux`6uGlNYj(9P*uX6mxHoS`OISg5++I28Eg@gK+HAK?Da=?cfSm(GdJA& zc@T+V_hwdAs307`=gvb1k=|gDEe?stFCr|y2fA;VxU#=QW8D+|^b<+a$a?f1E-`~M zv}<0n=zf;MBE}9CjD`QFu{u~}ya5oMh?%By@E6NZTY0<=0C%x+M7tY-cbGG3k2SFq zCweRFSa7dC#a-!yFVM|&N2E_#43#h5G4r@XE9#sKO6|)+GpItFe$xP!@3TjtZ;>{4 znXO+Qbx(`l&GDyLE!a7A4NU&*%Kw`JlR5vJTv;yhXFPc<&^x;#`1dAqCj%e1a!Ng= zNF_Qd7muGwvXrIp)!PUkWehLc6~X;)09Q(19G^Ng$ASt#ib@a-5nLd+#wi*8$v~x& zS(T(I%D_4Y>ocOYVD(b62z!LPOcB9qVjb*@QT5PiwRHr0WlW$jck)woKB6A=WGG;L zBe`Bbyarmn{^^D{6$qVl+Vd^=Gadhdj$fQ@wC52pjLrtx)9a=iowT^zOdr+PRCqau zWG)~8oJW?@8Ze1U3@WjF7T)MnDQpBEd3yP3n%MH}%1J(!WGlZ5S2=A*K15q9z|V*B z`IPltbz1eN<Qj{HrkYrGyOPIuh<{T^6AOsSm61*cA%(nC-<Tn^jr3X=dSHcZLao7= zD4xAz?DGt;8;0wj$02{wU}cGZpm52O#FOOylt52X%+!CO!w{e;ZBjtN%AW3mH2JAU z731Fvjr>VD7NQgeVmHLp+oaV1q|SeaKSdsFkmoivergQUn1_IrAS%oE@VOU;3XB%+ z*Pm}jeSo?is-Kxi!IOR@)0${u3W28Z<iKSpx=y#g{-=`w@|smoi6*QGyQmvjcW1<e z41<i8STIVTQ%cF(B5~EpEL?vuT=<8VMdw~=j2Z3)PTd~n@mw98LK&hz<-v7Q`&t`n zx(F9E{suae0r&yd3?+{XgJG|5Oz2hVn?56)(`=yEwCC&hD`f@O;KsRJjQkdX$1e+P zeOLd@vt&}AZlAgecl3#S<NMMx!4&q3lJe>X*xD9Ow?K`Io=5lr)-I)>j+cD{pIXD$ zp|d9%r^nW$zxqhY11Wu!Mbo4jufN>q%Daged$X7$<eJt#v4lHEg`HUhuz)CqxR`1B zGW<JPncWHdxUNhyC$&cK<OYD|q%8)oRSysnmF@5!_^c$dlHBM~mhFJG+SkR_C5>%w z@oJ6bsQ|L|yfni7@7r}I66p#|@0%Fr?;Ad?dh&Nq@R$Xzj}mrRFVQtVl%z&L_-))2 zEPigutWO7n_tcZnPAqo<pva@vJ`6|WM(03WW{;p^h)yF6OVt&B&tU<Bc?{51EDQ+m zw{HFGz@#ZMSr65UUrbA|!y2KaDg*;sE(0{Lf;|LT?T747yjkKfvfY)T`*Ay~qkI;Z z5ltt0_S56k3|5t>2#sZc3gd#&3weOe&R$I2FdB5~kbo(1O54=qR9%`m_b&>jndyTU z`8*~?gEIou!&DJkO`TV$@*Kd%Ci3jZTwJ)+N)`GvYoC&$a_rfNvmRaUiy(k*L{#*F zyKA%sDXRqBEKL_a;qSr06kduxAQh@5*$U6qp2Rbh)y)y@wt`6u<>ZZ$%PgkKqAII3 zJsH4vpprd?W{+$w5KNO1l)tlC?admtL}2lV6*bI@i+4h%MSXzSfX`~|aF|*3GxNM) z`)xks^GSEJ;u$3>3|~7t{re`NLw~UgUhT-b0<)}t?VT698h{qvJYhPQF%+|$r!T7> zAX{1FA_g-kelJ{oQ(u8)F}o>?%`-E#Ba$qJ(3s3`_souY-|$(^4T`iT440>;+7P@c zw8LnZqSkx%{Pz(feNKLJO^d!1|JBk30IKyZvM$u?FGa=aq=Jlt3pUz%jwdP=0Cb*B zAJv#=Pbk)x__@1bI>enOcI~+hQT&INL5AB>^!#UH+%)y+@4#fMQ<^ZKgpAsUV<RWk zpP-;~cjuyNOq?JY^#(_NKli4Od`z4Q)l^xrz;rjKC#l9amEPH~><%?PPNt2pjE+d& zm^dr4-N-}Oi`1sir5!&5hCAh2+lS3KWv4YcJ);W@_x#GTBi!7m<vVv8WOg`$54JV4 zs0p6KtMKAFj9hRA5X+5c?S<`7w{LTido)R4YY7(gZq=D{DT@7SUNpXO=1$XRE>9sH z1fK1Pl#63r#;WYF3=JdMT2`*?h?I_7PkYI7?b8N)(tD|3(_;1H&fmWG{ARv*u%ocu z_K)fVa6a+gTc8!WmOAQ}KDAnP?lD1SU+v`Yqd)%JSr+c1Z8}M-79YhqI*{>=B61zm z!Am#KXXmDj)VCAyWE)1)UJ|MNGj85SU6c#eiOz<x_Oumg*P3Rd4C(2F>>`jOwZxXz z)X1eqz7hoJ1o`VvK4GU~2$kA4O8|k}MckfKnl8w&4sk<~L4JO5$(m^xGBexMCM4PR ziOCz3kP**Ni6SL_ZL?iCj47*_TWRvBXohLc&-da2*zOOQIo+k?=N#!gE{QonFw30{ zga?1zjUy9ev6A|rorpoR6`MQH!EpTU9HWO&iX|8#XG`bewAa8jep&Jx#f-p~*z4pr zf(;A(VO-*~l5J@2006t%8t`iR2B7SA?~~&x*5a+mC9J6O=x())x@ZE59CyuUnfq1& z#3DeF;78N;^UX;%ks~zEAXTDt#i4F?!oqB{_Pii_s}7T1`BRQRF96(!NX1tsvTA6| zE4o(hwTxQ!YfwwG`m~%sG=)J&-|vxoq??wW*FPo3|NFl+=*7Q6;0WpQg$9pLztr*_ zX;;G^$?_}Uwh<p<NSTbLP&%tulstyN8S^a1^vl=-``mhI7wNmHyytz|#6E$2&vk>& z4s2^zMsiC@*+vJEEWF`Gw&JHz2Yo5`d#H0907oU7B`l^fr1pH9WUv4Vq9-Y(_@O%H z%<k+zK6$TtQRixO`al}Vm6^RW(%?1Idr45lwk<+~HNwBF8c}^rz{D6jWj1WyczRMz zvq&F(jLk;Nuj7dXQS*|CIlA0C>L!-H#wBK6>Qslr1;-R~Wsg@?u*F~o3z{co*9ECr z<S#fmXa|JR4k@yB%^l^)26$nD&^v;TR7#$Dp8O8-yi?IR6V_qbIfXUie<ugk!bEbL zPAa~4(}_}HJRps6!;V3OuhM#@N3-MgHe9~oIV(MC9%A|<HnAn23)N}ugKCH>jCR^w zi?1nxC9Cx$E~xSK3E)5PV^q*ZNRP&9H5=G(bcVKImdemv2_0TXgoTeSff5G96l<$q z$rFX|;*q432cYK61hBC*HG%*$-VTsHqY~i>(dxB0|CxV?7NGxXopE2Asj@az8bEGV zM@T_Z=0Yo~36?HJOp0zdEUwEC#}sf9Yan_!(_nV+dcwn0iDrSPMtM8+X>G<0mSQgd zz^COCiv_=q${4||Ioo(@9;Axnvbq_%&=F3%%c@;;G44Fvw*UA%fHg-+c7CN%xyfiO zz|cGrm>TC^qx0{{^<_!hXsvEOeIz+9Ynh4Ya~lWG)6*{VvT>_g-ItobGZvlW|Npt- zZ@@z=sG=BuI|o~2v495ZEm}bv#S5<ti?hEkYv24ca43o+1s9N0iFb6GvOuR)&XP5I z0mg6S5)yNiNF5w}d8m>cW`J9yZWcL@p8TexbSB)s52myj`b>Z)g{eje25n?L02|C~ zYS<P*SUMz2c|++3wOw?qKcqIA=85pA^SnL+sq9g#lr{9&p%)#ST!V6=HawCA0ILxg z)hl;bxq+$90>4gsqSR8B4L(sGIE-fQv?=>^oT|mgkzmYX5o~S6D<Vvk-)5}UR2yQr zK;6cr1(}1$glR~{xDi;xB6(FaP}?*DxjY`Yvr6gGNczhInR~~fDvxpU=v$enwMXS^ zbVf?@S;K^>eQA-^%)iUekEE~2G8Ip>CIA81g%bi}RoLFOt}-)W7otfYRhFy8QFSe+ zpQ|Qli_IEUtM7JOEt3E4RA)I!Ab2(iAvc3LOjVML>rc?^kVV*rgvqV7z=Xg~Z%t)X zm+px~$_rPANxC!@%S(R7CFPzVZl&xJ4f^rTRBHEVYd{^1VIk$~MfVv{+eZquvL0yW z*57S3d%p2>TN;qf#RoZ6+FM1ne<Cu9{HTi!Hn`km*do?IXQNy-V&b!k>VGI}+P8^a zfto_Z5PjbP28-^(Rz}wm%_V5_H*;VMb<m>2S<2tLJ$#|e(B}F47mNV<kPihZ#w>XW zPYJCj@@sz}ge`%b=a$EPWa`+kBk#{V?N%Zo(g=CUJ{GPv9H;Qp;+U-S4$=hL76BT$ zkv6zR7l1NhyHp3dRC=ByUL(xPD`M`#o(y2n%hM)^i_89*`y>LZ8vByGoem~{U6>}? zqzEg6dnMjaZ3XXvv*BWPQVaf*B?tAmHWqd|%7W#9#kmet&!$j0LDO$*%czrl!WOTU zD}os&R3$9$u1~$bwTM%MdW^OyWMXQ1WHYKQh`)(q!@)AgHZ;B4NpN@0_c7TDpbAOT z<EHb73yU?3=Oy!P(nXscZ5hl3cwwQRjtpnaRg}1Gi}p{3DQFBQ3WBvOTYhkmNzwv1 zNV;uLpCPztiltf|QS2Te1Bt-bbf3(CwLH428|YT_Jih?9|K<(1DYt(pQ&-tP<J%*S z&`OFv0~t0F2D_%0OXl=KU62*%#y@E{T78!}YsX5g9M5*H0}tKF0OTksxe|vr4Djic zw`fV5`z#Q$A7>e~**VDn`U9x`ci*rlbsUHM{9>Kpqg!(I7F7Orq;FvyETbMzhy3Gn z%@lp_%7FLgWN@TW*d*$D@$2}|r1DvZuZ`wWls|f<25hh|FgPjlgeNbkQJuM;@c1+4 z0Q2=?<3*%a7MP=*lTnE#ZYa2Qz%!>-GG>>%XLcg8{4;=SNlp4owfm1>h{9CBcgDY& z9shh_s6CSfux0(zntpI@+NjO(T_LkpO82kX=m@8YxjfKy$bXD+YWb#r$<#J-p)j0S zD{yb)ZqsLWPbHmf6;HpMj&spzi0XNhMSVo&a<*@v0iV=r`8_g{LXHihH2-h5wbF7~ zsXttcCC5(j*D||jUJOz*m}{--Sohk*O03-{sOSh6<y_BiGT_=&RG%9ILu7X<V9LUq z79SQ9`5yFzd%>TOQFnkl{=;@k;%K-`H%O22{pGhLNABKCh1rE?H>W>zgQ+Czl8IA6 z^gkm7E`QHkBItq7MZVRw|F!C)U4O4kf%ho&=wC3rZ|H3SK}{G9`!mArkl*qt2g1r{ zx9@h!#Sq%e(M^HDU*e;`{TyLXY@#RBo?(d{I07-x2D!NNJe23cqKgMI9ouopV+4X? zCf)$$n~zrTRMPCApWfkUhH*4hRUe0i{xKGIP|H5JFc;@drq4-H8wN5AnN9c^0vhIP zSv@a3qCa)0v9u;NweytarTR-(l2x%XdBfb&^V28g^SvrNehSZAA+lh<xmwaeZJaKn zko`KNem$`@rp!<)sOaJdB2(c8p<=l~-+kVi0Z=A)V()eoKK1>Qu?=%IORi<mk`yv` zcv&z|F4KB4`Dy8Gz#Lt&FFnx`Wx55~@icPsRW-nLP>M7DU5*))BZ&y3Hq9&Hc{q(7 ziZ@4Ny-(4KW6er&5;u$pqm6zQ1cC?$+?yzi=F^@d>K;*rSR{THn$r)sHb<2%l$9yO z-X;$%hp}TKo_<-K9uNv7BF<umPf!=NgVvCGDw-N)iF=xkqE%woKI93SxF~k{o|Rq5 zM~}Unj`d9TiG}9!Gz5`W4$Z9>#xlY#MEz*xqwFaec%)1*&sUc^b-hIn=ICoM@V4q` zc?{OUaM`VQe1CRj<q6nctXa)-v3zq+^VI~;9&g_1cCZ>Jukyf4$5x7YHj@$i{)1{N z%o$QpVhHz-=!7ATnCoZ>rT7#x^u!~DT6kB$2T=qqvr{68iw5{U*Yu6bl(v!Axh&fY z$<J0*<FPNi0rte2i@i(vEN(vMxvO5wGYf!05Hodzn-cB7tb+_b*D!KV@>Q!GLsA&` za-yx;bG|EG`cl{K?$mW|@QThEqGAEZdMX*6Q5w=LeZvJ?Wasl8yary2uK3(5J6}fY zMoru-XYK3n{goqcqZSB5Lw+63ES+SgmkX>9P~={V*JQ2-^gD-8uFZU+liQX@r?Lo+ zxS%0lb9h|ya6C+<HnSbR93;y$f!S7lImdN1zV;pGay_9o8%_#da^Ht5@y|c;V|cV; zRL#$<rF91+BnaRTT2tp{#kmxROt2jCp4+-TZ1?t{hw~7GYwc9o)58>3Z`L09UeGR4 z?UB8GM|T3tUTCeA1S!$_K3J`REM#E%L7)3116Zg`x4s_%NTSMYVS44|<Ff}EiPva^ zZ&+72F!{tDjmNJ5_MCJy4x&JTy1SFdw(=!c*c4<s!~Gi=pLG2N?20KDRvHO=y3Irq zk&1Y5Tg)FEB1Rh@jjNeH!4fytOuhXqy=S9<5gEGiF<{vrP1t>w|9LIwR@7uen>vsQ zj9;qj^ekSJ%dqg*j$XP<$vB6Vr_tgA;*Il@On%w52*c-m9l^{Iqv8++C1Y|Y?n?dP z_KH0+TZlbzmat$A<{F(95<|PBUwgX3brbp}wnz#g62DL9>WuAFN*um-s-`SWQfp@m zRL9oqbVzCOcGzMlh4hBp)6VBkM8|2dF-oj755R4)S&55fdrSFHQ`b08YNws<8mLVK z{Z7Yb5pOalKDf#wz)8OT!%lFk(`1mETDFr$OKU}UEw+gw2;=e-3`y}>rkeKUR~4!P zLtrd!I)&!WpA`zQ&(c^G?eW%m(Qm&2JWo?qDr@4`rd2qCMXhb0XC=#Wry7`&lpfqY z+O@#AG6S{;sdzee#$**KkJNT;^wxS~8Q1)Hs^>OsbmofhF6f6G7?oVLOHYjRNIm{} zNbO#WWBh++0o0b>%5#<dM3yL8O>+}~+c<fB3E46q$&Pni!6lZLyk;F$6yhE-Y#j}E zLsP&|BUtV8{b=~UIc=Hyot-s67ET#oU?!H}Y+fvR-D}ImS^K%Ul+jURF+KlF+@8+E zzv<t~SVd!*J`YCqyjC10{F>U5z_t&OlI;>RL21ckXMBBGYm}t9tsjvk3Y7S_t?YuQ zn|H7~VghG;9}!NMcyM*yzIoPt8WK4^v1n(UKrD}!(R(oLu<^Hw=rwD9$xyy5dAG@i z%OW(!{@oLhls|ft5Gg)Hqbtsnjai15vb;@?iz)u~viywatU=SsGM9Rn@B>X5-&P#z zh;|bGHbhr3S6t4v)JMYLIsE}fBDV!cPxOOOjLegH$jPY-6Li7&I~-s&qL`*w!aHm` zl!p#RJ>FTi7A2KlgW63j^DG@%8h1NsRunerr{lAcW=eL>FwdS}wWm~j)GMCBvC=%O z<lyh6aXlA0VjD%NQ2qS-(fI7Uxs!LvUiT3&KcP&dw5a9}gx=NOHyJNJcGr(JHo%~b zzj-0m^uj_$!wu+xv+?v|ce|&*DMrYFKdOtj8nod#gcijl`O8n8#b~NpET+lV=dis% z#80ayQf;cG4V7nKIR7kNJMS5iYaPc-40Q;RGB_~O5M^(gz5_T1-3EU(Q*nO_3>;cg zs;lqOl1riyVw)^0kOa5wmj^<QT}IEF61=K!r?vO735%@@&SRb1x@fDme0g)9cYEBn zY>iKVZ@J3i^Sw*Ie(QD%PoSDw9psLy*w1GguM4L23+@E27BqFe-W=<souvyG!5?4f zIO`F=S>Lw{jk&7q?LCaqCn^=9qLR5Vd<40D0KJ1aaMSF>VQy;>!KiA4EDoKhrY~XY zWOqi4HpM-uR(I<!G{OW>eya92vNgq1HI0J$QjD9Y?a<quY9h1c^Muhv5;hiQ7SHY8 zOZL4ZNo;?B*qaHgI<!CE1YpDcUV=EUS72zJfa7E6ktFgkp4+Xy(La*n?5OC;Hbew( z{+Nw!pKXEx2dxjaGx=vfD_2L|u&lOw`KkLOI1)W*x?1tZsrAVz*Ql%Nu>|0V6j@8M zlfQ0dePeVZI+vKZJ3cy#T!_D4z`{o|M0O{0mdU3LpZn}=kVPoJaW6k$G57B1j0&r{ z{w+gbu|@%;qG7GNS`11$Zfp+DolQVo2}8RP^Y$DTHgAcbD@b1lH?XyXA}?Va(X19e zgKD<3Qy?5I4i=U`H~t_fMbF7@c94@&6p?^FE<B|t<~yWG^>1;zD2;y#X8l!t!eYAW zOniTq##Xk>0~nf48!QQRBwJJ3Mv}&B6BMl-eswzO4+emd%y4YWjl#0;TwN>x=lp!Y zq>7-?e*W?=Qp}ZGdm*>rm9U3DlRAz<sQV)#xPHkzWcn@aDW2oJEsrbIDct+5{Ce-m zL#LgezU~6eWPKh9Ds(PXz26i+V_DDPbx;n~zuRymD_{*`B~~OV0bhj!e;#Xs7#7VO zE9NSC_8Svh>Rcz|Rkn4~O&o%C_8O1qZ0B(KbMD!qE~%hy?{L&8s{br&&XrFBgZ$9d zYXE?o5juWmKGImk){bDSKPfUq(t3gwAB$smUdgoz)E1nERJCs^{Bzir@Wjuy+0~MH z7S`)wOQAy09L*|vLFX@**gOTvt=%nvp&F_mfp4nF8aN2Yl3rzs^xYWmC{N*#k}XG8 zs(ID3!!TL+*`(1WPo^u+KJiwyUYujWcjP^({p`2J_(xqe;*JHQe^}zm><L&2s>-zZ zupLoZ7NGN}C2XTq<;uPKSaXn7^4+JJ??Abzo@iYUV2}14B<8%@^tKj}V~|#R#m%6; z0e&RbMZkka1=Gd7tA(WjLtxiXdbJWS(l2<4{enk@=hR1Z54ywS*^H@i=PIXHVp&z! z8+yIXZJk>49wTAes^T}l)_Jny3k@6LMIBeWvq$S~a0e->zPVoB|GB5IW)i}32R|YH z7kh<{d#*!*`u}Jw3X|~*3oyCcF9%;miu8(?Tfb@NdGZxD^_?Iw&<{lTMR=Yk@|4gr zEHB~pg{Me6fR%U8r;^S?Sitni0c}1MkLlGdD8cCU&cJ{=S6L7C{gAZ}c!hat4S3&J z(?8;)aIsF7$W?2k@Sf2yxu9Ayd4{Tk;0-wwFYg)N*zbziow52jIJK;5XtY6&XsgCU zELKHjtmj`PY}+#5e!RK&aT=z;N<Di2;@OPEOkYTUz4x(q>4gaqRi}!?{cesp5Fad} z#9?BBKUcP>)l6nfidN-(;SfwC$nFOM#0O{?ZdI1YpetB@s|JRE*FmI?C7s0KXW3)> z0QbtOv`<+|HajBL_h%t?2g!;Hyo*E=YUV($-ghhKD-t`jt}38-i;vz&q{h3E8YLT| z-7Du?yhrl<p3gJBAB&JQ5;qbneLp-SN9s5&K!Wr<iFeou9-;cam5_fgMNG2(<{%n3 z^i}nLOsg&BF8xLCdSK6#;xSW1cBrbv5HU7Zs3Hp*_1iBrmrx`4B9|{c3srSqS^dm` zQy}f@%GJlxnoJV(>6DbLr|*W}@sxt~@%PNFO|2SB7y{;%WhvwFl)QxU!j-kj%Kn9Z zY^p1Ht3jWy-d6Nz-X7B4s-tm1J4CclZe+47W4PF{5}YMaB2_g{T@$so-d?{Y@}ObN zeC5?Cl0J34=6p~5is->OmSsU_W2gM(mc#G*Xvc%F$+eqNIfCrf!fiSt_pD~L#p?a~ zD>1@#)^CId20qrBubUfp1?Xm~<c|9X{_#kHWTa;XnMtRsB$G$;f-iEtW$724rH4T! z)ys^{?9wqB9O5&N=zTcfutI0=Kt@TCjV0Co^u?`dub);WL?ziU_en}USM5Ntgf)>z zIg#{%st@fAtU=vCbG(m$N$!^yBA!<AYgSu1;|n))7h7?e#$`$;od%4~tE=vmX<Viy zl|##Z>b}-S+-5bGeS8cWkDQ0z(<%0;$S7eehxXd{-+YMfIKLF<(=@SUdHl-f`$9LZ z{>oki=gk3R7D2Z#TmL&e4)z@)zLocqoVvR#*k${y_si=LAN0IP1)D&vZoqYlA37Dq z<Z*^q?q%86zpwxFeA=sb5hcxO{YdSbixYmEj?B2;!nr@T`=8A(e1I+|cU(hBgFC{z zX{tuJJDIgDUZf=E3pA-;FQP=^@e>Wn^2hiY?8bHVZC%$triix_lHzyO>f8v%-_c%^ zmxf8CsUoeBhrSdeLa!OpP7B`%jJax`Nj69FIDt_iF<N>dS;dQPh@3XsHoO%(Wywk5 z&`kW5<d^B-w?tO^v*(V;BeJO!SLafTxcV@H^ZpO><8NACX?gI{(KVz-xJf}|>-`bG z_dVWXqI=K$Y(G~0Qu*ub+Mr0^P-MqWT-!+eY*nm$$!J&f+S+Fwe`ew@X+>cZr6<L4 z2US$FSurGIM;gNIniEEMNLN(%8R$h7IMN&^9__HCu=M#e5j`kk^fkUJ{&wTbhKwqg zDsu;gOC@sz?LM<s3iaZ)-MI1{+i_RFR2{}TmcEfe%)sAw=$}QEKy6Fdc3mq%;5c%# z9(&q-bD?b^=YW)RjT3Ayz6O8Q?w{d5kN^6-l*%DUYkP`9)!ImnqdbxMubPS0kGEC; zyXkqY`aXrjHQ|fuqxVoZh@_}<kdEhjcF_i8W?34rO+BBZe3&J0&k*gXm9TgGf)ORs zzNk^UTqz!Lw*51IM&IYyGa@wvUlPxfll^|p;j8uN+fql>W&>r}b-Y72cLKIQ<5Wr= zebx!Q-ZFhY5tg^`11YLa=h?Wyg22C?8h7;P>uvELB-r|p953Z_Zm0)nhB0@{qN7bU zDA8OX0uB^q^!A^TNdh(Gqz=Xtdl(X7`peCP>kE(C@?%89J?3R1=%1zKnQa7lcF>Yu zL1vNGgOINju<WzynWQ&NC~^^ODf-AgBlA)VVVh2s#@m~gGHAyrm56MupTpIz%QNv# zj>hh+_iHIHI9_#dW@fyS9gxod692cjhQgjih3e!4?C#5EW}ds?*te{PA^PX96iT45 zZA&GbJHej$N9aHvo1HH7n5*x^7PQI(q>d5TH}sxp2qoTJO+bC+tAA)h`dSSCB=U-( zQUup3NLl~P>0}TxOK7d3aJ-o`4DJeV3Oc70nJ))$m2|BShBAi$bnFe%+lL&H_LbVb zOGvMuU%mJ}j5OKWUs*H@4j^gMu{OvJ9xxzxggNlBQadwRq9rdgeQdr`bbY89$*#-q zO>v-^VC<ye+70cLGbH)rK@U!y+zJ?ED|n#s?VdVo%Rv6Xp890Ud3d&X2JA3F5wBHg zExNys13bK70g4FQ_IwF7M>>Mfq?ya_ROsLLd-28c15@usg~W<y?0G<nrptc|B`E=g z!FV=${!J;oNZ|}~txq>+W(mUohMbRJ?aw<NeRwNfPjWUQs8nLEA5Y;&Ydy>ea~OK- zW_>uh{or~qAHr(5q^MD43y6jb4*UI>3>9Q=(<zIy&vK-nC@6Tr-oVz|aY5&<RaMHb z-}faYOfivWzb(%yo77P?2mk-)CWgYBdqDxT0yb$qkZ$RjL(RLjsiVOQ)_`>~H`Ofg zU@Wkwt46`EI>T;^`yA_FJY?6+7UoQIKs(BA!EhXn>o=#SygITRGR(MU1l}SNjI^sY z%}Y59o4B(}VCC0Bn7P1q`j5#;j^Cf}C!8gV$SyS=8_HD5a=|ZU5+E~kJm0`hdD6Yr z)80`%Gv=GH+#D74ANz;3ep}JE(lzj9tngMn`=u(s*Hwwk)DhV?%5&eSu)Nbmj%%7L z-}ist!xCf<aY+}E2rK>l4Z8^bA`GDk_M$*M>lf6X(TvtVAGf;cegKq2KIj80;imH4 zmw2(F>k`d)Ljyd0xnB;JE8mSI+LH+_Nwn<i${T84%x?Mh^Q%h?XNCsz&(G?^pjFI` zk-p~hb9-fY_z(zHpN;0_QqD{ZVd$!^tyI_b_mnUcC;;s-AYs;32mfdOcBjBCp}U~G zky=OY_Btr*T)^GAvt=>oT=6hyk#7ZtHMmUr4C@ZNl-(5{|H{6e1jzuYYF#2JFMal( zAayJ?>GFO2EzI7FW-n3TBE_G#mBtn&D;DhNdzQSduUsdB*|sxj4i_u*RS+9GB6}ZO z@Y<g@<)0ivBZaKk62Q?Kh|G*D!Xj|xezq)9xRpWF;$t3MXe#NXx_max2^loJofLA! zo@SP;ehdr9^_t_w;fJsNuO-FK=a5Rxx8gDPabz0l%ZZs#guMlAW{&v#D`^O|Tn6Rh zTk^L{A_e<82ZKqs?jUe(J%~e>mal?o&jqAS`XID%YPs0t#SGQr3QQ~QRlSS!7@4-9 z8|Yh1_ghq=BWUZJPR6r!ye4~aU;>3vti?3-A6L1a1Pe}E!Bb2gHr8E?BHB^9b}UM8 zpe@(9Huh&h&oXPDo~-m=0Ueh<6vwf^WX}EMuY^bQ+PGnY_XwB)Io$@wF=y~jmG#?& zY>*+9nLx@}@qKvHGVpz`RR*X|n{}9!e40T4GK>_ph+3i^?5Jf(k(%A{7}ia66t^P{ ziFs0~y?6aSW<Mmg><UJrhlp9}rvH8BqfdA%z<}t7{Ag$XzH@5^D3oE~L{qm$x0PNT z8NPhE|Mt3LTOTMO(=VAhqz5ge3F~JGvc6d06zHBg*DzuTPy6adIlc(uD>8@ULhm&i z5Q1x4y0v=Ni{X#O5k-!|dDXeE5K=y$hJ{)=ZSLtFSR?EV;dskstZu+q<^-uzrOBti z6DB+E$&Q!{l$ws)pD(!R?9dtiluOkRIi;3Wq?o93002qBOE?Rq$f@7I?#926y*dAS zc|HTIi8(FQz77!UG!d|p?DYAI8Ie@x<=S#S3&RL|aBJ_`%%U5-^y|b{jDAq@id<r# z;n>%pWtn|Hb-CtUfM37vO6ih+S<+r$?qFEF1-7p(y5Ys1Ia6Lzch$xil!$jYO+<F{ z=I1Zg@I-uGp4NX{jd$`$&<I{-^CCm}upy7#VNM?=Ya%`=S|@D9)_bK`M=fpBQsa+* z1{p&Z+sh!E8Y67ayW5wwn)hvxGSr^qjUpMm-3&fg86kfY%UysOq+;Xe??7%aPD$l0 zHjET9#4qjx94NC9L^Jiks+5AJQ10BzA9MSAHLE91E&<}I1DRm_JEzQgz0o8Ld>P7} zIa(@xg1O=iZzC(UPn6<PU=~vMp;cGtRuAb0Sw}vCvFAO3v1w2CQROg1%F*i`)EgO^ z($|CL=^=-l@JBn+omiPKfX8F^@VxxT!@N6>tU&@V`(s!G7Gw=xY0<BpjpJo6?yEL4 zzL?#YYE~#5HKitf)5(Q0QjX)VJ8~X{m4Q8mGhjl>UGTt)tuLO*GR4sfBPlX%tGLkw z!s}ts9Hby`)!7E4zHE!1@wJ5{gu_p>wwTZ2Tu7t5WLi{pS=eO(f~2+;%#_j(guZYH z#Q0t%*+^26Dt4ahh}kbM1;w}sbH#{*oxstjH)Ti*BBd2Axukg~8)-XR=zl5oLE3Q} z0v9YSK;lfmBA<2k)<^&KqoZ?S#6$7VVZf;F3X-y5ltiy)4U%l(H2}KsLMuIR)(of{ zfB1jM`s%PKyRT~%gh7#%k`4*!l<rOuVUQFl>FyFiM0%9&MnpgfkxuCxN>B;OAq57I zp}uqb#`XUE{&=p-N6~xc+~@4G_gZVO4PK8O=#dz-$~*CME}5qePrE2>XBb2i#v#=I zSvtN%uyi);WAV1Q*RtZFkkU$kTZ6p<E4H;6B8ZJ;3F8uELyP|!e7?#+^8W`}Z}}_j zdB6G|S*1lix|GLOceqxV=4Po}a{X!SsLSL^B&!NB;~+zfXgZ#o^{21o4zF3pU8txE z!`G)kBu&Z=-0!2Av;oGU!w4IUVEzyTnROez;6!*D@GX|y%zsfu>iHhLSv?1yecFGH zdlMA@%(|GQuY*v(3#GHW{M5QWd~`z}dIhZ4)<ItcXH`tEK$Zg$wJsUu%Ul0k#W=95 zY&GH)hiPfm(>F`SKa+h5HmS9VJnXm<O4o;TjhBIMBAf~l#j2S)I%Y-n0LOwg{n0;b zH+lkXyMs+Wbs`x4U9jz_)Y0G1X7UI4f(02Cdt&G%Sa<K-TJp(&n^^suXHzO-Cv28e z(=6RXcD-0qhU;>utO$28*f7(P!D864p_FM>w?qTHk7gX^%YV~Xb-7eLZfHSH<QQOr z2Vrx3t#yhi#LlL^hkN?Ihq~aug#XN}{{G*MYh)wRZ>`m>)O!R#kI6my6{CvR$56a9 z2ifDej4ueSA+9lx{w=`r6v0yzUI$A`5UmG7KY8LM%5ay+>^u#m=MlSW2g9SEV&=d@ zMPJ*=F2pHf{quR_lw}js<iF6HBDQD;tj>v`0E`tT3sQZWK1IdkjYpt_EtxV|miXsf z`VxcGt|?L}@CNv*bIc&V&smBv?R?bm^jAvt`+TEJx<SA*z7l_q*wjYxQP6FHfBycu z@U<yI!Lr)U82el8e$MB7pQ8l+mP`Nj@L#IMp{3tdh5z|mFl_%<U~l=qf}22_&I5XG z{a$3Nne6lSQxuip+pK)=2p*we%_pS)>`7>grN9Q?!vu9kQj<dHWt=_Th4i4%i;oXQ zC3+K(2VX8wmO?-He>aoDYw*Abl5<~ghX2`AuCnUS`3@d|@5uub#CqYv@^4Ove;>;D zf7lE4j}JrpFvOk>CU_oZS@`eu_CH&5X(m*54f-;}m7P~P<cMr=u%}do{`vBhpP_j0 z&A{pQhg-yy_8o%|zYpmRL==mC9^U|`>~~bzzwg%@+8^77oQM+HTn{2}6xSvub6166 zf?+p&B)R^1!n!ZCgZA_(udg%w-E~Q1AU?H&d*z>1i68-QAO9|9Z%a1!06O4n(~Hj& z!IQAAIsE^tVGON?W0}Z}sR$Upu*E8HrBVeAd#X3NKFU((kNYQshl(4xS^wW<2QOi? z0$Mv$2iAQum?sYOl4AVtpiOWrY(^R5aY2gtAMc4a7K)G!7^VZ-2=FURNe4~_-@!84 z4%Mzguj(U%-bIft5f<C&$RKQn)6=qT!|_n}v5D%t<ES#oO`m<L*&-oDcC8p_lO~%m za#xM!pC84jvj4{d<px0ucsil9%tExT2rba-S`nBZLB}A&bDH>nH(UfU6n2!8sFdsi zumOzb0m!@(=q}oJ+u#TbQ%m*xJ$5=??lYfQ(R`ln`I9z8LvN>1N=ouDPbjE+996%T zv&m7m7r;wIS=;umX5r6Eq(C%phJmTYA=<pGnW;H&zYLj9I;}mxd-%qz@OH|7u88L~ zXvM;fq9k#yZAXI@nXPk<5V8dy>EWNH#s6HpP}v?vu=(Q3s(M{<nW5;aBESv0-DqPL zwmuNzSSX`Y(?*6hWm*;jP+J-!>X)hRraenjudf>hBpo7$Gq#fF>W6~uw$?w<hGZJD zP01~b{ojQPm4|l5OUFWLSPVY27X&uyr;G4AG%FdSssDM6p~TR8RQ5bnS;VCZ^=25< z1X*Xw?B4yXdtq{^evY#Rs6-DP%@mUWxrQ?FC_9YcxCB{6-0<-qx0}T&JdN(Nj_2It z0X}~o82Rs6i#JFjPX1$?gi?U*Iv8!(RRYCUDQJzPY?yz=F$~5;+Q-TN=Ne*PJO8_v zZuNtmuudEbDkIT1YT;?xtOHm4a`6O@r2~B$7F=4jWX_gQsJU0W>cCHU{gd<3i%^9p zXW#bhUKYVMcYpY|)*P1AX>f8&xGm6;bKw5(S8jXG><S$GilTWM*rh<#sP;%k0N4lA zfWDy;C@}$Uoc3)8M1;=>q0L5jNK_BQ7AFHo&(nVBmTOBGpJ3Y+mHmI-WgDLYSnkdb z@&%$!&{|?j{BhnuCxLBz<?;*5`EF%PwsXTlL{z3=b%+3M=^({5;Q65DP}yYWzZ*xd znem~{&&aA>X^pe_OMNwQs&tUQKOoiuxVnJ;a2y(<7dK6Zh`RarTTq%{U;KV0QwTCe z>7T&I(*q_5@gR_&^f(xUGM>tBiF03JuZ9u&ObR$blA=VE<WLwhd}Mh^!33gWyj>yX zKSu}O7TP444)^<~oMAOLEpT|UXsm4*@C1E+1Q=shifoJYf`gtmmg+2*$S?f-PM<i} zgxay&S9kb)ozD9!u#_LS14HjnKtVRt6$5g9_E>ruY1KPej}-V?fpyS07>GQ*M4D`5 zUs?kOkFR3Zm!&IvUVL_yTerW-aBE59&SnTua@qj`dax2PClcXSTjw?Qmt6pU)<vNB zx(gIj9%7Y{Q9Gs|-tq?0xQG9y6abf8$6)WfHFj$Tz6a2^%uU$-?Fo|PMKa2ne={^3 zDkz2uEbM(Dj&1vI)JX{FpG|PHwiu{YI|g?v#d*({b>?+a=3EyerzX9*&saB|v*%hS z&FsG4@^*~o8U|f|kna-;NV)%xi!*Zk^c4wJ0AQYGY`7>X@)G9y0qU%?1NQ$Y{yiXK zVKa4YzitO`BTd*f=Ew4I75D8D&5d!m7>+HNIb5&x0p$DjmGZxD;$eg86nsLFU)!fm z3}D3LPsQPDq1v+GMP@zFP)O(je|B|!ulGNXmuzkrbRXct&8(W2h@Rng0IM(FdABdZ zHoo8m+Fo2ppiWyQgnynaBzE_7&pSPD>%uE5l&YJN*{<F`jgY+0Bq9k~no-R3C#o2L zabyD-Yci2g3%ZE6NZ;V`T@`1_ea&H897y))2_mZP!vuD5#ffAv5lECYjQp_`;v`Uh z*F_~2)UUyBy?=bNMc$TggNoz>$v1d{L6eh^A_eLxRD&!?<i9Wi1aT`9Ly^Z)cuxG_ za$`S1fj|w2A3T7Pv;<jZe!k%eX5lQi*aIWIZSzPv_jiGqdkx|qt6K%P72p9^oFYTO z1waIsrIwP02|7KZLL|xNV*OnMgV`rmV&J9?b(duRzwr>P7$sC1+WeWYP6ST{>vcIX z2CBQ3z38QJ)LKqvcBXWBhyZmdn)6yT*B8~<&DdQn`ru8rQ{kU2ED>CQL7XlGy=<b8 zd}WZB8mjj^K>@d_D%csC3kkzZAQX*01Px{-TBU+E%2cT1tOhhSmH?S%1Mle2v=mG* z1T&uFPPc(41v)YD+Hu8lRf%kDn8)Cz%>WBV9=9Afn_NO=%WJJ{NwICvJXwFC^yr3N z2sRx+o;^WV{YuLQu-@(~ECC3E*xS>I#do>|v#mr@%OBV831nIBtFGG<=HA*H0YI&@ zIAE#W!#}&T{1+Jg`z3E7RBnM>*Cx_~GM=6bI`f9AJs#IW7yqVQw#~ynrQrAGiIo30 zVE*@BYm0<#6z2C01s@e+pj;KCi#tgR12X51;@eFwMQhn16{k0G*QdXdn@MuF{3fv* zdr7VVR`S`M``&@+{2u=P@0or}V!8@Yh*H8L+nfOJiW1%ga#hQo7>xm*dXpC03i`$q z%c<&WB-Um9eXU9){e7E2qd>%6BuO;a%n+^VWq2WjIpNt_3wk1kt+B;bI)n<krH?=F zYUTV`dUv8}cj4kw(+Ar5GJ*GbO&4P`P{9`+H?2vbe(nYzpRvuca=6OpxOU+EMd0F! znT;WCP8>a|Fb>HhA&f_Egu}EEh|&ZQ1sAT0&mjy@j6|Jr2<#jY`PhaAFf6qgdP`Cp z8&G|YuB{B>o(^GTgnG%v9=^tyKYe|7L!T(;`|VK3ZC=~_5Wuj-kox6VAGCPEGgiMG z&*Yaus8Dr9RIY+NJRpAQ$($RIaTS}N{h|=V=%T78XTHxJeXi-a!5Q<%5{*;M18kc? z60vb7at)NFf0M4p3mmRv@OymEm>2(v22Ttj=*Qx5x$Zj=CGgJ9_4u)<ELOkd(C87{ zXm8}i95E&F7xX-0N&7n9@ODb4tg^-?y{5z7uE?6LxQN`C_1t!&6SebdNB#28u@|bc z&Lo>I5Pg9j9HjD4l~QHV;BL{J#pr)8>f?P}uu`I(aiJ)_R&}XyEb~x_#_*}UQ3yzq zI9Xd8R!%o5m?)*BmP#|{5>H(!FDG_$XnWA5K6F2KQAezDD#0c|3<~j~V65qJ>p}Uh z|8ye~^cW)`5y2eG<ka+MW{YCZHkzI)a6Pjj9;ny6U>Gb6l+-GyfRI)c=s@v|Z@3el zR#8*#(J~Ex-SA>r1las&%KOfr&ZS5L{IM9o2wvK9{=IgfhPlEXOn^O02|{d*+lu1U zwNL^mw9-CMQ$TzLq4oO4-rzrrnd<?CinS@z<)#BD6TO_6ab+IldO&PuU~*K1ax&gY z`~3Y$kER)wl)a~yrt;zYU<GBrim18$M@p(`?w7Qv&CBDjQIZ}({=Z5~sUA#MGzF3! zE;+p_nJ%wW8eot)`=fx0+zn(YsWnonnOX5_EUI%nic8+DG>^>vy<T%!s1vd_>iJbG zWh!Ljcw}2P^<=vBB8i!bffn+BwgZfE|8iOwf%r4S?I^&fw3hAWvVGHp6M{Lvfs#5p zJrUPI?p{_lPrv@<i{OZ)V9-%@&QQ=KbYV%KEfSW1_~c@Es1I^7pUKzQSfO%I))0o{ zCCN@infy0vFxWh!uxEz}3fc~79>W;}U7Ame(UqspBRM6~hrS}KiLU+!=2fZ|&e-I= zYXjnq0cm%WHAqv8@0Qo@H`o=euoi!PPix2cPs$`)2LAD4{lZ@jvQI9c(kcdq4`7Z! zqbH%)S6lfMQafCk1{nsL>|<{sc`{nKovL<L?b5!cXk9j~C8Ogxrb`0o>m{_xRrv?> z$IJ~%Vf<ySXzNLYnnqD&=3%|(%q@z$;S?|Us@2I5-TX=!m6sTy!@i#JdFN9HfA{Vh zzc`oo@b43BCB^jSuF7Q1tMhgzMP_fzs;9c`I&1Hjn!k}5PtltC$;4f|jzoR3i!ToO zc{!3<*D!=@v094KDW=y){q#N_Iw%~=F|Wb0SOwlkY5>@~KMq1oqlr)tpPv&Lm(5K^ z<_)?I`p4{O?s@{~y9BsoGpMLMhLQ$gFqr|}6Oh8Y222*Rp?(0zW8M-a>Hj1FIy=p! z#qB`vomjaN`C}GtpmVbW$XTCL2)KweZ}K*|ju+C@AAnx))j-v^k*a%dbIw@K_u@k| zku0F2`>B7A#2f<B0cUz&?7s}589R8B(!>Ix$cL3{fyq1IZpum!O*{r{Krb(*dObgS z^_1qI24H(7P%CCi(D0B{AY~*>aKFeI^3wAJP3){*FRiYPq=3XgEPgJ4DLe54=cNLn zRH8HJx{uk0kjrsMhk*nGIkMwLUyJ}vPA2fU*L5CfxRL@e;*pbzNx~sdFNgxja1`({ z_KAtbz~_*kQIAS5-_Yx-(e$vS$BT33=RCMX7nBvGD_+)vfa^X%eOzw~9Ou<o82op> zFo?%2%c(5rq|jg;0rauy`)39xKe)=q2C(1na~k9ikMqgXllCdPETW0sMIzV^e+7Xo zOO0AM`5vd_nH2ay-NqRgrn8%Xh)nTX1Sqx+@(395B<(@r$fE%=GYWRmuS=KyfI+(1 zLt!4o8FWctA0Rz4p-UZ|KHXGYX1t1NLF;c6p!Lz=(!FIZ>Sh|W_f+8dBjfO~5U=Y4 zNcdP05{^<p>zkqi;0^CTfE-44Ld)E%Hc`&FP-nwD`|vS3g9lY0sW4|;&UV~MjFbO% zEFdUS`gt~I#{A+VMU1Cb>v+;L&bv89w?@^@BLe*+;AICgE0b_CE-AQpfBBGo8Dz&0 zJcf(H45hA!-Q=zrHF;dLwy)ofs1N>de$_a&p>?vUAxql78)78f64=I)lFj^4KMZ0^ zFjvLDQ-`8}Rt~Xgp4EH##ck;!m2pw&?h(!WEA%Z8B+<9(zHovp$_9c-M#GC?_#zgo zc|CNh_qFSJsGmBQ;fwo7{n=e^gerU=*`(_R<AdEP2QQzS+T4sa7v(m6X&c-pz**F% z-@AGU53mj{|NL~5F?EfT)Xn2RfrlRG32~Jj?6SCwqXgkp-RIgVi;AhA_N>>myfqqK zYJJS+&HX!HqJC}iyn_i&uN0&zCOv+NxH}$RWT5KM<XL{!fX3V$*RL}{(5200g2_8r zddRwv!^s(y`$PW40~?>OZp58BYv@Qzaet?v8L0X3hIF-_j&bdyRJ__-PUFtjol{%P zx&B%ar%Q_?oxt!1+cNadxvl?MU(c#qflMoiQ24kTbuEYG=vbFPW>RX=n9H@03pR)b z{3$MU6DM;CMoD4vVDdob0+IEbCI}iO?fu*Bw)=*gw0nLFX0mdamted>6*q4Yj5F@n zmM73gxqiWH0~uA{u;H))K~Ps1#5vh@-nu_X>~=?uJ2MS<rdVJ)=`Z+t)cW&+06Dgd z7NdWSHan_HvA!l>pb!8g@@jy=4jOims#L|zpM-|2rYT74&b@&jDa2Wxa9OX7hHN{S zXJjE_ho}8#S3E*UY!dE>ex4iyJVjO?cmKjmB8K?PX_`~WKfwRzrddi>-%kYV#H)P? zIuvOB8VP6AwzXazGzHnqIFy#0H9n(4f9N%y$4u3L0hG2`?DMtzbJV6QP4G*IJM~~8 zK~cD4u?cBLR;6IpM0q>vx&8Y<LY8>3*?LhHD79uv>+$sRIONiYRsB!96jA~h%vLKH z(RM_<y_0tXFL$9DM6DvQE%_yy*I0~#WIGnV`0Rp#>}hV}1nU*2VhgB-qt3K=c9zSZ z#1hN;)D56*!aa-eciY2;mXi2h+F5D$HsF7Wz>}JF^m*Z#?~F=3Vu(k_IJe1D%dY1c ze<f}Oavxj#h5;A&h@vmx?n#lL?KS-%PSOn+GZX<^XGTlpWY9_gMvb>74B{k?^*yhR zX=EdCCg}HxUTC1o&P*w`f1Ib7xc6nYsGp`t%SY5aF+%EHAmM5hQ(jchOpEUCE0@$f z4##scpGhi8xH}=kGzAjOG_Se&pRWTu+Xg6er5GN6Aw*qUBso!)C}dNjIVdr8su@#W zDHGd8(<g7Nr#n>i9V+RpP`rM1(MdX^WL^tugjLK&Mdh16m*?}BD=n&Y(Y;~*dGOx+ zZW^Z~X`(|Rzx`!&a$VEi=EYks>~$;0kZu_ThHnl#c~#Kgxfp#l>bG61PeNi+RN1nu za$<2UL*QsE=$r&UNp9AZ*geLpzdRcns%*QTeH71CaK3pQ6NJu1b9d`6CGEdL(?L;z zuKEj9TbV&HC+}0@9D5i(tHr8}9=%%1<<ba>BIH7?q3TB6spfs<R3q}Gr7KJe9}eyt zEN1x3{^3sIcRI08dF;?gjl-vb@chp(kO74Ok;>fOxsUQs0MVHl5*znH8{78_k&URs z=klrFjZU9z{f7ob)FBuMgBfWxoH69lxb*vl@OzKrX0w9#7C9J|>VB-?vpS^CV;{rk zagcStI6f!Pb#6jvDQ!k#drj>Fg}Lfwz^ik~a+wo-R78kr#_-v>5Ap<_4W{E2Q>YD3 z7b$3^E)L!{{VU$`_KvD?1CuYUkcv9jm%5hNRn$+~34;@|dT3mS!oxBJy+EC>M*pV` zx2m8zm=>1~cUf13Hi>rT<>-Uf;)}Evx1AQ0mWw)!GPB96q%<%KXyMZEyB`0bkfRZW zN)O10V|x3qs`1eat8kW4bu*>gy55!Wmi;7;qUkNd;fG%BS4S4L6q_HIXQr2nn=9QT zQd<Vu!+@`=iAS3VDK_r#wA9fzW|bd{XlHV3SwDo>UxF3@FT5&7?@HKQFg7YHuA`e} zD|x-P(g$fZz_er;c6+7KU@il-0n7=d<9XDgEe+43l^^!%mP;0xD40VfN{LS3FVX|i z0n-9)BEp2|DAH{0s6mFPTd!o;q+S>lFxa`Nh5$aUuaKgZxwf|?Qn(dB0B=;q`F7MN zZrVx)<>&N1qnV4%uOPYx2{6!0^p~P4HjCjdto@p}M0ka-V{&7KqpHRkSH@jNC$pKH zM)4H!uvrT;4G!xr9M1>gt(ZwjaACs~_wIowO25)y|GcU=X9eD<6f+8M&sC(dZ@Nmb z0sBmk8GW_-+N_{ua*v|*&)3YjhE456vN+g7%sp|v-Lh3U9F^6QpH{*2n8Cp=Y=fTh z)4GFYb`o{F9dKkEvR3hx)3m!Su8-NI2hbV{c=8-b1~L3X_>V;dpMIY&*5D1=d#0dR zs1v;ZHthji$JqQ;4U?1;d?H`otkir>&~zFOv_re<&``-8jr2qP73rmZs7%x(=a{GU zT?kF1ERKH|XLBCz@BWBUs%(HacrV%$Frqe3HO^1FM?4=%_zYTPB~1HfwW1IgFS4m` zPU=@n)*EDLcmS|c%O&_ALvV_3FUYj;H3R!Y;{3FW>!syvh}8g4=18_2c{-g*^8#Eo zjpFSeR&X?pRKU?Jw-nB=5SkCP?;f-#-VeMZXoUSHlvy+I(x;@jnpcYRr~9-F@`J5y zEPLkn+K(}YypL_Z)~I>eoG`jbadFpvLvE)}_QL-;pbXFfEsgB$j+Fg-Kxw?o?~B94 zZ=Eg5raop6i?TAobnRSbd4Kye<VT9EPq`Eb+O1=QtC+T~v%3^I14#9T`nkugo;653 zne{SX+toc7XvliwOtrUn!pBWKi3?wYGR1?Sv{P!9g^eGVYcEqCBTK#*=*W^631iOE z3EI#*p^NK(6X99NLCdSX@P-bT_r<HgXvqf{tnf78{2-MDcvP_ldF>iZPtc0leEnS6 za;?c4t;H&UnfiPuT2+V^Mx|B~_4b?hIa=@LR2<@;pzjeJ>X$M9osevD(a_nH?S1mY z959~r!9WpWO>$d><1DhNKdh<G;bhK*Nm2C8CJ-&Azv5doT8<1VvveggR4ip@(lR7M zxi0__<=w7)rXa?_UUL`EL!jp#YB*`VJZ<&J9NvG_Z@m9-qh(#|#O$%?FPWoH@z(nf zPFk8e^QbJ8(`ffzGRWd?qEc)dl|Av733Z>sq~w0d8Ysx$D`Y+PsG%^SJ~Y1_a~}u` zQJ{ralZmO%$24I!;ZY4|L)%sJeHPQ4m9lmFdJ3wmrFiw_x^QBxVW4>jNL~;JY5otL z!ZjnH7>sF>)N489P`$!LBwYMB`}<b&0yH+z`b}J~2<$P8vwu#nP|Q!3^3SkO%Udv5 z{6l8RK8-I~Gxy111wQ6IbUY3wWUjraQT)YJG<cWWn)h(o)L*gL0iI8SDvQD|tUwk( z;iG;;_i}$6Xcu+-4(&g1Zkwn7PC0&fiRAX$l^Bt4Af+u{uNGh)WH@dDBZhg2mXA3m z5q^-WM6d#L?~B^F2Az8Pb)EaKYknE>oNPG{ioeIRP@bSX;nsb3gJ({vQzOgXc&Bmz zlH7c_WNN?7;cxW&cTib4)rdT$Jd1pCfu)lADenm~`v#7udZS8&T&^9<Ej2we)IEW? z)53xu75dT-KXUtXR^92qM;faBH*Fp*0kE$HC4h|`Fp=+-Mm#?`k|nhX$GQO7VR7|k zph3e<oCEUhB-JG2c39h&PfOz($!7e`e$_t9S@v(=dkp@EVwY&{hqJH*Yjk_$r$_5P zI1}9on9y&%5Kp}gpN^^ZPL|jYyZVi19h4PP)MMLL1Sk`Tc#!eBPXiN#NP^9BOcXlw zeh8OS({S<RnChiwPvGwFjc=O{0Zx$E`Ep%fr_?p!`_RbDGZhKk^d)&k^WVd2(^;-B zf=>p_hYN|vaH3q>80R8c+e2S-g~FZ_b>hw5uu#5}UrNa<IxVIohO?3q_L=7Da$1Gg zk1<H(7Km1I+i`#IAsO{TH-FBT!s%*Xm}Nq$V7f%qEYi>>?x#=7LDtEi+`zq?m$y6c z*^1l-$0+$c3K2~t!{!L)<>^msG;fd;ZddoP81wf0cv*7hF=2d5X_-Yd-)S1Hhqvl! zj`p<(m&rcgO}}bNMEex9EviHMsLh%FxLs(JQQEgqD}7f_1jZZt<}0o>N5*kqXTQ&z zfFjqES204gtZ$Up&7~Izy}Nv)a`<4Qby?*+3B%jKtkeHoh#@DxT`2058c(nyFFsBy z&mnF#&wPp<ebcUYR;gKt#O8??0B(mFEBmS?MPGE+&c5(>Gl_=LRHVeM*--=6)Ie5m zVLGp3CuZ;0kyllY*{d7exsuTcsv3?4qmOS~hJzdKz0op-CoM_s`su_O=*_kSMrP&* zF-P>hRb@r@kBRpx^h$x_-=-@Lkna%I_1>HLh<6PAx|Ma^{`+;3_i*LSvc52m>_5WX zTS4leDksc2!>PRTX&EDWL2g;Y;TvVI$JB5;W)9pTE4}P@E3rz;^7qzDno=-6CW+qf zTP9?(xcs;ebyO7ZkeDi+4@l(6tfDu}>GfwtO^XCosXc%G$=&*muu+5G8G;ES^>b9M z&_y*mg#@X02-ibJ)=myV*7~E4={KXV=Uwm<y@C6tObJwVHTu>mAwe$#+j9|o1%#5# zOjhC%A7NbU@m@Lz13W=Auvkcol4j3oYS)nx^VVufq}81~tkC7%kNw6v8@IW^q)zy7 zQ;jVvaql2wbCOhk9dugluOJJm`z?P6XkWKrRTwV`0o$AH+pl7PwE12I`DFM#A*I~( zxA^Q9K=h)+W^0l2yV`QRw$40@E-2qm6<M4X&5L_0)XlQHXwtw$u-WHT*m&`#OA@)c z?`ydLZ^?IpM0}ri?`hgLW0Q~J8%l8(ZytB8{Wp$xq$vB&eKA%{f$|cDh4}duzrW+z zs~An_hy@=G6AhJi%Q4*k18H@)xRw@TKF<apPG->D61Iq_E-uMhY33MtU@8GlqDW)Y zqVRXNo|_P;h1#t%O_Kg|cz(dIF(Q3GBX#s%3()3~m7X*X-$}=sansD4p|R~{WO{!a zsp6v}`(ZJ%b@`3Ps_1><>yW8*4d4!}U(uA*`x!9~F*v!>Q4^ZzQ4FgQC}0yVVdK^W zQnHEqmM<xZ@EwzKzp$*0v{ZoNGa8b&64=cOit&ogMpu*D>0x7OpZ;Q*e6<CN&>6p8 zKNE_cO;PnCVnS_I0=;3SE|PDIxvp*foN@%ed>_$uWxc^2KExsrWsvYSolipJS|~S1 zg){f7zy6)C4aqlYu3zt_>EKiP;Mzn`QnUMHF_prKnliEXdL$nc&zBa_fut}!Q$><E z!(nG_bH&F5&WcG5t~VM#>jNFPC)q_L;YO?IJW#kDY0~Iku87iE2Mid`z1gG}Q4%ei zY;8E4V>czX>GyJ#RSm5@Mc_S&&XgrYovKLhBbuD^qE}Ti=QalCX%-`KncPx&Ut^ec zHi(ZRWmS2UYS?;k#qvKyelFgb#NvWgz3#p98-BU}wY}1;ypra--jqTA4vg{eYoGS| zCr_zY7ap_Yw-jl?oU{0Pg8(IQU2<!E9%Ai86=ON<XZlZyE8Vg01XWEb5IoP3E|JjH zvCVW-?rtZBD^V=#Vlx^tG@@)L;?Iy&Du#X)7et?Oc~o!azwu=hggBXL!gG!wvhxBL z5#P2}SdhmLt>()+?52=Gh9I5>{eqw_JT3w`?GSQdpwr9EM177fk>P$kB+C57VYleK zx-}|W5stcTnpd`QwY`I1dxOF|?(TTWACnZDa4HO82^cwi>Jf+kkPUDV)>CqnWfGfs zsT+D4)XM%3i-F8m{8)d;u?5B(t0K_%Hn5tJy~ItiRptKS<NfkVS^pWZ_!~;SPFLCs zouher=EgjN*zI2O6==1aW8eLjEEFp-%YnbF)e;kmnW_xhc1T;sCSB3TvA#`JEL{<a zZJjByLzZ_eLN&ID41S_Uh!|K_YJKA9piIt%>I#^K09yygUn$^dtwTgAI%X`g=_%mk z2_^l_F$aef#gzu(X|L#W0`^6iuDTq^?>7EC9p|YGFcxX4)idDcYU)?~`KxzeS-@(6 z_#@0Bx9nB>)<!A0F8OtGQ)?eZ_;g(1E~?_|lbP#sKHML-%wSZ0uxENPiWuQ;Lgo5~ zMcZXYlDp1uY|7UI1RtJGSiiF+s=_L#44D<aL{x@Cz%|w@Cv!cK3cj5k<L!%Os~^A) z5xFLPT)#ym%zG2utdNjQ;Q5I<+kh*>AeX3fd(G+Qv6{=z!1$V90H|vH;j6|vh%Pd_ z^It*(Ogp`fM!e*OYr2?&%{Ys#l!Tzv#j+*JrS4pq9(NL*PtlTiaZGUP_m}gyb=e@2 zb#l5}cu@HPcB`4?$n!X6?kvLUFXNG6yn1Tn!G^e}NGLbB5WcjoC`o=&m>``l)$1P` zrlUyF<DR&VS5eFP6QR({IcsAox+MBd3?cT5=*9*UA&e(8Hgjic_wM_bw(f%-1nNBm z0V=LvRLpMRg_G7cdU2JU1LxI*td6f79Cx}wzj!)racozr|HVcQ@s;JIupq!M4U0s` zUrA8$OR}{lo@wW&uDHu2!N3?<^-vXdSTnG8!7zBXt|HSvc2~3_x{Yq;IaaEN;pOW; z`;GJGJOGVx^UF*Qd8!?|@DU>Ln~>Bhi*7s~9~y?wdr9JWp1SN&;qb}3CcNTEvaIK6 zW*i)hub9d~9YFBu)-&ZBALs6F5OT<;-NDm4dBJm`+igQ^v)*19_3YOds-CoGI$o!_ zV#FO^f%$N9)>y9)Oo*v%^mTs9{tH6}0qiPS#;c=c5D+8LBi2434pY1O=_*y3B;nOt zjKd9mLD*{7EVRB?N=!|%k)-xA&L-{KX-vVh3(S&+4v5qfN)vM!^uA@TrZN#6b=POr zBoHR*`6HdYeiU2wbGB~8N4{}${U0xYpXxG8k!jiaLLAlJuRNbymBc7PR4<KOA3{5J zdyd}#b0a7znE1kL4A<_vr%55TmwqMv2-<O(b(z4=hmhujE`ognI|4v$)m2PakdyMF zo8=Wu28;&lVe041)P3>(6~_k{w{VVg|2~;>S+hc!{&yEB?)^8xkJ2K8HHGMw#ShD5 ziWMR$FxQDK)u~M8WB8bjZk`iMl}6g`8kf^11gL+%ee(57n5&i6RXwJm_+WHFedYU< zvci{|NYzw?j+KzgJ4SxHXzM{lg(UOiF+#<j>}3c7Dok-lBQ}kJ0+q3pbGs_WZuX;X zl@o(!(&u~Tm;^!~OBZ{Q9DsMOr>xtaP!+|%#W=+1LzZ{CVSWj!mf*K7-ud+TWu2jk zX8j_myMTPutXX;-+V=ae_N7w$v`BGvAIp!0w6pg(#K#_pbk^XF*~Nz%*~|!_%_;B_ z8R)K~Ejt+fuJ-Xe_Z-(*<ZG_Z_y?JtTK(6`63Zs9JJ$y@%u)3a$ejHS^mf!ieV4LC zjH>reWh3usw;HcgbQZbu?-)i3(j2jDzay1e5ewd>yNbghF-a*;$sC2yobP@n^@GLp zi-!Zy+GQF0U}YTuQctL(Stn<2`b)>UDNHcue9N|)Si0A#xu-g7=NUx@zUHij6LPwN ziXc4gWjAjo!MBqHbn)~~Ci&xMW1f4pA)2qU_7|n)z{>jBtj3@hED5cu1`kF?yyJvf zx4vu}?>2A*?Ww2~mFh^%{W&lR!L?vrS)vhT6&n)m5&fz@ffZM`Gy7IpRHc;m+`E%> z+9Q4QJMr}mg2wu`%8P{rkDzMX)C}Wz23OZ_jKY7uN537dHtj?NLD)c5-28G{CpmvO zY0cx={V`CE+Ht%ZVw=+Zz0jLNF>G^^49}4wmFu#-=Ai8#x3x0`KbK3DYa=qn5_=Dm zf2m3oDd=S}?auus+AV`YZ3`GI&JagmDav%b2a{2nkk}HlG1a5__|d{vRyoh%_dO(a z2mUKpKu<_kHUR-zH-<_MYZyjb-U}hc@%Kq%-x2xMFtX4&)zB?QT#R!&-Ezw#a+FjF zzu^nDDaaU@zSkRj7&R)@qv@7Dt#s~+_V~h#z8yq1bB*|UY~(ndg|Zd#F|$I-ktU&H zAn~m*Exgy)+`6S+Y8r%?mE{mSC73QeZ<A#^{$?4E1}!JSaTQ)k$xRy?3FLz^YN#^B zdrFiKS}F<?%O8j2(>-~#TP8W;gSmIyfMeHHP4w`rqLSpLhC~&j5-ip@=ws~h93$@G zCL41}d3Se3V%M`@kQjxw!w4|B<264j@yy_1oI2ltx26}A!IX9i4kC?}3SW2qy6~r; zh~Wz}Jb?JLx1ajYJs&rys(I<Az(mlE%cR6(l-`e&?r<!pW29PKSO(cMYG1Fhe?L<< z#}k~*>eb#i#EzSN<CagfaHd=mx%3^Xo`Da#`J+n)39--kWA9*F2xmpYdoP68n8@-I zTI7vu>B6p_<EMo{T8v9d<r|@Gs><LdW3E4H<Y*LY0}>UU=EZ!^Go3g!NQ)IOk<id* zb0(w;)6D#+?thxRtG+w4h!uwJ%BHv6ciHdfd$MPlXL)=pOn%AveYT#%JZIuK4^#9T zl5Ra`U|Fwx$Hy4oMs1lJCK#mhgQ+DPX@kz~Brn8g|A}ZJ>QX%X^rvo}Ehfl2=KISj z$I#hhlkTjrm(Rc64_gL4oqLX47DUzwRpS#o$&1SqR=$?u#huo5qzd7*R{gVI1{^<b zFl3L511QRlwhZCDqRKe<ZPI>gH34bs$M1XR`}W!4)2{oU1!LS{=py?2!_<UZOh=jo za@xcySPawtyZyu+3(j$l6w+_Ruo^un-wg><dWz|Z-WMYh3vW;_OQWN%6ZH}e5MwVa z_<%Y1)ip74`qQ^tc0P$&zusic@P?&@*p2o$yJK}hrrX2DHvx_dc`B`n;xxL84`pl~ zo!W>J*^obW9rH9KyK7y2Xr7Z@uF4(Kgt?FMunqR7`)FHN5XH6E!CP%AlPO!B72V>@ zGWchwe&d*HC1NII=)`9hZKq$8+FBBy?J4UIq>&yiE=P<oK@NJduElOOTb{u@N1sL* zqtxq*hdIta4Qci=9jD@%up=)<;bSS(4vIt{m$I41ntuA)NZuRnut8M<x5gPTmtdnG zH4RSq$#ZHpzJP=R(HNI*DZg!=oT;HWlp9(#3pQq046bNVks`z+MuD&f=a>$L`F@K) z9^ISEyHJ~w^u4c=@;_Y@nSb22IF;{MNGzA|J}1D{ejI1D<c^pFm9xVn+?0ESa~Fs@ z`6-rCRif4_f;F<6qSNt7|2SZE1uEARtC8vEB_srzduj-!-YkO&=-H125CFqn8Y%4h zm#%G>KzBG;xN@d+NcbkQskH8mfnQ0h>di>))!;5KrbmtqsA7+P=4;WOL_rA(8&Bt0 z>|X`9HG20+Ptb}L28S%!Zp$WSx<5)>*GG>W1dupAqGyuFlc(f=RWyJsBfaUbUbg3h zaSS%b+yj-L6{_q`W##2|J(GAEmXGl6Hem<;Y0X97kIyi9=Ef{9h0^1FXYJVVyc{kO z5`W+QKDM=jk_qO0qp?Y3@np4Fi+hqPd$z5X{H3DWQ#~FeIMrQYKXl{bJhmaW=esO( z+RJPvT~wJmUE-@@v8g^?o7jAA01wc7RY^gcpECyC9i&ug1)WYdnd;I+&%p}jJTebS zY{;jF<-dfjO0URqmAzd=bGRl3o33Yl>iy(q#-#8#=VUmr;qBVQp*z9k8n}PR_V<3s zKJkTs(?#9*bF(OWQ{mk3G?_;@nL0V%&mdWdAIbFY^+@bfva2{>eww$!F@JV0e^#Q7 zg!#MgG;(Zh@Rh3kkfm|6sjLp%j1F&+E->AxequZLiHIv&)2~{v{qYFRpu%0(wZY09 zJT6}E6`?!tnK}lWYOU(-FNIxCyv|Qc9yeQ&-_6%>*vLH`Zt%I6_vRyI+`O#qN0A@1 zylTYP1Uo4TQhrx>hUtxUJZ67#)4RK9k;%JAfbJ&ZLnQ-EpXYr2h=Lk64G$%urx;~n zOuOf#p)94<wh$?*oVV+F=&(njj3_MTc1KKB>1uAw0S&zw#;IEm(UFiDyN#cn`O2F} z{MU=lFuiI{tf11n%FYC&dA%;6g)Wnh`Eyq0j<8NboVRU?c$LM^JZ4%1uBc}WH^%4y z*N(3{$|NH47hMp~QU!m>SSWmde9M$>NQY{7vF+V%BthI&0`haLhls5G--`@FDjX5E z%C_gY%q^1X-<kh>nG;?;h}j`!(;oCwAYX&s@FRxg&G@fkZ*&4>$Y?%lJ*YKNq=Kn4 z>S({QEI2FfbdR6+p2lIHuGXuT^KrY5hXW;`e|3bjwzDM1PdsSb)?9OXF4(K31;OXB z%j{D^f4LWcLa@<o9I3J@rj@zW=l9&wWzOOY`<=gg`__xFM>2t<a=0r6f<~w%QRHD` z=BIAlj=Vm+e!E%t>GKN=aPS=Ix@no(OSRvBgd}~eOm~Nw@lS;=CYsMOQ<!4KWVK1y z*^nZoNkqEtqVAK?GV$?r0slnho?kFbaF$FWj-U9dd`qP5cl67xN8KG~3WtQ$QSOW^ zlzOk-Mw@2$_@}~D<@(P`b%O3)?&Ofnw7YQ)O+|N`DIUvrxak0-^l(>{ikJbDUzV*; zaX_>}-^-jf=tkpI5JydWe%Lf2Q(Y#?irZ3Dkr2O*tC=BIS*uX_G#-%+DwL{vIx%3Q zu;%!C0Nif9IbLtP%`<mb?vEJgxbkjtdZ_l$&rtTRDy;XT^uq}iqx{h%t!gRRei1$g zJcgnjc>Fr`=}A4!vA@JNHX@nhdJn{WqZIRF%D-g}N+A$vua9^43oD;4@$v3NM<PEE zz6@>Y|6w4N%G_B_Jl$>U+ai+J>NI6zq61$$R%P8bk=6)E<{_cLPe<HXX`N^l6XC}- zxO8NhB8iNdWoCLfre7%Du<)hC-)|vThXPd`%w>|rr-!+xNasWwj8>qV;XsH|pWfS~ zJ}+pAsvwy*j$bcZcPtPB=yVFh;2@#f`-{vL5}OZ6K*@7gN;J8bccl>{fnO7{tCZlN zm`0rTKGJQ1GWX20cAYh*e62>$L43EU{Jn$I=f=I#Li*hyNJi#i^6NV&o}WS5ikgV= z$j0~S@LTK_tM}oVZ>2A`!y>ja?a9Q0w_fOf`K3f6(A%*@QF=kgD{V#M{-+P6V<1s* z@isfKL0sbKgu+{|IrloNh^0!rmIiN&qq~8x%Q8?Y>8m^#V#V{@d3uvKx!cc~{;SwL z#Exc;NVAS1oeIb)ljim?&Etpw`tQg?tRRG1>DMvPg`9kAi#)6M8teDiMJ8NvUaYK^ zm-GcMvaTL}{b+iJ{0Vup!riaB56uJnqJPrTEFONfC$d>BzZ-s4+%eRKSp5~%<QCt$ zwrE>IBG>-FwWK`!v5pFy=#7M7h38ivx7ygUck-^4m`cQCl5cjZiH1_;uDkLx%<v!P z5eBhS-x;WAT70y+Xh5!80Vd~3^5RGh2Q2YfI+x*WEJkP~vK1lZQ%{cSTC>zT^IOv1 zGKMFfa6Dw-|4e};jr)=|7u3ut{PoTg6`KT>_Z0p>)Y@59V}|aJ!<aH@!S@cfG<Ll_ zuvc&2n~r)RzlcP64t+7ZzwV!W7~@dH_B8MF09EIc@9$IBf*`b<#jNp+%17+s;LR0U zH)Tw=b?^%-+m>Gv9qo2o)tg9d{o&ho0u7t+sHL#>RO0ljGc<jYC20kDlYxXKn-Fea zE5-#Ayvg%My1qx(?jXfQPs}P?Lxf#eIW-MvEK%WMI%=HU_xZUEXBeVLfoQ6LjW+cn z@H|H#H#R)&`%a4(ZBTa!Qi^as$>!1LH#Yl$^3OB$XT-Bpmx%1Wvv!rmEpYn2YM+v7 zi!vUsL7EMc*Ij=`)#tnMhVV}7M}m0b$@nI7zW*HI=%Jc5CNAnowcvhQUV6#>kR||Q zvlJ&u-qUjY>xyDmVuV)+e0c!m6p;(8;xC(w^b*$wc(ar#pTBaO_ATJbUryXyjvazU z4AC?e{Wwra<&P+3+Y}|Rx~4MXAsOQpQb2i0q*4cl;$)h)cFvy7Qoc^KcYd-o2xh`a zt$7#1ExAhktNpJ3e8`(We%mgIPXRu}y!_bo*Z@9o(0}@b$cD%XAv74@A6OvST6PRM zc+nT-5BE0|mpL?^&Yi_|{$Q2P&qkC{7qoe%C@;Cd$m1r*WHjHe`h{1d`Y`IKT>^nb z8YvZ<`GZqnTjNOf+IQgI(})u$DaWEp{!6RMrvVQydwqL(<L2yEf?1wz$F!vLk~#!? zh@Vp+eO$i&KsY6u*%$2VD^kDZ-EKwe&&rV87*wZ!G8f&o@QwRiQ4mGgF$j8b)8m8f zGsEr&n8D{6>&ik{@EshnDZ}sj-Xr~lGe)0Izj+zO&TGspK>N@TAr5#Iw3$$mdu(uG zoZ;rXP32IrK(xN9ewPP=74X8URhXde;%=Crsy(I`h*~Ry?Q&#}llYdtuxzF&H+s7W z=7-$2j>>9@yy)tNFJ0MB6MiZfl-uY@Zif>$W#xFT`hc++Vt1Q+xOSi(j{ohgxpNIm zD^+Yas@mhr+$=NhVF9f^=zifZ=Xcu{^7|@`EL?$W4RDJE^eib%p8U9M*gZl|8(+K` zS+qgRX>thIpi^s>^EFD!&GsUe-{sHslHE5=u4r9yvBM0Oj1RC@WK5ZFCjpJ5!MYZS zM}_c7E%jEu!)1aq=6EYh$s?HNIpMDFxim`fG|=M8!yVH%{X+|jjt>@Z@qgyV56=~r zQ_7~&Mh*k1uInmx9g)f^do&X2W+d0-(xlR(BwDY2DGt(<nwe_{UmI<ADS?)i7BPIO zNl(d6nJY?p-aM`?u~OY$o7J#baG;S<<t70dZt_?Q@I%|0U@?jvgODIeGiI^3N+CxN z5t^|SRegp3BV{6O!C#(z$-8<l+hVe|f<Nb%q#%wjf4=)QS8@geasdK)Jgjm{3QB|M zFxA^MjY_;9;_zjaEpmlhTv>Yy_FlRr>#0r1$K6KN-9z3BPvg)lUVbNxyq%pX_w5JH z;@d^qnXibj)vf)WZ^O^I#0$^dY`)OhWQGJEXQjAfGAzHIA>$qquyn5=cpz2D2Yc%j zzsBit2!0d_Ui56!rq_0vbzQU98-0rU<#3rwAhFWvA=kP^GEgM-d5)J`e?}nr@za@p zoGK%u^CDgi9sTe$h1Qb`Pc>kak+IvvA9S`HHf~CIAu;4@bL6~VPqMQ@&z#0rFt6yl z5UHp+CKE-T>!Kj;sH9kQTMkPuUom&m$HNRmAXZ)XqW2-@pg}M`jGP!}22nsg)8%Vb zB5B)9d(^Lp6V2CIk0-Oa{?vi5!Y!DZEvB_w)K9pW{6(x=_@B9M>?KQ`a4G@~OLs<H z23pGM1c83T3{s~*DlHRwuXi5q+chaCKAewb3RxxY#oofgp6b@>f*;^gzg6#wcb6f# zUh=uO6%bF31goU0x0H++f!v0yUS6@FW!>J-%#R+w13yNoLXh6hD|;c8^GL}f?%_1L zOR~JtpJ(OX?#8gm2S<Co5g7NXlhS%-B*||_r5cHhXM^MGzNYH~N))Dvc=Gub3`(VI zByL5)<tKESagzJJHP*uO4kEba=9L!+YsXc$GbS48lRh1rUvb`}QKOdIhmdCl>z^+@ zO%Keiv%lMmuRNYb6i7piw5`d&kJ;VX*U~WMqDmw$L-ISUApO$s?M#EuQdWO?btD!< zqjk!sS~qD^!ULI^2r>{_%BwR)I;0lepG-IE=5X7}N??L~V{k?*weM2<Hrd=m0PtsF zVd2J@ZM1omv!Q{XCOcS=NLkn^jOm;a1YEfribovz&A++PHl|i*a*{~g38fnTC8DQv zB<aF>c4Z&o@zyb}Il%*;LNP3MhpdE$YjMjX0GI2lrMD);UZn?V#-L0@r@%}5IH6o( zn}{er%U_>l$+)c>Z+UBeZ}JD#)G~Y(#tRdQ<kLRL*58itx0#AT_fDuF|F*56I|MnG zMia#rU-iV&f*zKwepJFw0*y+egWBfzmx95kttfcPIhR&>T>jsN0Mq+H0ZN%Dsj@i* zr53-lK9%wN!NGx;ZS#<yWr66GU*3#^hF6TPNHj$3%`2Mq>ggI%s`yvuZr>yb3j*e6 zIMjQgA=zKWZQt<C#u<IQQZ+E-x7vX;`sTw%Y*8%XDSmK2D9u#c+x+nZ!AOCRcy&Xe z-`;<!)KjM?wh=EXX3Bv&-zn|FsU!la*2Ks~$q#?Zzsbl+e|zU(+i;nIjAJyF7yacT zJG4<3>K<q!%?#^6DAREE)?`xCT+O@!>&s+`L3-;7rVDB_n+m*3`5Bo#WY=NASPsl% z$J3r$4!3`Ee#KEBRq)X>V5tq^V$DNf&^TJuS>Ho!S66mYUtjNc3m0!KW<J&~)23T$ zac+eeMXQ?_YM5qW+f(K~i?|`7ZPM*KtUMgINFG$KOJQ^ZqF8zE#DQ=pASU*=0c(*p z*Kk5-_tn}w{lb0eE=qx|C4h%bllHZ+S%bl6r7ggygz<r{Eo8}@pC@hh)zcW+z8QxC zY?Xpf9m<h&G@L^xW^r!Z#LvnpL~~{oW4N15B_d_rfjR2RGwh<@Ff5EU@q<GY=Fgi7 z)v#{rC5_k0<M%AO)8UscOQfH6EWQ)V<)szWE|)Y#Ywm^7pE0PgbIvpFFy2m#?A%9L z2l8u2wLN62z6a+dwn@NNbPcQ9i*t=6f90y<;C<XS{Kq9oMKsCjj_jFZjj`K%4|$IV z6z<V(kIjlKDnb(nP*E(#UEl1p+v-g#nF$O>gn8w7?!`GB*UG2nm8srBZkJUgOD6ja zKNWv}p%JV|u5?H5a+Rt4hDxijP>_l?>qaKQjNx<!bMU0y690XsQ*id~#ClEY(+%m; zxTxtw!rCIOncT_c1V#;vy<UvNt%d3oaqMpodt;uOfggig%fG%QO0$oiFC*d{JW24I zXhk=WG!$GQ92Avo-cG=?fZ<r$7L!hSq{#5xU8WmV6uQnUD*l2goI&cGs8WxyBAT3n zxM)>UzaTJsZAjO3V_P<yj0Go1zdetvLvu_YyH=iQtGr?(KH<~GSXPZbHo}1a_Q|J- z)+4vQuM}&{RSQNKvI9R|E5$4CH_4h5fAM#(k3>x{5B||MUr}ZCo6IRAJpjYhYX_9i z>sp?GkCYUwFOheOd2i!C3jhq&_(zfJ<Mc>40In?*>!J+D8FP&EYSo>qR-tk50t9!n zx_ve!mp=1nY7KV7Hfg)4zL3+ttcU5(K5@ZRb+5%vw1O7ahYr&Hv@kT}pM#>Od1ZR9 z6TxSRtb^LIKa)MS0cmU2l#ySSkj+G@=ThP(^8B*CjwwgdY|Q$hk<H!;QiJV7rdh*} zd#IxTXRXWAP13T1rb_j3^KV)!>%~cBkwPj>o7JF=!W>RJFT_3LWo>I9MWQ8G^k*n( z?NMGF@8ERHsx@`-&{Rl}kzYrlACIZy;@9y3w$}GI;F7FTMzr;wyUfRhfJ$tJaZwm| zX@VXjOlx#-V#OB}a{usoa~<eV9c#PR*D>COw3@G=TDvaDUc>aUnuzalt!ou!O-9#? z&TF0W;fw9d-}0;6LP!7L-(<J@*8Jqnz_<1*PpUX|$i=>)$anE+$?1m_vlIJX)Nutj z-4wI8jp*|vj`m?R*XrG5s?6rtvWG|W-DFd~zLMf{qK|X)t}@L@?Sh5x3k8>gBYZ`m z+Q8B2#_>C@diTIAj_g~1nR{KsdUEk~I$H{^1p=&Y;>PttJ2$KQ&oO9Y;_0?`Wer@@ z!T}|0_|~4^Y;Sf!Wc=nwB?HrS(w~o}n8<g@cf4i!%!nGbwr=<VcP+jVZF3x~#)XCP zq){x&iI+RZneA`mZqwSn3%f40XR;kW>@}^uUi-OtE^3&6OQ7kU%u0l9kcy@huW1m^ z$(sr^Rro~NzIqCQ@kgIY^7NuIN93YOqDw^f)6usCCd<Y%Mf3FG<SKC2xLK5HCK-34 z1K!#XuAJC;yJ@u2d0VP9r%EYj>g}J-cSm-Tl4%Qz%nMv*!!ZWtNG?&&$(;#Z)U<lG zm=8$c*rJ^^-V(Tg(IH~XzV%a$XB#PtKPNp*N_LVO*V9L`d7Zq9wZ?@*j;)rH=@7+d zo48F+%C=(Iy{pCq&taL8WiZn{NlLG~NSpBK$|Ok*4ZqDGBNxmQ6uS?KTGBY!0yGP@ z2z-0_P7<RpUQS1~`(*rEa<p`PodiN!bGem2c4y}xgJ0DgSH=3dn5o|G?8g?`sr^~% z&`O~sxbaclCj+|8rRG45#=4UoEi>i*T4n^FLe5~1C?QpR?fs>+3w7#@hubVxo}W9( zt}3=ZXRiWgKEp*GvphZ7?>H;Qy@BD`rYD&BQ=&FW;C}3v9BdlE&npz137oR(c~{Op zQjcjbH?*6~FV6;Xs=V;4X>u23+Ie;mM0Ua+PUS&rtsH3K=_3>=R*9y*HMB~-%Ae`l z&mprjWATc1U$iJ@XDq%wT$j!ae-=a49pDi{5dU8Z<MS~Yp9Xx~ju^{qryEdHYWWt; zX0d~Fvq1CiAD?2|?4V)}J60gXw%?WxQ%#lg{?mQG1+mt)N(<u<(fuYg_LJuL>yKhb zHoi)JmsO#=tGuhxG_$I7<-;Bt4XRu_lPMI$d))}C?%Sx8v$R%s1CKN6r86xen-4DK zw;GKCURw#ahErKGy@)?FCl04vzU{DxF^MZM3cqftoJLKplJLMkimx+|!*nz6X$C)h zHPM<gL0jhqtjofQ#}wNl>g|`Y(hrhT%Kh*umDLv4h&17t`VZ_x-GfZsW=o6@WBlYf zS|yD=7^f*^G^FY)$vW_X6o8bmpt8Ye-*E0GUfxfbAUaKfURz0L5D_PH@kjHTb5TXo z*pKTMMFccTuYc$>$<?ny08*UmL4$!(K(dWpSnP4Bv4_AmLaR+&orT<6?C=@4Vxin_ z!jqb$3dK9CDUJrKMHup+NwD_G)6u3Y1^iMDDxXEHM3%4Qb0Np!3<k%=m2WC}gHRe` zm;G?;PjWRR+qH3|U`EBRZ-&45<UI@J6O=vRd^TnS>k?ir!%tIm97YU^%q}s3%alip zRU)=J6D8|dGm=rGcwWkc2?J38SPnGLw|H!RTQ|5cRyiO-S~pQJNZ*ckO1f7T<~HO= zF$-TpXl~1=%83YG^aT(*-1B9k`D}kM$)j$X<auWv_0gY$*FnhgmXvPEq1(`%(f>!+ zTfa5^ztQ6_6$AuHC8R+?rADV94FW?%1*91v(w!R$NVrjgGFrO3BuD4y7$Hn*bdMSg zKJ$HjKfiph>+>IMkL&rk@5ed!Ip>b^pHAd#`8R!S>EtW>7joM`V40AAe7nqrI4p)P zCt*ob)|VI0j|K{AM$h-S*|7A#Ga~@i=N(!(iRIT@*tq8+u<QhCy=(9Jcbgqs8rcEG z$G_QAPCveb5s!yH;k8ym@}Xup)Kf108DolFTC%v1Ncog%0{LmKYAbzwhSsE#_YO+5 z^JfTTIq@W@?%!_?YYz&wSg8&eNeh_8fgTY@Vt$!Y>X1j9KV7)mXP&T;G)pKej&?7C z_TM0%r~MnB_IJM2BKV25c?5h_Oe+pV+*BXYEKdyQyyvN+m*qJ(T%a$LPe~B50z7vG z7+S**<}ccwTHWf9{=h(ILjC{>fl_sm$Vy8kNw3QFW>FM=?i}F?QU1QvKTMRtoc4f% z+xsi2i*uY-j^%Bk^3({`9kV!vp5#UVkW<>QL=0oJ$cV}zRuHmDG#9e5a*Z<=Qe#^4 z$#WDA{LvkRPm0R8OaWw@NhOpcu5s2RqUumpM0YANS#K3Cm>87J`oasO2fDs0E!kRJ z?t+Svw;ueAJ`(xP!3Z$%vo(tSKswvLEbY1##bH(eB4@wLPtGH&#@N2$y3qc_)XPTC z#G48SG?QwkmRU`7EiyV6eLLRJI4Tac>Z!BkqRNu^aXe+34Rftvj)=d%m-@jqOZnhf zn;aZQIb7DGijXgo+FUi4)pMap#6~Se(oo0Qy|DpQai_Hw4(_Qm9#JS<SP^pP#%)xv zvdYvgvAj-S_1*?-6vo6-hTILIgh_AJ3|c+bQ<y8o=I+`^HcOy3sCUXJ)+7lU5l)M* za;Jg6w^nvSvw}(^#8!=&^>jUr=1*U+X67H208f~)Dv0R<L<G^^RQZ_b$*!r))*I&6 zKtJr8pyJZH4?PA8o3hd}+gau{<h8BEWMw#U8IwMZy$OXPA-_`S`Y4rkvaOmp?pJz( z>EcPRr;gD^vV<bL)X7FNMCl@TKCLh1NHl$1)VJ-SGfO*8tuYrdrhDE(3a(~OJpQdW zDZBFhs94lKu}%?HbAPu@%k){(b=dW3jvd2$%jGD}0W*~}hnw_b0e>^5I~ye2Ql{_e z?<T3avnm>yRj#ncofEkMbX#0((-r5g=>E2q2GpVBl}w9!wqZSvu|5*q~=lrWID0 zy9X=oGfyW2?HVogmtQBEZCnP7L(2we(IaXWk7;ddbbzX1Al$4r(mc+VadESJ<2D5b zH_n9<vQ`@Y56qgs-uke=+iOVWatb4DE=?3Q#8LoT!9|aoCsZ1KxT6UlOJqc>8kjHs z;JD%%gbO9tH}*Cc&Ayncz9<%PKVaO3MP(sfKPQNIpOh?Jga1W~goWR+>`_Y*FIxE_ zk2~ca=h=3OyEbyVl0GF-f8VQk^TOr8UgbHVBXEf@hBASZE{ZfPSjI4k81{c#f}>|f zQyRiOk$NXzqCsP44C-lEX{jOBl*m9s7dSHt1=C27*nE&*7cc~ha*DX}5@uH!{%i5W zjAjK$!22HNc!Za(8!~x?sY&JhV~u%2&Gx>;L&N$<%-=Ym?#>?)r@G}XvESa_vpZI> zqMW&B+2i|+7S>>GME*hDwdljmH0#8P-LwL9w1dVW+PF(iD313L3WNEtN9OqRk=*uu z4~LxR$Cfrv<5-dQS_>(?%$Gwen?L-&2!+>IR`2mA#_SOc?S;j;$TilV(Y|kPFg!$g z(=A(w`rVfeIPMOL9p-+TX(9>nG0E+(dqlR=fE}U}ht0-@46nB|Cz|Dr+$9MPQ^K-O zUVN<S^s_Z^AmD5Vi&GkKFn4XvI~>`tU(T-W_NUD%MCBb$)sOqrnx6VZ@wV0x-_boj zxM%DG&;8$w8I0tXN2gdaJMrM8!9UiM%xTZ6@dJp~oQS%dRE-y2mix+O*~SC!a{e{5 zcR>>3C+`eSWaktDKr}=YCkTRRF0s5Z&@RMs<@HT&S*gQjLd4UGC)2c~Y@UV+j;ziw zi}1|OotSRSGLFCz#A#z+I6A6sw6?wrGGOp#wU$9mh<C8%xl9;L_5O4>m!-2!n4MAO zg&I11<lgb@fdvO$v|IxXqBge_*+*yIZ=)n2c@sS%r-n4ngn?m&`ozN(RgL|BX7>Lt zyvoA)pY}kK?GQyy3fH2P>_EyCUm47~#n<PwEFPp|v9SCJf|G*_k0k`7NG|v(Pxzak zJc;*Ec@zh7ZX&p`k;vIN7J_81ei7{9C4U}1o^ZKW07z-sa7eZgYBh10O3c?+I9;jP z=z!*Gl_LP`<R`rj!~3fD@Im&3${$O@=)TkZgkl?ZGd%93%1_H*A|(*|pLn4F?7Zhv zCn8Q=#rLUQ&vf~cRNa5aj+XM$Xa2P048RX}IpbZT5sjJbG`F_X>As3q3t1^P*gUMu zpy^Vo5TpmE($Py&JhgGtC-|_K?$Y<t|E73-;9PfJh+g^UgJk^r*NXSy$~R&w1FxP) zCmI*Mh_?2><5O0-I})G+D@I3ceN#>lnUO;r6mHr6Du+zjYv!At5E|Q|z_R6i5x4_l zAG|AcKIaBHdn0O@Q^8U9dAk@uDxzf6EI|hq+r1T;PujA&VMkGWV4IMm5Y?f%(MYgF z%k5JLA&kX7oZDB!C|LYp8m45u;v%7@E7&2cYNG{V&jP+M<{pK+c0Gw@DleWZbcUvF zZw>lHaUsTQL9w^OM9ZB+othWXbKx}`u@H@*G2<^Ulpd@X^xYY^*cpWwM+&Y$@Q*04 zQJzrCLcTAB-tEHn`A;0TIygdD6b-P7UY)P-jX1j=D-{NC=y4xYi=}?3USj44&(E#j zAo{Ww88;Uhep|W=oJt&PzR|5&)RfE_>gCdQOwXk~nG82Syg;n6g(<1=WJWTPo+uOM zhCO`4L`14!rP;OZM<*M7bSvtn-^$!@TgH<C3xIcsX*)1czI67J4mxga@Sl&(X69BD zh3b#9FTE4}^G*vCika`{a_a2H?uiahs<QvOmSSzB10~yWZ`6pq|LD=9=RYXbC9Idq z6g8r!4hzWgVN@o6mT$D6nRv_8Xv&-w+T%Hh#)+sY3azMXplKK*Lz#g5VHUeJe9vU; z?VeR`!z~+t6~cL&S~bcZk3hv@wU=d~+-n`*#5&yysZdmx$aW(ZPJ$*v(O;C!RU6Lm zU|p>`kh_Vob7&LmHup()ci3b;P{TYEvD^iyx9no;Cqx}z7vc$qCt)_h#!)N3iJ?>G zz3=N1>t@%3s~QB^81s|=TYWt~<&de@xJqm_v6#1SM($X!jWY|!fWk-DlgsH9uT^uF zq}0SD_Pqq`q~}RG8od(Iw!MtMG^G34gH3I&hsd0UUQgR#>?2k&Ur$!}<PZ-#U?*QM zRe1SUojueX$hJZIJ4`lL<LJ&jIkZQtZ%I_?Iuy<~nD1vr;~*`2DlI2nGAP&jt^?-9 z4~zT$jrBh!D?(Dui1&XUVC$<lK1a{dPxg;21zeg%&_cHjE><Jd1~|4x1L5-8g*(JM zV&kG`;s`(;v%yquV5EtqiP#>Uhp(4QRLJMQG7^*^o=XF_^L1!(P$M@ITVM9m&cB|X z#!VGJp_$dHN=oAtJp3W$A;nbF$O&#l^4(3r$Tb(zFeXCEda)bG<8%ywb18FM83iN+ z_TLHkB@Opt>4>_Vi7vSh<rsjY#xAS^ME57uO6^LzOK%4KdpzQDYv@jRo%~0o7;2`+ zPAzj6jJPF+!)M4QWpAftD}qm1P@FCkE4IHIqZia0N{5h&ak3jcvP!HWZ-)04e=u8q zg&6BHj6q8FXXPB5Gdqv8g&ZNm<&y?Ry&sHe&keW79kyq=0582Qj-T07{glj@HkgtO zYsmi}CNV#3ZrysG^*zeXQ9Jj#)~}B7*weuduU;6mW^jZ1&+C`@XDChxPthbAaDSdP z@J}{!F0Rp*>Yc8{uZ^Y>0c<TUl#4*`9`!92jXcjX!#*3Ia?!jaco15AbuoNgOQVk1 zDo&oA$Aa(=EqkPhM*NdjlXht{2j()$sI8yV_$B0)H33kkHA0}TwGU)P0&`t<tZ!^b z#`0!qww+**O6fwr#-h>!{p}?Gi&`5nfK|y_wW}~cUepNRX&a`o@lM6`!^E!f>?7s> zSDa&;$tNiqTQvc|^WEQv#^bkSgP!VqAOznf2AO;xZag3%BeTJj%&wD3zQ2Z#O?3oL zZhWFWHHlt*!viA7y;MFOT-W`^z(fyuS>h<}msT8`j>LU(>-HPj7<2r-+sMT;##75v zNDuR>j1@byfm?pAe7&ieV@Hsx$>+1=i*>3SaoiWPR4XuA3(q808Qa`D5<t+K@LW^y z!3<w$2GQ7B+yg;9)Og61powKiPL-fT;ljCGB6D1O<kZvgwg1+AEnTZ-?6vjN01?k* zUnnX)UA;x#L73U|zuXnegdVjUT3Jp%l(u?GCQ2c6q-Mu2vo!e>+ZmiPM){>6f|xU# zbfq|87xGLk*j)$Dx(K@kW2I<@-5yf964e%Fo4p0n`*b*BG5JFSrDWJetHvoS#+c8n z3Sp|@&ub~(uIh7cuDh<sZqin1fGtfBc}*in&g#6`LZ;SOE4V7=v#M?fwNfH=I%Cw| zKl<i5BbEs&^7cEjOzE4c^5yy0m8&{Upx4y>q=(^xsHp!4qdd!}wtp2`xCQ}#0U}-o zK1bwt?!NAM4h|50`9s7n-wvh-GqGtdxY-lUCI>z56ywzpzPc>s>wwivK3wL_553w( zHGV&$=y?~$Bip>8X+V%ab@~mBc2*Qcr_?evmMk(t?}h-fN7ex2?2jh266$+ef13fF zv@;w{rr$G7ZHEb=#)H&cz_j7fBMVE$<B7o8Lt{zLMD$9F7m?Z{%P>82X1aUndJTL_ z8kQ#0y>!EO?tTP)jEe`#Je!RgF6@`KNRN1sh2DC#(R@9?sEuY?W^!aI)k512f8w`w z757e_I5~^c?h}eHx=4iRXB6mezJeX%xWTpADM%sd`;Bzbcffc;yj`NuWd}oR?BTY6 zTSJqb=dueS1E;cVv#eG27K%`VpGnC={Obiywad*sIz87z2&oSv(wz8{pMw)YdGc~7 zf4kjx(^@Wzj%PLN5|`^MSyXt;<-`-z%`@K4yHx}CigR`M+}_SL%P7qqPOvLn{PjeI z+yF(>H?MtrzQ^n>=H9e)Lei(pqkpw7nWHctTh<NK4bD89y?pG4M_m3%>25^s8isrP z+T@)TrcNHxy5vf2pU%<Xv~kWCNM?63a{48lv7#cLFL^hKH^qaAIaa?!8S47;!$bt! zu&a6Sx9tvKgm=0tf>?r4%sH&WyE0Fh(ui4%&Vga%Wi-H+#=(KHFGf1O!Hfw}Lh>V@ z&1-^%db4T|Q17g&RC&?SNX528I-Py85+pYg$e@>*&z&@5D<vcyHyB3bCr-8ACk6>9 ztK~T~Ir&EVp$k0yG$P9;%|cre^Q>G93I0JWh$&OWmQHt18%#5&>mZX@<E>3Uzt%Iq z<h*StsxdJ)KC@qK00vL8TH11W)+T7C89R(4lun;Hu=*A_Na3OdxeMV`5Al4Pz6R-p z^8Nt4#8NNMNA%38&6aIfljy#G5!=jTsoC0F%=adljqkQB)?@zsq)dsgdxz#|_cQMk z$3{{<i@A7YQo>gnj})ePNG-WV6P4pYNydFDy&JZm)f8`MU+L1vju+OQq-vXLjx<XN z5~uSo&p5IQs<yS=wqSU^TQv(d1*@Mq8d@`q+dWMA?){6kO1(m7qxdSU;-$+hwOmYD z$G4{p#@RKodW1zG^BJ|N@|~iakC?eSG&UUuPD-h5zm*kDR59h(Hx>!bidY&&L~X%< z+yY!l1wm_*(OUQveW=u%13MA}wPl%;PdgU%&;3I3>#|$1nK)({B7HBaCN3PS0}R*L zJr|<Wuf?vML&oPoQFnhtt#Q(z-<)PQ9=}D{CN~WJarsC!Xo{fpBocRGH}e|vj?%%I z%Dl9QO10G|gvEf%hboIdN*+j>%^)r01X3((?PUg{BjmE#^X>qqTIJN|vx@iZP!-M| z<}?T<^SDor)8oB`>`qgLZ|7csz0+g_f=NHMd<0qkzhC&q6uceCE<#emeElEM7Kap{ zbx?FGc-SBwl<8cY)royikg*tdVQ&26P2;`Q+{uA=*~!&_9`WXM!+Tw~+q1sk8M?i| zRiXV$z;GuS(4QFHU4<0@Xt(LWq+@j6Zg&Vfaq`M#sfK)|T!|n~Zk~N+BjU7VdE}_4 z&-MO%u_Gn>y>)QaK@CS$foQ)FROTXqo$knrG@feY_>)+LpP<s`8YagrE85}NHbc8F zZEYa+l&?RCi@x4Z&3nu52d!BSOjKB<0kS}e!=QUP2vSiNv^TqEOt#7kTBxd5?r>nf zynq_Cvah3a_^zxrzv0%h|1j5P$DHW5w(pj&SU+5~Em&!Qg})_W1!@?1cfAXl_g~4F zwrIt;1uLgiQs>b(diVR;idqIP1u7jq4@PD-duDA^%Df5RLTu<aq$`G1-Z#ogdTIa) zW!mjfa(T0Ml|?moJ1x#`<f-517-Ao8LTL=;r0d!Hp?hW=E3)y?qr$+4K8gNYnH~wO zgvAopoNmBy_nDfm8i{X_?g?l4_`4vYR*D#6Zj|BU`6vB=(G3d_tcscVBB$oXrlE!C zn+Ai1CFfha{%RUFpbATsET0ydT_Z%>xwT~pKSk<Ruw_<L#O?HK%Gi^gykO{c?uN23 ze3Z}s76}|sP+%PPVApSO;M{-#OuZs(8W&b4`0bv_6me=T@r57}%|$FvOZLbd%eos) z7<pKcf5Ky%#KiI5-_yt6AP++b!D!~WBi3Cx>Z%C_H^0oQJ<4kAyfTNeXxFzcSa|j? zMku2k_6KawvurW(RpPZstf>2gICaJXUK<HP;pYtCX|`_#%1sg5goR+mH#9#YgnRIF z88xc}0l#^^LFzNt@8%;XvW_PX3p6sxG`28JoF5}cOxvgjHrrDfK_&a!d?pmo`MbNp z3CXuCe^DOK7(i#KW~!lonVCXNVkl8(gA)iU8)GMgk80_)VO_l9epU`s>aBgvJS}f! zYMxBHtd#^u2+w)pxGdYFHltLk{Beg3c0_7imSLP|L+6s+S2aw><%A3?F>@=sf>RUT z0=G{9iEV=uzwwfIy{1<wbZQ@ZUf>G?q}E>r73z*b&RAb|z=Rdei^}(-4+`1Ed?XbP zjLf6jCMHbG<|QPj!fA&kY^KZ9s|caXJy+c<?NXSjLXlKbQ9{IVCKs|<boVUp&NxBX zr)hxpR>f&Pe0Nq(5Za^{O57VtH-G`lOQMSw3CKHdS7PSbi$m-rw$kN)0<o_R_XvjO zo06<uwqrc^k?{1BE$8Y+NZF?eu05_PPjv_rVeoy-fJYIw@1(7d5J-MYjN>#DMgmOZ z0q}T5X>_bMQV5l>hiv=Vv|?mE-fpMMSoSpbFm?&M?7i)}>NkOc68GS!?fs#Zlcm;U zAVHD=AMyKnof4(e+DPZ%zhX;>7y?WO@5r2pY(tTpaYi%lSY1p?x?V<hiaxWfKNpfw z_Q#aW$oZ$enKV~i$|bkRWcMRt%Z}q$FU}XP(kI?B1)2*%51BJ>72YGO6D$+WKVUZg z()gMxiVM7Lus`jBp;w($0E-EgL2H=3ezbhswT5`s%5~1gQ2NzL`})8KBq^j$haw-T zCS5`S+)fVm9*nCt4l#|+^!!7WlS$&$G6n1GnRkt5O^OAxetpo2%*$tc6);9$s)r0J z3EFttQi_T{wTqtAfLGSpBr3DGW?Yue&PwI*?(aODgFCEMV@Uw2N|v4W4^Bo}e^HRK z?J27$KYo4Vx&iIuzN9oR6E`qL<?@<>f3)V;(BQLLUs?Ak!N0K1$3^k(ke_&$I?pH! z6>o<1l@GY2ZMWh?a|iQ?s@0m5pRt?T5D0Wf_LD|IRD#b8SDV<xyE>w}dv#xXa0WeZ zZnhTY=EPM?mQ*zg>1?mm&PuXR@R;rs`KCX7x=+9;KHWG16NK2zp2?c&BAjM=`gj1k zJu~{r6}60`VU5K8tLQED4w!eI&RA~iw>n~j$Mki#&PN5jJ$Eylr{;?!Ff#rFY#QZT zI9~QAxF-R6G-IDjZdMZu^c~o}*+D<WX1Ho39ny}pe^=>9)&11r%kd$lAk3KYqX_Xj zKX5^V4qw*&fT{KSbHA@U0{TWde#v7iPp;nqv1_=H_dV#caX|iC1ZU~L_@3#?M|uVy zjwuOE#sRgML-^+ToDfT8(pku*e75g`t$V@PE`6c&fIpvzN&W=@;`U|k+@+Tdq3(=m z@96ka`6qbfzwtCfU%=ZL9jLF~T@E@U3Kw#oyKM0Wbnn$jpcXwWbhLJg^Y@Jzde|uM z0qvl#$u;PV$l0Lcbf4nyZyI*_wpKK#%8e|?S9UCi81}()np$HWw5_$P1g5v50}04& zHMM};G1h|dn|9l_RpqeeAm@M-7ggC0bMm`)D%M5#IX}+CS&W;7u7uqx*!%MgF@+|G zE<o)aFKv43RGSb}q9qABY*J%Oodum7VYT}%9b+TZ_LgO4(1|{!2eaM5QzxnxHYg(X z!VwCo@fwdT{;I*+ty&?1+WI5S+H6-fe;;Fe<G3X`@7>16Z2woazi0&_(i4t~l!2Z- z3giuq9EAY3Nll6qbZxj=hc@0vMyY=DcMU(Sz$%kxEU|VoHGhq&eLM6P<6-emj(gOC zE`{@AZl>TyGJy>Lqh6!6$@!=to@<VTgqio3YDv{iP{7%3N2m8FpX*E)lLv}>Tw`It z2fYrHHI&qOx%PSqzZ3;@tTy5(A_ugCdGtR#e)3+sE7Pjz&8z2J?|ZYdG_v5|r$0t? zY32~gK8~f)Ag@uHm&*Fn^d*ev(!<Q)?AZBK-fsUm-DA<?qO5G<ve`~y#D5xBHXnpX zxs<A>i7&0HO!0&rXtX>O0{TW-&?4lL?A}^A8c_6p?+?e)K9ExURuC+umGV;!-${+z z;5Jc~%iVRNi>Rs*rDR`o97oPtRK86=y|?v3Jrd%iy)mV;nP9t2?4&Y34Z((_ZbDXL zvMr5#zohsN2#e!Lm0qq1vh7l_1G$HRz=srSe_c7G;82yCC-^cEX2q66mY@|Fz4k$l zI-YS&s>}d!;+1*=qO}vr<d3LzP2f>n>;l0!eBWeX9R>{1lHMO0=-2g77)p@6cc5%9 zrXX?aQ98@n_*2%cpYk06?TM^BTPsx-cg?|oO5VFi94)w~KnWnk?;Wbv1-9w{Gn)H_ z>rvcGe`oo_qQ`5z*d<nw(iHSV>R=tKmtSizoVrH*(WbOyGLt5U$|s09epiQB^r%zQ zuhXixl(mZ6q=9;4cGGJ}sZX3>PlN@Tm4<#5HZuAh{rB@r%RQFY?5qL6h-?VyR@t@Y z<v0Vb{<?Ffl-0eCIbinA+)*={$$s0z<F=h105sO&+qzdHg~fKV<b|dLZxdu)I=R5D zfT&xy^&+n|GpY>$-jN0w?dgE&EkxL^$Ae%d?{BK_oC0PgST|9SlYr3TIqZfk%y`fW z?KX05?XzL09uyHpjH(uNZJG&Y0&N|^UkvO#2B-71QwR@afG5|1<^d-Y`H1VOAW*)p zFFJft7T?Z}mTB>DQ$hyFAMj3e%Hx+N-o;#{Zt79tOE#;tgi;p0=dJ8cl&FvAT`o$~ ztc>ZAe=aIz^UuHsFD82TK9Gt?eVYzFLtnRU+TC;_QXzQ6_13cZ>-y4$PnPlg<Gw$E zaN%$}(Mkfxyu-@%5jwro=5^dw``-<g99(o!)lmOc9}+&M9vv{NU3SdvOK<FI1ju%= zRY)ox)^&D8T+hm>v*0Yf9|Zh}LWX&kS43K<vFx}XGi=(1?9#s{vz_Tz*$q_gyk;OV z_Q{z#w;Hyh1PMAE2EwFM?%C!{&45gPzCWH`=#Xir2$;;09{Y092fvJPNWeeMpg}bJ zp&qnoVM(a|P3o5V%EGLb<&PaGY<uPiBgy?V=ve%?+0XEu!7O(fBDPT`oioER;FPkx zv-zq=d_{i&gea%w{H^B4mSdq7xRs~RH6wy4KjwG=NnpA@5)rER3TBe0@=(p<<}Ilp zQKv>lOrX`8R|1@zgxX=}-I>>X+z9fWS56)|6F!)#E5j{R)kxn9Ovn~pT=M0b=8ILI zg+ZXlO(VyB-{nttk}goGX_q+xIa7#S19Nc(<av`^lJd83gfr1u%&8C?_=iMWK4>_< z{1HCeH`hk89VUfbc!9oKx3E>@Zo&&+lElO>cP?inlUu1>Xf@&1?S{Ke!2hnm@{=49 zABLMNdF^wj)saHkz|CU_IL+cNx4Z-MH!Sm@{lonuk8`_o-t*Z>l-JTluL*$LyoW+= zO329@=5&+;yLwvv&SouHhe&jp(P=7w{gVSk4gUajP`nu=l(QST%^x=L96nZFd4fb> z6z4_Fwj_PXw-__n6)*=LMH3iz%wZ=<y)g^eM~Z01&Cy@tyS&<K37k9r)~y<OP`!on zFR$Q>xlE~ZpV^JCLu8NPv#C=_jqbv>8PD61`el$gY~sywJuv3-iWkVDHiECT6N=`6 z47Cn;8UZ{8n-*nS4(x80u)_*C{AP5_VztA{RUd=eXfH#4Dt|ioGJHgUGW`aBaf1t1 z4?4ug2c6mF>$afr`8QWR2D%DoTZwzk@>^HM(WmBUT#g-3;Q-0Nva8IX3woJM0nbTk zX8NNOC<W*LE~I;uNVfrr7i}72dI-7|mHEjHx!izqhszCzM3!iN{VEd{a<)Bu2b7%I zabYREaC_@d(ozE`R+Q7)H{~%P6l@nf(C_kHS*}9Rm(nhF8*`f~thy#<fqr{0<Azn1 z{E=_+j3I!vr(P_IJ&exsyC!Sp04aTNYMt`S8e=Kac8XiK@>zLD8FzBu89mj4=7dPz z`i#0edp}2eRk`9^d-QR6*@;iQ4LSdSw=>6FZD>9ymFWQs)fRJjWaRl%twWJFbu>s{ z!OlrC%>g~|gK#=({zpcWXr2O()GVnO%@W)onHIMF*>9cLx_7}$J$0)5@#am;lc)=4 zvf)>2)*|-pBUTMq*FO7l7Nu<dNpVV9n_he2V9f?Hd3DB>(UTeKn5VLVVR{iM-D<m* zU4tJJ1S#ok<hH8i++gn7Zaq;)qBO6sm)YXU;wk+q{z`8VWxsu-ZC?ca`G2zj{HHQ1 zH>Ab|<iVlcn&cr}^xUm(L(UoF;dGTSDXDd-&gP;JeU(;k@}rUd?5KftQl3}9n07zE z-qryAB3j>>s2;!NIltH-e5ec$D-Pv%^BBE67Gv+z^;|{!T3~}*;P&OE^B1WvzZ6;7 zxG3y>f?=Kl8PT=R1)Yp;tmELy>W$cKmX)mx_xC~Se^=d)2!t|=E1sIM$UsG6@5~4K zXiiFTlyqEOTk&I;UjguMVfkcz%HO9b8mZ-<#G(UphJXFIT|?a}isM7==im@?X<w(G ztY)A;?o{$!(9n?Lj_2(#i5xIR_|K7s_(}LL{A}fANw?q!ub}c@JFw241ikANQrk(+ z3q3WQlb89Z_lY=ATO^ZtH!}N`k;j(D-za&iAe+s%*$r*lX`>nT?6{}x&RVD{ChQN~ zIpKd(TG1gZWj(IJ2p4sZcH}3s05aQ2C;VqOMb;_$a`T;oDYLVCI7tcO@ZZ8wP9G(= zsomKa+F_?c8IA(@VtG_YF2ps*tGqdSfA-7H7?J3HD%;^fxb|7ozHQSz5(N2$b&9d} z#2F8KHf5FE{FEv`qw!ERz})w<!Jqxbvw50M6TDwc#<?QfF;kFt<ML5}5D?M;!fm9n zr|o%kgYyQ3nyhfyXV*)^#YIk!{X30s2BYC>B80O`;n{5=*BjC@yI7eJ5;80I+-^ec zU&%WJGaUoV&&BGkMGyH5Egm~Jk6H{5gjEXnWR*$u&&oSi`&~KuQ+nVD^R9*?xrp%6 zfgaHqkoso5`lwyX8C<mT>rj7>?HyD^3Ou82-sF?1g-|tnTJ*Btj&B`jO01483p3%F z5LOE07%Gz-5smRc%T>?`+)G(W$*Aa8Zyx8_@8R^ATnM(Sj5BYcUeMa7j@2qZ4^$v@ z8`xFjV#_#G;BZJ|<adUEW97FtW>AXhOvUf=djo8;t@lpLt1LuQ9LyW2Z4QOuO>htV zxDbBaFPJIiTZDIIQutcqr;tSHE5*sFLzW8y$M2uso#uBDqx$JW{#82+`%Kp+B;PMw zn$vtyW1_F~T+CcJe>vN#{E&|}8yO-sR5@kj;h4gU>|XOT3&NZgWMdv<won9XE}Uct z57?18R=Gkl4dt&NkNTN7zPjeTe&jV6*w^feti_<JxThGhY}=bBY#AY6$nVcRz4;>l zioiU4NLPrlE9k^@<DRDs9;A^#Tg-%b3ACcI;a)L;NqC@;c`7{MM%NBoclux;Y{m=M z>lsMCQNGyrsWEo)sy{-7<?1)jZ516^-K_K>R>WArzagOtM55Om_S}F~ea0`l$Y{~C zbdr_3H!O(i)^BYj+iR__Zi@E*vQHaqIyf1cpbY%(29YU{-Yk&@zP}pmfjM<prUF(j z20|)EdpJ%87)1kFiw9moE+SyzR|ZE}c&dyXsoH?uep@9!6hq0Q4AX7-{M*JXsIw#8 zO_F=_bW){+XVv%9)*Y93Bx!$bc1AHMVu+geBSc1}vTI9g@QtVAs*z7nkb>Op9m;EF z&}yJuy+oU>r1yT^baqUYt<}VXd4Hm{!I82+@)SA^K(%zSsMlInS{k7_NeTfIFT!{O zkFgg9kg*QG<KfNyn^li|)XkpDezA5Uv8Yd=wcB_f`yV;5@6zWFKG*}(jNcCaXP4I> zaj2U^bDeVVM9|`K1DWlfqV-F=8rld$i@F0lnnZZ8o{Xg0e#3S;nlYQ_JIpWa8m{4n z6rGcvm-hJ?6%Y~?u&|PJ%(`QB*1{eyc$VBo(P@3PkTZIG1^6yNO&i2`r7gn9O>evo zZ9L1l`r|_K41V}W_~6yP+{m?H%Mmx)Ti-B3!k(@Dc4@r#&ln~)bc`-gBBWB4hMy>& zgO|)O!c=^g`7ByjEx4PVuB~#zUSxU7Q02h@<e(?9vwI8)LkQnmvRIDwq*A=|lP7NA zPpDUp&V@|yhh!Z=V)SffSEc<eA9+nryhJe5=2BNh#h@aWGgKMINg3<J5E=an0IISb z8&VR@Uv7@3Qp*NjP%;evM@iP3;tq-8U>p9qHsSflW&ER30rE%OFK1fDSw(pwiREU? z%6X6(Z!Q$B{wQ(#VQ(Zcc#{eE_V86mH=E60bb4XB+tcXofFP7wB$d>s_d0KXWS?@O zA$4Tw*@A}DQ$VSTsdt;p6vtN!!MLYRBj#Ak&chXdptv8#1Vd^Zt#0hra(QAuh|iaM zM&~u{v&X)R^now0`M4R);FB^glA3(PU&#uS@a{M-aS(~l<yVQ*!&u|TOIUKhfLwA+ zKdkn9xUo@+q6f3(7`d_CM>e<GG++0m(nu*v7f<%<EtdVD<l^+wz_b6WI<M7|$%NJa zTDT)T3%AF`&Xck3{6oBQsp~k4`2WF|FmBXi!&dF81bphy(=$DxpW8!4>pKR36($vT zoC)yb2))!o#k-)yd6D60Zp;H#x_~oRHV^F~V&Z`>zeWuK?6OjS(hS2g>RwQV)a&}8 zAKx5bUg869li3ch3t!hJTBzZ<2@kjJaB0<<`zicy+-x1l>F-MqVC`_pdZ-wv#a;4? zRjj2s(<SNfu337<kvM$!wBL+7SbREd&6NcRXKJEZUm4Kki=Xi9Kw1P{<U&!ki#LiB zQ!(H_*n)8IDfaKBf-kN{*RQQB@$ieRJfP)9d4GYX_A1CFs1u9vxf&jR);yQ*+TS8L z+i;dF1UbTPe4VkKXk$NWl)S+J1NU!68{)YQ7Wl4RE{a?-<X049QWsCs=krkLtH#Zs z<`o^fjQ(!Yk-&lK{QXNl1>dJJbx%KKB9|o;KFbfXqzqM~9HJ$4sAVIEKs4P-CB%>s z@m{MlW`>#HU7S~JI8*SRiQKNy^3olPd|Jzy2rkOHl<PS>y$wI<r!&X)!*3>Mm+4WT zC>!K@5Ag052xFM_ye6V@p!p+m&2(fR<mO|fEu`c7Dj)m7mmys4fQgYCNr?EG6X1aP z&L-^)Z!=`QMLW^*Yiscd6W67SXM{wC?6;FeVE!u(u3^d_5<;?9i27LgJZJaN-?T!} zHud$IDLx|2>B?`Od32;Q+J{*W;Pkarj`91}njG~vA^U<S>YdjQ_HLHzUt3#!F|Bv? ztsX=Be3Q#l9IC#k{Z$qzH}!H)lL90#c-awMtXIFGI%BT*F5z^~+%fFephxX91&p&} z93R7SSY@Q`g2xYp%*eVWO<IsfDkLG>UwV1!XF{6yb2Gw18}%~D^)YW(7W+xamG4i9 zkIrSVg%RDq>hq@Js5rapXY!2Th`@so`w37gT4=;A!_$wl470YiW5K6;B-D~FNeGo_ zJ0KZaiBoejH<`Pk=6V`*<tlpfkUd4;l*vo$@~`<c$#6sT`FaM4o<Vp1jo$Tmu@I*= z)7rl5nz&HVu0c@oeT$0Wo(}!yD`uPv<lYJlw*tvxkpFyPzaA=bMOAF(#Z!tifY#%l zd%(sFB8`nUim^Udof4VDmo#VP_X2&F6BcQ(yFKw<PPQiXSDIJcf;O$_HWDrBJSYB3 z+zBs{#@zF`#Pz3qK?d&!`d=J5l~i)7Gcn~~1(?0xs`q{cut$!+?-sxMwAJ#vt5AOV z6UA(4>7L|>-Dc}Q$U{%ofHgmEvmLFkc!D``fkdIFWLrg;fsuSfsAEYfO~;h`v$B$B zh&$XCI)j^L(?dOmPu%f$G7hCUA!!SrN~)5k?ZZ^YkK4{({qmi$oZ(sVib&6g%u?Hz zj4Grj#9Cl-5+-T#J;sKCKP)gty7;n9d#I1+O;R}I6#LVs)gIR?geRE@3c3thV3@LL zr^wFmhzL<9seS$%Q>W12<v+#;@x;}pIGcF&`vqwMJg6wc6zq^Q?OnfWD?Tm_c7Y{9 zFZn6n-icQATH^pjOLOz9(Uu~89Cl0qm*}SxUL%#hjv`JX?TX^CO-^~Hvy|rF!$i|) z?Ke#AM4~*Npj+Oj8)@d<Li;3cgnc62lE4#yrudk3g-02j(eg3)uFTzpe!?sLKX1EP zn)?4?7|<7wur}3X;$c$g482?;t46BI+i~DVELD3Kv@>#ybC*SUppUEgmI*-kT|WOC zqts;CGsgI?XGAiL_p?=voVek_&$_x^csl@S<)GDX8>gpA(}>E>(RyUIQcR>=q*M}K z-wTAyB(u#Nnz%n!^Q<1p&V}w@l{N1)TK`G<5B5@gB&j5j2t`eW?7llEbZhd+o_YBs zq{+WMPVBbgSDALQ?B*%Ili-iNUfI_lv&S8LC|7_1YZV;nOQAD$e|nC=?t3z(oz|){ z;f%^@=4)-q=xv|jC*>5&qmSBG`yBeD?n?`MdtCcs8nG*x8Ox)!mqSG6h&=rHrK?0h znYZ<_!dyX}<(EW7=W&D}ODKWt=z2(qI7_y0n_1OMGo_dA7j@pE5l*~<{c<W&PqjNL zr!1Dm?a+i7_5d^dM(aUkF>Ls6`vzpT35nOK`VOIlMJwfK&3NqaB|Dn$PJXWIQOqyX z502h)*rEzTmu>&7907uX>`Z6Nzqu@+588uv8r>Ioc##Fl-X)f5NSR=<PbuE=&x>h# z_EqvzK_ILB0Q}Rjq!F3~fm;a^?Xa8RIt#gqiCEG0>Ogm;%gd^G$F8aMYtqMXqoIFH zM-x`pOg~c>wC!p_<F`j&L$mvu-F7T8WWkpweJtPgpb>-XUjAhoPfs1_LLu(GBUu4W zUCkScMEh=f^5Q3*+an?L`$Xk0K@R+gd(QQjU|tu9H}m%Cw-vF#3=53Kt3$DSwis*D zxAG^gXBli)pTmI}{u#Opvwg?uRM-8{R3ONL5grd97Il;kwwJvkCJ()0^q61cXkey; zNn)(&F*6&E3a8N-I`k6VOY&|N9z&4=t40r2C5_hWrTPLLAEElnJ!v`M`3E$Wo3lP7 zmdDP?Kb^`}_&QL3=yb1d9q;N4^m?qOlv?b8hQ)g>{T@}cef{-Q0m;HZb!N!#F*o1L zZ!k6WF8?($!)-38H_4pBf&aqmDoW^^>u24z5uW2SX};5V84lp?+u5fKZa6)5iBiNs zQW`It6Pg8uo+RH~b-*^D0(-5B{dj|*S8(0=gqld#fb@EupkBQX>)<I3A@d%d(?Y+d z)_dv-QqQTtKdxMi1yl0yO6B_3$B+-KE7|FZh@kRqL<Ms&IjVpAs5W~qnT}8Y^oA5O z0{IF4xN>>;ELu<ZLTKg>?wLYL!brsW<DeqYF=1{O<^D!@%E-xQf<q8bdXwzUCr|#j z$MDepa%<P!&-qahDvdkV!q!WN@b*m}bUWWJW`OJx2m*UhF%3aSf80=Z54Q~!fD4-$ zlK<UrvEi(HfVG?Uif}0{O#T0tFlqET!RT=_-~wmEeh%l4W`^Lg*$QVddFYE4$#nG- zDBE!^l<s4zYvcYh=?YDRMYGzbLD1!oiSRwCv$9#6cG!ac%^C)^w=;=5U#`_E4)$#p zx-u|7)0$vj^d1>LdWXUp2Pb)0Yhyjn>4%^7-QV-xl`8C3>X5NnOXX|-O6<{e$kcTE zP9kV=`#pceJ}(@Wlwj1hVp5@@USqioiao≦gPE%=o26cHgH<d-vrQ_;oN7C6m=1 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 literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-4.png b/assets/images/testing-api-spec-rendering-4.png new file mode 100644 index 0000000000000000000000000000000000000000..13a5e73026546a8218bbb324cb45dfe22dbce19b GIT binary patch literal 110546 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�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 literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-5.png b/assets/images/testing-api-spec-rendering-5.png new file mode 100644 index 0000000000000000000000000000000000000000..dea3b9810402d88a9c1d86d1b388d1adbb95740e GIT binary patch literal 5970 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 Kq#Qkp-+ut7;GsqU literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-6.png b/assets/images/testing-api-spec-rendering-6.png new file mode 100644 index 0000000000000000000000000000000000000000..e04e38538dc6fcc886e165fceed639049491b38c GIT binary patch literal 99655 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 RI^gUuxod7zcE>ULzW{w;lVJb= literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-7.png b/assets/images/testing-api-spec-rendering-7.png new file mode 100644 index 0000000000000000000000000000000000000000..7b44e6c25371ca059cb7ebeed3e229b9e677cb13 GIT binary patch literal 461803 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%0Dy?j@IaP5{>627Z>=XCM`fp{#{|f^D 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 LWh_&KXc;xD5<} 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 Ue(GbCAmF1YuO?S6V;1y(05lF%dH?_b literal 0 HcmV?d00001 diff --git a/assets/images/testing-api-spec-rendering-8.png b/assets/images/testing-api-spec-rendering-8.png new file mode 100644 index 0000000000000000000000000000000000000000..a798f1beafeb9ff3ef6fb910b1138feb2f8148cb GIT binary patch literal 240406 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 literal 0 HcmV?d00001 diff --git a/assets/images/testing-spec-rendering-2.png b/assets/images/testing-spec-rendering-2.png new file mode 100644 index 0000000000000000000000000000000000000000..444a2a5ebeab53f50439a9e64d50837960d55f00 GIT binary patch literal 42455 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 NkAV(CyG+v>^<ON&Qr!Rm literal 0 HcmV?d00001 diff --git a/guides/create-a-site-preview.md b/guides/create-a-site-preview.md new file mode 100644 index 000000000..dba0ebe9c --- /dev/null +++ b/guides/create-a-site-preview.md @@ -0,0 +1,36 @@ +# How to create a site preview + +Creating a site preview is a straightforward process that allows you to see how your doc appears before it’s submitted. + +In this doc you’ll learn how to clone the developer-center repo to run a localhost: 3000 to preview IDE (e.g., VS Code) changes, and how to use a static site preview generator. + +## localhost:3000 review (on Mac) + +#### 1. Open terminal and navigate to your Documents folder. +`cd ~/Documents` + +#### 2. Create a folder and name it dev-center. +`mkdir dev-center` + +#### 3. Clone the developer-center repo. +`git clone https://github.com/bigcommerce/developer-center.git` + +#### 4. Checkout the branch mdx-components. +`git checkout mdx-components` + +#### 5. Install the latest legacy peer deps. +`npm install --legacy-peer-deps` + +#### 6. Once installed, run the npm run dev script. +`npm run dev script` + +#### 7. Open your browser and navigate to your localhost address. +`ex. localhost:3000/preview` + +#### 8. Open your IDE and navigate to the developer-center directory, then open the pages/preview.mdx file. + +#### 9. Below the generated text: Insert Content Below paste your .mdx doc file and changes. + +#### 10. Save your changes and preview the content in your browser window. +Note: reload the browser page if it doesn’t immediately load. + diff --git a/guides/test-rendering-of-api-spec-file-changes.md b/guides/test-rendering-of-api-spec-file-changes.md new file mode 100644 index 000000000..2f1b46a50 --- /dev/null +++ b/guides/test-rendering-of-api-spec-file-changes.md @@ -0,0 +1,47 @@ +# How to test rendering of API spec file changes + +If you want to preview how changes to an API spec file will look inside the Developer Center, without waiting for a preview deploy, you can use our spec tester tool. It requires no approval to use and will render a preview of any OAS 3.0+ yaml file with a public url. + +**To start, visit this url: https://developer.bigcommerce.com/spec-tester** + +You’ll see a simple screen detailing what spec file is being previewed with the endpoints available in it. Clicking on an endpoint will load the render view on the right hand side: + +![](//docs/assets/images/testing-api-spec-rendering-1.png) + +The top left of the tester has an input and dropdown. You can use this to find location of the file you want to edit by selecting the dropdown, as it will change the input value to be the URL of the associated file on GitHub. These files are what is rendering on the DevCenter in production. + +![](//docs/assets/images/testing-spec-rendering-2.png) + +**This input can be manually changed as well, enabling you to preview a spec file you are working on, as long as it has a public URL.** + +The most common way of getting a new public URL is to make changes in a GitHub branch. + +## Getting a public URL from GitHub + +#### By updating your branch name within an existing spec url + +Within the input box, you’ll notice there is a ‘docs/main’ part of the url. Edit “main” to be to be your branch name with the edits you want to preview for the same file: + +![](//docs/assets/images/testing-api-spec-rendering-3.png) +*Remember to only change the branch name. Leave the rest of the url the same.* + +#### By updating your branch name within an existing spec url +In a branch you’ve pushed to GitHub, look for the ‘…' action on the file you want to get the public URL for, then click 'view file’: + +![](//docs/assets/images/testing-api-spec-rendering-4.png) + +When it opens that file, you’ll see the option to view it in ‘raw’ form. Press that: +![](//docs/assets/images/testing-api-spec-rendering-5.png) + +Now you will see the raw file with the public facing URL in the browser. Copy and past that into the input box: +![](//docs/assets/images/testing-api-spec-rendering-6.png) + +## Making edits within the GitHub UI +If you want to change a file within the browser, that’s possible on GitHub. Click edit on any API spec file and you will see the editor: +![](//docs/assets/images/testing-api-spec-rendering-7.png) + +After committing your changes, you will see a modal that asks for a commit message and the name of your branch: + +![](//docs/assets/images/testing-api-spec-rendering-8.png) + +After you propose changes, your branch will be created! You can then use one of the 2 methods above to get the public URL of the file you’ll copy/paste into the spec tester URL box. From dacca299c7c4820a9fa3797a6de1e08aefb29c3e Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 7 Aug 2024 09:52:48 -0500 Subject: [PATCH 129/221] Revert "DEVDOCS-6015: [Update] upc, mpn, gtin (#401)" (#422) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6252c6ad2016a2183f632c64f51079c34fb7270c. <!-- Ticket number or summary of work --> # [DEVDOCS-6015] ## What changed? Iryna said there was an incident and that the gtin can also be 14 digits. They are rechecking requirements and asked to rollback PR 401. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- .../catalog/product-variants_catalog.v3.yml | 28 ++++--------------- reference/catalog/products_catalog.v3.yml | 26 +++-------------- 2 files changed, 9 insertions(+), 45 deletions(-) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 93d2a925e..7627a6dab 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1132,9 +1132,7 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + x-nullable: true inventory_level: type: integer description: |- @@ -1349,9 +1347,7 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + x-nullable: true example: "1234" inventory_level: type: integer @@ -1476,9 +1472,7 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + x-nullable: true inventory_level: type: integer description: |- @@ -1995,9 +1989,7 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + nullable: true image_url: type: string description: Publicly available image url @@ -2027,13 +2019,9 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. - nullable: false gtin: type: string example: '012345678905' - nullable: false - maxLength: 13 - minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -2198,9 +2186,7 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + nullable: true inventory_level: type: integer description: |- @@ -2231,14 +2217,10 @@ components: type: string description: Global Trade Item Number example: '012345678905' - nullable: false - maxLength: 13 - minLength: 0 mpn: type: string description: Manufacturer Part Number example: HV-HM02 - nullable: false description: Common Variant properties. - type: object properties: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index fe99a3141..81b37efda 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -5374,9 +5374,7 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + nullable: true inventory_level: type: integer description: |- @@ -5403,13 +5401,9 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. - nullable: false gtin: type: string example: '012345678905' - nullable: false - maxLength: 13 - minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -5575,9 +5569,7 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: false - maxLength: 13 - minLength: 0 + nullable: true inventory_level: type: integer description: |- @@ -7140,9 +7132,8 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 13 + maxLength: 32 minLength: 0 - nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7307,13 +7298,9 @@ components: gtin: type: string description: Global Trade Item Number - nullable: false - maxLength: 13 - minLength: 0 mpn: type: string description: Manufacturer Part Number - nullable: false date_last_imported: type: string description: the date when the Product had been imported @@ -7637,9 +7624,8 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 13 + maxLength: 32 minLength: 0 - nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7804,13 +7790,9 @@ components: gtin: type: string description: Global Trade Item Number - nullable: false - maxLength: 13 - minLength: 0 mpn: type: string description: Manufacturer Part Number - nullable: false date_last_imported: type: string description: the date when the Product had been imported From 60891ad12e3f0d505ff5917c1ec91183823fa5f5 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:56:28 -0500 Subject: [PATCH 130/221] DEVDOCS-6025 [update]: Get a Price List, rid incorrect query parameters (#407) --- reference/price_lists.v3.yml | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index 5ab1cbec5..a2a725035 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -469,38 +469,6 @@ paths: required: true schema: type: integer - - name: id - in: query - description: Filter items by ID. - schema: - type: integer - - name: name - in: query - description: Filter items by name. - schema: - type: string - - name: date_created - in: query - description: Filter items by date_created. - schema: - type: string - format: date-time - - name: date_modified - in: query - description: 'Filter items by date_modified. For example `v3/catalog/products?date_last_imported:min=2022-06-15`' - schema: - type: string - format: date-time - - name: page - in: query - description: Specifies the page number in a limited (paginated) list of products. - schema: - type: integer - - name: limit - in: query - description: Specifies the number of items per page in a limited (paginated) list of products. - schema: - type: integer responses: '200': description: '' From 8066b375dc991d38674ff3700a1e6fa66c539ef2 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 7 Aug 2024 15:43:37 -0500 Subject: [PATCH 131/221] DEVDOCS-6025 [update]: Price Lists, update query parameters, request & response body schemas (#425) --- reference/price_lists.v3.yml | 105 +++++------------------------------ 1 file changed, 14 insertions(+), 91 deletions(-) diff --git a/reference/price_lists.v3.yml b/reference/price_lists.v3.yml index a2a725035..6f26168b4 100644 --- a/reference/price_lists.v3.yml +++ b/reference/price_lists.v3.yml @@ -220,24 +220,6 @@ paths: description: | The total number of pages in the collection. example: 1 - links: - type: object - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. - description: | - Pagination links for the previous and next parts of the whole collection. description: 'Data related to the response, including pagination and collection totals.' description: 'Data related to the response, including pagination and collection totals.' description: Get All PriceLists. @@ -1114,24 +1096,6 @@ paths: description: | The total number of pages in the collection. example: 1 - links: - type: object - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. - description: | - Pagination links for the previous and next parts of the whole collection. description: 'Data about the response, including pagination and collection totals.' description: 'Data about the response, including pagination and collection totals.' description: |- @@ -1676,6 +1640,19 @@ paths: required: true schema: type: integer + - name: include + in: query + description: | + Sub-resources to include on a price record, in a comma-separated list. Valid expansions currently include `bulk_pricing_tiers` and `sku`. Other values will be ignored. + style: form + explode: false + schema: + type: array + items: + type: string + enum: + - bulk_pricing_tiers + - sku responses: '200': description: '' @@ -1849,24 +1826,6 @@ paths: description: | The total number of pages in the collection. example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. '429': description: | Allowed number of requests exceeded. @@ -2191,11 +2150,6 @@ paths: The price adjustment amount. This value along with the type will decide the price per variant for the pricing tier. format: double example: 3 - sku: - type: string - description: | - The SKU code associated with this `Price Record` if requested and it exists. - example: SMB-123 description: Common Price Record properties. required: true responses: @@ -2249,10 +2203,6 @@ paths: description: | The variant with which this price set is associated. Either `variant_id` or `sku` is required. example: 325 - sku: - type: string - description: | - The variant with which this price set is associated. Either `sku` or `variant_id` is required. currency: type: string format: ISO-4217 @@ -2319,11 +2269,6 @@ paths: description: | The price adjustment amount. This value along with the type will decide the price per variant for the pricing tier. example: 3 - sku: - type: string - description: | - The SKU code associated with this `Price Record` if requested and it exists. - example: SMB-123 title: Price Record meta: $ref: '#/components/schemas/Meta' @@ -2578,11 +2523,7 @@ paths: required: true responses: '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/SuccessBatchResponse' + description: No content '422': description: Error response. Includes the errors for each reference ID. content: @@ -2977,24 +2918,6 @@ components: description: | The total number of pages in the collection. example: 1 - links: - type: object - description: | - Pagination links for the previous and next parts of the whole collection. - properties: - previous: - type: string - description: | - Link to the previous page returned in the response. - current: - type: string - description: | - Link to the current page returned in the response. - example: '?page=1&limit=50' - next: - type: string - description: | - Link to the next page returned in the response. title: Collection Meta x-internal: false Meta: From b7eff3a69f5bbdf8a36931d1bf36974910a649c9 Mon Sep 17 00:00:00 2001 From: Katie Hoesley <39041092+katiehoesley@users.noreply.github.com> Date: Thu, 8 Aug 2024 11:48:14 -0600 Subject: [PATCH 132/221] Updates issue templates (#423) <!-- Ticket number or summary of work --> ## What changed? - updates issue templates --------- Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- .github/ISSUE_TEMPLATE/bug-report.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 19 +++++++++------ README.md | 33 ++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 0dc766b4e..8e8f5c311 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,4 +1,4 @@ -name: 🖍️ Incorrect documentation report +name: 🪲 Bug Report: Incorrect documentation description: Something is wrong or missing from the docs. labels: - 'bug:unverified' diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 21c4f53a0..42453d4c4 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,13 +1,18 @@ blank_issues_enabled: false contact_links: - - name: Get BigCommerce help - url: https://support.bigcommerce.com/s/contact + - name: Have questions? + url: https://developer.bigcommerce.com/docs/build about: - If you need to file a BigCommerce bug report or platform outage, contact our Support team. Contact information is in the store control panel. Partners, please use your Partner Portal to open a case. - - name: Docs + DevCenter feature request + Explore the dev docs. + - name: Feature request url: https://github.com/bigcommerce/docs/discussions/new?category=ideas-feature-requests about: - We appreciate you taking the time to improve our docs! Meet us in Discussions to talk further about your feature request. - - name: 💬 BigCommerce community + Join us in Discussions to share your idea on improving our docs. Thanks for your contribution! + - name: Need help with our docs? + url: https://support.bigcommerce.com/s/contact + about: + To report an outage or greater platform issue, contact our Technical Support team. If you're a partner, please do so via your Partner Portal. + - name: 💙 Join the BigCommerceDevs community url: https://developer.bigcommerce.com/community - about: Meet and chat with other people building with BigCommerce. + about: Connect with other devs building on BigCommerce! + diff --git a/README.md b/README.md index 83ab0806a..49c0361c6 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,26 @@ Here are some quick links to our [Contribution](/CONTRIBUTING.md) guide: --- +======= + +- [Making a Quick Edit](/CONTRIBUTING.md#making-a-quick-edit) +- [Editing Locally](/CONTRIBUTING.md#editing-locally) +- [Commit Messages](/CONTRIBUTING.md/cod#commit-messages) +- [Style Guides](/CONTRIBUTING.md#style-guides) +- [Contributing to Other Projects](/CONTRIBUTING.md#contributing-to-other-projects) + +### 👉 To discuss something +- Start a [Discussion](https://github.com/bigcommerce/docs/discussions). Our DevDocs team monitors GitHub Discussions regularly. + +### 👉 To report a bug or an issue you've encountered +- Open a new [Issue](https://github.com/bigcommerce/docs/issues). Our DevDocs team monitors GitHub Issues regularly. + +<br/> + +*For more information, see our [Contribution Guidelines](./CONTRIBUTING.md) and [Code of conduct](./CODE_OF_CONDUCT.md).* + +--- + ## API specifications If you maintain API clients, this repository is your source for the most up-to-date public API specifications. @@ -92,4 +112,15 @@ Always update your fork to ensure you're working with the newest source files. ├── package.json ├── pull_request_template.md # template for most pull requests └── README.md -``` --> + +``` + +## Archived docs +View our archived documentation [here](/archive/). + +--- +## Our developer channels: +* [Join our Developer Slack space](https://developer.bigcommerce.com/slack) +* [Read or contribute to our Resource Hub](https://developer.bigcommerce.com/resource-hub) +* [Follow us on X (Twitter) @BigCommerceDevs](https://twitter.com/BigCommerceDevs) +* [Follow the BigCommerce Developers Linkedin](https://www.linkedin.com/showcase/bigcommercedevs/) \ No newline at end of file From 8a5c3317aba9160311d59f3fad1957ef1a574caf Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 8 Aug 2024 13:06:51 -0500 Subject: [PATCH 133/221] DEVDOCS-5751 [update]: Product & Variant Metafields, duplication for ShipperHQ (#414) --- docs/store-operations/catalog/index.mdx | 3 ++- docs/store-operations/shipping/shipper-hq.mdx | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/store-operations/catalog/index.mdx b/docs/store-operations/catalog/index.mdx index 4697f945a..833025dd0 100644 --- a/docs/store-operations/catalog/index.mdx +++ b/docs/store-operations/catalog/index.mdx @@ -277,7 +277,8 @@ X-Auth-Token: {{ACCESS_TOKEN}} ``` <Callout type="info"> - You can add metafields to variants, products, categories, and brands. + - You can add metafields to variants, products, categories, and brands. + - Product and variant metafields won't be duplicated when you [duplicate a product](https://support.bigcommerce.com/s/article/Adding-Products-v3?language=en_US#product-details) in the control panel unless the [metafield is for ShipperHQ](/docs/store-operations/shipping/shipper-hq) and you [install ShipperHQ](https://support.bigcommerce.com/s/article/ShipperHQ?language=en_US#install). </Callout> diff --git a/docs/store-operations/shipping/shipper-hq.mdx b/docs/store-operations/shipping/shipper-hq.mdx index cfbee10cb..29e7e4b24 100644 --- a/docs/store-operations/shipping/shipper-hq.mdx +++ b/docs/store-operations/shipping/shipper-hq.mdx @@ -11,6 +11,8 @@ These field values can be set in the control panel by the merchant as well as us * [Product Metafields Endpoint](/docs/rest-catalog/products/metafields#create-a-product-metafield) * [Variant Metafields Endpoint](/docs/rest-catalog/product-variants/metafields#create-a-product-variant-metafield) +If you [duplicate a product](https://support.bigcommerce.com/s/article/Adding-Products-v3?language=en_US#product-details) in the control panel and have [ShipperHQ installed](https://support.bigcommerce.com/s/article/ShipperHQ?language=en_US#install), metafields for ShipperHQ will be duplicated along with the product or variant. + ## ShipperHQ object properties | Property | Type | Values | Access From 1dac974c1a8c98bf0ab77264351a9245884fedca Mon Sep 17 00:00:00 2001 From: Katie Hoesley <39041092+katiehoesley@users.noreply.github.com> Date: Thu, 8 Aug 2024 12:35:26 -0600 Subject: [PATCH 134/221] Updates bug report issue template (#433) <!-- Ticket number or summary of work --> ## What changed? Updates bug report issue template --- .github/ISSUE_TEMPLATE/bug-report.md | 31 +++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE/bug-report.yml | 29 ------------------------- 2 files changed, 31 insertions(+), 29 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..1e10f01db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,31 @@ +--- +name: "\U0001F41E\U0001F4DD Bug report" +about: You've identified a bug in our docs. +title: "[x] is not working when I [y]" +labels: '' +assignees: '' + +--- + +We really appreciate the help making our docs better. Every issue helps! + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +Please link to a repo that can be used to reproduce this issue, if possible. It'll help fix the bug faster. + +**Expected behavior** +A clear and concise description of the bug you've identified. + +**Screenshots** +If applicable, add screenshots to help explain the bug you've identified. + +**Additional context** +Add any other context about the problem here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml deleted file mode 100644 index 8e8f5c311..000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: 🪲 Bug Report: Incorrect documentation -description: Something is wrong or missing from the docs. -labels: - - 'bug:unverified' -body: - - type: markdown - attributes: - value: | - Thank you for helping improve the BigCommerce DevDocs! - - ## Tell us what's missing! - - - type: input - attributes: - label: What is the link to the page that needs updating? Provide multiple links if needed. - validations: - required: true - - type: textarea - attributes: - label: What needs to be documented? - description: A concise description of what you expect to see here. - validations: - required: true - - type: textarea - attributes: - label: What is currently documented? - description: A concise description of what you're actually seeing. - validations: - required: true From af95977c2471a6fe6ebd16a8abadad94ea347e29 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 8 Aug 2024 14:31:45 -0500 Subject: [PATCH 135/221] [No ticket]: fix URL for site certificates (#434) --- reference/sites.v3.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/sites.v3.yml b/reference/sites.v3.yml index 0bda80fb8..f66002645 100644 --- a/reference/sites.v3.yml +++ b/reference/sites.v3.yml @@ -497,7 +497,7 @@ paths: type: integer required: true get: - summary: Get a Site’s SSL/TLS Certificate Information + summary: Get a Site’s SSL TLS Certificate Information description: Obtain information about a site’s SSL/TLS certificate. tags: - Site Certificate @@ -511,7 +511,7 @@ paths: $ref: '#/components/schemas/CertificateResponse' examples: {} put: - summary: Upsert a Site’s SSL/TLS Certificate Information + summary: Upsert a Site’s SSL TLS Certificate Information operationId: upsertSiteCertificate parameters: - $ref: '#/components/parameters/ContentType' From 0afbfe5a715b26e483b1ad5c461394a7900154bd Mon Sep 17 00:00:00 2001 From: "vincent.zhao" <vincent.zhao@bigcommerce.com> Date: Sat, 10 Aug 2024 06:53:51 +1000 Subject: [PATCH 136/221] update phrasing around concurrent refunds (#435) ## What changed? Just some phrasing change to make it more accurate. ## Release notes draft No release note required ## Anything else? ping @bc-traciporter --- reference/orders.v3.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index b04342aab..aa71aa32e 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -165,7 +165,7 @@ paths: **Notes:** * Create a refund quote before performing a refund request to best avoid a `422` error. Check the refund quote's response body for the `refund_methods` array. The `amount` given in the array must match the `amount` used in the refund request body. - * Order refunds are processed consecutively. Processing synchronous refunds on an order is not yet supported. + * Order refunds should be processed sequentially. Processing multiple concurrent refunds on the same order is not yet supported. operationId: createOrderRefundQuotes parameters: - $ref: '#/components/parameters/ContentType' @@ -228,7 +228,7 @@ paths: * `store_v2_transactions` **Note:** - Order refunds are processed consecutively. Processing synchronous refunds on an order are not yet supported. + Order refunds should be processed sequentially. Processing multiple concurrent refunds on the same order are not yet supported. operationId: createOrderRefund parameters: From 242342a6c17a31db4210fcc3698cd0ade6f13b56 Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Fri, 9 Aug 2024 17:05:09 -0400 Subject: [PATCH 137/221] Update README.md (#437) ## What changed? Removes a duplicate contrib section. --- README.md | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/README.md b/README.md index 49c0361c6..8fd87d532 100644 --- a/README.md +++ b/README.md @@ -35,26 +35,6 @@ Here are some quick links to our [Contribution](/CONTRIBUTING.md) guide: --- -======= - -- [Making a Quick Edit](/CONTRIBUTING.md#making-a-quick-edit) -- [Editing Locally](/CONTRIBUTING.md#editing-locally) -- [Commit Messages](/CONTRIBUTING.md/cod#commit-messages) -- [Style Guides](/CONTRIBUTING.md#style-guides) -- [Contributing to Other Projects](/CONTRIBUTING.md#contributing-to-other-projects) - -### 👉 To discuss something -- Start a [Discussion](https://github.com/bigcommerce/docs/discussions). Our DevDocs team monitors GitHub Discussions regularly. - -### 👉 To report a bug or an issue you've encountered -- Open a new [Issue](https://github.com/bigcommerce/docs/issues). Our DevDocs team monitors GitHub Issues regularly. - -<br/> - -*For more information, see our [Contribution Guidelines](./CONTRIBUTING.md) and [Code of conduct](./CODE_OF_CONDUCT.md).* - ---- - ## API specifications If you maintain API clients, this repository is your source for the most up-to-date public API specifications. @@ -123,4 +103,4 @@ View our archived documentation [here](/archive/). * [Join our Developer Slack space](https://developer.bigcommerce.com/slack) * [Read or contribute to our Resource Hub](https://developer.bigcommerce.com/resource-hub) * [Follow us on X (Twitter) @BigCommerceDevs](https://twitter.com/BigCommerceDevs) -* [Follow the BigCommerce Developers Linkedin](https://www.linkedin.com/showcase/bigcommercedevs/) \ No newline at end of file +* [Follow the BigCommerce Developers Linkedin](https://www.linkedin.com/showcase/bigcommercedevs/) From cb920fc81e1ae2befc0c84b13769f8dd2b4bb14d Mon Sep 17 00:00:00 2001 From: Sandip Chandela <18615735+sandip5678@users.noreply.github.com> Date: Sat, 10 Aug 2024 04:22:52 +0530 Subject: [PATCH 138/221] Update formatting field `date_modified:max` in customers.v2.yml (#384) Minor formatting on `date_modified:max` --- reference/customers.v2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/customers.v2.yml b/reference/customers.v2.yml index 2ffb21141..8dbae78a3 100644 --- a/reference/customers.v2.yml +++ b/reference/customers.v2.yml @@ -807,7 +807,7 @@ paths: schema: type: string format: date-time - - name: '`date_modified:max`' + - name: 'date_modified:max' in: query description: Filter customer groups by maximum date_modified. `date_modified:max=2018-09-05T13:45:03` or `date_modified:max=2019-09-04` schema: From 0293b68f68fb43490b003a679b30e40814687ed3 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 12 Aug 2024 18:32:08 +0300 Subject: [PATCH 139/221] DEVDOCS-6024: [TEST SPEC] meta object in response should be empty (#391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? * Removed pagination from meta object in response body. ## Questions/Comments 1. Can we have an example to add to the `include_fields` query parameter? Besides the `id` what other values should display? I would like to list possible enum values. 2. These fields are not required for the Update Products (batch) endpoint: weight, field, type, id, and price. But they belong to the product_base schema. The specification file should be structured differently so the product_base schema file is not used across multiple endpoints because the requirements are different. 3. Error messages are needed for `custom_fields`. `name` and `value` fields are labeled required but the request still works. However, the custom_fields do not appear in the response. 4. Can we remove the following read-only fields from the request example? url_zoom, url_standard, url_thumbnail, url_tiny These fields are embedded within the schema so not sure how to take them out without creating a new example. 5. The images array need error messages. The request is working but the fields are not displaying. We need error messages to tell us what is wrong. 6. Is the `video_id` a required field in the Create a Product request body? Where do I find it? Do I find it in the Get a Product endpoint? ![Screenshot 2024-08-01 at 10 48 46 AM](https://github.com/user-attachments/assets/8c73e373-f514-4e05-964b-ceb644118550) 7. There are duplicate fields but I think this is a known issue. ([SELFDEV-735](https://bigcommercecloud.atlassian.net/browse/SELFDEV-735)) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ [SELFDEV-735]: https://bigcommercecloud.atlassian.net/browse/SELFDEV-735?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/products_catalog.v3.yml | 92 +++++++++++++++++------ 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 81b37efda..3094b070e 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -244,10 +244,6 @@ paths: image_url: string id: 0 product_id: 0 - url_zoom: string - url_standard: string - url_thumbnail: string - url_tiny: string date_modified: '2019-08-24T14:15:22Z' responses: '200': @@ -262,8 +258,8 @@ paths: type: array items: $ref: '#/components/schemas/product_Full' - meta: - $ref: '#/components/schemas/metaCollection_Full' + meta: {} + example: id: 0 name: Smith Journal 13 @@ -1281,7 +1277,7 @@ paths: **Usage Notes** - `image_url` - `255` character limit - - For file uploads, use the `multipart/form-data` media type. + - For file uploads, use the `multipart/form-data` media type. See [Adding product images](/docs/store-operations/catalog#adding-product-images) for more information. - You can create only one image at a time. A product can have up to 1000 images. - Supported image file types are BMP, GIF, JPEG, PNG, WBMP, XBM, and WEBP. - Each image file or image uploaded by URL can be up to 8 MB. @@ -6865,7 +6861,6 @@ components: Shared `Product` properties used in: * `POST` * `PUT` - * `GET` x-internal: false x-examples: example: @@ -7449,8 +7444,6 @@ components: description: | A unique product name. example: Smith Journal 13 - x-required: - - post type: type: string description: | @@ -7459,8 +7452,6 @@ components: enum: - physical - digital - x-required: - - post sku: maxLength: 255 minLength: 0 @@ -7848,11 +7839,6 @@ components: type: array items: $ref: '#/components/schemas/productVariant_Full' - required: - - name - - type - - weight - - price metafield_Full: title: metafield_Full allOf: @@ -8914,6 +8900,71 @@ components: type: array items: type: string + enum: + - name + - type + - sku + - description + - weight + - width + - depth + - height + - price + - cost_price + - retail_price + - sale_price + - map_price + - tax_class_id + - product_tax_code + - calculated_price + - categories + - brand_id + - option_set_id + - option_set_display + - inventory_level + - inventory_warning_level + - inventory_tracking + - reviews_rating_sum + - reviews_count + - total_sold + - fixed_cost_shipping_price + - is_free_shipping + - is_visible + - is_featured + - related_products + - warranty + - bin_picking_number + - layout_file + - upc + - mpn + - gtin + - date_last_imported + - search_keywords + - availability + - availability_description + - condition + - is_condition_shown + - order_quantity_minimum + - order_quantity_maximum + - page_title + - meta_keywords + - meta_description + - date_created + - date_modified + - view_count + - preorder_release_date + - preorder_message + - is_preorder_only + - is_price_hidden + - price_hidden_label + - custom_url + - base_variant_id + - open_graph_type + - open_graph_title + - open_graph_description + - open_graph_use_meta_description + - open_graph_use_product_name + - open_graph_use_image IncludeFieldsParamMetafields: name: include_fields in: query @@ -9041,15 +9092,10 @@ components: items: type: string enum: - - variants - - images - - custom_fields - bulk_pricing_rules - - primary_image + - reviews - modifiers - options - - videos - - reviews - parent_relations IdMinParam: name: 'id:min' From cf19aa7caa148bf1a1aca98a55d29438a23bc41e Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 12 Aug 2024 11:31:14 -0500 Subject: [PATCH 140/221] Issue 429 [No Ticket]: add POST bulk pricing rules (#430) --- reference/catalog/products_catalog.v3.yml | 107 ++++++++++++---------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 3094b070e..0e610fa36 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -3440,6 +3440,53 @@ paths: parameters: - $ref: '#/components/parameters/ProductIdParam' - $ref: '#/components/parameters/CustomFieldIdParam' + '/catalog/products/{product_id}/bulk-pricing-rules': + parameters: + - $ref: '#/components/parameters/ProductIdParam' + - $ref: '#/components/parameters/Accept' + - $ref: '#/components/parameters/ContentType' + post: + tags: + - Bulk pricing rules + summary: Create a Bulk Pricing Rule + description: Creates a *Bulk Pricing Rule*. + operationId: createBulkPricingRule + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/bulkPricingRule_Full' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + title: 'Create Bulk Pricing Rule Response' + type: object + properties: + data: + allOf: + - type: object + properties: + id: + type: integer + description: Unique ID of the *Bulk Pricing Rule*. Read-Only. + readOnly: true + required: + - id + - $ref: '#/components/schemas/bulkPricingRule_Full' + meta: + $ref: '#/components/schemas/metaEmpty_Full' + example: + data: + id: 83 + quantity_min: 1 + quantity_max: 3 + type: price + amount: 1 + meta: {} '/catalog/products/{product_id}/bulk-pricing-rules/{bulk_pricing_rule_id}': get: tags: @@ -3541,54 +3588,16 @@ paths: type: object properties: data: - title: Bulk Pricing Rule - required: - - amount - - quantity_max - - quantity_min - - type - type: object - properties: - id: - type: integer - description: Unique ID of the *Bulk Pricing Rule*. Read-Only. - readOnly: true - quantity_min: - minimum: 0 - type: integer - description: | - The minimum inclusive quantity of a product to satisfy this rule. Must be greater than or equal to zero. - Required in /POST. - example: 10 - x-required: - - post - quantity_max: - minimum: 0 - type: integer - description: |- - The maximum inclusive quantity of a product to satisfy this rule. Must be greater than the `quantity_min` value – unless this field has a value of 0 (zero), in which case there will be no maximum bound for this rule. - Required in /POST. - example: 50 - x-required: - - post - type: - type: string - description: |- - The type of adjustment that is made. Values: `price` - the adjustment amount per product; `percent` - the adjustment as a percentage of the original price; `fixed` - the adjusted absolute price of the product. - Required in /POST. - example: price - enum: - - price - - percent - - fixed - x-required: - - post - amount: - type: integer - description: |- - The discount can be a fixed dollar amount or a percentage. For a fixed dollar amount enter it as an integer and the response will return as an integer. For percentage enter the amount as the percentage divided by 100 using string format. For example 10% percent would be “.10”. The response will return as an integer. - Required in /POST. - description: Common BulkPricingRule properties + allOf: + - type: object + properties: + id: + type: integer + description: Unique ID of the *Bulk Pricing Rule*. Read-Only. + readOnly: true + required: + - id + - $ref: '#/components/schemas/bulkPricingRule_Full' meta: $ref: '#/components/schemas/metaEmpty_Full' example: @@ -6104,8 +6113,6 @@ components: bulkPricingRule_Full: title: bulkPricingRule_Full type: object - description: Common Bulk Pricing Rule properties - x-internal: false properties: quantity_min: minimum: 0 From a002b9a429259bca018ea6273abef5e4e9c9cc0b Mon Sep 17 00:00:00 2001 From: Katie Hoesley <39041092+katiehoesley@users.noreply.github.com> Date: Mon, 12 Aug 2024 11:33:02 -0600 Subject: [PATCH 141/221] Adds "How to lint a document with DX linter" guide (#442) ## What changed? * "Guides" folder in docs repo, added "how to lint a document with dx linter" guide --------- Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- .../lint-a-document-with-dx-linter-script.mdx | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 guides/lint-a-document-with-dx-linter-script.mdx diff --git a/guides/lint-a-document-with-dx-linter-script.mdx b/guides/lint-a-document-with-dx-linter-script.mdx new file mode 100644 index 000000000..45aa737c6 --- /dev/null +++ b/guides/lint-a-document-with-dx-linter-script.mdx @@ -0,0 +1,26 @@ +# How to lint a document with the DX linter script + +The Developer Documentation team uses a custom script to lint your doc files before they are pushed. This linter covers everything our in-house Style Guide does, saving you tons of time. + +Run the script using the CLI to get your PR submission nearly perfect in no time. + +<Callout emoji="⚠️"> + Before running the script, ensure your nvm version is at least 18. You can update the nvm version using the following command: + + `nvm use 18` +</Callout> + +1. Open terminal and navigate to the file's folder. + +2. Run `npx github:bigcommerce/dev-docs-style-guide-linter ./{{yourfilename}}.mdx.` + +Example: `npx github:bigcommerce/dev-docs-style-guide-linter ./start/authentication/index.mdx` + +<Callout emoji="ℹ️"> + **NOTE:** Ensure your file name has the correct path. +</Callout> + +3. Review the flagged items and make necessary updates. + +4. Repeat Step 2 to re-run the script. + From 443e149169cdd3413962dab81178eb65a9d36f6e Mon Sep 17 00:00:00 2001 From: Katie Hoesley <39041092+katiehoesley@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:01:04 -0600 Subject: [PATCH 142/221] Fixes rendering in linting guide (#443) ## What changed? - Fixes rendering in linting guide --------- Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- .../lint-a-document-with-dx-linter-script.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 guides/lint-a-document-with-dx-linter-script.md diff --git a/guides/lint-a-document-with-dx-linter-script.md b/guides/lint-a-document-with-dx-linter-script.md new file mode 100644 index 000000000..0f4a78a6a --- /dev/null +++ b/guides/lint-a-document-with-dx-linter-script.md @@ -0,0 +1,21 @@ +# How to lint a document with the DX linter script + +The Developer Documentation team uses a custom script to lint doc files before they are pushed. This linter covers everything our in-house Style Guide does, saving you time. + +Run the script using the CLI to get your PR submission nearly perfect in no time. + +> ⚠️ Before running the script, ensure your nvm version is at least 18. You can update the nvm version using the following command: +> +> `nvm use 18` + +1. Open terminal and navigate to the file's folder. + +2. Run `npx github:bigcommerce/dev-docs-style-guide-linter ./{{yourfilename}}.mdx.` + +Example: `npx github:bigcommerce/dev-docs-style-guide-linter ./start/authentication/index.mdx` + +> ℹ️ **NOTE:** Ensure your file name has the correct path. + +3. Review the flagged items and make necessary updates. + +4. Repeat Step 2 to re-run the linter. From 295bb496e0ebde0e0772843a8c91750ec95b4a96 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Mon, 12 Aug 2024 15:45:42 -0500 Subject: [PATCH 143/221] Delete guides/lint-a-document-with-dx-linter-script.mdx Deleting as per Katies request. --- .../lint-a-document-with-dx-linter-script.mdx | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 guides/lint-a-document-with-dx-linter-script.mdx diff --git a/guides/lint-a-document-with-dx-linter-script.mdx b/guides/lint-a-document-with-dx-linter-script.mdx deleted file mode 100644 index 45aa737c6..000000000 --- a/guides/lint-a-document-with-dx-linter-script.mdx +++ /dev/null @@ -1,26 +0,0 @@ -# How to lint a document with the DX linter script - -The Developer Documentation team uses a custom script to lint your doc files before they are pushed. This linter covers everything our in-house Style Guide does, saving you tons of time. - -Run the script using the CLI to get your PR submission nearly perfect in no time. - -<Callout emoji="⚠️"> - Before running the script, ensure your nvm version is at least 18. You can update the nvm version using the following command: - - `nvm use 18` -</Callout> - -1. Open terminal and navigate to the file's folder. - -2. Run `npx github:bigcommerce/dev-docs-style-guide-linter ./{{yourfilename}}.mdx.` - -Example: `npx github:bigcommerce/dev-docs-style-guide-linter ./start/authentication/index.mdx` - -<Callout emoji="ℹ️"> - **NOTE:** Ensure your file name has the correct path. -</Callout> - -3. Review the flagged items and make necessary updates. - -4. Repeat Step 2 to re-run the script. - From 9b89223e6f26b6fff8b1847e134b6bb9cc27e2de Mon Sep 17 00:00:00 2001 From: David Chin <davidchin.yf@gmail.com> Date: Tue, 13 Aug 2024 10:25:23 +1000 Subject: [PATCH 144/221] DEVDOCS-6022: Update cart/checkout API with information on concurrency control (#439) <!-- Ticket number or summary of work --> # [DEVDOCS-6022] ## What changed? <!-- Provide a bulleted list in the present tense --> * Added `version` field to the request and response payload of the Storefront and Management REST Cart and Checkout API. * Added a description explaining that this field can be used to enable optimistic concurrency control to prevent lost updates caused by concurrent updates. ## Release notes draft We are happy to announce that the Cart and Checkout API now supports optimistic concurrency control. This feature helps prevent lost updates caused by concurrent requests overriding changes made by others. If the `version` number provided by an API client does not match the version on the server, the request will be rejected, allowing the client to handle the error accordingly. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bigcommerce/dev-docs @bigcommerce/team-checkout [DEVDOCS-6022]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6022?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/carts.sf.yml | 70 +++++++++++++++++- reference/carts.v3.yml | 51 +++++++++++++- reference/checkouts.sf.yml | 100 +++++++++++++++++++++++++- reference/checkouts.v3.yml | 141 ++++++++++++++++++++++++++++++++++--- 4 files changed, 346 insertions(+), 16 deletions(-) diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 3c7127b4d..923d58f32 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -124,11 +124,13 @@ paths: > #### Notes > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. - > * Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + > * To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: addCartLineItem responses: '200': $ref: '#/components/responses/postCartsItems' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' requestBody: content: application/json: @@ -146,6 +148,7 @@ paths: optionValue: 117 - optionId: 11 optionValue: 125 + version: 1 With Gift Wrapping: value: lineItems: @@ -156,7 +159,8 @@ paths: wrapTogether: true wrapDetails: - id: 1 - message: "Happy Birthday" + message: "Happy Birthday" + version: 1 description: '' '/carts/{cartId}/items/{itemId}': parameters: @@ -177,7 +181,7 @@ paths: > #### Notes > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. - > * Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + > * To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: updateCartLineItem parameters: - $ref: '#/components/parameters/ContentType' @@ -194,6 +198,7 @@ paths: variantId: 191 quantity: 10 locale: en + version: 1 Custom Item: value: lineItem: @@ -204,6 +209,7 @@ paths: - optionId: 125 optionValue: 127 locale: en + version: 1 With Gift Wrapping: value: lineItem: @@ -215,6 +221,7 @@ paths: wrapDetails: - id: 1 message: "Happy Birthday" + version: 1 With null Gift Wrapping (will delete current gift wrapping): value: lineItem: @@ -222,12 +229,20 @@ paths: productId: 230 variantId: 124 giftWrapping: null + version: 1 required: true responses: '200': $ref: '#/components/responses/putCartsItems' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: lineItem delete: + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/requestLineItemDelete' tags: - Cart Items summary: Delete Cart Line Item @@ -239,10 +254,13 @@ paths: > #### Note > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. + > * To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: deleteCartLineItem responses: '200': $ref: '#/components/responses/deleteCartsItems' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/carts/{cartId}/currency': parameters: - $ref: '#/components/parameters/CartIdPath' @@ -377,6 +395,10 @@ components: locale: type: string description: Locale of the cart. + version: + type: integer + description: The current version of the cart. + example: 1 x-internal: false requestCart: title: Create Cart Request Object @@ -506,6 +528,9 @@ components: type: array items: $ref: '#/components/schemas/requestCartPostLineItem' + version: + type: integer + description: The expected version of the cart. required: - lineItems - type: object @@ -514,6 +539,9 @@ components: type: array items: $ref: '#/components/schemas/requestLineItemGiftCertificate' + version: + type: integer + description: The expected version of the cart. required: - giftCertificates - type: object @@ -524,6 +552,9 @@ components: $ref: '#/components/schemas/requestCartPostLineItem' giftCertificates: $ref: '#/components/schemas/requestLineItemGiftCertificate' + version: + type: integer + description: The expected version of the cart. required: - lineItems - giftCertificates @@ -536,6 +567,9 @@ components: properties: lineItem: $ref: '#/components/schemas/requestCartPostLineItem' + version: + type: integer + description: The expected version of the cart. required: - lineItem title: Line item @@ -543,6 +577,9 @@ components: properties: giftCertificates: $ref: '#/components/schemas/requestLineItemGiftCertificate' + version: + type: integer + description: The expected version of the cart. required: - giftCertificates title: Gift certificate item @@ -552,11 +589,20 @@ components: $ref: '#/components/schemas/requestCartPostLineItem' giftCertificates: $ref: '#/components/schemas/requestLineItemGiftCertificate' + version: + type: integer + description: The expected version of the cart. required: - lineItem - giftCertificates title: line & gift certificate items description: '' + requestLineItemDelete: + type: object + properties: + version: + type: integer + description: The expected version of the cart. responseCartCurrency: title: Currency type: object @@ -1339,6 +1385,7 @@ components: createdTime: '2021-03-04T14:17:50+00:00' updatedTime: '2021-03-04T14:17:50+00:00' locale: en + version: 1 deleteCartsItems: description: 'NOTE: Discounted line items are re-evaluated on cart actions and may be automatically added back to your cart with a new line item ID to satisfy promotional requirements.' content: @@ -1439,6 +1486,23 @@ components: createdTime: string updatedTime: string locale: string + CartConflictErrorResponse: + description: 'Cart conflict' + content: + application/json: + schema: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + example: + status: 409 + title: The request cannot be processed due to a possible conflict. Please review the changes and try again. + type: https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes parameters: Accept: name: Accept diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index c55b9f055..c11475bd8 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -278,7 +278,8 @@ paths: If a product has modifiers, omit the `variant_id` and instead use the `option_selections` array to describe both the **variant** and the **modifier** selections. - Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. + parameters: - name: include in: query @@ -325,6 +326,7 @@ paths: name: Jane Does email: janedoe@example.com message: Happy Birthday Jane! + version: 1 'Example 2: Custom Item': value: custom_items: @@ -400,7 +402,7 @@ paths: Deleting all line items from the cart will invalidate the cart. - Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. parameters: - name: include in: query @@ -432,6 +434,8 @@ paths: responses: '200': $ref: '#/components/responses/CartResponse' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' summary: Update Cart Line Item operationId: updateCartLineItem delete: @@ -441,6 +445,8 @@ paths: **Notes** Removing the last `line_item` in the *Cart* deletes the *Cart*. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. parameters: - name: include in: query @@ -460,6 +466,11 @@ paths: - line_items.physical_items.options - line_items.digital_items.options - promotions.banners + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CartLineItemDelete' tags: - Items responses: @@ -537,6 +548,8 @@ paths: meta: {} '204': description: 'If the action’s result is an empty cart, the cart is automatically deleted.' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' summary: Delete Cart Line Item operationId: deleteCartLineItem '/carts/{cartId}': @@ -580,6 +593,8 @@ paths: **Notes** Changing the *Cart* `customer_id` will remove any promotions or shipping calculations on the *Cart*. These are tied to the customer depending on cart conditions and any customer groups. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. parameters: - name: include in: query @@ -607,12 +622,15 @@ paths: $ref: '#/components/schemas/CartUpdatePutRequestData' example: customer_id: 5 + version: 1 required: true tags: - Carts (Single) responses: '201': $ref: '#/components/responses/CartResponse' + '409': + $ref: '#/components/responses/CartConflictErrorResponse' summary: Update Customer ID operationId: updateCart delete: @@ -1504,6 +1522,9 @@ components: properties: customer_id: type: integer + version: + type: integer + description: The expected version of the cart. title: Cart Update Put Request Data x-internal: false LineItemRequestData: @@ -1706,6 +1727,10 @@ components: text: description: Text of the banner. type: string + version: + type: integer + description: The current version of the cart. + example: 1 Currency: type: object description: The currency. This is the same for both the cart and its subsequent checkout. @@ -2865,6 +2890,15 @@ components: - recipient custom_items: $ref: '#/components/schemas/cart_PostCustomItem' + version: + type: integer + description: The expected version of the cart. + CartLineItemDelete: + type: object + properties: + version: + type: integer + description: The expected version of the cart. Redirect_urls_Post: type: object title: Redirect_urls_Post @@ -2944,6 +2978,9 @@ components: - recipient custom_items: $ref: '#/components/schemas/cart_PostCustomItem' + version: + type: integer + description: The expected version of the cart. cart_PostCustomItem: type: array title: Custom item @@ -3679,6 +3716,16 @@ components: schema: $ref: '#/components/schemas/Cart_Full' examples: {} + CartConflictErrorResponse: + description: 'Cart conflict' + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + example: + status: 409 + title: The request cannot be processed due to a possible conflict. Please review the changes and try again. + type: https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes CartRedirectResponse: description: '' content: diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index 1ebe2e39f..81524c2c1 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -165,6 +165,7 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 '400': description: When a problem arises, returns a generic response. content: @@ -333,6 +334,9 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body '/checkouts/{checkoutId}/carts/{cartId}/items/{itemId}': parameters: @@ -479,6 +483,7 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 x-codegen-request-body-name: body delete: tags: @@ -741,7 +746,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/address_Base' + $ref: '#/components/schemas/BillingAddressRequest' required: true responses: '200': @@ -859,9 +864,12 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 '403': description: The email trying to be set for the guest is associated with an account. The customer must sign in. content: {} + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '429': description: Unable to determine if provided email is associated with an account. The customer must sign in. content: {} @@ -887,7 +895,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/address_Base' + $ref: '#/components/schemas/BillingAddressRequest' required: true responses: '200': @@ -1114,6 +1122,8 @@ paths: '403': description: The email trying to be set for the guest is associated with an account. The customer must sign in. content: {} + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '429': description: Unable to determine if provided email is associated with an account. The customer must sign in. content: {} @@ -1285,6 +1295,9 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/consignments/{consignmentId}': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -1450,6 +1463,9 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body delete: tags: @@ -1463,6 +1479,11 @@ paths: > * The Send a Test Request feature is not currently supported for this endpoint. > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutConsignment + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteConsignmentRequest' responses: '200': description: '' @@ -1579,6 +1600,9 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/gift-certificates': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -1721,6 +1745,7 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 '404': description: Gift certificate code not found content: @@ -1785,6 +1810,9 @@ paths: couponCode: type: string description: '' + version: + type: integer + description: The expected version of the checkout. required: true responses: '200': @@ -1902,6 +1930,9 @@ paths: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body '/checkouts/{checkoutId}/coupons/{couponCode}': parameters: @@ -1920,6 +1951,11 @@ paths: > * The Send a Test Request feature is not currently supported for this endpoint. > * This endpoint requires using Stencil CLI, a local session, and a csrf token to work. operationId: deleteCheckoutCoupon + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteCouponCodeRequest' responses: '200': description: '' @@ -2140,6 +2176,9 @@ paths: createdTime: '2018-09-18T15:48:26+00:00' updatedTime: '2018-09-18T17:47:35+00:00' customerMessage: '' + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/store-credit': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -2301,6 +2340,10 @@ components: type: boolean description: | `true` value indicates StoreCredit has been applied. + version: + type: integer + description: The current version of the checkout. + example: 1 description: '' x-internal: false CartCoupon: @@ -2449,6 +2492,16 @@ components: description: This can also be an array for fields that need to support list of values; for example, a set of checkboxes. When doing a PUT or POST to the `fieldValue` with a pick list, the input must be a number. The response will be a string. description: 'When doing a PUT or POST to the `fieldValue` with a pick list, the input must be a number. The response will be a string.' x-internal: false + BillingAddressRequest: + title: Billing address request + allOf: + - $ref: '#/components/schemas/address_Base' + - type: object + properties: + version: + type: integer + description: The expected version of the checkout. + x-internal: false consignment_Full: title: consignment_Full type: object @@ -2567,6 +2620,9 @@ components: customerMessage: type: string description: '' + version: + type: integer + description: The expected version of the checkout. x-internal: false checkouts_Resp: title: checkouts_Resp @@ -3473,6 +3529,25 @@ components: properties: pickupMethodId: type: integer + version: + type: integer + description: The expected version of the checkout. + x-internal: false + DeleteCouponCodeRequest: + title: Delete Coupon Request + type: object + properties: + version: + type: integer + description: The expected version of the checkout. + x-internal: false + DeleteConsignmentRequest: + title: Delete Consignment Request + type: object + properties: + version: + type: integer + description: The expected version of the checkout. x-internal: false GiftCertificateRequest: title: Gift Certificate Request @@ -3579,6 +3654,9 @@ components: properties: pickupMethodId: type: integer + version: + type: integer + description: The expected version of the checkout. description: One or more of these three fields is mandatory. You can update address and line items in one request. You have to update shipping option ID or pickup option ID in a separate request since changing the address or line items can invalidate the previously available shipping options. x-internal: false checkoutCart: @@ -4125,6 +4203,24 @@ components: createdTime: '2019-01-10T17:18:00+00:00' updatedTime: '2019-01-10T17:19:47+00:00' customerMessage: '' + version: 1 + CartConflictErrorResponse: + description: 'Cart conflict' + content: + application/json: + schema: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + example: + status: 409 + title: The request cannot be processed due to a possible conflict. Please review the changes and try again. + type: https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes parameters: Accept: name: Accept diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index cb035d0c6..b8d725c31 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -790,6 +790,7 @@ paths: - homepage - cartpage text: Some text + version: 1 '404': description: Error code that is displayed when a given checkout ID is not found. content: @@ -980,6 +981,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Selected Shipping Options: example: @@ -1093,6 +1095,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Coupon Applied: example: @@ -1206,6 +1209,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:08:01+00:00' customer_message: '' + version: 1 meta: {} No Coupon Applied: example: @@ -1292,6 +1296,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:06:56+00:00' customer_message: '' + version: 1 meta: {} Include promotions: example: @@ -1386,6 +1391,7 @@ paths: - homepage - cartpage text: Some text + version: 1 meta: {} example-1: example: @@ -1579,6 +1585,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-unitTests: [] x-operation-settings: CollectParameters: false @@ -1604,6 +1613,8 @@ paths: Required Fields: * `discounted_amount` at the cart-level or at the item-level + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: addCheckoutDiscount parameters: - $ref: '#/components/parameters/checkoutId' @@ -1642,11 +1653,15 @@ paths: discounted_amount: type: number example: 15 + version: + type: integer + description: The expected version of the checkout. example: - carts: + cart: discounts: - discounted_amount: 10 name: "manual-discount" + version: 1 required: false responses: '200': @@ -2468,6 +2483,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/billing-address': post: tags: @@ -2479,6 +2497,8 @@ paths: **Required Fields** * email * country_code + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: addCheckoutBillingAddress parameters: - $ref: '#/components/parameters/checkoutId' @@ -2633,6 +2653,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Selected Shipping Options: example: @@ -2746,6 +2767,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Coupon Applied: example: @@ -2859,6 +2881,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:08:01+00:00' customer_message: '' + version: 1 meta: {} No Coupon Applied: example: @@ -2945,6 +2968,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:06:56+00:00' customer_message: '' + version: 1 meta: {} Include promotions: example: @@ -3039,6 +3063,7 @@ paths: - homepage - cartpage text: Some text + version: 1 meta: {} example-1: example: @@ -3232,6 +3257,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-unitTests: [] x-operation-settings: CollectParameters: false @@ -3243,7 +3271,10 @@ paths: tags: - Checkout Billing Address summary: Update Checkout Billing Address - description: Updates an existing billing address on a checkout. + description: |- + Updates an existing billing address on a checkout. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: updateCheckoutBillingAddress parameters: - $ref: '#/components/parameters/checkoutId' @@ -3403,6 +3434,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Selected Shipping Options: example: @@ -3516,6 +3548,7 @@ paths: created_time: '2019-08-05T15:38:14+00:00' updated_time: '2019-08-05T15:41:28+00:00' customer_message: '' + version: 1 meta: {} Coupon Applied: example: @@ -3629,6 +3662,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:08:01+00:00' customer_message: '' + version: 1 meta: {} No Coupon Applied: example: @@ -3715,6 +3749,7 @@ paths: created_time: '2021-11-08T22:46:23+00:00' updated_time: '2021-11-09T16:06:56+00:00' customer_message: '' + version: 1 meta: {} Include promotions: example: @@ -3809,6 +3844,7 @@ paths: - homepage - cartpage text: Some text + version: 1 meta: {} example-1: example: @@ -4002,6 +4038,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-unitTests: [] x-operation-settings: CollectParameters: false @@ -4017,7 +4056,7 @@ paths: Adds a new consignment to a checkout. - Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. For more information about working with consignments, see [Checkout consignment](/docs/storefront/cart-checkout/guide/consignments). @@ -4067,14 +4106,16 @@ paths: field_value: "string" line_items: - item_id: "118f8774-387c-485e-a095-6ef76d5f1bbd" - quantity: 1 + quantity: 1 + version: 1 Pickup Consignment: value: - line_items: - item_id: "118f8774-387c-485e-a095-6ef76d5f1bbd" quantity: 1 pickup_option: - pickup_method_id: 1 + pickup_method_id: 1 + version: 1 responses: '200': description: '' @@ -4817,6 +4858,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-unitTests: [] x-operation-settings: CollectParameters: false @@ -4848,7 +4892,7 @@ paths: To update an existing address and line item IDs, assign a new address and line item IDs by sending a `PUT` request. - Please note that this API endpoint is not concurrent safe, meaning multiple simultaneous requests could result in unexpected and inconsistent results. + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. 2. Assign a shipping option to the new consignment by sending a `PUT` request to update the consignment's `shipping_option_id` with a returned value from `data.consignments[N].available_shipping_option[N].id` obtained in Step One. @@ -5604,13 +5648,23 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' delete: tags: - Checkout Consignments summary: Delete Checkout Consignment description: |- Removes an existing consignment from a checkout. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: deleteCheckoutConsignment + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteConsignmentRequest' responses: '200': description: '' @@ -6353,6 +6407,7 @@ paths: - homepage - cartpage text: Some text + version: 1 '/checkouts/{checkoutId}/coupons': post: tags: @@ -6367,7 +6422,9 @@ paths: * coupon_code **Limits** - * Coupon codes have a 50-character limit. + * Coupon codes have a 50-character limit. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: addCheckoutCoupon parameters: - $ref: '#/components/parameters/checkoutId' @@ -7121,6 +7178,9 @@ paths: - homepage - cartpage text: Some text + version: 1 + '409': + $ref: '#/components/responses/CartConflictErrorResponse' x-unitTests: [] x-operation-settings: CollectParameters: false @@ -7132,7 +7192,10 @@ paths: tags: - Checkout Coupons summary: Delete Checkout Coupon - description: Deletes a coupon code from a checkout. + description: |- + Deletes a coupon code from a checkout. + + To prevent lost updates due to concurrent requests overriding changes made by others, it is recommended to enable optimistic concurrency control by including the `version` field in the request payload. If the provided version does not match the version on the server, a conflict error will be returned, which the client can handle accordingly. operationId: deleteCheckoutCoupon parameters: - $ref: '#/components/parameters/checkoutId' @@ -7143,6 +7206,11 @@ paths: required: true schema: type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteCouponCodeRequest' responses: '200': description: '' @@ -7693,6 +7761,8 @@ paths: - cartpage text: Some text meta: {} + '409': + $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/orders': post: tags: @@ -8646,6 +8716,10 @@ components: text: type: string description: Text of the banner. + version: + type: integer + description: The current version of the checkout. + example: 1 Checkout_Put: title: Checkout_Put required: @@ -8655,6 +8729,9 @@ components: customer_message: type: string description: '' + version: + type: integer + description: The expected version of the checkout. x-internal: false AppliedCoupon: title: Applied Coupon @@ -8737,6 +8814,9 @@ components: field_value: type: string description: 'This can also be an array for fields that need to support a list of values (e.g., a set of check boxes.)' + version: + type: integer + description: The expected version of the checkout. x-internal: false CreateConsignmentRequest: title: Create Consignment Request @@ -8827,7 +8907,18 @@ components: properties: pickup_method_id: type: integer - example: 1 + example: 1 + version: + type: integer + description: The expected version of the checkout. + x-internal: false + DeleteConsignmentRequest: + title: Delete Consignment Request + type: object + properties: + version: + type: integer + description: The expected version of the checkout. x-internal: false UpdateConsignmentRequest: title: Update Consignment Request @@ -8925,6 +9016,9 @@ components: description: type: string example: "custom shipping" + version: + type: integer + description: The expected version of the checkout. description: One or more of these three fields are mandatory. `address` and `line_items` can be updated in one request. `shipping_option_id` has to be updated in a separate request because changing the address or line items can invalidate the previously available shipping options. x-internal: false CouponCodeRequest: @@ -8934,6 +9028,17 @@ components: coupon_code: type: string description: Coupon codes have a 50-character limit. + version: + type: integer + description: The expected version of the checkout. + x-internal: false + DeleteCouponCodeRequest: + title: Delete Coupon Request + type: object + properties: + version: + type: integer + description: The expected version of the checkout. x-internal: false Order: title: Order @@ -9725,6 +9830,24 @@ components: - homepage - cartpage text: Some text + version: 1 + CartConflictErrorResponse: + description: 'Cart conflict' + content: + application/json: + schema: + type: object + properties: + status: + type: integer + title: + type: string + type: + type: string + example: + status: 409 + title: The request cannot be processed due to a possible conflict. Please review the changes and try again. + type: https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes checkout_settings_resp: description: '' content: From 1e38c4d046f52a7033a66d5b9cce966f10d80606 Mon Sep 17 00:00:00 2001 From: Shayne Gabor Even <109577044+BC-SEven@users.noreply.github.com> Date: Wed, 14 Aug 2024 00:34:51 +1000 Subject: [PATCH 145/221] docs(orders): ORDERS-6461 clarify PUT discounts behaviour (#445) <!-- Ticket number or summary of work --> # ORDERS-6461 ## What changed? <!-- Provide a bulleted list in the present tense --> * Correct behaviour for orders PUT. Old description implied discounts are wiped on the whole order when in reality we only wipe discounts off the line items changed in the request. ## Release notes draft None ## Anything else? ping @bigcommerce/team-orders --- reference/orders.v2.oas2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index b444e0bf5..ddbb58ee9 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -97,7 +97,7 @@ paths: To remove a product from an order, set that product’s `quantity` to `0`. - After the update, the PUT request clears all discounts and promotions applied to the order. Since the order data syncs with other ERP systems, like Amazon or eBay, the updated order returns to the default setting, removing any applied discounts. + After the update, the PUT request clears all discounts and promotions applied to the changed order line items. Since the order data syncs with other ERP systems, like Amazon or eBay, the updated order returns to the default setting, removing any applied discounts. To learn more about creating or updating orders, see [Orders Overview](/docs/store-operations/orders). summary: Update an Order From 2ceb72d89a9686f1a6baa6a1ee12955e085520db Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Tue, 13 Aug 2024 12:03:27 -0500 Subject: [PATCH 146/221] [DEVDOCS-6071]: [update] B2B-Edition, MDX style guide corrections (#438) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6071](/https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6071) ## What changed? <!-- Provide a bulleted list in the present tense --> * Apply style guide to the mdx files in our B2B Edition docs. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * No release note needed at this time. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6071]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6071?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/b2b-edition/about/api-status-codes.mdx | 14 +++++++------- docs/b2b-edition/about/index.mdx | 6 +++--- docs/b2b-edition/authentication/headless-auth.mdx | 4 ++-- docs/b2b-edition/authentication/hosted-auth.mdx | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/b2b-edition/about/api-status-codes.mdx b/docs/b2b-edition/about/api-status-codes.mdx index 7342899d0..a75ab3426 100644 --- a/docs/b2b-edition/about/api-status-codes.mdx +++ b/docs/b2b-edition/about/api-status-codes.mdx @@ -1,4 +1,4 @@ -# API Status Codes +# API status codes The BigCommerce B2B Edition APIs use standard HTTP response status codes. When there's an error, the response body also contains an error message to help resolve the problem. @@ -7,7 +7,7 @@ The BigCommerce B2B Edition APIs use standard HTTP response status codes. When t 2xx codes are returned for requests that the server understood and processed successfully. | Code | Text | Purpose | -|-|-|-| +|:-|:-|:-| | **200** | **OK** | For successful `GET` and `PUT` requests. | | **201** | **Created** | For a successful `POST` request. | | **202** | **Accepted** | For a request that created a scheduled task to perform the actual request. | @@ -18,16 +18,16 @@ The BigCommerce B2B Edition APIs use standard HTTP response status codes. When t 3xx codes are returned for requests that require further action. | Code | Text | Purpose | -|-|-|-| +|:-|:-|:-| | **301** | **Moved Permanently** | When the API routes have changed, or the incoming request uses an insecure protocol such as `http`, the request will be redirected to the secure (`https`) version of the current API route. | -| **304** | **Not Modified** | This status code will be returned if the request included an `If-Modified-Since` header, but the resource has *not* been modified since the specified date.| +| **304** | **Not Modified** | This status code will be returned if the request includes an `If-Modified-Since` header, but the resource has *not* been modified since the specified date.| ## 4xx Client Error 4xx codes are returned for requests that could not be processed because there were problems with the request or the data. | Code | Text | Purpose | -|-|-|-| +|:-|:-|:-| | **400** | **Bad Request** | Issued when a malformed request was sent. | **401** | **Unauthorized** | This response is sent when your client failed to provide credentials or its credentials were invalid. | | **403** | **Forbidden** | Returned when permissions do not allow the operation. @@ -45,7 +45,7 @@ The BigCommerce B2B Edition APIs use standard HTTP response status codes. When t 5xx codes are returned for requests that could not be processed because there was an internal error with the API or server. | Code | Text | Purpose | -|-|-|-| +|:-|:-|:-| | **500** | **Internal Server Error** | When an error has occurred within the API. | | **501** | **Not Implemented** | When a request method is sent that is not supported by the API, such as `TRACE` or `PATCH`. | | **503** | **Service Unavailable** | When the store is “Down for Maintenance”, being upgraded to a new version, or is suspended due to administrative action or a billing issue.| @@ -54,7 +54,7 @@ The BigCommerce B2B Edition APIs use standard HTTP response status codes. When t ## Troubleshooting | Code | Common Causes | Solutions | -|-|-|-| +|:-|:-|:-| |**204**, **301**, and **302**| Redirects | Try the `www` or non-`www` version of the URL. | |**400**|Invalid syntax, required data missing, `Content-Type` header missing|Double-check request body for syntax errors and missing data; check the `Content-Type` header. | |**401** |API credentials are missing or invalid.|Double-check the `authToken`. Send cURL request with the same credentials to rule out app or config issues. | diff --git a/docs/b2b-edition/about/index.mdx b/docs/b2b-edition/about/index.mdx index d45558c31..c3a7841e8 100644 --- a/docs/b2b-edition/about/index.mdx +++ b/docs/b2b-edition/about/index.mdx @@ -5,7 +5,7 @@ Make BigCommerce B2B Edition API requests in the context of the storefront or server-to-server. | API | Base URL | -| -- | -- | +|:--|:--| | GraphQL Storefront API | `https://api-b2b.bigcommerce.com/graphql` | | REST Storefront API | See [endpoint reference](https://bundleb2b.stoplight.io/docs/openapi/rest-storefront/catalog) | | REST Management V3 | `https://api-b2b.bigcommerce.com/api/v3/io/`| @@ -18,7 +18,7 @@ Make BigCommerce B2B Edition API requests in the context of the storefront or se ## Key resources | Resource | Description | -|--|--| +|:--|:--| | [Company](https://bundleb2b.stoplight.io/docs/openapi/rest-management/company/operations/create-a-company#request-body) | Set client company info, administrator, and more. | | [Address](https://bundleb2b.stoplight.io/docs/openapi/rest-management/address/operations/list-addresses#response-body) | Associate one or more addresses with a company. | | [Order](https://bundleb2b.stoplight.io/docs/openapi/rest-management/orders/operations/get-a-order#response-body) | Extend the BigCommerce order object with B2B-specific information, such as purchase order number. | @@ -48,4 +48,4 @@ For example, passing the following query param string returns the 11th through 2 BundleB2B was a purpose-built application that powered BigCommerce's original B2B Edition offering. -In 2021, we acquired BundleB2B. Since that time, we've been integrating the BundleB2B API and features into our core product offerings. We continue to use the BundleB2B domain to prevent breaking changes for existing integrations. Our roadmap includes plans to use a new core BigCommerce domain to host our B2B Edition APIs. +In 2021, BigCommerce acquired BundleB2B. Since that time, we've been integrating the BundleB2B API and features into our core product offerings. We continue to use the BundleB2B domain to prevent breaking changes for existing integrations. Our roadmap includes plans to use a new core BigCommerce domain to host our B2B Edition APIs. `{*Does this need updating?*}` diff --git a/docs/b2b-edition/authentication/headless-auth.mdx b/docs/b2b-edition/authentication/headless-auth.mdx index 241456b0d..96d98485d 100644 --- a/docs/b2b-edition/authentication/headless-auth.mdx +++ b/docs/b2b-edition/authentication/headless-auth.mdx @@ -28,8 +28,8 @@ Content-Type: application/json b2b.utils.user.loginWithB2BStorefrontToken(authTokenFromPreviousStep); ``` -### Sign the customer in to BigCommerce +### Sign the customer into BigCommerce -The two preceding steps sign the customer in to B2B Edition. For the quote, cart, and checkout features to function, you must also sign the customer in to BigCommerce. You can do this using the [login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in), which is part of the GraphQL Storefront API. +The two preceding steps sign the customer into B2B Edition. For the quote, cart, and checkout features to function, you must also sign the customer into BigCommerce. You can do this using the [login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in), which is part of the GraphQL Storefront API. </Steps> diff --git a/docs/b2b-edition/authentication/hosted-auth.mdx b/docs/b2b-edition/authentication/hosted-auth.mdx index a1045c704..199223f18 100644 --- a/docs/b2b-edition/authentication/hosted-auth.mdx +++ b/docs/b2b-edition/authentication/hosted-auth.mdx @@ -4,7 +4,7 @@ B2B Edition has four APIs that let you manage data, log in customers, make clien ## REST Management API -B2B Edition's REST Management API require you to create and pass a token along with the request using the `authToken` header. +B2B Edition's REST Management APIs require you to create and pass a token along with the request using the `authToken` header. For the REST Management V3 API, create an auth token using the [Create a server-to-server token](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/create-a-auth-backend) endpoint. @@ -24,7 +24,7 @@ If your request is successful, BigCommerce returns a current customer [JSON web After you receive the current customer JWT, make a request to the B2B Edition [Get a storefront OpenAPI authtoken](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/get-a-auth-storefront) endpoint. Use the current customer JWT as the value of the `jwtToken` query parameter. -A successful request to the [Get a storefront OpenAPI authtoken](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/get-a-auth-storefront) endpoint returns a B2B Edition REST Storefront API token, which you can pass as value of the `authToken` header in requests to the B2B Edition REST Storefront API. +A successful request to the [Get a storefront OpenAPI authtoken](https://bundleb2b.stoplight.io/docs/openapi/rest-management/auth/operations/get-a-auth-storefront) endpoint returns a B2B Edition REST Storefront API token, which you can pass as a value of the `authToken` header in requests to the B2B Edition REST Storefront API. ```curl filename="Example token request (CURL)" copy curl https://api-b2b.bigcommerce.com/api/io/auth/storefront?jwtToken=bigCommerce.currentCustomerResponse.jwtString From bea0d55c558b96685e3bc834f22e915413d1ede8 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:36:20 +0100 Subject: [PATCH 147/221] [DEVDOCS-6031] Add undocumented event types (#385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6031] Webhooks reference overhaul - Add undocumented event types ## What changed? <!-- Provide a bulleted list in the present tense --> * Added the following events to the _all.yml list. * Added a file for each of the following events, with accurate payload data. store/customer/channel/login/access/updated store/priceList/created store/priceList/activated store/priceList/deactivated store/priceList/assignment/updated store/priceList/record/created store/priceList/record/updated store/priceList/record/deleted store/priceList/records/created store/priceList/records/updated store/priceList/records/deleted store/redirects/updated store/store/metafield/created store/store/metafield/updated store/store/metafield/deleted ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Added undocumented events for: * Customer channel login access updates * Price lists, price list assignments and price list records * 301 redirects * Store metafields ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {@bc-traciporter} [DEVDOCS-6031]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6031?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- docs/webhooks/callbacks/_all.yml | 90 +++++++++++++++++++ ..._customer_channel_login_access_updated.yml | 25 ++++++ .../callbacks/store_priceList_activated.yml | 21 +++++ .../store_priceList_assignment_updated.yml | 25 ++++++ .../callbacks/store_priceList_created.yml | 21 +++++ .../callbacks/store_priceList_deactivated.yml | 21 +++++ .../store_priceList_record_created.yml | 25 ++++++ .../store_priceList_record_deleted.yml | 25 ++++++ .../store_priceList_record_updated.yml | 25 ++++++ .../store_priceList_records_created.yml | 27 ++++++ .../store_priceList_records_deleted.yml | 27 ++++++ .../store_priceList_records_updated.yml | 27 ++++++ .../callbacks/store_redirects_updated.yml | 37 ++++++++ .../store_store_metafield_created.yml | 26 ++++++ .../store_store_metafield_deleted.yml | 26 ++++++ .../store_store_metafield_updated.yml | 26 ++++++ 16 files changed, 474 insertions(+) create mode 100644 docs/webhooks/callbacks/store_customer_channel_login_access_updated.yml create mode 100644 docs/webhooks/callbacks/store_priceList_activated.yml create mode 100644 docs/webhooks/callbacks/store_priceList_assignment_updated.yml create mode 100644 docs/webhooks/callbacks/store_priceList_created.yml create mode 100644 docs/webhooks/callbacks/store_priceList_deactivated.yml create mode 100644 docs/webhooks/callbacks/store_priceList_record_created.yml create mode 100644 docs/webhooks/callbacks/store_priceList_record_deleted.yml create mode 100644 docs/webhooks/callbacks/store_priceList_record_updated.yml create mode 100644 docs/webhooks/callbacks/store_priceList_records_created.yml create mode 100644 docs/webhooks/callbacks/store_priceList_records_deleted.yml create mode 100644 docs/webhooks/callbacks/store_priceList_records_updated.yml create mode 100644 docs/webhooks/callbacks/store_redirects_updated.yml create mode 100644 docs/webhooks/callbacks/store_store_metafield_created.yml create mode 100644 docs/webhooks/callbacks/store_store_metafield_deleted.yml create mode 100644 docs/webhooks/callbacks/store_store_metafield_updated.yml diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index 781c30a2d..17d63ea3f 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -192,6 +192,12 @@ properties: properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_address_updated.yml + store/customer/channel/login/access/updated: + description: Fires when you change the channel access of a customer (`channel_ids` array). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_customer_channel_login_access_updated.yml store/customer/created: description: Fires when a new customer is created. type: object @@ -344,6 +350,66 @@ properties: properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_updated.yml + store/priceList/activated: + description: Fires when you activate a price list, or create one with `active: true`. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_activated.yml + store/priceList/assignment/updated: + description: Fires when you update a price list assignment. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_assignment_updated.yml + store/priceList/created: + description: Fires when you create a new price list. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_created.yml + store/priceList/deactivated: + description: Fires when you deactivate a price list, or create it with `active: false`. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_deactivated.yml + store/priceList/record/created: + description: Fires when you create a single price list record using [Set Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#set-price-list-record-by-currency-code). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_record_created.yml + store/priceList/record/deleted: + description: Fires when you delete a single price list record using [Delete Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#delete-a-price-record-by-currency-code). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_record_deleted.yml + store/priceList/record/updated: + description: Fires when you update a single price list record using [Set Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#set-price-list-record-by-currency-code). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_record_updated.yml + store/priceList/records/created: + description: Fires when you create one or more price list record(s). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_records_created.yml + store/priceList/records/deleted: + description: Fires when you delete one or more price list record(s). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_records_deleted.yml + store/priceList/records/updated: + description: Fires when you update one or more price list record(s). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_records_updated.yml store/product/created: description: Fires when new product is created. type: object @@ -418,6 +484,12 @@ properties: properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_variant_metafield_updated.yml + store/redirects/updated: + description: Fires when you update a 301 redirect. + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_redirects_updated.yml store/shipment/created: description: Fires when a shipment is created. type: object @@ -474,6 +546,24 @@ properties: properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_sku_updated.yml + store/store/metafield/created: + description: Fires when you create a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_store_metafield_created.yml + store/store/metafield/deleted: + description: Fires when you delete a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_store_metafield_deleted.yml + store/store/metafield/updated: + description: Fires when you update a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + allOf: + - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_store_metafield_updated.yml store/subscriber/created: description: Fires when a subscriber is created. type: object diff --git a/docs/webhooks/callbacks/store_customer_channel_login_access_updated.yml b/docs/webhooks/callbacks/store_customer_channel_login_access_updated.yml new file mode 100644 index 000000000..003914c1c --- /dev/null +++ b/docs/webhooks/callbacks/store_customer_channel_login_access_updated.yml @@ -0,0 +1,25 @@ +type: object +properties: + store/customer/channel/login/access/updated: + description: Fires only when you use an API to change the channel access of a customer (`channel_ids` array). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + customer_id: + type: integer + channel_ids: + type: array + items: + type: integer diff --git a/docs/webhooks/callbacks/store_priceList_activated.yml b/docs/webhooks/callbacks/store_priceList_activated.yml new file mode 100644 index 000000000..010c1587b --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_activated.yml @@ -0,0 +1,21 @@ +type: object +properties: + store/priceList/activated: + description: Fires when you activate a price list, or create one with `active: true`. + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer diff --git a/docs/webhooks/callbacks/store_priceList_assignment_updated.yml b/docs/webhooks/callbacks/store_priceList_assignment_updated.yml new file mode 100644 index 000000000..0a06426e6 --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_assignment_updated.yml @@ -0,0 +1,25 @@ +type: object +properties: + store/priceList/assignment/updated: + description: Fires when you update a price list assignment. + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer + channel_id: + type: integer + customer_group_id: + type: integer diff --git a/docs/webhooks/callbacks/store_priceList_created.yml b/docs/webhooks/callbacks/store_priceList_created.yml new file mode 100644 index 000000000..6516c9691 --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_created.yml @@ -0,0 +1,21 @@ +type: object +properties: + store/priceList/created: + description: Fires when you create a new price list. + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer diff --git a/docs/webhooks/callbacks/store_priceList_deactivated.yml b/docs/webhooks/callbacks/store_priceList_deactivated.yml new file mode 100644 index 000000000..2b31bd0fe --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_deactivated.yml @@ -0,0 +1,21 @@ +type: object +properties: + store/priceList/deactivated: + description: Fires when you deactivate a price list, or create one with `active: false`. + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer diff --git a/docs/webhooks/callbacks/store_priceList_record_created.yml b/docs/webhooks/callbacks/store_priceList_record_created.yml new file mode 100644 index 000000000..a00df3e97 --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_record_created.yml @@ -0,0 +1,25 @@ +type: object +properties: + store/priceList/record/created: + description: Fires when you create a single price list record using [Set Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#set-price-list-record-by-currency-code). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_priceList_record_deleted.yml b/docs/webhooks/callbacks/store_priceList_record_deleted.yml new file mode 100644 index 000000000..edfd7016c --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_record_deleted.yml @@ -0,0 +1,25 @@ +type: object +properties: + store/priceList/record/deleted: + description: Fires when you delete a single price list record using [Delete Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#delete-a-price-record-by-currency-code). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_priceList_record_updated.yml b/docs/webhooks/callbacks/store_priceList_record_updated.yml new file mode 100644 index 000000000..fdaa0822c --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_record_updated.yml @@ -0,0 +1,25 @@ +type: object +properties: + store/priceList/record/updated: + description: Fires when you update a single price list record using [Set Price List Record by Currency Code](/docs/rest-management/price-lists/price-lists-records#set-price-list-record-by-currency-code). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_priceList_records_created.yml b/docs/webhooks/callbacks/store_priceList_records_created.yml new file mode 100644 index 000000000..3c11df535 --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_records_created.yml @@ -0,0 +1,27 @@ +type: object +properties: + store/priceList/records/created: + description: Fires when you create one or more price list record(s). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: array + items: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_priceList_records_deleted.yml b/docs/webhooks/callbacks/store_priceList_records_deleted.yml new file mode 100644 index 000000000..9c6672cbc --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_records_deleted.yml @@ -0,0 +1,27 @@ +type: object +properties: + store/priceList/records/deleted: + description: Fires when you delete one or more price list record(s). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: array + items: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_priceList_records_updated.yml b/docs/webhooks/callbacks/store_priceList_records_updated.yml new file mode 100644 index 000000000..93999d483 --- /dev/null +++ b/docs/webhooks/callbacks/store_priceList_records_updated.yml @@ -0,0 +1,27 @@ +type: object +properties: + store/priceList/records/created: + description: Fires when you update one or more price list record(s). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: array + items: + type: object + properties: + price_list_id: + type: integer + variant_id: + type: integer + currency_code: + type: string diff --git a/docs/webhooks/callbacks/store_redirects_updated.yml b/docs/webhooks/callbacks/store_redirects_updated.yml new file mode 100644 index 000000000..214408f2f --- /dev/null +++ b/docs/webhooks/callbacks/store_redirects_updated.yml @@ -0,0 +1,37 @@ +type: object +properties: + store/redirects/updated: + description: Fires when you update a 301 redirect. + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + id: + type: integer + site_id: + type: integer + from_path: + type: string + to: + type: object + properties: + url: + type: string + description: Returned for manual redirects. + entity_id: + type: integer + description: Returned for dynamic redirects. + type: + type: string + description: Returned for dynamic redirects. diff --git a/docs/webhooks/callbacks/store_store_metafield_created.yml b/docs/webhooks/callbacks/store_store_metafield_created.yml new file mode 100644 index 000000000..2ecc72fb1 --- /dev/null +++ b/docs/webhooks/callbacks/store_store_metafield_created.yml @@ -0,0 +1,26 @@ +type: object +properties: + store/store/metafield/created: + description: Fires when you create a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + metafield_id: + type: integer + resource_id: + type: string + namespace: + type: string + diff --git a/docs/webhooks/callbacks/store_store_metafield_deleted.yml b/docs/webhooks/callbacks/store_store_metafield_deleted.yml new file mode 100644 index 000000000..cbab81f0c --- /dev/null +++ b/docs/webhooks/callbacks/store_store_metafield_deleted.yml @@ -0,0 +1,26 @@ +type: object +properties: + store/store/metafield/deleted: + description: Fires when you delete a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + metafield_id: + type: integer + resource_id: + type: string + namespace: + type: string + diff --git a/docs/webhooks/callbacks/store_store_metafield_updated.yml b/docs/webhooks/callbacks/store_store_metafield_updated.yml new file mode 100644 index 000000000..fd54e5a56 --- /dev/null +++ b/docs/webhooks/callbacks/store_store_metafield_updated.yml @@ -0,0 +1,26 @@ +type: object +properties: + store/store/metafield/updated: + description: Fires when you update a store metafield using [Admin GraphQL](/graphql-admin/reference#definition-MetafieldMutations). + type: object + properties: + producer: + type: string + hash: + type: string + created_at: + type: integer + store_id: + type: string + scope: + type: string + data: + type: object + properties: + metafield_id: + type: integer + resource_id: + type: string + namespace: + type: string + From 19ed454218fb314eecfee66b65457e30055ec647 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 14 Aug 2024 16:13:38 +0300 Subject: [PATCH 148/221] Revert "Revert "DEVDOCS-6015: [Update] upc, mpn, gtin (#401)"" (#441) Reverts bigcommerce/docs#422 --- .../catalog/product-variants_catalog.v3.yml | 24 ++++++++++++++--- reference/catalog/products_catalog.v3.yml | 26 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 7627a6dab..401a9090a 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -1132,7 +1132,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: true + maxLength: 14 + minLength: 0 inventory_level: type: integer description: |- @@ -1347,7 +1349,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: true + maxLength: 14 + minLength: 0 example: "1234" inventory_level: type: integer @@ -1472,7 +1476,9 @@ paths: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - x-nullable: true + nullable: true + maxLength: 14 + minLength: 0 inventory_level: type: integer description: |- @@ -1990,6 +1996,8 @@ components: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. nullable: true + maxLength: 14 + minLength: 0 image_url: type: string description: Publicly available image url @@ -2019,9 +2027,13 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. + nullable: true gtin: type: string example: '012345678905' + nullable: true + maxLength: 14 + minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -2187,6 +2199,8 @@ components: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. nullable: true + maxLength: 14 + minLength: 0 inventory_level: type: integer description: |- @@ -2217,10 +2231,14 @@ components: type: string description: Global Trade Item Number example: '012345678905' + nullable: true + maxLength: 14 + minLength: 0 mpn: type: string description: Manufacturer Part Number example: HV-HM02 + nullable: true description: Common Variant properties. - type: object properties: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 0e610fa36..67c236c42 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -5379,7 +5379,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 14 + minLength: 0 inventory_level: type: integer description: |- @@ -5406,9 +5408,13 @@ components: mpn: type: string description: The Manufacturer Part Number (MPN) for the variant. + nullable: false gtin: type: string example: '012345678905' + nullable: false + maxLength: 14 + minLength: 0 description: Common Variant properties. x-internal: false x-examples: @@ -5574,7 +5580,9 @@ components: upc: type: string description: The UPC code used in feeds for shopping comparison sites and external channel integrations. - nullable: true + nullable: false + maxLength: 14 + minLength: 0 inventory_level: type: integer description: |- @@ -7134,8 +7142,9 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 32 + maxLength: 14 minLength: 0 + nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7300,9 +7309,13 @@ components: gtin: type: string description: Global Trade Item Number + nullable: false + maxLength: 14 + minLength: 0 mpn: type: string description: Manufacturer Part Number + nullable: false date_last_imported: type: string description: the date when the Product had been imported @@ -7622,8 +7635,9 @@ components: The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. For stores with a Stencil theme applied, see [Custom Template Associations](/docs/rest-content/custom-template-associations). upc: type: string - maxLength: 32 + maxLength: 14 minLength: 0 + nullable: false description: | The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. search_keywords: @@ -7788,9 +7802,13 @@ components: gtin: type: string description: Global Trade Item Number + nullable: false + maxLength: 14 + minLength: 0 mpn: type: string description: Manufacturer Part Number + nullable: false date_last_imported: type: string description: the date when the Product had been imported From 4328ab775c2364f467e69e89df3b822280b6a815 Mon Sep 17 00:00:00 2001 From: David Chin <davidchin.yf@gmail.com> Date: Thu, 15 Aug 2024 00:21:26 +1000 Subject: [PATCH 149/221] DEVDOCS-6022: Add example value to version field for cart/checkout API (#449) <!-- Ticket number or summary of work --> # [DEVDOCS-6022] ## What changed? <!-- Provide a bulleted list in the present tense --> * Add `example` to `version` field for cart/checkout API. Otherwise, it shows up as `version: 0`, which is an invalid value. ## Release notes draft N/A ## Anything else? Related PR: https://github.com/bigcommerce/docs/pull/439 ping @bigcommerce/dev-docs [DEVDOCS-6022]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6022?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- reference/carts.sf.yml | 7 +++++++ reference/carts.v3.yml | 4 ++++ reference/checkouts.sf.yml | 7 +++++++ reference/checkouts.v3.yml | 8 ++++++++ 4 files changed, 26 insertions(+) diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 923d58f32..3e443b4a4 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -531,6 +531,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - lineItems - type: object @@ -542,6 +543,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - giftCertificates - type: object @@ -555,6 +557,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - lineItems - giftCertificates @@ -570,6 +573,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - lineItem title: Line item @@ -580,6 +584,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - giftCertificates title: Gift certificate item @@ -592,6 +597,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 required: - lineItem - giftCertificates @@ -603,6 +609,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 responseCartCurrency: title: Currency type: object diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index c11475bd8..d308ba3b2 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -1525,6 +1525,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 title: Cart Update Put Request Data x-internal: false LineItemRequestData: @@ -2893,12 +2894,14 @@ components: version: type: integer description: The expected version of the cart. + example: 1 CartLineItemDelete: type: object properties: version: type: integer description: The expected version of the cart. + example: 1 Redirect_urls_Post: type: object title: Redirect_urls_Post @@ -2981,6 +2984,7 @@ components: version: type: integer description: The expected version of the cart. + example: 1 cart_PostCustomItem: type: array title: Custom item diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index 81524c2c1..e77b9d2bf 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -1813,6 +1813,7 @@ paths: version: type: integer description: The expected version of the checkout. + example: 1 required: true responses: '200': @@ -2501,6 +2502,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false consignment_Full: title: consignment_Full @@ -2623,6 +2625,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false checkouts_Resp: title: checkouts_Resp @@ -3532,6 +3535,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false DeleteCouponCodeRequest: title: Delete Coupon Request @@ -3540,6 +3544,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false DeleteConsignmentRequest: title: Delete Consignment Request @@ -3548,6 +3553,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false GiftCertificateRequest: title: Gift Certificate Request @@ -3657,6 +3663,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 description: One or more of these three fields is mandatory. You can update address and line items in one request. You have to update shipping option ID or pickup option ID in a separate request since changing the address or line items can invalidate the previously available shipping options. x-internal: false checkoutCart: diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index b8d725c31..2e5592bc5 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -1656,6 +1656,7 @@ paths: version: type: integer description: The expected version of the checkout. + example: 1 example: cart: discounts: @@ -8732,6 +8733,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false AppliedCoupon: title: Applied Coupon @@ -8817,6 +8819,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false CreateConsignmentRequest: title: Create Consignment Request @@ -8911,6 +8914,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false DeleteConsignmentRequest: title: Delete Consignment Request @@ -8919,6 +8923,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false UpdateConsignmentRequest: title: Update Consignment Request @@ -9019,6 +9024,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 description: One or more of these three fields are mandatory. `address` and `line_items` can be updated in one request. `shipping_option_id` has to be updated in a separate request because changing the address or line items can invalidate the previously available shipping options. x-internal: false CouponCodeRequest: @@ -9031,6 +9037,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false DeleteCouponCodeRequest: title: Delete Coupon Request @@ -9039,6 +9046,7 @@ components: version: type: integer description: The expected version of the checkout. + example: 1 x-internal: false Order: title: Order From 90e93c23c6868e3cf2d163f623e123a56691675b Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Wed, 14 Aug 2024 11:46:55 -0400 Subject: [PATCH 150/221] Add deprecation notice to v2 B2B API endpoints (yaml) (#450) ## What changed? Updated the B2B v2 APIs yaml spec with deprecation notices. ## Release notes draft Now that the v3 B2B APIs are widely released, we've deprecated our set of v2 B2B endpoints. --- docs/b2b-edition/specs/api-v2/openAPI.yaml | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/b2b-edition/specs/api-v2/openAPI.yaml b/docs/b2b-edition/specs/api-v2/openAPI.yaml index 291a769da..632f2404a 100644 --- a/docs/b2b-edition/specs/api-v2/openAPI.yaml +++ b/docs/b2b-edition/specs/api-v2/openAPI.yaml @@ -20,6 +20,7 @@ paths: get: tags: - Address + deprecated: true summary: Convert Country State description: Convert country/state name to their code or code to name operationId: addresses_country_state_list @@ -155,6 +156,7 @@ paths: post: tags: - Company + deprecated: true summary: Create Company From CG description: Create company from bigCommerce customer group. This API only enable for non-MSF store. @@ -443,6 +445,7 @@ paths: post: tags: - Order + deprecated: true summary: Create Order Without CompanyID description: "Create an order from bigCommerce, you must known order id" operationId: companies_users_orders_create @@ -609,6 +612,7 @@ paths: get: tags: - Address + deprecated: true summary: Get Company Addresses description: Get all addresses for a company operationId: companies_addresses_list @@ -877,6 +881,7 @@ paths: post: tags: - Address + deprecated: true summary: Create A Company Address description: "Creates a new address for a company. You will specify the address\ \ fields and the type of address. The address can be billing, shipping, or\ @@ -1129,6 +1134,7 @@ paths: get: tags: - Address + deprecated: true summary: Get A Company Address description: Get an address for a company operationId: companies_addresses_read @@ -1318,6 +1324,7 @@ paths: put: tags: - Address + deprecated: true summary: Update A Company Address description: "Updates an address for a company. You can change whether the address\ \ is for billing, shipping, or both. You can also update the address to be\ @@ -1570,6 +1577,7 @@ paths: delete: tags: - Address + deprecated: true summary: Delete A Company Address description: Deletes an address from a company. operationId: companies_addresses_delete @@ -1679,6 +1687,7 @@ paths: get: tags: - Company + deprecated: true summary: Get Company Basic Information description: Get company's basic information operationId: companies_basic-info_list @@ -1875,6 +1884,7 @@ paths: put: tags: - Company + deprecated: true summary: Update Company Basic Information description: "Update a company's basic info, you can update on or more options" operationId: companies_basic-info_update @@ -2106,6 +2116,7 @@ paths: delete: tags: - Company + deprecated: true summary: Delete Company With Related description: Force Delete A Company and its Related Information. operationId: companies_force-del_delete @@ -2210,6 +2221,7 @@ paths: get: tags: - Company + deprecated: true summary: Get BC Order Id List By Company Id description: Get bC order ID list by company id operationId: companies_orderBCIds_list @@ -2360,6 +2372,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Company Orders description: "Get company all orders, with pagination data" operationId: companies_orders_list @@ -2637,6 +2650,7 @@ paths: get: tags: - Payment + deprecated: true summary: Get Company Payments Methods description: "Get company payments methods, include inactive" operationId: companies_payments_list @@ -2747,6 +2761,7 @@ paths: put: tags: - Payment + deprecated: true summary: Update Company Payments Methods description: "Update Company payments methods' status, change them active or\ \ not" @@ -2925,6 +2940,7 @@ paths: get: tags: - SalesRep + deprecated: true summary: Get Company Sales Reps description: Get company sales reps' basic info operationId: companies_sales-reps_list @@ -3039,6 +3055,7 @@ paths: put: tags: - SalesRep + deprecated: true summary: Update Company Sales reps description: Update company reps operationId: companies_sales-reps_update @@ -3203,6 +3220,7 @@ paths: post: tags: - Order + deprecated: true summary: Create An Order description: "Create an order from bigCommerce, you must known order id" operationId: companies_user_orders_create @@ -3374,6 +3392,7 @@ paths: put: tags: - User + deprecated: true summary: Update A Company User description: Update a company user info operationId: companies_user_update @@ -3457,6 +3476,7 @@ paths: get: tags: - User + deprecated: true summary: Get Company Users description: "Get company users, with pagination data" operationId: companies_users_list @@ -3678,6 +3698,7 @@ paths: put: tags: - User + deprecated: true summary: Update Company User description: "Update company user's field, user identified by email field.fields\ \ can not omit" @@ -3872,6 +3893,7 @@ paths: post: tags: - User + deprecated: true summary: Create A Company User description: "Create a company user, which belongs company" operationId: companies_users_create @@ -4074,6 +4096,7 @@ paths: post: tags: - User + deprecated: true summary: Bulk Create Company User description: Create company users in batch operationId: companies_users_bulk_create_create @@ -4354,6 +4377,7 @@ paths: get: tags: - User + deprecated: true summary: Get A Company User description: "Get a company user's info, by company and customer id" operationId: companies_users_read @@ -4534,6 +4558,7 @@ paths: delete: tags: - User + deprecated: true summary: Delete A Company User description: "Delete a company user, if this user is the only one administrator\ \ of company, will return a 500 Error" @@ -4644,6 +4669,7 @@ paths: put: tags: - Order + deprecated: true summary: Update Company Order With BC OrderId description: "Update order, billingAddress and products can not be omitted.\ \ products can be two format. \n 1. Product with variants. \n 2. Base product" @@ -5053,6 +5079,7 @@ paths: put: tags: - Order + deprecated: true summary: Update B2BE User's Orders' company attribute. description: Update the orders belong to a B2BE company to another B2BE company. operationId: orders_company_update @@ -5179,6 +5206,7 @@ paths: post: tags: - Order + deprecated: true summary: Update BC Order's 'Company attribute' description: "Add Company identifier for BigCommerce Customer Individual Orders,\ \ which can be used to convert BigCommerce Customer Individual Orders to Company-level\ @@ -5301,6 +5329,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Orders Images description: Get all orders' images operationId: orders_images_list @@ -5388,6 +5417,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Company By BC OrderId description: Get company basic info by bc order id operationId: orders_companyIdBCId_list @@ -5541,6 +5571,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Company Id By Order Id description: Get company ID by order id operationId: orders_companyId_list @@ -5621,6 +5652,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Order Detail description: Get order's Detail operationId: orders_details_list @@ -6425,6 +6457,7 @@ paths: get: tags: - Order + deprecated: true summary: Get Order Product description: Get order's products info operationId: orders_products_list @@ -6549,6 +6582,7 @@ paths: post: tags: - Proxy + deprecated: true summary: Third party API proxy description: Get response data of third party APIs through this API. operationId: proxy_create @@ -6668,6 +6702,7 @@ paths: get: tags: - SalesRep + deprecated: true summary: Get Companies & Sales reps description: "Get all companies and their sales reps, default order by company" operationId: sales-reps_companies_list @@ -6847,6 +6882,7 @@ paths: get: tags: - Payment + deprecated: true summary: Get Store's All Payments description: Get store's all payments operationId: store_payments_list @@ -6942,6 +6978,7 @@ paths: get: tags: - Company + deprecated: true summary: Get Company By CustomerId description: "Get company by customer Id, if company not in bigCommerce will\ \ delete the company" From 46d06474f46b9860310987f87d861d6227bd16d2 Mon Sep 17 00:00:00 2001 From: NataliiaNefodova <83062053+NataliiaNefodova@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:55:19 +0200 Subject: [PATCH 151/221] CATALOG-10408: [update] Categories: fix of schema (#436) # [CATALOG-10408] ## What changed? * remove "readOnly" property from "category_id" schema ## Release notes draft * No release note required ## Anything else? ping @NataliiaNefodova [CATALOG-10408]: https://bigcommercecloud.atlassian.net/browse/CATALOG-10408?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/category-trees_catalog.v3.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/reference/catalog/category-trees_catalog.v3.yml b/reference/catalog/category-trees_catalog.v3.yml index 5163e70ff..c81708ee8 100644 --- a/reference/catalog/category-trees_catalog.v3.yml +++ b/reference/catalog/category-trees_catalog.v3.yml @@ -177,7 +177,6 @@ paths: total: 1 success: 1 failed: 0 - '207': description: Multi-Status content: @@ -206,7 +205,7 @@ paths: description: |- Updates existing categories. - To update a specific category in a tree, provide a category id. + To update a specific category in a tree, provide a `category id`. parameters: - $ref: '#/components/parameters/ContentType' tags: @@ -295,7 +294,7 @@ paths: description: List of category trees. content: application/json: - schema: + schema: $ref: '#/components/schemas/CategoryTreeList' example: data: @@ -609,7 +608,7 @@ components: $ref: '#/components/schemas/GetCategories' meta: $ref: '#/components/schemas/MetaPagination' - CategoryNodeTree: + CategoryNodeTree: type: object properties: data: @@ -915,8 +914,6 @@ components: type: integer description: |- Unique ID of the *Category*. Increments sequentially. - Read-Only. - readOnly: true example: 36 parent_id: title: Parent ID From 64fd8a2a0e798a6851b104788e00de03b4611515 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Wed, 14 Aug 2024 16:30:04 -0500 Subject: [PATCH 152/221] [DEVDOCS-5928]: [revise] CustomersV3, Removed array type from Get a Customer Metafield Body request and response (#427) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-5928] ## What changed? <!-- Provide a bulleted list in the present tense --> * Removed the array from the schema allowing for a successful response. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Removed array type from the "Get a Customer Metafield" request and response in CustomersV3 API for improved accuracy and consistency. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bc-juliantran [DEVDOCS-5928]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5928?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/customers.v3.yml | 186 ++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 94 deletions(-) diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 4087be71c..468b0c3bc 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -3071,100 +3071,98 @@ components: schema: type: object properties: - data: - type: array - items: - type: object - properties: - id: - type: integer - description: Unique ID of the *Metafield*. Read-Only. - readOnly: true - example: 0 - key: - type: string - description: The key for the metafields. - example: Staff Name - value: - type: string - description: The description for the metafield. - example: Ronaldo - namespace: - type: string - description: | - Namespace for the metafield, for organizational purposes. - example: Sales Department - minLength: 1 - maxLength: 64 - permission_set: - type: string - description: | - Determines the visibility and writeability of the field by other API consumers. - | Value | Description | - | :--- | :--- | - | `app_only` | Private to the app that owns the field. | - | `read` | Visible to other API consumers. | - | `write` | Open for reading and writing by other API consumers. | - | `read_and_sf_access` | Visible to other API consumers, including on storefront. | - | `write_and_sf_access` | Open for reading and writing by other API consumers, including on storefront. | - enum: - - app_only - - read - - write - - read_and_sf_access - - write_and_sf_access - resource_type: - type: string - description: | - The type of resource with which the metafield is associated. - enum: - - brand - - product - - variant - - category - - cart - - channel - - location - - order - - customer - example: cart - resource_id: - type: integer - description: | - The unique identifier for the resource with which the metafield is associated. - example: 0 - readOnly: true - description: - type: string - description: | - Description for the metafields. - example: order - date_created: - type: string - format: date-time - description: Date and time of the metafieldʼs creation. - example: '2022-06-16T18:39:00+00:00' - date_modified: - type: string - format: date-time - description: Date and time when the metafield was last updated. - example: '2022-06-16T18:39:00+00:00' - owner_client_id: - type: string - description: Client ID for the metafield's creator. - readOnly: true - example: ramciw4fnoz87it3ynjfif2zrkil5p - required: - - namespace - - key - - value - - permission_set - - resource_type - - resource_id - - description - - id - - date_created - - date_modified + items: + type: object + properties: + id: + type: integer + description: Unique ID of the *Metafield*. Read-Only. + readOnly: true + example: 0 + key: + type: string + description: The key for the metafields. + example: Staff Name + value: + type: string + description: The description for the metafield. + example: Ronaldo + namespace: + type: string + description: | + Namespace for the metafield, for organizational purposes. + example: Sales Department + minLength: 1 + maxLength: 64 + permission_set: + type: string + description: | + Determines the visibility and writeability of the field by other API consumers. + | Value | Description | + | :--- | :--- | + | `app_only` | Private to the app that owns the field. | + | `read` | Visible to other API consumers. | + | `write` | Open for reading and writing by other API consumers. | + | `read_and_sf_access` | Visible to other API consumers, including on storefront. | + | `write_and_sf_access` | Open for reading and writing by other API consumers, including on storefront. | + enum: + - app_only + - read + - write + - read_and_sf_access + - write_and_sf_access + resource_type: + type: string + description: | + The type of resource with which the metafield is associated. + enum: + - brand + - product + - variant + - category + - cart + - channel + - location + - order + - customer + example: cart + resource_id: + type: integer + description: | + The unique identifier for the resource with which the metafield is associated. + example: 0 + readOnly: true + description: + type: string + description: | + Description for the metafields. + example: order + date_created: + type: string + format: date-time + description: Date and time of the metafieldʼs creation. + example: '2022-06-16T18:39:00+00:00' + date_modified: + type: string + format: date-time + description: Date and time when the metafield was last updated. + example: '2022-06-16T18:39:00+00:00' + owner_client_id: + type: string + description: Client ID for the metafield's creator. + readOnly: true + example: ramciw4fnoz87it3ynjfif2zrkil5p + required: + - namespace + - key + - value + - permission_set + - resource_type + - resource_id + - description + - id + - date_created + - date_modified consent_Resp: description: '' content: From f6cd0eccf8a763dd35349666d749f6ed8053e8be Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 15 Aug 2024 18:59:21 +0300 Subject: [PATCH 153/221] DEVDOCS-6024: [TEST SPEC] remove required from response bodies in Categories API (#420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? Where I could easily do so, I removed "required" from the request bodies. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/categories_catalog.v3.yml | 25 --------------------- 1 file changed, 25 deletions(-) diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index 700a80f86..f740e3c1d 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -701,8 +701,6 @@ paths: The unique numeric ID of the categoryʼs parent. This field controls where the category sits in the tree of categories that organize the catalog. Required in a POST if creating a child category. example: 2 - x-required: - - post name: maxLength: 50 minLength: 1 @@ -711,8 +709,6 @@ paths: The name displayed for the category. Name is unique with respect to the categoryʼs siblings. Required in a POST. example: Bath - x-required: - - post description: type: string description: | @@ -809,9 +805,6 @@ paths: x-required: - post - put - required: - - parent_id - - name meta: title: Meta type: object @@ -1756,8 +1749,6 @@ components: The unique numeric ID of the categoryʼs parent. This field controls where the category sits in the tree of categories that organize the catalog. Required in a POST if creating a child category. example: 2 - x-required: - - post name: maxLength: 50 minLength: 1 @@ -1766,8 +1757,6 @@ components: The name displayed for the category. Name is unique with respect to the categoryʼs siblings. Required in a POST. example: Bath - x-required: - - post description: type: string description: | @@ -1843,9 +1832,6 @@ components: x-url: true custom_url: $ref: '#/components/schemas/customUrl_Full' - required: - - parent_id - - name metafield_Base: title: metafield_Base type: object @@ -2346,17 +2332,6 @@ components: description: Client ID for the metafieldʼs creator. example: asdfasdfasdfasdfasdfasdfasdf readOnly: true - required: - - namespace - - key - - value - - permission_set - - resource_type - - resource_id - - description - - id - - date_created - - date_modified MetaFieldCollectionResponse: type: object description: | From 12363c0a305e2e03742defcde5d74bc57f649269 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 15 Aug 2024 19:00:42 +0300 Subject: [PATCH 154/221] DEVDOCS-6024: [TEST SPEC] Update brands_catalog.v3.yml (#426) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? - Removed required from the response objects - Added owner_client_id - Added a error response ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/brands_catalog.v3.yml | 67 ++++++++++++++++++------- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index dc2230701..5b78666f5 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -383,9 +383,6 @@ paths: The name of the brand. Must be unique. Required in POST. example: Common Good - x-required: - - post - - put page_title: maxLength: 255 minLength: 0 @@ -951,6 +948,7 @@ paths: description: Location in the warehouse date_created: '1973-01-20T21:34:57.903Z' date_modified: '1990-12-30T00:29:23.515Z' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" - id: 7 key: Brand location value: 4HG @@ -961,6 +959,7 @@ paths: description: Location in the warehouse date_created: '1973-01-20T21:34:57.903Z' date_modified: '1990-12-30T00:29:23.515Z' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" meta: pagination: total: 2 @@ -1017,6 +1016,7 @@ paths: description: Where products are located date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" meta: {} example-2: value: @@ -1031,6 +1031,7 @@ paths: description: Location in the warehouse. date_created: '2018-05-07T20:14:17+00:00' date_modified: '2018-05-07T20:14:17+00:00' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" meta: {} example-3: value: @@ -1045,6 +1046,7 @@ paths: description: Where products are located. date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" meta: {} '400': description: Bad Request. Input is invalid. @@ -1161,6 +1163,7 @@ paths: description: Where products are located date_created: '2021-08-06T19:15:35+00:00' date_modified: '2021-08-06T19:15:35+00:00' + owner_client_id: "e8o0nm9ujew7byzu6x5dwjqe2rya2fv" meta: {} '404': description: | @@ -1313,7 +1316,7 @@ paths: Creates a brand image. **Required Fields** - - image_file: Form posts are the only accepted upload option. + - image_file: Form posts are the only accepted upload option. For more information on how to upload an image see [Adding product images](docs/store-operations/catalog#adding-product-images). NOTE: Ensure you set the `Content-Type` header to `multipart/form-data; boundary=--example-boundary--` and set the correct URL for this endpoint. **Read-Only Fields** - id @@ -1431,6 +1434,23 @@ paths: application/json: schema: $ref: '#/components/schemas/MetaFieldCollectionResponse' + '400': + description: Bad Request. Input is invalid. + content: + application/json: + schema: + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + errors: {} parameters: - $ref: '#/components/parameters/PageQuery' - $ref: '#/components/parameters/LimitQuery' @@ -1555,21 +1575,34 @@ paths: type: type: string minLength: 1 - detail: - type: string - minLength: 1 + errors: + type: object + properties: {} example: status: 400 title: Input is invalid type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' - detail: Syntax error + errors: {} '422': - description: | - Response object for metafields creation with partial success. + description: JSON data is missing or invalid content: application/json: schema: - $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_POST_PUT' + description: '' + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + errors: + type: object + properties: {} + description: Empty for 200 responses. delete: summary: Delete Multiple Metafields tags: @@ -1645,9 +1678,6 @@ components: The name of the brand. Must be unique. Required in POST. example: Common Good - x-required: - - post - - put page_title: maxLength: 255 minLength: 0 @@ -1878,8 +1908,6 @@ components: - brand - product - variant - x-required: - - post resource_id: maximum: 10000000000 minimum: 0 @@ -1887,8 +1915,6 @@ components: description: | The ID of the resource with which the metafield is associated. example: 111 - x-required: - - post date_created: type: string description: | @@ -1903,6 +1929,11 @@ components: readOnly: true format: date-time example: '2018-05-07T20:14:17+00:00' + owner_client_id: + type: string + description: Client ID for the metafieldʼs creator. + example: asdfasdfasdfasdfasdfasdfasdf + readOnly: true x-internal: false Metafield: type: object From 8417deeb2c561cd3ea1726f5f723e5f2330ebe40 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 15 Aug 2024 19:01:56 +0300 Subject: [PATCH 155/221] DEVDOCS-6024 [TEST-SPEC]: updated per review (#416) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? - Removed `product _id` from the Product Review response body endpoints. - Added `owner_client_id` to the Product Metafield response bodies - Added examples for the Create Product Review request body endpoint. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/products_catalog.v3.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 67c236c42..249485dfd 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -4162,10 +4162,6 @@ paths: type: integer description: | The unique numeric ID of the product review; increments sequentially. - product_id: - type: integer - description: | - The unique numeric identifier for the product with which the review is associated. date_created: type: string description: | @@ -4240,6 +4236,7 @@ paths: description: |- The title for the product review. Required in /POST. + example: Great Product text: type: string description: | @@ -4248,17 +4245,21 @@ paths: type: string description: | The status of the product review. Must be one of `approved`, `disapproved` or `pending`. + example: approved rating: type: integer description: 'The rating of the product review. Must be one of 0, 1, 2, 3, 4, 5.' + example: 5 email: type: string description: 'The email of the reviewer. Must be a valid email, or an empty string.' + example: bob@email.com name: maxLength: 255 minLength: 0 type: string description: The name of the reviewer. + example: Bob S. date_reviewed: type: string description: | @@ -4322,10 +4323,6 @@ paths: type: integer description: | The unique numeric ID of the product review; increments sequentially. - product_id: - type: integer - description: | - The unique numeric identifier for the product with which the review is associated. date_created: type: string description: | @@ -4615,10 +4612,6 @@ paths: type: integer description: | The unique numeric ID of the product review; increments sequentially. - product_id: - type: integer - description: | - The unique numeric identifier for the product with which the review is associated. date_created: type: string description: | @@ -7912,6 +7905,9 @@ components: readOnly: true format: date-time example: '2018-05-07T20:14:17+00:00' + owner_client_id: + type: string + description: ID of metafield's creator x-internal: false errorResponse_409: title: errorResponse_409 From dd84b675e0720769624699074a2213b9494e679b Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Thu, 15 Aug 2024 12:19:13 -0400 Subject: [PATCH 156/221] Delete redundant B2B openAPI.json file (#452) ## What changed? This file was a remnant of moving B2B files over from it's previous repo. We use yaml files for the spec renderer, so this isn't needed. Removing it so we don't have to worry about updating two things. ## Release notes draft N/A Co-authored-by: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> --- docs/b2b-edition/specs/api-v2/openAPI.json | 7690 -------------------- 1 file changed, 7690 deletions(-) delete mode 100644 docs/b2b-edition/specs/api-v2/openAPI.json diff --git a/docs/b2b-edition/specs/api-v2/openAPI.json b/docs/b2b-edition/specs/api-v2/openAPI.json deleted file mode 100644 index b0a693c6c..000000000 --- a/docs/b2b-edition/specs/api-v2/openAPI.json +++ /dev/null @@ -1,7690 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "Open API", - "description": "BigCommerce B2B Edition Open API Docs", - "license": {}, - "version": "v3" - }, - "host": "api-b2b.bigcommerce.com", - "schemes": [ - "https" - ], - "basePath": "/api/v2/io", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "securityDefinitions": { - "authToken": { - "name": "authToken", - "type": "apiKey", - "in": "header" - } - }, - "security": [ - { - "Basic": [] - } - ], - "tags": [ - { - "name": "Address" - }, - { - "name": "Company" - }, - { - "name": "Order" - }, - { - "name": "Payment" - }, - { - "name": "Proxy" - }, - { - "name": "SalesRep" - }, - { - "name": "User" - } - ], - "paths": { - "/addresses/country_state": { - "get": { - "operationId": "addresses_country_state_list", - "summary": "Convert Country State", - "description": "Convert country/state name to their code or code to name", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header", - "required": true, - "type": "string" - }, - { - "name": "country", - "in": "query", - "description": "Country code/name", - "type": "string" - }, - { - "name": "state", - "in": "query", - "description": "Country code/name", - "type": "string" - }, - { - "name": "search_type", - "in": "query", - "description": "Convert type, code means transfer the input country/state name to their code, name means transfer the input country/state code to their name", - "type": "string", - "enum": [ - "code", - "name" - ] - } - ], - "responses": { - "200": { - "description": "Response success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "countryCode": { - "description": "The converted country code from input country name", - "type": "string" - }, - "countryName": { - "description": "The converted country name from input country code", - "type": "string" - }, - "stateCode": { - "description": "The converted state code from input state name", - "type": "string" - }, - "stateName": { - "description": "The converted state name from input country code", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "countryName": "United States", - "stateName": "New York" - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Response record not found", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": {}, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United%20States&state=New%20York' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Cookie: csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"localhost:8000/api/v2/io/addresses/country_state?search_type=name&country=US&state=NY\"\n\npayload={}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js',\n 'Cookie': 'csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data=payload)\n\nprint(response.text)\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js\");\nmyHeaders.append(\"Cookie\", \"csrftoken=1r2Sm1HUb6NglzK7V5QJlcS7YlptUtVVGKCu9AbcYeyrKNy9erCk0SDDZnI8YKz7\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/addresses/country_state?search_type=code&country=United States&state=New York\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/companies/convert-from-customer-group": { - "post": { - "operationId": "companies_convert-from-customer-group_create", - "summary": "Create Company From CG", - "description": "Create company from bigCommerce customer group. This API only enable for non-MSF store.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "allOf": [ - { - "type": "object", - "properties": { - "acceptWelcomeEmail": { - "description": "(0=will not receive email 1=will receive email)", - "type": "string", - "enum": [ - 0, - 1 - ] - }, - "addressLine1": { - "description": "Address string line 1", - "type": "string" - }, - "addressLine2": { - "description": "Address string line 2", - "type": "string" - }, - "adminEmail": { - "description": "Company admin user email", - "type": "string" - }, - "adminFirstName": { - "description": "Company admin user's first name", - "type": "string" - }, - "adminLastName": { - "description": "Company admin user's last name", - "type": "string" - }, - "adminPhoneNumber": { - "description": "Company admin user phone number", - "type": "string" - }, - "city": { - "type": "string" - }, - "companyEmail": { - "type": "string" - }, - "companyName": { - "type": "string" - }, - "country": { - "type": "string" - }, - "customerGroupId": { - "description": "BC customer group ID", - "type": "string" - }, - "extraFields": { - "description": "To use customized extra fields with field names you need to first add company extra fields in Settings > Extra fields inside B2B edition. eg. If you want to create a new company with an extra integer field named licenseNO, you can use this structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}] in the request body.", - "type": "array", - "items": { - "type": "object", - "properties": { - "fieldName": { - "type": "string" - }, - "fieldValue": { - "type": "string" - } - } - } - }, - "extraInt1": { - "description": "The default extra integer field, you can also use this field to create a company with it.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there is an important point you need to know. After the B3 team helped you configure the custom extra fields, if you still need to use these default fields, you need to know the correspondence between the custom extra fields and the default extra fields. Otherwise, when you pass in both custom and default extra fields, if the custom extra field is bound to the default extra field you pass in, the value of the custom extra field will override the default extra field.", - "type": "number" - }, - "extraInt2": { - "description": "Company create extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt3": { - "description": "Company create extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt4": { - "description": "Company create extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt5": { - "description": "Company create extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraStr1": { - "description": "Company create extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr2": { - "description": "Company create extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr3": { - "description": "Company create extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr4": { - "description": "Company create extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr5": { - "description": "Company create extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraText": { - "description": "Company create extra text value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "phoneNumber": { - "type": "string" - }, - "state": { - "type": "string" - }, - "zipCode": { - "type": "string" - } - }, - "required": [ - "adminEmail", - "adminFirstName", - "adminLastName", - "companyEmail", - "companyName", - "customerGroupId", - "phoneNumber" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml" - } - ] - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Created company Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2" - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "message": "Enter a valid email address." - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Customer group does not exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n \"city\": \"xxxx\",\n \"state\": \"xxxx\",\n \"zipCode\": \"12333\",\n \"country\": \"China\",\n \"adminFirstName\": \"test\",\n \"adminLastName\": \"sdfsd\",\n \"adminEmail\": \"test1@test.com\",\n \"adminPhoneNumber\": \"3838288282\",\n \"customerGroupId\": 4\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group\"\n\npayload = {\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n \"city\": \"xxxx\",\n \"state\": \"xxxx\",\n \"zipCode\": \"12333\",\n \"country\": \"China\",\n \"adminFirstName\": \"test\",\n \"adminLastName\": \"sdfsd\",\n \"adminEmail\": \"test1@test.com\",\n \"adminPhoneNumber\": \"3838288282\",\n \"customerGroupId\": 4\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"companyName\":\"test3.23-22\",\"phoneNumber\":122331212,\"companyEmail\":\"test@test.com\",\"addressLine1\":\"xxxx\",\"addressLine2\":\"\",\"city\":\"xxxx\",\"state\":\"xxxx\",\"zipCode\":\"12333\",\"country\":\"China\",\"adminFirstName\":\"test\",\"adminLastName\":\"sdfsd\",\"adminEmail\":\"test1@test.com\",\"adminPhoneNumber\":\"3838288282\",\"customerGroupId\":4});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/convert-from-customer-group\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/companies/users/{customerId}/orders": { - "post": { - "operationId": "companies_users_orders_create", - "summary": "Create Order Without CompanyID", - "description": "Create an order from bigCommerce, you must known order id", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "allOf": [ - { - "type": "object", - "properties": { - "orderId": { - "description": "BigCommerce order id", - "type": "string" - }, - "poNumber": { - "description": "PoNumber", - "type": "string" - }, - "totalIncTax": { - "description": "Total incTax", - "type": "number" - } - }, - "required": [ - "orderId", - "totalIncTax" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" - } - ] - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Created order id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "orderId": 2 - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "data": { - "bc_order_id": "orderId can not be null" - }, - "message": "Bad Request Error" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}' \n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders\"\n\npayload = {\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"totalIncTax\":\"111\",\"orderId\":\"111\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/users/12/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "customerId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/addresses": { - "get": { - "operationId": "companies_addresses_list", - "summary": "Get Company Addresses", - "description": "Get all addresses for a company", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "minLastModifiedTime", - "in": "query", - "description": "Company filter condition: timestamp string e.g. 01/01/2000", - "type": "number" - }, - { - "name": "maxLastModifiedTime", - "in": "query", - "description": "Company filter condition: timestamp string e.g. 01/01/2000", - "type": "number" - }, - { - "name": "minLastCreatedTime", - "in": "query", - "description": "Company filter condition: timestamp string e.g. 01/01/2000", - "type": "number" - }, - { - "name": "maxLastCreatedTime", - "in": "query", - "description": "Company filter condition: timestamp string e.g. 01/01/2000", - "type": "number" - }, - { - "name": "q", - "in": "query", - "description": "Company query string", - "type": "string" - }, - { - "name": "firstName", - "in": "query", - "description": "Address first name filter", - "type": "number" - }, - { - "name": "lastName", - "in": "query", - "description": "Address first name filter", - "type": "number" - }, - { - "name": "address", - "in": "query", - "description": "Address line 1 filter", - "type": "number" - }, - { - "name": "city", - "in": "query", - "description": "Address city filter", - "type": "number" - }, - { - "name": "country", - "in": "query", - "description": "Address country filter", - "type": "number" - }, - { - "name": "state", - "in": "query", - "description": "Address state filter", - "type": "number" - }, - { - "name": "zipCode", - "in": "query", - "description": "Address zip code filter", - "type": "number" - }, - { - "name": "phoneNumber", - "in": "query", - "description": "Address phone number filter", - "type": "number" - }, - { - "name": "isShipping", - "in": "query", - "description": "Address is shipping filter", - "type": "number" - }, - { - "name": "isBilling", - "in": "query", - "description": "Address is billing filter", - "type": "number" - }, - { - "type": "array", - "in": "query", - "name": "externalId[]", - "description": "Address external id filter" - }, - { - "type": "number", - "in": "query", - "name": "offset", - "description": "Address pagination offset, default 0" - }, - { - "type": "number", - "in": "query", - "name": "limit", - "description": "Address pagination limit, default 4. ", - "minimum": 4, - "maximum": 500 - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addresses": { - "description": "All addresses", - "type": "object", - "properties": { - "[address_id]": { - "description": "The map from address ID to address", - "type": "object", - "properties": { - "addressId": { - "description": "Identifier for the address (same as URL parameter addressId)", - "type": "string" - }, - "addressLine1": { - "description": "Typically the street address", - "type": "string" - }, - "addressLine2": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "city": { - "type": "string" - }, - "country": { - "type": "object", - "properties": { - "countryCode": { - "description": "ISO 3166-1 Alpha 2 Country Code", - "type": "string" - }, - "countryName": { - "description": "Human readable country name", - "type": "string" - } - } - }, - "firstName": { - "type": "string" - }, - "isBilling": { - "description": "Indicates whether the address is a billing address", - "type": "boolean" - }, - "isDefaultBilling": { - "type": "boolean" - }, - "isDefaultShipping": { - "type": "boolean" - }, - "isShipping": { - "description": "Indicates whether the address is a shipping address", - "type": "boolean" - }, - "lastName": { - "type": "string" - }, - "phoneNumber": { - "type": "string" - }, - "state": { - "type": "object", - "properties": { - "stateCode": { - "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", - "type": "string" - }, - "stateName": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - } - } - }, - "zipCode": { - "description": "A valid postal code used by the country that was specified", - "type": "string" - }, - "externalId": { - "type": "string" - } - } - }, - "defaultBillingId": { - "description": "The identifier of the default shipping address", - "type": "number" - }, - "defaultShippingId": { - "description": "The identifier of the default shipping address", - "type": "number" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addresses": { - "7": { - "addressId": "7", - "addressLine1": "123 Main Street", - "addressLine2": "Blvd", - "city": "Austin", - "country": { - "countryCode": "US", - "countryName": "United States" - }, - "firstName": "Jane", - "isBilling": true, - "isDefaultBilling": true, - "isDefaultShipping": true, - "isShipping": true, - "lastName": "Doe", - "phoneNumber": "11111111111", - "state": { - "stateCode": "TX", - "stateName": "Texas" - }, - "zipCode": "78751", - "channelId": 1, - "channelName": "test" - } - }, - "defaultBillingId": "7", - "defaultShippingId": "7" - }, - "message": "SUCCESS" - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' \n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses?minLastModifiedTime=1/11/2019&maxLastModifiedTime=1/11/2020&minLastCreatedTime=1/11/2019&maxLastCreatedTime=1/11/2020\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "post": { - "operationId": "companies_addresses_create", - "summary": "Create A Company Address", - "description": "Creates a new address for a company. You will specify the address fields and the type of address. The address can be billing, shipping, or both. You can also request that this address becomes the new default billing or shipping address for the company.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "addressLine1": { - "description": "Typically the street address", - "type": "string" - }, - "addressLine2": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "city": { - "type": "string" - }, - "country": { - "type": "object", - "properties": { - "countryCode": { - "description": "ISO 3166-1 Alpha 2 Country Code", - "type": "string" - }, - "countryName": { - "description": "Human readable country name", - "type": "string" - } - } - }, - "firstName": { - "description": "Address first name", - "type": "string" - }, - "isBilling": { - "description": "Indicates whether the address is a billing address", - "type": "boolean" - }, - "isDefaultBilling": { - "description": "Indicates whether the address is the default billing address", - "type": "boolean" - }, - "isDefaultShipping": { - "description": "Indicates whether the address is the default shipping address", - "type": "boolean" - }, - "isShipping": { - "description": "Indicates whether the address is a shipping address", - "type": "boolean" - }, - "label": { - "description": "Address label", - "type": "string" - }, - "lastName": { - "description": "Address last name", - "type": "string" - }, - "phoneNumber": { - "description": "Address phone number", - "type": "string" - }, - "state": { - "type": "object", - "properties": { - "stateCode": { - "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", - "type": "string" - }, - "stateName": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - } - } - }, - "zipCode": { - "type": "string" - }, - "externalId": { - "type": "string" - } - }, - "required": [ - "addressLine1", - "city", - "country", - "firstName", - "lastName", - "state", - "zipCode" - ] - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "type": "number", - "description": "Response status code", - "example": 200 - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addressId": { - "type": "integer", - "description": "Created address Id", - "example": 12 - } - } - }, - "meta": { - "type": "object", - "properties": { - "message": { - "type": "string", - "description": "Response message", - "example": "Success" - } - } - } - } - }, - "examples": { - "example-1": { - "code": 200, - "data": { - "addressId": 12 - }, - "meta": { - "message": "Success" - } - } - } - }, - "422": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "type": "number", - "description": "Response status error code", - "example": 422 - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "errMsg": { - "description": "Message about problem with field 'field'", - "type": "array", - "items": { - "type": "object", - "properties": { - "[field]": { - "type": "string", - "description": "field error description.", - "example": "xxx field is too long." - } - } - } - } - } - }, - "meta": { - "type": "object", - "properties": { - "message": { - "type": "string", - "description": "Response error message", - "example": "Parameter Error" - } - } - } - } - }, - "examples": { - "example-1": { - "code": 422, - "data": { - "errMsg": [ - { - "[field]": "xxx field is too long." - } - ] - }, - "meta": { - "message": "Parameter Error" - } - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses' --header 'Content-Type: application/json' --data-raw '{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": true,\n \"isDefaultBilling\": true\n}'\n" - }, - { - "lang": "Python", - "source": "\n import requests\n\n url = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\"\n\n payload = \"{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": true,\n \"isDefaultBilling\": true\n}\"\n headers = {\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"POST\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"label\":\"12dxqwdsa\",\"firstName\":\"Bundle\",\"lastName\":\"Test\",\"addressLine1\":\"Street.1\",\"addressLine2\":\"\",\"city\":\"New York\",\"zipCode\":\"110202\",\"phoneNumber\":\"\",\"country\":{\"countryName\":\"United States\",\"countryCode\":\"US\"},\"state\":{\"stateName\":\"New York\",\"stateCode\":\"NY\"},\"isShipping\":\"1\",\"isBilling\":\"1\",\"isDefaultShipping\":\"1\",\"isDefaultBilling\":\"0\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/addresses/{addressId}": { - "get": { - "operationId": "companies_addresses_read", - "summary": "Get A Company Address", - "description": "Get an address for a company", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addresses": { - "description": "All addresses", - "type": "object", - "properties": { - "addressId": { - "description": "Identifier for the address (same as URL parameter addressId)", - "type": "string" - }, - "addressLine1": { - "description": "Typically the street address", - "type": "string" - }, - "addressLine2": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "city": { - "type": "string" - }, - "country": { - "type": "object", - "properties": { - "countryCode": { - "description": "ISO 3166-1 Alpha 2 Country Code", - "type": "string" - }, - "countryName": { - "description": "Human readable country name", - "type": "string" - } - } - }, - "firstName": { - "type": "string" - }, - "isBilling": { - "description": "Indicates whether the address is a billing address", - "type": "boolean" - }, - "isDefaultBilling": { - "type": "boolean" - }, - "isDefaultShipping": { - "type": "boolean" - }, - "isShipping": { - "description": "Indicates whether the address is a shipping address", - "type": "boolean" - }, - "lastName": { - "type": "string" - }, - "phoneNumber": { - "type": "string" - }, - "state": { - "type": "object", - "properties": { - "stateCode": { - "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", - "type": "string" - }, - "stateName": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - } - } - }, - "zipCode": { - "description": "A valid postal code used by the country that was specified", - "type": "string" - }, - "externalId": { - "type": "string" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addressId": "6", - "addressLine1": "123 Main Street", - "addressLine2": "Blvd", - "city": "Austin", - "country": { - "countryCode": "US", - "countryName": "United States" - }, - "firstName": "Jane", - "isBilling": true, - "isDefaultBilling": true, - "isDefaultShipping": true, - "isShipping": true, - "lastName": "Doe", - "phoneNumber": "11111111111", - "state": { - "stateCode": "TX", - "stateName": "Texas" - }, - "zipCode": "78751", - "channelId": 1, - "channelName": "test" - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Response record not found", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": {}, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/39/addresses/2\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "companies_addresses_update", - "summary": "Update A Company Address", - "description": "Updates an address for a company. You can change whether the address is for billing, shipping, or both. You can also update the address to be the default billing or shipping address for the company.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "addressLine1": { - "description": "Typically the street address", - "type": "string" - }, - "addressLine2": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "city": { - "type": "string" - }, - "country": { - "type": "object", - "properties": { - "countryCode": { - "description": "ISO 3166-1 Alpha 2 Country Code", - "type": "string" - }, - "countryName": { - "description": "Human readable country name", - "type": "string" - } - } - }, - "firstName": { - "description": "Address first name", - "type": "string" - }, - "isBilling": { - "description": "Indicates whether the address is a billing address", - "type": "boolean" - }, - "isDefaultBilling": { - "description": "Indicates whether the address is the default billing address", - "type": "boolean" - }, - "isDefaultShipping": { - "description": "Indicates whether the address is the default shipping address", - "type": "boolean" - }, - "isShipping": { - "description": "Indicates whether the address is a shipping address", - "type": "boolean" - }, - "label": { - "description": "Address label", - "type": "string" - }, - "lastName": { - "description": "Address last name", - "type": "string" - }, - "phoneNumber": { - "description": "Address phone number", - "type": "string" - }, - "state": { - "type": "object", - "properties": { - "stateCode": { - "description": "ISO 3166-2 Alpha 2 Country Subdivision Code", - "type": "string" - }, - "stateName": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - } - } - }, - "zipCode": { - "type": "string" - }, - "externalId": { - "type": "string" - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addressId": { - "description": "Updated address Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addressId": 4 - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "data": { - "address_line_1": "Address not allow None", - "last_name": "Last name not allow None" - }, - "message": "Bad Requests Error" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Address Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": \"1\",\n \"isDefaultBilling\": \"0\"\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\"\npayload = {\n \"label\": \"12dxqwdsa\",\n \"firstName\": \"Bundle\",\n \"lastName\": \"Test\",\n \"addressLine1\": \"Street.1\",\n \"addressLine2\": \"\",\n \"city\": \"New York\",\n \"zipCode\": \"110202\",\n \"phoneNumber\": \"\",\n \"country\": {\n \"countryName\": \"United States\",\n \"countryCode\": \"US\"\n },\n \"state\": {\n \"stateName\": \"New York\",\n \"stateCode\": \"NY\"\n },\n \"isShipping\": \"1\",\n \"isBilling\": \"1\",\n \"isDefaultShipping\": \"1\",\n \"isDefaultBilling\": \"0\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"label\":\"12dxqwdsa\",\"firstName\":\"Bundle\",\"lastName\":\"Test\",\"addressLine1\":\"Street.1\",\"addressLine2\":\"\",\"city\":\"New York\",\"zipCode\":\"110202\",\"phoneNumber\":\"\",\"country\":{\"countryName\":\"United States\",\"countryCode\":\"US\"},\"state\":{\"stateName\":\"New York\",\"stateCode\":\"NY\"},\"isShipping\":\"1\",\"isBilling\":\"1\",\"isDefaultShipping\":\"1\",\"isDefaultBilling\":\"0\"});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "delete": { - "operationId": "companies_addresses_delete", - "summary": "Delete A Company Address", - "description": "Deletes an address from a company.", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Deleted successful", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addressId": { - "description": "Deleted address Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addressId": 2 - }, - "message": "Success" - } - } - }, - "404": { - "description": "Company not found", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Address Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Address" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"DELETE\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'DELETE',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses/4\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "addressId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/basic-info": { - "get": { - "operationId": "companies_basic-info_list", - "summary": "Get Company Basic Information", - "description": "Get company's basic information", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addressLine1": { - "description": "Company address line 1", - "type": "string" - }, - "addressLine2": { - "description": "Company address line 2", - "type": "string" - }, - "catalogId": { - "description": "Catalog Id", - "type": "string" - }, - "catalogName": { - "description": "Catalog Id", - "type": "string" - }, - "city": { - "description": "Company city", - "type": "string" - }, - "companyEmail": { - "description": "Company email", - "type": "string" - }, - "companyId": { - "description": "Company Id", - "type": "string" - }, - "companyName": { - "description": "Company name", - "type": "string" - }, - "companyStatus": { - "description": "Company status", - "type": "string" - }, - "country": { - "description": "Company country", - "type": "string" - }, - "description": { - "description": "Company description", - "type": "string" - }, - "extraFields": { - "description": "Company extra fields", - "type": "array", - "items": { - "type": "object", - "properties": { - "dataType": { - "description": "Field data type, 0=text, 1=number, 2=textarea.", - "type": "string" - }, - "fieldName": { - "description": "Field name", - "type": "string" - }, - "fieldValue": { - "description": "Field value", - "type": "string" - }, - "isRequired": { - "description": "Is field required or not, 0=not required, 1=required", - "type": "string" - }, - "labelName": { - "description": "Field label name", - "type": "string" - } - } - } - }, - "phoneNumber": { - "description": "Company phone number", - "type": "string" - }, - "state": { - "description": "Company state", - "type": "string" - }, - "updatedAt": { - "description": "Company updated timestamp", - "type": "string" - }, - "uuid": { - "description": "UUID", - "type": "string" - }, - "zipCode": { - "description": "Company zip code", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addressLine1": "", - "addressLine2": "", - "catalogId": "1", - "catalogName": "testCatalogName", - "city": "Paris", - "companyEmail": "test@bundleb2b.com", - "companyId": "35", - "companyName": "CropTest1", - "companyStatus": "1", - "country": "French", - "description": "CropTest", - "extraFields": [ - { - "dataType": "2", - "fieldName": "extraStr1", - "fieldValue": "extra_text", - "isRequired": "0", - "labelName": "Enter your license" - } - ], - "phoneNumber": "10030212001", - "state": "BC", - "updatedAt": "1594192159", - "uuid": "111", - "zipCode": "1032332" - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/companies/23/basic-info\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "companies_basic-info_update", - "summary": "Update Company Basic Information", - "description": "Update a company's basic info, you can update on or more options", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "addressLine1": { - "description": "Address string line 1", - "type": "string" - }, - "addressLine2": { - "description": "Address string line 2", - "type": "string" - }, - "catalogId": { - "description": "BigCommerce price list Id that company related(If put its 0 will clear the catalog).", - "type": "string" - }, - "city": { - "type": "string" - }, - "companyEmail": { - "type": "string" - }, - "companyName": { - "type": "string" - }, - "companyStatus": { - "description": "Company status: \n\n 0=PENDING 1=APPROVED 2=REJECTED 3=INACTIVE 4=DELETED", - "type": "string" - }, - "country": { - "description": "\nCountry full name or ISO2 country code. For Example: \n\nA Country full name: Afghanistan \n\nISO2 Country code: AF\n", - "type": "string" - }, - "description": { - "type": "string" - }, - "extraFields": { - "description": "To use customized extra fields with field names you need to first add company extra fields in Settings > Extra fields inside B2B edition. eg. If you want to create a new company with an extra integer field named licenseNO, you can use this structure [{'fieldName': 'LicenseNO', 'fieldValue': 10342340323}] in the request body.", - "type": "array", - "items": { - "type": "object", - "properties": { - "fieldName": { - "type": "string" - }, - "fieldValue": { - "type": "string" - } - } - } - }, - "extraInt1": { - "description": "The default extra integer field, you can also use this field to create a company with it.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5, extraText) \n\n But there is an important point you need to know. After the B3 team helped you configure the custom extra fields, if you still need to use these default fields, you need to know the correspondence between the custom extra fields and the default extra fields. Otherwise, when you pass in both custom and default extra fields, if the custom extra field is bound to the default extra field you pass in, the value of the custom extra field will override the default extra field.", - "type": "number" - }, - "extraInt2": { - "description": "Company update extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt3": { - "description": "Company update extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt4": { - "description": "Company update extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraInt5": { - "description": "Company update extra integer value, please refer to the description of extraInt1 above.", - "type": "number" - }, - "extraStr1": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr2": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr3": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr4": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraStr5": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "extraText": { - "description": "Company update extra string value, please refer to the description of extraInt1 above.", - "type": "string" - }, - "phoneNumber": { - "type": "string" - }, - "state": { - "type": "string" - }, - "zipCode": { - "type": "string" - }, - "priceListAssign": { - "type": "array", - "items": { - "type": "object", - "properties": { - "channelId": { - "type": "integer", - "description": "BigCommerce channel id" - }, - "priceListId": { - "type": "integer", - "description": "BC price list ID" - } - } - } - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Updated company Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2" - }, - "message": "Success" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/23' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"companyName\": \"test3.23-22\",\n \"phoneNumber\": 122331212,\n \"companyEmail\": \"test@test.com\",\n \"addressLine1\": \"xxxx\",\n \"addressLine2\": \"\",\n\n}'\n" - }, - { - "lang": "Python", - "source": "\n import requests\n\n url = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/23\"\n\n payload = \"{\n\t\"companyName\": \"test3.23-22\",\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\",\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"PUT\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\n var myHeaders = new Headers();\n myHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n myHeaders.append(\"Content-Type\", \"application/json\");\n\n var raw = \"{\n\t\"companyName\": \"test3.23-22\",\n\t\"phoneNumber\": 122331212,\n\t\"companyEmail\": \"test@test.com\",\n\t\"addressLine1\": \"xxxx\",\n\t\"addressLine2\": \"\",\n\n}\";\n\n var requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n };\n\n fetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/force-del": { - "delete": { - "operationId": "companies_force-del_delete", - "summary": "Delete Company With Related", - "description": "Force Delete A Company and its Related Information.", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Deleted successful", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Deleted company Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2" - }, - "message": "Success" - } - } - }, - "404": { - "description": "Company not found", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/force-del\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/orderBCIds": { - "get": { - "operationId": "companies_orderBCIds_list", - "summary": "Get BC Order Id List By Company Id", - "description": "Get bC order ID list by company id", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "offset", - "in": "query", - "description": "Pagination offset default: 0", - "type": "number" - }, - { - "name": "limit", - "in": "query", - "description": "Pagination limit default: 10", - "type": "number" - }, - { - "name": "beginDateAt", - "in": "query", - "description": "End date filter, in format '12/31/2019'", - "type": "string" - }, - { - "name": "endDateAt", - "in": "query", - "description": "End date filter, in format '12/31/2019'", - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "type": "object", - "properties": { - "list": { - "description": "", - "type": "array", - "items": { - "type": "object", - "properties": { - "orderId": { - "description": "Order id", - "type": "string" - } - } - } - }, - "pagination": { - "description": "Response data pagination", - "type": "object", - "properties": { - "limit": { - "description": "Response pagination limit", - "type": "number" - }, - "offset": { - "description": "Response pagination offset", - "type": "number" - }, - "totalCount": { - "description": "Response data items number", - "type": "number" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "list": [ - { - "orderId": "1" - } - ], - "pagination": { - "limit": 10, - "offset": 0, - "totalCount": 3 - } - }, - "message": "Success" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/orderBCIds\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/orders": { - "get": { - "operationId": "companies_orders_list", - "summary": "Get Company Orders", - "description": "Get company all orders, with pagination data", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "offset", - "in": "query", - "description": "Pagination offset default: 0", - "type": "number" - }, - { - "name": "limit", - "in": "query", - "description": "Pagination limit default: 10", - "type": "number" - }, - { - "name": "orderBy", - "in": "query", - "description": "in ['bcOrderId', 'totalIncTax', 'createdAt']", - "type": "string" - }, - { - "name": "beginDateAt", - "in": "query", - "description": "End date filter, in format '12/31/2019'", - "type": "string" - }, - { - "name": "endDateAt", - "in": "query", - "description": "End date filter, in format '12/31/2019'", - "type": "string" - }, - { - "name": "includeExtra", - "in": "query", - "description": "Switch show extra fields, allow: 0, 1", - "type": "string" - }, - { - "name": "extraStr1", - "in": "query", - "description": "Extra field filter", - "type": "string" - }, - { - "name": "extraStr2", - "in": "query", - "description": "Extra field filter", - "type": "string" - }, - { - "name": "extraStr3", - "in": "query", - "description": "Extra field filter", - "type": "string" - }, - { - "name": "extraStr4", - "in": "query", - "description": "Extra field filter", - "type": "string" - }, - { - "name": "extraStr5", - "in": "query", - "description": "Extra field filter", - "type": "string" - }, - { - "name": "extraInt1", - "in": "query", - "description": "Extra field filter", - "type": "number" - }, - { - "name": "extraInt2", - "in": "query", - "description": "Extra field filter", - "type": "number" - }, - { - "name": "extraInt3", - "in": "query", - "description": "Extra field filter", - "type": "number" - }, - { - "name": "extraInt4", - "in": "query", - "description": "Extra field filter", - "type": "number" - }, - { - "name": "extraInt5", - "in": "query", - "description": "Extra field filter", - "type": "number" - }, - { - "type": "number", - "in": "query", - "name": "channelId", - "description": "BigComerce channel id" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "type": "object", - "properties": { - "OrderStatus": { - "description": "Order status, eg. Awaiting Payment", - "type": "string" - }, - "companyName": { - "description": "User phone number", - "type": "string" - }, - "createdAt": { - "description": "Order created date.", - "type": "string" - }, - "firstName": { - "description": "Order's user first name.", - "type": "string" - }, - "isInvoiceOrder": { - "description": "Is a invoice order", - "type": "string" - }, - "lastName": { - "description": "Order's user last name", - "type": "string" - }, - "orderId": { - "description": "Order id", - "type": "string" - }, - "totalIncTax": { - "description": "Order's total invoice taxes.", - "type": "string" - }, - "updatedAt": { - "description": "Order updated date.", - "type": "string" - }, - "channelName": { - "type": "string", - "description": "BigCommerce channel name" - }, - "channelId": { - "type": "string", - "description": "BigCommerce channel id" - } - } - } - }, - "pagination": { - "description": "Response data pagination", - "type": "object", - "properties": { - "limit": { - "description": "Response pagination limit", - "type": "number" - }, - "offset": { - "description": "Response pagination offset", - "type": "number" - }, - "totalCount": { - "description": "Response data items number", - "type": "number" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "list": [ - { - "companyName": "fkkfcctest", - "createdAt": "1572323610", - "firstName": "james", - "isInvoiceOrder": "0", - "lastName": "liu", - "orderId": "126", - "orderStatus": "Awaiting Payment", - "totalIncTax": "100.0000", - "updatedAt": "1572323610", - "channelId": 1, - "channelName": "test" - }, - { - "companyName": "fkkfcctest", - "createdAt": "1572323432", - "firstName": "james", - "isInvoiceOrder": "0", - "lastName": "liu", - "orderId": "124", - "orderStatus": "Awaiting Payment", - "totalIncTax": "50.0000", - "updatedAt": "1572323432", - "channelId": 1, - "channelName": "test" - }, - { - "companyName": "fkkfcctest", - "createdAt": "1572321777", - "firstName": "james", - "isInvoiceOrder": "0", - "lastName": "liu", - "orderId": "125", - "orderStatus": "Awaiting Payment", - "totalIncTax": "50.0000", - "updatedAt": "1572321777", - "channelId": 1, - "channelName": "test" - } - ], - "paginator": { - "limit": 10, - "offset": 0, - "totalCount": 3 - } - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/{companyId}/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/payments": { - "get": { - "operationId": "companies_payments_list", - "summary": "Get Company Payments Methods", - "description": "Get company payments methods, include inactive", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "", - "type": "array", - "items": { - "type": "object", - "properties": { - "code": { - "description": "Payment code", - "type": "string" - }, - "isEnabled": { - "description": "Payment method status", - "type": "string" - }, - "name": { - "description": "Payment name", - "type": "string" - }, - "paymentId": { - "description": "Payment id", - "type": "number" - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": [ - { - "code": "cheque", - "isEnabled": "1", - "name": "Check", - "paymentId": 3 - }, - { - "code": "bankdeposit", - "isEnabled": "0", - "name": "Bank Deposit", - "paymentId": 6 - }, - { - "code": "cod", - "isEnabled": "0", - "name": "Cash on Delivery", - "paymentId": 7 - }, - { - "code": "moneyorder", - "isEnabled": "0", - "name": "Money Order", - "paymentId": 8 - }, - { - "code": "testgateway", - "isEnabled": "0", - "name": "Test Payment Gateway", - "paymentId": 5 - } - ], - "message": "SUCCESS" - } - } - } - }, - "tags": [ - "Payment" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "companies_payments_update", - "summary": "Update Company Payments Methods", - "description": "Update Company payments methods' status, change them active or not", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "payments": { - "type": "array", - "items": { - "required": [ - "paymentId", - "isEnabled" - ], - "type": "object", - "properties": { - "isEnabled": { - "description": "payment active or not('1' for active, others for inactive)", - "type": "string" - }, - "paymentId": { - "description": "Payment Id", - "type": "string" - } - } - } - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Updated company Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "customerId": 2 - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "data": { - "payments": [ - { - "isEnabled": [ - "This field is required." - ] - } - ] - }, - "message": "Bad Request Error" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Payment" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"payments\": [\n {\n \"paymentId\": \"6\",\n \"isEnabled\": \"1\"\n }\n ]\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\"\npayload = {\n \"payments\": [\n {\n \"paymentId\": \"6\",\n \"isEnabled\": \"1\"\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"payments\":[{\"paymentId\":\"6\",\"isEnabled\":\"1\"}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/sales-reps": { - "get": { - "operationId": "companies_sales-reps_list", - "summary": "Get Company Sales Reps", - "description": "Get company sales reps' basic info", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "firstName": { - "description": "Sales rep's first name", - "type": "string" - }, - "id": { - "description": "Sales rep's Id", - "type": "string" - }, - "lastName": { - "description": "Sales rep's last name", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "firstName": "kobe", - "id": "74", - "lastName": "tiantian" - }, - "message": "Success" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "SalesRep" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "companies_sales-reps_update", - "summary": "Update Company Sales reps", - "description": "Update company reps", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "salesReps": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "description": "Sales rep's Id", - "type": "string" - } - } - } - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Updated company Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2" - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field [field]", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "message": "This field is required." - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "SalesRep" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"salesReps\": [\n {\n \"id\": \"74\"\n }\n ]\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\"\npayload = {\n \"salesReps\": [\n {\n \"id\": \"74\"\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"salesReps\":[{\"id\":\"74\"}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/sales-reps\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/user/{customerId}/orders": { - "post": { - "operationId": "companies_user_orders_create", - "summary": "Create An Order", - "description": "Create an order from bigCommerce, you must known order id", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "allOf": [ - { - "type": "object", - "properties": { - "orderId": { - "description": "BigCommerce order id", - "type": "string" - }, - "poNumber": { - "description": "PoNumber", - "type": "string" - }, - "totalIncTax": { - "description": "Total incTax", - "type": "number" - } - }, - "required": [ - "orderId", - "totalIncTax" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" - } - ] - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "orderId": { - "description": "Created order id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "orderId": 2 - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "data": { - "bc_order_id": "orderId can not be null" - }, - "message": "Bad Request Error" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}' \n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders\"\n\npayload = {\n \"totalIncTax\": \"111\",\n \"orderId\": \"111\"\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"totalIncTax\":\"111\",\"orderId\":\"111\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/user/12/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "customerId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/user/{userId}": { - "put": { - "operationId": "companies_user_update", - "summary": "Update A Company User", - "description": "Update a company user info", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "body", - "schema": { - "allOf": [ - { - "type": "object", - "properties": { - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "email": { - "type": "string" - }, - "uuid": { - "type": "string" - }, - "userRole": { - "type": "string" - }, - "acceptWelcomeEmail": { - "type": "string" - }, - "channelIds": { - "type": "array", - "description": "BigCommerce channel id list.", - "items": { - "type": "integer" - } - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "kac8dnjf5qza1" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." - } - } - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - } - } - ], - "responses": { - "200": { - "description": "", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "customerId": { - "type": "integer" - }, - "userId": { - "type": "integer" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": {} - } - }, - "tags": [ - "User" - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "userId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/users": { - "get": { - "operationId": "companies_users_list", - "summary": "Get Company Users", - "description": "Get company users, with pagination data", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "offset", - "in": "query", - "description": "Pagination offset default: 0", - "type": "number" - }, - { - "name": "limit", - "in": "query", - "description": "Pagination limit default: 10", - "type": "number" - }, - { - "name": "role[]", - "in": "query", - "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep) eg. role[]=1, 2", - "type": "string" - }, - { - "type": "string", - "in": "query", - "name": "isIncludeExtraFields", - "description": "0 or 1" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "allOf": [ - { - "type": "object", - "properties": { - "catalogId": { - "description": "Catalog Id", - "type": "string" - }, - "createdAt": { - "description": "User create time", - "type": "string" - }, - "email": { - "description": "User email", - "type": "string" - }, - "firstName": { - "description": "User's first name", - "type": "string" - }, - "id": { - "description": "User Id", - "type": "string" - }, - "lastName": { - "description": "User's last name", - "type": "string" - }, - "phoneNumber": { - "description": "User phone number", - "type": "string" - }, - "role": { - "description": "user role (0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", - "type": "string" - }, - "updatedAt": { - "description": "user update time", - "type": "string" - }, - "uuid": { - "description": "user UUID", - "type": "string" - }, - "channelList": { - "type": "array", - "items": { - "type": "object", - "properties": { - "channelId": { - "type": "integer", - "description": "BigCommerce channel id" - }, - "channelName": { - "type": "string", - "description": "Channel name" - }, - "iconUrl": { - "type": "string", - "description": "Channel icon url" - } - } - } - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "iz7buf5a5b5bq" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." - }, - "companyRoleName": { - "type": "string", - "x-stoplight": { - "id": "jfmg9izfe2w7t" - }, - "description": "The company role name. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." - } - } - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - } - }, - "pagination": { - "description": "Response data pagination", - "type": "object", - "properties": { - "limit": { - "description": "Response pagination limit", - "type": "number" - }, - "offset": { - "description": "Response pagination offset", - "type": "number" - }, - "totalCount": { - "description": "Response data items number", - "type": "number" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "list": [ - { - "catalogId": "1", - "createdAt": "1574999690", - "email": "test323@test.com", - "firstName": "test", - "id": "123", - "lastName": "test2", - "phoneNumber": "", - "role": "1", - "updatedAt": "1574999690", - "uuid": "A123456", - "channelList": [] - } - ], - "pagination": { - "limit": 10, - "offset": 0, - "totalCount": 1 - } - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users?role[]=1,2\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "post": { - "operationId": "companies_users_create", - "summary": "Create A Company User", - "description": "Create a company user, which belongs company", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "allOf": [ - { - "type": "object", - "properties": { - "acceptWelcomeEmail": { - "description": "(0=will not receive email 1=will receive email)", - "type": "string", - "enum": [ - 0, - 1 - ] - }, - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userRole": { - "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", - "type": "string" - }, - "uuid": { - "type": "string" - }, - "channelIds": { - "type": "array", - "description": "BigCommerce channel id list", - "items": { - "type": "integer" - } - }, - "originChannelId": { - "type": "integer", - "description": "BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured" - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "1qhsxeqqydfte" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." - } - }, - "required": [ - "email", - "firstName", - "lastName", - "phone" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - }, - "description": "" - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "customerId": { - "description": "Created bc customer Id", - "type": "string" - }, - "userId": { - "description": "Created user Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "customerId": "2", - "userId": "2" - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 10012, - "data": {}, - "message": "PARAMETER VALUE ERROR" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"firstName\":\"test\",\"lastName\":\"test2\",\"email\":\"test323@test.com\",\"phone\":\"122331212\",\"userRole\":1});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "companies_users_update_or_create", - "summary": "Update Company User", - "description": "Update company user's field, user identified by email field.fields can not omit", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "allOf": [ - { - "type": "object", - "properties": { - "acceptWelcomeEmail": { - "description": "(0=will not receive email 1=will receive email)", - "type": "string", - "enum": [ - 0, - 1 - ] - }, - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userRole": { - "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", - "type": "string" - }, - "uuid": { - "type": "string" - }, - "channelIds": { - "type": "array", - "description": "BigCommerce channel id list", - "items": { - "type": "integer" - } - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "apzeyjj6m09cp" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." - } - }, - "required": [ - "email", - "firstName", - "lastName" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "customerId": { - "description": "Created bc customer Id", - "type": "string" - }, - "userId": { - "description": "Created user Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "customerId": "2", - "userId": "2" - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 10012, - "data": {}, - "message": "PARAMETER VALUE ERROR" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"userRole\": 1\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {\n \"firstName\": \"test\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test.com\",\n \"userRole\": 1\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"firstName\":\"test\",\"lastName\":\"test2\",\"email\":\"test323@test.com\",\"userRole\":1});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/users/bulk_create": { - "post": { - "operationId": "companies_users_bulk_create_create", - "summary": "Bulk Create Company User", - "description": "Create company users in batch", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "acceptWelcomeEmail": { - "description": "(0=will not receive email 1=will receive email)", - "type": "string", - "enum": [ - 0, - 1 - ] - }, - "users": { - "type": "array", - "items": { - "allOf": [ - { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "firstName": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userRole": { - "description": "user role(0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", - "type": "string" - }, - "channelIds": { - "type": "array", - "description": "BigCommerce channel id list", - "items": { - "type": "integer" - } - }, - "originChannelId": { - "type": "integer", - "description": "BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured" - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "y177z48133txw" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field. When it has a value, it will override the value of the userRole field." - } - }, - "required": [ - "email", - "firstName", - "lastName", - "phone" - ] - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - } - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "failedItems": { - "type": "array", - "items": { - "type": "object", - "properties": { - "email": { - "description": "Created user email", - "type": "string" - }, - "firstName": { - "description": "Created user's first name", - "type": "string" - }, - "lastName": { - "description": "Created user's last name", - "type": "string" - }, - "phone": { - "description": "Created user phone", - "type": "string" - }, - "userRole": { - "description": "Created user role", - "type": "number" - } - } - } - }, - "successfulItems": { - "type": "array", - "items": { - "type": "object", - "properties": { - "customerId": { - "description": "Created customer Id", - "type": "number" - }, - "email": { - "description": "Created user email", - "type": "string" - }, - "firstName": { - "description": "Created user's first name", - "type": "string" - }, - "lastName": { - "description": "Created user's last name", - "type": "string" - }, - "phone": { - "description": "Created user phone", - "type": "string" - }, - "userRole": { - "description": "Created user role", - "type": "number" - } - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "failedItems": [], - "successfulItems": [ - { - "customerId": 2, - "email": "test323@test121.com", - "firstName": "test11", - "lastName": "test2", - "phone": "122331211", - "userRole": 1 - }, - { - "customerId": 2, - "email": "test323@test22.com", - "firstName": "test12", - "lastName": "test2", - "phone": "122331212", - "userRole": 1 - } - ] - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 10012, - "data": {}, - "message": "PARAMETER VALUE ERROR" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"users\": [\n {\n \"firstName\": \"test11\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test11.com\",\n \"phone\": \"122331211\",\n \"userRole\": 1\n },\n {\n \"firstName\": \"test12\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test12.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n }\n ]\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create\"\n\npayload = {\n \"users\": [\n {\n \"firstName\": \"test11\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test11.com\",\n \"phone\": \"122331211\",\n \"userRole\": 1\n },\n {\n \"firstName\": \"test12\",\n \"lastName\": \"test2\",\n \"email\": \"test323@test12.com\",\n \"phone\": \"122331212\",\n \"userRole\": 1\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"users\":[{\"firstName\":\"test11\",\"lastName\":\"test2\",\"email\":\"test323@test11.com\",\"phone\":\"122331211\",\"userRole\":1},{\"firstName\":\"test12\",\"lastName\":\"test2\",\"email\":\"test323@test12.com\",\"phone\":\"122331212\",\"userRole\":1}]});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/bulk_create\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/companies/{companyId}/users/{customerId}": { - "get": { - "operationId": "companies_users_read", - "summary": "Get A Company User", - "description": "Get a company user's info, by company and customer id", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "allOf": [ - { - "type": "object", - "properties": { - "catalogId": { - "description": "Catalog Id", - "type": "string" - }, - "createdAt": { - "description": "User create time", - "type": "string" - }, - "email": { - "description": "User email", - "type": "string" - }, - "firstName": { - "description": "User's first name", - "type": "string" - }, - "id": { - "description": "User Id", - "type": "string" - }, - "lastName": { - "description": "User's last name", - "type": "string" - }, - "phoneNumber": { - "description": "User phone number", - "type": "string" - }, - "role": { - "description": "user role (0=admin 1=senior_buyer 2=junior_buyer 3=sales_rep)", - "type": "string" - }, - "updatedAt": { - "description": "user update time", - "type": "string" - }, - "uuid": { - "description": "user UUID", - "type": "string" - }, - "channelList": { - "type": "array", - "items": { - "type": "object", - "properties": { - "channelId": { - "type": "integer", - "description": "BigCommerce channel id" - }, - "channelName": { - "type": "string", - "description": "Channel name" - }, - "iconUrl": { - "type": "string", - "description": "Channel icon url" - } - } - } - }, - "companyRoleId": { - "type": "integer", - "x-stoplight": { - "id": "6ocmpffb3ywgh" - }, - "description": "The company role id. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." - }, - "companyRoleName": { - "type": "string", - "x-stoplight": { - "id": "8853bn9ijoqey" - }, - "description": "The company role name. This field is only applicable to the company's RBAC feature. If your store doesn't utilize this feature, please do not use this field." - } - } - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/extra_field_values.yaml" - } - ] - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "catalogId": "1", - "createdAt": "1574999690", - "email": "test323@test.com", - "firstName": "test", - "id": "123", - "lastName": "test2", - "phoneNumber": "", - "role": "1", - "updatedAt": "1574999690", - "uuid": "A123456", - "channelList": [] - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "delete": { - "operationId": "companies_users_delete", - "summary": "Delete A Company User", - "description": "Delete a company user, if this user is the only one administrator of company, will return a 500 Error", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Deleted successful", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "customerId": { - "description": "Deleted user Id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "customerId": 2 - }, - "message": "Success" - } - } - }, - "404": { - "description": "Company not found", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": {} - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "User" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request DELETE 'https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"DELETE\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'DELETE',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/4/users/15\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "companyId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "customerId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/orders": { - "put": { - "operationId": "orders_update", - "summary": "Update Company Order With BC OrderId", - "description": "Update order, billingAddress and products can not be omitted. products can be two format. \n 1. Product with variants. \n 2. Base product", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "type": "object", - "properties": { - "baseHandlingCost": { - "description": "The value of the base handling cost. (Float, Float-As-String, Integer).", - "type": "string" - }, - "baseShippingCost": { - "description": "The value of the base shipping cost. (Float, Float-As-String, Integer)", - "type": "string" - }, - "baseWrappingCost": { - "description": "The value of the base wrapping cost. (Float, Float-As-String, Integer).", - "type": "string" - }, - "billingAddress": { - "type": "object", - "properties": { - "city": { - "type": "string" - }, - "company": { - "description": "Company name", - "type": "string" - }, - "country": { - "description": "Human readable country name", - "type": "string" - }, - "countryIso2": { - "description": "Country ISO info.", - "type": "string" - }, - "email": { - "description": "Address email.", - "type": "string" - }, - "firstName": { - "description": "Address first name", - "type": "string" - }, - "formFields": { - "description": "Address form fields.", - "type": "string" - }, - "lastName": { - "description": "Address last name", - "type": "string" - }, - "phone": { - "description": "Address phone number", - "type": "string" - }, - "state": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - }, - "streetOne": { - "description": "Typically the street address", - "type": "string" - }, - "streetTwo": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "zip": { - "type": "string" - } - } - }, - "channelId": { - "description": "BigCommerce channel id. Shows where the order originated. The channel_id will default to 1.", - "type": "string" - }, - "creditCardType": { - "description": "Credit card type.", - "type": "string" - }, - "customerMessage": { - "description": "Message that the customer entered (number, optiona) -o the Order Comments box during checkout.", - "type": "string" - }, - "dateCreated": { - "description": "Date created.", - "type": "string" - }, - "discountAmount": { - "description": "Amount of discount for this transaction. (Float, Float-As-String, Integer)", - "type": "string" - }, - "ebayOrderId": { - "description": "If the order was placed through eBay, the eBay order number will be included. Otherwise, the value will be 0.", - "type": "string" - }, - "externalId": { - "description": "ID of the order in another system. For example, the Amazon Order ID if this is an Amazon order.This field can be updated in a /POST, but using a /PUT to update the order will return a 400 error. The field ‘external_id’ cannot be written to. Please remove it from your request before trying again. It can not be overwritten once set..", - "type": "string" - }, - "externalMerchantId": { - "description": "Id of the external merchant.", - "type": "string" - }, - "externalSource": { - "description": "For orders submitted or modified via the API, using a PUT or POST operation, you can optionally pass in a value identifying the system used to generate the order. For example: POS. Otherwise, the value will be null.", - "type": "string" - }, - "geoipCountry": { - "description": "The full name of the country where the customer made the purchase, based on the IP.", - "type": "string" - }, - "geoipCountryIso2": { - "description": "The country where the customer made the purchase, in ISO2 format, based on the IP.", - "type": "string" - }, - "giftCertificateAmount": { - "description": "A read-only value. Do not pass in a POST or PUT. (Float, Float-As-String, Integer)", - "type": "string" - }, - "handlingCostExTax": { - "description": "The value of the handling cost, excluding tax. (Float, Float-As-String, Integer)", - "type": "string" - }, - "handlingCostIncTax": { - "description": "The value of the handling cost, including tax. (Float, Float-As-String, Integer).", - "type": "string" - }, - "ipAddress": { - "description": "IP Address of the customer, if known.", - "type": "string" - }, - "isDeleted": { - "description": "Indicates whether the order was deleted (archived). Set to to true, to archive an order.", - "type": "string" - }, - "itemsShipped": { - "description": "The number of items that have been shipped.", - "type": "string" - }, - "itemsTotal": { - "description": "The total number of items in the order.", - "type": "string" - }, - "orderId": { - "description": "BigCommerce order id", - "type": "string" - }, - "orderIsDigital": { - "description": "Whether this is an order for digital products.", - "type": "string" - }, - "paymentMethod": { - "description": "The payment method for this order. Can be one of the following: Manual, Credit Card, cash, Test Payment Gateway, etc.", - "type": "string" - }, - "paymentProviderId": { - "description": "The external Transaction ID/Payment ID within this order’s payment provider (if a payment provider was used).", - "type": "string" - }, - "poNumber": { - "description": "PoNumber", - "type": "string" - }, - "products": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "priceExTax": { - "type": "string" - }, - "priceIncTax": { - "type": "string" - }, - "productId": { - "description": "Product id.", - "type": "string" - }, - "productOptions": { - "type": "string" - }, - "quantity": { - "type": "string" - }, - "sku": { - "type": "string" - }, - "upc": { - "type": "string" - }, - "variantId": { - "type": "string" - } - } - } - }, - "refundedAmount": { - "description": "The amount refunded from this transaction. (Float, Float-As-String, Integer)", - "type": "string" - }, - "shippingCostExTax": { - "description": "The value of shipping cost, excluding tax. (Float, Float-As-String, Integer).", - "type": "string" - }, - "shippingCostIncTax": { - "description": "The value of shipping cost, including tax. (Float, Float-As-String, Integer).", - "type": "string" - }, - "staffNotes": { - "description": "Any additional notes for staff.", - "type": "string" - }, - "statusId": { - "description": "The status ID of the order.", - "type": "string" - }, - "subtotalExTax": { - "description": "Override value for subtotal excluding tax. If specified, the field subtotal_inc_tax is also required. (Float, Float-As-String, Integer)", - "type": "string" - }, - "subtotalIncTax": { - "description": "TOverride value for subtotal including tax. If specified, the field subtotal_ex_tax is also required. (Float, Float-As-String, Integer)", - "type": "string" - }, - "taxProviderId": { - "description": "Tax provider id.", - "type": "string" - }, - "totalExTax": { - "description": "Override value for the total, excluding tax. If specified, the field total_inc_tax is also required. (Float, Float-As-String, Integer)", - "type": "string" - }, - "wrappingCostExTax": { - "description": "The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer).", - "type": "string" - }, - "wrappingCostIncTax": { - "description": "The value of the wrapping cost, including tax. (Float, Float-As-String, Integer).", - "type": "string" - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "companyId": { - "description": "Updated order id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "orderId": 2 - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error Message", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40010, - "data": { - "errMsg": "bc internal server error" - }, - "message": "Bad Requests Error" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'https://api-b2b.bigcommerce.com/api/v2/io/orders' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' --data-raw '{\n \"orderId\": 117,\n \"statusId\": 0,\n \"billingAddress\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"streetOne\": \"123 Main Street\",\n \"city\": \"Austin\",\n \"state\": \"Texas\",\n \"zip\": \"78751\",\n \"country\": \"United States\",\n \"countryIso2\": \"US\",\n \"email\": \"janedoe@email.com\"\n },\n \"products\": [\n {\n \"name\": \"BigCommerce Poster\",\n \"quantity\": 1,\n \"priceIncTax\": 10.98,\n \"priceExTax\": 10\n },\n {\n \"name\": \"BigCommerce Coffee Mug\",\n \"quantity\": 1,\n \"priceIncTax\": 50,\n \"priceExTax\": 45\n }\n ]\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders\"\npayload = {\n \"orderId\": 117,\n \"statusId\": 0,\n \"billingAddress\": {\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"streetOne\": \"123 Main Street\",\n \"city\": \"Austin\",\n \"state\": \"Texas\",\n \"zip\": \"78751\",\n \"country\": \"United States\",\n \"countryIso2\": \"US\",\n \"email\": \"janedoe@email.com\"\n },\n \"products\": [\n {\n \"name\": \"BigCommerce Poster\",\n \"quantity\": 1,\n \"priceIncTax\": 10.98,\n \"priceExTax\": 10\n },\n {\n \"name\": \"BigCommerce Coffee Mug\",\n \"quantity\": 1,\n \"priceIncTax\": 50,\n \"priceExTax\": 45\n }\n ]\n}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"PUT\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"orderId\":117,\"statusId\":0,\"billingAddress\":{\"firstName\":\"Jane\",\"lastName\":\"Doe\",\"streetOne\":\"123 Main Street\",\"city\":\"Austin\",\"state\":\"Texas\",\"zip\":\"78751\",\"country\":\"United States\",\"countryIso2\":\"US\",\"email\":\"janedoe@email.com\"},\"products\":[{\"name\":\"BigCommerce Poster\",\"quantity\":1,\"priceIncTax\":10.98,\"priceExTax\":10},{\"name\":\"BigCommerce Coffee Mug\",\"quantity\":1,\"priceIncTax\":50,\"priceExTax\":45}]});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/orders/company": { - "post": { - "operationId": "orders_company_create", - "summary": "Update BC Order's 'Company attribute'", - "description": "Add Company identifier for BigCommerce Customer Individual Orders, which can be used to convert BigCommerce Customer Individual Orders to Company-level Orders.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "required": [ - "customerID" - ], - "type": "object", - "properties": { - "customerID": { - "description": "BigCommerce user id.", - "type": "string" - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object" - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": {}, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40013, - "data": {}, - "message": "Store does not exist." - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'localhost:8000/api/v2/io/orders/convert-from-bc' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4' --header 'Content-Type: application/json' --data-raw '{\n \"customerID\": \"7566\"\n}'\n" - }, - { - "lang": "Python", - "source": "\n import requests\n\n url = \"localhost:8000/api/v2/io/orders/convert-from-bc\"\n\n payload = \"{\n \"customerID\": \"7566\"\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"POST\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImtpZG8uemhhb0BidW5kbGViMmIubmV0Iiwic3RvcmVfaGFzaCI6IjFpNnpweHBlM2ciLCJkYiI6ImRlZmF1bHQiLCJpc19iYWNrZW5kX3VzZXIiOiIyIn0.BpLPDLnmSEHgXw5Rf06G2kp0bKbMaJhxSxAuUW9vRo4\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"customerID\":\"7566\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/orders/convert-from-bc\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "put": { - "operationId": "orders_company_update", - "summary": "Update B2BE User's Orders' company attribute.", - "description": "Update the orders belong to a B2BE company to another B2BE company.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "required": [ - "customerID", - "customerGroupID" - ], - "type": "object", - "properties": { - "customerGroupID": { - "description": "BigCommerce customer group id.", - "type": "string" - }, - "customerID": { - "description": "BigCommerce user id.", - "type": "string" - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object" - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": {}, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40013, - "data": {}, - "message": "Store does not exist." - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request PUT 'localhost:8000/api/v2/io/orders/company' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js' --header 'Content-Type: application/json' --data-raw '{\n \"customerGroupID\": \"6406\",\n \"customerID\": \"7298\"\n}'\n" - }, - { - "lang": "Python", - "source": "\n import requests\n\n url = \"localhost:8000/api/v2/io/orders/company\"\n\n payload = \"{\n \"customerGroupID\": \"6406\",\n \"customerID\": \"7298\"\n}\"\n headers = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js',\n 'Content-Type': 'application/json'\n }\n\n response = requests.request(\"PUT\", url, headers=headers, data = payload)\n\n print(response.text.encode('utf8'))\n )\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiMWk2enB4cGUzZyIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoia2lkby56aGFvQGJ1bmRsZWIyYi5uZXQifQ.fB8TtxpTDdhOUmR_7gYV16w9nV3Kp0US52W8JMHG1js\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"customerGroupID\":\"6406\",\"customerID\":\"7298\"});\n\nvar requestOptions = {\n method: 'PUT',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"localhost:8000/api/v2/io/orders/company\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/orders/images": { - "get": { - "operationId": "orders_images_list", - "summary": "Get Orders Images", - "description": "Get all orders' images", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "orderIds", - "in": "query", - "description": "Query order ids", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "", - "type": "array", - "items": { - "type": "object", - "properties": { - "imageUrl": { - "description": "Image url.", - "type": "string" - }, - "orderId": { - "description": "Order id.", - "type": "string" - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": [ - { - "imageUrl": "https://www.google.com/imgres?imgurl=https%3A%2F%2Fimg.freepik.com%2Ffree-vector%2Fbroken-frosted-glass-realistic-icon_1284-12125.jpg%3Fsize%3D338%26ext%3Djpg&imgrefurl=https%3A%2F%2Fwww.freepik.com%2Ffree-photos-vectors%2Fpng&tbnid=tiRj4_jn2S_1DM&vet=12ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ..i&docid=kU78UyWVW14S1M&w=338&h=338&q=png&ved=2ahUKEwj_m-T-m8LqAhUTq54KHXruCV4QMygCegUIARDRAQ", - "orderId": "1" - } - ], - "message": "Success" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/images' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/images\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/images\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/orders/{orderBCId}/companyIdBCId": { - "get": { - "operationId": "orders_companyIdBCId_list", - "summary": "Get Company By BC OrderId", - "description": "Get company basic info by bc order id", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "type": "object", - "properties": { - "companyId": { - "description": "Company id", - "type": "string" - }, - "companyName": { - "description": "Company name", - "type": "string" - }, - "customerGroupId": { - "description": "company customer group id", - "type": "string" - }, - "extraInt1": { - "description": "Extra number", - "type": "number" - }, - "extraInt2": { - "description": "Extra number", - "type": "number" - }, - "extraInt3": { - "description": "Extra number", - "type": "number" - }, - "extraInt4": { - "description": "Extra number", - "type": "number" - }, - "extraInt5": { - "description": "Extra number", - "type": "number" - }, - "extraStr1": { - "description": "Extra string", - "type": "string" - }, - "extraStr2": { - "description": "Extra string", - "type": "string" - }, - "extraStr3": { - "description": "Extra string", - "type": "string" - }, - "extraStr4": { - "description": "Extra string", - "type": "string" - }, - "extraStr5": { - "description": "Extra string", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2", - "companyName": "ABC.LLC", - "customerGroupId": "11", - "extraInt1": 0, - "extraInt2": 0, - "extraInt3": 0, - "extraInt4": 0, - "extraInt5": 0, - "extraStr1": "", - "extraStr2": "", - "extraStr3": "", - "extraStr4": "", - "extraStr5": "" - }, - "message": "Success" - } - } - }, - "400": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "data": { - "description": "Response error data", - "type": "object", - "properties": { - "[field]": { - "description": "Message about problem with field 'field'", - "type": "string" - } - } - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 40013, - "data": {}, - "message": "Order does not exist." - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/23/companyIdBCId\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "orderBCId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/orders/{orderId}/companyId": { - "get": { - "operationId": "orders_companyId_list", - "summary": "Get Company Id By Order Id", - "description": "Get company ID by order id", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "type": "object", - "properties": { - "companyId": { - "description": "Company id", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "companyId": "2" - }, - "message": "Success" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/companyId\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "orderId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/orders/{orderId}/details": { - "get": { - "operationId": "orders_details_list", - "summary": "Get Order Detail", - "description": "Get order's Detail", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "allOf": [ - { - "type": "object", - "properties": { - "base_handling_cost": { - "description": "eg. 0.0000", - "type": "string" - }, - "base_shipping_cost": { - "description": "eg. 0.0000", - "type": "string" - }, - "base_wrapping_cost": { - "description": "eg. 0.0000", - "type": "string" - }, - "billingAddress": { - "type": "object", - "properties": { - "city": { - "type": "string" - }, - "company": { - "description": "Company name", - "type": "string" - }, - "country": { - "description": "Human readable country name", - "type": "string" - }, - "countryIso2": { - "description": "Country ISO info.", - "type": "string" - }, - "email": { - "description": "Address email.", - "type": "string" - }, - "firstName": { - "description": "Address first name", - "type": "string" - }, - "formFields": { - "description": "Address form fields.", - "type": "string" - }, - "lastName": { - "description": "Address last name", - "type": "string" - }, - "phone": { - "description": "Address phone number", - "type": "string" - }, - "state": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - }, - "streetOne": { - "description": "Typically the street address", - "type": "string" - }, - "streetTwo": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "zip": { - "type": "string" - } - } - }, - "cart_id": { - "description": "eg. 5e70bf45-9271-4737-8a80-94f7c99c2e2b", - "type": "string" - }, - "coupon_discount": { - "description": "eg. 0.00000", - "type": "string" - }, - "credit_card_type": { - "description": "eg. null", - "type": "string" - }, - "currency_code": { - "description": "eg. USD", - "type": "string" - }, - "currency_exchange_rate": { - "description": "eg. 1.0000000", - "type": "string" - }, - "currency_id": { - "description": "eg. 1", - "type": "number" - }, - "customer_id": { - "description": "eg. 168", - "type": "number" - }, - "customer_message": { - "description": "eg. 123", - "type": "string" - }, - "date_created": { - "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", - "type": "string" - }, - "date_modified": { - "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", - "type": "string" - }, - "date_shipped": { - "description": "eg. 'Tue, 29 Oct 2019 09:58:32 +0000'", - "type": "string" - }, - "default_currency_code": { - "description": "eg. USD", - "type": "string" - }, - "default_currency_id": { - "description": "eg. 1", - "type": "number" - }, - "discount_amount": { - "description": "eg. 0.00000", - "type": "string" - }, - "ebay_order_id": { - "description": "eg. 0", - "type": "string" - }, - "external_source": { - "description": "eg. ", - "type": "string" - }, - "geoip_country": { - "description": "eg. China", - "type": "string" - }, - "geoip_country_iso2": { - "description": "eg. CN", - "type": "string" - }, - "gift_certificate_amount": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_ex_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_inc_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_tax_class_id": { - "description": "eg. 2", - "type": "number" - }, - "id": { - "description": "Order id", - "type": "string" - }, - "ip_address": { - "description": "eg. 118.112.75.229", - "type": "string" - }, - "is_deleted": { - "description": "eg. False", - "type": "boolean" - }, - "is_email_opt_in": { - "description": "eg. false", - "type": "boolean" - }, - "items_shipped": { - "description": "eg. 2", - "type": "number" - }, - "items_total": { - "description": "eg. 2", - "type": "number" - }, - "order_is_digital": { - "type": "boolean" - }, - "order_source": { - "description": "eg. www", - "type": "string" - }, - "payment_method": { - "description": "eg. PO", - "type": "string" - }, - "payment_provider_id": { - "description": "payment provider id", - "type": "string" - }, - "payment_status": { - "description": "eg. AwaitingPayment", - "type": "string" - }, - "products": { - "type": "array", - "items": { - "type": "object", - "properties": { - "applied_discounts": { - "description": "eg. []", - "type": "string" - }, - "base_cost_price": { - "description": "eg. 1.0000", - "type": "string" - }, - "base_price": { - "description": "eg. 22.5000", - "type": "string" - }, - "base_total": { - "description": "eg. 140.0000", - "type": "string" - }, - "base_wrapping_cost": { - "description": "eg. 1.0000", - "type": "string" - }, - "bin_picking_number": { - "description": "eg. 1", - "type": "string" - }, - "configurable_fields": { - "description": "eg. []", - "type": "string" - }, - "cost_price_ex_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "cost_price_inc_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "cost_price_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "coupons": { - "type": "object", - "properties": { - "resource": { - "description": "eg. /orders/123/coupons", - "type": "string" - }, - "url": { - "description": "coupon url", - "type": "string" - } - } - }, - "custom_status": { - "description": "eg. Awaiting Payment", - "type": "string" - }, - "depth": { - "description": "eg. 1.0000", - "type": "string" - }, - "ebay_item_id": { - "description": "eg. 1", - "type": "string" - }, - "ebay_transaction_id": { - "description": "eg. 1", - "type": "string" - }, - "event_date": { - "description": "eg. 1.0000", - "type": "string" - }, - "event_name": { - "description": "eg. 1.0000", - "type": "string" - }, - "external_id": { - "description": "eg. null", - "type": "string" - }, - "external_merchant_id": { - "description": "eg. null", - "type": "string" - }, - "fixed_shipping_cost": { - "description": "eg. 1.0000", - "type": "string" - }, - "fulfillment_source": { - "description": "eg. []", - "type": "string" - }, - "height": { - "description": "eg. 1.0000", - "type": "string" - }, - "id": { - "description": "eg 1.", - "type": "string" - }, - "is_bundled_product": { - "description": "eg. false", - "type": "boolean" - }, - "is_refunded": { - "description": "eg. false", - "type": "boolean" - }, - "name": { - "type": "string" - }, - "option_set_id": { - "description": "eg. 1", - "type": "string" - }, - "order_address_id": { - "description": "eg. 24", - "type": "string" - }, - "order_id": { - "description": "eg 3.", - "type": "string" - }, - "parent_order_product_id": { - "description": "eg. 1", - "type": "string" - }, - "poNumber": { - "type": "object", - "properties": { - "resource": { - "description": "eg. orders/123/shippingaddresses/24/shippingquotes", - "type": "string" - }, - "url": { - "description": "shipping quote url", - "type": "string" - } - } - }, - "priceExTax": { - "type": "string" - }, - "priceIncTax": { - "type": "string" - }, - "price_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "productId": { - "description": "Product id.", - "type": "string" - }, - "productOptions": { - "type": "string" - }, - "product_options": { - "description": "eg. []", - "type": "string" - }, - "quantity": { - "type": "string" - }, - "quantity_refunded": { - "description": "eg. 1.0000", - "type": "string" - }, - "quantity_shipped": { - "description": "eg. 1", - "type": "number" - }, - "refund_amount": { - "description": "eg. 1.0000", - "type": "string" - }, - "return_id": { - "description": "eg. 1.0000", - "type": "number" - }, - "shipments": { - "description": "eg. false", - "type": "boolean" - }, - "shipping_address": { - "type": "object", - "properties": { - "resource": { - "description": "eg. /orders/123/shippingaddresses", - "type": "string" - }, - "url": { - "description": "shipping address url", - "type": "string" - } - } - }, - "sku": { - "type": "string" - }, - "store_default_currency_code": { - "description": "eg. USD", - "type": "string" - }, - "store_default_to_transactional_exchange_rate": { - "description": "eg. 1.00000000", - "type": "string" - }, - "tax_provider_id": { - "description": "eg. BasicTaxProvider", - "type": "string" - }, - "total_ex_tax": { - "description": "eg. 140.0000", - "type": "string" - }, - "total_inc_tax": { - "description": "eg. 140.0000", - "type": "string" - }, - "total_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "type": { - "description": "eg. physical", - "type": "string" - }, - "upc": { - "type": "string" - }, - "variantId": { - "type": "string" - }, - "variant_id": { - "description": "eg. 74", - "type": "string" - }, - "weight": { - "description": "eg. 1.0000", - "type": "string" - }, - "width": { - "description": "eg. 1.0000", - "type": "string" - }, - "wrapping_cost_ex_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "wrapping_cost_inc_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "wrapping_cost_tax": { - "description": "eg. 1.0000", - "type": "string" - }, - "wrapping_message": { - "description": "eg. 1.0000", - "type": "string" - }, - "wrapping_name": { - "description": "eg. 1.0000", - "type": "string" - } - } - } - }, - "refunded_amount": { - "description": "eg. 0.0000", - "type": "string" - }, - "shippingAddress": { - "type": "object", - "properties": { - "base_cost": { - "description": "eg. 0.0000", - "type": "string" - }, - "base_handling_cost": { - "description": "eg. 0.0000", - "type": "string" - }, - "city": { - "type": "string" - }, - "company": { - "description": "Company name", - "type": "string" - }, - "cost_ex_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "cost_inc_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "cost_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "cost_tax_class_id": { - "description": "eg. 20", - "type": "string" - }, - "country": { - "description": "Human readable country name", - "type": "string" - }, - "countryIso2": { - "description": "Country ISO info.", - "type": "string" - }, - "email": { - "description": "Address email.", - "type": "string" - }, - "firstName": { - "description": "Address first name", - "type": "string" - }, - "formFields": { - "description": "Address form fields.", - "type": "string" - }, - "form_fields": { - "description": "eg. []", - "type": "string" - }, - "handling_cost_ex_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_inc_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "handling_cost_tax_class_id": { - "description": "eg. 1", - "type": "number" - }, - "items_shipped": { - "description": "eg. 6", - "type": "string" - }, - "items_total": { - "description": "eg. 6", - "type": "string" - }, - "lastName": { - "description": "Address last name", - "type": "string" - }, - "phone": { - "description": "Address phone number", - "type": "string" - }, - "shipping_method": { - "description": "eg. Free Shipping", - "type": "string" - }, - "shipping_quoteseg": { - "type": "object" - }, - "shipping_zone_id": { - "description": "eg. 1", - "type": "number" - }, - "shipping_zone_name": { - "description": "eg. United States1", - "type": "string" - }, - "state": { - "description": "Human readable state (or other subdivision) name", - "type": "string" - }, - "streetOne": { - "description": "Typically the street address", - "type": "string" - }, - "streetTwo": { - "description": "More detailed information about where to deliver mail, such as a suite or office number", - "type": "string" - }, - "zip": { - "type": "string" - } - } - }, - "shipping_address_count": { - "description": "eg. 1", - "type": "number" - }, - "shipping_cost_ex_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "shipping_cost_inc_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "shipping_cost_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "shipping_cost_tax_class_id": { - "description": "eg. 2", - "type": "number" - }, - "staff_notes": { - "type": "string" - }, - "status": { - "description": "eg. Awaiting Payment", - "type": "string" - }, - "status_id": { - "description": "eg. 8", - "type": "number" - }, - "store_credit_amount": { - "description": "eg. 0.0000", - "type": "string" - }, - "subtotal_ex_tax": { - "description": "eg. 135.0000", - "type": "string" - }, - "subtotal_inc_tax": { - "description": "eg. 135.0000", - "type": "string" - }, - "subtotal_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "total_ex_tax": { - "description": "eg. 135.0000", - "type": "string" - }, - "total_inc_tax": { - "description": "eg. 135.0000", - "type": "string" - }, - "total_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "wrapping_cost_ex_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "wrapping_cost_inc_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "wrapping_cost_tax": { - "description": "eg. 0.0000", - "type": "string" - }, - "wrapping_cost_tax_class_id": { - "description": "eg. 2", - "type": "number" - }, - "channelId": { - "type": "integer", - "description": "BigCommerce channel id" - }, - "channelName": { - "type": "string", - "description": "Channel name" - } - } - }, - { - "$ref": "https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/order/order-extra.yaml" - } - ] - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "base_handling_cost": "0.0000", - "base_shipping_cost": "0.0000", - "base_wrapping_cost": "0.0000", - "billing_address": { - "city": "Irvine", - "company": "qqqq", - "country": "United States", - "country_iso2": "US", - "email": "15002803905@163.com", - "first_name": "sdsdsd", - "form_fields": [], - "last_name": "errte", - "phone": "9497486023", - "state": "California", - "street_1": "15440 Laguna Canyon Road, Ste 213", - "street_2": "ssadsdas", - "zip": "92618" - }, - "cart_id": "f6a167af-fdc2-4409-8282-0358c36b46c5", - "channel_id": "1", - "coupon_discount": "0.0000", - "coupons": { - "resource": "/orders/126/coupons", - "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/coupons" - }, - "credit_card_type": "", - "currency_code": "USD", - "currency_exchange_rate": "1.0000000000", - "currency_id": 1, - "custom_status": "Awaiting Payment", - "customer_id": 168, - "customer_message": "123456\n123456798", - "date_created": "Tue, 29 Oct 2019 12:33:25 +0000", - "date_modified": "Tue, 29 Oct 2019 12:33:29 +0000", - "date_shipped": "", - "default_currency_code": "USD", - "default_currency_id": 1, - "discount_amount": "0.0000", - "ebay_order_id": "0", - "external_id": null, - "external_merchant_id": null, - "external_source": "", - "geoip_country": "China", - "geoip_country_iso2": "CN", - "gift_certificate_amount": "0.0000", - "handling_cost_ex_tax": "0.0000", - "handling_cost_inc_tax": "0.0000", - "handling_cost_tax": "0.0000", - "handling_cost_tax_class_id": 2, - "id": "126", - "ip_address": "171.213.12.107", - "is_deleted": false, - "is_email_opt_in": false, - "items_shipped": 0, - "items_total": 20, - "order_is_digital": false, - "order_source": "www", - "payment_method": "PO", - "payment_provider_id": "", - "payment_status": "", - "poNumber": "123456798", - "products": [ - { - "applied_discounts": "", - "base_cost_price": "0.0000", - "base_price": "5.0019", - "base_total": "100.0000", - "base_wrapping_cost": "0.0000", - "bin_picking_number": "", - "configurable_fields": "", - "cost_price_ex_tax": "0.0000", - "cost_price_inc_tax": "0.0000", - "cost_price_tax": "0.0000", - "depth": "0.0000", - "ebay_item_id": "", - "ebay_transaction_id": "", - "event_date": "", - "event_name": "", - "external_id": "", - "fixed_shipping_cost": "0.0000", - "fulfillment_source": "", - "height": "0.0000", - "id": "39", - "is_bundled_product": false, - "is_refunded": false, - "name": "[Sample] Tiered Wire Basket", - "option_set_id": "", - "order_address_id": "27", - "order_id": "126", - "parent_order_product_id": "", - "price_ex_tax": "5.0000", - "price_inc_tax": "5.0000", - "price_tax": "0.0000", - "product_id": 97, - "product_options": "", - "quantity": "20", - "quantity_refunded": "0", - "quantity_shipped": 0, - "refund_amount": "0.0000", - "return_id": 0, - "sku": "TWB", - "total_ex_tax": "100.0000", - "total_inc_tax": "100.0000", - "total_tax": "0.0000", - "type": "physical", - "upc": "", - "variant_id": "69", - "weight": "1.0000", - "width": "0.0000", - "wrapping_cost_ex_tax": "0.0000", - "wrapping_cost_inc_tax": "0.0000", - "wrapping_cost_tax": "0.0000", - "wrapping_message": "", - "wrapping_name": "" - } - ], - "refunded_amount": "0.0000", - "shipments": false, - "shippingAddress": { - "base_cost": "0.0000", - "base_handling_cost": "0.0000", - "city": "Irvine", - "company": "qqqq", - "cost_ex_tax": "0.0000", - "cost_inc_tax": "0.0000", - "cost_tax": "0.0000", - "cost_tax_class_id": "2", - "country": "United States", - "country_iso2": "US", - "email": "15002803905@163.com", - "first_name": "sdsdsd", - "form_fields": "", - "handling_cost_ex_tax": "0.0000", - "handling_cost_inc_tax": "0.0000", - "handling_cost_tax": "0.0000", - "handling_cost_tax_class_id": 2, - "id": 27, - "items_shipped": "0", - "items_total": "20", - "last_name": "errte", - "order_id": 126, - "phone": "9497486023", - "shipping_method": "Free Shipping", - "shipping_quotes": { - "resource": "/orders/126/shippingaddresses/27/shippingquotes", - "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses/27/shippingquotes" - }, - "shipping_zone_id": 1, - "shipping_zone_name": "United States", - "state": "California", - "street_1": "15440 Laguna Canyon Road, Ste 213", - "street_2": "ssadsdas", - "zip": "92618" - }, - "shipping_address_count": 1, - "shipping_addresses": { - "resource": "/orders/126/shippingaddresses", - "url": "https://api.bigcommerce.com/stores/1i6zpxpe3g/v2/orders/126/shippingaddresses" - }, - "shipping_cost_ex_tax": "0.0000", - "shipping_cost_inc_tax": "0.0000", - "shipping_cost_tax": "0.0000", - "shipping_cost_tax_class_id": 2, - "staff_notes": "", - "status": "Awaiting Payment", - "status_id": 7, - "store_credit_amount": "0.0000", - "store_default_currency_code": "USD", - "store_default_to_transactional_exchange_rate": "1.0000000000", - "subtotal_ex_tax": "100.0000", - "subtotal_inc_tax": "100.0000", - "subtotal_tax": "0.0000", - "tax_provider_id": "BasicTaxProvider", - "total_ex_tax": "100.0000", - "total_inc_tax": "100.0000", - "total_tax": "0.0000", - "wrapping_cost_ex_tax": "0.0000", - "wrapping_cost_inc_tax": "0.0000", - "wrapping_cost_tax": "0.0000", - "wrapping_cost_tax_class_id": 3, - "extraStr1": "customize additional information", - "extraStr2": "customize additional information", - "extraStr3": "customize additional information", - "extraStr4": "customize additional information", - "extraStr5": "customize additional information", - "extraText": "customize additional information", - "extraInfo": { - "addressExtraFields": { - "shippingAddressExtraFields": [ - { - "fieldName": "test", - "fieldValue": "test" - } - ], - "billingAddressExtraFields": [ - { - "fieldName": "test", - "fieldValue": "test" - } - ] - } - } - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Order Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/details\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "orderId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/orders/{orderId}/products": { - "get": { - "operationId": "orders_products_list", - "summary": "Get Order Product", - "description": "Get order's products info", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "type": "object", - "properties": { - "optionList": { - "description": "", - "type": "array", - "items": { - "type": "object", - "properties": { - "option_id": { - "description": "Product option ID", - "type": "string" - }, - "option_value": { - "description": "Product option value", - "type": "string" - } - } - } - }, - "productId": { - "description": "Product id", - "type": "string" - }, - "quantity": { - "description": "Product quantity", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "optionList": [], - "productId": "97", - "quantity": "20", - "variantId": "69" - }, - "message": "Success" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Order Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Order" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/orders/12/products\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "orderId", - "in": "path", - "required": true, - "type": "string" - } - ] - }, - "/proxy": { - "post": { - "operationId": "proxy_create", - "summary": "Third party API proxy", - "description": "Get response data of third party APIs through this API.", - "parameters": [ - { - "name": "data", - "in": "body", - "required": true, - "schema": { - "description": "Request body", - "required": [ - "method", - "url", - "proxyType" - ], - "type": "object", - "properties": { - "data": { - "description": "Request data of your third party request", - "type": "string" - }, - "method": { - "description": "HTTP request method, get/post/put/delete", - "type": "string" - }, - "params": { - "description": "Request parameters of your third party request", - "type": "string" - }, - "proxyType": { - "description": "Third party type or name, such as BigCommerce", - "type": "string" - }, - "url": { - "description": "Url of request", - "type": "string" - } - } - } - }, - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "message": "Success" - } - } - }, - "500": { - "description": "Response Bad Request", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status error code", - "type": "number" - }, - "message": { - "description": "Response error message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 500, - "message": "Bigcommerce API error" - } - } - } - }, - "tags": [ - "Proxy" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request POST 'https://api-b2b.bigcommerce.com/api/v2/io/proxy' --header 'Content-Type: application/json' --data-raw '{\n \"method\": \"get\",\n \"url\": \"/v2/customers\",\n \"proxyType\": \"Bigcommerce\"\n}'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/proxy\"\n\npayload = \"{\"method\": \"get\", \"url\": \"/v2/customers\",\"proxyType\": \"Bigcommerce\"}\"\nheaders = {\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar raw = JSON.stringify({\"method\": \"get\", \"url\": \"/v2/customers\", \"proxyType\": \"Bigcommerce\"});\n\nvar requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: raw,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/companies/23/addresses\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/sales-reps/companies": { - "get": { - "operationId": "sales-reps_companies_list", - "summary": "Get Companies & Sales reps", - "description": "Get all companies and their sales reps, default order by company", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - }, - { - "name": "offset", - "in": "query", - "description": "Pagination offset default: 0", - "type": "number" - }, - { - "name": "limit", - "in": "query", - "description": "Pagination limit default: 10", - "type": "number" - }, - { - "name": "groupBy", - "in": "query", - "description": "Group by('2' for company, '1' for sales reps)", - "type": "number" - }, - { - "name": "orderBy", - "in": "query", - "description": "Order by default DESC choice (DESC ASC)", - "type": "number" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "list": { - "description": "This interface has 2 type response data type, if get with groupBy 2 will return company info, if get with groupBy 1 will return sales reps info", - "type": "array", - "items": { - "type": "object", - "properties": { - "catalogId": { - "description": "Catalog Id(groupBy: 2)", - "type": "string" - }, - "city": { - "description": "Company city(groupBy: 2)", - "type": "string" - }, - "companyCount": { - "description": "Sales rep's company count (groupBy: 1)", - "type": "string" - }, - "companyEmail": { - "description": "Company name(groupBy: 2)", - "type": "string" - }, - "companyId": { - "description": "Company Id(groupBy: 2)", - "type": "string" - }, - "companyName": { - "description": "Company name(groupBy: 2)", - "type": "string" - }, - "country": { - "description": "Company country(groupBy: 2)", - "type": "string" - }, - "email": { - "description": "Sales rep's email (groupBy: 1)", - "type": "string" - }, - "firstName": { - "description": "Sales rep's first name(groupBy: 1)", - "type": "string" - }, - "lastName": { - "description": "Sales rep's last name(groupBy: 1)", - "type": "string" - }, - "role": { - "description": "Sales rep's role (groupBy: 1)", - "type": "string" - }, - "salesRepCount": { - "description": "Company's sales reps count(groupBy: 2)", - "type": "string" - }, - "salesRepId": { - "description": "Sales rep's Id (groupBy: 1)", - "type": "string" - }, - "state": { - "description": "Company state(groupBy: 2)", - "type": "string" - }, - "zipCode": { - "description": "Company zip code(groupBy: 2)", - "type": "string" - }, - "channelList": { - "type": "array", - "items": { - "type": "object", - "properties": { - "channelId": { - "type": "integer", - "description": "BigCommerce channel id" - }, - "channelName": { - "type": "string", - "description": "Channel name" - }, - "iconUrl": { - "type": "string", - "description": "Icon url" - } - } - } - } - } - } - }, - "pagination": { - "description": "Response data pagination", - "type": "object", - "properties": { - "limit": { - "description": "Response pagination limit", - "type": "number" - }, - "offset": { - "description": "Response pagination offset", - "type": "number" - }, - "totalCount": { - "description": "Response data items number", - "type": "number" - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "list": [ - { - "addressLine1": "", - "addressLine2": "", - "catalogId": "2", - "city": "", - "companyEmail": "kobe.tian@bunldeb2b.com", - "companyId": "34", - "companyName": "KobeCropTest111", - "country": ",", - "description": "KobeCropTest111", - "salesRepCount": "2", - "state": "", - "zipCode": "" - } - ], - "pagination": { - "limit": 10, - "offset": 0, - "totalCount": 1 - } - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "SalesRep" - ] - }, - "parameters": [] - }, - "/store/payments": { - "get": { - "operationId": "store_payments_list", - "summary": "Get Store's All Payments", - "description": "Get store's all payments", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "list": { - "description": "", - "type": "array", - "items": { - "type": "object", - "properties": { - "paymentCode": { - "description": "Payment method code", - "type": "string" - }, - "paymentTitle": { - "description": "Payment method title", - "type": "string" - } - } - } - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "list": [ - { - "paymentCode": "authorizenet", - "paymentTitle": "Authorize.net" - }, - { - "paymentCode": "braintree", - "paymentTitle": "Braintree" - }, - { - "paymentCode": "cheque", - "paymentTitle": "Check" - }, - { - "paymentCode": "testgateway", - "paymentTitle": "Test Payment Gateway" - } - ] - }, - "message": "SUCCESS" - } - } - } - }, - "tags": [ - "Payment" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://api-b2b.bigcommerce.com/api/v2/io/store/payments' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json'\n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/store/payments\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/store/payments\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [] - }, - "/users/{customerId}/companies": { - "get": { - "operationId": "users_companies_list", - "summary": "Get Company By CustomerId", - "description": "Get company by customer Id, if company not in bigCommerce will delete the company", - "parameters": [ - { - "name": "authToken", - "in": "header", - "description": "Auth token in header.", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "Response Success", - "schema": { - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "addressLine1": { - "description": "Company address line 1", - "type": "string" - }, - "addressLine2": { - "description": "Company address line 2", - "type": "string" - }, - "catalogId": { - "description": "Catalog Id", - "type": "string" - }, - "city": { - "description": "Company city", - "type": "string" - }, - "companyId": { - "description": "Company Id", - "type": "string" - }, - "companyName": { - "description": "Company name", - "type": "string" - }, - "companyStatus": { - "description": "Company status", - "type": "string" - }, - "country": { - "description": "Company country", - "type": "string" - }, - "description": { - "description": "Company description", - "type": "string" - }, - "state": { - "description": "Company state", - "type": "string" - }, - "zipCode": { - "description": "Company zip code", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 200, - "data": { - "addressLine1": "", - "addressLine2": "", - "catalogId": "1", - "city": "Paris", - "companyId": "35", - "companyName": "CropTest1", - "companyStatus": "1", - "country": "French", - "description": "CropTest", - "state": "BC", - "zipCode": "1032332" - }, - "message": "SUCCESS" - } - } - }, - "404": { - "description": "Not Found Error", - "schema": { - "description": "Response body", - "type": "object", - "properties": { - "code": { - "description": "Response status code", - "type": "number" - }, - "data": { - "description": "Response data", - "type": "object", - "properties": { - "errMsg": { - "description": "Error message info", - "type": "string" - } - } - }, - "message": { - "description": "Response message", - "type": "string" - } - } - }, - "examples": { - "application/json": { - "code": 404, - "data": { - "errMsg": "Companies Does not Exist" - }, - "message": "Not Found Error" - } - } - } - }, - "tags": [ - "Company" - ], - "x-code-samples": [ - { - "lang": "Shell", - "source": "\ncurl --location --request GET 'https://https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies' --header 'authToken: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY' --header 'Content-Type: application/json' \n" - }, - { - "lang": "Python", - "source": "\nimport requests\n\nurl = \"https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies\"\n\npayload = {}\nheaders = {\n 'authToken': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY',\n 'Content-Type': 'application/json'\n}\n\nresponse = requests.request(\"GET\", url, headers=headers, data = payload)\n\nprint(response.text.encode('utf8'))\n" - }, - { - "lang": "JavaScript", - "source": "\nvar myHeaders = new Headers();\nmyHeaders.append(\"authToken\", \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdG9yZV9oYXNoIjoiZjJvc3hqam54aiIsImRiIjoiZGVmYXVsdCIsImVtYWlsIjoiYnJ1Y2UuaHVhbmdAc2lsa3NvZnR3YXJlLmNvbSJ9._DQFg-3FgtztdQVCGU5Gxfv8j8V3U9Ssaw7ARxUU6pY\");\nmyHeaders.append(\"Content-Type\", \"application/json\");\n\nvar requestOptions = {\n method: 'GET',\n headers: myHeaders,\n redirect: 'follow'\n};\n\nfetch(\"https://api-b2b.bigcommerce.com/api/v2/io/users/124/companies\", requestOptions)\n .then(response => response.text())\n .then(result => console.log(result))\n .catch(error => console.log('error', error));\n" - } - ] - }, - "parameters": [ - { - "name": "customerId", - "in": "path", - "required": true, - "type": "string", - "description": "BigCommerce's customer id" - } - ] - }, - "/users/{userId}/company": { - "parameters": [ - { - "type": "string", - "name": "userId", - "in": "path", - "required": true - } - ] - } - }, - "definitions": {} -} \ No newline at end of file From 99a7da1ce48f93e2f3bd45fb8f5aad131d1c38d7 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:02:25 -0500 Subject: [PATCH 157/221] [DEVDOCS-6031-edit]: [revision] Webhooks, store_price_list_deactivated callback description clean up (#454) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6031] ## What changed? <!-- Provide a bulleted list in the present tense --> * Add missing description pipe fix ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6031]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6031?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/webhooks/callbacks/store_priceList_deactivated.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/webhooks/callbacks/store_priceList_deactivated.yml b/docs/webhooks/callbacks/store_priceList_deactivated.yml index 2b31bd0fe..09c2aa0fe 100644 --- a/docs/webhooks/callbacks/store_priceList_deactivated.yml +++ b/docs/webhooks/callbacks/store_priceList_deactivated.yml @@ -1,7 +1,8 @@ type: object properties: store/priceList/deactivated: - description: Fires when you deactivate a price list, or create one with `active: false`. + description: | + Fires when you deactivate a price list, or create one with `active: false`. type: object properties: producer: From 5a0480d7c5c5bfeac4a3eb4ac8a2accf32b59407 Mon Sep 17 00:00:00 2001 From: Tina Gomez <94003415+bc-tgomez@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:24:10 -0500 Subject: [PATCH 158/221] [DEVDOCS-6055]: [update] CustomersV3, Clarify the relationships between Customer global settings and Customer channel settings. (#428) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6055] ## What changed? <!-- Provide a bulleted list in the present tense --> * Added notes to both Customer global settings and Customer channel settings to distinguish the relationship they share. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Clarified the relationship between Customer global settings and Customer channel settings in CustomersV3 API. We have defined the behavior that global settings are ignored if channel-specific settings are present. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bc-akshatkaushik [DEVDOCS-6055]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6055?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/customers.v3.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index 468b0c3bc..fdb97d60b 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -779,7 +779,12 @@ paths: get: tags: - Global Settings - description: Returns the global-level customer settings. + description: | + Returns the global-level customer settings. + + **Notes:** + * Global customer settings don't apply when the `default_customer_group_id` is present. + summary: Get Customer Settings operationId: getCustomersSettings responses: @@ -857,9 +862,10 @@ paths: description: |- Returns the customer settings per channel. - **Notes** + **Notes:** * `null` indicates that there is no override per given channel and values are inherited from the global level. + * Global customer settings don't apply when the `default_customer_group_id` is present. summary: Get Customer Settings per Channel operationId: getCustomersSettingsChannel parameters: From 72c35e114d9a5e0fb92f1ca3dd88ddb30b89fd31 Mon Sep 17 00:00:00 2001 From: Shawn Yap <85641361+bc-shawnyap@users.noreply.github.com> Date: Thu, 15 Aug 2024 18:01:27 -0500 Subject: [PATCH 159/221] Fix descriptions (#455) <!-- Ticket number or summary of work --> # [No Ticket] ## What changed? <!-- Provide a bulleted list in the present tense --> * More description fixes in the `/webhooks/callbacks` folder ping @bc-tgomez --- docs/webhooks/callbacks/_all.yml | 6 ++++-- docs/webhooks/callbacks/store_priceList_activated.yml | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index 17d63ea3f..e21ca2b44 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -351,7 +351,8 @@ properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_updated.yml store/priceList/activated: - description: Fires when you activate a price list, or create one with `active: true`. + description: | + Fires when you activate a price list, or create one with `active: true`. type: object properties: allOf: @@ -369,7 +370,8 @@ properties: allOf: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_created.yml store/priceList/deactivated: - description: Fires when you deactivate a price list, or create it with `active: false`. + description: | + Fires when you deactivate a price list, or create it with `active: false`. type: object properties: allOf: diff --git a/docs/webhooks/callbacks/store_priceList_activated.yml b/docs/webhooks/callbacks/store_priceList_activated.yml index 010c1587b..f6bc03952 100644 --- a/docs/webhooks/callbacks/store_priceList_activated.yml +++ b/docs/webhooks/callbacks/store_priceList_activated.yml @@ -1,7 +1,8 @@ type: object properties: store/priceList/activated: - description: Fires when you activate a price list, or create one with `active: true`. + description: | + Fires when you activate a price list, or create one with `active: true`. type: object properties: producer: From 37cdfc910fc50a185a0afbcaf7b65a71447b7049 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 16 Aug 2024 17:57:12 +0300 Subject: [PATCH 160/221] DEVDOCS-6031: removed backticks (#456) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6031] ## What changed? Changed `active: false` to active:false hoping to resolve errors ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6031]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6031?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/webhooks/callbacks/_all.yml | 4 ++-- docs/webhooks/callbacks/store_priceList_activated.yml | 2 +- docs/webhooks/callbacks/store_priceList_deactivated.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/webhooks/callbacks/_all.yml b/docs/webhooks/callbacks/_all.yml index e21ca2b44..b09dddf0a 100644 --- a/docs/webhooks/callbacks/_all.yml +++ b/docs/webhooks/callbacks/_all.yml @@ -352,7 +352,7 @@ properties: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_order_updated.yml store/priceList/activated: description: | - Fires when you activate a price list, or create one with `active: true`. + Fires when you activate a price list, or create one with active:true. type: object properties: allOf: @@ -371,7 +371,7 @@ properties: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/webhooks/callbacks/store_priceList_created.yml store/priceList/deactivated: description: | - Fires when you deactivate a price list, or create it with `active: false`. + Fires when you deactivate a price list, or create it with active:false. type: object properties: allOf: diff --git a/docs/webhooks/callbacks/store_priceList_activated.yml b/docs/webhooks/callbacks/store_priceList_activated.yml index f6bc03952..028841e8d 100644 --- a/docs/webhooks/callbacks/store_priceList_activated.yml +++ b/docs/webhooks/callbacks/store_priceList_activated.yml @@ -2,7 +2,7 @@ type: object properties: store/priceList/activated: description: | - Fires when you activate a price list, or create one with `active: true`. + Fires when you activate a price list, or create one with active:true. type: object properties: producer: diff --git a/docs/webhooks/callbacks/store_priceList_deactivated.yml b/docs/webhooks/callbacks/store_priceList_deactivated.yml index 09c2aa0fe..b946b8fa6 100644 --- a/docs/webhooks/callbacks/store_priceList_deactivated.yml +++ b/docs/webhooks/callbacks/store_priceList_deactivated.yml @@ -2,7 +2,7 @@ type: object properties: store/priceList/deactivated: description: | - Fires when you deactivate a price list, or create one with `active: false`. + Fires when you deactivate a price list, or create one with active:false. type: object properties: producer: From 4d032cb02f370098f2f0c4ddf5eb50d33e4e5547 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 16 Aug 2024 10:54:42 -0500 Subject: [PATCH 161/221] DEVDOCS-5853 [revise]: Scripts API, update language for scripts (#447) --- docs/integrations/scripts.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/scripts.mdx b/docs/integrations/scripts.mdx index 73e8aed2a..e3b977b88 100644 --- a/docs/integrations/scripts.mdx +++ b/docs/integrations/scripts.mdx @@ -35,7 +35,7 @@ These steps can help prevent unexpected behavior. ### Limits - Each app can have 10 API-created scripts - Each channel can have 50 control panel-created scripts -- You can install up to five scripts in a single call +- If you use inline scripts, you can include up to five `<script>` tags - On a BigCommerce-hosted storefront, new or updated scripts take 20 seconds to cache ## Stencil themes From 2299d2396e13f6d613c71c81752b58c02068e90f Mon Sep 17 00:00:00 2001 From: Donald Nguyen <63274600+donald-nguyen-bc@users.noreply.github.com> Date: Tue, 20 Aug 2024 00:46:00 +1000 Subject: [PATCH 162/221] doc(orders): ORDERS-6254 support product refund deduction (adjustment) in Refund API (#459) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # [ORDERS-6254] Update swagger file of the Refund API to support product refund deductions (adjustment) ## What changed? * New field `adjustments` in request body of `POST /orders/{order_id}/payment_actions/refund_quotes` and `POST /orders/{order_id}/payment_actions/refunds`, and in the response of `GET /orders/{order_id}/payment_actions/refunds` <img width="967" alt="image" src="https://github.com/user-attachments/assets/3ebc6c11-6507-41d2-a4d1-09d3bc62fdf0"> <img width="984" alt="image" src="https://github.com/user-attachments/assets/ee0cba71-973e-4787-bd79-8fa0fd6d61d6"> <img width="986" alt="image" src="https://github.com/user-attachments/assets/e7b7ab0e-25cd-43e3-bd93-541fe982e36e"> ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? PROJECT-5156 ping @bigcommerce/team-orders [ORDERS-6254]: https://bigcommercecloud.atlassian.net/browse/ORDERS-6254?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/orders.v3.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index aa71aa32e..28b67cf40 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -2571,6 +2571,11 @@ components: type: integer example: 1 description: Order Product ID. + adjustments: + type: array + description: 'Array of product refund deductions' + items: + $ref: '#/components/schemas/RefundItemAdjustment' quantity: type: integer example: 3 @@ -2581,6 +2586,25 @@ components: minLength: 0 maxLength: 1000 x-internal: false + RefundItemAdjustment: + type: object + title: Refund Item Adjustment + description: Use to reduce the amount refunded for an item. + properties: + amount: + type: number + format: float + description: 'A negative 2 decimal place rounded value to deduct from the amount refunded.' + example: -10.2 + title: Refund Item Adjustment Amount + exclusiveMaximum: True + maximum: 0 + description: + type: string + description: Description of reason for the adjustment. + minLength: 0 + maxLength: 255 + example: 'Service fee' TaxExemptItem: type: object title: Tax Exempt (Order Level) @@ -2732,6 +2756,11 @@ components: quantity: type: integer description: 'Quantity of item refunded. Note: this will only be populated for item_type PRODUCT' + adjustments: + type: array + description: Adjustments to apply to the refunded amount for an item. Only supported for item_type PRODUCT + items: + $ref: '#/components/schemas/RefundItemAdjustment' requested_amount: $ref: '#/components/schemas/Amount' title: Refund Item From 06b7efa034a1b18685f38994cae24d691f815c11 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 19 Aug 2024 10:26:10 -0500 Subject: [PATCH 163/221] DEVDOCS-6025 [update]: Store Information, add country_code & favicon_url into schema (#458) --- reference/store_information.v2.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reference/store_information.v2.yml b/reference/store_information.v2.yml index 9f0470ecc..691ece9ab 100644 --- a/reference/store_information.v2.yml +++ b/reference/store_information.v2.yml @@ -200,6 +200,10 @@ components: description: Country where the store is located (as defined during the store sign-up process). example: United States type: string + country_code: + type: string + example: AU + description: Two-letter ISO 3166-1 country code phone: description: Display phone number. type: string @@ -211,6 +215,9 @@ components: description: Email address for orders and fulfillment. example: 'orders@example.com' type: string + favicon_url: + description: The URL of the favicon image associated with the website. This should be a valid URL pointing to an `.ico` or other supported icon format file. + type: string timezone: $ref: '#/components/schemas/Timezone' language: From 5b1fabb2d4cbdd5ce5763a88348fd7742261a331 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Mon, 19 Aug 2024 11:00:45 -0500 Subject: [PATCH 164/221] DEVDOCS-6025 [update]: Orders V2, update Order Products & Order Shipments (#446) --- reference/orders.v2.oas2.yml | 97 ++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 15 deletions(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index ddbb58ee9..28ae7be47 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -612,6 +612,9 @@ paths: responses: '200': $ref: '#/components/responses/orderShipmentCollection_Resp' + '204': + description: No Content (No shipments exist) + content: {} tags: - Order Shipments operationId: getOrderShipments @@ -713,11 +716,9 @@ paths: application/json: value: tracking_number: EJ958083578US + merchant_shipping_cost: '1.0000' order_address_id: 1 shipping_provider: fedex - items: - - order_product_id: 15 - quantity: 2 required: true responses: '200': @@ -1865,6 +1866,9 @@ components: total_inc_tax: '65.2300' total_tax: '9.2400' weight: '1.0000' + width: '1.0000' + height: '1.0000' + depth: '1.0000' quantity: 1 base_cost_price: '50.0000' cost_price_inc_tax: '50.0000' @@ -1874,6 +1878,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -1889,7 +1894,6 @@ components: is_bundled_product: false bin_picking_number: '' external_id: null - fulfillment_source: '' brand: BigCommerce applied_discounts: - id: manual-discount @@ -1973,6 +1977,9 @@ components: total_inc_tax: '0.0000' total_tax: '0.0000' weight: '0.0000' + width: '1.0000' + height: '1.0000' + depth: '1.0000' quantity: 1 base_cost_price: '50.0000' cost_price_inc_tax: '50.0000' @@ -1982,6 +1989,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -1999,7 +2007,6 @@ components: is_bundled_product: true bin_picking_number: BIN external_id: null - fulfillment_source: '' brand: BigCommerce applied_discounts: [] product_options: [] @@ -2034,6 +2041,9 @@ components: total_inc_tax: '37.2300' total_tax: '5.2800' weight: '2.0000' + width: '1.0000' + height: '1.0000' + depth: '1.0000' quantity: 1 base_cost_price: '50.0000' cost_price_inc_tax: '50.0000' @@ -2043,6 +2053,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -2060,10 +2071,10 @@ components: is_bundled_product: false bin_picking_number: '' external_id: null - fulfillment_source: '' brand: BigCommerce applied_discounts: [] product_options: [] + configurable_fields: [] discounted_total_inc_tax: '37.2300' Product with file upload: value: @@ -2099,6 +2110,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -2116,7 +2128,6 @@ components: is_bundled_product: false bin_picking_number: '' external_id: null - fulfillment_source: '' brand: BigCommerce applied_discounts: [] product_options: @@ -2170,6 +2181,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -2187,7 +2199,6 @@ components: is_bundled_product: false bin_picking_number: '' external_id: null - fulfillment_source: '' brand: BigCommerce applied_discounts: [] product_options: [] @@ -2227,6 +2238,7 @@ components: quantity_refunded: 0 refund_amount: '0.0000' return_id: 0 + wrapping_id: 0 wrapping_name: '' base_wrapping_cost: '0.0000' wrapping_cost_ex_tax: '0.0000' @@ -2244,7 +2256,7 @@ components: is_bundled_product: false bin_picking_number: '' external_id: null - fulfillment_source: '' + configurable_fields: [] brand: BigCommerce applied_discounts: [] orderShipmentCollection_Resp: @@ -2867,6 +2879,18 @@ components: oneOf: - type: number - type: string + width: + description: Product width. + type: string + example: "1.0000" + height: + description: Product height. + type: string + example: "1.0000" + depth: + description: Product depth. + type: string + example: "1.0000" cost_price_tax: description: |- Tax applied to the product’s cost price. (Float, Float-As-String, Integer) @@ -2881,7 +2905,7 @@ components: type: number description: The total quantity of product refunded from this transaction. example: 0 - refunded_amount: + refund_amount: type: string description: The amount refunded from this transaction; always returns `0`. (Float, Float-As-String, Integer) example: '0.0000' @@ -2890,6 +2914,10 @@ components: description: Numeric ID for the refund. example: 0 type: number + wrapping_id: + description: ID of the gift wrapping option. + example: 0 + type: integer wrapping_name: description: Name of gift-wrapping option. example: null @@ -2974,6 +3002,18 @@ components: type: array items: $ref: '#/components/schemas/orderProductOptions' + configurable_fields: + type: array + description: Available for only [Catalog V2 stores](/docs/store-operations/catalog/migration). + items: + type: object + properties: + name: + type: string + example: Engraving + value: + type: string + example: Rabin upc: type: string maxLength: 255 @@ -3091,6 +3131,12 @@ components: shipping_quotes: $ref: '#/components/schemas/shippingQuotes_Resource' - $ref: '#/components/schemas/shippingAddress_Base' + - type: object + properties: + shipping_method: + type: string + description: Text code identifying the BigCommerce shipping module selected by the customer. + example: Free Shipping x-internal: false orderTaxes_Base: title: orderTaxes_Base @@ -3184,6 +3230,10 @@ components: description: Tracking number of the shipment. example: w4se4b6ASFEW4T type: string + merchant_shipping_cost: + description: Shipping cost for the merchant. + example: "1.0000" + type: string shipping_method: description: |- Additional information to describe the method of shipment (ex. Standard, Ship by Weight, Custom Shipment). Can be used for live quotes from certain shipping providers. @@ -3579,6 +3629,10 @@ components: description: The custom tracking link supplied on POST or PUT shipments. For the auto-generated tracking link see the `generated_tracking_link` property. example: https://www.mycustomtrackinglink.com/tracking maxLength: 500 + merchant_shipping_cost: + type: string + description: Shipping cost for the merchant. + example: "1.0000" shipping_method: description: | Additional information to describe the method of shipment (ex. Standard, Ship by Weight, Custom Shipment). Can be used for live quotes from certain shipping providers. @@ -3625,6 +3679,10 @@ components: description: Tracking number of the shipment. example: w4se4b6ASFEW4T type: string + merchant_shipping_cost: + type: string + description: Shipping cost for the merchant. + example: "1.0000" shipping_method: description: | Additional information to describe the method of shipment (ex. Standard, Ship by Weight, Custom Shipment). Can be used for live quotes from certain shipping providers. @@ -3956,10 +4014,6 @@ components: type: string example: janedoe@example.com description: 'Recipient’s email address. ' - shipping_method: - type: string - description: Text code identifying the BigCommerce shipping module selected by the customer. - example: Free Shipping x-internal: false order_RespOnly: title: order_RespOnly @@ -4580,7 +4634,14 @@ components: shipping_addresses: type: array items: - $ref: '#/components/schemas/shippingAddress_Base' + allOf: + - $ref: '#/components/schemas/shippingAddress_Base' + - type: object + properties: + shipping_method: + type: string + description: Text code identifying the BigCommerce shipping module selected by the customer. + example: Free Shipping consignments: $ref: '#/components/schemas/orderConsignment_Post' - $ref: '#/components/schemas/order_Shared' @@ -4588,6 +4649,12 @@ components: shippingAddress_Put: allOf: - $ref: '#/components/schemas/shippingAddress_Base' + - type: object + properties: + shipping_method: + type: string + description: Text code identifying the BigCommerce shipping module selected by the customer. + example: Free Shipping - type: object properties: form_fields: From 7d648acbf9ec64d522f45d11c04b37d9ae1205ec Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 19 Aug 2024 20:45:51 +0300 Subject: [PATCH 165/221] DEVDOCS-6024: [TEST-SPEC] image_url and previous fields (#413) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6024] ## What changed? - Removed `image_url` from the response body for (Get All Product Images, Create a Product Image, Get a Product Image, Update a Product Image, and Delete a Product Image) - Added `previous` field to the links object as it was missing in the MetaPaginationObject. - Updated schema for the meta object because it was not correct. Outstanding Questions: - The request example for the Create a Complex Rule doesn't work. Where do you get a modifier_id and modifier_value_id`? I kept getting the same error message. ``` Error { "status": 422, "title": "The rule must contain multiple modifier conditions with unique modifier ids or a variant condition and modifier condition", "type": "https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes" } ``` ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6024]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6024?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/products_catalog.v3.yml | 84 +++++++++-------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 249485dfd..4730044e7 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -1523,13 +1523,7 @@ paths: type: string description: | The date on which the product image was modified. - format: date-time - image_url: - type: string - description: |- - Publically available URL. - Use the image_url when creating a product. - example: 'https://upload.wikimedia.org/wikipedia/commons/7/7f/Anglel_Bless_Legendary_Hills_1_m%C4%9Bs%C3%ADc_st%C3%A1%C5%99%C3%AD.jpg' + format: date-time meta: $ref: '#/components/schemas/metaEmpty_Full' description: | @@ -1791,12 +1785,6 @@ paths: description: | The date on which the product image was modified. format: date-time - image_url: - type: string - description: |- - Publically available URL. - Use the image_url when creating a product. - example: 'https://upload.wikimedia.org/wikipedia/commons/7/7f/Anglel_Bless_Legendary_Hills_1_m%C4%9Bs%C3%ADc_st%C3%A1%C5%99%C3%AD.jpg' meta: $ref: '#/components/schemas/metaEmpty_Full' description: | @@ -2508,36 +2496,7 @@ paths: example: 5 description: Adjuster for Complex Rules. conditions: - type: array - items: - title: Complex Rule Condition - required: - - modifier_id - - modifier_value_id - - variant_id - type: object - properties: - modifier_id: - type: integer - description: |- - The unique numeric ID of the modifier with which the rule condition is associated. - Required in /POST. - nullable: true - example: 55 - modifier_value_id: - type: integer - description: |- - The unique numeric ID of the modifier value with which the rule condition is associated. - Required in /POST. - nullable: true - example: 256 - variant_id: - type: integer - description: |- - The unique numeric ID of the variant with which the rule condition is associated. - Required in /POST. - nullable: true - example: 1 + $ref: '#/components/schemas/conditionsRequest' description: Common ComplexRule properties. required: true responses: @@ -5112,6 +5071,30 @@ paths: $ref: '#/components/schemas/MetaFieldCollectionResponsePartialSuccess_DELETE' components: schemas: + modifierCondition: + type: object + properties: + modifier_id: + type: integer + example: 55 + description: Use the [get all product modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) endpoint to determine the `option_values` `id`. The `option_values` `id` is the `modifier_value_id`. + modifier_value_id: + type: integer + description: Use the [get all product modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) endpoint to determine the `option_values` `option_id`. The `option_values` `option_id` is the same as the `modifier_id`. + example: 256 + variantCondition: + type: object + properties: + variant_id: + type: integer + example: 1 + description: Use the [get all product variants](/docs/rest-catalog/product-variants#get-all-product-variants) endpoint to determine the variant `id`. + conditionsRequest: + type: array + items: + oneOf: + - $ref: '#/components/schemas/modifierCondition' + - $ref: '#/components/schemas/variantCondition' productModifier_Base: title: productModifier_Base required: @@ -5736,9 +5719,6 @@ components: type: string description: | The description for the image. - image_url: - type: string - description: 'Must be a fully qualified URL path, including protocol. Limit of 8MB per file.' description: Common ProductImage properties. x-internal: false productImage_Put: @@ -7976,12 +7956,16 @@ components: links: type: object properties: - next: + previous: type: string - example: '?limit=5&page=2' + example: ?limit=50&page=1 current: type: string - example: '?limit=5&page=1' + example: '?limit=50&page=1' + next: + type: string + example: '?limit=50&page=2' + x-tags: - Models BaseError: @@ -8164,7 +8148,7 @@ components: description: Empty for 200 responses. example: [] meta: - $ref: '#/components/schemas/CollectionMeta' + $ref: '#/components/schemas/WriteCollectionSuccessMeta' MetaFieldCollectionResponsePartialSuccess_POST_PUT: type: object description: | From 6ffd02cdd626bafc290ea6d9200bfc3a5fa65b1f Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 20 Aug 2024 12:25:06 -0500 Subject: [PATCH 166/221] DEVDOCS-6025 [new]: Inventory API, add `sku_id` field (#460) --- reference/inventory.v3.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reference/inventory.v3.yml b/reference/inventory.v3.yml index 970bee1e2..8185f03b5 100644 --- a/reference/inventory.v3.yml +++ b/reference/inventory.v3.yml @@ -590,6 +590,9 @@ components: type: integer description: ID of product. example: 120 + sku_id: + type: integer + description: Read-only reference to Catalog V2 API's SKU ID. `null` if the item is a base variant. locations: type: array items: From ff01fbb0f5b1bde4c8d7e81de167f674af2f7617 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:07:43 -0500 Subject: [PATCH 167/221] DEVDOCS-6086 [update]: Sites API, update schema (#461) --- docs/start/best-practices/sunsets.mdx | 1 + reference/sites.v3.yml | 42 ++++++++++++++++++++------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/docs/start/best-practices/sunsets.mdx b/docs/start/best-practices/sunsets.mdx index 47f5af4bf..52d7e1bc6 100644 --- a/docs/start/best-practices/sunsets.mdx +++ b/docs/start/best-practices/sunsets.mdx @@ -65,6 +65,7 @@ We have removed the following properties. | API | Sunset property | Replacement property | |:----|:----------------|:---------------------| | [Channels V3](/docs/rest-management/channels#get-all-channels) |`is_enabled` | `status` | +| [Sites](/docs/rest-management/sites) | `ssl_status` | [Site Certificates](/docs/rest-management/sites/site-certificate) `status` | ## Related resources diff --git a/reference/sites.v3.yml b/reference/sites.v3.yml index f66002645..bd2b21ed8 100644 --- a/reference/sites.v3.yml +++ b/reference/sites.v3.yml @@ -241,10 +241,21 @@ paths: operationId: deleteSite responses: '204': - description: '' + description: No Content. + content: + application/json: + schema: + type: object + properties: + data: + type: object + properties: {} + meta: + type: object + properties: {} tags: - Sites - description: 'Delete a site with site ID `{site_id}`.' + description: 'Delete a site with site ID `{site_id}`. Remove the URL set for a given site ID.' parameters: - $ref: '#/components/parameters/Accept' - name: site_id @@ -657,6 +668,7 @@ components: example: '2022-01-04T04:15:50.000Z' ssl_status: type: string + deprecated: true enum: - dedicated - shared @@ -1062,6 +1074,21 @@ components: properties: {} additionalProperties: true description: Response metadata. + Meta: + type: object + properties: + pagination: + type: object + properties: + offset: + type: integer + description: The number of items skipped before starting the set of items returned. + limit: + type: integer + description: The maximum number of items returned per page. + total_items: + type: integer + description: The total number of items available across all pages. responses: 502_GatewayError: description: 'If something happens during the request that causes it to fail, a 502 response will be returned. A new request should be made; however, it could fail.' @@ -1149,7 +1176,7 @@ components: data: $ref: '#/components/schemas/_site' meta: - $ref: '#/components/schemas/_metaCollection' + $ref: '#/components/schemas/MetaOpen' examples: Example: value: @@ -1159,7 +1186,6 @@ components: channel_id: 234 created_at: '2018-01-04T04:15:50.000Z' updated_at: '2018-01-04T04:15:50.000Z' - ssl_status: dedicated urls: - url: 'https://example.com' type: primary @@ -1174,11 +1200,7 @@ components: created_at: '2020-11-03T19:26:12Z' updated_at: '2021-08-31T21:46:50Z' is_checkout_url_customized: true - meta: - pagination: - offset: 0 - limit: 50 - total_items: 1 + meta: {} BulkErrorResponse: description: '' content: @@ -1237,7 +1259,7 @@ components: items: $ref: '#/components/schemas/_site' meta: - $ref: '#/components/schemas/_metaCollection' + $ref: '#/components/schemas/Meta' examples: {} siteRoute_Resp: description: '' From 78df5e3051405782cbddd21a369f0e81928549c2 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:09:01 -0500 Subject: [PATCH 168/221] DEVDOCS-6025 [update]: Storefront Carts, update schemas & query parameters (#457) --- reference/carts.sf.yml | 123 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 9 deletions(-) diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 3e443b4a4..2ee1847df 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -279,6 +279,8 @@ paths: > * Substitute your storefront domain for `yourstore.example.com`. > * The Send a Test Request feature is not currently supported for this endpoint. operationId: updateCartCurrency + parameters: + - $ref: '#/components/parameters/Include' responses: '200': $ref: '#/components/responses/getCarts' @@ -330,6 +332,9 @@ components: type: number description: The discounted amount applied within a given context. format: float + displayName: + type: string + description: The coupon name displayed on the storefront. id: type: string description: The coupon ID. @@ -431,7 +436,9 @@ components: items: $ref: '#/components/schemas/requestCartPostLineItem' giftCertificates: - $ref: '#/components/schemas/requestLineItemGiftCertificate' + type: array + items: + $ref: '#/components/schemas/requestLineItemGiftCertificate' locale: type: string required: @@ -553,7 +560,9 @@ components: items: $ref: '#/components/schemas/requestCartPostLineItem' giftCertificates: - $ref: '#/components/schemas/requestLineItemGiftCertificate' + type: array + items: + $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer description: The expected version of the cart. @@ -579,7 +588,7 @@ components: title: Line item - type: object properties: - giftCertificates: + giftCertificate: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer @@ -592,7 +601,7 @@ components: properties: lineItem: $ref: '#/components/schemas/requestCartPostLineItem' - giftCertificates: + giftCertificate: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer @@ -618,6 +627,17 @@ components: type: string description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' format: ISO-4217 + decimalPlaces: + type: integer + description: The number of decimal places that prices have when you use the currency. + name: + type: string + description: The name for the currency that the merchant entered in the control panel. + example: US Dollar + symbol: + type: string + description: The currency symbol displayed on the storefront. + example: $ description: This will always be the same between cart and checkout. x-go-gen-location: models x-internal: false @@ -726,6 +746,9 @@ components: type: string description: 'URL of an image of this item, accessible on the internet.' format: uri + isMutable: + type: boolean + description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. isTaxable: type: boolean description: Whether the item is taxable. @@ -754,6 +777,11 @@ components: sku: type: string description: SKU of the variant. + type: + type: string + description: The type of line item. + enum: + - digital url: type: string description: The product URL. @@ -809,7 +837,7 @@ components: id: type: string description: ID of this gift certificate. - isTaxable: + taxable: type: boolean description: Whether or not the gift certificate is taxable. message: @@ -825,6 +853,11 @@ components: theme: type: string description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' + type: + type: string + description: The type of line item. + enum: + - giftCertificate x-internal: false responseCartLineItemsGiftCertificatesRecipient: title: Contact Entity @@ -891,6 +924,9 @@ components: type: string description: 'URL of an image of this item, accessible on the internet.' format: uri + isMutable: + type: boolean + description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. isTaxable: type: boolean description: Whether the item is taxable. @@ -919,6 +955,11 @@ components: sku: type: string description: SKU of the variant. + type: + type: string + description: The type of line item. + enum: + - physical url: type: string description: The product URL. @@ -966,6 +1007,20 @@ components: productId: type: number description: ID of the product. + optionSelections: + type: array + items: + type: object + properties: + optionId: + type: integer + description: Modifier option ID. + example: 2 + optionValue: + oneOf: + - type: string + - type: integer + description: Modifier option value. quantity: type: number description: Quantity of this item. @@ -986,6 +1041,20 @@ components: variantId: type: number description: ID of the variant. + optionSelections: + type: array + items: + type: object + properties: + optionId: + type: integer + description: Modifier option ID. + example: 2 + optionValue: + oneOf: + - type: string + - type: integer + description: Modifier option value. giftWrapping: $ref: '#/components/schemas/requestPostOrPutGiftWrapping' required: @@ -1037,6 +1106,9 @@ components: email: string currency: code: string + decimalPlaces: 2 + name: US Dollar + symbol: $ isTaxIncluded: true baseAmount: 0 discountAmount: 0 @@ -1045,6 +1117,7 @@ components: - code: string couponType: 0 discountedAmount: 0 + displayName: $1.00 off total order id: string discounts: - discountedAmount: 0 @@ -1067,6 +1140,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true listPrice: 0 originalPrice: 0 @@ -1076,12 +1150,13 @@ components: quantity: 0 salePrice: 0 sku: string + type: digital url: 'http://example.com' variantId: 7 giftCertificates: - amount: 0 id: string - isTaxable: true + taxable: true message: string name: string recipient: @@ -1091,6 +1166,7 @@ components: email: user@example.com name: string theme: string + type: giftCertificate physicalItems: - options: - name: string @@ -1107,6 +1183,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true listPrice: 0 originalPrice: 0 @@ -1116,6 +1193,7 @@ components: quantity: 0 salePrice: 0 sku: string + type: physical url: 'http://example.com' variantId: 7 giftWrapping: @@ -1140,6 +1218,9 @@ components: email: string currency: code: string + decimalPlaces: 2 + name: US Dollar + symbol: $ isTaxIncluded: true baseAmount: 0 discountAmount: 0 @@ -1148,6 +1229,7 @@ components: - code: string couponType: 0 discountedAmount: 0 + displayName: $1.00 off the order total id: string discounts: - discountedAmount: 0 @@ -1170,6 +1252,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true listPrice: 0 originalPrice: 0 @@ -1179,12 +1262,13 @@ components: quantity: 0 salePrice: 0 sku: string + type: digital url: 'http://example.com' variantId: 7 giftCertificates: - amount: 0 id: string - isTaxable: true + taxable: true message: string name: string recipient: @@ -1194,6 +1278,7 @@ components: email: user@example.com name: string theme: string + type: giftCertificate physicalItems: - options: - name: string @@ -1210,6 +1295,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true listPrice: 0 originalPrice: 0 @@ -1219,6 +1305,7 @@ components: quantity: 0 salePrice: 0 sku: string + type: physical url: 'http://example.com' variantId: 7 giftWrapping: @@ -1243,6 +1330,9 @@ components: email: string currency: code: string + decimalPlaces: 2 + name: US Dollar + symbol: $ isTaxIncluded: true baseAmount: 0 discountAmount: 0 @@ -1251,6 +1341,7 @@ components: - code: string couponType: 0 discountedAmount: 0 + displayName: $1.00 off the order total id: string discounts: - discountedAmount: 0 @@ -1273,6 +1364,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true originalPrice: 0 listPrice: 0 @@ -1282,12 +1374,13 @@ components: quantity: 0 salePrice: 0 sku: string + type: digital url: 'http://example.com' variantId: 7 giftCertificates: - amount: 0 id: string - isTaxable: true + taxable: true message: string name: string recipient: @@ -1297,6 +1390,7 @@ components: email: user@example.com name: string theme: string + type: giftCertificate physicalItems: - options: - name: string @@ -1313,6 +1407,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true originalPrice: 0 listPrice: 0 @@ -1322,6 +1417,7 @@ components: quantity: 0 salePrice: 0 sku: string + type: physical url: 'http://example.com' variantId: 7 giftWrapping: @@ -1407,6 +1503,9 @@ components: email: string currency: code: string + decimalPlaces: 2 + name: US Dollar + symbol: $ isTaxIncluded: true baseAmount: 0 discountAmount: 0 @@ -1415,6 +1514,7 @@ components: - code: string couponType: 0 discountedAmount: 0 + displayName: $1.00 off the order total id: string discounts: - discountedAmount: 0 @@ -1437,6 +1537,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true originalPrice: 0 listPrice: 0 @@ -1446,12 +1547,13 @@ components: quantity: 0 salePrice: 0 sku: string + type: digital url: 'http://example.com' variantId: 7 giftCertificates: - amount: 0 id: string - isTaxable: true + taxable: true message: string name: string recipient: @@ -1461,6 +1563,7 @@ components: email: user@example.com name: string theme: string + type: giftCertificate physicalItems: - options: - name: string @@ -1477,6 +1580,7 @@ components: extendedSalePrice: 0 id: '4' imageUrl: 'http://example.com' + isMutable: true isTaxable: true originalPrice: 0 listPrice: 0 @@ -1486,6 +1590,7 @@ components: quantity: 0 salePrice: 0 sku: string + type: physical url: 'http://example.com' variantId: 7 giftWrapping: null From 0e7d3be253c6d885ab10d8d9d5c03fa3b5650fa1 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 22 Aug 2024 20:11:05 +0300 Subject: [PATCH 169/221] add custom_fields enum to include parameter (#466) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> NO TICKET ## What changed? Added `custom_fields` enum to include See slack conversation: https://bigcommerce.slack.com/archives/C011NMGSUE9/p1724249207504899?thread_ts=1724247354.344939&cid=C011NMGSUE9 ## Release notes draft N/A <!-- Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/catalog/products_catalog.v3.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 4730044e7..4d4889079 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -9102,6 +9102,7 @@ components: - modifiers - options - parent_relations + - custom_fields IdMinParam: name: 'id:min' in: query From 8241fe1a963d1d45ec3e1bb7cac510b2c7cec796 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 23 Aug 2024 13:39:44 -0500 Subject: [PATCH 170/221] DEVDOCS-6025 [update]: Orders V3, update order transactions (#453) --- reference/orders.v3.yml | 65 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index 28b67cf40..4df710af5 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -840,6 +840,8 @@ paths: - $ref: '#/components/parameters/MetafieldNamespaceInParam' - $ref: '#/components/parameters/DirectionParam' - $ref: '#/components/parameters/IncludeFieldsParamMetafields' + - $ref: '#/components/parameters/date_created' + - $ref: '#/components/parameters/date_modified' - $ref: '#/components/parameters/date_created_min' - $ref: '#/components/parameters/date_created_max' - $ref: '#/components/parameters/date_modified_min' @@ -1808,6 +1810,7 @@ components: offline: type: object description: 'Offline payment (e.g., check or purchase order).' + nullable: true title: Offline properties: display_name: @@ -1817,6 +1820,7 @@ components: custom: type: object description: Custom payment from manual order. + nullable: true title: Custom properties: payment_method: @@ -1845,12 +1849,13 @@ components: Identifier for the BigCommerce Order with which this transaction is associated. date_created: description: | - The date/time of the transaction. + The date/time of the transaction in ISO-8601 format. type: string format: date-time payment_instrument_token: type: string description: This field contains internal BigPay token for stored card that is then mapped to the actual third-party token. We currently do not offer a way to get third party tokens.These tokens are read-only and do not return any information about the payment. + nullable: true avs_result: description: Address Verification Service (AVS) result from the payment gateway. type: object @@ -1885,6 +1890,7 @@ components: type: object description: A gift-certificate model. title: Gift Certificate + nullable: true properties: code: description: | @@ -1924,6 +1930,7 @@ components: type: object description: | A store credit model. + nullable: true properties: remaining_balance: description: | @@ -1931,6 +1938,33 @@ components: type: number format: float example: 35.42 + custom_provider_field_result: + type: object + description: Fields for custom payment providers. + title: Custom Payment Provider Field + nullable: true + properties: + receipt_number: + type: string + description: | + The receipt number associated with the transaction. + nullable: true + authorization_code: + type: string + description: | + Authorization code for the transaction. + nullable: true + fraud_response: + type: string + description: | + The fraud response associated with the transaction. + nullable: true + amount_received: + type: number + format: float + description: | + The amount received for the transaction, divided by 100 to convert to the correct currency format. + nullable: true title: '' x-examples: Example 1: @@ -1975,6 +2009,7 @@ components: status: active store_credit: remaining_balance: 35.42 + custom_provider_field_result: null description: '' CreditCard: type: object @@ -2887,18 +2922,18 @@ components: description: Empty for 200 responses. example: [] meta: - $ref: '#/components/schemas/CollectionMeta' + $ref: '#/components/schemas/BatchOperationMeta' x-internal: false MetafieldResponse: description: | Response payload for the BigCommerce API. x-internal: false - allOf: - - type: object - properties: - data: - $ref: '#/components/schemas/Metafield' - - $ref: '#/components/schemas/Meta' + type: object + properties: + data: + $ref: '#/components/schemas/Metafield' + meta: + $ref: '#/components/schemas/metaEmpty_Full' MetafieldBase: type: object description: | @@ -3762,6 +3797,13 @@ components: required: false schema: type: string + date_created: + name: 'date_created' + description: 'Filter items by date created. For example, `date_created=2019-09-04T00:00:00`. Returns metafields created on this date.' + in: query + required: false + schema: + type: string date_modified_min: name: 'date_modified:min' description: 'Filter items by minimum date modified. For example, `date_modified:min=2019-09-04T00:00:00` or `date_modified:min=2019-09-04`. Returns metafields modified after this date.' @@ -3776,6 +3818,13 @@ components: required: false schema: type: string + date_modified: + name: 'date_modified' + description: 'Filter items by date modified. For example, `date_modified=2019-09-04T00:00:00`. Returns metafields modified on this date.' + in: query + required: false + schema: + type: string MetafieldIdParam: name: metafield_id in: path From 4ebb9e609ec0d1f540217486c4d15915202baf0f Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 23 Aug 2024 21:43:31 +0300 Subject: [PATCH 171/221] DEVDOCS-6025: [TEST-SPEC] Update carts.v3.yml (#465) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6025] ## What changed? Fixed the meta object Removed a required field from a response object Question What is the required scope for Get Channel Cart Settings? The Carts scope is not working ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6025]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6025?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/carts.v3.yml | 189 ++++++++++++++++++++++------------------- 1 file changed, 101 insertions(+), 88 deletions(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index d308ba3b2..29a366354 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -169,7 +169,7 @@ paths: gift_certificates: - name: Tobi Day theme: birthday.html - amount: 1 + amount: 10 quantity: 1 sender: name: Brandi Tyler @@ -647,7 +647,16 @@ paths: - $ref: '#/components/parameters/Accept' get: summary: Get Global Cart Settings - description: Returns the global cart settings of a store. + description: |- + Returns the global cart settings of a store. + + *Authentication* + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| operationId: getGlobalCartSettings tags: - Settings @@ -666,7 +675,15 @@ paths: $ref: '#/components/schemas/ErrorResponse' put: summary: Update Global Cart Settings - description: Update the global cart settings of a store. + description: |- + Update the global cart settings of a store. + *Authentication* + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| parameters: - $ref: '#/components/parameters/ContentType' tags: @@ -725,14 +742,32 @@ paths: parameters: - $ref: '#/components/parameters/Accept' - name: channel_id - description: The channel ID of the settings overrides. + description: |- + The channel ID of the settings overrides. + + *Authentication* + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| in: path required: true schema: type: integer get: summary: Get Channel Cart Settings - description: Returns the per-channel overrides for the cart settings of a store. + description: |- + Returns the per-channel overrides for the cart settings of a store. + + *Authentication* + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| tags: - Settings responses: @@ -751,7 +786,16 @@ paths: operationId: getChannelCartSettings put: summary: Update Channel Cart Settings - description: Update the per-channel overrides for the cart settings of a store. + description: |- + Update the per-channel overrides for the cart settings of a store. + + *Authentication* + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| tags: - Settings parameters: @@ -1627,12 +1671,12 @@ components: description: 'Cart ID, provided after creating a cart with a POST request.' type: string format: UUID - parent_id: - type: string - description: Bundled items will have the ID of their parent item. customer_id: description: ID of the customer to which the cart belongs. type: integer + channel_id: + type: integer + description: 'The channel ID. If no channel is specified, defaults to 1.' email: description: The cart’s email. This is the same email that is used in the billing address. type: string @@ -1654,6 +1698,9 @@ components: discount_amount: type: number description: Order-based discounted amount only - Excludes coupon discounts and product-based discounts. + manual_discount_amount: + type: number + description: The entered value represents the order level manual discount. cart_amount: type: number description: Sum of cart line-item amounts minus cart-level discounts and coupons. This amount includes taxes (where applicable). @@ -1699,9 +1746,6 @@ components: type: string format: ISO-8601 description: Time when the cart was last updated. - channel_id: - type: integer - description: 'The channel ID. If no channel is specified, defaults to 1.' locale: type: string description: 'Locale of the cart. Accepts strings of format `xx` or `xx-YY`. Uses the [ISO-639 standard](https://www.iso.org/iso-639-language-codes.html) format.' @@ -1832,7 +1876,7 @@ components: amount: type: number description: 'Value must be between 1.00 and 1,000.00 in the store’s default currency.' - is_taxable: + taxable: type: boolean sender: title: Contact Entity @@ -2060,6 +2104,9 @@ components: type: string description: The line-item ID. example: 6e193ce6-f327-4dcc-b75e-72cf6738525e + parent_id: + type: string + description: Bundled items will have the ID of their parent item. variant_id: type: number description: The ID of the variant. Required in the /PUT or /POST request if the product has variants. @@ -2085,7 +2132,7 @@ components: type: number example: 5 description: Quantity of this item in the cart. - is_taxable: + taxable: type: boolean example: false description: Boolean value that specifies whether the item is taxable. @@ -2194,28 +2241,14 @@ components: extended_sale_price: type: number description: Sale price of the item multiplied by the quantity. - options: - description: The list of selected options for this product. - type: array - items: - type: object - title: Product Option - properties: - name: - type: string - description: 'The product option name; for example, Color or Size.' - nameId: - type: number - description: The product option identifier. - value: - type: string - description: 'The product option value; for example, Red or Medium.' - valueId: - type: number - description: The product option value identifier in number format. - example: 128 - - type: object - properties: + is_require_shipping: + type: boolean + example: false + description: Whether or not a physical product requires shipping. + is_mutable: + type: boolean + example: true + description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. download_file_urls: description: URLs to download all product files. type: array @@ -2720,6 +2753,14 @@ components: list_price: type: string description: 'Specifies the price of the item. This value can include or exclude tax, depending on the store setup.' + extended_list_price: + type: number + description: List price of the item multiplied by the quantity. + image_url: + type: string + format: uri + example: 'https://pathtoproductimage/ProductDefault.png' + description: Image of the product or variant. cart_PostVariant: type: object title: Item with variant @@ -3106,6 +3147,9 @@ components: type: string description: The line-item ID. example: 6e193ce6-f327-4dcc-b75e-72cf6738525e + parent_id: + type: string + description: Bundled items will have the ID of their parent item. variant_id: type: number description: The ID of the variant. Required in the /PUT or /POST request if the product has variants. @@ -3122,25 +3166,6 @@ components: type: string description: The item’s product name. example: T-Shirt - weight: - type: number - description: The weight is displayed here if the item has a custom dimension. - example: 1.2 - dimensions: - type: object - properties: - height: - type: number - description: The height is displayed here if the item has a custom dimension. - example: 2.0 - width: - type: number - description: The width is displayed here if the item has a custom dimension. - example: 2.1 - depth: - type: number - description: The depth is displayed here if the item has a custom dimension. - example: 2.2 url: description: The product URL. type: string @@ -3150,7 +3175,7 @@ components: type: number example: 5 description: Quantity of this item in the cart. - is_taxable: + taxable: type: boolean example: false description: Boolean value that specifies whether the item is taxable. @@ -3249,7 +3274,7 @@ components: description: An item’s original price is the same as the product default price in the admin panel. list_price: type: number - description: 'The net item price before discounts and coupons are applied. BigCommerce derives an item’s list price from the product default price or, if applicable, the sale price configured in the admin panel.' + description: 'The net item price before discounts and coupons are applied. BigCommerce derives an item’s list price from the product default price or, if applicable, the sale price configured in the admin panel. To enable v3 promotions at the product level, you must update the [promotion](https://support.bigcommerce.com/s/article/Store-Settings?language=en_US#promotion) settings in the control panel.' sale_price: type: number description: Price of the item after all discounts are applied. (The final price before tax calculation.) @@ -3259,30 +3284,14 @@ components: extended_sale_price: type: number description: Sale price of the item multiplied by the quantity. - options: - description: The list of selected options for this product. - type: array - items: - type: object - title: Product Option - properties: - name: - type: string - description: 'The product option name; for example, Color or Size.' - nameId: - type: number - example: 151 - description: The product option identifier. - value: - type: string - description: 'The product option value; for example, Red or Medium.' - valueId: - oneOf: - - type: number - example: 128 - - type: string - example: "1259" - description: The product option value identifier in number format. + is_require_shipping: + type: boolean + example: false + description: Whether or not a physical product requires shipping. + is_mutable: + type: boolean + example: true + description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. gift_wrapping: description: The gift wrapping details for this item. type: object @@ -3330,7 +3339,7 @@ components: properties: data: $ref: '#/components/schemas/Metafield' - - $ref: '#/components/schemas/CollectionMeta' + - $ref: '#/components/schemas/metaCollection_open' Metafield: description: | Allows app partners to write custom data to various resources in the API. @@ -3425,8 +3434,6 @@ components: The unique identifier for the resource with which the metafield is associated. example: '0' readOnly: true - required: - - permission_set MetafieldBase_Post: type: object description: | @@ -3491,7 +3498,7 @@ components: data: $ref: '#/components/schemas/Metafield' meta: - $ref: '#/components/schemas/CollectionMeta' + $ref: '#/components/schemas/metaCollection_open' x-internal: false MetaFieldCollectionResponse_Batch: type: object @@ -3519,7 +3526,7 @@ components: description: Empty for 200 responses. example: [] meta: - $ref: '#/components/schemas/CollectionMeta' + $ref: '#/components/schemas/WriteCollectionPartialSuccessMeta' MetaFieldCollectionDeleteResponseSuccess: type: object description: | @@ -3710,7 +3717,6 @@ components: title: Response meta type: object properties: {} - additionalProperties: true description: Response metadata. responses: CartResponse: @@ -3718,7 +3724,12 @@ components: content: application/json: schema: - $ref: '#/components/schemas/Cart_Full' + type: object + properties: + data: + $ref: '#/components/schemas/Cart_Full' + meta: + $ref: '#/components/schemas/metaCollection_open' examples: {} CartConflictErrorResponse: description: 'Cart conflict' @@ -3947,6 +3958,8 @@ components: |:--------|:-----------|:----------| |Carts|modify|`store_cart`| |Carts |read-only|`store_cart_read_only`| + |Information & Settings | modify | `store_v2_information`| + |Information & Settings | read-only| `store_v2_information`| ### Authentication header From fcaf0f6ef0c4b45ea8661606d4370747629534b0 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Sun, 25 Aug 2024 21:26:53 +0300 Subject: [PATCH 172/221] remove duplicate "Authentication" headings (#469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # NO TICKET ## What changed? Removed duplicate authentication heading ![Screenshot 2024-08-23 at 11 44 10 PM](https://github.com/user-attachments/assets/880ae252-9667-4b11-9c10-a808c5037939) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/carts.v3.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index 29a366354..de2295ecc 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -650,7 +650,6 @@ paths: description: |- Returns the global cart settings of a store. - *Authentication* ### OAuth scopes | UI Name | Permission | Parameter | @@ -745,7 +744,6 @@ paths: description: |- The channel ID of the settings overrides. - *Authentication* ### OAuth scopes | UI Name | Permission | Parameter | @@ -761,7 +759,6 @@ paths: description: |- Returns the per-channel overrides for the cart settings of a store. - *Authentication* ### OAuth scopes | UI Name | Permission | Parameter | @@ -789,7 +786,6 @@ paths: description: |- Update the per-channel overrides for the cart settings of a store. - *Authentication* ### OAuth scopes | UI Name | Permission | Parameter | From 1b582c0c3904ccf2c8dadbdd1eeb47d75b616c48 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Sun, 25 Aug 2024 14:51:30 -0500 Subject: [PATCH 173/221] DEVDOCS-6000 [new]: GQL Storefront API, add dev_mode field (#379) # [DEVDOCS-6000] ## What changed? <!-- Provide a bulleted list in the present tense --> * Add `dev_mode` field to the Create a Token & Create a Customer Impersonation Token endpoint (for GQL Storefront API) ## Release notes draft * We're happy to announce the `dev_mode` field, which allows you to create [GraphQL Storefront tokens](https://developer.bigcommerce.com/docs/rest-authentication/tokens#create-a-token) and [customer impersonation tokens ](https://developer.bigcommerce.com/docs/rest-authentication/tokens/customer-impersonation-token#create-a-token)that can perform login and logout mutations when a storefront channel is not active. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6000]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6000?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> Co-authored-by: Nate Stewart <nate.stewart@bigcommerce.com> --- .../authentication/graphql-storefront.mdx | 19 ++++++++++++++++++- reference/storefront_tokens.v3.yml | 6 ++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx index 62789a8d1..759f55c22 100644 --- a/docs/start/authentication/graphql-storefront.mdx +++ b/docs/start/authentication/graphql-storefront.mdx @@ -271,6 +271,7 @@ query CustomerAttributes { On Stencil storefronts, you can access a token at render time and pass the token to client-side code using the `{{settings.storefront_api.token}}` Handlebars property. This auto-generated token has an expiry period of 24-48 hours and will rotate before expiration. +These tokens are not generated for [development mode](/docs/start/authentication/graphql-storefront#development-mode). ## Customer impersonation tokens @@ -307,7 +308,7 @@ Accept: application/json Content-Type: application/json { - "channel_ids": [1, 2, 3] // array of integers (must be a valid channel IDs on the store) + "channel_ids": [1, 2, 3], // array of integers (must be a valid channel IDs on the store) "expires_at": 1602288000 // when the token will expire, as an integer unix timestamp (in seconds) } ``` @@ -332,6 +333,18 @@ Unlike storefront API tokens, customer impersonation tokens _are_ sensitive and If your token is compromised, you can use the [Revoke a token](/docs/rest-authentication/tokens#revoke-a-token) endpoint. Only use this in emergencies; do not revoke tokens unnecessarily. Instead, use a shorter expiration and allow them to expire naturally. +## Development mode + +When a storefront is in [prelaunch](https://support.bigcommerce.com/s/article/Multi-Storefront#configuring) or [maintenance mode](https://support.bigcommerce.com/s/article/Maintenance-Mode#enabling), +there are certain operations that you can perform only if you use a token that is valid for development mode. + +This includes the following operations: +- [Login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in) +- [Logout mutation](/docs/start/authentication/graphql-storefront#signing-customers-out) + +To generate a token that is valid for development mode, set `dev_mode` to `true` when you [create a storefront token](/docs/start/authentication/graphql-storefront#create-a-storefront-token) or [customer impersonation token](/docs/start/authentication/graphql-storefront#create-a-customer-impersonation-token). +Otherwise, the token will not be generated for development mode. + ## Signing customers in <Callout type="info"> @@ -344,6 +357,8 @@ This mutation is also useful for server-to-server or headless storefront applica As a security best practice, you should inject the email address and password using GraphQL query variables. This prevents the password from being exposed in the query itself. In the [GraphQL Storefront playground](/graphql-storefront/playground), you can set variables for requests. +If the storefront channel is inactive, you need a storefront token that is valid for [development mode](/docs/start/authentication/graphql-storefront#development-mode) to perform this mutation. + ![GraphQL Storefront playground query variables](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Login%20Mutation.png "GraphQL Storefront playground query variables") <Callout type="warning"> @@ -432,6 +447,8 @@ As a security best practice, you should inject the email address and password us You can use the logout mutation to sign out of a customer account. If you're using a vanilla storefront token, future requests in that shopper's session will be from the perspective of an anonymous shopper. +If the storefront channel is inactive, you need a storefront token that is valid for [development mode](/docs/start/authentication/graphql-storefront#development-mode) to perform this mutation. + ```graphql filename="Example query: logout mutation" showLineNumbers copy mutation Logout { logout { diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index 92dfbf52e..b49f92473 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -184,6 +184,12 @@ components: - oneOf: - $ref: "#/components/schemas/Channels" - $ref: "#/components/schemas/Channel" + - type: object + properties: + dev_mode: + type: boolean + description: Determines the operations you can perform with the token when a storefront is in [prelaunch](https://support.bigcommerce.com/s/article/Multi-Storefront#configuring) or [maintenance](https://support.bigcommerce.com/s/article/Maintenance-Mode#enabling) (i.e., development mode). When set to true, you can perform all operations, including [login and logout mutations](/docs/start/authentication/graphql-storefront#signing-customers-in). When set to false, you cannot perform login and logout mutations. + default: false required: - expires_at TokenPostSimple: From 1aa01850c3054f5e8ebbdc65499a304c819af5fd Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Sun, 25 Aug 2024 19:25:52 -0400 Subject: [PATCH 174/221] Revert "DEVDOCS-6000 [new]: GQL Storefront API, add dev_mode field" (#473) Reverts bigcommerce/docs#379 --- .../authentication/graphql-storefront.mdx | 19 +------------------ reference/storefront_tokens.v3.yml | 6 ------ 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/docs/start/authentication/graphql-storefront.mdx b/docs/start/authentication/graphql-storefront.mdx index 759f55c22..62789a8d1 100644 --- a/docs/start/authentication/graphql-storefront.mdx +++ b/docs/start/authentication/graphql-storefront.mdx @@ -271,7 +271,6 @@ query CustomerAttributes { On Stencil storefronts, you can access a token at render time and pass the token to client-side code using the `{{settings.storefront_api.token}}` Handlebars property. This auto-generated token has an expiry period of 24-48 hours and will rotate before expiration. -These tokens are not generated for [development mode](/docs/start/authentication/graphql-storefront#development-mode). ## Customer impersonation tokens @@ -308,7 +307,7 @@ Accept: application/json Content-Type: application/json { - "channel_ids": [1, 2, 3], // array of integers (must be a valid channel IDs on the store) + "channel_ids": [1, 2, 3] // array of integers (must be a valid channel IDs on the store) "expires_at": 1602288000 // when the token will expire, as an integer unix timestamp (in seconds) } ``` @@ -333,18 +332,6 @@ Unlike storefront API tokens, customer impersonation tokens _are_ sensitive and If your token is compromised, you can use the [Revoke a token](/docs/rest-authentication/tokens#revoke-a-token) endpoint. Only use this in emergencies; do not revoke tokens unnecessarily. Instead, use a shorter expiration and allow them to expire naturally. -## Development mode - -When a storefront is in [prelaunch](https://support.bigcommerce.com/s/article/Multi-Storefront#configuring) or [maintenance mode](https://support.bigcommerce.com/s/article/Maintenance-Mode#enabling), -there are certain operations that you can perform only if you use a token that is valid for development mode. - -This includes the following operations: -- [Login mutation](/docs/start/authentication/graphql-storefront#signing-customers-in) -- [Logout mutation](/docs/start/authentication/graphql-storefront#signing-customers-out) - -To generate a token that is valid for development mode, set `dev_mode` to `true` when you [create a storefront token](/docs/start/authentication/graphql-storefront#create-a-storefront-token) or [customer impersonation token](/docs/start/authentication/graphql-storefront#create-a-customer-impersonation-token). -Otherwise, the token will not be generated for development mode. - ## Signing customers in <Callout type="info"> @@ -357,8 +344,6 @@ This mutation is also useful for server-to-server or headless storefront applica As a security best practice, you should inject the email address and password using GraphQL query variables. This prevents the password from being exposed in the query itself. In the [GraphQL Storefront playground](/graphql-storefront/playground), you can set variables for requests. -If the storefront channel is inactive, you need a storefront token that is valid for [development mode](/docs/start/authentication/graphql-storefront#development-mode) to perform this mutation. - ![GraphQL Storefront playground query variables](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Playground%20Login%20Mutation.png "GraphQL Storefront playground query variables") <Callout type="warning"> @@ -447,8 +432,6 @@ If the storefront channel is inactive, you need a storefront token that is valid You can use the logout mutation to sign out of a customer account. If you're using a vanilla storefront token, future requests in that shopper's session will be from the perspective of an anonymous shopper. -If the storefront channel is inactive, you need a storefront token that is valid for [development mode](/docs/start/authentication/graphql-storefront#development-mode) to perform this mutation. - ```graphql filename="Example query: logout mutation" showLineNumbers copy mutation Logout { logout { diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index b49f92473..92dfbf52e 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -184,12 +184,6 @@ components: - oneOf: - $ref: "#/components/schemas/Channels" - $ref: "#/components/schemas/Channel" - - type: object - properties: - dev_mode: - type: boolean - description: Determines the operations you can perform with the token when a storefront is in [prelaunch](https://support.bigcommerce.com/s/article/Multi-Storefront#configuring) or [maintenance](https://support.bigcommerce.com/s/article/Maintenance-Mode#enabling) (i.e., development mode). When set to true, you can perform all operations, including [login and logout mutations](/docs/start/authentication/graphql-storefront#signing-customers-in). When set to false, you cannot perform login and logout mutations. - default: false required: - expires_at TokenPostSimple: From a5de9e1fbdc2f021dd09b13ea26885c60afca198 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 26 Aug 2024 18:57:41 +0300 Subject: [PATCH 175/221] DEVDOCS-6023: [TEST SPEC] Update brands_catalog.v3.yml (#464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6023] ## What changed? Removed requirement from response fields. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6023]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6023?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/brands_catalog.v3.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index 5b78666f5..6c45fafb0 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -642,9 +642,6 @@ paths: The name of the brand. Must be unique. Required in POST. example: Common Good - x-required: - - post - - put page_title: maxLength: 255 minLength: 0 @@ -2025,17 +2022,6 @@ components: description: Client ID for the metafieldʼs creator. example: asdfasdfasdfasdfasdfasdfasdf readOnly: true - required: - - namespace - - key - - value - - permission_set - - resource_type - - resource_id - - description - - id - - date_created - - date_modified MetaFieldCollectionResponse: type: object description: | From 0a7c0a67f8e86f47c76e2ae68b5c588059aec148 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 26 Aug 2024 19:19:14 +0300 Subject: [PATCH 176/221] ISSUE-467: [update] tunnel definition (#474) <!-- Ticket number or summary of work --> # [ISSUE-467](https://github.com/bigcommerce/docs/issues/467) ## What changed? See [ISSUE-467](https://github.com/bigcommerce/docs/issues/467). ## Release notes draft * Stencil CLI allows a tunnel option. This tunnel option now contains a password field implemented by the tunnel provider to prevent abuse by malicious parties. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- docs/storefront/stencil/cli/options-and-commands.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/storefront/stencil/cli/options-and-commands.mdx b/docs/storefront/stencil/cli/options-and-commands.mdx index 64900b10a..32dba1132 100644 --- a/docs/storefront/stencil/cli/options-and-commands.mdx +++ b/docs/storefront/stencil/cli/options-and-commands.mdx @@ -86,7 +86,7 @@ stencil start --open # opens live theme preview in default browser | `--variation NAME` |`-v` | Set which theme variation to use while developing | | `--channelId CHANNELID` |`-c` | Set the channel id for the storefront | | `--timeout` |`-t` | Set a timeout for the bundle operation. Default is 20 secs | -| `--tunnel` | | Create a tunnel URL which points to your local server which anyone can use | +| `--tunnel` | | Create a tunnel URL that points to your local server, which anyone can use. The required password for external connections is your public IP address. | | `--no-cache` |`-n` | Turn off caching for API resource data (cache refreshes every 5 minutes) | | `--verbose` |`-vb`| Enable verbose logging | | `--help` |`-h` | Output usage information | From 95de97586869056ccf2828ed63ac6889bb7bfbfc Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Mon, 26 Aug 2024 18:04:53 +0100 Subject: [PATCH 177/221] [DEVDOCS-6014] Remove inconsistent enum for order payment_method (#375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-] Remove inconsistent enum for order payment_method ## What changed? <!-- Provide a bulleted list in the present tense --> * Removed inconsistent / misleading enum list from order `payment_method` parameter / attribute. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Removed enum list from order `payment_method` parameter / attribute in POST and GET calls. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> * Order `payment_method` parameter / attribute was inconsistent because: * - Enum list was included everywhere but PUT request * Order `payment_method` parameter / attribute was misleading because: * - Enum list suggested you had limited allowed values, when the parameter is fully writable. Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- reference/orders.v2.oas2.yml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 28ae7be47..0c309ae7a 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -3854,13 +3854,7 @@ components: example: false type: boolean payment_method: - description: |- - The payment method for this order. Can be one of the following: `Manual`, `Credit Card`, `cash`, `Test Payment Gateway`, etc. - enum: - - Credit Card - - Cash - - Test Payment Gateway - - Manual + description: 'The payment method for this order. Can be one of the following: `Manual`, `Credit Card`, `cash`, `Test Payment Gateway`, etc.' type: string payment_provider_id: description: The external Transaction ID/Payment ID within this order’s payment provider (if a payment provider was used). From 1430b1d5903399b4b75505910860c1a17581cefa Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Mon, 26 Aug 2024 14:03:14 -0500 Subject: [PATCH 178/221] Update references in B2B API overview to point to DevCenter references (#471) ## What changed? * Updated links in the B2B overview section to point to developer center docs instead of Stoplight. * Removed out of date blurb about Bundle B2B endpoints being seen, since we've already moved them to sit within a bigcommerce.com endpoint ## Release notes draft * B2B Edition's API reference documentation has now been moved into our Developer Center, to provide a faster, more consistent experience for developers creating future B2B experiences. If you run into anything that can be improved, let us know! ping @bigcommerce/dev-docs --- docs/b2b-edition/about/index.mdx | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/docs/b2b-edition/about/index.mdx b/docs/b2b-edition/about/index.mdx index c3a7841e8..6fc6f71d8 100644 --- a/docs/b2b-edition/about/index.mdx +++ b/docs/b2b-edition/about/index.mdx @@ -7,24 +7,20 @@ Make BigCommerce B2B Edition API requests in the context of the storefront or se | API | Base URL | |:--|:--| | GraphQL Storefront API | `https://api-b2b.bigcommerce.com/graphql` | -| REST Storefront API | See [endpoint reference](https://bundleb2b.stoplight.io/docs/openapi/rest-storefront/catalog) | +| REST Storefront API | See [endpoint reference](https://developer.bigcommerce.com/b2b-edition/apis/rest-storefront/auth) | | REST Management V3 | `https://api-b2b.bigcommerce.com/api/v3/io/`| | REST Management V2 | `https://api-b2b.bigcommerce.com/api/v2/io/`| -<Callout type="info"> - Note: some B2B Edition APIs rely on BigCommerce APIs, so there may be latency in data synchronization. -</Callout> - ## Key resources | Resource | Description | |:--|:--| -| [Company](https://bundleb2b.stoplight.io/docs/openapi/rest-management/company/operations/create-a-company#request-body) | Set client company info, administrator, and more. | -| [Address](https://bundleb2b.stoplight.io/docs/openapi/rest-management/address/operations/list-addresses#response-body) | Associate one or more addresses with a company. | -| [Order](https://bundleb2b.stoplight.io/docs/openapi/rest-management/orders/operations/get-a-order#response-body) | Extend the BigCommerce order object with B2B-specific information, such as purchase order number. | -| [Payment](https://bundleb2b.stoplight.io/docs/openapi/rest-management/payment/operations/list-company-payments#response-body) | Manage company payment methods. | -| [Sales staff](https://bundleb2b.stoplight.io/docs/openapi/rest-management/sales-staff/schemas/sales-staff) and [super admin](https://bundleb2b.stoplight.io/docs/openapi/rest-management/super-admin/operations/list-company-super-admins#response-body) | Manage sales staff and admin access privileges. | -| [Quote](https://bundleb2b.stoplight.io/docs/openapi/rest-management/quote) | Manage quotes. | +| [Company](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/company#create-a-company) | Set client company info, administrator, and more. | +| [Address](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/address#get-an-address) | Associate one or more addresses with a company. | +| [Order](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/orders/order#get-an-order) | Extend the BigCommerce order object with B2B-specific information, such as purchase order number. | +| [Payment](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/payment#update-company-payments) | Manage company payment methods. | +| [Sales staff](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/sales-staff#update-a-sales-staff) and [super admin](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/super-admin#update-company-&-super-admins-relationship) | Manage sales staff and admin access privileges. | +| [Quote](https://developer.bigcommerce.com/b2b-edition/apis/rest-management/v3/quote#get-quote-form-list) | Manage quotes. | | [Proxy](https://bundleb2b.stoplight.io/docs/openapi/rest-management/v2/operations/create-a-proxy) | Create a third-party proxy. | ## Request headers @@ -43,9 +39,3 @@ Use the `limit` and `offset` query parameters together to paginate responses. The `limit` value determines the number of records to return per page. The `offset` value is the number of results to skip before returning the first result. For example, passing the following query param string returns the 11th through 20th results: `offset=10&limit=10`. - -## Why do some API endpoints reference BundleB2B? - -BundleB2B was a purpose-built application that powered BigCommerce's original B2B Edition offering. - -In 2021, BigCommerce acquired BundleB2B. Since that time, we've been integrating the BundleB2B API and features into our core product offerings. We continue to use the BundleB2B domain to prevent breaking changes for existing integrations. Our roadmap includes plans to use a new core BigCommerce domain to host our B2B Edition APIs. `{*Does this need updating?*}` From 98fae17a1a1de8a943492e1c7a9c9223fee81061 Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Mon, 26 Aug 2024 14:03:29 -0500 Subject: [PATCH 179/221] Update B2B authentication.yaml (#472) ## What changed? - Changed `storeFront` references to be `storefront` - Changed `BC` references to be `BigCommerce` ping @bigcommerce/dev-docs-team --- .../specs/storefront/authentication.yaml | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/b2b-edition/specs/storefront/authentication.yaml b/docs/b2b-edition/specs/storefront/authentication.yaml index 13a1bbac4..44ccd8f03 100644 --- a/docs/b2b-edition/specs/storefront/authentication.yaml +++ b/docs/b2b-edition/specs/storefront/authentication.yaml @@ -2,13 +2,13 @@ openapi: 3.0.0 info: title: Authentication version: '1.0' - description: BigCommerce B2B Edition API auth management. + description: Storefront authentication for the BigCommerce B2B Edition API servers: - url: 'https://api-b2b.bigcommerce.com/api' paths: /v2/login: post: - summary: Get StoreFront authToken from Stencil + summary: Get storefront authToken within Stencil operationId: post-login responses: '200': @@ -50,8 +50,9 @@ paths: data: token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InRlc3RfYjJjX29yZGVyX2ltcG9ydEBxcS5jb21tIiwic3RvcmVfaGFzaCI6ImYyb3N4ampueGoiLCJkYiI6ImRlZmF1bHQifQ description: |- - Get a storeFront authToken. You need a [BigCommerce Current Customer JWT](https://developer.bigcommerce.com/docs/storefront-auth/current-customer) to make the request. See the B2B Edition [Authentication article](/docs/openapi/65687766b2725-authentication) for more details. - <br>Equivalent Storefront GraphQL API Mutation: `authorization`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + Get a storefront authToken. You need a [BigCommerce Current Customer JWT](https://developer.bigcommerce.com/docs/storefront-auth/current-customer) to make the request. See the B2B Edition [Authentication article](/docs/openapi/65687766b2725-authentication) for more details. + + Equivalent Storefront GraphQL API Mutation: `authorization`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). requestBody: content: application/json: @@ -60,7 +61,7 @@ paths: properties: bcToken: type: string - description: BC JWT token + description: BigCommerce JWT token customerId: type: integer description: Customer Id @@ -83,7 +84,7 @@ paths: parameters: [] /io/auth/customers: post: - summary: Get StoreFront authToken with Credentials + summary: Get a storefront authToken for a specific customer operationId: post-auth-customer responses: '200': @@ -159,11 +160,11 @@ paths: email: type: string minLength: 1 - description: BC customer email + description: BigCommerce customer email password: type: string minLength: 1 - description: BC customer password + description: BigCommerce customer password channelId: type: number description: Store channelId @@ -188,8 +189,9 @@ paths: endAt: 1721930486 description: '' description: |- - BC customer get a authentication token. - <br>Equivalent Storefront GraphQL API Mutation: `login`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). + Get an authentication token for a specific BigCommerce customer. + + Equivalent Storefront GraphQL API Mutation: `login`. For more information, see the [GraphQL Playground](https://api-b2b.bigcommerce.com/graphql/playground). tags: - Authentication parameters: [] From 39d24ee8556084c5a4bdab66efb816b7ce151c7e Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 27 Aug 2024 18:47:54 +0300 Subject: [PATCH 180/221] DEVDOCS-6023: [TEST SPEC] Update customers.v2.yml (#462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6023] ## What changed? * Removed `date_created` and `date_modified` fields from the request body fields. * Fixed the amount field. Outstanding Question - Can someone confirm if the `none` enum is correct for `category_access` > `type`? ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6023]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6023?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/customers.v2.yml | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/reference/customers.v2.yml b/reference/customers.v2.yml index 8dbae78a3..21e240c51 100644 --- a/reference/customers.v2.yml +++ b/reference/customers.v2.yml @@ -846,7 +846,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/customerGroup_Post' + $ref: '#/components/schemas/customerGroup_Post_Put' required: true responses: '200': @@ -968,7 +968,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/customerGroup_Full' + $ref: '#/components/schemas/customerGroup_Post_Put' required: false responses: '200': @@ -1241,7 +1241,7 @@ components: amount: type: string description: A float that specifies the value applied to the price modified. (Float, Float as String, Integer) - example: '"5.0000"' + example: "5.0000" price_list_id: type: integer description: If a customer group is assigned to a price list,`method` and `amount` are not shown. `type` and `price_list_id` are returned. @@ -1334,8 +1334,8 @@ components: description: Numeric ID of the state’s/province’s associated country. example: 13 x-internal: false - customerGroup_Post: - title: customerGroup_Post + customerGroup_Post_Put: + title: customerGroup_Post_Put type: object properties: name: @@ -1370,19 +1370,11 @@ components: amount: type: string description: A float that specifies the value applied to the price modified. (Float, Float as String, Integer) - example: '"5.0000"' + example: "5.0000" price_list_id: type: integer description: If a customer group is assigned to a price list,`method` and `amount` are not shown. `type` and `price_list_id` are returned. example: 3 - date_created: - type: string - description: Date on which the customer group was created. - example: 2023-07-17 06:30:41 - date_modified: - type: string - description: Date on which the customer group was last modified. - example: 2023-07-25 01:15:19 is_group_for_guests: type: boolean description: Describes whether the group is for guests. There can only be one customer group for guests at a time. From 4b0a02be471bcf59182008e79ed784a2ca30e1f2 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:08:13 -0500 Subject: [PATCH 181/221] DEVDOCS-6025 [update]: Order Transactions, remove duplicate field (#479) --- reference/orders.v3.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/reference/orders.v3.yml b/reference/orders.v3.yml index 4df710af5..6662f896a 100644 --- a/reference/orders.v3.yml +++ b/reference/orders.v3.yml @@ -1783,11 +1783,6 @@ components: description: | The transaction ID returned by the payment gateway for this transaction item. type: string - date_created: - description: | - The date/time of the transaction. - type: string - format: date-time test: type: boolean description: | From 28c6731f3a04d8db7cbc5419c332898e43433e92 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 28 Aug 2024 15:42:23 +0300 Subject: [PATCH 182/221] Robertshaw_feedback_resource_id:in (#475) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # NO TICKET See feedback: https://bigcommerce.slack.com/archives/C04MTV8C2LE/p1724694585541939 ## What changed? Added resource_id:in filter for get all product metafields endpoint ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/catalog/products_catalog.v3.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 4d4889079..588b59de4 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -8982,6 +8982,7 @@ components: type: string enum: - resource_id + - resource_id:in - key - value - namespace From 1eaa4061bedc4eda37c475bb702f7a0916ea502f Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 29 Aug 2024 20:08:00 +0300 Subject: [PATCH 183/221] Issue-387: [update] remove url scheme (#482) <!-- Ticket number or summary of work --> # [ISSUE-387](https://github.com/bigcommerce/docs/issues/387) ## What changed? * Updated the example in the Create a Channel Site from http to https ## Release notes draft * Updated the example in the Create a Channel Site from http to https and added a note about using the Https protocol. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/channels.v3.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index d4d5a805b..5ad5e6315 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -603,7 +603,7 @@ paths: $ref: '#/components/schemas/site_Post' x-examples: application/json: - url: 'http://kittens.mybigcommerce.com/' + url: 'https://kittens.mybigcommerce.com/' channel_id: 123 tags: - Site @@ -2983,7 +2983,8 @@ components: properties: url: type: string - description: Unique site checkout URL. Must be valid and a sub-domain of primary channel URL. + description: |- + Unique site checkout URL. It must be valid and a sub-domain of the primary channel URL. Note: The API will change all URLs using the HTTP protocol to HTTPS. format: uri example: 'https://checkout.kittens.mybigcommerce.com' title: '' @@ -3628,7 +3629,7 @@ components: url: type: string description: The fully qualified URL (including host and scheme) where this site is hosted. All URLs generated for this site will be appended to this. - example: 'http://kittens.mybigcommerce.com/' + example: 'https://kittens.mybigcommerce.com/' channel_id: type: integer description: 'The channel to which this site is attached. Each site belongs to a single channel, and each channel can have either zero or more sites.' @@ -3662,13 +3663,14 @@ components: url: type: string description: URL of site + example: 'https://kittens.mybigcommerce.com/' type: type: string description: URL type enum: + - checkout - primary - canonical - - checkout created_at: type: string example: '2018-01-04T04:15:50.000Z' @@ -3693,7 +3695,7 @@ components: url: type: string description: The Fully Qualified URL (including host and scheme) where this site is hosted. All URLs generated for this site will be appended to this. - example: 'http://kittens.mybigcommerce.com/' + example: 'https://kittens.mybigcommerce.com/' channel_id: type: integer description: 'The channel this site is attached to. Each site belongs to a single channel, and each channel can have either zero or one sites.' From be860603e2107b8334d8d1ca28c162356bc6c7ce Mon Sep 17 00:00:00 2001 From: Nathan Booker <bookernath@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:23:15 -0500 Subject: [PATCH 184/221] Add infrastructure_region to V2 Store API (#485) <!-- Ticket number or summary of work --> # [DEVDOCS-6100](https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6100) ## What changed? <!-- Provide a bulleted list in the present tense --> * Added infrastructure_region to V2 Store API ## Release notes draft The Store Information API now includes the `infrastructure_region` of the store so you can determine where the store is hosted geographically. This is helpful when you are deploying supporting infrastructure for the store so you can deploy it nearby (or in the same GCP region) to minimize latency. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping @bc-traciporter [DEVDOCS-6100]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6100?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/store_information.v2.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reference/store_information.v2.yml b/reference/store_information.v2.yml index 691ece9ab..ff5a860db 100644 --- a/reference/store_information.v2.yml +++ b/reference/store_information.v2.yml @@ -204,6 +204,10 @@ components: type: string example: AU description: Two-letter ISO 3166-1 country code + infrastructure_region: + type: string + example: us-central1 + description: The infrastructure region where the store is located. Use this to determine where to place supporting infrastructure for minimum latency to the store. Compare against GCP regions on https://cloud.google.com/compute/docs/regions-zones phone: description: Display phone number. type: string From 33408d662cb46fa6676227ad6eb24281310428d1 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 3 Sep 2024 20:10:16 +0300 Subject: [PATCH 185/221] DEVDOCS-6081: [NEW] move segments to docs repo (#487) <!-- Ticket number or summary of work --> # [DEVDOCS-6081] ## What changed? Customer Segmentation moving to /docs repo ## Release notes draft Examples: * The newly-released Customer Segmentation is now available to use. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6081]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6081?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../store-operations/segments/definitions.mdx | 68 ++ docs/store-operations/segments/faqs.mdx | 35 + docs/store-operations/segments/overview.mdx | 42 + .../segments/promotions-api.mdx | 34 + docs/store-operations/segments/user-guide.mdx | 408 ++++++++++ reference/segments.v3.yml | 731 ++++++++++++++++++ 6 files changed, 1318 insertions(+) create mode 100644 docs/store-operations/segments/definitions.mdx create mode 100644 docs/store-operations/segments/faqs.mdx create mode 100644 docs/store-operations/segments/overview.mdx create mode 100644 docs/store-operations/segments/promotions-api.mdx create mode 100644 docs/store-operations/segments/user-guide.mdx create mode 100644 reference/segments.v3.yml diff --git a/docs/store-operations/segments/definitions.mdx b/docs/store-operations/segments/definitions.mdx new file mode 100644 index 000000000..5fa6b252b --- /dev/null +++ b/docs/store-operations/segments/definitions.mdx @@ -0,0 +1,68 @@ +# Definitions and Logical Relationships + +<Callout type="info"> + #### Exclusive enterprise feature + The Customer Segmentation API is available to enterprise customers. If you would like to become an enterprise customer, please contact your BigCommerce Customer Service Manager or our support team. +</Callout> + +## Segment +An entity that classifies shoppers into groups or buckets, referred to as **segments**. + +## Manual segment +A collection of shoppers that a merchant or application has grouped together using the API. Manual segments are not a distinct entity in our API; they are a subset of **segments**. + +## Shopper profile +An entity that represents a registered **customer**. Current plans for future releases include supporting **shopper profiles** for **guest** customers. + +## Customer +An existing entity that represents a shopper who is registered with the store. In the Customer Segmentation API documentation, assume that **customers** are signed in to the subject storefront. For more on the **customer** entity, see the public [Customers API reference](/docs/rest-management/customers). + +## Guest +A shopper who is not signed in to the subject storefront. + +A **guest** may or may not be a registered **customer**, but because they are not signed in, your application doesn't know their registration status. + +## Promotion +A way to give discounts based on whether the shopper meets specific criteria, such as ordering a certain amount, purchasing certain brands, being a repeat customer, or being associated with a **shopper profile** that belongs to a **segment**. + +For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). + +## Summary of entity relationships + +### Many-to-many + +* Segments and shopper profiles +* Segments and promotions + +### One-to-one + +* Shopper profiles and customers + +### Other entity relationships + +Relationships that don't currently involve the Customer Segmentation API: +* Many-to-many: guests and promotions + +Relationships that don't yet exist: +* Shopper profiles and guests + +## Resources + +### Articles +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Promotions and Customer Segmentation](/docs/store-operations/segments/promotions-api) +* [Promotions API documentation](/docs/store-operations/promotions) + +### Customer Segmentation reference +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Create segments](/docs/rest-management/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) + + diff --git a/docs/store-operations/segments/faqs.mdx b/docs/store-operations/segments/faqs.mdx new file mode 100644 index 000000000..43fbdcb4f --- /dev/null +++ b/docs/store-operations/segments/faqs.mdx @@ -0,0 +1,35 @@ +# FAQ + +## How will a promotion be applied to shoppers associated with a targeted segment? + +For a promotion to apply, you must assign a customer to the targeted segment, and they must sign in to the subject storefront. + +For automatic promotions, the discount automatically applies itself to the cart of each eligible signed-in customer. For coupon promotions, the signed-in customer must enter a valid coupon code associated with the promotion during checkout. + + +## Can you segment guests where customer_id=0? + +Not currently. This version of the Customer Segmentation API doesn’t support segmenting guest shoppers; only registered customers can be assigned to segments. + + +## How many segments are supported? + +We support up to 100 segments per **store**. The number of segments we support may increase due to the feedback we receive. + + +## What’s the difference between customer segments and customer groups? + +Customer groups allow you to group shoppers based on more permanent characteristics, like tax zones or shopper consent to collect GDPR-compliant data. A registered customer can only belong to one group at a time. + +Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) can belong to multiple segments. + +## Resources + +### Articles +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Promotions API](/docs/store-operations/segments/promotions-api) + +### Endpoints +* [Customer Segmentation V3 API Reference](/docs/rest-management/segments) diff --git a/docs/store-operations/segments/overview.mdx b/docs/store-operations/segments/overview.mdx new file mode 100644 index 000000000..488e09f42 --- /dev/null +++ b/docs/store-operations/segments/overview.mdx @@ -0,0 +1,42 @@ +# Customer Segmentation API Overview + +<Callout> + * Create manual segments with the API - leverage externally-defined customer segments using third-party tools and quickly transfer this data into and out of BigCommerce. + * Add a shopper to multiple segments - shoppers, or registered customers, can belong to up to 100 segments, meaning you can target a registered customer with multiple promotional experiences. + * Use segments with the Promotions API - apply a promotion to target multiple segments of shoppers, and exclude shoppers within a segment from receiving this promotion. +</Callout> + +## Introduction + +A **customer segment** is a collection of shoppers that share specific characteristics. Segmentation defines groups of shoppers that a merchant wants to target with a [Promotion](/docs/store-operations/segments/promotions-api), or dedicated value proposition. + +As a BigCommerce merchant, agency, and/or tech partner needing to improve a merchant store’s personalization strategy, the Customer Segmentation API enables the creation of externally defined segments that you can target within a promotion. + +Manual segments created with the Segmentation API will be visible within the Promotions Advanced Editor Control Panel UI Targeting section. + +![Promotion targeting segment.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Customer_Segmentation/Beta%20Docs%20Phasea1/Edit%20Promotions.png) + +For participants using the Promotions API, manual segments created with the Segmentation API will also be available to be targeted within the Promotions API. + +<Callout type="info"> + #### Exclusive enterprise feature + The Customer Segmentation API is available to enterprise customers. If you would like to become an enterprise customer, please contact your BigCommerce Customer Service Manager or our support team. +</Callout> + +## Segments and shopper profiles + +This API introduces two new objects that are both high-level entities with a many-to-many relationship: [segments](/docs/store-operations/segments/definitions#segment) and [shopper profiles](/docs/store-operations/segments/definitions#shopper-profile). + +![Screen Shot 2021-08-06 at 3.50.00 pm.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Customer_Segmentation/Beta%20Docs%20Phasea1/AquoYWAIt6g.png) + + +## Resources + +### Articles +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) + +### Endpoints +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) diff --git a/docs/store-operations/segments/promotions-api.mdx b/docs/store-operations/segments/promotions-api.mdx new file mode 100644 index 000000000..d1f4bb05f --- /dev/null +++ b/docs/store-operations/segments/promotions-api.mdx @@ -0,0 +1,34 @@ +# Promotions API + +<Callout type="info"> + #### Exclusive enterprise feature + The Customer Segmentation API is available to enterprise customers. If you would like to become an enterprise customer, please contact your BigCommerce Customer Service Manager or our support team. +</Callout> + +The [Promotions API](/docs/store-operations/promotions) lets you create exponentially more promotions and granular targeting rules than what you can do in the store control panel UI alone. + + +Learn more about [targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). + +## Resources + +### Articles +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) + +### Customer Segmentation reference +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Create segments](/docs/rest-management/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) + +### Customers reference +* [Create customers](/docs/rest-management/customers#create-customers) +* [Get customers](/docs/rest-management/customers#get-all-customer) diff --git a/docs/store-operations/segments/user-guide.mdx b/docs/store-operations/segments/user-guide.mdx new file mode 100644 index 000000000..f40ed3924 --- /dev/null +++ b/docs/store-operations/segments/user-guide.mdx @@ -0,0 +1,408 @@ +# Customer Segmentation API Guide + +<Callout type="info"> + #### Exclusive enterprise feature + The Customer Segmentation API is available to enterprise customers. If you would like to become an enterprise customer, please contact your BigCommerce Customer Service Manager or our support team. +</Callout> + +Get started with the Customer Segmentation API by creating *Segments* and *Shopper Profiles*. This guide provides example requests and responses to get you started customizing targeted shopper experiences. + + +## Customer Segments + +Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/segments/overview#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. + +### Creating segments + +Create new segments by sending a request to the [Create segments](/docs/rest-management/segments#create-segments) endpoint. Include an array of objects, where each object represents a segment and contains `name` and `description` properties. + +<Callout type="info"> + Segment names appear in the Promotions Manager view of the store control panel. To reduce confusion, give your segments unique names. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create segments" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments + X-Auth Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + [ + { + "name": "My Segment", + "description": "Segment description." + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create segments" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "name": "My Segment", + "description": "Segment description.", + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-24T14:15:22Z" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + + +## Shopper profiles + +Create a shopper profile to assign registered customers to segments. You can identify which registered customer a shopper profile represents by the profile's `customer_id` property; shopper profiles have a 1:1 relationship with registered customers. + +### Existing customers + +You can create one [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) for each registered customer using the [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) endpoint. Include an array of objects, where each object represents a shopper profile and contains the corresponding `customer_id`. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Create shopper profiles" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/shopper-profiles + X-Auth Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + [ + { + "customer_id": 1 + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Create shopper profiles" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "customer_id": 1, + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-24T14:15:22Z" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +### New customers + +To create a shopper profile for a new customer, first use the [Create customers](/docs/rest-management/customers#create-customers) endpoint to register the customer, then create a shopper profile using the new `customer_id`. + +### Add shopper profiles to a segment + +After you create segments and shopper profiles, you can associate multiple shopper profiles with a given segment using the [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) endpoint. Include the `segmentId` as a path parameter, and pass an array of shopper profile `id`s. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Add shoppers to a segment" showLineNumbers copy + POST https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments/{{segmentId}}/shopper-profiles + X-Auth Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + [ + "497f6eca-6276-4993-bfeb-53cbbbba6f08", // shopper profile UUID + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Add shoppers to a segment" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "customer_id": 1, + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-26T14:08:31Z" + } + ] + } + ``` + + </Tab> +</Tabs> + +## Updating and deleting segments + +Use the following guide to update or delete segments. + +### Update segments + +Update segment names and descriptions using the [Update Segments](/docs/rest-management/segments#update-segments) endpoint. Include an array of objects that each contain the `segmentId`; `name` and `description` are optional. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Update segments" showLineNumbers copy + PUT https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments + X-Auth Token: {{ACCESS_TOKEN}} + Content-Type: application/json + Accept: application/json + + [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "name": "My Segment", + "description": "New and improved segment description." + } + ] + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Update a segment" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "name": "My Segment", + "description": "New and improved segment description.", + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-27T18:57:22Z" + } + ], + "meta": {} + } + ``` + + </Tab> +</Tabs> + +#### Remove shoppers from a given segment + +You may want to change the segments to which a shopper's profile belongs based on the shopper's behavior on the storefront. To remove one or more specific shopper profiles, use the [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) endpoint. Include the `segmentId` as a path parameter, and use the `id:in` query parameter to pass the shopper profile `id`(s) you want to remove. If you exclude `id:in`, this request will empty the segment of all shopper profiles. + +<Callout type="info"> + Removing a shopper profile from a segment does not delete the shopper profile itself. The shopper profile will remain associated with any other segments. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Remove shoppers from a segment" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments/{{segmentId}}/shopper-profiles + X-Auth Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Remove shoppers from a segment" showLineNumbers copy + HTTP 204 No Content + ``` + </Tab> +</Tabs> + +### Delete segments + +To delete segments, use the [Delete segments](/docs/rest-management/segments#delete-segments) endpoint. Segments and shopper profiles have a many-to-many relationship. Thus, all the shopper profiles associated with a deleted segment will still exist, but be disassociated from the deleted segment. Include the `id:in` query parameter to specify which segments you want to delete. + +<Callout type="warning"> + #### Make sure to specify which segments + If you don't pass the `id:in` query parameter, you will delete every segment in the store. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Delete segments" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + + </Tab> + <Tab> + ```json filename="Example response: Delete segments" showLineNumbers copy + HTTP 204 No Content + ``` + </Tab> +</Tabs> + +### Delete shopper profiles + +To delete shopper profiles, use the [Delete shopper profiles](/docs/rest-management/shopper-profiles#delete-shopper-profiles) endpoint. Include the `id:in` query parameter to specify which shopper profiles you want to delete. + + +<Callout type="warning"> + #### Make sure to specify which shopper profiles + If you don't pass the `id:in` query parameter, you will delete every shopper profile in the store. +</Callout> + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Delete shopper profiles" showLineNumbers copy + DELETE https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/shopper-profiles + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + + </Tab> + <Tab> + ```json filename="Example response: Delete shopper profiles" showLineNumbers copy + HTTP 204 No Content + ``` + </Tab> +</Tabs> + +## Retrieving segment information + +Once you've established relationships between segments and shopper profiles, you can extend the reach of the Customer Segmentation API to target customers. + +### Retrieve shopper profiles for a segment + +To keep your segments in sync with external apps, use the [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles#get-all-shopper-profiles) endpoint. This request returns a list of all shopper profiles belonging to a specific segment. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get all shopper profiles in a segment" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/segments/{{segmentId}}/shopper-profiles + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get all shopper profiles in a segment" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "customer_id": 1, + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-24T14:15:22Z" + } + ], + "meta": { + "pagination": { + "total": 1, + "count": 1, + "per_page": 50, + "current_page": 1, + "total_pages": 1 + } + } + } + ``` + + </Tab> +</Tabs> + +### Retrieve segments for a shopper profile + +To find all segments associated with a given shopper profile, use the [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) endpoint. Include the `id` of the shopper profile as a path parameter. + +<Tabs items={['Request', 'Response']}> + <Tab> + + ```http filename="Example request: Get a shopper's segments" showLineNumbers copy + GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/shopper-profiles/{{shopperProfileId}}/segments + X-Auth-Token: {{ACCESS_TOKEN}} + Accept: application/json + ``` + + </Tab> + <Tab> + + ```json filename="Example response: Get a shopper's segments" showLineNumbers copy + { + "data": [ + { + "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "name": "My Segment", + "description": "New and improved segment description.", + "created_at": "2022-08-24T14:15:22Z", + "updated_at": "2022-08-24T14:15:22Z" + } + ], + "meta": { + "pagination": { + "total": 1, + "count": 1, + "per_page": 50, + "current_page": 1, + "total_pages": 1 + } + } + } + ``` + + </Tab> +</Tabs> + +### Retrieve shopper profile and segments for a customer + +To discover whether a customer is already associated with a shopper profile and segments, use the [Get customers](/docs/rest-management/customers#get-all-customers) endpoint. Pass the `include` query parameter with `shopper_profile_id` and `segment_ids` as in its comma-separated list of values. + +## Targeting a segment with a promotion + +You can use the Promotions Advanced Editor in the store control panel to target the segments you create with the Customer Segmentation API. + +### Promotions Advanced Editor + +To create a promotion in the store control panel, go to **Marketing > Promotions > Create > With Advanced Editor**. For more detailed information on creating a promotion, visit the [Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) article in our Support Center. + +![Promotions Advanced Editor.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Customer_Segmentation/Beta%20Docs%20Phasea1/Promotions_Create.png) + +When you set up targeting rules for a promotion, the **Customer Segment** field is available as an option. + +![targeting.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Customer_Segmentation/Beta%20Docs%20Phasea1/targeting.png) + +The Advanced Editor supports both inclusion and exclusion targeting rules, such as the following: + +* Using the *is* conditional, a promotion can target segments of shoppers who are in **segment A** *and/or* **segment B**. + +- Using the *is not* conditional, a promotion can target segments of shoppers who are in *neither* **segment A** *nor* **segment B**. + +To learn more about promotion targeting rules, visit the [Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) article in our Support Center. + + +## Resources + +### Articles +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) + +### Customer Segmentation reference +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Create segments](/docs/rest-management/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) + +### Customers reference +* [Create customers](/docs/rest-management/customers#create-customers) +* [Get customers](/docs/rest-management/customers#get-all-customers) diff --git a/reference/segments.v3.yml b/reference/segments.v3.yml new file mode 100644 index 000000000..443f43a04 --- /dev/null +++ b/reference/segments.v3.yml @@ -0,0 +1,731 @@ +openapi: '3.0.3' +info: + title: Segments API + version: '1.0' + description: |- + Group customers into segments to offer them promotions and other customized shopping experiences. + termsOfService: 'https://www.bigcommerce.com/terms' + contact: + name: BigCommerce + url: 'https://www.bigcommerce.com' + email: support@bigcommerce.com +servers: + - url: 'https://api.bigcommerce.com/stores/{store_hash}/v3' + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Segments + - name: Shopper Profiles + - name: Shopper Profiles for a Segment + - name: Segments for a Shopper Profile +paths: + '/segments': + parameters: + - $ref: '#/components/parameters/Accept' + get: + summary: 'Get All Segments' + tags: + - Segments + description: Returns a paginated *Segments List*. + operationId: 'GetPaginatedSegmentsList' + parameters: + - $ref: '#/components/parameters/FilterPageParam' + - $ref: '#/components/parameters/FilterLimitParam' + - $ref: '#/components/parameters/FilterIdParam' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentCollectionResponse' + post: + summary: 'Create Segments' + tags: + - Segments + description: | + Creates *Segments*. + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentsPostRequest' + application/xml: + schema: + type: object + properties: {} + required: true + description: '' + responses: + '201': + description: '| + An array of created *Segments*.' + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentsResponse' + '400': + description: | + The *Segment* was not valid. This is the result of either missing required fields, or because of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '409': + description: Conflict + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + data: [] + errors: + - status: 409 + title: Cannot have multiple segments with the same name. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: {} + meta: + total: 1 + success: 0 + failed: 1 + properties: + data: + type: array + items: + type: object + properties: {} + errors: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + errors: + type: object + properties: {} + required: + - status + meta: + type: object + properties: + total: + type: number + success: + type: number + failed: + type: number + required: + - data + - errors + - meta + operationId: 'SegmentsPostRequest' + put: + summary: 'Update Segments' + tags: + - Segments + description: | + Updates *Segments*. + operationId: 'PutSegmentObjects' + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentsPutRequest' + required: true + responses: + '201': + description: | + An array of created *Segments*. + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentsResponse' + '400': + description: | + The *Segment* was not valid. This is the result of either missing required fields, or because of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + summary: 'Delete Segments' + tags: + - Segments + description: | + Deletes one or more *Segments* from a store. This will not delete any associated *Shopper Profiles*. + operationId: 'DeleteStoreSegment' + parameters: + - $ref: '#/components/parameters/FilterIdParam' + responses: + '204': + description: | + An empty response. + '/segments/{segmentId}/shopper-profiles': + parameters: + - $ref: '#/components/parameters/Accept' + - $ref: '#/components/parameters/SegmentIdPathParam' + get: + summary: 'Get All Shopper Profiles in a Segment' + tags: + - Shopper Profiles for a Segment + description: Returns a list of *Shopper Profiles* that are associated with a given *Segment*. + operationId: 'GetSegmentProfiles' + parameters: + - $ref: '#/components/parameters/FilterPageParam' + - $ref: '#/components/parameters/FilterLimitParam' + responses: + '200': + description: | + An array of *Shopper Profiles* objects and metadata. + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesGetResponse' + post: + summary: 'Add Shopper Profiles to a Segment' + tags: + - Shopper Profiles for a Segment + description: |- + Add *Shopper Profiles* to a specific *Segment*. + A maximum number of *Shopper Profiles* per request is `50`, and up to three concurrent requests are allowed. + operationId: 'PostShopperProfile' + parameters: + - $ref: '#/components/parameters/ContentType' + responses: + '201': + description: An array of *Shopper Profiles* added to a *Segment*. + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesAddResponse' + '409': + description: Conflict + content: + application/json: + schema: + description: '' + type: object + x-examples: + example-1: + data: [] + errors: + - status: 409 + title: Unable to add shopper profiles to segment due to conflicts. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + '0': Shopper profile `1465bb16-eb7d-4fba-8312-0ea9d88cd6e9` already exists for segment `dfada416-eba1-49cf-ad21-0f48b48d50ad`. + meta: + total: 1 + success: 0 + failed: 1 + properties: + data: + type: array + items: + type: object + properties: {} + errors: + type: array + uniqueItems: true + minItems: 1 + items: + type: object + properties: + status: + type: number + title: + type: string + minLength: 1 + type: + type: string + minLength: 1 + errors: + type: object + properties: + '0': + type: string + minLength: 1 + meta: + type: object + required: + - total + - success + - failed + properties: + total: + type: number + success: + type: number + failed: + type: number + required: + - data + - errors + - meta + examples: + shopper-profile-conflict: + value: + data: [] + errors: + - status: 409 + title: Unable to add shopper profiles to segment due to conflicts. + type: 'https://developer.bigcommerce.com/api-docs/getting-started/api-status-codes' + errors: + '0': Shopper profile `1465bb16-eb7d-4fba-8312-0ea9d88cd6e9` already exists for segment `dfada416-eba1-49cf-ad21-0f48b48d50ad`. + meta: + total: 1 + success: 0 + failed: 1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesAddRequest' + delete: + summary: 'Remove Shopper Profiles from a Segment' + tags: + - Shopper Profiles for a Segment + description: | + Remove one or more *Shopper Profiles* that are associated with a *Segment*. This operation only removes the association; it doesn't delete the *Shopper Profiles*. + operationId: 'DeleteShopperProfile' + parameters: + - $ref: '#/components/parameters/FilterIdParam' + responses: + '204': + description: | + An empty response. + '/shopper-profiles': + parameters: + - $ref: '#/components/parameters/Accept' + get: + summary: 'Get All Shopper Profiles' + tags: + - Shopper Profiles + description: Returns a paginated *Shopper Profiles* list. + operationId: 'GetShopperList' + parameters: + - $ref: '#/components/parameters/FilterPageParam' + - $ref: '#/components/parameters/FilterLimitParam' + responses: + '200': + description: | + An array of *Shopper Profiles* objects and metadata. + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesCollectionResponse' + post: + summary: 'Create Shopper Profiles' + tags: + - Shopper Profiles + description: | + Creates a *Shopper Profile*. + operationId: 'ShopperProfilesRequest' + parameters: + - $ref: '#/components/parameters/ContentType' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesPostRequest' + required: true + responses: + '201': + description: | + An array of created *Shopper Profiles*. + content: + application/json: + schema: + $ref: '#/components/schemas/ShopperProfilesResponse' + '400': + description: | + The *Segment* was not valid. This is the result of either missing required fields, or because of invalid data. See the response for more details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + delete: + summary: 'Delete Shopper Profiles' + tags: + - Shopper Profiles + description: | + Deletes one or more *Shopper Profiles* from a store. + operationId: 'DeleteStoreShopperProfile' + parameters: + - $ref: '#/components/parameters/FilterIdParam' + responses: + '204': + description: | + An empty response. + '/shopper-profiles/{shopperProfileId}/segments': + parameters: + - $ref: '#/components/parameters/Accept' + - $ref: '#/components/parameters/ShopperIdPathParam' + get: + summary: 'Get All Segments for a Shopper Profile' + tags: + - Segments for a Shopper Profile + description: Returns a paginated *Segments* list for a *Shopper Profile*. + operationId: 'GetListShopperProfile' + parameters: + - $ref: '#/components/parameters/FilterPageParam' + - $ref: '#/components/parameters/FilterLimitParam' + responses: + '200': + description: | + An array of *Segments* objects and metadata. + content: + application/json: + schema: + $ref: '#/components/schemas/SegmentCollectionResponse' +components: + parameters: + Accept: + name: Accept + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.' + schema: + type: string + default: 'application/json' + ContentType: + name: Content-Type + in: header + required: true + description: 'The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body.' + schema: + type: string + default: 'application/json' + SegmentIdPathParam: + name: segmentId + description: The *Segment* ID. + in: path + schema: + type: string + format: uuid + required: true + ShopperIdPathParam: + name: shopperProfileId + description: The *Shopper Profile* ID. + in: path + schema: + type: string + format: uuid + required: true + FilterIdParam: + name: 'id:in' + description: | + Comma separated IDs. + required: false + in: query + schema: + type: array + items: + type: string + explode: true + FilterPageParam: + name: page + in: query + description: | + Page number. + required: false + schema: + type: integer + FilterLimitParam: + name: limit + in: query + description: | + Items count per page. + required: false + schema: + type: integer + schemas: + SegmentsResponse: + description: | + Response payload for the BigCommerce API. + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Segment' + meta: + type: object + properties: {} + title: '' + SegmentsPostRequest: + description: | + Request payload for the BigCommerce API. + type: array + items: + $ref: '#/components/schemas/SegmentPost' + SegmentsPutRequest: + description: | + Request payload for the BigCommerce API. + type: array + items: + $ref: '#/components/schemas/SegmentPut' + SegmentPost: + type: object + properties: + name: + type: string + description: Name of the segment + example: My Segment + description: + type: string + description: Description of the segment + example: Description + required: + - name + SegmentPut: + type: object + properties: + id: + type: string + description: ID of the segment. + format: uuid + name: + type: string + description: Name of the segment. + example: My Segment + description: + type: string + description: Description of the segment. + example: Description + required: + - id + Pagination: + type: object + description: | + Data about the response including pagination, and collection totals. + properties: + total: + type: integer + description: | + Total number of items in the result set. + example: 1 + count: + type: integer + description: | + Total number of items in the collection response. + example: 1 + per_page: + type: integer + description: | + The amount of items returned in the collection per page, controlled by the limit parameter. + example: 50 + current_page: + type: integer + description: | + The page you are currently on within the collection. + example: 1 + total_pages: + type: integer + description: | + The total number of pages in the collection. + example: 1 + CollectionMeta: + type: object + description: | + Data about the response including pagination, and collection totals. + properties: + pagination: + $ref: '#/components/schemas/Pagination' + ErrorResponse: + allOf: + - $ref: '#/components/schemas/BaseError' + - type: object + properties: + errors: + $ref: '#/components/schemas/DetailedErrors' + BaseError: + type: object + description: | + Error payload for the BigCommerce API. + properties: + status: + description: | + The HTTP status code. + type: integer + title: + description: | + The error title describing the particular error. + type: string + type: + type: string + instance: + type: string + DetailedErrors: + type: object + properties: {} + additionalProperties: + type: string + Segment: + type: object + properties: + id: + type: string + format: uuid + description: | + The ID of the segment. + name: + type: string + description: | + The name of the segment. + example: My Segment + description: + type: string + description: | + The description of the segment. + example: Description + created_at: + type: string + format: date-time + description: | + The date of which the segment was created. + example: 2022-09-15T23:44:05Z + updated_at: + type: string + format: date-time + description: | + The date of which the segment was updated. + example: 2022-09-15T23:44:05Z + SegmentCollectionResponse: + description: | + Response payload for the BigCommerce API. + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Segment' + meta: + $ref: '#/components/schemas/CollectionMeta' + ShopperProfile: + type: object + properties: + id: + type: string + format: uuid + description: | + The ID of the *Shopper Profile*. + customer_id: + type: integer + example: 1 + description: | + The ID of the registered *Customer* associated with this *Shopper Profile*. + created_at: + type: string + format: date-time + description: | + The date and time when the *Shopper Profile* was created. + updated_at: + type: string + format: date-time + description: | + The date and time when the *Shopper Profile* was last updated. + ShopperProfilesAddRequest: + type: array + description: A list of *Shopper Profiles* to associate with the segment. + items: + type: string + format: uuid + description: 'The ID of a *Shopper Profile*.' + ShopperProfilesAddResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/ShopperProfile' + ShopperProfilesGetResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/ShopperProfile' + meta: + $ref: '#/components/schemas/CollectionMeta' + ShopperProfilesCollectionResponse: + description: | + Response payload for the BigCommerce API. + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/ShopperProfile' + meta: + $ref: '#/components/schemas/CollectionMeta' + ShopperProfilesPostRequest: + description: | + Request payload for the BigCommerce API. + type: array + items: + $ref: '#/components/schemas/ShopperProfilePost' + ShopperProfilePost: + type: object + properties: + customer_id: + type: number + description: The ID of a registered Customer to associate with the new *Shopper Profile*. + example: 1 + ShopperProfilesResponse: + description: | + Response payload for the BigCommerce API. + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/ShopperProfile' + meta: + type: object + properties: {} + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Customers | modify | `store_v2_customers` | + | Customers | read-only | `store_v2_customers_read_only` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication#x-auth-token-header-example-requests). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication#oauth-scopes). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header From f109fc458400e728fd9f71b5bb987baeb3ac2b38 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 00:02:36 +0300 Subject: [PATCH 186/221] DEVDOCS-6081-3: [update] fix links (#493) <!-- Ticket number or summary of work --> # [DEVDOCS-6081] ## What changed? fixed links ## Release notes draft n/a ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6081]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6081?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../store-operations/segments/definitions.mdx | 26 +++++------ docs/store-operations/segments/faqs.mdx | 12 ++--- docs/store-operations/segments/overview.mdx | 12 ++--- .../segments/promotions-api.mdx | 26 +++++------ docs/store-operations/segments/user-guide.mdx | 44 +++++++++---------- 5 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs/store-operations/segments/definitions.mdx b/docs/store-operations/segments/definitions.mdx index 5fa6b252b..098e04b27 100644 --- a/docs/store-operations/segments/definitions.mdx +++ b/docs/store-operations/segments/definitions.mdx @@ -25,7 +25,7 @@ A **guest** may or may not be a registered **customer**, but because they are no ## Promotion A way to give discounts based on whether the shopper meets specific criteria, such as ordering a certain amount, purchasing certain brands, being a repeat customer, or being associated with a **shopper profile** that belongs to a **segment**. -For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). +For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). ## Summary of entity relationships @@ -49,20 +49,20 @@ Relationships that don't yet exist: ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Promotions and Customer Segmentation](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Promotions and Customer Segmentation](/docs/store-operations/customer-segmentation/promotions-api) * [Promotions API documentation](/docs/store-operations/promotions) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) -* [Create segments](/docs/rest-management/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) +* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) diff --git a/docs/store-operations/segments/faqs.mdx b/docs/store-operations/segments/faqs.mdx index 43fbdcb4f..c1bd3bd91 100644 --- a/docs/store-operations/segments/faqs.mdx +++ b/docs/store-operations/segments/faqs.mdx @@ -21,15 +21,15 @@ We support up to 100 segments per **store**. The number of segments we support m Customer groups allow you to group shoppers based on more permanent characteristics, like tax zones or shopper consent to collect GDPR-compliant data. A registered customer can only belong to one group at a time. -Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) can belong to multiple segments. +Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/customer-segmentation/definitions-and-relationships#shopper-profile) can belong to multiple segments. ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) -* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) +* [Promotions API](/docs/store-operations/customer-segmentation/promotions-api) ### Endpoints -* [Customer Segmentation V3 API Reference](/docs/rest-management/segments) +* [Customer Segmentation V3 API Reference](/docs/rest-management/customer-segmentation/segments) diff --git a/docs/store-operations/segments/overview.mdx b/docs/store-operations/segments/overview.mdx index 488e09f42..fa95e22ab 100644 --- a/docs/store-operations/segments/overview.mdx +++ b/docs/store-operations/segments/overview.mdx @@ -8,7 +8,7 @@ ## Introduction -A **customer segment** is a collection of shoppers that share specific characteristics. Segmentation defines groups of shoppers that a merchant wants to target with a [Promotion](/docs/store-operations/segments/promotions-api), or dedicated value proposition. +A **customer segment** is a collection of shoppers that share specific characteristics. Segmentation defines groups of shoppers that a merchant wants to target with a [Promotion](/docs/store-operations/customer-segmentation/promotions-api), or dedicated value proposition. As a BigCommerce merchant, agency, and/or tech partner needing to improve a merchant store’s personalization strategy, the Customer Segmentation API enables the creation of externally defined segments that you can target within a promotion. @@ -25,7 +25,7 @@ For participants using the Promotions API, manual segments created with the Segm ## Segments and shopper profiles -This API introduces two new objects that are both high-level entities with a many-to-many relationship: [segments](/docs/store-operations/segments/definitions#segment) and [shopper profiles](/docs/store-operations/segments/definitions#shopper-profile). +This API introduces two new objects that are both high-level entities with a many-to-many relationship: [segments](/docs/store-operations/customer-segmentation/definitions-and-relationships#segment) and [shopper profiles](/docs/store-operations/customer-segmentation/definitions-and-relationships#shopper-profile). ![Screen Shot 2021-08-06 at 3.50.00 pm.png](https://storage.googleapis.com/bigcommerce-production-dev-center/images/Customer_Segmentation/Beta%20Docs%20Phasea1/AquoYWAIt6g.png) @@ -33,10 +33,10 @@ This API introduces two new objects that are both high-level entities with a man ## Resources ### Articles -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) -* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) +* [Promotions API](/docs/store-operations/customer-segmentation/promotions-api) * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Endpoints -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) diff --git a/docs/store-operations/segments/promotions-api.mdx b/docs/store-operations/segments/promotions-api.mdx index d1f4bb05f..e183a1870 100644 --- a/docs/store-operations/segments/promotions-api.mdx +++ b/docs/store-operations/segments/promotions-api.mdx @@ -8,26 +8,26 @@ The [Promotions API](/docs/store-operations/promotions) lets you create exponentially more promotions and granular targeting rules than what you can do in the store control panel UI alone. -Learn more about [targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). +Learn more about [targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). ## Resources ### Articles -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) -* [Create segments](/docs/rest-management/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) +* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) ### Customers reference * [Create customers](/docs/rest-management/customers#create-customers) diff --git a/docs/store-operations/segments/user-guide.mdx b/docs/store-operations/segments/user-guide.mdx index f40ed3924..a47834282 100644 --- a/docs/store-operations/segments/user-guide.mdx +++ b/docs/store-operations/segments/user-guide.mdx @@ -10,11 +10,11 @@ Get started with the Customer Segmentation API by creating *Segments* and *Shopp ## Customer Segments -Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/segments/overview#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. +Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/customer-segmentation#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. ### Creating segments -Create new segments by sending a request to the [Create segments](/docs/rest-management/segments#create-segments) endpoint. Include an array of objects, where each object represents a segment and contains `name` and `description` properties. +Create new segments by sending a request to the [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) endpoint. Include an array of objects, where each object represents a segment and contains `name` and `description` properties. <Callout type="info"> Segment names appear in the Promotions Manager view of the store control panel. To reduce confusion, give your segments unique names. @@ -65,7 +65,7 @@ Create a shopper profile to assign registered customers to segments. You can ide ### Existing customers -You can create one [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) for each registered customer using the [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) endpoint. Include an array of objects, where each object represents a shopper profile and contains the corresponding `customer_id`. +You can create one [shopper profile](/docs/store-operations/customer-segmentation/definitions-and-relationships#shopper-profile) for each registered customer using the [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) endpoint. Include an array of objects, where each object represents a shopper profile and contains the corresponding `customer_id`. <Tabs items={['Request', 'Response']}> <Tab> @@ -109,7 +109,7 @@ To create a shopper profile for a new customer, first use the [Create customers] ### Add shopper profiles to a segment -After you create segments and shopper profiles, you can associate multiple shopper profiles with a given segment using the [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) endpoint. Include the `segmentId` as a path parameter, and pass an array of shopper profile `id`s. +After you create segments and shopper profiles, you can associate multiple shopper profiles with a given segment using the [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) endpoint. Include the `segmentId` as a path parameter, and pass an array of shopper profile `id`s. <Tabs items={['Request', 'Response']}> <Tab> @@ -150,7 +150,7 @@ Use the following guide to update or delete segments. ### Update segments -Update segment names and descriptions using the [Update Segments](/docs/rest-management/segments#update-segments) endpoint. Include an array of objects that each contain the `segmentId`; `name` and `description` are optional. +Update segment names and descriptions using the [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) endpoint. Include an array of objects that each contain the `segmentId`; `name` and `description` are optional. <Tabs items={['Request', 'Response']}> <Tab> @@ -193,7 +193,7 @@ Update segment names and descriptions using the [Update Segments](/docs/rest-man #### Remove shoppers from a given segment -You may want to change the segments to which a shopper's profile belongs based on the shopper's behavior on the storefront. To remove one or more specific shopper profiles, use the [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) endpoint. Include the `segmentId` as a path parameter, and use the `id:in` query parameter to pass the shopper profile `id`(s) you want to remove. If you exclude `id:in`, this request will empty the segment of all shopper profiles. +You may want to change the segments to which a shopper's profile belongs based on the shopper's behavior on the storefront. To remove one or more specific shopper profiles, use the [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) endpoint. Include the `segmentId` as a path parameter, and use the `id:in` query parameter to pass the shopper profile `id`(s) you want to remove. If you exclude `id:in`, this request will empty the segment of all shopper profiles. <Callout type="info"> Removing a shopper profile from a segment does not delete the shopper profile itself. The shopper profile will remain associated with any other segments. @@ -219,7 +219,7 @@ You may want to change the segments to which a shopper's profile belongs based o ### Delete segments -To delete segments, use the [Delete segments](/docs/rest-management/segments#delete-segments) endpoint. Segments and shopper profiles have a many-to-many relationship. Thus, all the shopper profiles associated with a deleted segment will still exist, but be disassociated from the deleted segment. Include the `id:in` query parameter to specify which segments you want to delete. +To delete segments, use the [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) endpoint. Segments and shopper profiles have a many-to-many relationship. Thus, all the shopper profiles associated with a deleted segment will still exist, but be disassociated from the deleted segment. Include the `id:in` query parameter to specify which segments you want to delete. <Callout type="warning"> #### Make sure to specify which segments @@ -245,7 +245,7 @@ To delete segments, use the [Delete segments](/docs/rest-management/segments#del ### Delete shopper profiles -To delete shopper profiles, use the [Delete shopper profiles](/docs/rest-management/shopper-profiles#delete-shopper-profiles) endpoint. Include the `id:in` query parameter to specify which shopper profiles you want to delete. +To delete shopper profiles, use the [Delete shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#delete-shopper-profiles) endpoint. Include the `id:in` query parameter to specify which shopper profiles you want to delete. <Callout type="warning"> @@ -276,7 +276,7 @@ Once you've established relationships between segments and shopper profiles, you ### Retrieve shopper profiles for a segment -To keep your segments in sync with external apps, use the [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles#get-all-shopper-profiles) endpoint. This request returns a list of all shopper profiles belonging to a specific segment. +To keep your segments in sync with external apps, use the [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles#get-all-shopper-profiles) endpoint. This request returns a list of all shopper profiles belonging to a specific segment. <Tabs items={['Request', 'Response']}> <Tab> @@ -317,7 +317,7 @@ To keep your segments in sync with external apps, use the [Get all shopper profi ### Retrieve segments for a shopper profile -To find all segments associated with a given shopper profile, use the [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) endpoint. Include the `id` of the shopper profile as a path parameter. +To find all segments associated with a given shopper profile, use the [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) endpoint. Include the `id` of the shopper profile as a path parameter. <Tabs items={['Request', 'Response']}> <Tab> @@ -387,21 +387,21 @@ To learn more about promotion targeting rules, visit the [Advanced Editor](https ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) -* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) +* [Promotions API](/docs/store-operations/customer-segmentation/promotions-api) * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) -* [Create segments](/docs/rest-management/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) +* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) ### Customers reference * [Create customers](/docs/rest-management/customers#create-customers) From 1fe5608e69d61a23d46960aa7cc5f39a0439c1b7 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 01:58:58 +0300 Subject: [PATCH 187/221] DEVDOCS-6081-links (#494) <!-- Ticket number or summary of work --> # [DEVDOCS-6081] ## What changed? Fix links ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6081]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6081?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../store-operations/segments/definitions.mdx | 26 +++++++++---------- docs/store-operations/segments/faqs.mdx | 12 ++++----- docs/store-operations/segments/overview.mdx | 2 +- .../segments/promotions-api.mdx | 26 +++++++++---------- docs/store-operations/segments/user-guide.mdx | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/store-operations/segments/definitions.mdx b/docs/store-operations/segments/definitions.mdx index 098e04b27..5fa6b252b 100644 --- a/docs/store-operations/segments/definitions.mdx +++ b/docs/store-operations/segments/definitions.mdx @@ -25,7 +25,7 @@ A **guest** may or may not be a registered **customer**, but because they are no ## Promotion A way to give discounts based on whether the shopper meets specific criteria, such as ordering a certain amount, purchasing certain brands, being a repeat customer, or being associated with a **shopper profile** that belongs to a **segment**. -For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). +For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). ## Summary of entity relationships @@ -49,20 +49,20 @@ Relationships that don't yet exist: ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) -* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) -* [Promotions and Customer Segmentation](/docs/store-operations/customer-segmentation/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Promotions and Customer Segmentation](/docs/store-operations/segments/promotions-api) * [Promotions API documentation](/docs/store-operations/promotions) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) -* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Create segments](/docs/rest-management/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) diff --git a/docs/store-operations/segments/faqs.mdx b/docs/store-operations/segments/faqs.mdx index c1bd3bd91..43fbdcb4f 100644 --- a/docs/store-operations/segments/faqs.mdx +++ b/docs/store-operations/segments/faqs.mdx @@ -21,15 +21,15 @@ We support up to 100 segments per **store**. The number of segments we support m Customer groups allow you to group shoppers based on more permanent characteristics, like tax zones or shopper consent to collect GDPR-compliant data. A registered customer can only belong to one group at a time. -Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/customer-segmentation/definitions-and-relationships#shopper-profile) can belong to multiple segments. +Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) can belong to multiple segments. ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) -* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) -* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) -* [Promotions API](/docs/store-operations/customer-segmentation/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Promotions API](/docs/store-operations/segments/promotions-api) ### Endpoints -* [Customer Segmentation V3 API Reference](/docs/rest-management/customer-segmentation/segments) +* [Customer Segmentation V3 API Reference](/docs/rest-management/segments) diff --git a/docs/store-operations/segments/overview.mdx b/docs/store-operations/segments/overview.mdx index fa95e22ab..9c9da2018 100644 --- a/docs/store-operations/segments/overview.mdx +++ b/docs/store-operations/segments/overview.mdx @@ -8,7 +8,7 @@ ## Introduction -A **customer segment** is a collection of shoppers that share specific characteristics. Segmentation defines groups of shoppers that a merchant wants to target with a [Promotion](/docs/store-operations/customer-segmentation/promotions-api), or dedicated value proposition. +A **customer segment** is a collection of shoppers that share specific characteristics. Segmentation defines groups of shoppers that a merchant wants to target with a [Promotion](/docs/store-operations/customer-segmentation/definitions-and-relationships#promotion), or dedicated value proposition. As a BigCommerce merchant, agency, and/or tech partner needing to improve a merchant store’s personalization strategy, the Customer Segmentation API enables the creation of externally defined segments that you can target within a promotion. diff --git a/docs/store-operations/segments/promotions-api.mdx b/docs/store-operations/segments/promotions-api.mdx index e183a1870..d1f4bb05f 100644 --- a/docs/store-operations/segments/promotions-api.mdx +++ b/docs/store-operations/segments/promotions-api.mdx @@ -8,26 +8,26 @@ The [Promotions API](/docs/store-operations/promotions) lets you create exponentially more promotions and granular targeting rules than what you can do in the store control panel UI alone. -Learn more about [targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). +Learn more about [targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). ## Resources ### Articles -* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) -* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) -* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) +* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) +* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) +* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) -* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) +* [Create segments](/docs/rest-management/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) ### Customers reference * [Create customers](/docs/rest-management/customers#create-customers) diff --git a/docs/store-operations/segments/user-guide.mdx b/docs/store-operations/segments/user-guide.mdx index a47834282..d30d4ca25 100644 --- a/docs/store-operations/segments/user-guide.mdx +++ b/docs/store-operations/segments/user-guide.mdx @@ -10,7 +10,7 @@ Get started with the Customer Segmentation API by creating *Segments* and *Shopp ## Customer Segments -Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/customer-segmentation#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. +Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/segments/overview#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. ### Creating segments From d25f2843c9c997df5e538d5fe0fde7b9838e378f Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 18:18:27 +0300 Subject: [PATCH 188/221] Update promotions-api.mdx - fix links (#495) <!-- Ticket number or summary of work --> #NO TICKET ## What changed? Found broken links and fixing them ## Release notes draft n/a ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- .../segments/promotions-api.mdx | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/store-operations/segments/promotions-api.mdx b/docs/store-operations/segments/promotions-api.mdx index d1f4bb05f..ef4595826 100644 --- a/docs/store-operations/segments/promotions-api.mdx +++ b/docs/store-operations/segments/promotions-api.mdx @@ -8,26 +8,26 @@ The [Promotions API](/docs/store-operations/promotions) lets you create exponentially more promotions and granular targeting rules than what you can do in the store control panel UI alone. -Learn more about [targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). +Learn more about [targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). ## Resources ### Articles -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) -* [Create segments](/docs/rest-management/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation) +* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](/docs/rest-management/customer-segmentation/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](/docs/rest-management/customer-segmentation/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) ### Customers reference * [Create customers](/docs/rest-management/customers#create-customers) From 1df95eacfa2636e6db827f994b7ba78e79c39c95 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 21:12:20 +0300 Subject: [PATCH 189/221] Update user-guide.mdx (#496) <!-- Ticket number or summary of work --> #no ticket ## What changed? fix another link ## Release notes draft n/a ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- .../store-operations/segments/definitions.mdx | 26 +++++++++---------- docs/store-operations/segments/faqs.mdx | 12 ++++----- .../segments/promotions-api.mdx | 2 +- docs/store-operations/segments/user-guide.mdx | 2 +- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/store-operations/segments/definitions.mdx b/docs/store-operations/segments/definitions.mdx index 5fa6b252b..d551b1757 100644 --- a/docs/store-operations/segments/definitions.mdx +++ b/docs/store-operations/segments/definitions.mdx @@ -25,7 +25,7 @@ A **guest** may or may not be a registered **customer**, but because they are no ## Promotion A way to give discounts based on whether the shopper meets specific criteria, such as ordering a certain amount, purchasing certain brands, being a repeat customer, or being associated with a **shopper profile** that belongs to a **segment**. -For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/segments/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). +For more on using **promotions** with **segments**, see [Targeting a segment with a promotion](/docs/store-operations/customer-segmentation/user-guide#targeting-a-segment-with-a-promotion). For more on the **promotion** entity, see the [Promotions documentation](/docs/store-operations/promotions). ## Summary of entity relationships @@ -49,20 +49,20 @@ Relationships that don't yet exist: ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Promotions and Customer Segmentation](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Promotions and Customer Segmentation](/docs/store-operations/customer-segmentation/promotions-api) * [Promotions API documentation](/docs/store-operations/promotions) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/segments) -* [Create segments](/docs/rest-management/segments#create-segments) -* [Create shopper profiles](/docs/rest-management/shopper-profiles#create-shopper-profiles) -* [Add shopper profiles to a segment](/docs/rest-management/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) -* [Update Segments](/docs/rest-management/segments#update-segments) -* [Remove shopper profiles from a segment](/docs/rest-management/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) -* [Delete segments](/docs/rest-management/segments#delete-segments) -* [Get all shopper profiles in a segment](/docs/rest-management/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) -* [Get all segments for a shopper profile](/docs/rest-management/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation) +* [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) +* [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) +* [Add shopper profiles to a segment](docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) +* [Update Segments](docs/rest-management/customer-segmentation/segments#update-segments) +* [Remove shopper profiles from a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#remove-shopper-profiles-from-a-segment) +* [Delete segments](docs/rest-management/customer-segmentation/segments#delete-segments) +* [Get all shopper profiles in a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#get-all-shopper-profiles-in-a-segment) +* [Get all segments for a shopper profile](/docs/rest-management/customer-segmentation/segments-for-a-shopper-profile#get-all-segments-for-a-shopper-profile) diff --git a/docs/store-operations/segments/faqs.mdx b/docs/store-operations/segments/faqs.mdx index 43fbdcb4f..94dde598d 100644 --- a/docs/store-operations/segments/faqs.mdx +++ b/docs/store-operations/segments/faqs.mdx @@ -21,15 +21,15 @@ We support up to 100 segments per **store**. The number of segments we support m Customer groups allow you to group shoppers based on more permanent characteristics, like tax zones or shopper consent to collect GDPR-compliant data. A registered customer can only belong to one group at a time. -Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/segments/definitions#shopper-profile) can belong to multiple segments. +Customer segments provide greater flexibility. They leverage both the permanent and transient characteristics of a shopper to drive highly personalized shopping experiences. A [shopper profile](/docs/store-operations/customer-segmentation/definitions-and-relationships#shopper-profile) can belong to multiple segments. ## Resources ### Articles -* [Customer Segmentation API Overview](/docs/store-operations/segments/overview) -* [Customer Segmentation API Guide](/docs/store-operations/segments/user-guide) -* [Definitions and Logical Relationships](/docs/store-operations/segments/definitions) -* [Promotions API](/docs/store-operations/segments/promotions-api) +* [Customer Segmentation API Overview](/docs/store-operations/customer-segmentation) +* [Customer Segmentation API Guide](/docs/store-operations/customer-segmentation/user-guide) +* [Definitions and Logical Relationships](/docs/store-operations/customer-segmentation/definitions-and-relationships) +* [Promotions API](/docs/store-operations/customer-segmentation/promotions-api) ### Endpoints -* [Customer Segmentation V3 API Reference](/docs/rest-management/segments) +* [Customer Segmentation V3 API Reference](/docs/rest-management/customer-segmentation) diff --git a/docs/store-operations/segments/promotions-api.mdx b/docs/store-operations/segments/promotions-api.mdx index ef4595826..e183a1870 100644 --- a/docs/store-operations/segments/promotions-api.mdx +++ b/docs/store-operations/segments/promotions-api.mdx @@ -19,7 +19,7 @@ Learn more about [targeting a segment with a promotion](/docs/store-operations/c * [Promotions Advanced Editor](https://support.bigcommerce.com/s/article/Advanced-Promotions#creating) (Support Center) ### Customer Segmentation reference -* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation) +* [Customer Segmentation V3 API Reference Overview](/docs/rest-management/customer-segmentation/segments) * [Create segments](/docs/rest-management/customer-segmentation/segments#create-segments) * [Create shopper profiles](/docs/rest-management/customer-segmentation/shopper-profiles#create-shopper-profiles) * [Add shopper profiles to a segment](/docs/rest-management/customer-segmentation/shopper-profiles-for-a-segment#add-shopper-profiles-to-a-segment) diff --git a/docs/store-operations/segments/user-guide.mdx b/docs/store-operations/segments/user-guide.mdx index d30d4ca25..96daf9bea 100644 --- a/docs/store-operations/segments/user-guide.mdx +++ b/docs/store-operations/segments/user-guide.mdx @@ -10,7 +10,7 @@ Get started with the Customer Segmentation API by creating *Segments* and *Shopp ## Customer Segments -Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/segments/overview#introduction) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. +Create customer segments to offer customers targeted promotions. See the [Customer Segmentation overview](/docs/store-operations/customer-segmentation) to get the big picture on targeting customers with promotions. For more granular details, see the [Targeting a segment with a promotion](#targeting-a-segment-with-a-promotion) section of this article. ### Creating segments From aba0ae2cdd92aa12d372c35c2ba6f9920abb6be5 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 21:14:18 +0300 Subject: [PATCH 190/221] DEVDOCS-6098: [update] added_by_promotion field (#492) <!-- Ticket number or summary of work --> # [DEVDOCS-6098] ## What changed? Added new field to physical and digital products. (added_by_promotion) ## Release notes draft We recently exposed the added_by_promotion field in the v3 cart and checkout endpoints. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6098]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6098?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/carts.v3.yml | 8 ++++++++ reference/checkouts.v3.yml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index de2295ecc..ee40d5b71 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -2245,6 +2245,10 @@ components: type: boolean example: true description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. + added_by_promotion: + type: boolean + example: false + description: Whether or not a promotion added an additional item. download_file_urls: description: URLs to download all product files. type: array @@ -3288,6 +3292,10 @@ components: type: boolean example: true description: Whether or not you can change or remove the item from the cart. Items that are immutable include those added automatically by promotions. + added_by_promotion: + type: boolean + example: false + description: Whether or not a promotion added an additional item. gift_wrapping: description: The gift wrapping details for this item. type: object diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index 2e5592bc5..02f148ebb 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -8178,6 +8178,10 @@ components: is_mutable: type: boolean description: '' + added_by_promotion: + type: boolean + example: false + description: Whether or not a promotion added an additional item. parent_id: type: number description: '' @@ -8244,6 +8248,10 @@ components: is_require_shipping: type: boolean description: '' + added_by_promotion: + type: boolean + example: false + description: Whether or not a promotion added an additional item. is_taxable: type: boolean description: '' From 52425bae60b8be86f5d0e33b9468b6bb0f7df5f4 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 4 Sep 2024 22:40:48 +0300 Subject: [PATCH 191/221] DEVDOCS-6090: [Update] Add channels (#481) <!-- Ticket number or summary of work --> # [DEVDOCS-6090] ## What changed? Added channels as an optional field to existing /catalog/products v3 endpoints ## Release notes draft * We're happy to announce channels are available as an optional field in /catalog/products v3 endpoints which can help you ....... ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6090]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6090?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/products_catalog.v3.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 588b59de4..2a8ab3558 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -176,6 +176,8 @@ paths: product_tax_code: string categories: - 0 + channels: + - 1 brand_id: 37 inventory_level: 0 inventory_warning_level: 0 @@ -6594,6 +6596,8 @@ components: product_tax_code: string categories: - 0 + channels: + - 1 brand_id: 0 brand_name: "New Brand" inventory_level: 0 @@ -6872,6 +6876,8 @@ components: calculated_price: 50 categories: - 24 + channels: + - 1 brand_id: 37 brand_name: "New Brand" option_set_id: 21 @@ -7037,6 +7043,12 @@ components: type: number maximum: 1000 minimum: 0 + channels: + type: array + description: | + An array of channel IDs to which this product is assigned. + items: + type: number brand_id: maximum: 1000000000 minimum: 0 @@ -7374,6 +7386,8 @@ components: calculated_price: 50 categories: - 24 + channels: + - 1 brand_id: 37 option_set_id: 21 option_set_display: "right" @@ -7534,6 +7548,12 @@ components: type: number maximum: 1000 minimum: 0 + channels: + type: array + description: | + An array of channel IDs to which this product is assigned. + items: + type: number brand_id: maximum: 1000000000 minimum: 0 @@ -9104,6 +9124,7 @@ components: - options - parent_relations - custom_fields + - channels IdMinParam: name: 'id:min' in: query From 0b1a704e985745c9f567564ed1e77fb4a3ad2872 Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Thu, 5 Sep 2024 10:52:50 -0400 Subject: [PATCH 192/221] Update babel dependency in stencil react foundation doc (#491) ## What changed? * Updated the Babel plugin dependency that's recommended in the React foundation doc for Stencil, since it has moved into a new package since the doc was original created ## Release notes draft * Stencil React foundation doc has been updated to work with the latest Babel plugin packages. Now the guidance works for React 18. Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- docs/storefront/stencil/themes/foundations/react.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/storefront/stencil/themes/foundations/react.mdx b/docs/storefront/stencil/themes/foundations/react.mdx index 24ccb0553..e3af146c1 100644 --- a/docs/storefront/stencil/themes/foundations/react.mdx +++ b/docs/storefront/stencil/themes/foundations/react.mdx @@ -35,7 +35,7 @@ Navigate into the root Cornerstone theme folder, then install the following npm cd ~/path/to/theme/dir # install dependencies -npm install --save-dev @material-ui/core react react-dom babel-plugin-transform-object-assign @babel/preset-react +npm install --save-dev @material-ui/core react react-dom @babel/plugin-transform-object-assign @babel/preset-react ``` ### Update webpack.common.js @@ -46,7 +46,7 @@ Update` webpack.common.js` with the new presets and plugins. ... plugins: [ ... - 'transform-object-assign', + '@babel/plugin-transform-object-assign', ], ``` From 79d2e214916124c8549a0f64ad9c578dc2dd7cce Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 5 Sep 2024 22:37:13 +0300 Subject: [PATCH 193/221] Issue-170 (#500) <!-- Ticket number or summary of work --> # [Issue-170](https://github.com/bigcommerce/docs/issues/170) ## What changed? You can not filter by date_created so I am removing it from the Store logs doc. See slack conversation: https://bigcommerce.slack.com/archives/CJ49J4R98/p1710769273094249 ## Release notes draft ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- docs/store-operations/settings/logs.mdx | 98 +------------------------ reference/store_logs.v3.yml | 10 --- 2 files changed, 1 insertion(+), 107 deletions(-) diff --git a/docs/store-operations/settings/logs.mdx b/docs/store-operations/settings/logs.mdx index b2ffdc7f4..38c0ddad7 100644 --- a/docs/store-operations/settings/logs.mdx +++ b/docs/store-operations/settings/logs.mdx @@ -65,101 +65,6 @@ Accept: application/json } } ``` - -</Tab> -</Tabs> - -### Filter by date created - -Filter logs by using the `date_created` value in the query parameter. The date created must be in [Unix Timestamp](https://www.unixtimestamp.com/) format. - -The following example retrieves entries by the date created: -<Tabs items={['Request', 'Response']}> -<Tab> - -```http filename="Example request: Filter by date created" showLineNumbers copy -GET https://api.bigcommerce.com/stores/{{STORE_HASH}}/v3/store/systemlogs?date_created:min=1657688400&date_created:max=1658379600 -X-Auth-Token: {{ACCESS_TOKEN}} -Content-Type: application/json -Accept: application/json -``` - -</Tab> -<Tab> - -```json filename="Example response: Filter by date created" showLineNumbers copy -{ - "data": [ - { - "id": 63, - "type": "payment", - "module": "Test Payment Gateway", - "severity": "success", - "summary": "Test payment for order #121 processed successfully", - "message": "", - "date_created": "2023-01-05T22:31:54+00:00" - }, - { - "id": 64, - "type": "notification", - "module": "Email Message", - "severity": "success", - "summary": "Notification sent successfully", - "message": "<strong>Sent email notification to:</strong><br />jane.doe@example.com", - "date_created": "2023-01-05T22:31:54+00:00" - }, - { - "id": 65, - "type": "notification", - "module": "Optimized Checkout", - "severity": "success", - "summary": "Order has been successfully finalized via Optimized checkout.", - "message": "Order has been successfully finalized via Optimized checkout.", - "date_created": "2023-01-05T22:31:54+00:00" - }, - { - "id": 66, - "type": "payment", - "module": "Test Payment Gateway", - "severity": "success", - "summary": "Test payment for order #122 processed successfully", - "message": "", - "date_created": "2023-01-05T22:46:15+00:00" - }, - { - "id": 68, - "type": "notification", - "module": "Optimized Checkout", - "severity": "success", - "summary": "Order has been successfully finalized via Optimized checkout.", - "message": "Order has been successfully finalized via Optimized checkout.", - "date_created": "2023-01-05T22:46:16+00:00" - }, - { - "id": 71, - "type": "shipping", - "module": "Home Delivery (flatrate)", - "severity": "success", - "summary": "Successfully retrieved shipping quote", - "message": "{\"quoteId\":\"\",\"timestamp\":\"1673022877\",\"cacheInfo\":\"cached for 3600s\",\"customerGroup\":{\"id\":2,\"name\":\"Retail\"},\"customerEmail\":\"\",\"customerId\":0,\"destination\":{\"streetAddress1\":\"123 Test Lane\",\"streetAddress2\":\"\",\"city\":\"Test\",\"postcode\":\"78040\",\"stateName\":\"Texas\",\"stateIso2\":\"TX\",\"countryIso2\":\"US\",\"addressType\":\"residential\",\"customAddressFields\":[]},\"items\":[{\"name\":\"Test Product (Test-001)\",\"id\":\"127\",\"quantity\":1,\"price\":15,\"discounted_price\":15,\"shipping_price\":0,\"weight\":0.5,\"width\":0,\"height\":0,\"length\":0,\"attributes\":[],\"omittedReason\":\"\"}],\"groupedResults\":{\"flatrate\":{\"rates\":[{\"handling\":0,\"price\":10,\"description\":\"Home Delivery\",\"additionalDescription\":\"\"}],\"carrierType\":\"flatrate\"}},\"settings\":[]}", - "date_created": "2023-01-06T16:34:37+00:00" - }, - ], - "meta": { - "pagination": { - "total": 6, - "count": 6, - "per_page": 50, - "current_page": 1, - "total_pages": 1, - "links": { - "current": "?date_created%3Amin=1671244778&date_created%3Amax=1684287578&page=1&limit=50" - } - } - } -} -``` - </Tab> </Tabs> @@ -393,8 +298,7 @@ Accept: application/json ## Resources -- [Store Logs API Reference](/docs/rest-management/store-logs#get-system-logs) - [Store Logs Support Article](https://support.bigcommerce.com/s/article/Using-Store-Logs) ### Endpoint reference -- [Get system logs](/docs/rest-management/store-logs#get-system-logs) +- [Store Logs API Reference](/docs/rest-management/store-logs#get-system-logs) diff --git a/reference/store_logs.v3.yml b/reference/store_logs.v3.yml index 5d5483808..739c0048f 100644 --- a/reference/store_logs.v3.yml +++ b/reference/store_logs.v3.yml @@ -114,16 +114,6 @@ paths: in: query name: 'id:in' description: 'A comma-separated list of log IDs by which to filter. For example, `?id:in=3,4,6`.' - - schema: - type: string - in: query - name: 'date_created:min' - description: 'Query parameter that lets you filter by the minimum date created in [Unix time](https://www.unixtimestamp.com/), for example, `?date_created:min=1657688400`. Returns logs created after this date.' - - schema: - type: string - in: query - name: 'date_created:max' - description: 'Query parameter that lets you filter by the maximum date created in [Unix time](https://www.unixtimestamp.com/), for example, `?date_created:min=1658379600`. Returns logs created before this date.' parameters: [] components: schemas: From 1a0504fc41e43411f14cfc2961e70ac427aa23cb Mon Sep 17 00:00:00 2001 From: Luke Eller <luke.eller@bigcommerce.com> Date: Fri, 6 Sep 2024 13:45:15 +1000 Subject: [PATCH 194/221] Clarify the role of is_fallback in shipping methods API (#502) <!-- Ticket number or summary of work --> is_fallback is used when advanced shipping rules (ShipperHQ) is unavailable. This change clarifies the role of fallback shipping methods. ## What changed? <!-- Provide a bulleted list in the present tense --> * Update the documentation of the is_fallback property of shipping methods ## Release notes draft The meaning of the is_fallback property of shipping methods has been clarified. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> --- reference/shipping.v2.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/shipping.v2.yml b/reference/shipping.v2.yml index 5e7c2eeff..31dde35e1 100644 --- a/reference/shipping.v2.yml +++ b/reference/shipping.v2.yml @@ -2334,7 +2334,7 @@ components: description: Percentage handling fee applied to shipping cost. example: 0 is_fallback: - description: Whether or not this shipping zone is the fallback if all others are not valid for the order. + description: Whether or not this shipping method is a fallback method used when advanced shipping rules are unavailable. example: false type: boolean ShippingResponse: From 0b9cc7e3eb3e48d788c401a731875fea4335041b Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:31:26 +0100 Subject: [PATCH 195/221] Changed order_source description (#362) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed order_source description from order_RespOnly Added enum object for allowed values <!-- Ticket number or summary of work --> # [DEVDOCS-6009] Re-work of order_source parameter description ## What changed? <!-- Provide a bulleted list in the present tense --> * Changed description of `order_source` parameter in order_RespOnly YAML object. * Note that this is currently the only location of the `order_source` description, however there could be more if DEVDOCS-6008 has been merged. ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Re-worked `order_source` description to be more specific as to what values can be set for each origin. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> May need more changes if DEVDOCS-6008 has been merged ahead of it. [DEVDOCS-6009]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6009?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- reference/orders.v2.oas2.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 0c309ae7a..7055cc15e 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -4131,13 +4131,8 @@ components: type: boolean order_source: description: |- - The `order_source` is set upon order creation and reflects the origin of the order. It will indicate whether the order was created by one of the following: - * storefront - * control panel - * manual order - * /v2/orders API - * Checkout API - * or by an integration with an external platform such as Facebook by Meta or Amazon. + Reflects the origin of the order. It can affect the order’s icon and source as defined in the control panel listing. + Allowed values: `www` (Desktop) | `iphone` (Iphone) | `ipad` (Ipad) | `android` (Android) | `mobile` (Mobile) | `manual` (manual order) | `external` (Orders API) | `checkout_api` (Checkout API) | `buybutton` (Buy Button) | `amazon` (Amazon) | `ebay` (Ebay) | `facebookshop` (Facebook Shop) | `facebookcheckout` (Facebook Checkout) | `facebookmarketplace` (Facebook Marketplace) | `pinterest` (Pinterest) | `socialshop` (Social Shop) type: string consignments: $ref: '#/components/schemas/orderConsignments_Resource' From 82db88b7892ae27cf91f844ece02791b0cf798f2 Mon Sep 17 00:00:00 2001 From: Lucki2501 <120939817+Lucki2501@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:49:23 +0100 Subject: [PATCH 196/221] [DEVDOCS-6006] Document is_deleted flag for Orders (#360) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6006] ## What changed? <!-- Provide a bulleted list in the present tense --> * Added `is_deleted` flag to order response attributes for [POST](https://developer.bigcommerce.com/docs/rest-management/orders#create-an-order), [PUT](https://developer.bigcommerce.com/docs/rest-management/orders#update-an-order), [GET ](https://developer.bigcommerce.com/docs/rest-management/orders#get-an-order)and[ GET all](https://developer.bigcommerce.com/docs/rest-management/orders#get-all-orders) calls * Response body attributes map to order_RespOnly YAML object ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * Documentation for `is_deleted` flag in V2 Orders API ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> *Twined with DEVDOCS-6007 - Investigate missing `is_deleted` parameter/attribute in Orders documentation [DEVDOCS-6006]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6006?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> --- reference/orders.v2.oas2.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 7055cc15e..535a35bf4 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -4125,6 +4125,10 @@ components: shipping_address_count: type: number description: The number of shipping addresses associated with this transaction. A read-only value. Do not pass in a POST or PUT. + is_deleted: + description: Indicates whether the order is deleted/archived. When set to true in a PUT request, it has the same result as the DELETE an order request. + example: false + type: boolean is_email_opt_in: description: Indicates whether the shopper has selected an opt-in check box (on the checkout page) to receive emails. A read-only value. Do not pass in a POST or PUT. example: false From 690c0d3e338d6f0611cf433c6959ffdd06301a31 Mon Sep 17 00:00:00 2001 From: David Chin <davidchin.yf@gmail.com> Date: Sat, 7 Sep 2024 04:01:45 +1000 Subject: [PATCH 197/221] DEVDOCS-6104: Clarify the meaning of version field in the request/response of cart/checkout API (#498) <!-- Ticket number or summary of work --> # [DEVDOCS-6104] ## What changed? * Clarify the meaning of `version` field in the request/response of cart/checkout API so developers know what it can be used for. ## Release notes draft N/A ping @bigcommerce/team-checkout [DEVDOCS-6104]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6104?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- reference/carts.sf.yml | 16 ++++++++-------- reference/carts.v3.yml | 10 +++++----- reference/checkouts.sf.yml | 16 ++++++++-------- reference/checkouts.v3.yml | 18 +++++++++--------- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/reference/carts.sf.yml b/reference/carts.sf.yml index 2ee1847df..90a1081bd 100644 --- a/reference/carts.sf.yml +++ b/reference/carts.sf.yml @@ -402,7 +402,7 @@ components: description: Locale of the cart. version: type: integer - description: The current version of the cart. + description: The current version of the cart increments with each successful update. You can use it to enable optimistic concurrency control for subsequent updates. example: 1 x-internal: false requestCart: @@ -537,7 +537,7 @@ components: $ref: '#/components/schemas/requestCartPostLineItem' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - lineItems @@ -549,7 +549,7 @@ components: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - giftCertificates @@ -565,7 +565,7 @@ components: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - lineItems @@ -581,7 +581,7 @@ components: $ref: '#/components/schemas/requestCartPostLineItem' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - lineItem @@ -592,7 +592,7 @@ components: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - giftCertificates @@ -605,7 +605,7 @@ components: $ref: '#/components/schemas/requestLineItemGiftCertificate' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: - lineItem @@ -617,7 +617,7 @@ components: properties: version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 responseCartCurrency: title: Currency diff --git a/reference/carts.v3.yml b/reference/carts.v3.yml index ee40d5b71..8c5d1bf4a 100644 --- a/reference/carts.v3.yml +++ b/reference/carts.v3.yml @@ -1564,7 +1564,7 @@ components: type: integer version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 title: Cart Update Put Request Data x-internal: false @@ -1770,7 +1770,7 @@ components: type: string version: type: integer - description: The current version of the cart. + description: The current version of the cart increments with each successful update. You can use it to enable optimistic concurrency control for subsequent updates. example: 1 Currency: type: object @@ -2934,14 +2934,14 @@ components: $ref: '#/components/schemas/cart_PostCustomItem' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 CartLineItemDelete: type: object properties: version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 Redirect_urls_Post: type: object @@ -3024,7 +3024,7 @@ components: $ref: '#/components/schemas/cart_PostCustomItem' version: type: integer - description: The expected version of the cart. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 cart_PostCustomItem: type: array diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index e77b9d2bf..8a279b218 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -1812,7 +1812,7 @@ paths: description: '' version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 required: true responses: @@ -2343,7 +2343,7 @@ components: `true` value indicates StoreCredit has been applied. version: type: integer - description: The current version of the checkout. + description: The current version of the checkout increments with each successful update. You can use it to enable optimistic concurrency control for subsequent updates. example: 1 description: '' x-internal: false @@ -2501,7 +2501,7 @@ components: properties: version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false consignment_Full: @@ -2624,7 +2624,7 @@ components: description: '' version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false checkouts_Resp: @@ -3534,7 +3534,7 @@ components: type: integer version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false DeleteCouponCodeRequest: @@ -3543,7 +3543,7 @@ components: properties: version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false DeleteConsignmentRequest: @@ -3552,7 +3552,7 @@ components: properties: version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false GiftCertificateRequest: @@ -3662,7 +3662,7 @@ components: type: integer version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 description: One or more of these three fields is mandatory. You can update address and line items in one request. You have to update shipping option ID or pickup option ID in a separate request since changing the address or line items can invalidate the previously available shipping options. x-internal: false diff --git a/reference/checkouts.v3.yml b/reference/checkouts.v3.yml index 02f148ebb..4a7d8ea96 100644 --- a/reference/checkouts.v3.yml +++ b/reference/checkouts.v3.yml @@ -1655,7 +1655,7 @@ paths: example: 15 version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 example: cart: @@ -8727,7 +8727,7 @@ components: description: Text of the banner. version: type: integer - description: The current version of the checkout. + description: The current version of the checkout increments with each successful update. You can use it to enable optimistic concurrency control for subsequent updates. example: 1 Checkout_Put: title: Checkout_Put @@ -8740,7 +8740,7 @@ components: description: '' version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false AppliedCoupon: @@ -8826,7 +8826,7 @@ components: description: 'This can also be an array for fields that need to support a list of values (e.g., a set of check boxes.)' version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false CreateConsignmentRequest: @@ -8921,7 +8921,7 @@ components: example: 1 version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false DeleteConsignmentRequest: @@ -8930,7 +8930,7 @@ components: properties: version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false UpdateConsignmentRequest: @@ -9031,7 +9031,7 @@ components: example: "custom shipping" version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 description: One or more of these three fields are mandatory. `address` and `line_items` can be updated in one request. `shipping_option_id` has to be updated in a separate request because changing the address or line items can invalidate the previously available shipping options. x-internal: false @@ -9044,7 +9044,7 @@ components: description: Coupon codes have a 50-character limit. version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false DeleteCouponCodeRequest: @@ -9053,7 +9053,7 @@ components: properties: version: type: integer - description: The expected version of the checkout. + description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 x-internal: false Order: From f94b794587d558eaf9d5f6c20a13dc98455d5783 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 6 Sep 2024 21:33:56 +0300 Subject: [PATCH 198/221] Issue-377: [update] removed trailing slash (#501) <!-- Ticket number or summary of work --> # [Issue-377](https://github.com/bigcommerce/docs/issues/377) ## What changed? Removed trailing slash from example ## Release notes draft N/A - Bug Fix ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/storefront_tokens.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/storefront_tokens.v3.yml b/reference/storefront_tokens.v3.yml index 92dfbf52e..bad628981 100644 --- a/reference/storefront_tokens.v3.yml +++ b/reference/storefront_tokens.v3.yml @@ -66,7 +66,7 @@ paths: - $ref: '#/components/schemas/TokenPostImpersonation' example: allowed_cors_origins: - - 'https://www.yourstorefront.com/' + - 'https://www.yourstorefront.com' channel_id: 1 expires_at: 1885635176 required: false From 36288d39aa3c7cdfbc5324f2c8e007a81d04490c Mon Sep 17 00:00:00 2001 From: Matt Hill <matt.hill@bigcommerce.com> Date: Tue, 10 Sep 2024 09:30:05 +1000 Subject: [PATCH 199/221] doc(customers): CUST-3450 Add account created notification to v3 customers POST endpoint (#477) <!-- Ticket number or summary of work --> # [CUST-3450] ## What changed? <!-- Provide a bulleted list in the present tense --> * Addition of `trigger_account_created_notification` as a request parameter for Customer [POST](https://developer.bigcommerce.com/docs/rest-management/customers#create-customers) ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. --> * Addition of `trigger_account_created_notification` as a request parameter for Customer [POST](https://developer.bigcommerce.com/docs/rest-management/customers#create-customers) ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> https://bigcommercecloud.atlassian.net/browse/PROJECT-6641 ping @bc-tgomez @bigcommerce/team-customers [CUST-3450]: https://bigcommercecloud.atlassian.net/browse/CUST-3450 --------- Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- reference/customers.v3.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reference/customers.v3.yml b/reference/customers.v3.yml index fdb97d60b..1b91fde77 100644 --- a/reference/customers.v3.yml +++ b/reference/customers.v3.yml @@ -275,6 +275,7 @@ paths: force_password_reset: true new_password: string123 accepts_product_review_abandoned_cart_emails: true + trigger_account_created_notification: true store_credit_amounts: - amount: 43.15 origin_channel_id: 1 @@ -3448,6 +3449,9 @@ components: Array of form fields. Controlled by formfields parameter. items: $ref: "#/components/schemas/formFieldValue" + trigger_account_created_notification: + type: boolean + description: Indicates whether to send a customer registered welcome email. required: - email - first_name From 52a7d788876c35b3531d4e2e8af501ae2a78524e Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 10 Sep 2024 15:50:11 +0300 Subject: [PATCH 200/221] Revert "DEVDOCS-6090: [Update] Add channels" (#509) Reverts bigcommerce/docs#481 --- reference/catalog/products_catalog.v3.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 2a8ab3558..588b59de4 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -176,8 +176,6 @@ paths: product_tax_code: string categories: - 0 - channels: - - 1 brand_id: 37 inventory_level: 0 inventory_warning_level: 0 @@ -6596,8 +6594,6 @@ components: product_tax_code: string categories: - 0 - channels: - - 1 brand_id: 0 brand_name: "New Brand" inventory_level: 0 @@ -6876,8 +6872,6 @@ components: calculated_price: 50 categories: - 24 - channels: - - 1 brand_id: 37 brand_name: "New Brand" option_set_id: 21 @@ -7043,12 +7037,6 @@ components: type: number maximum: 1000 minimum: 0 - channels: - type: array - description: | - An array of channel IDs to which this product is assigned. - items: - type: number brand_id: maximum: 1000000000 minimum: 0 @@ -7386,8 +7374,6 @@ components: calculated_price: 50 categories: - 24 - channels: - - 1 brand_id: 37 option_set_id: 21 option_set_display: "right" @@ -7548,12 +7534,6 @@ components: type: number maximum: 1000 minimum: 0 - channels: - type: array - description: | - An array of channel IDs to which this product is assigned. - items: - type: number brand_id: maximum: 1000000000 minimum: 0 @@ -9124,7 +9104,6 @@ components: - options - parent_relations - custom_fields - - channels IdMinParam: name: 'id:min' in: query From 89512a788ba0525e8cb35e09dbdd7d5be87c3ed5 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Tue, 10 Sep 2024 10:46:12 -0500 Subject: [PATCH 201/221] DEVDOCS-6099 [new]: Channel Menus, add localization into protected UI section (#499) --- docs/integrations/channels/guide/storefronts.mdx | 1 + reference/channels.v3.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/integrations/channels/guide/storefronts.mdx b/docs/integrations/channels/guide/storefronts.mdx index 4a4427ee4..3b93cd267 100644 --- a/docs/integrations/channels/guide/storefronts.mdx +++ b/docs/integrations/channels/guide/storefronts.mdx @@ -99,6 +99,7 @@ BigCommerce allows the developer to toggle the location and scope of the followi | Domains | `domains` | Renders channel-specific domain settings. | | Notifications | `notifications` | Renders channel-specific notification settings. | | Social | `social` | Renders channel-specific social media settings. | +| Localization | `localization` | Renders channel-specific localization settings. | The term _protected section_ refers to the settings on the corresponding menu pages. Settings in protected sections override the default settings configured at the storewide level. Include these protected sections in requests to the [Create channel menus](/docs/rest-management/channels/channel-menus#create-channel-menus) endpoint to display BigCommerce-provided, channel-specific settings pages and corresponding menu items. Enabled protected sections precede custom sections in a channel's menu. diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 5ad5e6315..1a46c4d44 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -3504,6 +3504,7 @@ components: - domains - currencies - notifications + - localization channel_menus_Post: type: object properties: From 1d742c03caf2dcfeacf017010d22e71e9b456ad8 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Tue, 10 Sep 2024 23:20:25 +0300 Subject: [PATCH 202/221] DEVDOCS-6087: [update] add favicon to storefront GraphQL (#484) <!-- Ticket number or summary of work --> # [DEVDOCS-6087] ## What changed? Added example mutation to get a storefront's favicon. ## Release notes draft * The example query shows you how to get a storefront's favicon. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6087]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6087?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: Nathan Booker <bookernath@users.noreply.github.com> --- docs/storefront/graphql/examples/index.mdx | 24 +++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/docs/storefront/graphql/examples/index.mdx b/docs/storefront/graphql/examples/index.mdx index 67408c04b..44183d70f 100644 --- a/docs/storefront/graphql/examples/index.mdx +++ b/docs/storefront/graphql/examples/index.mdx @@ -65,7 +65,7 @@ query CustomerAttributes { } ``` -<a href="https://developer.bigcommerce.com/graphql?playground_tab=customerDetails" target="_blank">**Try it in GraphQL Playground**</a> +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> ## Get first three levels of category tree @@ -91,7 +91,7 @@ fragment CategoryFields on CategoryTreeItem { } ``` -<a href="https://developer.bigcommerce.com/graphql?playground_tab=categoryTree" target="_blank">**Try it in GraphQL Playground**</a> +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> ## Get category and products within by URL @@ -146,7 +146,7 @@ fragment PriceFields on Money { } ``` -<a href="https://developer.bigcommerce.com/graphql?playground_tab=categoriesByUrl" target="_blank">**Try it in GraphQL Playground**</a> +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> ## Look up an object by URL @@ -187,7 +187,7 @@ query LookUpUrl { } ``` -<a href="https://developer.bigcommerce.com/graphql?playground_tab=objectsByUrl" target="_blank">**Try it in GraphQL Playground**</a> +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> ## Get popular brands @@ -208,4 +208,18 @@ query { } ``` -<a href="https://developer.bigcommerce.com/graphql?playground_tab=popularBrands" target="_blank">**Try it in GraphQL Playground**</a> +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> + +## Get a favicon to Storefront GraphQL + +```graphql filename="Example query: Get the storefront's favicon" showLineNumbers copy +query Favicon { + site { + settings { + faviconUrl + } + } +} +``` + +<a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> From 8fca6623563a478967e3c6e567b6ad68667376c0 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 11 Sep 2024 18:40:48 +0300 Subject: [PATCH 203/221] editorial change (#516) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [no ticket] ## What changed? fixing the language ## Release notes draft <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- docs/storefront/graphql/examples/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/storefront/graphql/examples/index.mdx b/docs/storefront/graphql/examples/index.mdx index 44183d70f..5fb95c426 100644 --- a/docs/storefront/graphql/examples/index.mdx +++ b/docs/storefront/graphql/examples/index.mdx @@ -210,7 +210,7 @@ query { <a href="https://developer.bigcommerce.com/graphql-storefront/playground" target="_blank">**Try it in GraphQL Playground**</a> -## Get a favicon to Storefront GraphQL +## Get a favicon ```graphql filename="Example query: Get the storefront's favicon" showLineNumbers copy query Favicon { From 81efe8b2c9cfb0e62904a4e54fc191b90333fcbf Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 11 Sep 2024 18:42:36 +0300 Subject: [PATCH 204/221] fix consent categories numbers (#515) <!-- Ticket number or summary of work --> # NO TICKET ## What changed? Corrected the consent category numbers in file ## Release notes draft Bug Fix See feedback slack channel: https://bigcommerce.slack.com/archives/C04MTV8C2LE/p1726045801664739 ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/consent.sf.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reference/consent.sf.yml b/reference/consent.sf.yml index bd3558ed2..56d4b9e2a 100644 --- a/reference/consent.sf.yml +++ b/reference/consent.sf.yml @@ -44,10 +44,10 @@ paths: Example: value: allow: + - 1 - 2 - - 3 deny: - - 4 + - 3 description: 'Data sent to the [Update customer consent](/docs/rest-management/customers/customer-consent#update-customer-consent) endpoint when creating a customer during checkout.' required: true description: | @@ -75,21 +75,21 @@ components: Configurable categories are: + 1 - Analytics 2 - Functional - 3 - Analytics - 4 - Targeting; Advertising + 3 - Targeting; Advertising For further definition of these categories, see [Scripts API](/docs/integrations/scripts). properties: allow: type: array - description: 'Explicitly allowed consent categories. Allowed values are 2, 3, 4.' + description: 'Explicitly allowed consent categories. Allowed values are 1, 2, 3.' items: type: integer enum: + - 1 - 2 - 3 - - 4 example: 3 deny: type: array @@ -97,10 +97,10 @@ components: items: type: integer enum: + - 1 - 2 - 3 - - 4 - example: 4 + example: 2 required: - allow - deny From 9b4b16cee1f0c6ea7ebcc237cbf213f53ffa0b2c Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Wed, 11 Sep 2024 10:54:20 -0500 Subject: [PATCH 205/221] DEVDOCS-6105 [revise]: MSF International Enhancements, clarify custom fields (#514) --- docs/integrations/webhooks/events/index.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/integrations/webhooks/events/index.mdx b/docs/integrations/webhooks/events/index.mdx index ec26a3823..95f12d5e7 100644 --- a/docs/integrations/webhooks/events/index.mdx +++ b/docs/integrations/webhooks/events/index.mdx @@ -885,6 +885,9 @@ A change to any of the following fields triggers a `store/product/updated` event * Thumbnail - new images only* * Visibility * Warranty + +A change to the following field triggers the `store/product/updated` event only if the change is made for a _channel locale_. For more information, see the [International Enhancements for Multi-Storefront](/docs/store-operations/catalog/msf-international-enhancements) overview. + * Custom field's name or value <Callout type="info"> From 0d9eb5a63a9befe6644b12a997a9a3761e41fcc4 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 11 Sep 2024 19:24:06 +0300 Subject: [PATCH 206/221] Issue-505 (#513) <!-- Ticket number or summary of work --> # [Issue-505](https://github.com/bigcommerce/docs/issues/505) ## What changed? Removed "events_history_enabled" ## Release notes draft Bug Fix ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/webhooks.v3.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index 4f8c860ac..c20bb8f21 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -138,7 +138,7 @@ paths: '200': $ref: '#/components/responses/webhook_Resp' summary: Update a Webhook - description: Updates a webhook. Custom headers can be added. + description: Updates a webhook. You can add custom headers. At least one field is required to perform an update. operationId: updateWebhook parameters: - $ref: '#/components/parameters/Accept' @@ -2931,10 +2931,6 @@ components: type: boolean example: true description: Boolean value that indicates whether the webhook is active or not. - events_history_enabled: - type: boolean - example: true - description: Boolean value that identifies whether events are stored that could not be received. headers: type: object description: Headers used to validate that webhooks are active. You can pass in any number of custom headers to validate webhooks are being returned. @@ -2959,11 +2955,6 @@ components: type: boolean example: true description: Boolean value that indicates whether the webhook is active or not. A webhook subscription becomes deactivated after 90 days of inactivity. - events_history_enabled: - type: boolean - example: true - description: Deprecated. Boolean value that identifies whether events are stored that could not be received. - deprecated: true headers: type: object description: Headers used to validate that webhooks are active. You can pass in any number of custom headers to validate webhooks are being returned. From 6cf2f764c6be1027e48b267974e71402fc3ef898 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 12 Sep 2024 16:05:42 +0300 Subject: [PATCH 207/221] DEVDOCS-5966: [update] correct contentType (#507) <!-- Ticket number or summary of work --> # [DEVDOCS-5966] ## What changed? Added new contentType for the image endpoints ## Release notes draft Bug Fix: corrected invalid Content-Type for image upload endpoints ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-5966]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-5966?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --------- Co-authored-by: alex-gaiduchok <59202839+alex-gaiduchok@users.noreply.github.com> --- reference/catalog/brands_catalog.v3.yml | 2 -- reference/catalog/categories_catalog.v3.yml | 2 -- reference/catalog/product-modifiers_catalog.v3.yml | 2 -- reference/catalog/product-variants_catalog.v3.yml | 2 -- reference/catalog/products_catalog.v3.yml | 4 +--- 5 files changed, 1 insertion(+), 11 deletions(-) diff --git a/reference/catalog/brands_catalog.v3.yml b/reference/catalog/brands_catalog.v3.yml index 6c45fafb0..ca14a8957 100644 --- a/reference/catalog/brands_catalog.v3.yml +++ b/reference/catalog/brands_catalog.v3.yml @@ -1320,8 +1320,6 @@ paths: Only one image at a time can be created. To update a brand image, use the [Update a brand](/docs/rest-catalog/brands#update-a-brand) endpoint and an `image_url`. operationId: createBrandImage - parameters: - - $ref: '#/components/parameters/ContentType' requestBody: content: multipart/form-data: diff --git a/reference/catalog/categories_catalog.v3.yml b/reference/catalog/categories_catalog.v3.yml index f740e3c1d..8b4bdbd3e 100644 --- a/reference/catalog/categories_catalog.v3.yml +++ b/reference/catalog/categories_catalog.v3.yml @@ -1297,8 +1297,6 @@ paths: Limit image size to `8MB`. To update a *Category Image*, use the [Update categories](/docs/rest-catalog/category-trees/categories#update-categories) endpoint and an `image_url`. operationId: createCategoryImage - parameters: - - $ref: '#/components/parameters/ContentType' requestBody: content: multipart/form-data: diff --git a/reference/catalog/product-modifiers_catalog.v3.yml b/reference/catalog/product-modifiers_catalog.v3.yml index 62dbcc624..bacba51f8 100644 --- a/reference/catalog/product-modifiers_catalog.v3.yml +++ b/reference/catalog/product-modifiers_catalog.v3.yml @@ -1623,8 +1623,6 @@ paths: **Required Fields** - image_file: Form posts are the only accepted upload option. operationId: createProductModifierImage - parameters: - - $ref: '#/components/parameters/ContentType' requestBody: content: multipart/form-data: diff --git a/reference/catalog/product-variants_catalog.v3.yml b/reference/catalog/product-variants_catalog.v3.yml index 401a9090a..87f2e7db9 100644 --- a/reference/catalog/product-variants_catalog.v3.yml +++ b/reference/catalog/product-variants_catalog.v3.yml @@ -886,8 +886,6 @@ paths: - image_file: Form posts. Files larger than 1 MB are not accepted - image_url: Any publicly available URL operationId: createProductVariantImage - parameters: - - $ref: '#/components/parameters/ContentType' requestBody: content: application/json: diff --git a/reference/catalog/products_catalog.v3.yml b/reference/catalog/products_catalog.v3.yml index 588b59de4..437bf2ccf 100644 --- a/reference/catalog/products_catalog.v3.yml +++ b/reference/catalog/products_catalog.v3.yml @@ -1277,13 +1277,11 @@ paths: **Usage Notes** - `image_url` - `255` character limit - - For file uploads, use the `multipart/form-data` media type. See [Adding product images](/docs/store-operations/catalog#adding-product-images) for more information. + - `Content-Type` - For `image_file`, use the `multipart/form-data` media type. For `image_url`, use the `application/json` type. See [Adding product images](/docs/store-operations/catalog#adding-product-images) for more information. - You can create only one image at a time. A product can have up to 1000 images. - Supported image file types are BMP, GIF, JPEG, PNG, WBMP, XBM, and WEBP. - Each image file or image uploaded by URL can be up to 8 MB. operationId: createProductImage - parameters: - - $ref: '#/components/parameters/ContentType' requestBody: content: application/json: From ba8e12553f7415739fb7fdfe51575893b653b71f Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 12 Sep 2024 11:29:14 -0500 Subject: [PATCH 208/221] DEVDOCS-6025 [update]: Storefront Checkouts, update response schema (#468) --- reference/checkouts.sf.yml | 3702 ++++++++---------------------------- 1 file changed, 792 insertions(+), 2910 deletions(-) diff --git a/reference/checkouts.sf.yml b/reference/checkouts.sf.yml index 8a279b218..7a7db2c88 100644 --- a/reference/checkouts.sf.yml +++ b/reference/checkouts.sf.yml @@ -55,117 +55,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/checkouts_Resp' - example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/schemas/checkout_Full' + example: + $ref: '#/components/examples/CheckoutResp' '400': description: When a problem arises, returns a generic response. content: @@ -224,117 +116,9 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/checkouts_Resp' - example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/schemas/checkout_Full' + example: + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body @@ -375,115 +159,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' x-codegen-request-body-name: body delete: tags: @@ -505,220 +181,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - cart: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - customerId: 11 - email: janedoe@example.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: false - baseAmount: 119.93 - discountAmount: 0 - cartAmount: 112.93 - coupons: - - id: 1 - code: S2549JM0Y - displayName: $5.00 off the order total - couponType: per_total_discount - discountedAmount: 5 - discounts: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - discountedAmount: 2.59 - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - discountedAmount: 1.06 - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - discountedAmount: 2.12 - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - discountedAmount: 0.8 - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - discountedAmount: 0.43 - lineItems: - physicalItems: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - parentId: '' - variantId: 364 - productId: 184 - sku: SMA-RED - name: Canvas Laundry Cart - url: 'https://{store_domain}/all/canvas-laundry-cart/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 0.59 - - id: 2 - discountedAmount: 2 - discountAmount: 2 - couponAmount: 0 - originalPrice: 17.99 - listPrice: 15.99 - salePrice: 13.99 - extendedListPrice: 15.99 - extendedSalePrice: 13.99 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - parentId: '' - variantId: 341 - productId: 170 - sku: '' - name: Ceramic Measuring Spoons - url: 'https://{store_domain}/all/ceramic-measuring-spoons/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/170/images/411/measuringsquares2_1024x1024__07108__95421.1534344522.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 1.06 - discountAmount: 0 - couponAmount: 0 - originalPrice: 25 - listPrice: 25 - salePrice: 25 - extendedListPrice: 25 - extendedSalePrice: 25 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - parentId: '' - variantId: 376 - productId: 158 - sku: SKU-A0C8A203 - name: Chambray Towel - url: 'https://{store_domain}/all/chambray-towel/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/158/images/382/foglinenbeigestripetowel1b_1024x1024__83011__60806.1534344511.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 2.12 - discountAmount: 0 - couponAmount: 0 - originalPrice: 49.99 - listPrice: 49.99 - salePrice: 49.99 - extendedListPrice: 49.99 - extendedSalePrice: 49.99 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - parentId: '' - variantId: 360 - productId: 189 - name: Gather Journal Issue 7 - Digital - url: 'https://{store_domain}/all/gather-journal-issue-7/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/189/images/465/gather_1024x1024__17195__82620.1534344540.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 0.8 - discountAmount: 0 - couponAmount: 0 - originalPrice: 18.95 - listPrice: 18.95 - salePrice: 18.95 - extendedListPrice: 18.95 - extendedSalePrice: 18.95 - isShippingRequired: false - type: digital - giftCertificates: - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - name: $10.00 Gift Certificate - theme: Celebration - amount: 10 - taxable: false - sender: - name: Jane Doe - email: janedoe@example.com - recipient: - name: John Doe - email: johndoe@example.com - message: Thank you! - type: giftCertificate - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T16:59:45+00:00' - billingAddress: - id: 5ba11e4a10fb5 - firstName: Jane - lastName: Doe - email: janedoe@example.com - company: '' - address1: 123 Main Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: - - fieldId: field_25 - fieldValue: Leave in backyard - consignments: - - id: 5ba121929619b - shippingCost: 69.94 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 69791a88-85c9-4c19-8042-e537621e8a55 - - ba2c619d-e6b4-48c2-8809-d88e424ed450 - - c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - selectedShippingOption: - id: bb3c818f-17ce-46fe-9475-65933095da0d - type: shipping_upsready - description: UPS® (UPS Next Day Air®) - imageUrl: '' - cost: 69.94 - transitTime: 1 business day - address: - firstName: Jane - lastName: Doe - email: janedoe@example.com - company: '' - address1: 123 Main Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: - - fieldId: field_25 - fieldValue: Leave in backyard - orderId: null - shippingCostTotal: 69.94 - shippingCostBeforeDiscount: 69.94 - handlingCostTotal: 0 - taxTotal: 28.62 - coupons: - - id: 1 - code: S2549JM0Y - displayName: $5.00 off the order total - couponType: 2 - discountedAmount: 5 - taxes: - - name: Store Tax - amount: 28.62 - subtotal: 117.93 - grandTotal: 211.49 - giftCertificates: [] - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T16:59:45+00:00' - customerMessage: 'Thank you, BigCommerce' + $ref: '#/components/examples/CheckoutResp' '/checkouts/{checkoutId}/billing-address': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -756,115 +219,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '403': description: The email trying to be set for the guest is associated with an account. The customer must sign in. content: {} @@ -905,220 +260,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - cart: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - customerId: 11 - email: janedoe@example.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: false - baseAmount: 119.93 - discountAmount: 0 - cartAmount: 112.93 - coupons: - - id: 1 - code: S2549JM0Y - displayName: $5.00 off the order total - couponType: per_total_discount - discountedAmount: 5 - discounts: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - discountedAmount: 2.59 - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - discountedAmount: 1.06 - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - discountedAmount: 2.12 - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - discountedAmount: 0.8 - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - discountedAmount: 0.43 - lineItems: - physicalItems: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - parentId: '' - variantId: 364 - productId: 184 - sku: SMA-RED - name: Canvas Laundry Cart - url: 'https://{store_domain}/all/canvas-laundry-cart/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 0.59 - - id: 2 - discountedAmount: 2 - discountAmount: 2 - couponAmount: 0 - originalPrice: 17.99 - listPrice: 15.99 - salePrice: 13.99 - extendedListPrice: 15.99 - extendedSalePrice: 13.99 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - parentId: '' - variantId: 341 - productId: 170 - sku: '' - name: Ceramic Measuring Spoons - url: 'https://{store_domain}/all/ceramic-measuring-spoons/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/170/images/411/measuringsquares2_1024x1024__07108__95421.1534344522.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 1.06 - discountAmount: 0 - couponAmount: 0 - originalPrice: 25 - listPrice: 25 - salePrice: 25 - extendedListPrice: 25 - extendedSalePrice: 25 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - parentId: '' - variantId: 376 - productId: 158 - sku: SKU-A0C8A203 - name: Chambray Towel - url: 'https://{store_domain}/all/chambray-towel/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/158/images/382/foglinenbeigestripetowel1b_1024x1024__83011__60806.1534344511.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 2.12 - discountAmount: 0 - couponAmount: 0 - originalPrice: 49.99 - listPrice: 49.99 - salePrice: 49.99 - extendedListPrice: 49.99 - extendedSalePrice: 49.99 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - parentId: '' - variantId: 360 - productId: 189 - name: Gather Journal Issue 7 - Digital - url: 'https://{store_domain}/all/gather-journal-issue-7/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/189/images/465/gather_1024x1024__17195__82620.1534344540.330.500.jpg?c=2' - discounts: - - id: total-coupon - discountedAmount: 0.8 - discountAmount: 0 - couponAmount: 0 - originalPrice: 18.95 - listPrice: 18.95 - salePrice: 18.95 - extendedListPrice: 18.95 - extendedSalePrice: 18.95 - isShippingRequired: false - type: digital - giftCertificates: - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - name: $10.00 Gift Certificate - theme: Celebration - amount: 10 - taxable: false - sender: - name: Jane Doe - email: janedoe@example.com - recipient: - name: John Doe - email: johndoe@example.com - message: Thank you! - type: giftCertificate - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T16:59:45+00:00' - billingAddress: - id: 5ba11e4a10fb5 - firstName: Jane - lastName: Doe - email: janedoe@example.com - company: '' - address1: 123 Main Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: - - fieldId: field_25 - fieldValue: Leave in backyard - consignments: - - id: 5ba121929619b - shippingCost: 69.94 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 69791a88-85c9-4c19-8042-e537621e8a55 - - ba2c619d-e6b4-48c2-8809-d88e424ed450 - - c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - selectedShippingOption: - id: bb3c818f-17ce-46fe-9475-65933095da0d - type: shipping_upsready - description: UPS® (UPS Next Day Air®) - imageUrl: '' - cost: 69.94 - transitTime: 1 business day - address: - firstName: Jane - lastName: Doe - email: janedoe@example.com - company: '' - address1: 123 Main Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: - - fieldId: field_25 - fieldValue: Leave in backyard - orderId: null - shippingCostTotal: 69.94 - shippingCostBeforeDiscount: 69.94 - handlingCostTotal: 0 - taxTotal: 28.62 - coupons: - - id: 1 - code: S2549JM0Y - displayName: $5.00 off the order total - couponType: 2 - discountedAmount: 5 - taxes: - - name: Store Tax - amount: 28.62 - subtotal: 117.93 - grandTotal: 211.49 - giftCertificates: [] - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T16:59:45+00:00' - customerMessage: 'Thank you, BigCommerce' + $ref: '#/components/examples/CheckoutResp' '403': description: The email trying to be set for the guest is associated with an account. The customer must sign in. content: {} @@ -1186,116 +328,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@example.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - shouldSaveAddress: true - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/consignments/{consignmentId}': @@ -1354,116 +387,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - shouldSaveAddress: true - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body @@ -1492,115 +416,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/gift-certificates': @@ -1637,115 +453,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '404': description: Gift certificate code not found content: @@ -1823,115 +531,7 @@ paths: schema: $ref: '#/components/schemas/checkout_Full' example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 7.95 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' x-codegen-request-body-name: body @@ -1964,220 +564,8 @@ paths: application/json: schema: $ref: '#/components/schemas/checkout_Full' - example: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - cart: - id: b6fbd994-61a8-4f25-9167-6ec10489c448 - customerId: 11 - email: janedoe@example.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: false - baseAmount: 119.93 - discountAmount: 0 - cartAmount: 117.93 - coupons: [] - discounts: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - discountedAmount: 2 - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - discountedAmount: 0 - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - discountedAmount: 0 - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - discountedAmount: 0 - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - discountedAmount: 0 - lineItems: - physicalItems: - - id: 69791a88-85c9-4c19-8042-e537621e8a55 - variantId: 364 - productId: 184 - sku: SMA-RED - name: Canvas Laundry Cart - url: 'https://{store_domain}/all/canvas-laundry-cart/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.330.500.jpg?c=2' - discounts: - - id: 2 - discountedAmount: 2 - discountAmount: 2 - couponAmount: 0 - originalPrice: 17.99 - listPrice: 15.99 - salePrice: 13.99 - extendedListPrice: 15.99 - extendedSalePrice: 13.99 - isShippingRequired: true - addedByPromotion: false - - id: ba2c619d-e6b4-48c2-8809-d88e424ed450 - variantId: 341 - productId: 170 - sku: '' - name: Ceramic Measuring Spoons - url: 'https://{store_domain}/all/ceramic-measuring-spoons/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/170/images/411/measuringsquares2_1024x1024__07108__95421.1534344522.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 25 - listPrice: 25 - salePrice: 25 - extendedListPrice: 25 - extendedSalePrice: 25 - isShippingRequired: true - addedByPromotion: false - - id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - variantId: 376 - productId: 158 - sku: SKU-A0C8A203 - name: Chambray Towel - url: 'https://{store_domain}/all/chambray-towel/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/158/images/382/foglinenbeigestripetowel1b_1024x1024__83011__60806.1534344511.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 49.99 - listPrice: 49.99 - salePrice: 49.99 - extendedListPrice: 49.99 - extendedSalePrice: 49.99 - isShippingRequired: true - addedByPromotion: false - digitalItems: - - id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 - variantId: 360 - productId: 189 - name: Gather Journal Issue 7 - Digital - url: 'https://{store_domain}/all/gather-journal-issue-7/' - quantity: 1 - isTaxable: true - imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/189/images/465/gather_1024x1024__17195__82620.1534344540.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - originalPrice: 18.95 - listPrice: 18.95 - salePrice: 18.95 - extendedListPrice: 18.95 - extendedSalePrice: 18.95 - isShippingRequired: false - type: digital - giftCertificates: - - id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac - name: $10.00 Gift Certificate - theme: Celebration - amount: 10 - taxable: false - sender: - name: Jane Doe - email: janedoe@example.com - recipient: - name: John Doe - email: johndoe@example.com - message: Thank you! - type: giftCertificate - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T17:47:35+00:00' - billingAddress: - id: 5ba11e4a10fb5 - firstName: Jane - lastName: Doe - email: janedoe@example.com - address1: 123 Main Street - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: - - fieldId: field_25 - fieldValue: Leave in backyard - consignments: - - id: 5ba13935c977a - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - ba2c619d-e6b4-48c2-8809-d88e424ed450 - - c72d6651-978d-45e5-881b-c2bb5f7ff1d5 - selectedShippingOption: - id: 8458d845-a589-477c-a70d-977eed19e0d6 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Jane - lastName: Doe - email: '' - company: '' - address1: 123 Main Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: [] - - id: 5ba13995cf156 - shippingCost: 62.63 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 69791a88-85c9-4c19-8042-e537621e8a55 - selectedShippingOption: - id: 989cdc72-2eee-49d8-bc71-5d466f905fdc - type: shipping_upsready - description: UPS® (UPS Next Day Air®) - imageUrl: '' - cost: 62.63 - transitTime: 1 business day - address: - firstName: John - lastName: Doe - email: '' - company: '' - address1: 555 South Street - address2: '' - city: Austin - stateOrProvince: Texas - stateOrProvinceCode: TX - country: United States - countryCode: US - postalCode: '78751' - phone: '1234567890' - customFields: [] - shippingCostTotal: 70.63 - shippingCostBeforeDiscount: 70.63 - handlingCostTotal: 0 - taxTotal: 29.44 - coupons: [] - taxes: - - name: Store Tax - amount: 29.44 - subtotal: 117.93 - grandTotal: 218 - giftCertificates: [] - createdTime: '2018-09-18T15:48:26+00:00' - updatedTime: '2018-09-18T17:47:35+00:00' - customerMessage: '' - version: 1 + example: + $ref: '#/components/examples/CheckoutResp' '409': $ref: '#/components/responses/CartConflictErrorResponse' '/checkouts/{checkoutId}/store-credit': @@ -2204,7 +592,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/checkouts_Resp' + $ref: '#/components/schemas/checkout_Full' delete: tags: - Checkout Store Credit @@ -2223,8 +611,7 @@ paths: content: application/json: schema: - type: object - properties: {} + $ref: '#/components/schemas/checkout_Full' '/checkouts/{checkoutId}/spam-protection': parameters: - $ref: '#/components/parameters/CheckoutIdPath' @@ -2258,6 +645,298 @@ paths: deprecated: false x-codegen-request-body-name: body components: + examples: + CheckoutResp: + value: + billingAddress: + address1: 123 Main Street + address2: '' + city: Austin + company: '' + country: United States + countryCode: US + customFields: + - fieldId: field_25 + fieldValue: Leave in backyard + email: janedoe@example.com + firstName: Jane + id: 5ba11e4a10fb5 + lastName: Doe + phone: '1234567890' + postalCode: '78751' + stateOrProvince: Texas + stateOrProvinceCode: TX + cart: + baseAmount: 119.93 + cartAmount: 112.93 + createdTime: '2018-09-18T15:48:26+00:00' + coupons: + - id: 1 + code: S2549JM0Y + displayName: $5.00 off the order total + couponType: per_total_discount + discountedAmount: 5 + currency: + name: US Dollars + code: USD + symbol: $ + decimalPlaces: 2 + customerId: 11 + discountAmount: 0 + discounts: + - id: 1 + discountedAmount: 2.59 + - id: 2 + discountedAmount: 1.06 + - id: 3 + discountedAmount: 2.12 + - id: 4 + discountedAmount: 0.8 + - id: 5 + discountedAmount: 0.43 + email: janedoe@example.com + id: b6fbd994-61a8-4f25-9167-6ec10489c448 + isTaxIncluded: false + lineItems: + physicalItems: + - addedByPromotion: false + brand: OFS + categoryNames: ["Essentials", "Just arrived"] + comparisonPrice: 0 + couponAmount: 0 + discountAmount: 2 + discounts: + - id: 1 + discountedAmount: 0.59 + - id: 2 + discountedAmount: 2 + extendedComparisonPrice: 0 + extendedListPrice: 15.99 + extendedSalePrice: 13.99 + giftWrapping: {} + id: 69791a88-85c9-4c19-8042-e537621e8a55 + imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/184/images/445/naturalcanvascart2_1024x1024__92347__29648.1534344533.330.500.jpg?c=2' + isShippingRequired: true + isTaxable: true + listPrice: 15.99 + name: Canvas Laundry Cart + options: + - name: "Color" + nameId: 1 + value: "Red" + valueId: "2" + originalPrice: 17.99 + productId: 184 + parentId: '' + quantity: 1 + variantId: 364 + salePrice: 13.99 + sku: SMA-RED + url: 'https://{store_domain}/all/canvas-laundry-cart/' + - addedByPromotion: false + brand: OFS + categoryNames: ["Essentials", "Just arrived"] + comparisonPrice: 0 + extendedComparisonPrice: 0 + extendedListPrice: 25 + extendedSalePrice: 25 + couponAmount: 0 + discountAmount: 0 + discounts: + - id: 1 + discountedAmount: 1.06 + id: ba2c619d-e6b4-48c2-8809-d88e424ed450 + imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/170/images/411/measuringsquares2_1024x1024__07108__95421.1534344522.330.500.jpg?c=2' + isShippingRequired: true + isTaxable: true + listPrice: 25 + name: Ceramic Measuring Spoons + originalPrice: 25 + parentId: '' + productId: 170 + quantity: 1 + salePrice: 25 + sku: '' + url: 'https://{store_domain}/all/ceramic-measuring-spoons/' + variantId: 341 + options: + - name: "Color" + nameId: 1 + value: "Red" + valueId: "2" + giftWrapping: {} + - addedByPromotion: false + brand: OFS + categoryNames: ["Essentials", "Just arrived"] + comparisonPrice: 0 + couponAmount: 0 + discountAmount: 0 + discounts: + - id: 1 + discountedAmount: 2.12 + extendedComparisonPrice: 0 + extendedListPrice: 49.99 + extendedSalePrice: 49.99 + giftWrapping: {} + id: c72d6651-978d-45e5-881b-c2bb5f7ff1d5 + imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/158/images/382/foglinenbeigestripetowel1b_1024x1024__83011__60806.1534344511.330.500.jpg?c=2' + isShippingRequired: true + isTaxable: true + listPrice: 49.99 + name: Chambray Towel + options: + - name: "Color" + nameId: 1 + value: "Red" + valueId: "2" + originalPrice: 49.99 + parentId: '' + productId: 158 + salePrice: 49.99 + sku: SKU-A0C8A203 + quantity: 1 + url: 'https://{store_domain}/all/chambray-towel/' + variantId: 376 + digitalItems: + - addedByPromotion: false + brand: OFS + categoryNames: ["Essentials", "Just arrived"] + comparisonPrice: 0 + couponAmount: 0 + discountAmount: 0 + discounts: + - id: 1 + discountedAmount: 0.8 + extendedComparisonPrice: 0 + extendedListPrice: 18.95 + extendedSalePrice: 18.95 + id: 6477a4a1-02cf-4287-8bf2-fd043bdd5234 + imageUrl: 'https://cdn8.bigcommerce.com/s-id30h7ohwf/products/189/images/465/gather_1024x1024__17195__82620.1534344540.330.500.jpg?c=2' + isShippingRequired: false + isTaxable: true + listPrice: 18.95 + name: Gather Journal Issue 7 - Digital + options: + - name: "Color" + nameId: 1 + value: "Red" + valueId: "2" + originalPrice: 18.95 + parentId: '' + productId: 189 + quantity: 1 + salePrice: 18.95 + type: digital + variantId: 360 + url: 'https://{store_domain}/all/gather-journal-issue-7/' + giftCertificates: + - amount: 10 + id: 871f1f56-4c88-43c3-a6e5-0a647d83d6ac + message: Thank you! + name: $10.00 Gift Certificate + recipient: + name: John Doe + email: johndoe@example.com + sender: + name: Jane Doe + email: janedoe@example.com + taxable: false + theme: Celebration + type: giftCertificate + customItems: [] + locale: "en" + updatedTime: '2018-09-18T16:59:45+00:00' + version: 1 + channelId: 1 + createdTime: '2018-09-18T15:48:26+00:00' + consignments: + - address: + address1: 123 Main Street + address2: '' + city: Austin + company: '' + country: United States + countryCode: US + customFields: + - fieldId: field_25 + fieldValue: Leave in backyard + email: janedoe@example.com + firstName: Jane + lastName: Doe + phone: '1234567890' + postalCode: '78751' + stateOrProvince: Texas + stateOrProvinceCode: TX + availableShippingOptions: + - additionalDescription: Fragile items + cost: 8 + description: Ship by Weight + id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 + imageUrl: '' + transitTime: '' + type: shipping_byweight + couponDiscounts: [] + discounts: [] + handlingCost: 0 + id: 5ba121929619b + lineItemIds: + - 69791a88-85c9-4c19-8042-e537621e8a55 + - ba2c619d-e6b4-48c2-8809-d88e424ed450 + - c72d6651-978d-45e5-881b-c2bb5f7ff1d5 + selectedShippingOption: + additionalDescription: Fragile items + id: bb3c818f-17ce-46fe-9475-65933095da0d + type: shipping_upsready + description: UPS® (UPS Next Day Air®) + imageUrl: '' + cost: 69.94 + transitTime: 1 business day + shippingCost: 69.94 + coupons: + - code: S2549JM0Y + couponType: 2 + discountedAmount: 5 + displayName: $5.00 off the order total + id: 1 + customer: + addresses: [{}] + customerGroup: + id: 1 + name: Wholesale customers + email: "string" + firstName: "string" + fullName: "string" + id: 1 + isGuest: false + lastName: "string" + shouldEncourageSignIn: false + storeCredit: 1.00 + customerMessage: 'Thank you, BigCommerce' + giftCertificates: + - balance: 4.00 + code: '1234ABC' + purchaseDate: "string" + remaining: 2.00 + used: 5.00 + giftWrappingCostTotal: 0 + grandTotal: 211.49 + handlingCostTotal: 0 + id: b6fbd994-61a8-4f25-9167-6ec10489c448 + isStoreCreditApplied: false + orderId: null + outstandingBalance: 0 + payments: [{}] + promotions: [] + shippingCostBeforeDiscount: 69.94 + shippingCostTotal: 69.94 + shouldExecuteSpamCheck: false + subtotal: 117.93 + taxTotal: 28.62 + taxes: + - name: Store Tax + amount: 28.62 + updatedTime: '2018-09-18T16:59:45+00:00' + version: 1 schemas: SpamProtectionRequest: title: SpamProtectionRequest @@ -2265,19 +944,17 @@ components: properties: token: type: string - x-internal: false checkout_Full: title: checkout_Full type: object properties: - id: - type: string - description: '' - format: uuid - cart: - $ref: '#/components/schemas/checkoutCart' billingAddress: $ref: '#/components/schemas/address_Base' + cart: + $ref: '#/components/schemas/checkoutCart' + channelId: + type: integer + description: Channel ID. consignments: type: array description: '' @@ -2288,65 +965,116 @@ components: description: Coupons applied at the checkout level. items: $ref: '#/components/schemas/CheckoutCoupon' - orderId: + createdTime: type: string - description: '' - nullable: true - shippingCostTotal: - type: number - description: Shipping cost before any discounts are applied. - format: float + description: Time when the cart was created. + customer: + $ref: '#/components/schemas/Customer' + customerMessage: + type: string + description: Shopperʼs message provided as details for the order to be created from this cart + giftCertificates: + type: array + description: Applied gift certificate (as a payment method). + items: + $ref: '#/components/schemas/checkoutGiftCertificates' giftWrappingCostTotal: type: number description: Gift wrapping cost for all items, including or excluding tax. + grandTotal: + type: number + description: The total payable amount, before applying any store credit or gift certificate. + format: float handlingCostTotal: type: number description: Handling cost for all consignments including or excluding tax. format: float - taxTotal: - type: number + id: + type: string description: '' - format: float - taxes: + format: uuid + isStoreCreditApplied: + type: boolean + description: | + `true` value indicates StoreCredit has been applied. + orderId: + type: string + description: '' + nullable: true + outstandingBalance: + type: number + description: | + `grandTotal` subtract the store-credit amount + payments: type: array items: - $ref: '#/components/schemas/checkoutTax' - subtotal: + type: object + properties: + providerId: + description: Payment provider ID. + type: string + gatewayId: + description: Payment gateway ID. + type: string + nullable: true + providerType: + description: Type of payment provider. + type: string + enum: + - PAYMENT_TYPE_HOSTED + detail: + type: array + description: Details regarding which checkout steps a shopper has completed. + items: + type: string + enum: + - FINALIZE + - INITIALIZE + - ACKNOWLEDGE + promotions: + type: array + items: + type: object + properties: + type: + type: string + enum: + - promotion + - upsell + - eligible + - applied + text: + type: string + description: Text displayed on the storefront for the promotion. + shippingCostBeforeDiscount: type: number - description: Subtotal of the checkout before applying item-level discounts. Tax inclusive based on the store settings. + description: The shipping cost before discounts are applied. + shippingCostTotal: + type: number + description: Shipping cost before any discounts are applied. format: float - grandTotal: + shouldExecuteSpamCheck: + type: boolean + subtotal: type: number - description: The total payable amount, before applying any store credit or gift certificate. + description: Subtotal of the checkout before applying item-level discounts. Tax inclusive based on the store settings. format: float - giftCertificates: + taxes: type: array - description: Applied gift certificate (as a payment method). items: - $ref: '#/components/schemas/checkoutGiftCertificates' - createdTime: - type: string - description: Time when the cart was created. + $ref: '#/components/schemas/checkoutTax' + taxTotal: + type: number + description: '' + format: float updatedTime: type: string description: Time when the cart was last updated. - customerMessage: - type: string - description: Shopperʼs message provided as details for the order to be created from this cart - outstandingBalance: - type: number - description: | - `grandTotal` subtract the store-credit amount - isStoreCreditApplied: - type: boolean - description: | - `true` value indicates StoreCredit has been applied. version: type: integer description: The current version of the checkout increments with each successful update. You can use it to enable optimistic concurrency control for subsequent updates. example: 1 description: '' - x-internal: false CartCoupon: title: Cart Coupon required: @@ -2376,7 +1104,6 @@ components: type: number description: The discounted amount applied within a given context. format: double - x-internal: false CheckoutCoupon: title: Checkout Coupon required: @@ -2407,7 +1134,91 @@ components: type: number description: The discounted amount applied within a given context. format: double - x-internal: false + Customer: + type: object + description: Customer details. + properties: + addresses: + type: array + items: + type: object + properties: + id: + type: integer + description: '' + firstName: + type: string + description: '' + lastName: + type: string + description: '' + company: + type: string + description: '' + address1: + type: string + description: '' + address2: + type: string + description: '' + city: + type: string + description: '' + stateOrProvince: + type: string + description: State or province. + stateOrProvinceCode: + type: string + description: '' + countryCode: + type: string + description: '[ISO 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) for the country.' + postalCode: + type: string + description: '' + phone: + pattern: '^\+?[1-9]\d{1,14}(x\d{1-5})?$' + type: string + description: '' + type: + type: string + description: 'Address type.' + customFields: + type: array + items: + $ref: '#/components/schemas/customFields' + customerGroup: + type: object + properties: + id: + type: integer + description: ID of the customer group. + name: + type: string + description: Name of the customer group. + email: + type: string + description: Customer email. + firstName: + type: string + description: Customer's first name. + fullName: + type: string + description: Customer's full name. + id: + type: integer + description: Customer ID. + isGuest: + type: boolean + description: Whether the shopper is a guest or a logged-in customer. + lastName: + type: string + description: Customer's last name. + shouldEncourageSignIn: + type: boolean + storeCredit: + type: number + description: The amount of store credit a customer has. contactEntity: title: contactEntity type: object @@ -2419,7 +1230,6 @@ components: type: string description: '' description: Model for sender and receiver objects. - x-internal: false address_Full: title: address_Full description: '' @@ -2433,32 +1243,41 @@ components: shouldSaveAddress: type: boolean description: Indicates whether we should add this address to the customer address book. - x-internal: false address_Base: title: address_Base required: - countryCode type: object properties: - firstName: + address1: type: string description: '' - lastName: + address2: type: string description: '' - email: + city: type: string description: '' company: type: string description: '' - address1: + country: + type: string + description: Country name. + countryCode: + type: string + description: 'ISO 3166-1 alpha-2 country code. (See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)' + customFields: + type: array + items: + $ref: '#/components/schemas/customFields' + email: type: string description: '' - address2: + firstName: type: string description: '' - city: + lastName: type: string description: '' stateOrProvince: @@ -2467,21 +1286,13 @@ components: stateOrProvinceCode: type: string description: '' - countryCode: - type: string - description: 'ISO 3166-1 alpha-2 country code. (See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)' - postalCode: - type: string - description: '' phone: pattern: '^\+?[1-9]\d{1,14}(x\d{1-5})?$' type: string description: '' - customFields: - type: array - items: - $ref: '#/components/schemas/customFields' - x-internal: false + postalCode: + type: string + description: '' customFields: title: customFields type: object @@ -2492,7 +1303,6 @@ components: type: string description: This can also be an array for fields that need to support list of values; for example, a set of checkboxes. When doing a PUT or POST to the `fieldValue` with a pick list, the input must be a number. The response will be a string. description: 'When doing a PUT or POST to the `fieldValue` with a pick list, the input must be a number. The response will be a string.' - x-internal: false BillingAddressRequest: title: Billing address request allOf: @@ -2503,27 +1313,50 @@ components: type: integer description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 - x-internal: false consignment_Full: title: consignment_Full type: object properties: - id: - type: string - description: '' - shippingAddress: - type: object - properties: {} - x-deprecated: true address: $ref: '#/components/schemas/address_Full' - selectedPickupOption: - $ref: '#/components/schemas/PickupOption' availableShippingOptions: type: array description: 'This is available only when "include=consignments.availableShippingOptions" is present in the URL.' items: $ref: '#/components/schemas/consignmentAvailableShippingOptions' + couponDiscounts: + type: array + description: List of consignment discounts applied through coupons. + items: + title: Consignment Coupon Discount + type: object + properties: + amount: + type: number + description: '' + format: double + code: + type: string + description: Coupon code that applied this discount. + discounts: + type: array + description: List of consignment discounts applied through cart level discounts. + items: + title: Consignment Discount + type: object + properties: + id: + type: string + description: Discount rule ID that applied this discount. + handlingCost: + type: number + description: The handling cost of shipping for this consignment. + format: double + id: + type: string + description: '' + selectedPickupOption: + $ref: '#/components/schemas/PickupOption' selectedShippingOption: title: Selected Shipping Option type: object @@ -2552,45 +1385,21 @@ components: type: string description: Read only. Field used for Shipping Provider API. readOnly: true - couponDiscounts: - type: array - description: List of consignment discounts applied through coupons. - items: - title: Consignment Coupon Discount - type: object - properties: - code: - type: string - description: Coupon code that applied this discount. - amount: - type: number - description: '' - format: double - discounts: - type: array - description: List of consignment discounts applied through cart level discounts. - items: - title: Consignment Discount - type: object - properties: - id: - type: string - description: Discount rule ID that applied this discount. + shippingAddress: + type: object + properties: {} + deprecated: true + description: Use the `address` field instead. shippingCost: type: number description: The shipping cost for this consignment. format: double - handlingCost: - type: number - description: The handling cost of shipping for this consignment. - format: double lineItemIds: type: array description: '' items: type: string description: This allows us to have multiple shipping addresses. Where there is only one shipping address, this array will contain only one value, with all the items. - x-internal: false consignmentAvailableShippingOptions: title: consignmentAvailableShippingOptions allOf: @@ -2602,7 +1411,6 @@ components: description: Is this shipping method the recommended shipping option or not. additionalDescription: type: string - x-internal: false checkoutTax: title: checkoutTax type: object @@ -2614,7 +1422,6 @@ components: type: number description: '' format: double - x-internal: false checkout_Put: title: checkout_Put type: object @@ -2626,741 +1433,6 @@ components: type: integer description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 - x-internal: false - checkouts_Resp: - title: checkouts_Resp - type: object - properties: - data: - title: Checkout - type: object - properties: - id: - type: string - description: '' - format: uuid - cart: - title: Cart - type: object - properties: - id: - type: string - description: Cart ID, provided after creating a cart with a POST. - format: uuid - customer_id: - type: integer - description: ID of the customer to which the cart belongs. - format: int32 - email: - type: string - description: The cartʼs email. This is the same email that is used in the billing address - currency: - title: Currency - type: object - properties: - name: - type: string - description: The currency name. - code: - type: string - description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' - symbol: - type: string - description: The currency symbol. - decimalPlaces: - type: number - description: The number of decimal places for the currency. For example, the USD currency has two decimal places. - format: double - description: The currency in which prices are displayed (the store default currency). - istaxIncluded: - type: boolean - description: Boolean representing whether tax information is included. - baseAmount: - type: number - description: The cost of the cart’s contents, before applying discounts. - format: double - discountAmount: - type: number - description: Order-based discounted amount only - Excludes coupon discounts and product-based discounts. - format: double - cartAmount: - type: number - description: Sum of line-items amounts, minus cart-level discounts and coupons. This amount includes taxes, where applicable. - format: double - coupons: - type: array - description: '' - items: - title: Applied Coupon - required: - - code - type: object - properties: - id: - type: string - description: The coupon ID. - code: - type: string - description: the coupon code - displayName: - type: string - description: The coupon title based on different types provided in control panel section. - couponType: - type: string - description: Key name to identify the type of coupon. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discounts: - type: array - description: '' - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - lineItems: - type: object - description: '' - title: Line Items - required: - - digitalItems - - physicalItems - properties: - physicalItems: - type: array - description: '' - items: - title: Item Physical - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: The product is part of a bundle, such as a product pick list, then the parentId or the main product ID will populate. - variantId: - type: integer - description: ID of the variant. - productId: - type: integer - description: ID of the product. - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: A list of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - brand: - type: string - description: The product's brand. - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - originalPrice: - type: number - description: The item’s original price is the same as the product’s default price. - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. (The final price before tax calculation.) - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - type: - type: string - description: the product type - physical or digital - addedByPromotion: - type: boolean - description: If the item was added automatically by a promotion, such as a coupon or buy one, get one. - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - isMutable: - type: boolean - description: '' - giftWrapping: - title: Gift Wrapping - type: object - properties: - name: - type: string - description: '' - message: - type: string - description: '' - amount: - type: number - description: '' - format: double - digitalItems: - type: array - description: '' - items: - title: Item Digital - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: Bundled items will have their parentʼs item ID. - variantId: - type: number - description: ID of the variant. - format: double - productId: - type: number - description: ID of the product. - format: double - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - brand: - type: string - description: The itemʼs brand. - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: List of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - originalPrice: - type: number - description: The item’s original price is the same as the product’s default price. - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. (The final price before tax calculation.) - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - type: - type: string - description: the product type - physical or digital - isMutable: - type: boolean - description: '' - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - downloadFileUrls: - type: array - description: URLs to download all product files. - items: - type: string - downloadPageUrl: - type: string - description: The URL for the combined downloads page. - downloadSize: - type: string - description: 'Specifies the combined download size in human-readable style; for example, `30MB`.' - giftCertificate: - type: array - description: '' - items: - title: Item Gift Certificate - required: - - amount - - recipient - - sender - - theme - type: object - properties: - id: - type: string - description: Gift certificate identifier - name: - type: string - description: 'The name of the purchased gift certificate; for example, `$20 Gift Certificate`.' - theme: - type: string - description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' - amount: - type: number - description: 'Value must be between $1.00 and $1,000.00.' - format: double - taxable: - type: boolean - description: '' - sender: - title: Contact Entity - type: object - properties: - name: - type: string - description: '' - email: - type: string - description: '' - recipient: - title: Contact Entity - type: object - properties: - name: - type: string - description: '' - email: - type: string - description: '' - message: - type: string - description: Limited to 200 characters. - type: - type: string - description: Explicitly specifying the gift certificate type. - customItems: - type: array - items: - title: Item Custom - type: object - properties: - id: - type: string - description: ID of the custom item - sku: - type: string - description: Custom item SKU - name: - type: string - description: Item name - quantity: - type: string - listPrice: - type: string - description: Price of the item. With or without tax depending on your store setup. - description: |- - Add a custom item to the shoppers cart. - * Custom items are not added to the catalog. - * The price should be set to match the store settings for taxes. - createdTime: - type: string - description: Time when the cart was created. - updatedTime: - type: string - description: Time when the cart was last updated. - description: A cart contains a collection of items, prices, discounts, etc. It does not contain customer-related data. - billingAddress: - title: Address Response - allOf: - - title: Address Properties - required: - - countryCode - type: object - properties: - firstName: - type: string - description: '' - lastName: - type: string - description: '' - email: - type: string - description: '' - company: - type: string - description: '' - address1: - type: string - description: '' - address2: - type: string - description: '' - city: - type: string - description: '' - stateOrProvince: - type: string - description: Represents state or province. - stateOrProvinceCode: - type: string - description: '' - countryCode: - type: string - description: 'ISO 3166-1 alpha-2 country code. (See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)' - postalCode: - type: string - description: '' - phone: - pattern: '^\+?[1-9]\d{1,14}(x\d{1-5})?$' - type: string - description: '' - customFields: - type: array - description: '' - items: - title: CustomField - type: object - properties: - fieldId: - type: string - description: '' - fieldValue: - type: string - description: This can also be an array for fields that need to support list of values; for example, a set of checkboxes. - - type: object - properties: - id: - type: string - description: '' - consignments: - type: array - description: This allows you to have multiple shipping addresses per checkout. Where there is only one shipping address, this array will contain only one value, with all the items. - items: - title: Consignment - type: object - properties: - id: - type: string - description: '' - shippingAddress: - type: object - properties: {} - x-deprecated: true - address: - title: Address Response - allOf: - - title: Address Properties - required: - - countryCode - type: object - properties: - firstName: - type: string - description: '' - lastName: - type: string - description: '' - email: - type: string - description: '' - company: - type: string - description: '' - address1: - type: string - description: '' - address2: - type: string - description: '' - city: - type: string - description: '' - stateOrProvince: - type: string - description: Represents state or province. - stateOrProvinceCode: - type: string - description: '' - countryCode: - type: string - description: 'ISO 3166-1 alpha-2 country code. (See: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)' - postalCode: - type: string - description: '' - phone: - pattern: '^\+?[1-9]\d{1,14}(x\d{1-5})?$' - type: string - description: '' - customFields: - type: array - description: '' - items: - title: CustomField - type: object - properties: - fieldId: - type: string - description: '' - fieldValue: - type: string - description: This can also be an array for fields that need to support list of values; for example, a set of checkboxes. - - type: object - properties: - id: - type: string - description: '' - availableShippingOptions: - type: array - description: This is available only when "include=consignments.availableShippingOptions" is presented in the URL. - items: - title: Shipping Option Entity - allOf: - - title: Selected Shipping Option - type: object - properties: - description: - type: string - description: Read only. - readOnly: true - id: - type: string - description: '' - type: - type: string - description: 'Specified the type of shipping option. Flat rate, UPS, etc.,' - imageUrl: - type: string - description: '' - cost: - type: number - description: '' - format: double - transitTime: - type: string - description: An estimate of the arrival time. - - type: object - properties: - isRecommended: - type: boolean - description: Is this shipping method the recommended shipping option or not. - selectedShippingOption: - title: Selected Shipping Option - type: object - properties: - description: - type: string - description: Read only. - readOnly: true - id: - type: string - description: '' - type: - type: string - description: Specifies the type of shipping option; for example, flat rate, UPS, etc. - imageUrl: - type: string - description: '' - cost: - type: number - description: '' - format: double - transitTime: - type: string - description: An estimate of the arrival time. - couponDiscounts: - type: array - description: List of consignment discounts applied through coupons - items: - title: Consignment Coupon Discount - type: object - properties: - code: - type: string - description: Coupon code that applied this discount - amount: - type: number - description: '' - format: double - discounts: - type: array - description: List of consignment discounts applied through cart level discounts. - items: - title: Consignment Discount - type: object - properties: - id: - type: string - description: Discount rule ID that applied this discount - shippingCost: - type: number - description: The shipping cost for this consignment. - format: double - handlingCost: - type: number - description: The handling cost of shipping for this consignment. - format: double - lineItemIds: - type: array - description: '' - items: - type: string - description: '' - coupons: - type: array - description: Coupons applied at checkout level. - items: - $ref: '#/components/schemas/CheckoutCoupon' - orderId: - type: string - description: '' - shippingCostTotal: - type: number - description: Shipping cost before any discounts are applied. - format: float - giftWrappingCostTotal: - type: number - description: Gift wrapping for all items, including or excluding tax. - handlingCostTotal: - type: number - description: Handling cost for all consignments including or excluding tax. - format: float - taxTotal: - type: number - description: '' - format: float - taxes: - type: array - items: - type: object - properties: - name: - type: string - description: Name of the tax charged. This is either the system default or the custom name created for the tax. - example: Texas Taxes - amount: - type: number - description: Amount of the tax. - format: float - example: 1.12 - subtotal: - type: number - description: Subtotal of the checkout before applying item-level discounts. Tax inclusive based on the store settings. - format: float - grandTotal: - type: number - description: The total payable amount, before applying any store credit or gift certificate. - format: float - giftCertificates: - type: array - description: Applied gift certificate (as a payment method). - items: - title: Gift Certificate - type: object - properties: - balance: - type: number - description: '' - format: double - code: - type: string - description: '' - purchaseDate: - type: string - description: '' - format: date - remaining: - type: number - description: '' - format: double - used: - type: number - description: '' - format: double - description: The values presented here are projections of how much we would be using out of an existing gift certificate. - createdTime: - type: string - description: Time when the cart was created. - updatedTime: - type: string - description: Time when the cart was last updated. - customerMessage: - type: string - description: Shopperʼs message provided as details for the order to be created from this cart. - outstandingBalance: - type: number - description: | - `grandTotal` subtract the store-credit amount - isStoreCreditApplied: - type: boolean - description: | - `true` value indicates StoreCredit has been applied. - x-internal: false cartLineItemPut: title: cartLineItemPut type: object @@ -3379,7 +1451,6 @@ components: format: double giftWrapping: $ref: '#/components/schemas/cartLineItemGiftWrapping_Put' - x-internal: false cartLineItemGiftCertificate_Put: title: cartLineItemGiftCertificate_Put required: @@ -3410,7 +1481,6 @@ components: type: number description: '' format: double - x-internal: false cartLineItemGiftWrapping_Put: title: Gift Wrapping Request Data required: @@ -3536,7 +1606,6 @@ components: type: integer description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 - x-internal: false DeleteCouponCodeRequest: title: Delete Coupon Request type: object @@ -3545,7 +1614,6 @@ components: type: integer description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 - x-internal: false DeleteConsignmentRequest: title: Delete Consignment Request type: object @@ -3554,7 +1622,6 @@ components: type: integer description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 - x-internal: false GiftCertificateRequest: title: Gift Certificate Request type: object @@ -3562,7 +1629,6 @@ components: giftCertificateCode: type: string description: '' - x-internal: false cart_Put: title: cart_Put type: object @@ -3571,7 +1637,6 @@ components: $ref: '#/components/schemas/cartLineItemPut' giftCertificate: $ref: '#/components/schemas/cartLineItemGiftCertificate_Put' - x-internal: false NewUpdateConsignment: title: Update Consignment Request type: object @@ -3665,60 +1730,52 @@ components: description: The cart version that you expect to apply the updates. If the provided version doesn't match the current cart version, you will receive a conflict error. This field is optional; if not provided, optimistic concurrency control will not apply. example: 1 description: One or more of these three fields is mandatory. You can update address and line items in one request. You have to update shipping option ID or pickup option ID in a separate request since changing the address or line items can invalidate the previously available shipping options. - x-internal: false checkoutCart: title: checkoutCart type: object properties: - id: - type: string - description: Cart ID, provided after creating a cart with a POST. - format: uuid - customer_id: - type: integer - description: ID of the customer to which the cart belongs. - format: int32 - email: + baseAmount: + type: number + description: Cost of cart’s contents, before applying discounts. + format: double + cartAmount: + type: number + description: Sum of line-items amounts, minus cart-level discounts and coupons. This amount includes taxes, where applicable. + format: double + createdTime: type: string - description: The cartʼs email. This is the same email that is used in the billing address. + description: Time when the cart was created. + coupons: + type: array + description: '' + items: + $ref: '#/components/schemas/CartCoupon' currency: title: Currency type: object properties: - name: - type: string - description: The currency name. code: type: string description: 'ISO-4217 currency code. (See: https://www.iso.org/iso-4217-currency-codes.html.)' - symbol: - type: string - description: The currency symbol. decimalPlaces: type: number description: The number of decimal places for the currency. For example, the USD currency has two decimal places. format: double + name: + type: string + description: The currency name. + symbol: + type: string + description: The currency symbol. description: The currency in which prices are displayed; the store default currency. - isTaxIncluded: - type: boolean - description: Boolean representing whether tax information is included. - baseAmount: - type: number - description: Cost of cart’s contents, before applying discounts. - format: double + customerId: + type: integer + description: ID of the customer to which the cart belongs. + format: int32 discountAmount: type: number - description: Discounted amount. + description: Order-based discounted amount only - Excludes coupon discounts and product-based discounts. format: double - cartAmount: - type: number - description: Sum of line-items amounts, minus cart-level discounts and coupons. This amount includes taxes, where applicable. - format: double - coupons: - type: array - description: '' - items: - $ref: '#/components/schemas/CartCoupon' discounts: type: array description: '' @@ -3726,13 +1783,23 @@ components: title: Applied Discount type: object properties: - name: - type: string - description: The name provided by the merchant. + id: + type: integer + description: Discount ID. discountedAmount: type: number description: The discounted amount applied within a given context. format: double + email: + type: string + description: The cartʼs email. This is the same email that is used in the billing address. + id: + type: string + description: Cart ID, provided after creating a cart with a POST. + format: uuid + isTaxIncluded: + type: boolean + description: Boolean representing whether tax information is included. lineItems: type: object description: '' @@ -3741,214 +1808,36 @@ components: - digitalItems - physicalItems properties: - physicalItems: + customItems: + type: array + items: + title: Item Custom + type: object + properties: + id: + type: string + description: ID of the custom item. + listPrice: + type: string + description: Price of the item. With or without tax depending on your store setup. + name: + type: string + description: Item name. + quantity: + type: string + sku: + type: string + description: Custom item SKU. + description: |- + Add a custom item to the shoppers cart. + * Custom items are not added to the catalog. + * The price should be set to match the store settings for taxes. + digitalItems: type: array description: '' items: - title: Item Physical - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: The product is part of a bundle such as a product pick list, then the parentId or the main product ID will populate. - variantId: - type: integer - description: ID of the variant. - productId: - type: integer - description: ID of the product. - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: A list of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. The final price before tax calculation. - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - comparisonPrice: - type: number - description: The itemʼs comparison price - extendedComparisonPrice: - type: number - description: The itemʼs comparison price multiplied by the quantity. - type: - type: string - description: the product type - physical or digital - addedByPromotion: - type: boolean - description: If the item was added automatically by a promotion, such as a coupon or buy one, get one. - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - isMutable: - type: boolean - description: '' - giftWrapping: - title: Gift Wrapping - type: object - properties: - name: - type: string - description: '' - message: - type: string - description: '' - amount: - type: number - description: '' - format: double - digitalItems: - type: array - description: '' - items: - title: Item Digital - required: - - quantity - type: object - properties: - id: - type: string - description: The line-item ID. - parentId: - type: string - description: Bundled items will have their parentʼs item ID. - variantId: - type: number - description: ID of the variant. - format: double - productId: - type: number - description: ID of the product. - format: double - sku: - type: string - description: SKU of the variant. - name: - type: string - description: The itemʼs product name. - url: - type: string - description: The product URL. - quantity: - type: number - description: Quantity of this item. - format: double - isTaxable: - type: boolean - description: Whether the item is taxable. - imageUrl: - type: string - description: A publicly-accessible URL for an image of this item. - discounts: - type: array - description: A list of discounts applied to this item, as an array of AppliedDiscount objects. - items: - title: Applied Discount - type: object - properties: - name: - type: string - description: The name provided by the merchant. - discountedAmount: - type: number - description: The discounted amount applied within a given context. - format: double - discountAmount: - type: number - description: The total value of all discounts applied to this item (excluding coupon). - format: double - couponAmount: - type: number - description: The total value of all coupons applied to this item. - format: double - listPrice: - type: number - description: The item’s list price, as quoted by the manufacturer or distributor. - format: double - salePrice: - type: number - description: The itemʼs price after all discounts are applied. The final price before tax calculation. - format: double - extendedListPrice: - type: number - description: The itemʼs list price multiplied by the quantity. - format: double - extendedSalePrice: - type: number - description: The itemʼs sale price multiplied by the quantity. - format: double - type: - type: string - description: The product type - physical or digital. - isShippingRequired: - type: boolean - description: Whether this item requires shipping to a physical address. - downloadFileUrls: - type: array - description: URLs to download all product files. - items: - type: string - downloadPageUrl: - type: string - description: The URL for the combined downloads page. - downloadSize: - type: string - description: 'Specifies the combined download size in human-readable style; for example, `30MB`.' - giftCertificate: + $ref: '#/components/schemas/lineItemPhysicalDigital' + giftCertificates: type: array description: '' items: @@ -3960,23 +1849,20 @@ components: - theme type: object properties: + amount: + type: number + description: 'Value must be between $1.00 and $1,000.00.' + format: double id: type: string description: Gift certificate identifier + message: + type: string + description: Limited to 200 characters. name: type: string description: 'The name of the purchased gift certificate; for example, `$20 Gift Certificate`.' - theme: - type: string - description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' - amount: - type: number - description: 'Value must be between $1.00 and $1,000.00.' - format: double - taxable: - type: boolean - description: '' - sender: + recipient: title: Contact Entity type: object properties: @@ -3986,7 +1872,7 @@ components: email: type: string description: '' - recipient: + sender: title: Contact Entity type: object properties: @@ -3996,77 +1882,193 @@ components: email: type: string description: '' - message: + taxable: + type: boolean + description: '' + theme: type: string - description: Limited to 200 characters. + description: 'Currently supports `Birthday`, `Boy`, `Celebration`, `Christmas`, `General`, and `Girl`.' type: type: string description: Explicitly specifying the gift certificate type. - customItems: - type: array - items: - title: Item Custom - type: object - properties: - id: - type: string - description: ID of the custom item. - sku: - type: string - description: Custom item SKU. - name: - type: string - description: Item name. - quantity: - type: string - listPrice: - type: string - description: Price of the item. With or without tax depending on your store setup. - description: |- - Add a custom item to the shoppers cart. - * Custom items are not added to the catalog. - * The price should be set to match the store settings for taxes. - createdTime: + physicalItems: + type: array + description: '' + items: + $ref: '#/components/schemas/lineItemPhysicalDigital' + locale: type: string - description: Time when the cart was created. + description: Shopper's locale. + example: "en" updatedTime: type: string description: Time when the cart was last updated. + version: + type: integer + description: Cart version. description: A cart contains a collection of items, prices, discounts, etc. It does not contain customer-related data. - x-internal: false + lineItemPhysicalDigital: + type: object + required: + - quantity + properties: + addedByPromotion: + type: boolean + description: If the item was added automatically by a promotion, such as a coupon or buy one, get one. + categoryNames: + type: array + items: + type: string + comparisonPrice: + type: number + description: The itemʼs comparison price + couponAmount: + type: number + description: The total value of all coupons applied to this item. + format: double + discounts: + type: array + description: A list of discounts applied to this item, as an array of AppliedDiscount objects. + items: + title: Applied Discount + type: object + properties: + id: + type: integer + description: Discount ID. + discountedAmount: + type: number + description: The discounted amount applied within a given context. + format: double + discountAmount: + type: number + description: The total value of all discounts applied to this item (excluding coupon). + format: double + extendedComparisonPrice: + type: number + description: The itemʼs comparison price multiplied by the quantity. + extendedListPrice: + type: number + description: The itemʼs list price multiplied by the quantity. + format: double + extendedSalePrice: + type: number + description: The itemʼs sale price multiplied by the quantity. + format: double + giftWrapping: + title: Gift Wrapping + type: object + properties: + name: + type: string + description: '' + message: + type: string + description: '' + amount: + type: number + description: '' + format: double + id: + type: string + description: The line-item ID. + imageUrl: + type: string + description: A publicly-accessible URL for an image of this item. + isMutable: + type: boolean + description: '' + isShippingRequired: + type: boolean + description: Whether this item requires shipping to a physical address. + isTaxable: + type: boolean + description: Whether the item is taxable. + listPrice: + type: number + description: The item’s list price, as quoted by the manufacturer or distributor. + format: double + name: + type: string + description: The itemʼs product name. + options: + type: array + items: + type: object + properties: + name: + type: string + description: Option name. + nameId: + type: integer + description: Option ID. + value: + type: string + description: Option value. + valueId: + type: string + description: Option value ID. + originalPrice: + type: number + description: The item’s original price is the same as the product’s default price. + parentId: + type: string + description: The product is part of a bundle such as a product pick list, then the parentId or the main product ID will populate. + productId: + type: integer + description: ID of the product. + sku: + type: string + description: SKU of the variant. + quantity: + type: number + description: Quantity of this item. + format: double + salePrice: + type: number + description: The itemʼs price after all discounts are applied. The final price before tax calculation. + format: double + type: + type: string + description: the product type - physical or digital + url: + type: string + description: The product URL. + variantId: + type: integer + description: ID of the variant. checkoutGiftCertificates: title: checkoutGiftCertificates - type: array description: Applied gift certificate (as a payment method). - items: - title: Gift Certificate - type: object - properties: - balance: - type: number - description: '' - format: double - code: - type: string - description: '' - purchaseDate: - type: string - description: '' - format: date - remaining: - type: number - description: '' - format: double - used: - type: number - description: '' - format: double - description: The values presented here are projections of how much we would be using out of an existent gift certificate - x-internal: false + type: object + properties: + balance: + type: number + description: '' + format: double + code: + type: string + description: '' + purchaseDate: + type: string + description: '' + format: date + remaining: + type: number + description: '' + format: double + used: + type: number + description: '' + format: double consignmentShippingOption_Base: title: consignmentShippingOption_Base type: object properties: + cost: + type: number + description: '' + format: double description: type: string description: Read only. @@ -4074,20 +2076,15 @@ components: id: type: string description: '' - type: - type: string - description: Specifies the type of shipping option; for example, flat rate, UPS, etc. imageUrl: type: string description: '' - cost: - type: number - description: '' - format: double transitTime: type: string description: An estimate of the arrival time. - x-internal: false + type: + type: string + description: Specifies the type of shipping option; for example, flat rate, UPS, etc. PickupOption: type: object title: Pickup Option @@ -4096,121 +2093,6 @@ components: pickupMethodId: type: integer responses: - Checkout: - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/checkout_Full' - example: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - cart: - id: 29eb9b44-8f33-4e4a-9429-d0e8e24641ed - customerId: 18 - email: dwaynecole@testing.com - currency: - name: US Dollars - code: USD - symbol: $ - decimalPlaces: 2 - isTaxIncluded: true - baseAmount: 7.95 - discountAmount: 0 - cartAmount: 7.95 - coupons: [] - discounts: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - discountedAmount: 0 - lineItems: - physicalItems: - - id: 243c9ca2-22b4-417a-8b09-b3fc05778b52 - parentId: '' - variantId: 345 - productId: 174 - sku: '' - name: 1L Le Parfait Jar - url: 'https://{store_domain}/all/1l-le-parfait-jar/' - quantity: 1 - brand: OFS - isTaxable: true - imageUrl: 'https://cdn11.bigcommerce.com/s-{store_hash}/products/174/images/425/leparfaitmedium3_1024x1024_1024x1024__37756__81924.1534344526.330.500.jpg?c=2' - discounts: [] - discountAmount: 0 - couponAmount: 0 - listPrice: 7.95 - salePrice: 7.95 - extendedListPrice: 7.95 - extendedSalePrice: 7.95 - isShippingRequired: true - giftWrapping: {} - addedByPromotion: false - digitalItems: [] - giftCertificates: [] - customItems: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - billingAddress: - id: 5c377ead301c2 - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - consignments: - - id: 5c377ead30ac1 - shippingCost: 8 - handlingCost: 0 - couponDiscounts: [] - discounts: [] - lineItemIds: - - 243c9ca2-22b4-417a-8b09-b3fc05778b52 - selectedShippingOption: - id: d09e05c0-3788-44df-a1bb-b6d3afdf6841 - type: shipping_byweight - description: Ship by Weight - imageUrl: '' - cost: 8 - transitTime: '' - address: - firstName: Dwayne - lastName: Cole - email: dwaynecole@testing.com - company: '' - address1: Mauna Kea Access Rd - address2: '' - city: Hilo - stateOrProvince: Hawaii - stateOrProvinceCode: HI - country: United States - countryCode: US - postalCode: '96720' - phone: '8081234567' - customFields: [] - orderId: null - shippingCostTotal: 8 - shippingCostBeforeDiscount: 8 - handlingCostTotal: 0 - taxTotal: 1.22 - coupons: [] - taxes: - - name: Tax - amount: 1.22 - subtotal: 7.95 - grandTotal: 15.95 - giftCertificates: [] - createdTime: '2019-01-10T17:18:00+00:00' - updatedTime: '2019-01-10T17:19:47+00:00' - customerMessage: '' - version: 1 CartConflictErrorResponse: description: 'Cart conflict' content: From c70906dbf965c68c84edae91daab8529345df162 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 12 Sep 2024 20:21:28 +0300 Subject: [PATCH 209/221] Issue-504 (#518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [Issue-504](https://github.com/bigcommerce/docs/issues/504) ## What changed? The requestor is correct. You can only create one webhook at a time so I moved this into Webhooks(Single). ## Release notes draft Bug Fix <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/webhooks.v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference/webhooks.v3.yml b/reference/webhooks.v3.yml index c20bb8f21..66b69c628 100644 --- a/reference/webhooks.v3.yml +++ b/reference/webhooks.v3.yml @@ -87,7 +87,7 @@ paths: schema: $ref: '#/components/schemas/webhook_Base' tags: - - Manage Webhooks (Bulk) + - Manage Webhooks (Single) get: responses: '200': From 9c6542e41d1d32f39f49dbc70380190540eaea4a Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Thu, 12 Sep 2024 13:04:06 -0500 Subject: [PATCH 210/221] [No Ticket]: MSF International Enhancements, improve links to overview page (#519) --- .../graphql-admin/product-attributes.mdx | 4 +++- .../graphql-admin/product-basic-info.mdx | 20 +++---------------- .../graphql-admin/product-custom-fields.mdx | 2 +- .../product-modifier-options.mdx | 4 +++- .../graphql-admin/product-seo-info.mdx | 4 +++- .../catalog/graphql-admin/product-url.mdx | 4 +++- .../graphql-admin/product-variant-options.mdx | 4 +++- .../msf-international-enhancements.mdx | 20 +++++++++++++++++++ 8 files changed, 39 insertions(+), 23 deletions(-) diff --git a/docs/store-operations/catalog/graphql-admin/product-attributes.mdx b/docs/store-operations/catalog/graphql-admin/product-attributes.mdx index 5930af82c..157a3e3be 100644 --- a/docs/store-operations/catalog/graphql-admin/product-attributes.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-attributes.mdx @@ -1,5 +1,7 @@ # Product Attributes +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -18,7 +20,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Pre-order settings diff --git a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx index 6cc4f1a35..3fcd4f0d2 100644 --- a/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-basic-info.mdx @@ -1,5 +1,7 @@ # Basic Product Information +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -17,23 +19,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. These ID fields contain global IDs that you can retrieve from REST API endpoints. - -For example, the `productId` field contains the global product ID. Retrieve the global product ID from the response body of the [Get all products](/docs/rest-catalog/products#get-all-products) endpoint. A product with a global ID of `111` has a `productId` of `"bc/store/product/111"`. - -The following table describes the ID fields that you can use in inputs for mutations: - -| Field in Input | Description | Global ID | Example | -| :--- | :--- | :--- | :--- | -| `productId` | Product ID | [Get all products](/docs/rest-catalog/products#get-all-products) | `"bc/store/product/111"` | -| `channelId` | Channel ID | [Get all channels](/docs/rest-management/channels#get-all-channels) | `"bc/store/channel/2"` | -| `optionId` | Variant option ID | [Get all product variant options](/docs/rest-catalog/product-variant-options#get-all-product-variant-options) | `"bc/store/productOption/108"` | -| | Shared variant option ID | Navigate to **Products <br /> >Product Options <br /> >_OptionName_** <br />in the control panel. <br /><br />Retrieve the global ID from the URL. | `"bc/store/sharedProductOption/1"` | -| `modifierId` | Modifier ID | [Get all product modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) | `"bc/store/productModifier/121"` | -| | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | -| `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | -| | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | -| `customFieldId` | ID for a product custom field | [Get product custom fields](/docs/rest-catalog/products/custom-fields#get-product-custom-fields) | `"bc/store/productCustomField/1"` | +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set basic product information at the global level diff --git a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx index 0051a4a68..641d66c87 100644 --- a/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-custom-fields.mdx @@ -22,7 +22,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set product custom fields diff --git a/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx b/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx index 6f359648e..914e724f0 100644 --- a/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-modifier-options.mdx @@ -1,5 +1,7 @@ # Product Modifier Options +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -19,7 +21,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set product modifier options diff --git a/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx b/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx index 8dfcbb438..c61d70b66 100644 --- a/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-seo-info.mdx @@ -1,5 +1,7 @@ # Product SEO Information +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -17,7 +19,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set product SEO information at the global level diff --git a/docs/store-operations/catalog/graphql-admin/product-url.mdx b/docs/store-operations/catalog/graphql-admin/product-url.mdx index ab4b42696..fb6fce10a 100644 --- a/docs/store-operations/catalog/graphql-admin/product-url.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-url.mdx @@ -1,5 +1,7 @@ # Product URL +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -17,7 +19,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set product URL at the global level diff --git a/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx b/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx index 5a7f5cff0..afec75a52 100644 --- a/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx +++ b/docs/store-operations/catalog/graphql-admin/product-variant-options.mdx @@ -1,5 +1,7 @@ # Product Variant Options +[_International Enhancements for Multi-Storefront_](/docs/store-operations/catalog/msf-international-enhancements) + <Callout type="info"> This feature is currently available for Enterprise stores and Partner Sandboxes. If the feature is not working as expected, please contact technical support, as the feature likely needs to be enabled for the individual store. To become an enterprise customer, contact your BigCommerce Customer Service Manager or our [support team](https://support.bigcommerce.com/s/contact?language=en_US). @@ -18,7 +20,7 @@ For a full schema, see the [GraphQL Admin API reference](https://developer.bigco ## Input fields -Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/graphql-admin/product-basic-info#input-fields). +Setting or removing information requires that you specify ID fields in the input. For more information on how to specify ID fields, see [Input fields](/docs/store-operations/catalog/msf-international-enhancements#input-fields). ## Set variant options diff --git a/docs/store-operations/catalog/msf-international-enhancements.mdx b/docs/store-operations/catalog/msf-international-enhancements.mdx index 61b14caf1..c7b491b7e 100644 --- a/docs/store-operations/catalog/msf-international-enhancements.mdx +++ b/docs/store-operations/catalog/msf-international-enhancements.mdx @@ -56,6 +56,26 @@ The catalog features in _International Enhancements for MSF_ are part of the Gra For a full schema, see the [GraphQL Admin API reference](https://developer.bigcommerce.com/graphql-admin/reference). +### Input fields + +Setting or removing information requires that you specify ID fields in the input. These ID fields contain global IDs that you can retrieve from REST API endpoints. + +For example, the `productId` field contains the global product ID. Retrieve the global product ID from the response body of the [Get all products](/docs/rest-catalog/products#get-all-products) endpoint. A product with a global ID of `111` has a `productId` of `"bc/store/product/111"`. + +The following table describes the ID fields that you can use in inputs for mutations: + +| Field in Input | Description | Global ID | Example | +| :--- | :--- | :--- | :--- | +| `productId` | Product ID | [Get all products](/docs/rest-catalog/products#get-all-products) | `"bc/store/product/111"` | +| `channelId` | Channel ID | [Get all channels](/docs/rest-management/channels#get-all-channels) | `"bc/store/channel/2"` | +| `optionId` | Variant option ID | [Get all product variant options](/docs/rest-catalog/product-variant-options#get-all-product-variant-options) | `"bc/store/productOption/108"` | +| | Shared variant option ID | Navigate to **Products <br /> >Product Options <br /> >_OptionName_** <br />in the control panel. <br /><br />Retrieve the global ID from the URL. | `"bc/store/sharedProductOption/1"` | +| `modifierId` | Modifier ID | [Get all product modifiers](/docs/rest-catalog/product-modifiers#get-all-product-modifiers) | `"bc/store/productModifier/121"` | +| | Shared modifier ID | Navigate to **Products <br /> >Product Options <br /> >Shared Modifiers <br /> >_ModifierName_** <br /> in the control panel. <br /><br /> Retrieve the global ID from the URL. | `"bc/store/sharedProductModifier/2"` | +| `valueId` | Variant option value ID | [Get all product variant option values](/docs/rest-catalog/product-variant-options/values#get-all-product-variant-option-values) | Product variant options: `"bc/store/productOptionValue/68"` <br /><br />Shared variant options: `"bc/store/sharedProductOptionValue/123"` | +| | Modifier value ID | [Get all modifier values](/docs/rest-catalog/product-modifiers/values#get-all-modifier-values) | Product modifiers: `"bc/store/productModifierValue/107"` <br /><br />Shared modifiers: `"bc/store/sharedProductModifierValue/107"` | +| `customFieldId` | ID for a product custom field | [Get product custom fields](/docs/rest-catalog/products/custom-fields#get-product-custom-fields) | `"bc/store/productCustomField/1"` | + ## Authentication The GraphQL Admin API works with [store-level API accounts](/docs/start/authentication/api-accounts#store-level-api-accounts). From ffdcc4e9f9703bca4130319f7cb94ae0edfca0e6 Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:02:11 -0500 Subject: [PATCH 211/221] DEVDOC-6114 [update]: Channel Menus, add UI sections (#517) --- docs/integrations/channels/guide/storefronts.mdx | 8 +++++++- reference/channels.v3.yml | 14 ++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/integrations/channels/guide/storefronts.mdx b/docs/integrations/channels/guide/storefronts.mdx index 3b93cd267..e5c3f910a 100644 --- a/docs/integrations/channels/guide/storefronts.mdx +++ b/docs/integrations/channels/guide/storefronts.mdx @@ -93,13 +93,19 @@ BigCommerce allows the developer to toggle the location and scope of the followi | Menu item / settings page | API Argument | Description | |:------|:------|:------------| +| Overview | `overview` | Renders a channel-specific overview page. | | Storefront Settings | `storefront_settings` | Renders channel-specific storefront settings. | +| Localization | `localization` | Renders channel-specific localization settings. | | Carousel | `carousel` | Renders channel-specific carousel settings. | +| Script Manager | `script_manager` | Renders channel-specific script manager settings. | | Currencies | `currencies` | Renders channel-specific currency settings. | +| Payments | `payments` | Renders channel-specific payments settings. | +| Checkout | `checkout` | Renders channel-specific checkout settings. | | Domains | `domains` | Renders channel-specific domain settings. | | Notifications | `notifications` | Renders channel-specific notification settings. | | Social | `social` | Renders channel-specific social media settings. | -| Localization | `localization` | Renders channel-specific localization settings. | +| Web pages | `pages` | Renders channel-specific pages settings. | +| Data solutions | `data_solutions` | Renders channel-specific data solutions settings. | The term _protected section_ refers to the settings on the corresponding menu pages. Settings in protected sections override the default settings configured at the storewide level. Include these protected sections in requests to the [Create channel menus](/docs/rest-management/channels/channel-menus#create-channel-menus) endpoint to display BigCommerce-provided, channel-specific settings pages and corresponding menu items. Enabled protected sections precede custom sections in a channel's menu. diff --git a/reference/channels.v3.yml b/reference/channels.v3.yml index 1a46c4d44..983732d46 100644 --- a/reference/channels.v3.yml +++ b/reference/channels.v3.yml @@ -3498,13 +3498,19 @@ components: items: type: string enum: + - overview - storefront_settings - - social + - localization - carousel - - domains + - script_manager - currencies - - notifications - - localization + - payments + - checkout + - domains + - notifications + - social + - pages + - data_solutions channel_menus_Post: type: object properties: From 166d2157c6e44e6f0fa2c46b9b34c2307209adff Mon Sep 17 00:00:00 2001 From: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:03:33 -0500 Subject: [PATCH 212/221] DEVDOCS-6025: SF Form Fields, add requirements field for password field (#476) --- reference/form_fields.sf.yml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/reference/form_fields.sf.yml b/reference/form_fields.sf.yml index b2d3e4f71..4f2cabd90 100644 --- a/reference/form_fields.sf.yml +++ b/reference/form_fields.sf.yml @@ -123,10 +123,29 @@ components: description: The minimum valid value for the field (integer and date type only). maxLength: type: integer - description: The maximum length for the value (string type only) + description: The maximum length for the value (string type only). secret: type: boolean - description: Whether the field represents a password field + description: Whether the field represents a password field (password field type only). + requirements: + type: object + description: Password requirements (password field type only). + properties: + alpha: + type: string + description: Regex expression for the required alpha characters. + example: '[A-Za-z]' + description: + type: string + description: Description for the password requirements. + example: Passwords must be at least 7 characters and contain both alphabetic and numeric characters. + minlength: + type: integer + description: Minimum password length. + numeric: + type: string + description: Regex expression for the required numeric characters. + example: '[0-9]' options: type: object properties: From 935cb6ce62a115a5ed52e84c37654eba9a31655d Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Fri, 13 Sep 2024 23:22:17 +0300 Subject: [PATCH 213/221] DEVDOCS-6057: [update] is_customers_only (#523) <!-- Ticket number or summary of work --> # [DEVDOCS-6057] ## What changed? Updated the description for `is_customers_only`. ## Release notes draft Bug Fix Updated the description for `is_customers_only`. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6057]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6057?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/pages.v3.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/pages.v3.yml b/reference/pages.v3.yml index 2c73e3da3..e1df5ef57 100644 --- a/reference/pages.v3.yml +++ b/reference/pages.v3.yml @@ -833,7 +833,7 @@ components: is_customers_only: type: boolean description: | - Boolean value. If this value is set to `true`, this page will not be visible when the user is logged in to the store control panel. + Boolean value. When `true`, this page is visible only to logged-in customers. email: type: string description: 'Applicable when the page type is `contact_form`: contact email address that receives messages sent via the form. Must be unique.' @@ -948,7 +948,7 @@ components: default: false is_customers_only: type: boolean - description: 'When `true`, this page is not visible to merchant users who are signed in to the store control panel.' + description: 'When `true`, this page is visible only to logged-in customers.' default: false url: type: string From c83af49fd890126119227d6851e8ad57e51e864c Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 16 Sep 2024 23:30:57 +0300 Subject: [PATCH 214/221] cart-metafields-update (#528) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [NO TICKET] ## What changed? See https://bigcommerce.slack.com/archives/C57SQ401K/p1726511197971909?thread_ts=1726504262.910979&cid=C57SQ401K ## Release notes draft Bug Fix - cart metafields will not work on REST Storefront Carts. Updated doc to alleviate confusion. <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- docs/storefront/cart-checkout/metafields.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/storefront/cart-checkout/metafields.mdx b/docs/storefront/cart-checkout/metafields.mdx index 773b3659c..274dc45d1 100644 --- a/docs/storefront/cart-checkout/metafields.mdx +++ b/docs/storefront/cart-checkout/metafields.mdx @@ -2,7 +2,7 @@ # Working with cart metafields -Cart metafields let you add custom metadata to a cart to display product information. Cart metafields are key-value pairs. You can work with them using both the GraphQL Storefront API and the REST Storefront API. +Cart metafields let you add custom metadata to a cart to display product information. Cart metafields are key-value pairs. You can work with them using both the GraphQL Storefront API and the REST Management API. ## Example queries and mutations From be9e1127a260dbc52aac96a07b29ad9e31c6ffbb Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Mon, 16 Sep 2024 23:33:11 +0300 Subject: [PATCH 215/221] DEVDOCS-6038: [update] update parent_id & tree_id definitions (#526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [DEVDOCS-6038] ## What changed? Updated the descriptions for parent_id and tree_id. ## Release notes draft bug fix: Clarified the parent_id and tree_id descriptions for creating a top level category <-- Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6038]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6038?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/catalog/category-trees_catalog.v3.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reference/catalog/category-trees_catalog.v3.yml b/reference/catalog/category-trees_catalog.v3.yml index c81708ee8..70cbc560a 100644 --- a/reference/catalog/category-trees_catalog.v3.yml +++ b/reference/catalog/category-trees_catalog.v3.yml @@ -919,13 +919,12 @@ components: title: Parent ID type: integer description: |- - The unique numeric ID of the categoryʼs parent. This field controls where the category sits in the tree of categories that organize the catalog. - Required in a POST if creating a child category. + The unique numeric ID of the category parent. To create a top-level category, specify the `tree_id`. Otherwise, you can specify the `parent_id`. Required in a POST if creating a child category. example: 0 tree_id: title: Tree ID type: integer - description: The ID of the category tree. + description: The ID of the category tree. To create a top-level category, specify the `tree_id`. Otherwise, you can specify the `parent_id`. example: 1 name: title: Name From ea69a6c44dbf2821c28fe8c31bf0eb5dc3f372d4 Mon Sep 17 00:00:00 2001 From: Jasper Pajar <45197791+jpajar@users.noreply.github.com> Date: Tue, 17 Sep 2024 23:50:49 +1000 Subject: [PATCH 216/221] PROMO-1051: [add] Promotion Settings v3 REST contract (#370) <!-- Ticket number or summary of work --> # [PROMO-1051] ## What changed? <!-- Provide a bulleted list in the present tense --> * Added documentation for future Promotion Settings REST API ## Release notes draft * Added documentation for future Promotion Settings REST API [PROMO-1051]: https://bigcommercecloud.atlassian.net/browse/PROMO-1051?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- reference/promotion_settings.v3.yml | 304 ++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 reference/promotion_settings.v3.yml diff --git a/reference/promotion_settings.v3.yml b/reference/promotion_settings.v3.yml new file mode 100644 index 000000000..6d84d4dcb --- /dev/null +++ b/reference/promotion_settings.v3.yml @@ -0,0 +1,304 @@ +openapi: "3.0.3" +info: + title: Promotion Settings API + version: "1.0" + description: | + A *promotion setting* determines how promotions should be applied and/or calculated. + + To learn more about promotions, consult the [Promotions Overview](/docs/store-operations/promotions). + termsOfService: "https://www.bigcommerce.com/terms" + contact: + name: BigCommerce + url: "https://www.bigcommerce.com" + email: support@bigcommerce.com +servers: + - url: "https://api.bigcommerce.com/stores/{store_hash}/v3" + variables: + store_hash: + default: store_hash + description: Permanent ID of the BigCommerce store. + description: BigCommerce API Gateway +security: + - X-Auth-Token: [] +tags: + - name: Promotion Settings +paths: + "/promotions/settings": + parameters: + - $ref: "#/components/parameters/Accept" + get: + summary: Get Global Promotion Settings + description: Returns global promotion settings. + operationId: getGlobalPromotionSettings + tags: + - Promotion Settings + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/GlobalPromotionSettings" + example: + promotions_triggered_by_products_with_zero_product_price: true + promotions_apply_on_products_with_custom_product_price: false + number_of_coupons_allowed_at_checkout: 1 + promotions_applied_on_original_product_price: true + "400": + description: Bad request. + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse400" + put: + summary: Update Global Promotion Settings + description: |- + - Updates global promotion settings. + - Note: *promotions_apply_on_products_with_custom_product_price*, *number_of_coupons_allowed_at_checkout* and *promotions_triggered_by_products_with_zero_product_price* can only be modified by enterprise accounts. + operationId: updateGlobalPromotionSettings + parameters: + - $ref: "#/components/parameters/ContentType" + tags: + - Promotion Settings + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/GlobalPromotionSettings" + example: + promotions_triggered_by_products_with_zero_product_price: true + promotions_apply_on_products_with_custom_product_price: false + number_of_coupons_allowed_at_checkout: 1 + promotions_applied_on_original_product_price: true + required: true + responses: + "200": + description: OK + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/GlobalPromotionSettings" + "400": + description: Bad request. + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse400" + "422": + description: "Promotion settings data is not valid. This is the result of missing required fields, or of invalid data. See the response for more details." + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorResponse422" + +components: + schemas: + GlobalPromotionSettings: + type: object + required: + - promotions_apply_on_products_with_custom_product_price + - promotions_triggered_by_products_with_zero_product_price + - number_of_coupons_allowed_at_checkout + - promotions_applied_on_original_product_price + properties: + promotions_apply_on_products_with_custom_product_price: + type: boolean + example: false + default: false + description: |- + - When the property is set to "true", promotions will apply for products with custom pricing. + - When the property is set to "false", promotions will not apply for products with custom pricing. + - Note: This field can only be edited for Enterprise Accounts. + promotions_triggered_by_products_with_zero_product_price: + type: boolean + example: false + default: false + description: |- + - When the property is set to "true", promotions will be triggered by zero price products. + - When the property is set to "false", promotions will not be triggered by zero price products. + - Note: This field can only be edited for Enterprise Accounts. + number_of_coupons_allowed_at_checkout: + minimum: 1 + maximum: 5 + type: integer + description: |- + Specifies the number of coupons allowed at checkout on a single order. + - Note: This field can only be edited for Enterprise Accounts. + example: 1 + default: 1 + promotions_applied_on_original_product_price: + type: boolean + example: true + default: true + description: |- + - When the property is set to "true", promotions in a cart are calculated independently, each applied to the original price of the included products. + - When the property is set to "false", promotions in a cart are calculated cumulatively, applied to the order sub-total based on your promotion order. + ErrorResponse400: + type: object + properties: + schema: + $ref: "#/components/schemas/betaErrorResponse400" + x-tags: + - Models + ErrorResponse403: + type: object + properties: + schema: + $ref: "#/components/schemas/betaErrorResponse403" + x-tags: + - Models + ErrorResponse422: + type: object + properties: + schema: + $ref: "#/components/schemas/betaErrorResponse422" + x-tags: + - Models + betaErrorResponse400: + allOf: + - $ref: "#/components/schemas/BaseError" + - type: object + properties: + error: + type: object + properties: + message: + type: string + example: "Bad request. Authentication Required." + example: + status: 400 + title: "Bad Request" + error: + message: "Bad request. Authentication Required." + betaErrorResponse403: + allOf: + - $ref: "#/components/schemas/BaseError" + - type: object + properties: + error: + type: object + properties: + message: + type: string + example: "Forbidden. Operation cannot be performed with existing privileges." + example: + status: 403 + title: "Forbidden" + error: + message: "Forbidden. Operation cannot be performed with existing privileges." + betaErrorResponse422: + allOf: + - $ref: "#/components/schemas/BaseError" + - type: object + properties: + errors: + type: array + items: + type: object + properties: + field: + type: string + description: The field that caused the validation error. + message: + type: string + description: A specific error message describing the issue. + example: + status: 422 + title: "Unprocessable Entity" + errors: + - field: "promotions_triggered_by_products_with_zero_product_price" + message: "Value must be boolean (true/false)." + - field: "number_of_coupons_allowed_at_checkout" + message: "Value must be between 1 and 5." + BaseError: + type: object + description: | + Error payload for the BigCommerce API. + properties: + status: + description: | + The HTTP status code. + type: integer + title: + description: | + The error title describing the particular error. + type: string + x-tags: + - Models + + examples: + EnableZeroPriceProductsToTriggerPromotions: + summary: Enable zero price products to trigger promotions + value: + promotions_triggered_by_products_with_zero_product_price: true + promotions_apply_on_products_with_custom_product_price: false + number_of_coupons_allowed_at_checkout: 1 + promotions_applied_on_original_product_price: true + ErrorResponse400Example: + summary: Example of a 400 Bad Request Error Response + value: + status: 400 + title: "Bad Request" + error: + message: "Bad request. Authentication Required." + ErrorResponse403Example: + summary: Example of a 403 Forbidden Error Response + value: + status: 403 + title: "Forbidden" + error: + message: "Forbidden. Operation cannot be performed with existing privileges." + ErrorResponse422Example: + summary: Example of a 422 Unprocessable Entity Error Response + value: + status: 422 + title: "Invalid promotion setting(s)." + errors: + - field: "promotions_triggered_by_products_with_zero_product_price" + message: "Value must be boolean." + - field: "number_of_coupons_allowed_at_checkout" + message: "Value must be an integer between 1 and 15." + parameters: + Accept: + name: Accept + in: header + required: true + description: "The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body." + schema: + type: string + default: "application/json" + ContentType: + name: Content-Type + in: header + required: true + description: "The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the request body." + schema: + type: string + default: "application/json" + securitySchemes: + X-Auth-Token: + name: X-Auth-Token + description: |- + ### OAuth scopes + + | UI Name | Permission | Parameter | + |:--------|:-----------|:----------| + | Marketing | modify | `store_v2_marketing` | + | Marketing | read-only | `store_v2_marketing_read_only` | + + ### Authentication header + + | Header | Argument | Description | + |:-------|:---------|:------------| + | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). | + + ### Further reading + + For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/docs/start/authentication). + + For more about BigCommerce OAuth scopes, see [API Accounts and OAuth Scopes](/docs/start/authentication/api-accounts). + + For a list of API status codes, see [API Status Codes](/docs/start/about/status-codes). + type: apiKey + in: header From 6e4d98ab362ac34f1ea0421cab636ec39374de06 Mon Sep 17 00:00:00 2001 From: Nate Stewart <nate.stewart@bigcommerce.com> Date: Tue, 17 Sep 2024 12:33:49 -0400 Subject: [PATCH 217/221] Add company attachment endpoints to B2B Edition API specs (#529) ## What changed? - Moved over B2B endpoints for Company Attachments that launched since the initial docs transfer into our dev center - Improved some of the descriptions in the spec - Removed unnecessary x-stoplight references ping @bigcommerce/dev-docs-team @bigcommerce/team-b2b --------- Co-authored-by: Traci Porter <traci.porter@bigcommerce.com> Co-authored-by: bc-andreadao <96258747+bc-andreadao@users.noreply.github.com> --- .../specs/api-v3/company/company.yaml | 725 +++++++++--------- 1 file changed, 352 insertions(+), 373 deletions(-) diff --git a/docs/b2b-edition/specs/api-v3/company/company.yaml b/docs/b2b-edition/specs/api-v3/company/company.yaml index 948a63a3b..baa47ec4f 100644 --- a/docs/b2b-edition/specs/api-v3/company/company.yaml +++ b/docs/b2b-edition/specs/api-v3/company/company.yaml @@ -1,24 +1,30 @@ openapi: 3.0.1 info: title: Company - description: 'The company of BigCommerce B2B Edition corresponds to the customer group of BigCommerce one by one, and the mapping is done through field of bc_group_id. The established corresponding relationship cannot be changed and can only be deleted together. Different customer groups do not support merging in BigCommerce. The same is true for different BigCommerce B2B Edition Company. This is a simple entity diagram of customer groups and company. ![Company entity diagram](https://user-images.githubusercontent.com/81215728/124566045-424fd480-de75-11eb-8268-a15ae40fb579.jpg) The best practices to use company OpenAPI is maintaining unidirectional data flow. The operation of BigCommerce customer groups data update (add, update and delete) is completed by BigCommerce B2B Editionʼs OpenAPI operation company.' + description: |- + A company in B2B Edition corresponds one-to-one with a customer group in BigCommerce. You can do the mapping through the `bc_group_id` field. Once established, you cannot change this corresponding relationship. You can only delete it. Note that you cannot merge BigCommerce customer groups or B2B Edition companies. + + This diagram details the relation between customer groups and companies: + + ![Company entity diagram](https://user-images.githubusercontent.com/81215728/124566045-424fd480-de75-11eb-8268-a15ae40fb579.jpg) + + The best practice for using these Company APIs is to maintain unidirectional data flow, with B2B Edition endpoints as the primary touchpoint. By default B2B Edition's company operations handle modifying linked BigCommerce customer group data (add, update, and delete). contact: {} version: v3 servers: - - url: 'https://api-b2b.bigcommerce.com/api/v3/io' + - url: "https://api-b2b.bigcommerce.com/api/v3/io" security: - authToken: [] tags: - name: Company - description: New version company docs - name: Company Roles and Permissions paths: /companies: get: tags: - Company - summary: Get Companies - description: Get all companies list + summary: Get All Companies + description: Get a list of all companies. operationId: get-companies parameters: - name: limit @@ -60,7 +66,7 @@ paths: type: number - name: sortBy in: query - description: The response sorted by which field + description: Sort the result by a specific company field. schema: type: string default: updatedAt @@ -80,16 +86,16 @@ paths: example: DESC - name: isIncludeExtraFields in: query - description: Is show extra fields in the response + description: Whether the response will include extra fields. schema: type: string - default: '0' + default: "0" enum: - - '0' - - '1' + - "0" + - "1" - name: companyStatus in: query - description: '0: PENDING 1: APPROVED 2: REJECTED 3: INACTIVE' + description: "0: PENDING 1: APPROVED 2: REJECTED 3: INACTIVE" schema: type: integer enum: @@ -104,7 +110,15 @@ paths: type: string - name: extraFields in: query - description: 'Company query extra fields, you can use this value to filter the company list.(include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5 and other customizable) This value may be passed into the custom extra field configured by the B3 team when you create the company. If you clearly know the correspondence between the custom extra field and the default extra field, you can use the default extra field filter to obtain data, Of course, you can also filter by key-value pairs passed into custom fields. eg. https://api-b2b.bigcommerce.com/api/v2/io/companies/?extraFields=extraInt1:1&extraFields=companyTax:un42' + description: |- + Filter the company list on extra fields. (include extraInt1 ~ extraInt5, extraStr1 ~ extraStr5 and other customizable) + + When you create the company, you can pass a value into the custom extra field configured by the B3 team. + + If you know the correspondence between the custom extra field and the default extra field, you can use the default extra field filter to obtain data. + + You can also filter by key-value pairs passed into custom fields: + https://api-b2b.bigcommerce.com/api/v2/io/companies/?extraFields=extraInt1:1&extraFields=companyTax:un42 style: form explode: false schema: @@ -114,7 +128,7 @@ paths: example: 2 in: query name: bcOrderId - description: 'Company purchase bc order id, allow you found company by bc order id' + description: "A company purchases a BigCommerce order ID, which allows you to find the company by BigCommerce order ID." - schema: type: string in: query @@ -129,7 +143,7 @@ paths: type: integer in: query name: customerId - description: 'BigCommerce customer id, this customer should be a B2B company user' + description: "BigCommerce customer ID. This customer should be a B2B company user." - schema: type: string enum: @@ -138,9 +152,9 @@ paths: default: search in: query name: extraFieldFilterType - description: 'extra field filter type. The search filter type allows for partial matches, while the exact-match filter type only returns results that exactly match the specified criteria.' + description: "Extra field filter type. The search filter type allows for partial matches, while the exact-match filter type only returns results that exactly match the specified criteria." responses: - '200': + "200": description: OK content: application/json: @@ -169,10 +183,10 @@ paths: minLength: 1 type: string enum: - - '0' - - '1' - - '2' - - '3' + - "0" + - "1" + - "2" + - "3" description: Status of a company companyEmail: type: string @@ -211,21 +225,21 @@ paths: description: Field label name isRequired: type: string - description: 'Is field required or not, 0=not required, 1=required' + description: "Is field required or not, 0=not required, 1=required" enum: - - '0' - - '1' + - "0" + - "1" dataType: type: string - description: 'Field data type, 0=text, 1=number, 2=textarea, 3=dropdown' + description: "Field data type, 0=text, 1=number, 2=textarea, 3=dropdown" enum: - - '0' - - '1' - - '2' - - '3' + - "0" + - "1" + - "2" + - "3" fieldType: type: number - description: 'Field data type, 0=text, 1=number, 2=textarea, 3=dropdown' + description: "Field data type, 0=text, 1=number, 2=textarea, 3=dropdown" enum: - 0 - 1 @@ -329,23 +343,23 @@ paths: value: code: 200 data: - - companyId: '147340' + - companyId: "147340" companyName: Glam Squad Hair and Makeup Artistry bcGroupName: Glam Squad Hair and Makeup Artistry companyEmail: support@bundleb2b.net - companyPhone: '123456789' - companyStatus: '1' - uuid: '' - catalogId: '' - catalogName: '' - updatedAt: '1618794615' - createdAt: '1618787774' + companyPhone: "123456789" + companyStatus: "1" + uuid: "" + catalogId: "" + catalogName: "" + updatedAt: "1618794615" + createdAt: "1618787774" extraFields: - - dataType: '2' + - dataType: "2" fieldType: 2 fieldName: extraStr1 fieldValue: extra_text - isRequired: '0' + isRequired: "0" labelName: Enter your license extraInt1: 42 extraInt2: 42 @@ -368,17 +382,17 @@ paths: value: code: 200 data: - - companyId: '147340' + - companyId: "147340" companyName: Glam Squad Hair and Makeup Artistry bcGroupName: Glam Squad Hair and Makeup Artistry companyEmail: support@bundleb2b.net - companyPhone: '123456789' - companyStatus: '1' - uuid: '' - catalogId: '' - catalogName: '' - updatedAt: '1618794615' - createdAt: '1618787774' + companyPhone: "123456789" + companyStatus: "1" + uuid: "" + catalogId: "" + catalogName: "" + updatedAt: "1618794615" + createdAt: "1618787774" bcGroupId: 0 meta: message: SUCCESS @@ -390,19 +404,19 @@ paths: example: code: 200 data: - - companyId: '147340' + - companyId: "147340" companyName: Glam Squad Hair and Makeup Artistry - companyStatus: '1' - uuid: '' - catalogId: '' - catalogName: '' - updatedAt: '1618794615' - createdAt: '1618787774' + companyStatus: "1" + uuid: "" + catalogId: "" + catalogName: "" + updatedAt: "1618794615" + createdAt: "1618787774" extraFields: - - dataType: '2' + - dataType: "2" fieldName: extraStr1 fieldValue: extra_text - isRequired: '0' + isRequired: "0" labelName: Enter your license meta: message: SUCCESS @@ -414,14 +428,14 @@ paths: example: code: 200 data: - - companyId: '147340' + - companyId: "147340" companyName: Glam Squad Hair and Makeup Artistry - companyStatus: '1' - uuid: '' - catalogId: '' - catalogName: '' - updatedAt: '1618794615' - createdAt: '1618787774' + companyStatus: "1" + uuid: "" + catalogId: "" + catalogName: "" + updatedAt: "1618794615" + createdAt: "1618787774" meta: message: SUCCESS pagination: @@ -445,13 +459,13 @@ paths: - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml - type: object required: - - companyName - - companyPhone - - companyEmail - - country - - adminFirstName - - adminLastName - - adminEmail + - companyName + - companyPhone + - companyEmail + - country + - adminFirstName + - adminLastName + - adminEmail properties: companyName: minLength: 1 @@ -507,7 +521,7 @@ paths: description: BC price list Id that company related acceptCreationEmail: type: boolean - description: 'True: Will send email company creation notification to admin user; False: Will not send' + description: "True: Sends an email notification about the company creation to the admin user; False: Does not send the notification." default: false channelIds: type: array @@ -516,7 +530,7 @@ paths: type: integer originChannelId: type: integer - description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + description: "BigCommerce channel ID, used for BigCommerce customer origin channel ID. This field takes effect only when you do not configure the store default B2B channel." examples: example-1: value: @@ -544,12 +558,12 @@ paths: - 2 originChannelId: 1 responses: - '200': + "200": description: Created content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -589,12 +603,12 @@ paths: customerGroupId: 1 meta: message: SUCCESS - '400': + "400": description: Bad Request content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -620,12 +634,12 @@ paths: data: {} meta: message: Create BC customer group failed - '422': - description: 'Company was not valid. This is the result of missing required fields, or of invalid data. See the response for more details' + "422": + description: "Company was not valid. This is the result of missing required fields, or of invalid data. See the response for more details." content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -654,12 +668,12 @@ paths: security: - authToken: [] x-codegen-request-body-name: body - '/companies/{companyId}': + "/companies/{companyId}": get: tags: - Company - summary: Get a Company Detail - description: Get a company detail + summary: Get a Company + description: Get details about a specific company. operationId: get-companies-companyId parameters: - name: companyId @@ -668,7 +682,7 @@ paths: schema: type: string responses: - '200': + "200": description: OK content: application/json: @@ -788,27 +802,27 @@ paths: value: code: 200 data: - companyId: '147340' + companyId: "147340" companyName: Glam Squad Hair and Makeup Artistry companyEmail: support@bundleb2b.net - companyPhone: '123456789' - companyStatus: '1' - uuid: '' - catalogId: '' - catalogName: '' - updatedAt: '1618794615' - createdAt: '1618787774' + companyPhone: "123456789" + companyStatus: "1" + uuid: "" + catalogId: "" + catalogName: "" + updatedAt: "1618794615" + createdAt: "1618787774" extraFields: - - dataType: '2' + - dataType: "2" fieldName: extraStr1 fieldValue: extra_text - isRequired: '0' + isRequired: "0" labelName: Enter your license - bcGroupId: '1' + bcGroupId: "1" bcGroupName: salons meta: message: SUCCESS - '404': + "404": description: Not Found content: application/json: @@ -832,7 +846,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -931,12 +945,12 @@ paths: description: BC price list ID required: false responses: - '200': + "200": description: OK content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -966,7 +980,7 @@ paths: companyId: 12 meta: message: SUCCESS - '404': + "404": description: Not Found content: application/json: @@ -990,7 +1004,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -1024,12 +1038,12 @@ paths: schema: type: string responses: - '200': + "200": description: OK content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -1052,13 +1066,13 @@ paths: data: {} meta: message: SUCCESS - '404': + "404": description: Not Found content: application/json: schema: type: object - description: '' + description: "" properties: code: type: integer @@ -1092,8 +1106,8 @@ paths: security: - authToken: [] parameters: - - $ref: '#/components/parameters/companyId' - '/customer-groups/{customerGroupId}/companies': + - $ref: "#/components/parameters/companyId" + "/customer-groups/{customerGroupId}/companies": post: tags: - Company @@ -1194,7 +1208,7 @@ paths: - fieldName: string fieldValue: string responses: - '200': + "200": description: OK content: application/json: @@ -1223,23 +1237,23 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: code: 200 data: - companyId: '12' + companyId: "12" meta: message: SUCCESS example-1: example: code: 200 data: - companyId: '147340' + companyId: "147340" meta: message: SUCCESS - '400': + "400": description: Bad Request content: application/json: @@ -1268,13 +1282,13 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: code: 200 data: - companyId: '12' + companyId: "12" meta: message: SUCCESS example-1: @@ -1283,7 +1297,7 @@ paths: data: {} meta: message: Convert failed for the API call. - '404': + "404": description: Not Found content: application/json: @@ -1307,7 +1321,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -1329,12 +1343,12 @@ paths: summary: Bulk Create Companies operationId: post-companies-bulk responses: - '200': + "200": description: OK content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -1367,12 +1381,12 @@ paths: - companyId: 1 data: id: string - '400': - description: 'Bad Request, some companies created failed.' + "400": + description: "Bad Request, some companies created failed." content: application/json: schema: - description: '' + description: "" type: object x-examples: example-1: @@ -1430,17 +1444,17 @@ paths: code: 400 data: errors: - - id: '42' - detail: '' + - id: "42" + detail: "" meta: - message: 'Some companies updated failed, you can see these in errors' - '409': - description: 'Company was in conflict with another company. This is the result of duplicate unique values; A missing or invalid `companyEmail`, `phoneNumber` or other extraFields' + message: "Some companies updated failed, you can see these in errors." + "409": + description: "Company was in conflict with another company. This is the result of duplicate unique values; A missing or invalid `companyEmail`, `phoneNumber` or other extraFields." content: application/json: schema: type: object - description: '' + description: "" properties: code: type: number @@ -1491,12 +1505,12 @@ paths: code: 409 data: errors: - - id: '42' - detail: '' + - id: "42" + detail: "" meta: message: Company was in conflict with another company - '413': - description: 'Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit.' + "413": + description: "Request Entity Too Large. In normal conditions, bulk create or update method support 10 entity in once request. Another case, some fields of entity over limit." content: application/json: schema: @@ -1508,12 +1522,12 @@ paths: meta: message: Request Entity Too Large data: {} - '422': + "422": description: Company was not valid. This is the result of missing required fields or invalid data. See the response for more details. content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -1595,7 +1609,7 @@ paths: type: integer originChannelId: type: integer - description: 'BigCommerce channel id, used for BigCommerce customer origin channel id. This field takes effect only when the store default b2b channel is not configured' + description: "BigCommerce channel ID, used for BigCommerce customer origin channel ID. This field takes effect only when you do not configure the store default b2b channel." - $ref: https://raw.githubusercontent.com/bigcommerce/docs/main/docs/b2b-edition/models/extra_fields/user_extra_field_values.yaml examples: example-1: @@ -1709,7 +1723,7 @@ paths: fieldValue: string required: false responses: - '200': + "200": description: Company Update Success content: application/json: @@ -1738,7 +1752,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -1751,10 +1765,10 @@ paths: example: code: 200 data: - companyId: '147340' + companyId: "147340" meta: message: SUCCESS - '400': + "400": description: Bad Request content: application/json: @@ -1778,7 +1792,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -1792,7 +1806,7 @@ paths: data: {} meta: message: Convert failed for the API call. - '404': + "404": description: Not Found content: application/json: @@ -1816,7 +1830,7 @@ paths: message: minLength: 1 type: string - description: '' + description: "" examples: example-1: value: @@ -1830,7 +1844,7 @@ paths: data: {} meta: message: This resource is not found - '413': + "413": description: Request Entity Too Large content: application/json: @@ -1839,19 +1853,19 @@ paths: security: - authToken: [] x-codegen-request-body-name: body - '/companies/{companyId}/catalogs': + "/companies/{companyId}/catalogs": parameters: - - $ref: '#/components/parameters/companyId' + - $ref: "#/components/parameters/companyId" put: summary: Update a Company's Catalog operationId: put-companies-companyId-catalog responses: - '200': + "200": description: OK content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -1881,7 +1895,7 @@ paths: value: code: 200 data: - companyId: '147340' + companyId: "147340" meta: message: SUCCESS security: @@ -1890,7 +1904,7 @@ paths: content: application/json: schema: - description: '' + description: "" type: object properties: catalogId: @@ -1903,23 +1917,23 @@ paths: example-1: value: catalogId: string - description: '' + description: "" description: Update a company's catalog. tags: - Company - '/companies/{companyId}/status': + "/companies/{companyId}/status": parameters: - - $ref: '#/components/parameters/companyId' + - $ref: "#/components/parameters/companyId" put: summary: Update a Company's Status operationId: put-companies-companyId-status responses: - '200': + "200": description: OK content: application/json: schema: - description: '' + description: "" type: object properties: code: @@ -1949,7 +1963,7 @@ paths: value: code: 200 data: - companyId: '147340' + companyId: "147340" meta: message: SUCCESS security: @@ -1958,7 +1972,7 @@ paths: content: application/json: schema: - description: '' + description: "" type: object properties: companyStatus: @@ -1981,7 +1995,7 @@ paths: tags: - Company responses: - '200': + "200": description: OK content: application/json: @@ -2018,12 +2032,12 @@ paths: exclusiveMaximum: true minimum: 1 exclusiveMinimum: true - description: 'Pagination limit default: 10' + description: "Pagination limit default: 10" example: 10 offset: type: integer minimum: 0 - description: 'Pagination offset default: 0' + description: "Pagination offset default: 0" example: 0 totalCount: type: integer @@ -2110,11 +2124,11 @@ paths: type: number in: query name: offset - description: 'Pagination offset default: 0' + description: "Pagination offset default: 0" - schema: type: string in: query - description: 'Pagination limit default: 10' + description: "Pagination limit default: 10" name: limit security: - authToken: [] @@ -2132,7 +2146,7 @@ paths: type: string description: search by permission name responses: - '200': + "200": description: OK content: application/json: @@ -2141,56 +2155,34 @@ paths: properties: code: type: integer - x-stoplight: - id: tkd806l6sp85s default: 200 data: type: array - x-stoplight: - id: dvelk7dyckvfv items: - x-stoplight: - id: cpxubh8agzme4 type: object properties: id: type: integer - x-stoplight: - id: pdf1h2175djxl name: type: string - x-stoplight: - id: lsuhr6erkvbfv description: The permission name description: type: string - x-stoplight: - id: qrc23ecrewfpf description: The permission description code: type: string - x-stoplight: - id: 5ufcc4xw8b7la description: The permission code isCustom: type: boolean - x-stoplight: - id: pyaz088347b77 description: Whether the permission is custom moduleName: type: string - x-stoplight: - id: 45o1bg3ohj24b description: The name of the module to which the permission belongs meta: type: object - x-stoplight: - id: oswkodks6amvb properties: message: type: string - x-stoplight: - id: g9anf5jqggjek default: SUCCESS examples: Example 1: @@ -2213,7 +2205,7 @@ paths: summary: Create Company Permission operationId: post-stores-companies-permissions responses: - '200': + "200": description: OK content: application/json: @@ -2222,52 +2214,32 @@ paths: properties: code: type: integer - x-stoplight: - id: kpwn27gg4b1p9 default: 200 data: type: object - x-stoplight: - id: ex611ljl6wjuq properties: id: type: integer - x-stoplight: - id: vve44fhaf7hxg name: type: string - x-stoplight: - id: v30li7i8gyjp0 description: The permission name code: type: string - x-stoplight: - id: azfgdyoaoxpyr description: The permission code description: type: string - x-stoplight: - id: mds3aym61yosm description: The permission description isCustom: type: boolean - x-stoplight: - id: cufks4wx0eou0 description: Whether the permission is custom moduleName: type: string - x-stoplight: - id: epupvi81hu557 description: The name of the module to which the permission belongs meta: type: object - x-stoplight: - id: 0hp7h2t89sq46 properties: message: type: string - x-stoplight: - id: 4uxj69e5kd4er default: SUCCESS examples: Example 1: @@ -2293,26 +2265,18 @@ paths: properties: name: type: string - x-stoplight: - id: 3ltunpilse743 maxLength: 200 description: The permission name code: type: string - x-stoplight: - id: ah108y3oezb1g maxLength: 50 description: The permission code description: type: string - x-stoplight: - id: owp1xr3y95h1c maxLength: 512 description: The permission description moduleName: type: string - x-stoplight: - id: reqdo1j6gglrv maxLength: 50 description: The permission module name required: @@ -2326,12 +2290,12 @@ paths: description: Get addresses code: get_addresses moduleName: address - description: 'name, code are unique in the same store.' + description: "name, code is unique in the same store." parameters: [] tags: - Company Roles and Permissions x-internal: false - '/companies/permissions/{permissionId}': + "/companies/permissions/{permissionId}": parameters: - schema: type: integer @@ -2342,7 +2306,7 @@ paths: summary: Update Company Permission operationId: put-stores-companies-permissions-permissionId responses: - '200': + "200": description: OK content: application/json: @@ -2351,52 +2315,32 @@ paths: properties: code: type: integer - x-stoplight: - id: 8ahlss6wl3sve default: 200 data: type: object - x-stoplight: - id: yetu7glqovsyo properties: id: type: integer - x-stoplight: - id: dykkmywtg1z99 name: type: string - x-stoplight: - id: 1tdhj5ncsj41p description: The permission name code: type: string - x-stoplight: - id: d4yn8rbpnfu1e description: The permission code description: type: string - x-stoplight: - id: 6olj9c38mv9w4 description: The permission description isCustom: type: boolean - x-stoplight: - id: ctjv4ta4ljhru description: Whether the permission is custom moduleName: type: string - x-stoplight: - id: 4s42w6xufbxjc description: The name of the module to which the permission belongs meta: type: object - x-stoplight: - id: khawlr3n42cht properties: message: type: string - x-stoplight: - id: ok1w3txjw1tkg default: SUCCESS examples: Example 1: @@ -2425,26 +2369,18 @@ paths: properties: name: type: string - x-stoplight: - id: raqpw87cjfe39 maxLength: 200 description: The permission name code: type: string - x-stoplight: - id: 3uusi0a7hl6fs maxLength: 50 description: The permission code description: type: string - x-stoplight: - id: ni669xyrv247k maxLength: 512 description: The permission description moduleName: type: string - x-stoplight: - id: bor0fn2a4h0uy maxLength: 50 required: - name @@ -2457,7 +2393,7 @@ paths: description: Get addresses code: get_addresses moduleName: address - description: 'name, code are unique in the same store' + description: "The name and code are unique within the same store." tags: - Company Roles and Permissions x-internal: false @@ -2465,7 +2401,7 @@ paths: summary: Delete Company Permission operationId: delete-stores-companies-permissions-permissionId responses: - '200': + "200": description: OK content: application/json: @@ -2474,21 +2410,13 @@ paths: properties: data: type: object - x-stoplight: - id: k8kb5ihx9sfha code: type: integer - x-stoplight: - id: c06mjoj73dvht meta: type: object - x-stoplight: - id: g8uoxxlbsq54j properties: message: type: string - x-stoplight: - id: sgiuz09vwior0 examples: Example 1: value: @@ -2511,7 +2439,7 @@ paths: tags: - Company Roles and Permissions responses: - '200': + "200": description: OK content: application/json: @@ -2520,39 +2448,25 @@ paths: properties: code: type: integer - x-stoplight: - id: vnwpw3r1kh6ly data: type: array - x-stoplight: - id: fosrawav0as0t items: - x-stoplight: - id: 7jenbzn4473yy type: object properties: id: type: integer - x-stoplight: - id: z3h3px20ik8ka description: The role id name: type: string - x-stoplight: - id: rg90cavwle2bg description: The role name roleType: type: integer - x-stoplight: - id: 42d1k3govhksj enum: - 1 - predefined - 2 - custom description: The role type roleLevel: type: integer - x-stoplight: - id: 1qnm8vdepubsn enum: - 1 - store level description: The role level @@ -2563,30 +2477,18 @@ paths: - roleLevel meta: type: object - x-stoplight: - id: xxekbl89ndgip properties: message: type: string - x-stoplight: - id: 2bfod2z2pdb62 pagination: type: object - x-stoplight: - id: za17np2r45s1i properties: totalCount: type: integer - x-stoplight: - id: 4384bp8xa7oz0 limit: type: integer - x-stoplight: - id: gl1ohwz0ef3ic offset: type: integer - x-stoplight: - id: z9v82ygqfz3sy examples: Example 1: value: @@ -2629,7 +2531,7 @@ paths: summary: Create Company Role operationId: post-stores-companies-roles responses: - '200': + "200": description: OK content: application/json: @@ -2638,74 +2540,48 @@ paths: properties: code: type: integer - x-stoplight: - id: 2u18iq217751m data: type: object - x-stoplight: - id: k9rdl02d0ntii properties: id: type: integer - x-stoplight: - id: vteez52i917gg description: The role id name: type: string - x-stoplight: - id: 9kk7z7qt6pf20 description: The role name roleType: type: integer - x-stoplight: - id: q4gom706sxank enum: - 1 - predefined - 2 - custom description: The role type roleLevel: type: integer - x-stoplight: - id: k2bxlt88j8djm description: The role level enum: - 1 - store level permissions: type: array - x-stoplight: - id: ff23hduj62asz items: - x-stoplight: - id: 3q87taf5es29c type: object properties: id: type: integer - x-stoplight: - id: wytt7embn9dpp description: The permission id code: type: string - x-stoplight: - id: hl73qdbtivoiv description: The permission code permissionLevel: type: integer - x-stoplight: - id: ajbrfm6bu8hne description: The permission level enum: - 1 - user level - 2 - company level meta: type: object - x-stoplight: - id: r6eo53t14b5r2 properties: message: type: string - x-stoplight: - id: n6884ldx3bjqv examples: Example 1: value: @@ -2733,28 +2609,18 @@ paths: properties: name: type: string - x-stoplight: - id: c5ywvchzer3od description: The role name maxLength: 200 permissions: type: array - x-stoplight: - id: h4zvhyamkjskx items: - x-stoplight: - id: nrk86m71slqq0 type: object properties: code: type: string - x-stoplight: - id: keysbujgwj3q7 description: The permission code permissionLevel: type: integer - x-stoplight: - id: tw1314yueke8b description: The permission level enum: - 1 - user level @@ -2776,7 +2642,7 @@ paths: - Company Roles and Permissions x-internal: false parameters: [] - '/companies/roles/{roleId}': + "/companies/roles/{roleId}": parameters: - schema: type: integer @@ -2788,7 +2654,7 @@ paths: tags: - Company Roles and Permissions responses: - '200': + "200": description: OK content: application/json: @@ -2797,74 +2663,48 @@ paths: properties: code: type: integer - x-stoplight: - id: hx0qsyehm1wzc data: type: object - x-stoplight: - id: pgneaszohuxj2 properties: id: type: integer - x-stoplight: - id: k0u84z6h2f3n5 description: The role id name: type: string - x-stoplight: - id: iaia723439udo description: The role name roleType: type: integer - x-stoplight: - id: qek4b7xgecqmh description: The role type enum: - 1 - predefined - 2 - custom roleLevel: type: integer - x-stoplight: - id: g3qzopa3lhbbr enum: - 1 - store level description: The role level permissions: type: array - x-stoplight: - id: 3urwsajlu34um items: - x-stoplight: - id: p3s1pt7dn14sl type: object properties: id: type: integer - x-stoplight: - id: 3lsw2ehdsuv6p description: The permission id code: type: string - x-stoplight: - id: grkdr749q868t description: The permission code permissionLevel: type: integer - x-stoplight: - id: e60xsjrybid95 description: The permission level enum: - 1 - user level - 2 - company level meta: type: object - x-stoplight: - id: a6311k64rpbj0 properties: message: type: string - x-stoplight: - id: ep3wt4vsinoma examples: Example 1: value: @@ -2880,7 +2720,7 @@ paths: permissionLevel: 2 meta: message: SUCCESS - operationId: 'get-stores-companies-roles-int:roleId' + operationId: "get-stores-companies-roles-int:roleId" description: Get company role detail security: - authToken: [] @@ -2890,7 +2730,7 @@ paths: summary: Update Company Role operationId: put-stores-companies-roles-roleId responses: - '200': + "200": description: OK content: application/json: @@ -2899,12 +2739,8 @@ paths: properties: code: type: integer - x-stoplight: - id: 9x2nutwg143w2 data: type: object - x-stoplight: - id: v41nr6bz2brso properties: id: type: integer @@ -2942,13 +2778,9 @@ paths: - 2 - company level meta: type: object - x-stoplight: - id: qz7b2k46oetyl properties: message: type: string - x-stoplight: - id: a74ssono1wggh examples: Example 1: value: @@ -2979,28 +2811,18 @@ paths: properties: name: type: string - x-stoplight: - id: zzmc8ckjnqt7h maxLength: 200 permissions: type: array - x-stoplight: - id: 7x2n3ou22dfs1 description: permission only support full update items: - x-stoplight: - id: 5i5ykudn167t5 type: object properties: code: type: string - x-stoplight: - id: 8evqzvawzsghi description: The permission code permissionLevel: type: integer - x-stoplight: - id: poeycbgyot4qv description: The ermission level enum: - 1 - user level @@ -3025,7 +2847,7 @@ paths: summary: Delete Company Role operationId: delete-stores-companies-roles-roleId responses: - '200': + "200": description: OK content: application/json: @@ -3034,21 +2856,13 @@ paths: properties: code: type: integer - x-stoplight: - id: mp78kz0m6y8rd data: type: object - x-stoplight: - id: nlkj2dhwb4y39 meta: type: object - x-stoplight: - id: 6ii0tzes2zxvr properties: message: type: string - x-stoplight: - id: x9ee1ak53kzzk examples: Example 1: value: @@ -3067,6 +2881,171 @@ paths: tags: - Company Roles and Permissions x-internal: false + "/companies/{companyId}/attachments": + parameters: + - schema: + type: number + name: companyId + in: path + required: true + description: company Id + get: + summary: Get Company Attachments + tags: + - Company + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + example: 200 + data: + type: array + items: + type: object + properties: + id: + type: string + format: uuid + attachmentUrl: + type: string + meta: + type: object + properties: + message: + type: string + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + - id: f593d7c8-078e-4bb6-af6b-688ef8df1ijn + attachmentUrl: "https://xxx.com/xxx.csv" + meta: + message: SUCCESS + operationId: get-companies-companyId-attachments + description: Get company attachments + security: + - authToken: [] + post: + summary: Add Company Attachment + operationId: post-companies-companyId-attachments + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + default: 200 + data: + type: object + properties: + id: + type: string + format: uuid + attachmentFile: + type: string + meta: + type: object + properties: + message: + type: string + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: + id: 497f6eca-6276-4993-bfeb-53cbbbba6f08 + attachmentFile: "https://xxx.com/xxx.csv" + meta: + message: SUCCESS + description: |- + Each company can upload a maximum of 10 attachments. + + The API rate limit is 15/min per store. + + The attachments support the following file types: + - Images, including bmp, gif, ico, jpeg, jpg, png, svg, tif, tiff, webp, wbmp, xbm. + - PDF + - DOC, DOCX + - XLS, XLSX + - CSV + security: + - authToken: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + attachmentFile: + type: string + format: binary + description: The size of each attachment must not exceed 10MB. + required: + - attachmentFile + description: "" + tags: + - Company + "/companies/{companyId}/attachments/{attachmentId}": + parameters: + - schema: + type: number + name: companyId + in: path + required: true + description: company Id + - schema: + type: string + format: uuid + name: attachmentId + in: path + required: true + description: attachment Id + delete: + summary: Delete Company Attachment + operationId: delete-companies-companyId-attachments-attachmentId + responses: + "200": + description: OK + content: + application/json: + schema: + type: object + properties: + code: + type: number + default: 200 + data: + type: object + meta: + type: object + properties: + message: + type: string + default: SUCCESS + examples: + Example 1: + value: + code: 200 + data: {} + meta: + message: SUCCESS + security: + - authToken: [] + tags: + - Company components: securitySchemes: authToken: From d6d72339ee3cec6badea52eef43fdc9c3f6bc1f3 Mon Sep 17 00:00:00 2001 From: Jasper Pajar <45197791+jpajar@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:47:43 +1000 Subject: [PATCH 218/221] ORDERS-6362: [add] is_tax_inclusive_pricing field in orders response (#525) <!-- Ticket number or summary of work --> https://bigcommercecloud.atlassian.net/browse/ORDERS-6362 ## What changed? <!-- Provide a bulleted list in the present tense --> * Added is_tax_inclusive_pricing field in orders response Swagger Proof: https://github.com/user-attachments/assets/86560ebf-3fc7-482d-93b3-4190699b8c96 --- reference/orders.v2.oas2.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 535a35bf4..9f32bb0d4 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -1429,6 +1429,7 @@ components: total_ex_tax: '361.9500' total_inc_tax: '361.9500' total_tax: '0.0000' + is_tax_inclusive_pricing: false items_total: 17 items_shipped: 0 payment_method: Credit Card @@ -1643,6 +1644,7 @@ components: total_ex_tax: '64.5300' total_inc_tax: '69.8400' total_tax: '5.3100' + is_tax_inclusive_pricing: false items_total: 4 items_shipped: 0 payment_method: Cash @@ -1736,6 +1738,7 @@ components: total_ex_tax: '931.86' total_inc_tax: '1008.74' total_tax: 76.88 + is_tax_inclusive_pricing: false items_total: 11 items_shipped: 0 payment_method: Test Payment Gateway @@ -3915,6 +3918,10 @@ components: description: Override value for the total, including tax. If specified, the field `total_ex_tax` is also required. (Float, Float-As-String, Integer) example: '225.0000' type: string + is_tax_inclusive_pricing: + description: Indicates whether the order total is inclusive of tax. + example: false + type: boolean wrapping_cost_ex_tax: description: The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer) example: '0.0000' @@ -4129,6 +4136,10 @@ components: description: Indicates whether the order is deleted/archived. When set to true in a PUT request, it has the same result as the DELETE an order request. example: false type: boolean + is_tax_inclusive_pricing: + description: Indicates whether the order total is inclusive of tax. + example: false + type: boolean is_email_opt_in: description: Indicates whether the shopper has selected an opt-in check box (on the checkout page) to receive emails. A read-only value. Do not pass in a POST or PUT. example: false From b1d50e6d33b77d003255e828efc1bfa0871e0fee Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 18 Sep 2024 19:02:11 +0300 Subject: [PATCH 219/221] DEVDOCS-3296: [update] add security best practices (#521) <!-- Ticket number or summary of work --> # [DEVDOCS-3296] ## What changed? added security best practices ## Release notes draft * Added security requirements developers can implement while creating an app. Now, you can deliver secure apps and keep clients safe. ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-3296]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-3296?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- docs/integrations/apps/guide/publishing.mdx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/integrations/apps/guide/publishing.mdx b/docs/integrations/apps/guide/publishing.mdx index d0cd087ad..fc074db6c 100644 --- a/docs/integrations/apps/guide/publishing.mdx +++ b/docs/integrations/apps/guide/publishing.mdx @@ -89,7 +89,13 @@ Review the information added before submitting the app. ## Submit your app for approval -Ensure all information is complete, then click **Submit for Review** to pay the review and listing fee and submit the app. Test the app before submitting it to avoid paying additional review fees. +Before submitting your app for approval, it is imperative to adhere to the recommended best practices listed below to ensure the integrity of the app marketplace and keep clients safe. + +* Integrate with the [BigCommerce JS SDK](https://github.com/bigcommerce/checkout-sdk-js) for Java-based apps. The SDK effectively allows management of the user’s session, keeping it in sync with the control panel. +* At a minimum, design apps to be cookieless (to comply with Chrome and Safari privacy/ security policies) and instead use JWTs to pass information. +* Never pass sensitive data using query parameters. + +After completing all information, then click **Submit for Review** to pay the review and listing fee and submit the app. Test the app before submitting it to avoid paying additional review fees. ![Payment & Submission](https://storage.googleapis.com/bigcommerce-production-dev-center/Big%20Design%20Docs/Payment%20%26%20Submission.png "Payment & Submission") From 53c1a68553446544b566b5b6e938ae5329489453 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Wed, 18 Sep 2024 19:03:20 +0300 Subject: [PATCH 220/221] Issue-512 (#527) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit <!-- Ticket number or summary of work --> # [Issue-512](https://github.com/bigcommerce/docs/issues/512) ## What changed? Updated description for subtotal_ex_tax ## Release notes draft Bug Fix, see Issue-512 <!-- Provide an entry for the release notes using simple, conversational language. Don't be too technical. Explain how the change will benefit the merchant and link to the feature. Examples: * The newly-released [X feature] is now available to use. Now, you’ll be able to [perform Y action]. * We're happy to announce [X feature], which can help you [perform Y action]. * [X feature] helps you to create [Y response] using the [Z query parameter]. Now, you can deliver [ex, localized shopping experiences for your customers]. * Fixed a bug in the [X endpoint]. Now the [Y field] will appear when you click [Z option]. --> * ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} --- reference/orders.v2.oas2.yml | 106 +++++++++++++++++------------------ 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/reference/orders.v2.oas2.yml b/reference/orders.v2.oas2.yml index 9f32bb0d4..5ae75018f 100644 --- a/reference/orders.v2.oas2.yml +++ b/reference/orders.v2.oas2.yml @@ -2814,11 +2814,11 @@ components: example: '54.0000' type: string price_ex_tax: - description: The product’s price excluding tax. (Float, Float-As-String, Integer) + description: The product’s price excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '54.0000' type: string price_inc_tax: - description: The product’s price including tax. (Float, Float-As-String, Integer) + description: The product’s price including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '54.0000' type: string price_tax: @@ -2839,11 +2839,11 @@ components: example: '54.0000' type: string total_ex_tax: - description: Total base price excluding tax. (Float, Float-As-String, Integer) + description: Total base price excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '54.0000' type: string total_inc_tax: - description: Total base price including tax. (Float, Float-As-String, Integer) + description: Total base price including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '54.0000' type: string total_tax: @@ -2867,31 +2867,31 @@ components: cost_price_inc_tax: description: |- The product’s cost price including tax. (Float, Float-As-String, Integer) - The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. + The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. The value can't be negative. example: '50.0000' type: string cost_price_ex_tax: description: |- The product cost price excluding tax. (Float, Float-As-String, Integer) - The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. + The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. The value can't be negative. example: '50.0000' type: string weight: - description: Weight of the product. (Float, Float-As-String, Integer) + description: Weight of the product. The value can't be negative. (Float, Float-As-String, Integer) example: 1 oneOf: - type: number - type: string width: - description: Product width. + description: Product width. The value can't be negative. type: string example: "1.0000" height: - description: Product height. + description: Product height. The value can't be negative. type: string example: "1.0000" depth: - description: Product depth. + description: Product depth. The value can't be negative. type: string example: "1.0000" cost_price_tax: @@ -2927,17 +2927,17 @@ components: type: string nullable: true base_wrapping_cost: - description: The value of the base wrapping cost. (Float, Float-As-String, Integer) + description: The value of the base wrapping cost. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' oneOf: - type: string - type: number wrapping_cost_ex_tax: - description: The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string wrapping_cost_inc_tax: - description: The value of the wrapping cost, including tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string wrapping_cost_tax: @@ -3101,15 +3101,15 @@ components: example: 2 base_handling_cost: type: string - description: The base handling charge. (Float, Float-As-String, Integer) + description: The base handling charge. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' handling_cost_ex_tax: type: string - description: The handling charge, excluding tax. (Float, Float-As-String, Integer) + description: The handling charge, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' handling_cost_inc_tax: type: string - description: The handling charge, including tax. (Float, Float-As-String, Integer) + description: The handling charge, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' handling_cost_tax: type: string @@ -3760,15 +3760,15 @@ components: x-internal: false properties: base_handling_cost: - description: The value of the base handling cost. (Float, Float-As-String, Integer) + description: The value of the base handling cost. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string base_shipping_cost: - description: The value of the base shipping cost. (Float, Float-As-String, Integer) + description: The value of the base shipping cost. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string base_wrapping_cost: - description: The value of the base wrapping cost expressed as a floating point number to four decimal places in string format. + description: The value of the base wrapping cost expressed as a floating point number to four decimal places in string format. The value can't be negative. example: '0.0000' type: string channel_id: @@ -3785,7 +3785,7 @@ components: description: The date the order was created, formatted in the RFC-2822 standard. You set this attribute on Order creation (POST) to support the migration of historical orders. If you do not provide a value, then it will default to the current date/time. e.g., `Tue, 20 Nov 2012 00:00:00 +0000`. type: string discount_amount: - description: Amount of discount for this transaction. (Float, Float-As-String, Integer) + description: Amount of discount for this transaction. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string ebay_order_id: @@ -3821,11 +3821,11 @@ components: example: US type: string handling_cost_ex_tax: - description: The value of the handling cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of the handling cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string handling_cost_inc_tax: - description: The value of the handling cost, including tax. (Float, Float-As-String, Integer) + description: The value of the handling cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string ip_address: @@ -3866,15 +3866,15 @@ components: - type: string - type: number refunded_amount: - description: The amount refunded from this transaction; always returns `0`. (Float, Float-As-String, Integer) + description: The amount refunded from this transaction; always returns `0`. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string shipping_cost_ex_tax: - description: The value of shipping cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of shipping cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string shipping_cost_inc_tax: - description: The value of shipping cost, including tax. (Float, Float-As-String, Integer) + description: The value of shipping cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string staff_notes: @@ -3886,11 +3886,11 @@ components: description: The status ID of the order. type: integer subtotal_ex_tax: - description: Override value for subtotal excluding tax. If specified, the field `subtotal_inc_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for subtotal excluding tax. The value can't be negative. If specified, the field `subtotal_inc_tax` is also required. (Float, Float-As-String, Integer) example: '225.0000' type: string subtotal_inc_tax: - description: Override value for subtotal including tax. If specified, the field `subtotal_ex_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for subtotal including tax. The value can't be negative. If specified, the field `subtotal_ex_tax` is also required. (Float, Float-As-String, Integer) example: '225.0000' type: string tax_provider_id: @@ -3911,11 +3911,11 @@ components: example: external-order-id description: The order ID in another system, such as the Amazon Order ID if this is an Amazon order. After setting it, you can update this field using a POST or PUT request. total_ex_tax: - description: Override value for the total, excluding tax. If specified, the field `total_inc_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for the total, excluding tax. If specified, the field `total_inc_tax` is also required. The value can't be negative. (Float, Float-As-String, Integer) example: '225.0000' type: string total_inc_tax: - description: Override value for the total, including tax. If specified, the field `total_ex_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for the total, including tax. If specified, the field `total_ex_tax` is also required. The value can't be negative. (Float, Float-As-String, Integer) example: '225.0000' type: string is_tax_inclusive_pricing: @@ -3923,11 +3923,11 @@ components: example: false type: boolean wrapping_cost_ex_tax: - description: The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string wrapping_cost_inc_tax: - description: The value of the wrapping cost, including tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string billingAddress_Base: @@ -4264,13 +4264,13 @@ components: type: string description: |- The product’s cost price including tax. (Float, Float-As-String, Integer) - The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. + The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. The value can't be negative. example: '50.0000' price_ex_tax: type: string description: |- The products cost price excluding tax. (Float, Float-As-String, Integer) - The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. Read Only. + The cost of your products to you; this is never shown to customers, but can be used for accounting purposes. Read Only. The value can't be negative. readOnly: true example: '0.0000' orderCatalogProduct_Post: @@ -4371,10 +4371,10 @@ components: type: string wrapping_cost_ex_tax: type: number - description: When provided, this value should be equal to `wrapping_cost_ex_tax` times quantity to accurately reflect wrapping cost per unit. + description: When provided, this value should be equal to `wrapping_cost_ex_tax` times quantity to accurately reflect wrapping cost per unit. The value can't be negative. wrapping_cost_inc_tax: type: number - description: When provided, this value should be equal to `wrapping_cost_inc_tax` times quantity to accurately reflect wrapping cost per unit. + description: When provided, this value should be equal to `wrapping_cost_inc_tax` times quantity to accurately reflect wrapping cost per unit. The value can't be negative. x-internal: false orderCustomProduct_Post: title: orderCustomProduct_Post @@ -4428,15 +4428,15 @@ components: - type: object properties: base_handling_cost: - description: The value of the base handling cost. (Float, Float-As-String, Integer) + description: The value of the base handling cost. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string base_shipping_cost: - description: The value of the base shipping cost. (Float, Float-As-String, Integer) + description: The value of the base shipping cost. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string base_wrapping_cost: - description: The value of the base wrapping cost expressed as a floating point number to four decimal places in string format. + description: The value of the base wrapping cost expressed as a floating point number to four decimal places in string format. The value can't be negative. example: '0.0000' type: string billing_address: @@ -4461,7 +4461,7 @@ components: type: string readOnly: true discount_amount: - description: Amount of discount for this transaction. (Float, Float-As-String, Integer) + description: Amount of discount for this transaction. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string ebay_order_id: @@ -4497,11 +4497,11 @@ components: example: US type: string handling_cost_ex_tax: - description: The value of the handling cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of the handling cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string handling_cost_inc_tax: - description: The value of the handling cost, including tax. (Float, Float-As-String, Integer) + description: The value of the handling cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string ip_address: @@ -4548,15 +4548,15 @@ components: - $ref: '#/components/schemas/orderCustomProduct_Put' - $ref: '#/components/schemas/orderRemoveProduct_Put' refunded_amount: - description: The amount refunded from this transaction; always returns `0`. (Float, Float-As-String, Integer) + description: The amount refunded from this transaction; always returns `0`. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string shipping_cost_ex_tax: - description: The value of shipping cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of shipping cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string shipping_cost_inc_tax: - description: The value of shipping cost, including tax. (Float, Float-As-String, Integer) + description: The value of shipping cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string staff_notes: @@ -4577,11 +4577,11 @@ components: description: The status ID of the order. type: integer subtotal_ex_tax: - description: 'Override value for subtotal excluding tax. If specified, the field `subtotal_inc_tax` is also required. (Float, Float-As-String, Integer)' + description: Override value for subtotal excluding tax. The value can't be negative. If specified, the field `subtotal_inc_tax` is also required. (Float, Float-As-String, Integer) example: '225.0000' type: string subtotal_inc_tax: - description: 'Override value for subtotal including tax. If specified, the field `subtotal_ex_tax` is also required. (Float, Float-As-String, Integer)' + description: Override value for subtotal including tax. The value can't be negative. If specified, the field `subtotal_ex_tax` is also required. (Float, Float-As-String, Integer) example: '225.0000' type: string tax_provider_id: @@ -4603,19 +4603,19 @@ components: example: external-order-id description: The order ID in another system, such as the Amazon Order ID if this is an Amazon order. After setting it, you can update this field using a POST or PUT request. total_ex_tax: - description: Override value for the total, excluding tax. If specified, the field `total_inc_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for the total, excluding tax. If specified, the field `total_inc_tax` is also required. The value can't be negative. (Float, Float-As-String, Integer) example: '225.0000' type: string total_inc_tax: - description: Override value for the total, including tax. If specified, the field `total_ex_tax` is also required. (Float, Float-As-String, Integer) + description: Override value for the total, including tax. If specified, the field `total_ex_tax` is also required. The value can't be negative. (Float, Float-As-String, Integer) example: '225.0000' type: string wrapping_cost_ex_tax: - description: The value of the wrapping cost, excluding tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, excluding tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string wrapping_cost_inc_tax: - description: The value of the wrapping cost, including tax. (Float, Float-As-String, Integer) + description: The value of the wrapping cost, including tax. The value can't be negative. (Float, Float-As-String, Integer) example: '0.0000' type: string order_Post: @@ -5224,15 +5224,15 @@ components: example: 2 base_handling_cost: type: number - description: The base handling charge. + description: The base handling charge. The value can't be negative. example: 4.1 handling_cost_ex_tax: type: number - description: The handling charge, excluding tax. + description: The handling charge, excluding tax. The value can't be negative. example: 4.1 handling_cost_inc_tax: type: number - description: The handling charge, including tax. + description: The handling charge, including tax. The value can't be negative. example: 5.3 handling_cost_tax: type: number From 553116fcb6bd6103df39e910cbac5c38a7984bc8 Mon Sep 17 00:00:00 2001 From: Traci Porter <traci.porter@bigcommerce.com> Date: Thu, 19 Sep 2024 18:49:36 +0300 Subject: [PATCH 221/221] DEVDOCS-6042: [update] add deprecated tag (#508) <!-- Ticket number or summary of work --> # [DEVDOCS-6042] ## What changed? added deprecated tags to the settings theme object ## Release notes draft The following stencil attribute fields are deprecated: - settings.request.is_crawler - - settings.request.user_agent - - settings.client_ip_address - - settings.region_code ## Anything else? <!-- Add related PRs, salient notes, additional ticket numbers, etc. --> ping {names} [DEVDOCS-6042]: https://bigcommercecloud.atlassian.net/browse/DEVDOCS-6042?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ --- .../context/object-reference/schemas/settings.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml b/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml index 7202e4a3b..30636385e 100644 --- a/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml +++ b/docs/storefront/stencil/themes/context/object-reference/schemas/settings.yml @@ -42,7 +42,8 @@ properties: type: string client_ip_address: type: string - description: IP address of the customer browsing the storefront. + description: The IP address of the customer browsing the storefront. An alternative to this deprecated field is using [ipify API](https://www.ipify.org/). + deprecated: true country_code: type: string description: The country code corresponding to the IP. @@ -76,7 +77,8 @@ properties: description: Site-wide boolean value that indicates whether to enable the gift certificate system for this store. is_eu_ip_address: type: boolean - description: A boolean value. Return true if the shoppers ip address is in the EU. + description: A boolean value. Return true if the shopper's IP address is in the EU. Alternatives to this deprecated field are solutions like the [IP Geolocation API](https://ipinfo.io/products/ip-geolocation-api), [IP Geolocation API Package](https://www.bigdatacloud.com/ip-geolocation), and others. While those solutions are not free, they offer a generous free tier, better data quality, and more data points than just the region. + deprecated: true maintenance: type: object description: Object that manages information about the store when in maintenance (offline) mode. @@ -153,7 +155,8 @@ properties: description: 'If enabled, a string containing merchant-customizable text for (European Union–required) cookie-setting notification; if disabled, a boolean with a value of false.' region_code: type: string - description: The [ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code is an international standard denomination for country subdivisions. The first part is the country's ISO 3166-1 alpha-2 code, and the second part is a string of up to three alphanumeric characters representing the country's subdivision (province or state). For example, Texas's ISO 3166-2 code is US-TX; therefore, the region code is TX. + description: The [ISO-3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) code is an international standard denomination for country subdivisions. The first part is the country's ISO 3166-1 alpha-2 code, and the second part is a string of up to three alphanumeric characters representing the country's subdivision (province or state). For example, Texas's ISO 3166-2 code is US-TX; therefore, the region code is TX. The value is approximate as it is based on the IP address geolocation. Alternatives to this deprecated field are solutions like https://ipinfo.io/products/ip-geolocation-api and others. While those solutions are not free, they offer a generous free tier, better data quality, and more data points than just the region. + deprecated: true request: type: object description: Object that contains details about the HTTP request. @@ -166,7 +169,8 @@ properties: description: Hostname of the request. is_crawler: type: boolean - description: Renders `true` if user agent is known crawler; otherwise, `false`. + description: Renders `true` if the user agent is a known crawler; otherwise, `false`. NOTE: Serving different versions of the page to crawlers is considered detrimental to SEO [cloaking](https://developers.google.com/search/docs/essentials/spam-policies#cloaking) and is rarely needed. An alternative to this field is using a front-end bot detection like [isbot](https://github.com/omrilotan/isbot). + deprecated: true locale: type: string description: The browserʼs locale. Allows for varying experience based on shopper locale. @@ -178,7 +182,8 @@ properties: description: Refer of the request. user_agent: type: string - description: User agent string of the request. + description: User agent string of the request. An alternative is using JavaScript detection ([Navigator: userAgent property](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/userAgent)). + deprecated: true returns_enabled: type: integer description: Boolean that indicates whether the control-panel setting for the returns system is enabled.