# CarrierService
A carrier service (also known as a carrier calculated service or shipping service) provides real-time shipping rates to Shopify. Some common carrier services include Canada Post, FedEx, UPS, and USPS. The term carrier is often used interchangeably with the terms shipping company and rate provider.
Using the CarrierService resource, you can add a carrier service to a shop and then provide a list of applicable shipping rates at checkout. You can even use the cart data to adjust shipping rates and offer shipping discounts based on what is in the customer's cart.
To access the CarrierService resource, add the write_shipping
permission to your app's requested scopes. For more information, see API access scopes.
Your app's request to create a carrier service will fail unless the store installing your carrier service meets one of the following requirements:
When adding a carrier service to a store, you need to provide a POST endpoint rooted in the callback_url
property where Shopify can retrieve applicable shipping rates. The callback URL should be a public endpoint that expects these requests from Shopify.
A sample Shopify request for shipping rates:
POSTYour callback URL
Retrieves a list of applicable shipping rates
{ "rate": { "origin": { "country": "CA", "postal_code": "K2P1L4", "province": "ON", "city": "Ottawa", "name": null, "address1": "150 Elgin St.", "address2": "", "address3": null, "phone": null, "fax": null, "email": null, "address_type": null, "company_name": "Jamie D's Emporium" }, "destination": { "country": "CA", "postal_code": "K1M1M4", "province": "ON", "city": "Ottawa", "name": "Bob Norman", "address1": "24 Sussex Dr.", "address2": "", "address3": null, "phone": null, "fax": null, "email": null, "address_type": null, "company_name": null }, "items": [{ "name": "Short Sleeve T-Shirt", "sku": "", "quantity": 1, "grams": 1000, "price": 1999, "vendor": "Jamie D's Emporium", "requires_shipping": true, "taxable": true, "fulfillment_service": "manual", "properties": null, "product_id": 48447225880, "variant_id": 258644705304 }], "currency": "USD", "locale": "en" } }
{ "rates": [ { "service_name": "canadapost-overnight", "service_code": "ON", "total_price": "1295", "description": "This is the fastest option by far", "currency": "CAD", "min_delivery_date": "2013-04-12 14:48:45 -0400", "max_delivery_date": "2013-04-12 14:48:45 -0400" }, { "service_name": "fedex-2dayground", "service_code": "2D", "total_price": "2934", "currency": "USD", "min_delivery_date": "2013-04-12 14:48:45 -0400", "max_delivery_date": "2013-04-12 14:48:45 -0400" }, { "service_name": "fedex-priorityovernight", "service_code": "1D", "total_price": "3587", "currency": "USD", "min_delivery_date": "2013-04-12 14:48:45 -0400", "max_delivery_date": "2013-04-12 14:48:45 -0400" } ] }
The address3
, fax
, address_type
, and company_name
fields are returned by specific ActiveShipping providers. For API-created carrier services, you should use only the following shipping address fields:
address1
address2
city
zip
province
country
Other values remain as null
and are not sent to the callback URL.
When Shopify requests shipping rates using your callback URL, the response object rates
must be
a JSON array of objects with the following fields. Required fields must be included in the response for the carrier service integration to work properly.
Field | Description |
service_name required |
The name of the rate, which customers see at checkout. For example: Expedited Mail . |
description required |
A description of the rate, which customers see at checkout. For example: Includes tracking and insurance . |
service_code required |
A unique code associated with the rate. For example: expedited_mail |
currency required |
The currency of the shipping rate. |
total_price required |
The total price expressed in subunits. If the currency doesn't use subunits, then the value must be multiplied by 100. For example: `"total_price": 500` for 5.00 CAD, `"total_price": 100000` for 1000 JPY. |
phone_required |
Whether the customer must provide a phone number at checkout. |
min_delivery_date |
The earliest delivery date for the displayed rate. |
max_delivery_date |
The latest delivery date for the displayed rate to still be valid. |
The read timeout for rate requests are dynamic, based on the number of requests per minute (RPM). These limits are applied to each shop-app pair. The timeout values are as follows.
RPM Range | Timeout |
Under 1500 | 10s |
1500 to 3000 | 5s |
Over 3000 | 3s |
Shopify provides server-side caching to reduce the number of requests it makes. Any shipping rate request that identically matches the following fields will be retrieved from Shopify's cache of the initial response:
If any of these fields differ, or if the cache has expired since the original request, then new shipping rates are requested. The cache expires 15 minutes after rates are successfully returned. If an error occurs, then the cache expires after 30 seconds.
## Resource Properties ### CarrierService * active: Whether this carrier service is active. Iftrue
, then the service will be available to serve rates in checkout.
* Type: x-string
* Example: true
* callback_url: The URL endpoint that Shopify needs to retrieve shipping rates. This must be a public URL.
* Type: x-string
* Example: "http://myapp.com"
* carrier_service_type: Distinguishes between API or legacy carrier services.
* Type: x-string
* Example: "api"
* id: The ID of the carrier service.
* Type: x-string
* Example: 14079244
* format: The format of the data returned by the URL endpoint. json
is the only valid value.
* Type: x-string
* Example: "json"
* name: The name of the shipping service as seen by merchants and their customers.
* Type: x-string
* Example: "My Carrier Service"
* service_discovery: Whether merchants are able to send dummy data to your service through the Shopify admin to see shipping rate examples.
* Type: x-string
* Example: true
* admin_graphql_api_id: The GraphQL GID for this carrier service.
* Type: x-string
* Example: "gid://shopify/DeliveryCarrierService/1"
## Create a new CarrierService
### Endpoint
/admin/api/#{api_version}/carrier_services.json (POST)
### Parameters
* api_version (required):
### Responses
#### 201
Create a new CarrierService
Examples:
##### Create a carrier service
Request:
```
POST /admin/api/unstable/carrier_services.json
{"carrier_service":{"name":"Shipping Rate Provider","callback_url":"http://shipping.example.com","service_discovery":true}}
```
Response:
```
HTTP/1.1 201 Created
{"carrier_service":{"id":1036894960,"name":"Shipping Rate Provider","active":true,"service_discovery":true,"carrier_service_type":"api","admin_graphql_api_id":"gid://shopify/DeliveryCarrierService/1036894960","format":"json","callback_url":"http://shipping.example.com/"}}
```
## Retrieve a list of CarrierServices
Retrieve a list of CarrierServices. Note: Only services with property active: true
are returned.
Updates a carrier service. Only the app that creates a carrier service can update it.
### Endpoint /admin/api/#{api_version}/carrier_services/{carrier_service_id}.json (PUT) ### Parameters * api_version (required): * carrier_service_id (required): ### Responses #### 200 Modify an existing CarrierService Examples: ##### Update a carrier service Request: ``` PUT /admin/api/unstable/carrier_services/1036894955.json {"carrier_service":{"id":1036894955,"name":"Some new name","active":false}} ``` Response: ``` HTTP/1.1 200 OK {"carrier_service":{"active":false,"id":1036894955,"name":"Some new name","service_discovery":true,"carrier_service_type":"api","admin_graphql_api_id":"gid://shopify/DeliveryCarrierService/1036894955","format":"json","callback_url":"http://example.com/"}} ``` ## Receive a single CarrierService ### Endpoint /admin/api/#{api_version}/carrier_services/{carrier_service_id}.json (GET) ### Parameters * api_version (required): * carrier_service_id (required): ### Responses #### 200 Receive a single CarrierService Examples: ##### Get a single carrier service by its ID Request: ``` GET /admin/api/unstable/carrier_services/1036894958.json ``` Response: ``` HTTP/1.1 200 OK {"carrier_service":{"id":1036894958,"name":"Purolator","active":true,"service_discovery":true,"carrier_service_type":"api","admin_graphql_api_id":"gid://shopify/DeliveryCarrierService/1036894958","format":"json","callback_url":"http://example.com/"}} ``` ## Remove an existing CarrierService ### Endpoint /admin/api/#{api_version}/carrier_services/{carrier_service_id}.json (DELETE) ### Parameters * api_version (required): * carrier_service_id (required): ### Responses #### 200 Remove an existing CarrierService Examples: ##### Delete a carrier service Request: ``` DELETE /admin/api/unstable/carrier_services/1036894956.json ``` Response: ``` HTTP/1.1 200 OK {} ```