From 8654d68bd54b6189f8ca2240b5ed0e0368b2ffd4 Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Wed, 30 Jan 2013 09:08:51 +1100 Subject: [PATCH 01/37] empty lines cleanup --- resources/countries.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/countries.md b/resources/countries.md index 7c3c746..1069dc5 100644 --- a/resources/countries.md +++ b/resources/countries.md @@ -8,20 +8,20 @@ GET /countries.json - + GET /countries/id.json - + GET /countries/count.json - + - + - + ## Description ### GET countries.json GET countries from a store @@ -41,23 +41,23 @@ These fields can be used to filter the query. By default, without any filters, t country string - + Country name country_iso2 string - + 2 letter countryt code country_iso3 string - + 3 letter country code - + @@ -109,7 +109,7 @@ country by ID "resource": "/countries/226/states" } } - + ### GET countries/count.json @@ -119,7 +119,7 @@ Get a total number of countries in the store This request does not take any parameters. #### Response -Returns the number of countries in the store +Returns the number of countries in the store
   {
     "count": 10

From 5c6aa1e12eaf0fa3941a8f95279a8663ae1c625d Mon Sep 17 00:00:00 2001
From: Chaitanya Kuber 
Date: Wed, 30 Jan 2013 09:09:07 +1100
Subject: [PATCH 02/37] first pass at coupons endpoint documnetation

---
 resources/coupons.md | 431 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 431 insertions(+)
 create mode 100644 resources/coupons.md

diff --git a/resources/coupons.md b/resources/coupons.md
new file mode 100644
index 0000000..437ac51
--- /dev/null
+++ b/resources/coupons.md
@@ -0,0 +1,431 @@
+## Resources
+
+  
+   
+     
+   
+ 
+ 
+   
+     
+   
+   
+     
+   
+
+   
+     
+   
+
+   
+     
+   
+
+   
+     
+   
+
+   
+     
+   
+
+   
+     
+   
+
+   
+     
+   
+
+ 
+
Resource
GET /coupons.json
GET /coupons/id.json
POST /coupons.json
GET /coupons/id.json
PUT /coupons/id.json
GET /coupons/count.json
DELETE /coupons.json
DELETE /coupons/id.json
+ +## Description +### GET coupons.json +GET coupons from a store + +#### Request +These fields can be used to filter the query. By default, without any filters, the GET request returns all the customers. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypedescription
idintegercoupon id
codestringcoupon code
namestringcoupon name
typestringcoupon type
min_idstringcoupons with id greater than min_id
max_idstringcoupons with id less than max_id
+ +#### Response +List of coupons + +
+[{
+    "id": 1,
+    "name": "5% off order total",
+    "type": "per_item_discount",
+    "amount": "5.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "4F75AF0C3802D39",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": {
+        "countries": ["AU"]
+    },
+    "shipping_methods": null
+}, {
+    "id": 2,
+    "name": "10% off order total",
+    "type": "per_item_discount",
+    "amount": "10.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "CBD1455FDA13815",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": {
+        "states": {
+            "AU": ["", "Australian Capital Territory"]
+        }
+    },
+    "shipping_methods": null
+}, {
+    "id": 3,
+    "name": "Free shipping",
+    "type": "free_shipping",
+    "amount": "0.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "7E97D5F3F75FA2D",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": {
+        "zips": {
+            "AU": ["2000", "20??"]
+        }
+    },
+    "shipping_methods": null
+}, {
+    "id": 4,
+    "name": "$5 off shipping",
+    "type": "shipping_discount",
+    "amount": "5.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "DC0C1CC8807DAC8",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": null,
+    "shipping_methods": null
+}, {
+    "id": 5,
+    "name": "only for shipping_flatrate",
+    "type": "0",
+    "amount": "0.0000",
+    "min_purchase": "100.0000",
+    "expires": "Thu, 31 Jan 2013 00:00:00 +0000",
+    "enabled": false,
+    "code": "shippingFlatrate-2",
+    "applies_to": {
+        "entity": "products",
+        "ids": [32]
+    },
+    "num_uses": 0,
+    "max_uses": 10,
+    "max_uses_per_customer": 0,
+    "restricted_to": null,
+    "shipping_methods": ["shipping_flatrate"]
+}]
+
+ +### POST coupons.json +Create coupons in a store + +#### Request +The POST request allows following fields. Mandatory fields are in bold. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldTypedescription
namestringThe name of the coupon.
codestringThe coupon code which customers will use to receive their discounts. Must be Unique.
typeenumThe coupon type field is an enumerated field and a value from the following list should be used. +
  • per_item_discount
  • +
  • per_total_discount
  • +
  • shipping_discount
  • +
  • free_shipping
  • +
  • percentage_discount
  • +
+
amountdecimalThe amount is a decimal field which can either be the monetary discount to be applied to an order or a percentage discount to be applied to an order. The type of this field is determined by the coupon type.
min_purchasedecimalThis is a decimal field which specifies the minimum value an order must have before the coupon can be applied to it.
enabledbooleanTrue, if coupon is enabled. False otherwise.
expiresdateThis is a date field which specifies when a coupon expires. Coupons need not have an expiry date as you can also control expiry via max_uses and max_uses_per_customer. The date field must be formatted as per [RFC-2822](http://tools.ietf.org/html/rfc2822#section-3.3).
applies_toobjectThis object provides +
    +
  • ability to restrict a coupon to an entity type (category/product)
  • +
  • and ability to restrict a coupon specific categories/products, where 0 is all categories/products.
  • +
+
num_usesintegerNumber of times this coupon has been used. This is a readonly field and can't be changed via PUT or POST.
max_usesintegerMaximum number of times this coupon can be used.
max_uses_per_customerintegerMaximum number of times each customer can use this coupon.
restricted_toarrayThis field provides the ability to restrict coupon usage based on locations as follows +
    +
  • If a coupon is restricted by country then a list of ISO2 country codes is provided. To retrieve these you can do a GET request on /countries.json endpoint. +
    +"restricted_to": {
    +    "countries": ["AU"]
    +}
    +
    +
  • +
  • If a coupon is restricted by states then a list of state names is provided indexed by the ISO2 country code for each country. To retrieve these you can do a GET request on /countries.json endpoint and then a GET request on /countries/:id/states.json endpoint. +
    +"restricted_to": {
    +    "states": {
    +        "AU": ["Australian Capital Territory"]
    +    }
    +}
    +
    +
  • +
  • If a coupon is restricted by zip codes then a list of zip codes indexed by the ISO2 country code for each country is provided as follows. Please refer to this [KB article](http://www.viewkb.com/inlinehelp.php?searchOverride=86&tplHeader=Bigcommerce&helpid=850) +
    +"restricted_to": {
    +    "zips": {
    +        "AU": ["2000", "20??"]
    +    }
    +}
    +
    +
  • +
+
shipping_methodsarrayThis is a list of shipping method names. If a shipping method isn't enabled on the store it can't be used to with a coupon. To check which shipping methods are enabled please do a GET request on the /shippingmethods.json endpoint.
+ +#### Response +Creates a coupon +
+{
+    "id": 1,
+    "name": "5% off order total",
+    "type": "per_item_discount",
+    "amount": "5.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "4F75AF0C3802D39",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": null,
+    "shipping_methods": null
+}
+
+ + +### GET coupons/id.json +GET a customer from a store + +#### Request +This GET request does not take any parameters. + +#### Response +coupon by ID + +
+{
+    "id": 1,
+    "name": "5% off order total",
+    "type": "per_item_discount",
+    "amount": "5.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "4F75AF0C3802D39",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": null,
+    "shipping_methods": null
+}
+
+ +### PUT coupons/id.json +UPDATE a coupon from a store + +#### Request +This PUT request can take any field that the POST request takes with the exception of the _id_ field as its _readonly_. All fields are optional thus allowing the ability to only PUT those fields that you wish to update. Please refer to the POST section of this document for an explanation of all the fields. + +#### Response +A successful put udpates a coupon in the store and responds with the entire coupon metadata + +
+{
+    "id": 1,
+    "name": "5% off order total",
+    "type": "per_item_discount",
+    "amount": "5.0000",
+    "min_purchase": "0.0000",
+    "expires": "",
+    "enabled": true,
+    "code": "4F75AF0C3802D39",
+    "applies_to": {
+        "entity": "categories",
+        "ids": [0]
+    },
+    "num_uses": 0,
+    "max_uses": 0,
+    "max_uses_per_customer": 0,
+    "restricted_to": null,
+    "shipping_methods": null
+}
+
+ + +### DELETE coupons/id.json + +#### Request + +#### Response + + From 6438e9a3ee444b3e3d28d56565c4bf6e9f7d43f7 Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Wed, 30 Jan 2013 14:53:34 +1100 Subject: [PATCH 03/37] fixed href syntax --- resources/coupons.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/coupons.md b/resources/coupons.md index 437ac51..e1f2438 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -259,7 +259,7 @@ The POST request allows following fields. Mandatory fields are in bold. expires date - This is a date field which specifies when a coupon expires. Coupons need not have an expiry date as you can also control expiry via max_uses and max_uses_per_customer. The date field must be formatted as per [RFC-2822](http://tools.ietf.org/html/rfc2822#section-3.3). + This is a date field which specifies when a coupon expires. Coupons need not have an expiry date as you can also control expiry via max_uses and max_uses_per_customer. The date field must be formatted as per RFC-2822. @@ -312,7 +312,7 @@ The POST request allows following fields. Mandatory fields are in bold. }
-
  • If a coupon is restricted by zip codes then a list of zip codes indexed by the ISO2 country code for each country is provided as follows. Please refer to this [KB article](http://www.viewkb.com/inlinehelp.php?searchOverride=86&tplHeader=Bigcommerce&helpid=850) +
  • If a coupon is restricted by zip codes then a list of zip codes indexed by the ISO2 country code for each country is provided as follows. Please refer to this KB article
     "restricted_to": {
         "zips": {
    
    From 8d55e726837fd7e0fc5f8dbceca3ce4de54b5561 Mon Sep 17 00:00:00 2001
    From: Chaitanya Kuber 
    Date: Wed, 30 Jan 2013 14:55:13 +1100
    Subject: [PATCH 04/37] added info on delete action
    
    ---
     resources/coupons.md | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/resources/coupons.md b/resources/coupons.md
    index e1f2438..6247f28 100644
    --- a/resources/coupons.md
    +++ b/resources/coupons.md
    @@ -422,10 +422,11 @@ A successful put udpates a coupon in the store and responds with the entire coup
     
    -### DELETE coupons/id.json +Here are resources to delete coupons. This is a destructive operation. Remember that you cannot recover deleted coupons. -#### Request - -#### Response +### DELETE coupons.json +DELETE all coupons +### DELETE coupons/id.json +DELETE a coupon From e6d328ca55e96a5096b5af7433fcd164a5a36f9c Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Mon, 11 Feb 2013 22:59:34 +1100 Subject: [PATCH 05/37] removed extraneous entry --- resources/coupons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/coupons.md b/resources/coupons.md index 6247f28..26fa832 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -132,7 +132,7 @@ List of coupons "max_uses_per_customer": 0, "restricted_to": { "states": { - "AU": ["", "Australian Capital Territory"] + "AU": [Australian Capital Territory"] } }, "shipping_methods": null From ff8c1ef6ecb2e94898829a692503b4c2ab21f2a1 Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Mon, 11 Feb 2013 23:01:06 +1100 Subject: [PATCH 06/37] changed /shippingmethods.json to /shipping/methods.json --- resources/coupons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/coupons.md b/resources/coupons.md index 26fa832..6c685e7 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -328,7 +328,7 @@ The POST request allows following fields. Mandatory fields are in bold. shipping_methods array - This is a list of shipping method names. If a shipping method isn't enabled on the store it can't be used to with a coupon. To check which shipping methods are enabled please do a GET request on the /shippingmethods.json endpoint. + This is a list of shipping method names. If a shipping method isn't enabled on the store it can't be used to with a coupon. To check which shipping methods are enabled please do a GET request on the /shipping/methods.json endpoint. From ba72e982b856f4311b3068df147d9b0ea20e1fbe Mon Sep 17 00:00:00 2001 From: Saranyan Date: Mon, 11 Feb 2013 16:26:51 -0600 Subject: [PATCH 07/37] Update resources/products.md Added limit and page fields --- resources/products.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/products.md b/resources/products.md index 4ca9887..48e9d84 100644 --- a/resources/products.md +++ b/resources/products.md @@ -66,6 +66,18 @@ These fields can be used to filter the query. By default, without any filters, t The maximum ID of the product + + limit + integer + + The number of products your query should return (the max is 200 per page) + + + page + integer + + The page number of the results. If you have say 300 products, you can use the page=1&limit=200 to get the first 200 products and increment the page counter to get the next 100. + name string From 76a6b36ebe05edcf41195cd9a31881b26f9d47cb Mon Sep 17 00:00:00 2001 From: Saranyan Vigraham Date: Thu, 14 Feb 2013 11:08:07 -0600 Subject: [PATCH 08/37] webhooks --- webhooks/event_triggers.md | 79 +++++++++++++++++++++++++ webhooks/images/webhooks_provision.png | Bin 0 -> 76107 bytes webhooks/quickstart.md | 62 +++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 webhooks/event_triggers.md create mode 100644 webhooks/images/webhooks_provision.png create mode 100644 webhooks/quickstart.md diff --git a/webhooks/event_triggers.md b/webhooks/event_triggers.md new file mode 100644 index 0000000..0d5c06e --- /dev/null +++ b/webhooks/event_triggers.md @@ -0,0 +1,79 @@ +# Events Triggers + +## Products + +### store/product/created + +- When a product is created from the control panel +- When a product is created from product import +- When a product is created via the API + +### store/product/updated + +- When a product is changed in the control panel +- When a product is updated via the API +- When a product is updated from product import. Explicitly including the following fields: + * brand + * product type + * category + * inventory + * number sold + * availability + * thumbnail + * visibility + * featured + * name + * description + * sort order + * price + * dimensions + * condition + * tax price + * url +- When a review is added to a product +- When product inventory is changed in stone edge module +- When product inventory is changed because of a purchase + +__Note**__ _At this point in time, changes timeo product options will not trigger a store/product/updated event._ + + +### store/product/deleted + +- When a product is deleted from the control panel + +## Customers + +### store/customer/created + +- When a customer is created in the control panel + +### store/customer/updated + +- When a customer is updated in the control panel + +### store/customer/deleted + +- When a customer is deleted in the control panel + +## Orders + +### store/orders/created + +- When an order is created via checkout +- When a manual order is created via the control panel + +### store/orders/updated + +- When an order is updated via the control panel +- When the order status is updated via the control panel +- When the order status is updated via the API + +### store/orders/archived + +- When the order is archived from the control panel + +## Store + +### store/app/uninstalled + +- When the store has been removed from the system \ No newline at end of file diff --git a/webhooks/images/webhooks_provision.png b/webhooks/images/webhooks_provision.png new file mode 100644 index 0000000000000000000000000000000000000000..afad7bd9a854cc9a920b1627528200125170cddc GIT binary patch literal 76107 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 Q1n?&(tt3??VI1 + curl -XPOST -d '{"client_id":"client123","client_secret":"client123secret","user":"admin","token":"xxxx","store_domain":"https://store-xxxx.mybigcommerce.com/"}' https://bc-hooks-manager-staging.herokuapp.com/token + + +This will provide a response that contains the access_token and a producer, which is a store id. + +
     {"access_token":"12345","producer":"store/foobar123"} 
    + +### Events + +To subscribe to events you would make a POST request with the following fields - producer, scope, deliverymethod, destination. You also need to define two header fields X_AUTH_CLIENT_ID whose value will be the client_id you generated for your app via the dev portal (look above) and X_AUTH_TOKEN which has the above generated access_token's value. + +
    +    curl -XPOST -d '{"producer":"store/xxxx","scope":"products/*","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://bc-hooks-manager-staging.herokuapp.com
    +
    + +The above example demonstrates how you can subscribe for product updates. Make a note of the "destination" field in the request. This is a JSON object containing a "url" field. Make sure you point this to the location where Bigcommerce sends you notifications. If everything goes well, you will see the following response - + +
    +    {"client_id":"client123","created_at":"2013-02-12T17:33:04+00:00","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"},"id":33,"producer":"store/xxxx","scope":"products/*","updated_at":"2013-02-12T17:33:04+00:00"}
    +
    + +### Things to remember regarding Payload + +1. Bigcommerce sends you the minimum required details regarding the events that got triggered. It is your responsibility to handle that externally in your application. For instance, we will send you details indicating that a product was updated, and you might want to handle it by fetching the new product via an API call. +2. Bulk data imports will trigger the relevant events for every record affected. For example, if you have a hook on store/product/create and then the merchant imports 2,000 products, then there will be 2,000 event postbacks. +3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they can call a replay method to get the missing events. From 84f817da5b09b2f99f0ec7774806b150b17b63b3 Mon Sep 17 00:00:00 2001 From: troycox Date: Fri, 15 Feb 2013 08:45:17 +1100 Subject: [PATCH 09/37] Update webhooks/quickstart.md --- webhooks/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index fc4e547..8ba3302 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -1,5 +1,5 @@ ## Bigcommerce Webhooks Quickstart -This document prevents an overview on what webhooks are and how how you can use it with a Bigcommerce store. +This document presents an overview on what webhooks are and how how you can use it with a Bigcommerce store. ### Webhooks Think push notification for the web. Assume you want to track various events that occurs in a Bigcommerce store - checkout, order, price change, shipping events, etc. You might have built a kick-ass backend service that can act on these events and run some sort of script and analytics. Webhooks enable you to accomplish this. From f7b305c2f32a266e8ee455bcadb98a7c73e6da29 Mon Sep 17 00:00:00 2001 From: troycox Date: Fri, 15 Feb 2013 09:39:17 +1100 Subject: [PATCH 10/37] Update webhooks/quickstart.md Fixed a bunch of typos and made a few minor edits. --- webhooks/quickstart.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index fc4e547..a2ec8e2 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -1,49 +1,50 @@ ## Bigcommerce Webhooks Quickstart -This document prevents an overview on what webhooks are and how how you can use it with a Bigcommerce store. +This document prevents an overview on what webhooks are and how you can use it with a Bigcommerce store. ### Webhooks -Think push notification for the web. Assume you want to track various events that occurs in a Bigcommerce store - checkout, order, price change, shipping events, etc. You might have built a kick-ass backend service that can act on these events and run some sort of script and analytics. Webhooks enable you to accomplish this. +Think push notification for the web. Assume you want to track various events that occur in a Bigcommerce store - checkout, order, price change, shipping events, etc. You might have built a kick-ass backend service that can act on these events and run some sort of script and analytics. Webhooks enable you to accomplish this. -In a nutshell, you are telling Bigcommerce to notify you when an event occurs in a Bigcommerce store. For this notification to be successful, you provide a script hosted on your webservers (it maybe part of your already existing web app). +In a nutshell, you are telling Bigcommerce to notify you when an event occurs in a Bigcommerce store. For this notification to be successful, you provide a script hosted on your web servers (potentially being part of your existing web app). #### Endpoint -Currently the staging endpoint for webhooks is at https://bc-hooks-manager-staging.herokuapp.com +Currently the beta test endpoint for webhooks is at https://bc-hooks-manager-staging.herokuapp.com -#### Events/Scopes available -1. store/order/* +#### Events/Scopes currently available +1. store/order/* (all events on the order resource) 2. store/order/created 3. store/order/updated 4. store/order/archived 5. store/order/statusUpdated -6. store/product/* +6. store/product/* (all events on the product resource) 7. store/product/created 8. store/product/updated 9. store/product/deleted +10. store/customer/* (all events on the customer resource) 10. store/customer/created 11. store/customer/updated 12. store/customer/deleted 13. store/app/uninstalled ### Provisioning webhooks -Currently webhoooks access is by invite only. If you have a strong use case and require access to webhooks, please get in touch with us. When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. +Currently webhoooks is in beta and access is by invite only. If you have a strong use case and require access to webhooks, please get in touch with us. When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. ![Image](images/webhooks_provision.png?raw=true) A client ID and secret will be created for you in your dashboard as shown in the screenshot above. -Once you have provisioned webhooks, you can start subscribing for events from the above events list. However, before doing that, you need an 'access_token'. You can generate the access token via a POST request on the /token endpoint. The POST request will contain the fields - client_id, client_secret, user, token, store_domain. The client_id and client_secret are provided to you by the dev portal where as user, token and store_domain are your API credentials that you have traditionally used to make API requests. +Once you have provisioned webhooks, you can start subscribing to events from the above events list. However, before doing that, you need an 'access_token'. You can generate the access token via a POST request on the /token endpoint. The POST request will contain the fields - client_id, client_secret, user, token, store_domain. The client_id and client_secret are provided to you by the dev portal where as user, token and store_domain are your API credentials that you have traditionally used to make API requests.
        curl -XPOST -d '{"client_id":"client123","client_secret":"client123secret","user":"admin","token":"xxxx","store_domain":"https://store-xxxx.mybigcommerce.com/"}' https://bc-hooks-manager-staging.herokuapp.com/token 
     
    -This will provide a response that contains the access_token and a producer, which is a store id. +This will provide a response that contains the access_token and a producer, which is the same as the store id.
     {"access_token":"12345","producer":"store/foobar123"} 
    ### Events -To subscribe to events you would make a POST request with the following fields - producer, scope, deliverymethod, destination. You also need to define two header fields X_AUTH_CLIENT_ID whose value will be the client_id you generated for your app via the dev portal (look above) and X_AUTH_TOKEN which has the above generated access_token's value. +To subscribe to events you would make a POST request with the following fields - producer, scope, deliverymethod, destination. You also need to define two header fields X_AUTH_CLIENT_ID whose value will be the client_id you generated for your app via the Dev Portal (as described above) and X_AUTH_TOKEN which has the above generated access_token's value.
         curl -XPOST -d '{"producer":"store/xxxx","scope":"products/*","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://bc-hooks-manager-staging.herokuapp.com
    @@ -57,6 +58,6 @@ The above example demonstrates how you can subscribe for product updates. Make a
     
     ### Things to remember regarding Payload
     
    -1. Bigcommerce sends you the minimum required details regarding the events that got triggered. It is your responsibility to handle that externally in your application. For instance, we will send you details indicating that a product was updated, and you might want to handle it by fetching the new product via an API call.
    +1. In the postback, we send a light payload with only minimum details regarding the events that got triggered. It's up to you how you want to handle the notification in your application. For instance, we will send you details indicating that a product was updated, and you might want to handle it by fetching the new product via an API call.
     2. Bulk data imports will trigger the relevant events for every record affected. For example, if you have a hook on store/product/create and then the merchant imports 2,000 products, then there will be 2,000 event postbacks. 
    -3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they can call a replay method to get the missing events. 
    +3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they, via a futuer update, you will be able call a replay method to get the missing events. 
    
    From 749383b484d09ac1640cd97da792856c500d108d Mon Sep 17 00:00:00 2001
    From: troycox 
    Date: Fri, 15 Feb 2013 10:07:48 +1100
    Subject: [PATCH 11/37] Update webhooks/event_triggers.md
    
    Minor edits to the copy
    ---
     webhooks/event_triggers.md | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/webhooks/event_triggers.md b/webhooks/event_triggers.md
    index 0d5c06e..fd874ad 100644
    --- a/webhooks/event_triggers.md
    +++ b/webhooks/event_triggers.md
    @@ -31,15 +31,16 @@
       * tax price
       * url
     - When a review is added to a product
    -- When product inventory is changed in stone edge module
    -- When product inventory is changed because of a purchase
    +- When product inventory is changed via the Stone Edge module
    +- When product inventory is changed as a result of a purchase
     
    -__Note**__ _At this point in time, changes timeo product options will not trigger a store/product/updated event._
    +__Note**__ _At this point in time, changes to product options will not trigger a store/product/updated event._
     
     
     ### store/product/deleted
     
     - When a product is deleted from the control panel
    +- When a product is deleted via the API
     
     ## Customers
     
    @@ -76,4 +77,4 @@ __Note**__ _At this point in time, changes timeo product options will not trigge
     
     ### store/app/uninstalled
     
    -- When the store has been removed from the system
    \ No newline at end of file
    +- When the store has been removed from the system
    
    From 294cc35bf23d941fc2d7ce20f48e0ae624a0546e Mon Sep 17 00:00:00 2001
    From: Qamal KS 
    Date: Fri, 15 Feb 2013 15:10:08 +1100
    Subject: [PATCH 12/37] Update webhooks/quickstart.md
    
    Changed references to staging to hooks-beta.bigcommerce.com
    ---
     webhooks/quickstart.md | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md
    index eadcfa2..60158a8 100644
    --- a/webhooks/quickstart.md
    +++ b/webhooks/quickstart.md
    @@ -8,7 +8,7 @@ Think push notification for the web. Assume you want to track various events tha
     In a nutshell, you are telling Bigcommerce to notify you when an event occurs in a Bigcommerce store. For this notification to be successful, you provide a script hosted on your web servers (potentially being part of your existing web app).
     
     #### Endpoint
    -Currently the beta test endpoint for webhooks is at https://bc-hooks-manager-staging.herokuapp.com
    +Currently the beta test endpoint for webhooks is at https://hooks-beta.bigcommerce.com
     
     #### Events/Scopes currently available
     1. store/order/* (all events on the order resource)
    @@ -36,7 +36,7 @@ A client ID and secret will be created for you in your dashboard as shown in the
     Once you have provisioned webhooks, you can start subscribing to events from the above events list. However, before doing that, you need an 'access_token'. You can generate the access token via a POST request on the /token endpoint. The POST request will contain the fields - client_id, client_secret, user, token, store_domain. The client_id and client_secret are provided to you by the dev portal where as user, token and store_domain are your API credentials that you have traditionally used to make API requests.
     
     
    -   curl -XPOST -d '{"client_id":"client123","client_secret":"client123secret","user":"admin","token":"xxxx","store_domain":"https://store-xxxx.mybigcommerce.com/"}' https://bc-hooks-manager-staging.herokuapp.com/token 
    +   curl -XPOST -d '{"client_id":"client123","client_secret":"client123secret","user":"admin","token":"xxxx","store_domain":"https://store-xxxx.mybigcommerce.com/"}' https://hooks-beta.bigcommerce.com/token 
     
    This will provide a response that contains the access_token and a producer, which is the same as the store id. @@ -48,7 +48,7 @@ This will provide a response that contains the access_token and a producer, whic To subscribe to events you would make a POST request with the following fields - producer, scope, deliverymethod, destination. You also need to define two header fields X_AUTH_CLIENT_ID whose value will be the client_id you generated for your app via the Dev Portal (as described above) and X_AUTH_TOKEN which has the above generated access_token's value.
    -    curl -XPOST -d '{"producer":"store/xxxx","scope":"products/*","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://bc-hooks-manager-staging.herokuapp.com
    +    curl -XPOST -d '{"producer":"store/xxxx","scope":"products/*","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://hooks-beta.bigcommerce.com
     
    The above example demonstrates how you can subscribe for product updates. Make a note of the "destination" field in the request. This is a JSON object containing a "url" field. Make sure you point this to the location where Bigcommerce sends you notifications. If everything goes well, you will see the following response - From 1e9141f8a1e461c15ecc4f9dee5e8ddf554657a5 Mon Sep 17 00:00:00 2001 From: troycox Date: Sat, 16 Feb 2013 11:33:00 +1100 Subject: [PATCH 13/37] Update webhooks/quickstart.md Moved the beta notice to the very top to make it clear that webhooks is currently in beta. --- webhooks/quickstart.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index 60158a8..16d704d 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -1,6 +1,7 @@ ## Bigcommerce Webhooks Quickstart -======= -This document presents an overview on what webhooks are and how how you can use it with a Bigcommerce store. + +#### Currently in beta +Webhoooks is currently in beta and access is by invite only. If you have a strong use case and require access to webhooks, please get in touch with us. ### Webhooks Think push notification for the web. Assume you want to track various events that occur in a Bigcommerce store - checkout, order, price change, shipping events, etc. You might have built a kick-ass backend service that can act on these events and run some sort of script and analytics. Webhooks enable you to accomplish this. @@ -27,7 +28,7 @@ Currently the beta test endpoint for webhooks is at https://hooks-beta.bigcommer 13. store/app/uninstalled ### Provisioning webhooks -Currently webhoooks is in beta and access is by invite only. If you have a strong use case and require access to webhooks, please get in touch with us. When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. +When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. ![Image](images/webhooks_provision.png?raw=true) From c254d15993100782035561ec2c09151368e030f2 Mon Sep 17 00:00:00 2001 From: troycox Date: Sat, 16 Feb 2013 11:41:49 +1100 Subject: [PATCH 14/37] Update webhooks/quickstart.md In the Event Scopes section, I've attempted to include a link to the Event Triggers page. You may want to check it to make sure it's correct. --- webhooks/quickstart.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index 60158a8..e2bb01f 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -26,6 +26,8 @@ Currently the beta test endpoint for webhooks is at https://hooks-beta.bigcommer 12. store/customer/deleted 13. store/app/uninstalled +This page describes in detail the specific triggers for each of the event scopes. + ### Provisioning webhooks Currently webhoooks is in beta and access is by invite only. If you have a strong use case and require access to webhooks, please get in touch with us. When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. @@ -61,4 +63,4 @@ The above example demonstrates how you can subscribe for product updates. Make a 1. In the postback, we send a light payload with only minimum details regarding the events that got triggered. It's up to you how you want to handle the notification in your application. For instance, we will send you details indicating that a product was updated, and you might want to handle it by fetching the new product via an API call. 2. Bulk data imports will trigger the relevant events for every record affected. For example, if you have a hook on store/product/create and then the merchant imports 2,000 products, then there will be 2,000 event postbacks. -3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they, via a futuer update, you will be able call a replay method to get the missing events. +3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they, via a future update, you will be able call a replay method to get the missing events. From 071022261e6ebd2d27cc120e56cc5712df3e4ebf Mon Sep 17 00:00:00 2001 From: Saranyan Vigraham Date: Mon, 18 Feb 2013 07:45:41 -0600 Subject: [PATCH 15/37] updated route --- webhooks/quickstart.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index b74ed7f..baa8980 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -27,7 +27,7 @@ Currently the beta test endpoint for webhooks is at https://hooks-beta.bigcommer 12. store/customer/deleted 13. store/app/uninstalled -This page describes in detail the specific triggers for each of the event scopes. +This page describes in detail the specific triggers for each of the event scopes. ### Provisioning webhooks When you navigate to https://devportal.bigcommerce.com/beta/wehooks you will be able to provision webhooks for your account. From 466fdd0058ac8af7b6e2102232f938ea2b521aa4 Mon Sep 17 00:00:00 2001 From: Saranyan Date: Tue, 19 Feb 2013 09:31:11 -0600 Subject: [PATCH 16/37] Update webhooks/event_triggers.md Headings - making the layout consistent --- webhooks/event_triggers.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/webhooks/event_triggers.md b/webhooks/event_triggers.md index fd874ad..c803e38 100644 --- a/webhooks/event_triggers.md +++ b/webhooks/event_triggers.md @@ -1,14 +1,14 @@ -# Events Triggers +## Events Triggers -## Products +### Products -### store/product/created +#### store/product/created - When a product is created from the control panel - When a product is created from product import - When a product is created via the API -### store/product/updated +#### store/product/updated - When a product is changed in the control panel - When a product is updated via the API @@ -37,44 +37,44 @@ __Note**__ _At this point in time, changes to product options will not trigger a store/product/updated event._ -### store/product/deleted +#### store/product/deleted - When a product is deleted from the control panel - When a product is deleted via the API -## Customers +### Customers -### store/customer/created +#### store/customer/created - When a customer is created in the control panel -### store/customer/updated +#### store/customer/updated - When a customer is updated in the control panel -### store/customer/deleted +#### store/customer/deleted - When a customer is deleted in the control panel -## Orders +### Orders -### store/orders/created +#### store/orders/created - When an order is created via checkout - When a manual order is created via the control panel -### store/orders/updated +#### store/orders/updated - When an order is updated via the control panel - When the order status is updated via the control panel - When the order status is updated via the API -### store/orders/archived +#### store/orders/archived - When the order is archived from the control panel -## Store +### Store -### store/app/uninstalled +#### store/app/uninstalled - When the store has been removed from the system From cd7a668b4fa99ab50f33fd002f0ddfaaf944cb7d Mon Sep 17 00:00:00 2001 From: troycox Date: Fri, 22 Feb 2013 10:58:19 +1100 Subject: [PATCH 17/37] Update resources/products/images.md Added PUT to the navigation at the top of the page --- resources/products/images.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/products/images.md b/resources/products/images.md index b411cbe..4c7537c 100644 --- a/resources/products/images.md +++ b/resources/products/images.md @@ -19,6 +19,10 @@ GET /products/id/images/id.json + + + PUT /products/id/images/id.json + GET /products/id/images/count.json @@ -241,4 +245,4 @@ Returns the number of product images in the store DELETE all product images ### DELETE products/id/images/id.json -DELETE an product image \ No newline at end of file +DELETE an product image From 8caa33040207dab94822a759836726951cf4d382 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Mon, 25 Feb 2013 13:46:38 +1100 Subject: [PATCH 18/37] Update resources/store.md --- resources/store.md | 86 +++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/resources/store.md b/resources/store.md index 8a27afe..e1c95d1 100644 --- a/resources/store.md +++ b/resources/store.md @@ -1,43 +1,43 @@ -## Resources - - - - - - - - - - - - - -
    Resource
    GET /store.json
    - -## Description -### GET store.json -Store information resource. - -Provides basic metadata about a store’s identity, and default settings. - -#### Request -There are no filters accepted on this request - - -#### Response -Store resource -
    -{
    -	"hosting_id": "store-1234",
    -	"domain": "mystore.com",
    -	"name": "My Store",
    -	"address": "13170 Round Bluff Crossing, St. Benedict, Texas, 77174-3311",
    -	"phone": "(254) 923-8162",
    -	"admin_email": "admin@mystore.com",
    -	"order_email": "orders@mystore.com",
    -	"language": "en",
    -	"currency": "USD",
    -	"weight_units": "LBS",
    -	"dimension_units": "Inches"
    -}
    -
    +## Resources + + + + + + + + + + + + + +
    Resource
    GET /store.json
    + +## Description +### GET store.json +Store information resource. + +Provides basic metadata about a store’s identity, and default settings. + +#### Request +There are no filters accepted on this request + + +#### Response +Store resource +
    +{
    +	"id": "store-1234",
    +	"domain": "mystore.com",
    +	"name": "My Store",
    +	"address": "13170 Round Bluff Crossing, St. Benedict, Texas, 77174-3311",
    +	"phone": "(254) 923-8162",
    +	"admin_email": "admin@mystore.com",
    +	"order_email": "orders@mystore.com",
    +	"language": "en",
    +	"currency": "USD",
    +	"weight_units": "LBS",
    +	"dimension_units": "Inches"
    +}
    +
    From 2622842ae7f37a9e409bbe7532f98f5b8aacab9c Mon Sep 17 00:00:00 2001 From: troycox Date: Thu, 28 Feb 2013 12:48:49 +1100 Subject: [PATCH 19/37] Update webhooks/quickstart.md Added a bunch of new events with a 'coming soon' label. --- webhooks/quickstart.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index baa8980..b2cd3a7 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -21,6 +21,13 @@ Currently the beta test endpoint for webhooks is at https://hooks-beta.bigcommer 7. store/product/created 8. store/product/updated 9. store/product/deleted +10. store/product/lowStockReached (coming soon) +11. store/product/outOfStock (coming soon) +12. store/product/productBackInStock (coming soon) +13. store/product/stockLevelChanged (coming soon) +14. store/product/addedToCart (coming soon) +15. store/product/removedFromCart (coming soon) +16. store/product/ordered (coming soon) 10. store/customer/* (all events on the customer resource) 10. store/customer/created 11. store/customer/updated From cef8e0d28d9ec7485ab65c53e83e248c8fb0fadc Mon Sep 17 00:00:00 2001 From: troycox Date: Sun, 3 Mar 2013 07:30:32 +1100 Subject: [PATCH 20/37] Update shipments.md Added 'PUT' to the table of contents at the top of the page. --- resources/orders/shipments.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/orders/shipments.md b/resources/orders/shipments.md index 08f9b89..4f5f307 100644 --- a/resources/orders/shipments.md +++ b/resources/orders/shipments.md @@ -19,6 +19,10 @@ GET /orders/id/shipments/id.json + + + PUT /orders/id/shipments/id.json + GET /orders/id/shipments/count.json @@ -390,4 +394,4 @@ Returns the number of order shipments in the store DELETE all order shipments ### DELETE orders/id/shipments/id.json -DELETE an order shipment \ No newline at end of file +DELETE an order shipment From cd23de06864e836fe3c64fb51536941a9fdd750b Mon Sep 17 00:00:00 2001 From: Saranyan Vigraham Date: Mon, 4 Mar 2013 07:23:55 -0600 Subject: [PATCH 21/37] broken link --- resources/coupons.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/coupons.md b/resources/coupons.md index 6c685e7..24adb11 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -7,14 +7,14 @@ - GET /coupons.json + GET /coupons.json - GET /coupons/id.json + GET /coupons/id.json - POST /coupons.json + POST /coupons.json From f87c26bbcbf370fd62b1d9191d28fb22c55e8b5a Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Tue, 5 Mar 2013 06:09:48 +1100 Subject: [PATCH 22/37] added missing quote` --- resources/coupons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/coupons.md b/resources/coupons.md index 24adb11..238c706 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -132,7 +132,7 @@ List of coupons "max_uses_per_customer": 0, "restricted_to": { "states": { - "AU": [Australian Capital Territory"] + "AU": ["Australian Capital Territory"] } }, "shipping_methods": null From eadeb556b68114aee5dcc27f37ae87e96e932af6 Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Tue, 5 Mar 2013 07:21:59 +1100 Subject: [PATCH 23/37] added new documentation for /shipping/methods.json endpoint fixed a typo in the documentation for the coupons endpoint --- resources/coupons.md | 2 +- resources/shipping/methods.md | 86 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 resources/shipping/methods.md diff --git a/resources/coupons.md b/resources/coupons.md index 238c706..2c602d2 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -360,7 +360,7 @@ Creates a coupon ### GET coupons/id.json -GET a customer from a store +GET a coupon from a store #### Request This GET request does not take any parameters. diff --git a/resources/shipping/methods.md b/resources/shipping/methods.md new file mode 100644 index 0000000..5601414 --- /dev/null +++ b/resources/shipping/methods.md @@ -0,0 +1,86 @@ +## Resources + + + + + + + + + + + + +## Description +### GET /shipping/methods.json +GET configured shipping methods from a store + +#### Request +These fields can be used to filter the query. By default, without any filters, the GET request returns all the customers. + +
    Resource
    GET /shipping/methods.json
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypedescription
    idintegercoupon id
    namestringdisplay name for shipping method
    method_namestringshipping method name
    min_idstringmethods with id greater than min_id
    max_idstringmethods with id less than max_id
    + + +#### Response +List of shipping methods + +
    +[{
    +    "id": 1,
    +    "name": "Australia Post",
    +    "method_name": "shipping_auspost"
    +}]
    +
    + +### GET /shipping/methods/id.json +GET a shipping method from a store + +#### Request +This GET request does not take any parameters. + +#### Response +shipping method by ID + +
    +[{
    +    "id": 1,
    +    "name": "Australia Post",
    +    "method_name": "shipping_auspost"
    +}]
    +
    + From 87e340836523775e925d3581ec19ced6a5a2f4aa Mon Sep 17 00:00:00 2001 From: Chaitanya Kuber Date: Tue, 5 Mar 2013 07:27:23 +1100 Subject: [PATCH 24/37] fixed copy-paste typos --- resources/coupons.md | 2 +- resources/shipping/methods.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/coupons.md b/resources/coupons.md index 2c602d2..29397d9 100644 --- a/resources/coupons.md +++ b/resources/coupons.md @@ -45,7 +45,7 @@ GET coupons from a store #### Request -These fields can be used to filter the query. By default, without any filters, the GET request returns all the customers. +These fields can be used to filter the query. By default, without any filters, the GET request returns all the coupons. diff --git a/resources/shipping/methods.md b/resources/shipping/methods.md index 5601414..dbd8fbc 100644 --- a/resources/shipping/methods.md +++ b/resources/shipping/methods.md @@ -16,7 +16,7 @@ GET configured shipping methods from a store #### Request -These fields can be used to filter the query. By default, without any filters, the GET request returns all the customers. +These fields can be used to filter the query. By default, without any filters, the GET request returns all the configured shipping methods.
    From 7a4e98491b9a7f92e69698ba2c3844b7fa833885 Mon Sep 17 00:00:00 2001 From: Qamal Kosim-Satyaputra Date: Thu, 7 Mar 2013 17:03:59 +1100 Subject: [PATCH 25/37] Added information about API endpoints --- webhooks/quickstart.md | 312 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 309 insertions(+), 3 deletions(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index baa8980..a148663 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -51,17 +51,323 @@ This will provide a response that contains the access_token and a producer, whic To subscribe to events you would make a POST request with the following fields - producer, scope, deliverymethod, destination. You also need to define two header fields X_AUTH_CLIENT_ID whose value will be the client_id you generated for your app via the Dev Portal (as described above) and X_AUTH_TOKEN which has the above generated access_token's value.
    -    curl -XPOST -d '{"producer":"store/xxxx","scope":"products/*","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://hooks-beta.bigcommerce.com
    +    curl -XPOST -d '{"producer":"store/xxxx","scope":"store/product/*","deliverymethod":"HTTP_POST","destination":{"url":"https://requestb.in/nf4nqbnf"}}' -H 'X_AUTH_CLIENT_ID: client123' -H 'X_AUTH_TOKEN: 12345' https://hooks-beta.bigcommerce.com
     
    The above example demonstrates how you can subscribe for product updates. Make a note of the "destination" field in the request. This is a JSON object containing a "url" field. Make sure you point this to the location where Bigcommerce sends you notifications. If everything goes well, you will see the following response -
    -    {"client_id":"client123","created_at":"2013-02-12T17:33:04+00:00","deliverymethod":"HTTP_POST","destination":{"url":"http://requestb.in/nf4nqbnf"},"id":33,"producer":"store/xxxx","scope":"products/*","updated_at":"2013-02-12T17:33:04+00:00"}
    +    {"client_id":"client123","created_at":"2013-02-12T17:33:04+00:00","deliverymethod":"HTTP_POST","destination":{"url":"https://requestb.in/nf4nqbnf"},"id":33,"producer":"store/xxxx","scope":"store/product/*","updated_at":"2013-02-12T17:33:04+00:00"}
     
    ### Things to remember regarding Payload 1. In the postback, we send a light payload with only minimum details regarding the events that got triggered. It's up to you how you want to handle the notification in your application. For instance, we will send you details indicating that a product was updated, and you might want to handle it by fetching the new product via an API call. 2. Bulk data imports will trigger the relevant events for every record affected. For example, if you have a hook on store/product/create and then the merchant imports 2,000 products, then there will be 2,000 event postbacks. -3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they, via a future update, you will be able call a replay method to get the missing events. +3. Payloads are serialized per hook per store. We are looking at enabling a replay feature down the road. What this means is, based on the serialized payload IDs, 3rd parties can detect if they've missed certain postbacks and then they, via a future update, you will be able call a replay method to get the missing events. + +## API Endpoints + +### Operations + +
    + + + + + + + + + + + + + + +
    VerbPathParam (query string)Operation
    POST/Create a new webhook
    GET/:idGet a detailed information for a webhook of a given :id
    PUT/:idUpdate a webhook of a given :id
    DELETE/:idDelete a webhook of a given :id
    GET/producer/:producerList all the webhook you have from a given :producer
    GET/producer/:producerscope=:scopeList all the webhook you have from a given :producer, filtered by :scope
    + +### Payload Fields + + + + + + + + + + + + + + + + + + + + +
    FieldTypeExampleDescription
    idinteger101The ID of the webhook
    producerstringstore/d34db33fThe identifier of the producer of the event (store)
    scopestringstore/product/*The event you are subscribing to in a "/" delimited path format. Accepts the * wildcard.
    client_id (read only)stringa85a54c8fae33b2eb3b9d563a4664992The client_id of the subscriber
    delivery_methodstringHTTP_POSTThe method of delivery for this webhook. At this moment we only support HTTP_POST.
    destinationobject{ + "headers": { + "X_AUTH_TOKEN": "d34db33f" + }, + "url": "https://superapp.com/webhook/orders" + }The destination of the subscriber. For HTTP_POST type of delivery we allow a "headers" object to be passed in for additional headers.
    created_at (read only)string2013-01-17T11:27:50+11:00The creation timestamp
    updated_at (read only)string2013-01-17T11:27:50+11:00The update timestamp
    + +## Create (POST) example + +#### Request POST / + +
    +POST / HTTP/1.1
    +Host: hooks-beta.bigcommerce.com
    +Content-Type: application/json
    +X_AUTH_CLIENT_ID: d34db33f
    +X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992
    +
    +{
    +	"producer": "store/74124",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	}
    +}
    +
    + +#### CURL +
    +curl -XPOST -d '{"producer":"store/74124","scope":"store/order/*","deliverymethod":"HTTP_POST","destination":{"headers":{"X_AUTH_TOKEN":"d34db33f"},"url":"https://superapp.com/webhook/orders"}}' -H 'X_AUTH_CLIENT_ID: d34db33f' -H 'X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992' https://hooks-beta.bigcommerce.com
    +
    +
    + +#### Response (success) + +
    +HTTP/1.1 200 Success
    +Content-Type: application/json
    +
    +{
    +	"id": 101,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-17T11:27:50+11:00"
    +}
    +
    + +In the case of failure the API endpoint will return with non 200 OK response code. + + + + +## Read (GET) example + +#### Request GET /:id + +
    +GET /101 HTTP/1.1
    +Host: hooks-beta.bigcommerce.com
    +Accept: application/json
    +X_AUTH_CLIENT_ID: d34db33f
    +X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992
    +
    + +#### CURL + +
    +curl -XGET -H 'X_AUTH_CLIENT_ID: d34db33f' -H 'X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992' https://hooks-beta.bigcommerce.com/1
    +
    + +#### Response (success) + +
    +HTTP/1.1 200 Success
    +Content-Type: application/json
    +
    +{
    +	"id": 101,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-17T11:27:50+11:00"
    +}
    +
    + + + + +## Update (PUT) example + +#### Request PUT /:id + +
    +PUT /101 HTTP/1.1
    +Host: hooks-beta.bigcommerce.com
    +Content-Type: application/json
    +X_AUTH_CLIENT_ID: d34db33f
    +X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992
    +
    +{
    +	"producer": "store/74124",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders_changed"
    +	}
    +}
    +
    + +#### CURL +
    +curl -XPUT -d '{"producer":"store/74124","scope":"store/order/*","deliverymethod":"HTTP_POST","destination":{"headers":{"X_AUTH_TOKEN":"d34db33f"},"url":"https://superapp.com/webhook/orders_changed"}}' -H 'X_AUTH_CLIENT_ID: d34db33f' -H 'X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992' https://hooks-beta.bigcommerce.com
    +
    +
    + +#### Response (success) + +
    +HTTP/1.1 200 Success
    +Content-Type: application/json
    +
    +{
    +	"id": 101,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders_changed"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-18T11:27:50+11:00"
    +}
    +
    + + + +## Delete (DELETE) example + +#### Request DELETE /:id + +
    +DELETE /101 HTTP/1.1
    +Host: hooks-beta.bigcommerce.com
    +Accept: application/json
    +X_AUTH_CLIENT_ID: d34db33f
    +X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992
    +
    + +#### CURL + +
    +curl -XDELETE -H 'X_AUTH_CLIENT_ID: d34db33f' -H 'X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992' https://hooks-beta.bigcommerce.com/1
    +
    + +#### Response (success) + +
    +HTTP/1.1 200 Success
    +Content-Type: application/json
    +
    +{
    +	"id": 101,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-17T11:27:50+11:00"
    +}
    +
    + + + +## Listing hooks by producer (GET) example + +#### Request GET /producer/:producer + +
    +GET /101 HTTP/1.1
    +Host: hooks-beta.bigcommerce.com
    +Accept: application/json	
    +X_AUTH_CLIENT_ID: d34db33f
    +X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992
    +
    + +#### CURL + +
    +curl -XGET -H 'X_AUTH_CLIENT_ID: d34db33f' -H 'X_AUTH_TOKEN: a85a54c8fae33b2eb3b9d563a4664992' https://hooks-beta.bigcommerce.com/producer/store/74124
    +
    + +#### Response (success) + +
    +HTTP/1.1 200 Success
    +Content-Type: application/json
    +
    +[{
    +	"id": 101,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/order/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-17T11:27:50+11:00"
    +},
    +{
    +	"id": 102,
    +	"producer": "store/74124",
    +	"client_id": "d34db33f",
    +	"scope": "store/product/*",
    +	"deliverymethod": "HTTP_POST",
    +	"destination": {
    +		"headers": {
    +			"X_AUTH_TOKEN": "d34db33f"
    +		},
    +		"url": "https://superapp.com/webhook/orders"
    +	},
    +	"created_at": "2013-01-17T11:27:50+11:00",
    +	"updated_at": "2013-01-17T11:27:50+11:00"
    +}]
    +
    + From 27671dc512f5c6aab1e7bbd31707c43537251367 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 08:53:54 +1100 Subject: [PATCH 26/37] Company name conforming to brand guidelines --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 807aa12..e8de313 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -## BigCommerce API -This is the documentation for BigCommerce REST API. There are sections that can be improved. Feel free to contribute via pull requests. Some things to remember while submitting pull requests +## Bigcommerce API +This is the documentation for Bigcommerce REST API. There are sections that can be improved. Feel free to contribute via pull requests. Some things to remember while submitting pull requests 1. Fork the repo and create a feature branch 2. Use these feature branches while submitting pull requests. From b6d450b565544bc394ee69f75b4860af5a9b6d03 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 08:58:49 +1100 Subject: [PATCH 27/37] Brand guidelines --- data_formats.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data_formats.md b/data_formats.md index 069a48c..a685914 100644 --- a/data_formats.md +++ b/data_formats.md @@ -1,5 +1,5 @@ ## Overview -The BigCommerce API can both accept requests and respond in JSON or XML. Requests should be encoded using the UTF-8 character set. Other character sets may have unpredictable results. +The Bigcommerce API can both accept requests and respond in JSON or XML. Requests should be encoded using the UTF-8 character set. Other character sets may have unpredictable results. ## Request Content Type When performing a request that contains a body (eg. POST or PUT), the type of content you are sending needs to be specified in the Content-Type header. The values for this header are specified in the data types below. For example, to send an xml body, the header would be: Content-Type: application/xml @@ -241,7 +241,7 @@ To receive an XML response, the request URI should include a .xml extension: 1 - BigCommerce + Bigcommerce Philip Muir phil.muir@bigcommerce.com @@ -263,7 +263,7 @@ If the request returns more than one result, then the response will consist of a 1 - BigCommerce + Bigcommerce Philip Muir phil.muir@bigcommerce.com @@ -278,4 +278,4 @@ If the request returns more than one result, then the response will consist of a /customers/1/addresses - \ No newline at end of file + From c11286748ada57d6d278c35531fccc0a189c8507 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 08:59:45 +1100 Subject: [PATCH 28/37] Brand guidelines --- response_codes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/response_codes.md b/response_codes.md index e58272d..353e06a 100644 --- a/response_codes.md +++ b/response_codes.md @@ -137,11 +137,11 @@ These codes are returned for requests that could not be processed due to an inte

    507

    Insufficient Storage

    -

    When the store has reached a limitation for the resource according to their BigCommerce plan (eg 500 product limit).

    +

    When the store has reached a limitation for the resource according to their Bigcommerce plan (eg 500 product limit).

    509

    Bandwidth Limit Exceeded

    When the requests-per-hour limitations for the API have been reached.

    - \ No newline at end of file + From 14a91b0a7d52f9b851bd890a14f5b27006ce4d36 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 09:00:39 +1100 Subject: [PATCH 29/37] Brand guidelines --- options_method.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/options_method.md b/options_method.md index 43282d7..f12dee8 100644 --- a/options_method.md +++ b/options_method.md @@ -1,13 +1,13 @@ ## Overview -The HTTP OPTIONS method can be used to discover the capabilities and requirements of resources in the BigCommerce API. The OPTIONS method itself is defined as follows according to the HTTP/1.1 spec: +The HTTP OPTIONS method can be used to discover the capabilities and requirements of resources in the Bigcommerce API. The OPTIONS method itself is defined as follows according to the HTTP/1.1 spec: The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html -The BigCommerce API uses the OPTIONS method to describe the methods which are available for a certain resource (such as GET, POST, PUT and DELETE) as well as the resource-specific fields and their various properties. A smart or dynamic client can utilise this method to discover which methods are available for a resource, which fields are available or required for a method and the data requirements for each field. +The Bigcommerce API uses the OPTIONS method to describe the methods which are available for a certain resource (such as GET, POST, PUT and DELETE) as well as the resource-specific fields and their various properties. A smart or dynamic client can utilise this method to discover which methods are available for a resource, which fields are available or required for a method and the data requirements for each field. -Unless noted otherwise, the OPTIONS method is available for all BigCommerce API resources. +Unless noted otherwise, the OPTIONS method is available for all Bigcommerce API resources. The response headers for an OPTIONS request will contain an Allow header describing (as a CSV) a list of permitted HTTP methods for the requested resource, while the response-body will contain a list of fields entities as described below. @@ -126,4 +126,4 @@ An OPTIONS request on an optionsets entity resource may look something like this - \ No newline at end of file + From aba50f487f08fdad860f5f1a4e4bb460817f12d6 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 09:01:35 +1100 Subject: [PATCH 30/37] Brand guidelines --- headers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/headers.md b/headers.md index 638dad4..8375300 100644 --- a/headers.md +++ b/headers.md @@ -1,7 +1,7 @@ ## HTTP Headers ### Request Headers -The BigCommerce API supports various HTTP headers which are used for authorization, controlling content type. Some headers can be also used for purposes such as increasing performance of your application by only returning responses when content has been modified. +The Bigcommerce API supports various HTTP headers which are used for authorization, controlling content type. Some headers can be also used for purposes such as increasing performance of your application by only returning responses when content has been modified. @@ -122,4 +122,4 @@ application/xml (for .xml requests, or if no extension is supplied)

    -

    Header

    Operations

    The version of BigCommerce the store is running on. This header is available from versions 7.3.6+.

    7.3.6

    \ No newline at end of file + From 6651f3b6b671aafcd86b262931b18e718171971e Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Fri, 8 Mar 2013 09:02:05 +1100 Subject: [PATCH 31/37] Brand guidelines --- headers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/headers.md b/headers.md index 8375300..1ae14ac 100644 --- a/headers.md +++ b/headers.md @@ -119,7 +119,7 @@ application/xml (for .xml requests, or if no extension is supplied)

    X-BC-Store-Version

    All

    A version code.

    -

    The version of BigCommerce the store is running on. This header is available from versions 7.3.6+.

    +

    The version of Bigcommerce the store is running on. This header is available from versions 7.3.6+.

    7.3.6

    From 50d50aac4198e06f91bb79255758d6038edbfa39 Mon Sep 17 00:00:00 2001 From: Qamal Kosim-Satyaputra Date: Fri, 8 Mar 2013 10:53:23 +1100 Subject: [PATCH 32/37] Added table styling to webhooks api docs --- webhooks/quickstart.md | 70 +++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/webhooks/quickstart.md b/webhooks/quickstart.md index 010d6d6..c46ea7b 100644 --- a/webhooks/quickstart.md +++ b/webhooks/quickstart.md @@ -77,48 +77,56 @@ The above example demonstrates how you can subscribe for product updates. Make a ### Operations - - - - - - - - - - - - - - - +
    VerbPathParam (query string)Operation
    POST/Create a new webhook
    GET/:idGet a detailed information for a webhook of a given :id
    PUT/:idUpdate a webhook of a given :id
    DELETE/:idDelete a webhook of a given :id
    GET/producer/:producerList all the webhook you have from a given :producer
    GET/producer/:producerscope=:scopeList all the webhook you have from a given :producer, filtered by :scope
    + + + + + + + + + + + + + + + + + +
    VerbPathParam (query string)Operation
    POST/Create a new webhook
    GET/:idGet a detailed information for a webhook of a given :id
    PUT/:idUpdate a webhook of a given :id
    DELETE/:idDelete a webhook of a given :id
    GET/producer/:producerList all the webhook you have from a given :producer
    GET/producer/:producerscope=:scopeList all the webhook you have from a given :producer, filtered by :scope
    ### Payload Fields - - - - - - - - - - - - - - - - + + + + - + + + - - + + + + + +
    FieldTypeExampleDescription
    idinteger101The ID of the webhook
    producerstringstore/d34db33fThe identifier of the producer of the event (store)
    scopestringstore/product/*The event you are subscribing to in a "/" delimited path format. Accepts the * wildcard.
    client_id (read only)stringa85a54c8fae33b2eb3b9d563a4664992The client_id of the subscriber
    delivery_methodstringHTTP_POSTThe method of delivery for this webhook. At this moment we only support HTTP_POST.
    destinationobject{ + + + + + + + + + + + + + + + + + - + - + +
    FieldTypeExampleDescription
    idinteger101The ID of the webhook
    producerstringstore/d34db33fThe identifier of the producer of the event (store)
    scopestringstore/product/*The event you are subscribing to in a "/" delimited path format. Accepts the * wildcard.
    client_id (read only)stringa85a54c8fae33b2eb3b9d563a4664992The client_id of the subscriber
    delivery_methodstringHTTP_POSTThe method of delivery for this webhook. At this moment we only support HTTP_POST.
    destinationobject{ "headers": { "X_AUTH_TOKEN": "d34db33f" }, "url": "https://superapp.com/webhook/orders" }The destination of the subscriber. For HTTP_POST type of delivery we allow a "headers" object to be passed in for additional headers.
    created_at (read only)string2013-01-17T11:27:50+11:00The creation timestamp
    created_at (read only)string2013-01-17T11:27:50+11:00The creation timestamp
    updated_at (read only)string2013-01-17T11:27:50+11:00The update timestamp
    updated_at (read only)string2013-01-17T11:27:50+11:00The update timestamp
    From d492658472359cf3d1d9b0b5bd74c121f6e25bd2 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Tue, 19 Mar 2013 21:17:46 +1100 Subject: [PATCH 33/37] Customers POST/PUT/DELETE Additional info describing the API capability for editing Customers. --- resources/customers.md | 217 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 212 insertions(+), 5 deletions(-) diff --git a/resources/customers.md b/resources/customers.md index 27609d4..4a20e10 100644 --- a/resources/customers.md +++ b/resources/customers.md @@ -7,18 +7,26 @@
    GET /customers.jsonGET /customers.json
    POST /customers.json
    GET /customers/id.json
    PUT /customers/id.json
    GET /customers/count.json
    DELETE /customers.json
    DELETE /customers/id.json
    @@ -159,6 +167,122 @@ List of customers ]
    +### POST customers.json +Create a new customer + +#### Request + +The following fields are supported for creating customers. The `first_name`, `last_name` and `email` fields are required + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypedescription
    first_namestringFirst name of customer
    last_namestringLast name of customer
    emailstringEmail address of the customer
    companystringCompany customer is part of
    phonestringPhone number of customer
    store_creditdecimalThe amount of credit the customer has
    registration_ip_addressstringThe IP address of the customer when they signed up
    customer_group_idintThe group the customer belongs to
    notesstringStore owner notes on the customer
    _authenticationobjectThe customer’s ability to log in to the store
    + +#### Managing Customer Authentication + +The `_authentication` object exposes functionality associated with the customer’s ability to log in to your store. + +When the `_authentication` object is not supplied in a request, the API will default to the following behaviour: + +- When a customer is created via `POST` and a password value is not supplied, then a new password is generated +- When a customer is updated via `PUT` and a password value is not supplied, then the existing password remains the same. + +All properties of the `_authentication` object are optional. + +#### Creating and Updating Passwords + +To manually write a customer password in the same way as the Control Panel, supply a value for the `password` field: + +
    +{
    +    "_authentication": {
    +        "password": "12w69Y217PYR96J"
    +    }
    +}
    +
    + +#### Confirming Passwords + +An additional optional `password_confirmation` field can also be sent, providing password confirmation as a service: + +
    +{
    +    "_authentication": {
    +       "password": "12w69Y217PYR96J"
    +       "password_confirmation": "12w69Y217PYR96J"
    +    }
    +}
    +
    ### GET customers/id.json GET a customer from a store @@ -189,6 +313,83 @@ customer by ID } +### PUT customers/id.json + +Any combination of the following fields can be edited on an existing customer resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypedescription
    first_namestringFirst name of customer
    last_namestringLast name of customer
    emailstringEmail address of the customer
    companystringCompany customer is part of
    phonestringPhone number of customer
    store_creditdecimalThe amount of credit the customer has
    registration_ip_addressstringThe IP address of the customer when they signed up
    customer_group_idintThe group the customer belongs to
    notesstringStore owner notes on the customer
    _authenticationobjectThe customer’s ability to log in to the store
    ### GET customers/count.json Get a total number of customers in the store @@ -203,3 +404,9 @@ Returns the number of customers in the store "count": 10 } + +### DELETE customers.json +Bulk delete a collection of customers. If no filter is supplied the entire collection is removed. + +### DELETE customers/id.json +Delete an individual customer. From e6ce9a6ed22e7258b453c3ac5101e92bdc02e14b Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Tue, 19 Mar 2013 21:18:54 +1100 Subject: [PATCH 34/37] Fix typo --- resources/customers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/customers.md b/resources/customers.md index 4a20e10..5f31a46 100644 --- a/resources/customers.md +++ b/resources/customers.md @@ -172,7 +172,7 @@ Create a new customer #### Request -The following fields are supported for creating customers. The `first_name`, `last_name` and `email` fields are required +The following fields are supported for creating customers. The `first_name`, `last_name` and `email` fields are required: From bad1aacd0583344399877475c6a610342d40d504 Mon Sep 17 00:00:00 2001 From: Saranyan Vigraham Date: Thu, 21 Mar 2013 16:01:13 -0500 Subject: [PATCH 35/37] missing fields on product field --- resources/products/rules.md | 123 ++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/resources/products/rules.md b/resources/products/rules.md index ca6cbe8..8855b6c 100644 --- a/resources/products/rules.md +++ b/resources/products/rules.md @@ -146,6 +146,129 @@ tr.mandatory { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    The description for the rule
    is_enabledbooleanIf set to true, the rule will be evaluated when a customer configures a products options.
    is_stopbooleanIf set to true and the rule evaluates to true, no more rules with a higher sort_order will be processed.
    price_adjusterobjectSee the adjuster object definition below
    weight_adjusterobjectSee the adjuster object definition below
    is_purchasing_disabledbooleanIf true this rule prohibits purchasing the product with the configured option values.
    purchasing_disabled_messagestringThe message to display if the rule disabled purchasing the product.
    is_purchasing_hiddenbooleanIf true the rule hides the options on the product. Setting this to true has no effect if the rule is based on an SKU or has conditions from multiple product options.
    conditionsobjectSee the conditions object definition below
    + +#### Price/Weight Adjustor + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypedescription
    adjustorenumThe adjuster for this rule: +
      +
    • percent - Reduce or increase the price/weight based by the percentage in the adjuster_value field. For example, setting adjuster_value for a price to 5.25 will increase the price of the product by 5.25%.
    • +
    • relative - Reduce or increase the price/weight based by the relative value in the adjuster_value field. The adjuster_value field is assumed to be the store's default currency or weight.
    • +
    • absolute - Set the price/weight based to the value in the adjuster_value field, regardless of any adjustments made by higher priority rules.
    • +
    +
    adjustor_valuedecimalThe value that which the rule will adjust the product by.
    + +#### price Adjustor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypedescription
    product_option_idintThe ID of the product option this condition will test against.
    option_value_idintThe ID of the option value this condition will test against.
    sku_idintThe ID of the sku this condition will test against.
    From 72f6b124c0519227f16bc21984a0fa363cecba60 Mon Sep 17 00:00:00 2001 From: Mark Rickerby Date: Tue, 26 Mar 2013 14:26:05 +1100 Subject: [PATCH 36/37] Add anchor link to PUT header --- resources/options/values.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/options/values.md b/resources/options/values.md index f72181e..d587b30 100644 --- a/resources/options/values.md +++ b/resources/options/values.md @@ -20,6 +20,10 @@ GET /options/values/id.json + + PUT /options/values/id.json + + GET /options/id/values/count.json @@ -233,4 +237,4 @@ Returns the number of option values in the store DELETE all option values ### DELETE options/values/id.json -DELETE an option value \ No newline at end of file +DELETE an option value From 048ecef1de1d2653e21a4d1cc5cc30eeb0f477b6 Mon Sep 17 00:00:00 2001 From: Saranyan Vigraham Date: Tue, 26 Mar 2013 10:52:11 -0500 Subject: [PATCH 37/37] changelog --- changelog.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..76f8265 --- /dev/null +++ b/changelog.md @@ -0,0 +1,53 @@ +## API changelog + +### v2 changes +#### 2/12/2013 +1. Coupons API rolled out. This update gives an ability to create and manage coupons via API. +2. GET Store settings via API. This update gives an ability to query store data via API. + +#### Things that are different in v2 API compared to v1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Change

    v1

    v2

    Requesting data

    In v1, requesting store data was always a POST operation. The API credentials were sent as part of XML payload

    In v2, basic auth is used for authentication. The API is RESTful, supports GET, POST, PUT and DELETE verbs

    Resources

    In v1, API methods were part of the XML payload. All request were directed to a single endpoint. The resource name was specified under GetOrders

    In v2, the resources are specified by request uri

    Response

    In v1, XML was the only supported response

    In v2, responses can be requested in JSON and XML

    Errors

    In v1, the errors were sent via XML payload with a node - STATUS that indicated failure

    In v2, the errors comply with standard HTTP conventions as it is norm with REST APIs

    Endpoint

    In v1, the base url for API access was https://store.com/xml.php

    In v2, the base url for API access is https://store.com/api/v2

    Resources

    In v1, the API supported products, orders and customers resources.

    In v2, the API supports an extended set of resources.

    \ No newline at end of file