Once OAuth is complete, we can use ShopifyAPI's REST library to make authenticated API calls to the Shopify Admin API.
Every API request requires a valid ShopifyAPI::Auth::Session.
To instantiate a session, we recommend you either use the shopify_app if working in Rails, or refer to our OAuth docs on constructing a session:
- "Custom Apps" - documentation on how to create Session from a custom app API token.
- "Performing OAuth" - documentation on how to create new sessions
- [ShopifyApp] - "Session" - documentation on session handling if you're using the
ShopifyAppgem.
-
- Resource classes with similar syntax as
ActiveResource, and follows our REST convention. Example:
# Update product title product = ShopifyAPI::Product.find(id: <product_id>) product.title = "My awesome product" product.save!
- Resource classes with similar syntax as
-
- More manual input method to make the API call. Example:
# Create a new client. rest_client = ShopifyAPI::Clients::Rest::Admin.new # Update product title body = { product: { title: "My cool product" } } # Use `client.put` to send your request to the specified Shopify Admin REST API endpoint. rest_client.put(path: "products/<id>.json", body: body)
We provide a templated class library to access REST resources similar to ActiveResource. Format of the methods closely resemble our REST API schema.
The version of REST resource that's loaded and used is set from ShopifyAPI::Context.setup
Create an instance of the REST resource you'd like to use and optionally provide the following parameters.
| Parameter | Type | Notes |
|---|---|---|
session |
ShopifyAPI::Auth::Session |
Default value is nil. When nil is passed in, active session information is inferred from ShopifyAPI::Context.active_session. To set active session, use ShopifyAPI::Context.activate_session. This is handled automatically behind the scenes if you use ShopifyApp's session controllers. |
from_hash |
Hash |
Default value is nil. Sets the resource properties to the values provided from the hash. |
Examples:
# To construct an Orders object using default session
# This creates a new order object with properties provided from the hash
order = ShopifyAPI::Orders.new(from_hash: {property: value})
order.save!Typical methods provided for each resources are:
finddeleteallcount
Full list of methods can be found on each of the resource class.
- Path:
- Example for
Orderresource on2023-04version:
# Find and update a customer email
customer = ShopifyAPI::Customer.find(id: customer_id)
customer.email = "steve-lastnameson@example.com"
customer.save!
# Create a new product from hash
product_properties = {
title: "My awesome product"
}
product = ShopifyAPI::Product.new(from_hash: product_properties)
product.save!
# Create a product manually
product = ShopifyAPI::Product.new
product.title = "Another one"
product.save!
# Get all orders
orders = ShopifyAPI::Orders.all
# Retrieve a specific fulfillment order
fulfillment_order_id = 123456789
fulfillment_order = ShopifyAPI::FulfillmentOrder.find(id: fulfillment_order_id)
# Remove an existing product image
product_id = 1234567
image_id = 1233211234567
ShopifyAPI::Image.delete(product_id: product_id, id: image_id)More examples can be found in each resource's documentation on shopify.dev, e.g.:
Create an instance of ShopifyAPI::Clients::Rest::Admin using the current session to make requests to the Admin API.
| Parameter | Type | Notes |
|---|---|---|
session |
ShopifyAPI::Auth::Session |
Default value is nil. When nil is passed in, active session information is inferred from ShopifyAPI::Context.active_session. To set active session, use ShopifyAPI::Context.activate_session. This is handled automatically behind the scenes if you use ShopifyApp's session controllers. |
api_version |
String |
Default value is nil. When nil is passed in, api version is inferred from ShopifyAPI::Context.setup. |
Examples:
# Create a default client with `ShopifyAPI::Context.api_version`
# and the active session from `ShopifyAPI::Context.active_session`
client = ShopifyAPI::Clients::Rest::Admin.new
# Create a client with a specific session "my_session"
client = ShopifyAPI::Clients::Rest::Admin.new(session: my_session)
# Create a client with active session from `ShopifyAPI::Context.active_session`
# and a specific api_version - "unstable"
client = ShopifyAPI::Clients::Rest::Admin.new(api_version: "unstable")
# Create a client with a specific session "my_session" and api_version "unstable"
client = ShopifyAPI::Clients::Rest::Admin.new(session: my_session, api_version: "unstable")The ShopifyAPI::Clients::Rest::Admin client offers the 4 core request methods:
getdeletepostput
Each method can take the parameters outlined in the table below.
| Parameter | Type | Required in Methods | Default Value | Notes |
|---|---|---|---|---|
path |
String |
all | none | The requested API endpoint path. This can be one of two formats:
|
body |
Hash(any(Symbol, String), untyped) |
put, post |
none | The body of the request |
query |
Hash(any(Symbol, String), any(String, Integer, Float)) |
none | none | An optional query object to be appended to the request url as a query string |
extraHeaders |
Hash(any(Symbol, String), any(String, Integer, Float)) |
none | none | Any additional headers you want to send with your request |
tries |
Integer |
None | 1 |
The maximum number of times to try the request (must be >= 0) |
Note: These parameters can still be used in all methods regardless of if they are required.
If the request is successful these methods will all return a ShopifyAPI::Clients::HttpResponse object, which has the following methods:
| Methods | Type | Notes |
|---|---|---|
code |
Integer |
HTTP Response code, e.g. 200 |
header |
Hash{String, [String]} |
HTTP Response headers |
body |
Hash{String, Untyped} |
HTTP Response body |
prev_page_info |
String |
See Pagination |
next_page_info |
String |
See Pagination |
If the request has failed, an error will be raised describing what went wrong.
You can rescue ShopifyAPI::Errors::HttpResponseError
and output error messages with errors.full_messages
See example:
client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
response = client.get(path: "NOT-REAL")
some_function(response.body)
rescue ShopifyAPI::Errors::HttpResponseError => e
puts fulfillment.errors.full_messages
# {"errors"=>"Not Found"}
# If you report this error, please include this id: bce76672-40c6-4047-b598-46208ab076f0.# Create a new client.
client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
# Use `client.get` to request the specified Shopify REST API endpoint, in this case `products`.
response = client.get(path: "products")
# Do something with the returned data
some_function(response.body)For more information on the products endpoint, check out our API reference guide.
# Create a new client.
client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
# Build your post request body.
body = {
product: {
title: "Burton Custom Freestyle 151",
body_html: "\u003cstrong\u003eGood snowboard!\u003c\/strong\u003e",
vendor: "Burton",
product_type: "Snowboard",
}
}
# Use `client.post` to send your request to the specified Shopify Admin REST API endpoint.
# This POST request will create a new product.
client.post({
path: "products",
body: body,
});For more information on the products endpoint, check out our API reference guide.
# Create a new client.
client = ShopifyAPI::Clients::Rest::Admin.new
# Update product title
body = {
product: {
title: "My cool product"
}
}
# Use `client.put` to send your request to the specified Shopify Admin REST API endpoint.
# This will update product title for product with ID <id>
client.put(path: "products/<id>.json", body: body)For more information on the products endpoint, check out our API reference guide.
This library also supports cursor-based pagination for REST Admin API requests. Learn more about REST request pagination.
After making a request, the next_page_info and prev_page_info can be found on the response object and passed as the page_info query param in other requests.
An example of this is shown below:
client = ShopifyAPI::Clients::Rest::Admin.new(session: session)
response = client.get(path: "products", query: { limit: 10 })
next_page_info = response.next_page_info
if next_page_info
next_page_response =client.get(path: "products", query: { limit: 10, page_info: next_page_info })
some_function(next_page_response)
endSimilarly, when using REST resources the next_page_info and prev_page_info can be found on the Resource class and passed as the page_info query param in other requests.
An example of this is shown below:
products = ShopifyAPI::Product.all(session: session, limit: 10)
loop do
some_function(products)
break unless ShopifyAPI::Product.next_page?
products = ShopifyAPI::Product.all(session: session, limit: 10, page_info: ShopifyAPI::Product.next_page_info)
end