Swyft API

Download OpenAPI specification:Download

Introduction

Swyft is a last-mile delivery service that offers same and next-day shipping to customers at affordable rates. The Swyft technology platform with its network of warehouses and delivery companies provides merchants and their customers the best delivery experience possible.

API Overview

Welcome to the API documentation!

To use our API, make sure to set up your Swyft account by contacting your Merchant Success Manager or by contacting Swyft Support. Most user actions that can be done in our Merchant Dashboard can be done though our REST API.

Common Use Cases:

  • Creating a label
  • Deleting a label
  • Tracking a label
  • Printing a label
  • Getting package delivery rates

Authentication

AccessToken

Security Scheme Type API Key
Header parameter name: X-Swyft-Access-Token

Labels

Label API endpoints provide a way to create, delete, fetch and print labels in Swyft's system.

Package size matrix:

Swyft Size Code Max Vol (cuft) Max Weight (lbs) Max Length on any side (in)
Small 0.5 5 26
Medium 1 10 26
Large 2 20 26
Extra Large 3.3 35 26

[2020-10] Create Bulk Labels

Create a bulk number of labels with a single request. Accepts a maximum of 100 labels per request. Each label will be validated against the label schema, if any do not validate then the request will fail returning the index of the invalid label from the array. If the schema is successful, the labels will be generated and returned as an array of labels, if any of these labels failed to be created due to issues such as address validation, then that row in the returned array will be an error object instead.

Authorizations:
Request Body schema: application/json
One of
Array of objects (CreateLabelsWithPackageType)

Responses

Request samples

Content type
application/json
Example
{
  • "labels": [
    ]
}

Response samples

Content type
application/json
[
  • {
    }
]

[2020-10] Create Label

Create label with specific package and service type.

Authorizations:
Request Body schema: application/json
One of
package_type
required
string
Enum: "SMALL" "MEDIUM" "LARGE" "EXTRA_LARGE"

One of the package types returned when fetching rates.

service_type
required
string
Enum: "SAMEDAY" "NEXTDAY"

One of the service types returned when fetching rates.

business_name
string

Business name on whose behalf package is being delivered. In the case of a 3PL this would be the merchant business name. Is used in communication with client via SMS, etc.

required
object (Recipient with Phone)

An individual receiving or sending a package.

required
Recipient with Phone (object) or Recipient with Email (object) (Recipient)

An individual receiving or sending a package.

signature_required
boolean (signatureRequired)

The customer must provide their signature on delivery through the driver phone application. Requiring a signature will affect the rate for the delivery For condos:

  • If there's a doorman, they can accept the package and sign for it.
  • Even if signatureRequired is false, if the driver can't find a safe place to store the package, it will not be delivered.
  • Setting signatureRequired as true will increase the pricing of the delivery.
notes
string

Specific notes about delivery location for driver.

order_number
string

Order number from client's system.

shipment_id
string

Shipment id for a group of orders from client's system.

reference
string

Reference # or ID on the client side in case of any issues. Primarily to be used by our dispatcher to reach out to client but can also be used by client to attach specific metadata to label.

reference2
string

Secondary reference # or ID on the client side in case of any issues. Can be used by client to attach specific metadata to label.

tracking_number
string

Optional unique tracking number. If provided, then the tracking number will be set to the given value. Otherwise it will be randomly generated.

pickup_location_slug
string

Identifier for the pickup location of this package.

Responses

Request samples

Content type
application/json
Example
{
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "notes": "Ask concierge for elevator access",
  • "order_number": "12345ABC",
  • "shipment_id": "567890ABC",
  • "reference": "order #9000",
  • "reference2": "order #9000"
}

Response samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug",
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "rate": {
    },
  • "notes": "Ask concierge for elevator access",
  • "reference": "order #9000",
  • "reference2": "order #9000",
  • "tracking_number": "9m4e2mr0ui3e8a215n4g",
  • "complete_after": "2020-05-06T21:00:00.000Z",
  • "complete_before": "2020-05-07T03:00:00.000Z",
  • "created_at": "2020-05-06T05:29:19.472Z",
  • "updated_at": "2020-05-06T05:29:19.472Z"
}

[2020-04] Delete Label

Cancel a recently created label. This will cause the label to not be scheduled for delivery but can still be fetched later for auditing. Can only cancel a label before the package reaches our warehouse, if successful then the label will not be billed for. To cancel after a pickup contact Swyft so that we tell the driver not to deliver.

Authorizations:
Request Body schema: application/json
One of
id
required
string

Label id returned on create.

Responses

Request samples

Content type
application/json
Example
{
  • "id": "string"
}

Response samples

Content type
text/html
OK

[2020-10] Get Label

Fetch a single label by id.

Authorizations:
Request Body schema: application/json
One of
id
required
string

Label id returned on create.

Responses

Request samples

Content type
application/json
Example
{
  • "id": "bqofiflh5s5id0diioug"
}

