Introduction to REST
ShipEngine is a REST (REpresentational State Transfer) API, which means that it follows certain HTTP conventions for things like URLs, methods, headers, and status codes. If you're not yet familiar with REST, then this page is for you. We'll explain the basics that you need to know to get started with ShipEngine.
REST APIs are centered around the concept of resources. Resources are data on which you can perform operations. For example, one of the resources in ShipEngine is a Label, and the operations that you can perform on a label include creating a label, querying labels, and voiding labels.
REST allows resources to be represented in any format, such as JSON, XML, CSV, binary, etc. Almost all resources in ShipEngine are in JSON format. One notable exception to this is label images, which can be downloaded in a variety of formats.
JSON is a convenient format to represent REST resources because it's human readable, compresses well, and is supported by all modern programming languages. In addition, JSON is fairly easy to understand because it only has a few data types:
|String||Text data, such as names and addresses||
|Number||Positive, negative or decimal numbers||
|Boolean||Either true or false.||
|Object||A set of key/value pairs inside curly braces. The keys are always strings, but the values can be any JSON data type.||
|Array||An ordered list of values inside square brackets. The values can be any JSON data type.||
ShipEngine requires HTTPS and TLS v1.1 or higher for all API calls. This means that all API calls must be made to
Deprecated security protocols
See our Security & Authentication Guide for more information.
Requests & Responses
To call a REST API, you need to send an HTTP request to the server. The request contains all the information necessary to tell the server (e.g. ShipEngine) what you want it to do. When the server is finished performing the operation that you requested, it sends an HTTP response back to you, which contains all the information necessary to let you know whether the operation was successful or not, and includes any data that you requested.
The HTTP protocol includes many different "methods" (also called "verbs"), such as GET, POST, PUT, PATCH, OPTIONS, and more. Each of these methods instructs the server to perform a certain operation on a resource. To keep things simple, ShipEngine only uses the following methods:
|GET||Requests one or more resources from the server.|
|POST||Creates one or more new resources.|
|PUT||Updates a resource, or performs an action.|
|PATCH||Adds data to an existing resource.|
|DELETE||Deletes or deactivates a resource.|
To call a ShipEngine API, you have to know its endpoint, which is a combination of a URL (Uniform Resource Locator) and an HTTP method. For example, to create a shipping label, you need to call the
POST https://api.shipengine.com/v1/labels endpoint. In this case, the
POST method tells the server that you want to create a new resource, and the
/v1/labels URL path tells the server what kind of resource you want to create (a label resource).
URL Query Parameters
Some HTTP requests may also include URL query parameters, which are used by the server to filter the data returned.
A query parameter consists of a key-value pair, such as
Query parameters can be specified by including them directly in the URL using a
? to indicate that query parameters follow.
https://api.shipengine.com/v1/labels?carrier_id=se-28529731. This example tells ShipEngine to return all
the labels with the specified carrier ID. If we did not include this portion in the URL, ShipEngine would have returned
all the labels ever created, regardless of carrier ID.
If you wish to include multiple parameters in the URL, simply separate each set of parameters with an
&. For example,
https://api.shipengine.com/v1/labels?carrier_id=se-28529731&warehouse_id=se-1234. This example tells ShipEngine to return
all labels with the specified Carrier ID and the specified warehouse ID.
GET /v1/labels?created_at_start=2020-11-09T00:37:54.14212Z&created_at_end=2020-11-09T22:37:54.14212Z HTTP/1.1 Host: https://api-stage.shipengine.com API-Key: __YOUR_API_KEY_HERE__ Content-Type: application/json
HTTP requests and responses have a headers section and a data section. The data section contains a REST resource, such as a label in JSON format. The headers section contains metadata about the request or response. There are many different types of headers, but these are the main ones that are relevant for ShipEngine:
|API-Key||Your ShipEngine API auth key||
|Content-Type||Tells the server what data format you're sending. ShipEngine only supports JSON format.||
|Content-Type||Tells you what data format the server is sending. This will be JSON format, except for label downloads, which can be in a variety of formats.||
|Content-Length||The size of the response data, in bytes.||
|Date||The date/time that the response was sent||
|X-ShipEngine-RequestID||A unique ID for every request/response. You can use this for logging, or when opening a support ticket||
|200||Success||The HTTP request was successful.|
|201||Created||The requested resource was successfully created.|
|204||No Content||The HTTP request was successful, and the response is empty.|
|207||Multi-Status||The HTTP request was successful, but contains separate response codes that each need to be evaluated|
|400||Bad Request||There's something wrong with your request. See the error code for more details about the problem.|
|401||Unauthorized||Your API key is invalid, expired, or has been deactivated.|
|404||Not Found||The resource you requested does not exist. For example, a request to
|405||Not Allowed||The HTTP method you used is not supported by ShipEngine.|
|409||Conflict||The request conflicts with the current state of the server. For example, you may be attempting to create a resource that already exists, or ship a package that has already been shipped.|
|500||Internal Server Error||The server cannot process the request. If this occurrs persistently, then please contact support for help.|