Response samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug",
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "rate": {
    },
  • "notes": "Ask concierge for elevator access",
  • "reference": "order #9000",
  • "reference2": "order #9000",
  • "tracking_number": "9m4e2mr0ui3e8a215n4g",
  • "complete_after": "2020-05-06T21:00:00.000Z",
  • "complete_before": "2020-05-07T03:00:00.000Z",
  • "created_at": "2020-05-06T05:29:19.472Z",
  • "updated_at": "2020-05-06T05:29:19.472Z"
}

[2020-04] Print Label

Fetch printable PDF for single label by id or Shopify order number.

Authorizations:
Request Body schema: application/json
One of
id
required
string

Label id returned on create.

Responses

Request samples

Content type
application/json
Example
{
  • "id": "bqofiflh5s5id0diioug"
}

Response samples

Content type
text/html
Invalid request

Rates

Rate API endpoints return the delivery prices for the different package sizes and service types for packages given an origin and destination. Rates will differ depending on the package size and service type, in addition to the options that are configured for it.

Package size matrix:

Swyft Size Code Max Vol (cuft) Max Weight (lbs) Max Length on any side (in)
Small 0.5 5 26
Medium 1 10 26
Large 2 20 26
Extra Large 3.3 35 26

[2020-04] Fetch Rates

Fetch rates for given origin and destination.

Authorizations:
Request Body schema: application/json
required
object (Address)

Address where the package will be picked up

required
object (Address)

Address of the package's destination

signature_required
boolean (signatureRequired)

The customer must provide their signature on delivery through the driver phone application. Requiring a signature will affect the rate for the delivery For condos:

  • If there's a doorman, they can accept the package and sign for it.
  • Even if signatureRequired is false, if the driver can't find a safe place to store the package, it will not be delivered.
  • Setting signatureRequired as true will increase the pricing of the delivery.
pickup_location_slug
string

Identifier for the pickup location of the packages.

package_count
number (Package Count)
Default: 1

Number of packages to be delivered to a single location.

Responses

Request samples

Content type
application/json
{
  • "origin": {
    },
  • "destination": {
    },
  • "signature_required": true,
  • "pickup_location_slug": "string",
  • "package_count": 1
}

Response samples

Content type
application/json
{
  • "rates": [
    ]
}

[2021-09] Bulk Fetch Rates

Fetch rates for a bulk list of origins and destinations. Request can only either Dimensions or Package Type.

Authorizations:
Request Body schema: application/json
One of
Array of objects

Responses

Request samples

Content type
application/json
Example
{
  • "rates": [
    ]
}

Response samples

Content type
application/json
{
  • "created_at": "2021-09-21T13:23:15.000Z",
  • "rates": [
    ]
}

Tracking

Package Lifecycle

label event flow

[2020-04] Get Tracking Status

Fetch the delivery status of a label by id or tracking number. Here are a couple of examples on why a delivery attempt may fail:

  • Destination is an apartment but there's no buzzcode
  • signature_required is set but no one is available to sign.
  • At most we will attempt to deliver a package 3 times.
Authorizations:
Request Body schema: application/json
One of
id
required
string

Label id returned on create.

Responses

Request samples

Content type
application/json
Example
{
  • "id": "string"
}

Response samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug",
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "signature_required": "false,",
  • "notes": "Ask concierge for elevator access",
  • "reference": "order #9000",
  • "reference2": "order #9000",
  • "tracking_number": "9m4e2mr0ui3e8a215n4g",
  • "complete_after": "2020-05-06T21:00:00.000Z",
  • "complete_before": "2020-05-07T03:00:00.000Z",
  • "created_at": "2020-05-06T05:29:19.472Z",
  • "updated_at": "2020-05-06T05:29:19.472Z",
  • "status": {
    },
  • "status_history": [
    ],
  • "associated_crossdock_id": "WslSjuF9iREfEyoF2ySH",
  • "pickup_location_id": "AM6Mz5nTsQqfODPiNdbm",
  • "manually_approved": "true,",
  • "original_ship_date": "2020-05-04,",
  • "ship_date": "2020-05-06,",
  • "state": "DELIVERED,",
  • "merchant_id": "u1BrVSwwgWEAyAZheVE2,",
  • "merchant_slug": "acme-corporation,",
  • "received": "true,",
  • "rate": {
    },
  • "organization_slug": "acme-corporation,",
  • "client_id": "acme-corporation"
}

Coverage

[2020-10] Get Availability

Get availability of a zip/postal code for delivery based on a pickup location.

Authorizations:
query Parameters
pickup_location_slug
required
string

Identifier for the pickup location

postal_code
required
string

Postal/Zip code

Responses

Response samples

Content type
application/json
{
  • "availability": true
}

[2020-10] Get Coverage Areas

Get coverage list of zip/postal codes based on a pickup location.

Authorizations:
query Parameters
pickup_location_slug
required
string

Identifier for the pickup location

Responses

Response samples

Content type
application/json
{
  • "coverage_areas": [
    ]
}

Webhooks

[2021-05] Subscribe to the label updates webhook.

Subscribe to label updates by providing a url that swyft can respond to. The server should reply with a status of 200, if that is not the case then the webhook will unsubscribe after 300 failed attempts. The notification_url must be an https endpoint or will fail with status 400. Swyft uses HMAC with the SHA-512 hash function for additional authentication, and each request comes with a X-Swyft-Signature header. To authenticate compare the header with the API Token in an HMAC hexadecimal format.

Authorizations:
Request Body schema: application/json
notification_url
required
string <uri> (Notification Url)

The https endpoint to receive label update notifications.

Responses

Callbacks

Request samples

Content type
application/json
{}

Response samples

Content type
application/json
{}

Callback payload samples

Callback
POST: Payload that will be sent to your server when a tracking event occurs.
Content type
application/json
{
  • "id": "string",
  • "tracking_number": "string",
  • "state": "PENDING",
  • "timestamp": "2019-08-24T14:15:22Z"
}

[2021-05] Unsubscribe from the label updates webhook.

Unsubscribe from label updates.

Authorizations:

Responses

Response samples

Content type
application/json
{}

Deprecated

[2020-04] Bulk Fetch Rates Deprecated

Fetch rates for a bulk list of origins and destinations.

Authorizations:
Request Body schema: application/json
Array of objects

Responses

Request samples

Content type
application/json
{
  • "rates": [
    ]
}

Response samples

Content type
application/json
{
  • "rates": [
    ]
}

[2020-04] Create Bulk Labels Deprecated

Create a bulk number of labels with a single request. Accepts a maximum of 100 labels per request. Each label will be validated against the label schema, if any do not validate then the request will fail returning the index of the invalid label from the array. If the schema is successful, the labels will be generated and returned as an array of labels, if any of these labels failed to be created due to issues such as address validation, then that row in the returned array will be an error object instead.

Authorizations:
Request Body schema: application/json
Array of objects (CreateLabelsWithPackageType)

Responses

Request samples

Content type
application/json
{
  • "labels": [
    ]
}

Response samples

Content type
application/json
[
  • {
    }
]

[2020-04] Create Label Deprecated

Create label with specific package and service type.

Authorizations:
Request Body schema: application/json
package_type
required
string
Enum: "SMALL" "MEDIUM" "LARGE" "EXTRA_LARGE"

One of the package types returned when fetching rates.

service_type
required
string
Enum: "SAMEDAY" "NEXTDAY"

One of the service types returned when fetching rates.

business_name
string

Business name on whose behalf package is being delivered. In the case of a 3PL this would be the merchant business name. Is used in communication with client via SMS, etc.

required
object (Recipient with Phone)

An individual receiving or sending a package.

required
Recipient with Phone (object) or Recipient with Email (object) (Recipient)

An individual receiving or sending a package.

signature_required
boolean (signatureRequired)

The customer must provide their signature on delivery through the driver phone application. Requiring a signature will affect the rate for the delivery For condos:

  • If there's a doorman, they can accept the package and sign for it.
  • Even if signatureRequired is false, if the driver can't find a safe place to store the package, it will not be delivered.
  • Setting signatureRequired as true will increase the pricing of the delivery.
notes
string

Specific notes about delivery location for driver.

order_number
string

Order number from client's system.

shipment_id
string

Shipment id for a group of orders from client's system.

reference
string

Reference # or ID on the client side in case of any issues. Primarily to be used by our dispatcher to reach out to client but can also be used by client to attach specific metadata to label.

reference2
string

Secondary reference # or ID on the client side in case of any issues. Can be used by client to attach specific metadata to label.

tracking_number
string

Optional unique tracking number. If provided, then the tracking number will be set to the given value. Otherwise it will be randomly generated.

pickup_location_slug
string

Identifier for the pickup location of this package.

Responses

Request samples

Content type
application/json
{
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "notes": "Ask concierge for elevator access",
  • "order_number": "12345ABC",
  • "shipment_id": "567890ABC",
  • "reference": "order #9000",
  • "reference2": "order #9000"
}

Response samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug",
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "rate": {
    },
  • "notes": "Ask concierge for elevator access",
  • "reference": "order #9000",
  • "reference2": "order #9000",
  • "tracking_number": "9m4e2mr0ui3e8a215n4g",
  • "complete_after": "2020-05-06T21:00:00.000Z",
  • "complete_before": "2020-05-07T03:00:00.000Z",
  • "created_at": "2020-05-06T05:29:19.472Z",
  • "updated_at": "2020-05-06T05:29:19.472Z"
}

[2020-04] Get Label Deprecated

Fetch a label encoded in JSON.

Authorizations:
Request Body schema: application/json
id
required
string

Label id returned on create.

Responses

Request samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug"
}

Response samples

Content type
application/json
{
  • "id": "bqofiflh5s5id0diioug",
  • "package_type": "SMALL",
  • "service_type": "SAMEDAY",
  • "business_name": "Acme Corporation",
  • "origin": {
    },
  • "destination": {
    },
  • "rate": {
    },
  • "notes": "Ask concierge for elevator access",
  • "reference": "order #9000",
  • "reference2": "order #9000",
  • "tracking_number": "9m4e2mr0ui3e8a215n4g",
  • "complete_after": "2020-05-06T21:00:00.000Z",
  • "complete_before": "2020-05-07T03:00:00.000Z",
  • "created_at": "2020-05-06T05:29:19.472Z",
  • "updated_at": "2020-05-06T05:29:19.472Z"
}