NAV
print api
Curl Objective-C Java

Introduction

API Endpoint

[[api_endpoint]]

The Kite API is organized around REST. Our API is designed to have predictable, resource-oriented URLs and to use HTTP response codes to indicate API errors. We use built-in HTTP features, like HTTP authentication and HTTP verbs, which can be understood by off-the-shelf HTTP clients. JSON will be returned in all responses from the API, including errors (though if you’re using API bindings, we will convert the response to the appropriate language-specific object).

To make the Kite API as explorable as possible, accounts have test-mode API keys as well as live-mode API keys. These keys can be active at the same time. Data created with test-mode credentials will never result in real products being created and shipped to addresses, will never hit the credit card networks and will never cost anyone money.

The requests in the sidebar actually work. We’ll perform the requests using your test-mode API key, [[public_key]], which is linked to your account under the email address [[user_email]].

Libraries

Kite is built by developers for developers and we have SDKs spanning a range of languages and platforms. It’s recommended that you use our SDKs where available as it will greatly simplify and speed up integration. In most cases you can be up an running sending through product orders within minutes.

Some of our SDKs are also bundled with optional checkout experiences proven to convert well with users.

Authentication

Example Request

curl "[[api_endpoint]]/v4.1/template/?limit=10" \
  -H "Authorization: ApiKey [[public_key]]:"
[OLKitePrintSDK setAPIKey:@"[[public_key]]" withEnvironment:kOLKitePrintSDKEnvironmentSandbox];
KitePrintSDK.initialize("[[public_key]]", KitePrintSDK.Environment.TEST, getApplicationContext());

One of your test API keys has been filled into all the examples on the page, so you can test out any example right away.

A sample test API key has been provided so you can test out all the examples straight away. You should replace [[public_key]] with one of your own found in the credentials section of the dashboard.

You authenticate with the Kite API by providing your API key in the request. You can manage your API keys in the credentials section of the dashboard. You can have multiple API keys active at one time. Your API keys carry many privileges, so be sure to keep them secret!

To authenticate you include the HTTP Authorization header in your request. All API requests must be made over HTTPS. Calls made over plain HTTP will fail. You must authenticate for all requests.

In some scenarios it’s also desirable to include your secret key in the Authorization header. If you’re building a mobile application this is not normally needed, but if you’re placing orders from your own server it usually makes sense. See payment workflows for more details.

Payment Workflows

Your customers can either pay you directly when they place an order for a product or we can take payment on your behalf and automatically transfer your revenue into an account of your choosing.

Kite takes payment

In this scenario we take payment from customers on your behalf. This will occur entirely within your app or website in a way that’s totally branded to you, your customers don’t even need to know we were involved. We then automatically transfer funds we owe you directly into a bank or a PayPal account of your choosing. You can setup the account into which you want to receive payments in the billing section of the dashboard.

This is the easiest approach to using the Kite platform as it means you don’t need to run your own server and it’s baked into several of our SDKs.

You take payment

Example Request

curl "[[api_endpoint]]/v4.0/template/?limit=10" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>"
// Our iOS SDK does not support this payment workflow directly as it would require embedding your secret key into the app. Instead use our REST API
// Our Android SDK does not support this payment workflow directly as it would require embedding your secret key into the app. Instead use our REST API

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

In this scenario you take payment directly from your customer in any manner of your choosing. You’ll need your own server infrastructure in order to take care of the payment processing, payment validation and to submit product order requests to the Kite platform.

You’ll need to add a card to be charged for any orders you place with Kite. This can be done in the billing section of the dashboard.

Any request you make to Kite that would result in you incurring a charge (i.e. product order requests) will need to include both your API key and your secret key in the HTTP Authorization header. Your secret key can be found alongside your API key in the credentials section of the dashboard.

The presence of your secret key in charge incurring requests (i.e. product order requests) removes the need for the proof_of_payment argument to be provided as the card associated with your account can be charged directly.

Errors

Example Error Response

{
  "error": {
    "code": "01",
    "message": "JSON schema error: The request data does not match the required JSON schema"
  }
}

Kite uses conventional HTTP response codes to indicate success or failure of an API request. In general, codes in the 2xx range indicate success, codes in the 4xx range indicate an error that resulted from the provided information (e.g. a required parameter was missing, etc.), and codes in the 5xx range indicate an error with Kite’s servers.

Where possible an error response will include an error object that provides further details in the form of a code and message.

Error code summary

00 Failed to parse JSON from the body of the request. Please ensure you’re sending data through as valid JSON and please check it can be decoded as UTF-8
01 The request data does not match the required JSON schema
02 Version not supported
03 Failed to add order to the processing queue
10 Cannot set email in both user_data and customer_email
11 Invalid delivery address
12 Invalid customer_payment field provided
13 Promo code provided does not exist
14 Invalid email address
15 Failed to add order to the fulfilment queue
16 No email address provided
17 Invalid email address provided
18 Customer payment required for given payment method
19 Unexpected order rejection
20 Payment confirmation already used on a successful order
30 Template does not exist
31 One or more products ordered is unavailable
32 Failed to save address for print job
33 One or more products ordered is missing a shipping address
40 Assets not provided
41 Malformed asset cropping instructions
42 One or more assets provided were neither an asset ID nor valid URL
43 Assets provided in an incorrect format for the product
44 Required named asset field missing
45 Invalid text object
46 Invalid request for Noncustomizable product
50 Product not available in given country
H00 User is blocked from sending orders
H01 User has no valid card on record
F01 Asset does not exist
F02 Supplied image is Corrupt and unprocessable
F03 Missing delivery address
F04 Missing postcode
F05 Missing city
F06 Missing county / state
F07 Missing address line 1
F08 Missing email address
F10 Unexpected fulfilment error
F20 Incorrect apparel asset format
F30 Incorrect Sticky9 affiliate name
P01 Unknown payment method
P02 Error looking up payment
P03 No proof of payment and no secret key provided
P04 Max number of echeques exceeded
P05 Cannot use discount codes without a card on record
P06 Confirmed payment does not cover order cost
P07 Unexpected PayPal intent
P08 Does not recognise modification area provided in request

Pagination

Example Request

curl "[[api_endpoint]]/v4.0/order/?offset=30&limit=5" \
  -H "Authorization: ApiKey [[public_key]]:[[secret_key]]"
// Our iOS SDK encapsulates pagination through some high level abstractions so you don't need to worry about this
// Our Android SDK encapsulates pagination through some high level abstractions so you don't need to worry about this

Example Paginated Response

{
  "meta": {
    "limit": 5,
    "next": null,
    "offset": 30,
    "previous": null,
    "total_count": 33
  },
  "objects": [
    {...},
    {...},
    {...}
  ]
}
// See above comment
// See above comment

Several Kite API endpoints return paginated responses, for example the list orders endpoint. All paginated responses share the same common structure.

Arguments

offsetoptional The offset into the result set of objects returned
limitoptional By default, you get returned a paginated set of objects (20 per page is the default), by specifying the limit argument you can control the number of objects returned

Assets

Assets are files, typically images (jpegs, pngs), PDFs & fonts that you use in your product & print order requests. There are two classes of assets: remote and managed.

Remote assets are those that you already host yourself. You can start submitting orders straight away with these as long as they have URLs that are accessible to the Kite servers.

Managed assets are those which we host on Amazon S3 on your behalf. Managed assets allow you to use our infrastructure to host your user’s assets (and your own) without the need to pay for your own hosting.

The asset object

Example JSON

{
  "asset_id": 1638,
  "client_asset": false,
  "description": "A very grumpy cat",
  "filename": "1.jpg",
  "mime_type": "image/jpeg",
  "stock_asset": false,
  "time_registered": "2014-03-14T14:37:51",
  "url": "http://psps.s3.amazonaws.com/sdk_static/1.jpg"
}

Attributes

asset_idinteger The unique identifier of the asset
client_assetboolean Client assets are dynamic assets typically uploaded by your users & customers. They are periodically purged (a short while after the customer has received their order) and are not displayed in your dashboard
descriptionstring An optional description of the asset
filenamestring The asset’s filename
mime_typestring The files mimetype, such as ‘image/jpeg’. Optional and unused for remote assets
stock_assetstring Indicates whether this is one of the default Kite assets provided on signup
time_registeredstring The time the asset registration request was received
urlstring The URL from which the asset can be fetched for display

Uploading an asset

Managed Asset Registration Request

curl "[[api_endpoint]]/v4.0/asset/sign/?mime_types=image/jpeg&client_asset=true" \
  -H "Authorization: ApiKey [[public_key]]:"
#import <Kite-Print-SDK/OLAssetUploadRequest.h>

OLAssetUploadRequest *req = [[OLAssetUploadRequest alloc] init];
req.delegate = self; // assuming self conforms to OLAssetUploadRequestDelegate
[req uploadImageAsJPEG:[UIImage imageNamed:@"photo"]];

import ly.kite.print.AssetUploadRequestListener;

AssetUploadRequest req = new AssetUploadRequest();
req.uploadAsset(new Asset(R.drawable.instagram1), getApplicationContext(), /*AssetUploadRequestListener:*/this);

Example Response

{
  "signed_requests": [
    "https://s3-eu-west-1.amazonaws.com/...&Signature=0ls3p7BD3RGcAvsB0UNS3D"
  ],
  "asset_ids": [
    560227
  ],
  "urls": [
    "https://s3-eu-west-1.amazonaws.com/.../560227.jpeg"
  ]
}
#pragma mark OLAssetUploadRequestDelegate methods
- (void)assetUploadRequest:(OLAssetUploadRequest *)req didSucceedWithAssets:(NSArray/*<OLAsset>*/ *)assets {
    // Success, we're now hosting the asset for you and it has been successfully uploaded to S3
}

- (void)assetUploadRequest:(OLAssetUploadRequest *)req didFailWithError:(NSError *)error {
    // do something sensible with the error
}
// AssetUploadRequestListener implementation:

@Override
public void onUploadComplete(AssetUploadRequest req, List<Asset> assets) {

}

@Override
public void onError(AssetUploadRequest req, Exception error) {

}

@Override
public void onProgress(AssetUploadRequest req, int totalAssetsUploaded,
                       int totalAssetsToUpload,  long bytesWritten,
                       long totalAssetBytesWritten, long totalAssetBytesExpectedToWrite) {

}

S3 Asset Upload Request

curl --upload-file "<path/to/local/image.jpg>" \
    -H "Content-Type:image/jpeg" \
    -H "x-amz-acl:private" \
    "<signed_request_url>"
// Manual S3 upload is not required with the iOS SDK as it's taken care of automatically -- it's encapsulated within the OLAssetUploadRequest:upload* methods
// Manual S3 upload is not required with the Android SDK as it's taken care of automatically -- it's encapsulated within the AssetUploadRequest.uploadAsset methods

Replace <path/to/local/image.jpg> with the path to a local image to be uploaded and <signed_request_url> with a url found in the signed_requests property in the response from the previous Managed Asset Registration Request

Registering and uploading a managed asset is a two step process. First you make a request to the Kite servers to get a signed Amazon S3 URL to which you can upload the asset. Second you upload the file representing the asset to Amazon S3 using that signed URL.

HTTP Request

GET [[api_endpoint]]/v4.0/asset/sign/

Arguments

mime_typesrequired A comma separated list of one or more mime types for the assets that you want to upload. The number of mime types you specify indicates the number of assets you are expected to upload to S3. Current supported mime types are: image/jpeg, image/png, application/pdf
client_assetoptional A boolean indicating if this is a client/customer/user asset. This should always be true if the assets with specified mime types are being uploaded from a client application. Client assets are are periodically purged (a short while after a customer has received their order) and are not displayed in your dashboard

Returns

Returns an object with signed_requests, asset_ids & urls list properties. Each list’s length is the same and equal to the number of mime_type’s specified in the request. The equivalent index in each list corresponds directly to the asset referred to by the mime type at the same index in the request’s mime_type query parameter.

Response Properties

signed_requestslist A list of signed Amazon S3 URLs that can be used to upload the assets
asset_idslist A list of asset object id’s that can be used in product & print order requests
urlslist A list of Amazon S3 URLs where the uploaded assets will reside. These are not publically accessible but can be used in various requests

Products

With a single API request to Kite you can have personalised products created, packaged and shipped anywhere in the world. Our product range is second to none, and we’re adding new ones all the time.

Packaging will carry your branding, not ours – your customers never need to know we were involved!

We have a global product fulfilment and distribution network to get orders into your customers hands faster.

When you initially create your Kite account, the product template id’s listed in this section are immediately available for you to order from.

Additional products SKU’s are also available from our exclusive suppliers such as Photobox, please do get in touch for further information about getting access to these product ranges.

Which products you display to your customers within our mobile SDKs and their associated retail prices can be configured within the products section of the dashboard

The job object

Example JSON

{
  "template_id": "magnets",
  "assets": [
    "http://psps.s3.amazonaws.com/sdk_static/1.jpg",
    "http://psps.s3.amazonaws.com/sdk_static/2.jpg",
    "http://psps.s3.amazonaws.com/sdk_static/3.jpg",
    "http://psps.s3.amazonaws.com/sdk_static/4.jpg"
  ]
}

A job encapsulates the details to create a single personalised product. For example the job represented by the JSON to the right would result in a set of magnets being created where each magnet has one of four images printed on the front.

Attributes

template_idstring The identifier for the product you want created. A full list of template identifiers for products can be found below in the relevant product ordering sections
assetslist A list of image URLs accessible to the Kite servers or a list of asset object identifiers that you have received by uploading an asset to Kite. These assets will be used in the creation of the personalised product indicated by template_id
optionsobject Optional object only applicable for certain products. It contains product specific modifiers; for example for t-shirts you can specify the color and size amongst other things in here, for phone cases you can specify gloss or matte finish, etc.
shipping_classinteger Optional field to specify a non standard delivery method. See our Shipping methods section for more information.
pdfstring Optional object only applicable for certain products such as photobooks. A PDF URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite.

The order object

Example JSON

{
  "proof_of_payment": "PAY-4M676136DK539691RKURJ7QY",
  "shipping_address": {
    "recipient_name": "Deon Botha",
    "address_line_1": "Eastcastle House",
    "address_line_2": "27-28 Eastcastle Street",
    "city": "London",
    "county_state": "Greater London",
    "postcode": "W1W 8DH",
    "country_code": "GBR"
  },
  "customer_email": "[[user_email]]",
  "customer_phone": "+44 (0)784297 1234",
  "user_data": {
    "foo": "bar",
    "pi": 3.14
  },
  "customer_payment": {
    "amount": 9.99,
    "currency": "USD"
  },
  "jobs": [{
    "assets": ["http://psps.s3.amazonaws.com/sdk_static/1.jpg"],
    "template_id": "i6_case"
  }, {
    "assets": ["http://psps.s3.amazonaws.com/sdk_static/2.jpg"],
    "template_id": "a1_poster"
  }]
}

An order encapsulates all the details required to create & deliver one or more personalised products (described by job objects) to an address. For example the order represented by the JSON on the right would result in an iPhone 6 Case and an A1 Poster being created and shipped to the specified address.

Attributes

proof_of_paymentstring The proof of payment is a either a PayPal REST payment id for a payment/transaction made to the Kite PayPal account or a Stripe token created using Kite’s Stripe publishable key. This field will be absent if you opted for taking payment yourself
shipping_addressaddress object The address to which the order will be delivered
customer_emailstring The customer’s email address. Automated order status update emails (you can brand these) can optionally be sent to this address i.e. order confirmation email, order dispatched email, etc. You can configure these in the Kite dashboard
customer_phonestring The customer’s phone number. Certain postage companies require this to be provided e.g. FedEx
user_datadictionary A dictionary containing any application or user specific meta data that you attached to the order.
customer_paymentdictionary A dictionary containing the amount paid by the customer. In instances where Kite does not take payment (i.e you are using your secret key in the Authorization header to validate orders), this field is required to give an accurate representation on the profit made on the sale within the orders section of the Kite dashboard.
jobslist A list of one or more job objects to be created and delivered to shipping_address

Placing orders

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
    "address_line_2": "27-28 Eastcastle Street",
    "city": "London",
    "county_state": "Greater London",
    "postcode": "W1W 8DH",
    "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/1.jpg"],
    "template_id": "i6_case"
    }, {
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/2.jpg"],
    "template_id": "a1_poster"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @[
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]]
];

id<OLPrintJob> iPhone6Case = [OLPrintJob printJobWithTemplateId:@"i6_case" OLAssets:assets];
id<OLPrintJob> poster = [OLPrintJob printJobWithTemplateId:@"a1_poster" OLAssets:assets];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:iPhone6Case];
[order addPrintJob:poster];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

ArrayList<Asset> assets = new ArrayList<Asset>();
assets.add(new Asset(R.drawable.photo));

PrintJob iPhone6Case = PrintJob.createPrintJob(assets, "i6_case");
PrintJob poster = PrintJob.createPrintJob(assets, "a1_poster");

PrintOrder order = new PrintOrder();
order.addPrintJob(iPhone6Case);
order.addPrintJob(poster);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}
// See above submitForPrintingWithProgressHandler:completionHandler:
// PrintOrderSubmissionListener implementation

@Override
public void onSubmissionComplete(PrintOrder printOrder, String orderIdReceipt) {
  // Print order was successfully submitted to the system, display success to the user
}

@Override
public void onError(PrintOrder printOrder, Exception error) {
  // Handle error gracefully
}

With a single API request to Kite you can have personalised products created, packaged and shipped anywhere in the world. Packaging will carry your branding, not ours – your customers never need to know we were involved!

For example the request on the right would result in an iPhone 6 Case and an A1 Poster being created and shipped to the specified address.

Product identifiers and product specific request arguments (if any) are documented in dedicated sections following this one.

HTTP Request

POST [[api_endpoint]]/v4.0/print/

Arguments

proof_of_paymentoptional, either proof_of_payment or a secret key in Authorization header is required The proof of payment is a either a PayPal REST payment id for a payment/transaction made to the Kite PayPal account or a Stripe token created using Kite’s Stripe publishable key. This field is optional if you opted for taking payment yourself
shipping_addressrequired An address object indicating the address to which the order will be delivered
customer_emailoptional The customer’s email address. Automated order status update emails (you can brand these) can optionally be sent to this address i.e. order confirmation email, order dispatched email, etc. You can configure these in the Kite dashboard
customer_phonerequired The customer’s phone number. Certain postage companies require this to be provided e.g. FedEx
user_dataoptional A dictionary containing any application or user specific meta data that you might want associated with the order
customer_paymentoptional A dictionary containing the amount paid by the customer. In instances where Kite does not take payment (i.e you are using your secret key in the Authorization header to validate orders), this field is required to give an accurate representation on the profit made on the sale within the orders section of the Kite dashboard.
jobsrequired A list of one or more job objects to be created and delivered to shipping_address

Returns

Returns a dictionary containing the order id

Ordering print products

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": [
        "http://psps.s3.amazonaws.com/sdk_static/1.jpg",
        "http://psps.s3.amazonaws.com/sdk_static/2.jpg",
        "http://psps.s3.amazonaws.com/sdk_static/3.jpg",
        "http://psps.s3.amazonaws.com/sdk_static/4.jpg"
      ],
      "template_id": "squares"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @[
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]],
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/2.jpg"]],
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/3.jpg"]],
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/4.jpg"]]
];

id<OLPrintJob> squarePrints = [OLPrintJob printJobWithTemplateId:@"squares" OLAssets:assets];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:squarePrints];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

ArrayList<Asset> assets = new ArrayList<Asset>();
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/1.jpg"))));
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/2.jpg"))));
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/3.jpg"))));
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/4.jpg"))));

PrintJob squarePrints = PrintJob.createPrintJob(assets, "squares");

PrintOrder order = new PrintOrder();
order.addPrintJob(squarePrints);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a square prints being created and shipped to the specified address.

The maximum number of print assets that can be supplied for a print product can be found on the products page of your personal dashboard. For products such as phone cases, cushions, canvas’s etc this number will be 1.

Jobs which are submitted with more assets than the stated maximum units per pack, will be automatically split into a separate job.

Magnetsmagnets Our magnets are printed on a unique MagneCote substrate, providing photo quality imagery with a thin magnetic backing
Square Printssquares Amazing quality square prints printed on 350 GSM card completed with a matte finish
Mini Square Printssquares_mini Like our Square Prints, just smaller! Amazing quality printed on 350 GSM card completed with a matte finish
Retro Printspolaroids Polaroid style prints printed on 350 GSM card completed with a matte finish
Mini Retro Printspolaroids_mini Like our Retro Prints, just smaller! Mini Polaroid style prints printed on 350 GSM card completed with a matte finish
Classic Photo Printsphotos_4x6 Our classic photo 6x4 prints printed on 350 GSM card completed with a matte finish
Square Stickersstickers_square Fun personalised square stickers. Just peel them off and stick them on
Circle Stickersstickers_circle Fun personalised circle stickers. Just peel them off and stick them on
Greetings Cardsgreeting_cards Our greetings cards are printed on thick premium card stock and once folded, form a 14.8 cm square
Framesframes_50cm frames_50cm_2x2 frames_50cm_3x3 frames_50cm_4x4 The perfect way to show off your most loved photos. They come in various configurations allowing between one and sixteen images to printed and enclosed within a wooden frame (Available UK only).
A1 Postera1_poster
a1_poster_35
a1_poster_54
a1_poster_70
Our large format poster prints are printed on 190 GSM sheets with a satin finish. Various templates are available from single images to photo collages. They are delivered worldwide in sturdy cardboard tubes
A2 Postera2_poster
a2_poster_24
a2_poster_35
a2_poster_54
Our large format poster prints are printed on 190 GSM sheets with a satin finish. Various templates are available from single images to photo collages. They are delivered worldwide in sturdy cardboard tubes
A3 Postera3_poster Our large format poster prints are printed on 190 GSM sheets with a satin finish. They are delivered worldwide in sturdy cardboard tubes

Ordering phone cases

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/1.jpg"],
      "template_id": "ipad_air_case"
    }, {
      "options": {
        "case_style": "matte"
      },
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/2.jpg"],
      "template_id": "samsung_s5_case"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @[
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]]
];

id<OLPrintJob> ipadAirCase = [OLPrintJob printJobWithTemplateId:@"ipad_air_case" OLAssets:assets];
id<OLPrintJob> galaxyS5Case = [OLPrintJob printJobWithTemplateId:@"samsung_s5_case" OLAssets:assets];
[galaxyS5Case setValue:@"matte" forOption:@"case_style"];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:ipadAirCase];
[order addPrintJob:galaxyS5Case];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

ArrayList<Asset> assets = new ArrayList<Asset>();
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/1.jpg"))));

PrintJob ipadAirCase = PrintJob.createPrintJob(assets, "ipad_air_case");
PrintJob galaxyS5Case = PrintJob.createPrintJob(assets, "samsung_s5_case");
galaxyS5Case.setOption("case_style", "matte");

PrintOrder order = new PrintOrder();
order.addPrintJob(ipadAirCase);
order.addPrintJob(galaxyS5Case);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in iPad Air & Samsung Galaxy 5 cases being created and shipped to the specified address.

cases & template_ids

iPhone 6s+ Casei6splus_caseCase Mask iPhone 6s snap case constructed to the highest quality design, material & coating
iPhone 6s+ Tough Casei6splus_tough_caseCase Mask iPhone 6s + tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 6+ Casei6plus_caseCase Mask iPhone 6+ snap case constructed to the highest quality design, material & coating
iPhone 6+ Tough Casei6plus_tough_caseCase Mask iPhone 6+ tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 6s Casei6s_caseCase Mask iPhone 6s snap case constructed to the highest quality design, material & coating
iPhone 6s Tough Casei6s_tough_caseCase Mask iPhone 6s tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 6 Casei6_caseCase Mask iPhone 6 snap case constructed to the highest quality design, material & coating
iPhone 6 Tough Casei6_tough_caseCase Mask iPhone 6 tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 5/5S Casei5_caseCase Mask iPhone 5 snap case constructed to the highest quality design, material & coating
iPhone 5/5S Tough Casei5_tough_caseCase Mask iPhone 5 tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 5C Casei5c_caseCase Mask iPhone 5c snap case constructed to the highest quality design, material & coating
iPhone 5C Tough Casei5c_tough_caseCase Mask iPhone 5c tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPhone 4/4S Casei4_caseCase Mask iPhone 4 snap case constructed to the highest quality design, material & coating
iPhone 4/4S Tough Casei4_tough_caseCase Mask iPhone 4 tough case constructed to the highest quality design, material & coating. Durable two layered case that offer the best solution for protecting your phone
iPad Mini Caseipad_mini_caseCase Mask iPad Mini snap case constructed to the highest quality design, material & coating
iPad Air Caseipad_air_caseCase Mask iPad Air snap case constructed to the highest quality design, material & coating
iPad 2,3,4 Caseipad_caseCase Mask iPad 2,3,4 snap case constructed to the highest quality design, material & coating
Samsung Galaxy S7 Edge Casesamsung_s7e_caseCase Mask Samsung Galaxy S6 Edge snap case constructed to the highest quality design, material & coating
Samsung Galaxy S7 Casesamsung_s7_caseCase Mask Samsung Galaxy S6 Edge snap case constructed to the highest quality design, material & coating
Samsung Galaxy S6 Edge Casesamsung_s6e_caseCase Mask Samsung Galaxy S6 Edge snap case constructed to the highest quality design, material & coating
Samsung Galaxy S6 Casesamsung_s6_caseCase Mask Samsung Galaxy S6 snap case constructed to the highest quality design, material & coating
Samsung Galaxy S5 Casesamsung_s5_caseCase Mask Samsung Galaxy S5 snap case constructed to the highest quality design, material & coating
Samsung Galaxy S5 Mini Casesamsung_s5_mini_caseCase Mask Samsung Galaxy S5 Mini snap case constructed to the highest quality design, material & coating
Samsung Galaxy S4 Casesamsung_s4_caseCase Mask Samsung Galaxy S4 snap case constructed to the highest quality design, material & coating
Samsung Galaxy S4 Mini Casesamsung_s4_mini_caseCase Mask Samsung Galaxy S4 Mini snap case constructed to the highest quality design, material & coating
Samsung Galaxy S3 Casesamsung_s3_caseCase Mask Samsung Galaxy S3 snap case constructed to the highest quality design, material & coating
Samsung Galaxy S3 Mini Casesamsung_s3_mini_caseCase Mask Samsung Galaxy S3 Mini snap case constructed to the highest quality design, material & coating
Samsung Galaxy Note 4 Casesamsung_n4_caseCase Mask Samsung Galaxy Note 4 snap case constructed to the highest quality design, material & coating
Samsung Galaxy Note 3 Casesamsung_n3_caseCase Mask Samsung Galaxy Note 3 snap case constructed to the highest quality design, material & coating
Sony Xperia Z1 Casesony_x_z1_caseCase Mask Sony Xperia Z1 snap case constructed to the highest quality design, material & coating
Sony Xperia C Casesony_x_c_caseCase Mask Sony Xperia Z1 snap case constructed to the highest quality design, material & coating
LG G2 Caselg_g2_caseCase Mask LG G2 snap case constructed to the highest quality design, material & coating
Nexus 7 Casenexus_7_caseCase Mask Nexus 7 snap case constructed to the highest quality design, material & coating
Nexus 5 Casenexus_5_caseCase Mask Nexus 5 snap case constructed to the highest quality design, material & coating

Options Arguments

case_styleoptional Either matte or gloss. Defaults to gloss if not present. matte style only valid for i4_case, i5_case, i5c_case, i6_case, i6s_case, i6plus_case, i6splus_case, samsung_s4_case, samsung_s5_case, samsung_s6_case , samsung_s6e_case, samsung_s7_case and samsung_s7e_case.

Ordering homeware

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/1.jpg"],
      "template_id": "suede_12x12_cushion"
    }, {
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/2.jpg"],
      "template_id": "towel_75x145"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @[
    [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]]
];

id<OLPrintJob> suedeCushion = [OLPrintJob printJobWithTemplateId:@"suede_12x12_cushion" OLAssets:assets];
id<OLPrintJob> towel = [OLPrintJob printJobWithTemplateId:@"towel_75x145" OLAssets:assets];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:suedeCushion];
[order addPrintJob:towel];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

ArrayList<Asset> assets = new ArrayList<Asset>();
assets.add(new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/1.jpg"))));

PrintJob suedeCushion = PrintJob.createPrintJob(assets, "suede_12x12_cushion");
PrintJob towel = PrintJob.createPrintJob(assets, "towel_75x145");

PrintOrder order = new PrintOrder();
order.addPrintJob(suedeCushion);
order.addPrintJob(towel);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a suede 12" x 12" cushion and medium towel being created and shipped to the specified address.

Homeware product range

Suede 12" Cushionsuede_12x12_cushionDesign Mask Square faux suede cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Suede 18" Cushionsuede_18x18_cushionDesign Mask Square faux suede cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Canvas 12" Cushioncanvas_12x12_cushionDesign Mask Square canvas cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Canvas 18" Cushioncanvas_18x18_cushionDesign Mask Square canvas cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Linen 12" Cushionlinen_12x12_cushionDesign Mask Square linen cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Linen 18" Cushionlinen_18x18_cushionDesign Mask Square linen cushion, with a beautiful finish. Stone coloured back with a completely personalisable front printed in high definition full colour.
Small Towel Cushiontowel_55x105Design Mask Small microfibre 55 x 105cm beach towel with terry towelling loop with permanent print all over one side. Soaks well, dries fast and is light and easy to pack.
Medium Towel Cushiontowel_75x145Design Mask Medium microfibre 75 x 145cm beach towel with terry towelling loop with permanent print all over one side. Soaks well, dries fast and is light and easy to pack.
Large Towel Cushiontowel_85x165Design Mask Large microfibre 85 x 165cm beach towel with terry towelling loop with permanent print all over one side. Soaks well, dries fast and is light and easy to pack.
White 11oz Mugmug_11ozDesign Mask Our top quality sublimation blank 11oz mugs are dishwasher safe and are pure white Orca coated. A fantastic personalised product for your store
Square Tote Bag tote_bag_43x43cmDesign Mask High Quality 46x46cm double sided print tote bag. Carry all your essentials and complement any outfit with a beautiful personalised Totebag
Magnet Frame 10x10cm Cushionmagnet_frame_10x10 Re-useable square magnet frame.

Ordering DTG apparel

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "options": {
        "garment_size": "M",
        "garment_color": "white"
      },
      "assets": {
        "center_chest": "http://psps.s3.amazonaws.com/sdk_static/1.jpg"
      },
      "template_id": "aa_mens_tshirt"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @{
    @"center_chest": [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]]
};

id<OLPrintJob> tshirt = [OLPrintJob printJobWithTemplateId:@"aa_mens_tshirt" OLAssets:assets];
[tshirt setValue:@"M" forOption:@"garment_size"];
[tshirt setValue:@"white" forOption:@"garment_color"];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:tshirt];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

Map<String, Asset> assets = new HashMap<String, Asset>();
assets.put("center_chest", new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/1.jpg"))));

PrintJob tshirt = PrintJob.createPrintJob(assets, "aa_mens_tshirt");
tshirt.setOption("garment_size", "M");
tshirt.setOption("garment_color", "white");

PrintOrder order = new PrintOrder();
order.addPrintJob(tshirt);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a t-shirt being created (with an photo on the front) and shipped to the specified address.

Many more products and brands available in the very near future.

products & template_ids

American Apparel Mens T-Shirtaa_mens_tshirt The softest, smoothest, best-looking short sleeve tee shirt available anywhere! Fine Jersey (100% Cotton) construction (Heather Grey contains 10% Polyester) • Durable rib neckband
American Apparel Womens T-Shirtaa_womens_tshirt A classic cut ladies t shirt that suits all ages and can be worn in lots of ways. The fabric of this t-shirt is ultra-soft and it is slim fitted with a durable rib neckline. Fabric: 100% Cotton
American Apparel Zip Fleece Hoodieaa_zip_hoodie A bestselling fitted hooded top by this favourite America brand. Features a full white zip, white draw cords and kangaroo pouch pockets. Fabric: 50% Cotton 50% Polyester
American Apparel Fleece Pullover Hoodieaa_fleece_pullover_hoodie The American Apparel Unisex Fleece Pullover Hoody is a unisex hoodie which is both a warm and comfortable piece of clothing. Raglan cut sleeves, ribbed cuffs and hem. Fabric: 100% Cotton
American Apparel Fine Jersey Zip Hoodie aa_fine_zip_hoodie A lightweight fine jersey hoody with a matching nylon zipper closure and a matching finished polyester drawcord. Kangaroo pockets. Fabric : 100% Cotton
American Apparel Tank Top aa_tank_top A bright and fashionable jersey tank, which suits customers old and young. It is soft and comfortable to wear. It is sleeveless and hangs loosely; it has contrasting piping round the neck and arm openings. Fabric: 100% Cotton
AWD Hooded Sweatshirt awd_hooded_sweatshirt The AWDis College Hoodie boasts twin needle stitching detailing, a double fabric hood, and self coloured cords. Also with a ribbed cuff and hem and a kangaroo pouch pocket containing an opening for earphone cord feed. Fabric: 80% Cotton / 20% Polyester (280gsm).
AWD Ladies Tank Top awd_ladies_tank_top The Girlie Cool Vest from AWD is tailor made to fit the contours of the female form and comes a range of fantastic colours. There is a curved back hem for extra comfort and AWDis’s own Neoteric textured fabric has great wicking properties. Fabric: 100% Polyester.
AWD Men’s Muscle Vest awd_mens_muscle_vest Gym fit. Thin shoulder straps, for ease of movement. AWDis’s own NeotericTM textured fabric with inherent wickability. Straight front and back hem. Fabric: 100% Polyester.
Gildan Adult Cotton T-Shirt gildan_adult_cotton_tshirt High quality Gildan t-shirt which keeps it’s shape wash after wash. Taped neck and shoulders with a quarter turn to eliminate centre crease. Fabric 100% Cotton
Gildan Adult Dryblend Crew Neck Sweatshirt gildan_dry_blend_sweatshirt Air Jet yarn, softer feel and no pilling. DryBlend wicking performance. Heat transfer label. Twin needle stitching. 1x1 athletic rib with Spandex. Quarter turned to eliminate centre crease.
Gildan Adult Full Zip Hooded Sweatshirt gildan_zip_hooded_sweatshirt The Gildan HeavyBlend Adult Full Zip Hoodie features an unlined hood with matching drawstring, double-needle stitching, and set-in sleeves. Fabric: 50% Cotton, 50% Polyester
Gildan Adult Hooded Sweatshirt gildan_hooded_sweatshirt The Gildan HeavyBlend Adult Hoodie features a double lined hood with matching drawstring, pouch pocket, and twin needle stitching. Fabric: 50% Cotton, 50% Polyester
Gildan Heavyblend Adult Crew Neck Sweatshirt gildan_heavy_blend_sweatshirt The Gildan HeavyBlend Adult Crew Neck Sweatshirt is manufactured with an Air Jet yarn which gives a much softer feel and no pilling even after extended use. Constructed with double needle stitching, 1x1 athletic rib with Spandex & Quarter turned to eliminate centre crease. Fabric: 50% Cotton, 50% Polyester
Gildan Soft Style Tank Top gildan_tank_top Gildan Soft Style Tank Top has deluxe 30’s Softstyle yarns, wide straps and a rib knit trim applied to neckline and armholes. Twin needle bottom hem. Quarter-turned to eliminate centre crease. Fabric: 100% Cotton

Required Options Arguments

garment_sizerequired The size of garment you want created. Must be one of the following: S, M, L, XL, XXL corresponding to small, medium, large, extra large & extra extra large respectively
garment_colorrequired The base material/fabric colour of the garment you want created. See our available garment colors table to review fabric colours.

Available Garment Colours

Color Hexadecimal Code
Blue      004EA8
Light Blue      A3B3CB
Navy      263147
Carolina Blue      7BA4DB
Airforce Blue      486682
Coral      FF5A60
Baby Pink      E8BCD1
Red      D60024
Cherry Red      AC2B37
Truffle      6C333A
Brick Red      560B14
Maroon      5B2B42
Purple      531D8A
Yellow      EDD35E
Sunshine      FBDE4A
Gold      EEAD1A
Dark Heather      3F4444
Green      1C704D
Kelly Green      00805E
Grass      5AAD52
Peppermint      8CD2BF
Ash      D4D3D9
Heather Grey      ADBDBF
Charcoal      66676C
Grey      B0B0B2
Asphalt      353146
Jet Black      1A2424
Black      25282B
White      FFFFFF

Available Print Areas

Position Dimensions
center_chestoptional T-Shirt Print API Centre Chest 2100 x 2400 px (30x40cm)
center_backoptional T-Shirt Print API Centre Back 2100 x 2400 px (30x40cm)

Assets Position Arguments

All apparel orders must be made with options and sizes that correspond to the product ordered as detailed in the below table.

Product Template Applicable Positions Available Colors Available Sizes
aa_mens_tshirt center_chest, center_back black, white, heather_grey s,m,l,xl
aa_womens_tshirt center_chest, center_back black, white, heather_grey s,m,l,xl
aa_zip_hoodie center_chest, center_back black, white s,m,l,xl
aa_tank_top center_chest, center_back black, white, red, heather_grey, navy, coral, sunshine, grass s,m,l,xl
aa_fleece_pullover_hoodie center_chest, center_back grey, navy, truffle, kelly_green, asphalt s,m,l,xl
aa_fine_zip_hoodie center_chest, center_back black, white s,m,l,xl
gildan_adult_cotton_tshirt center_chest, center_back black, white, grey s,m,l,xl
gildan_tank_top center_chest, center_back red, white, heather_grey, navy, charcoal s,m,l,xl
gildan_hooded_sweatshirt center_chest, center_back cherry_red, carolina_blue, black, gold, charcoal s,m,l,xl
gildan_dry_blend_sweatshirt center_chest, center_back black, blue, green, grey, red s,m,l,xl
gildan_heavy_blend_sweatshirt center_chest, center_back black, blue, green, grey, red s,m,l,xl
gildan_zip_hooded_sweatshirt center_chest, center_back black, dark_heather, maroon, navy, carolina_blue, ash s,m,l,xl
awd_hooded_sweatshirt center_chest, center_back heather_grey, ash, gold, airforce_blue, baby_pink, peppermint, jet_black, brick_red s,m,l,xl
awd_ladies_tank_top center_chest, center_back white, yellow, purple, sapphire_blue s,m,l,xl
awd_mens_muscle_vest center_chest, center_back black s,m,l,xl

Ordering sublimation apparel

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "options": {
        "garment_size": "M"
      },
      "assets": {
        "front_image": "http://psps.s3.amazonaws.com/sdk_static/1.jpg",
        "back_image": "http://psps.s3.amazonaws.com/sdk_static/2.jpg"
      },
      "template_id": "awd_sublimation_tshirt"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @{
    @"front_image": [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]]
};

id<OLPrintJob> tshirt = [OLPrintJob printJobWithTemplateId:@"awd_sublimation_tshirt" OLAssets:assets];
[tshirt setValue:@"M" forOption:@"garment_size"];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:tshirt];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

Map<String, Asset> assets = new HashMap<String, Asset>();
assets.put("front_image", new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/1.jpg"))));

PrintJob tshirt = PrintJob.createPrintJob(assets, "awd_sublimation_tshirt");
tshirt.setOption("garment_size", "M");

PrintOrder order = new PrintOrder();
order.addPrintJob(tshirt);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

Sublimation printing allows for an image asset to be printed anywhere on the entire garment and is well suited to printing of patterned designs. All t-shirts are printed on a white t-shirts and are made of 100% Polyester which ensures the best colour transfer to the garment during the printing process.

The example request on the right would result in a sublimation t-shirt being created (with a front and back image) and shipped to the specified address.

Many more products and brands available in the very near future.

products & template_ids

AWD Sublimation T-Shirtawd_sublimation_tshirt Just Sub shirts are made from 175 gsm 100% Polyester Jersey fabric durable enough to do justice to a permanent printing process. They retain all of the advantages of quick drying, easy care polyester, but when Sublimation printed at 190-200 degrees Centigrade exhibit minimal and very acceptable levels of marking which all but disappear in steaming or washing,
AWD Kids Sublimation T-Shirtawd_kids_sublimation_tshirt Just Sub shirts are made from 175 gsm 100% Polyester Jersey fabric durable enough to do justice to a permanent printing process. They retain all of the advantages of quick drying, easy care polyester, but when Sublimation printed at 190-200 degrees Centigrade exhibit minimal and very acceptable levels of marking which all but disappear in steaming or washing,
Subli Sublimation T-Shirtroly_sublimation_tshirt Short sleeve t-shirt with ribbed round collar in the same fabric and side seams. Made of polyester fabric with cotton touch. 100% polyester, cotton touch, 140 gsm.
American Apparel Sublimation T-shirtaa_sublimation_tshirt A comfortable and lightweight 100% Polyester T-shirt with Durable rib neckband. Made of a fine count yarn giving superior sublimation results
American Apparel Sublimation Vestaa_sublimation_vest Our American Apparel Unisex sublimation tanks are 100% polyester jersey tanks designed especially for sublimation. Ultra-soft to touch and are sleeveless with a scooped neck.

Required Options Arguments

garment_sizerequired The size of garment you want created. Must be one of the following for adult apparel: S, M, L, XL, XXL corresponding to small, medium, large, extra large & extra extra large respectively. Alternate sizing options are detailed for childrens apparel below.

Available Print Areas

Position Dimensions
front_imageoptional 4500 x 3985 px (76x67cm)
back_imageoptional 4500 x 3985 px (76x67cm)

Assets Position Arguments

All apparel orders must be made with options and sizes that correspond to the product ordered as detailed in the below table.

Product Template Applicable Positions Available Sizes
awd_sublimation_tshirt front_image, back_image s,m,l,xl
awd_kids_sublimation_tshirt front_image, back_image 3to4, 5to6, 7to8, 9to10, 12to13
roly_sublimation_tshirt front_image, back_image s,m,l,xl
aa_sublimation_tshirt front_image, back_image s,m,l,xl
aa_sublimation_vest front_image, back_image s,m,l,xl

Ordering photobooks

Example Order Request (JSON route)

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
   "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
   },
   "customer_email": "deon@kite.ly",
   "customer_phone": "+44 (0)784297 1234",
   "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
   },
   "jobs": [{
      "template_id": "photobook_wrap_280x210_sm",
      "assets": {
         "front_cover": "https://s3.amazonaws.com/sdk-static/TestImages/front.png",
         "back_cover": "https://s3.amazonaws.com/sdk-static/TestImages/back.png",
         "pages": [
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/1.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/2.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/3.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/4.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/5.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/6.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/7.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/8.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/9.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/10.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/11.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/12.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/13.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/14.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/15.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/16.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/17.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/18.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/19.png"
            },
            {
               "layout": "single_centered",
               "asset": "https://s3.amazonaws.com/sdk-static/TestImages/20.png"
            }
         ]
      }
   }]
}'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

NSArray *assets = @[
    [OLAsset assetWithURL:[NSURL URLWithString:@"https://s3.amazonaws.com/sdk-static/portrait_photobook.pdf"]]
];

id<OLPrintJob> photobook = [OLPrintJob printJobWithTemplateId:@"photobook_wrap_280x210_sm" OLAssets:assets];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:photobook];

OLAddress *a    = [[OLAddress alloc] init];
a.recipientName = @"Deon Botha";
a.line1         = @"27-28 Eastcastle House";
a.line2         = @"Eastcastle Street";
a.city          = @"London";
a.stateOrCounty = @"Greater London";
a.zipOrPostcode = @"W1W 8DH";
a.country       = [OLCountry countryForCode:@"GBR"];

order.shippingAddress = a;

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

ArrayList<Asset> assets = new ArrayList<Asset>();
assets.add(new Asset(new URL("https://s3.amazonaws.com/sdk-static/portrait_photobook.pdf"))));

PrintJob photobook = PrintJob.createPrintJob(assets, "photobook_wrap_280x210_sm");

PrintOrder order = new PrintOrder();
order.addPrintJob(ipadAirCase);
order.addPrintJob(galaxyS5Case);

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

order.setShippingAddress(a);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

There are two options for ordering photobooks: (1) via our JSON representation or (2) using pre-constructed PDFs.

Photobook JSON representation

The easiest approach for placing photo book orders is to describe the book using our JSON interface. In this way, you can define the layouts and photos for each page without actually creating the PDF yourself.

The first example request on the right would result in a hardcover landscape photobook being created and shipped to the specified address.

assets object

front_cover An image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. This image will be used as the front cover.
back_cover An image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. This image will be used as the back cover.
pagesrequired An array of page objects. You must submit at least 20 pages. Thereafter, you may increment the count in multiples of 4.

page object

layoutrequired String name of one of the supported layouts.
assetrequired An image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite.

Supported layouts

single_centered A single image taking up the entire page.

Photobook PDF route

Example Order Request (PDF route)

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
   "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
   },
   "customer_email": "deon@kite.ly",
   "customer_phone": "+44 (0)784297 1234",
   "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
   },
   "jobs": [{
      "template_id": "photobook_wrap_21x21_square",
      "page_count": 20,
      "assets": {
         "inside_pdf": "https://s3-eu-west-1.amazonaws.com/co.oceanlabs.ps/book_samples/photobook_wrap_21x21_square/inside.pdf",
         "cover_pdf": "https://s3-eu-west-1.amazonaws.com/co.oceanlabs.ps/book_samples/photobook_wrap_21x21_square/cover.pdf"
      }
   }]
}'

You may want more flexibility in designing your book, in which case you can send through a pre-made PDF. You will need to send through two PDFs, one for the inner block of pages and one for the front/back cover spread. Available books and the associated template IDs are given below:

Square Hardcover Book, 21 cmphotobook_wrap_21x21_square
Portrait Hardcover Book, A4photobook_wrap_a4_portrait
Landscape Hardcover Book, A4photobook_wrap_a4_landscape
Square Hardcover Book, 30 cmphotobook_wrap_30x30_square
Square Hardcover Book, 14 cmphotobook_soft_14x14
Square Softcover Book, 21 cmphotobook_soft_21x21
Portrait Hardcover Book, A4photobook_soft_a4_portrait
Landscape Hardcover Book, A4photobook_soft_a4_landscape

It is important that your PDFs match the sizes in the below size specs exactly. The sizes are given in millimeters (mm) and include 3 mm bleed.

Note that the possible page count ranges from 20 to 300, and as the size of the book increases, so too does the spine width, and therefore, the cover size. Note also the spine width calculations differ for softcover and hardcover books due to differing binding methods. Hardcover spines come in discrete steps as shown below while softcover spines are a continuous range. A 20-page softcover book has a 2.36 mm spine, adding 0.078 mm per additional page. For example, a 60-page book has a 5.48 mm spine.

You can download example PDFs (cover and inside) for our available products here.

Square Hardcover 21cm

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 50 216 x 216 486.76 x 262 6.76
51 - 100 216 x 216 491.25 x 262 11.25
101 - 150 216 x 216 495.75 x 262 15.75
151 - 200 216 x 216 500.24 x 262 20.24
201 - 250 216 x 216 504.74 x 262 24.74
251 - 300 216 x 216 509.24 x 262 29.24

Portrait Hardcover A4

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 50 216 x 303 486.76 x 349 6.76
51 - 100 216 x 303 491.25 x 349 11.25
101 - 150 216 x 303 495.75 x 349 15.75
151 - 200 216 x 303 500.24 x 349 20.24
201 - 250 216 x 303 504.74 x 349 24.74
251 - 300 216 x 303 509.24 x 349 29.24

Landscape Hardcover A4

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 50 303 x 216 660.76 x 262 6.76
51 - 100 303 x 216 665.25 x 262 11.25
101 - 150 303 x 216 669.75 x 262 15.75
151 - 200 303 x 216 674.24 x 262 20.24
201 - 250 303 x 216 678.74 x 262 24.74
251 - 300 303 x 216 683.24 x 262 29.24

Square Hardcover 30cm

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 50 305 x 305 664.76 x 351 6.76
51 - 100 305 x 305 669.25 x 351 11.25
101 - 150 305 x 305 673.75 x 351 15.75
151 - 200 305 x 305 678.24 x 351 20.24
201 - 250 305 x 305 682.74 x 351 24.74
251 - 300 305 x 305 687.24 x 351 29.24

Square Softcover 14cm

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 300 146 x 146 288.36 x 146 (20-page) 2.36 + 0.078 per page

Square Softcover 14cm

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 300 216 x 216 428.36 x 216 (20-page) 2.36 + 0.078 per page

Portrait Softcover A4

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 300 216 x 286 428.36 x 286 (20-page) 2.36 + 0.078 per page

Landscape Softcover A4

Page Range Inside page size (mm) Cover page size (mm) Spine width
20 - 300 286 x 216 568.36 x 216 (20-page) 2.36 + 0.078 per page

job object

page_countrequired An integer page count for the inside PDF.
assetsrequired An object providing URLs for the inside and cover PDFs. See below.

assets object

inside_pdfrequired An image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. This image will be used as the inside block.
cover_pdfrequired An image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. This image will be used as the front / back cover spread.

Ordering postcards

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": {
        "front_image": "http://psps.s3.amazonaws.com/sdk_static/4.jpg"
      },
      "template_id": "postcard",
      "message": "Hello World!"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

OLAsset *frontImage = [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/4.jpg"]];
id<OLPrintJob> postcard = [OLPrintJob postcardWithTemplateId:@"postcard" frontImageOLAsset:frontImage message:@"Hello World!" address:/*Address*/];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:postcard];

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

import ly.kite.address.Address;
import ly.kite.payment.PayPalCard;
import ly.kite.print.Asset;
import ly.kite.print.PrintJob;
import ly.kite.print.PrintOrder;

Address a = new Address();
a.setRecipientName("Deon Botha");
a.setLine1("Eastcastle House");
a.setLine2("27-28 Eastcastle Street");
a.setCity("London");
a.setStateOrCounty("London");
a.setZipOrPostalCode("W1W 8DH");
a.setCountry(Country.getInstance("GBR"));

Asset frontImage = new Asset(new URL("http://psps.s3.amazonaws.com/sdk_static/4.jpg")));
PrintJob postcard = PrintJob.createPostcardJob("postcard", frontImage, "Hello World", a);

PrintOrder order = new PrintOrder();
order.addPrintJob(postcard);

PayPalCard card = new PayPalCard();
card.setNumber("4121212121212127");
card.setExpireMonth(12);
card.setExpireYear(2012);
card.setCvv2("123");

card.chargeCard(PayPalCard.Environment.SANDBOX, printOrder.getCost(), PayPalCard.Currency.GBP, "A Kite order!", new PayPalCardChargeListener() {
    @Override
    public void onChargeSuccess(PayPalCard card, String proofOfPayment) {
        // set the PrintOrder proofOfPayment to the one provided and submit the order
    }

    @Override
    public void onError(PayPalCard card, Exception ex) {
        // handle gracefully
        order.setProofOfPayment(proofOfPayment);
        printOrder.submitForPrinting(getApplicationContext(), /*PrintOrderSubmissionListener:*/this);
    }
});

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a postcard being created and shipped to the specified address.

products & template_ids

Postcardpostcard Our postcards are printed on high quality 350gsm card stock with a gloss finish and dispatched worldwide

Job Arguments

messageoptional The text message that you want to appear on the back of the postcard

Assets Arguments

front_imagerequired A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. It will form the front of the postcard
back_imageoptional A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. Specifying a back_image gives you near total control of the back of postcard layout. In doing so you are expected to insert the message & recipient address directly into the image according to our guidelines

Ordering greeting cards

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": {
        "front_image": "https://s3.amazonaws.com/kite-samples/greetings/front.png",
        "back_image": "https://s3.amazonaws.com/kite-samples/greetings/back.png",
        "inside_right_image": "https://s3.amazonaws.com/kite-samples/greetings/inside.png"
      },
      "template_id": "greeting_cards_a5"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
#import <Kite-Print-SDK/OLKitePrintSDK.h>

OLAsset *frontImage = [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/1.jpg"]];
OLAsset *backImage = [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/2.jpg"]];
OLAsset *inLeftImage = [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/3.jpg"]];
OLAsset *inRightImage = [OLAsset assetWithURL:[NSURL URLWithString:@"http://psps.s3.amazonaws.com/sdk_static/4.jpg"]];
id<OLPrintJob> card = [OLPrintJob greetingCardWithTemplateId:@"greeting_cards_a5" frontImageOLAsset:frontImage backImageOLAsset:backImage insideRightImageAsset:inRightImage insideLeftImageAsset:inLeftImage];

OLPrintOrder *order = [[OLPrintOrder alloc] init];
[order addPrintJob:card];

OLPayPalCard *card = [[OLPayPalCard alloc] init];
card.type = kOLPayPalCardTypeVisa;
card.number = @"4121212121212127";
card.expireMonth = 12;
card.expireYear = 2020;
card.cvv2 = @"123";

[card chargeCard:printOrder.cost currencyCode:printOrder.currencyCode description:@"A Kite order!" completionHandler:^(NSString *proofOfPayment, NSError *error) {
  // if no error occured set the OLPrintOrder proofOfPayment to the one provided and submit the order
  order.proofOfPayment = proofOfPayment;
  [self.printOrder submitForPrintingWithProgressHandler:nil
                   completionHandler:^(NSString *orderIdReceipt, NSError *error) {
    // If there is no error then you can display a success outcome to the user
  }];
}];


// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a greetings card being created and shipped to the specified address.

products & template_ids

Greetings card A5 greeting_cards_a5 Our greetings cards are 330gsm Fedrigoni one sided Symbol gloss and gloss UV varnished card. Dispatched worldwide.
Greetings card 7"x5" greeting_cards_7x5 Our greetings cards are 330gsm Fedrigoni one sided Symbol gloss and gloss UV varnished card. Dispatched worldwide.
Greetings cards A5 (10 Pack) greeting_cards_a5_10pack Pack of 10 single design greetings cards printed on 330gsm Fedrigoni one sided Symbol gloss and gloss UV varnished card. Dispatched worldwide.
Greetings cards 7"x5" (10 Pack) greeting_cards_7x5_10pack Pack of 10 single design greetings cards printed on 330gsm Fedrigoni one sided Symbol gloss and gloss UV varnished card. Dispatched worldwide.

Assets Arguments

front_imagerequired A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. It will form the front of the greetings card
back_imageoptional A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. Specifying a back_image gives you total control of the back of the greetings card.
inside_left_imageoptional A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. Specifying an inside_left_image gives you total control of the inside of the greetings card.
inside_right_imageoptional A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. Specifying a inside_right_image gives you total control of the inside of the greetings card.

Ordering invitations

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
      "recipient_name": "Deon Botha",
      "address_line_1": "Eastcastle House",
      "address_line_2": "27-28 Eastcastle Street",
      "city": "London",
      "county_state": "Greater London",
      "postcode": "W1W 8DH",
      "country_code": "GBR"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 3.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": {
        "front_image": "https://s3.amazonaws.com/kite-samples/invitation/front.png",
        "back_image": "https://s3.amazonaws.com/kite-samples/invitation/back.png"
      },
      "template_id": "square_invitations_15x15cm"
    }]
  }'
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions
// See https://github.com/OceanLabs/iOS-Print-SDK#custom-user-experience for full step by step instructions

// See https://github.com/OceanLabs/Android-Print-SDK#custom-checkout for full step by step instructions

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Response

{
  "print_order_id": "PS96-996634811"
}

If you haven’t already, see Placing orders for a general overview of the order request & response which is applicable to all product orders.

The example request on the right would result in a greetings card being created and shipped to the specified address.

products & template_ids

Square Invitation square_invitations_15x15cm Double sided square invitation printed on 350gsm quality gloss card. Shipped within an addressed envelope and dispatched worldwide.
Square Invitation 10 pack square_invitations_15x15cm_10pack Pack of 10 double sided square invitation printed on 350gsm quality gloss card. Shipped within an addressed envelope and dispatched worldwide.

Assets Arguments

front_imagerequired A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. It will form the front of the invitation.
back_imagerequired A image URL accessible to the Kite servers or an asset object identifier that you have received by uploading an asset to Kite. It will form the front of the invitation.

Dimension Reference

The tables below detail the optimal asset pixel dimensions for products in our range. Whilst assets you provide to Kite can be smaller than this, it’s recommended you try get as close to these dimensions as possible to guarantee high quality prints.

OPTIMAL PRINT PRODUCT ASSET DIMENSIONS

productpixelscminches
A1 Postera1_poster7017×993359.4×84.123.4×33.1
A2 Postera2_poster4962×701742×59.416.5×23.4
A3 Postera3_poster3508×496129.7×4211.7×16.5
A4 Postera4_poster2481×350721×29.78.3×11.7
Classic prints (4x6)photos_4x61760×127614.9×10.85.9×4.3
Magnetsmagnets815×8156.9×6.92.7×2.7
Squaressquares1152×11529.8×9.83.8×3.8
Mini squaressquares_mini804×8046.8×6.82.7×2.7
Retro style printspolaroids1027×11928.7×10.13.4×4
Mini retro stylepolaroids_mini739×8326.3×72.5×2.8
Greeting Cardsgreeting_cards1069×10699.1×9.13.6×3.6
Greeting Cards A5greeting_cards_a51749×248114.8×215.8×8.3
Greeting Cards 7x5greeting_cards_7x51500×210012.7×17.85×7
Square Stickersstickers_square732×7326.2×6.22.4×2.4
Circle Stickersstickers_circle779×7796.6×6.62.6×2.6
Frames 50cmframes_50cm3426×342629×2911.4×11.4
Postcardpostcard1796×128815.2×10.96×4.3

OPTIMAL PHONE CASE ASSET DIMENSIONS

productpixelscminches
iPhone 6s Plusi6splus_tough_case1335×213211.3×18.14.5×7.1
iPhone 6s Plusi6splus_case1335×213211.3×18.14.5×7.1
iPhone 6si6s_case1086×17369.2×14.73.6×5.8
iPhone 6si6s_tough_case1191×189610.1×16.14×6.3
iPhone 6 Plusi6plus_tough_case1335×213211.3×18.14.5×7.1
iPhone 6 Plusi6plus_case1335×213211.3×18.14.5×7.1
iPhone 6/6s Plus Folioi6plus_folio_case2228×201518.9×17.17.4×6.7
iPhone 6i6_tough_case1182×189610×16.13.9×6.3
iPhone 6i6_case1086×17369.2×14.73.6×5.8
iPhone 6/6s Folioi6_folio_case2002×179117×15.26.7×6
iPhone 6/6s BakPak 1i6_bakpak_1_case889×17317.5×14.73×5.8
iPhone 6/6s BakPak 3i6_bakpak_3_case972×16778.2×14.23.2×5.6
iPhone 5/5si5_tough_case1086×17369.2×14.73.6×5.8
iPhone 5/5si5_case1032×16108.7×13.63.4×5.4
iPhone 5 Clik Cliki5_clik_case770×15426.5×13.12.6×5.1
iPhone 5Ci5c_tough_case1086×17369.2×14.73.6×5.8
iPhone 5Ci5c_case1032×16108.7×13.63.4×5.4
iPhone 4/4si4_tough_case1032×16108.7×13.63.4×5.4
iPhone 4/4si4_case1032×15428.7×13.13.4×5.1
Galaxy S6 Edgesamsung_s6e_tough_case1182×189610×16.13.9×6.3
Galaxy S6 Edgesamsung_s6e_case1182×189610×16.13.9×6.3
Galaxy S6samsung_s6_tough_case1182×189610×16.13.9×6.3
Galaxy S6samsung_s6_case1192×189610.1×16.14×6.3
Galaxy S5samsung_s5_tough_case1182×189610×16.13.9×6.3
Galaxy S5samsung_s5_case1182×189610×16.13.9×6.3
Galaxy S5 Minisamsung_s5_mini_case1086×17369.2×14.73.6×5.8
Galaxy S4samsung_s4_tough_case1086×17369.2×14.73.6×5.8
Galaxy S4samsung_s4_case1086×17369.2×14.73.6×5.8
Galaxy S4 Minisamsung_s4_mini_tough_case1032×16108.7×13.63.4×5.4
Galaxy S4 Minisamsung_s4_mini_case1032×16108.7×13.63.4×5.4
Galaxy S3samsung_s3_tough_case1086×17369.2×14.73.6×5.8
Galaxy S3samsung_s3_case1086×17369.2×14.73.6×5.8
Galaxy S3 Minisamsung_s3_mini_case1844×260015.6×226.1×8.7
Samsung Note 4samsung_n4_tough_case1335×213211.3×18.14.5×7.1
Samsung Note 4samsung_n4_case1335×213211.3×18.14.5×7.1
Samsung Note 3samsung_n3_case1200×204010.2×17.34×6.8
Sony Xperia Z1sony_x_z1_case1182×189610×16.13.9×6.3
Sony Xperia Csony_x_c_case1182×189610×16.13.9×6.3
LG G2lg_g2_case1182×189610×16.13.9×6.3
Motorola Gmoto_g_case1086×17369.2×14.73.6×5.8
Nexus 5nexus_5_case1182×189610×16.13.9×6.3

OPTIMAL TABLET CASE DIMENSIONS

productpixelscminches
iPad Mini 1ipad_mini_case1844×260015.6×226.1×8.7
iPad 2, 3 and 4ipad_case2472×308020.9×26.18.2×10.3
iPad Airipad_air_case2472×308020.9×26.18.2×10.3
Nexus 7nexus_7_case1778×284115.1×24.15.9×9.5

OPTIMAL PHOTOBOOK ASSET DIMENSIONS

productpixelscminches
Large Landscape Hardcoverphotobook_wrap_321x270_sm3792×319032.1×2712.6×10.6
Portrait Hardcoverphotobook_wrap_210x280_sm2481×330621×288.3×11
Landscape Hardcoverphotobook_wrap_280x210_sm3308×248128×2111×8.3
Large Square Hardcoverphotobook_wrap_300x300_sm3544×354430×3011.8×11.8
Medium Square Hardcoverphotobook_wrap_210x210_sm2481×248121×218.3×8.3
Small Square Hardcoverphotobook_wrap_140x140_sm1654×165414×145.5×5.5

OPTIMAL PHOTOBOX ASSET DIMENSIONS

productpixelscminches
iPhone 6 Plus Casei6ptc71335×232011.3×19.64.5×7.7
iPhone 6 Casei6cc71335×225711.3×19.14.5×7.5
iPhone 5/5S Casei5c41335×219911.3×18.64.5×7.3
iPhone 5C Caseiphone5c11335×219911.3×18.64.5×7.3
iPhone 5/5S Clear Casei5ccc11335×273411.3×23.14.5×9.1
iPhone 5 Clear Case Stickerstickeri5c1732×15006.2×12.72.4×5
iPhone 4/4S Casei4c91335×219511.3×18.64.5×7.3
iPhone 4/4S Clear Casei4ccc11335×258211.3×21.94.5×8.6
iPhone 4 Clear Case Stickerstickeri4c1715×13826.1×11.72.4×4.6
Galaxy S5 Casesgs5c11335×240311.3×20.34.5×8
Galaxy S4 Casesgs4c31335×229911.3×19.54.5×7.7
Galaxy S3 Casesgs3c41335×220011.3×18.64.5×7.3
Galaxy S2 Casesgs2c11335×205011.3×17.44.5×6.8
iPad 2/¾ Caseipad_case_11335×158811.3×13.44.5×5.3
iPad Mini Caseipadminic11335×180811.3×15.34.5×6
iPad Smart Coveripadsmartc61335×174011.3×14.74.5×5.8
iPad Mini Smart Coveripadminismartc11335×198111.3×16.84.5×6.6
Canvas Print 20 cm x 30 cmpbx_canvas_20x302363×354420×307.9×11.8
Canvas Print 30 cm x 20 cmpbx_canvas_30x203544×236330×2011.8×7.9
Canvas Print 30 cm x 30 cmpbx_canvas_30x303544×354430×3011.8×11.8
Classic Canvas 40 cm x 40 cmpbx_canvas_40x404725×472540×4015.8×15.8
12 Prints + Boxpbx_polaroids_121540×158013×13.45.1×5.3
24 Prints + Boxpbx_polaroids_241540×158013×13.45.1×5.3
36 Prints + Boxpbx_polaroids_361540×158013×13.45.1×5.3
A3 Posterpbx_a33508×496129.7×4211.7×16.5
Classic Printspbx_6x41800×120015.2×10.26×4
Large Classic Printspbx_7x52100×150017.8×12.77×5
Square Printspbx_squares_5x51500×150012.7×12.75×5
Square Printspbx_squares_8x82400×240020.3×20.38×8
Square Magnetspbx_magnets_8x81250×125010.6×10.64.2×4.2
Classic Magnetspbx_magnets_13x91536×106213×95.1×3.5
Classic Magnetspbx_magnets_15x101773×118215×105.9×3.9
Reusable Stickers 13cm x 9cmpbx_stickers_13x91536×106213×95.1×3.5
Pack of 10 Cardspbx_cards_a6_10pack1241×174910.5×14.84.1×5.8
Mugmgth104725×472540×4015.8×15.8
Bone China Mugmug_bone_wrap5850×240049.5×20.319.5×8
Timeless Framed Print 30cm x 30cmpbx_frame_30x303544×354430×3011.8×11.8
Classic Canvas 30 cm x 40 cmpbx_canvas_30x403544×472530×4011.8×15.8
3 Minute Book23540-3mbook_14725×472540×4015.8×15.8

OPTIMAL ALBELLI ASSET DIMENSIONS

productpixelscminches
Aluminium Printap_aluminium_400x4004725×472540×4015.8×15.8
Aluminium Printap_aluminium_300x4003544×472530×4011.8×15.8
Aluminium Printap_aluminium_400x3004725×354340×3015.8×11.8
Mounted Printap_mounted_400x4004725×472540×4015.8×15.8
Mounted Printap_mounted_400x3004725×354340×3015.8×11.8
Mounted Printap_mounted_300x4003544×472530×4011.8×15.8
Canvas Printap_canvas_400x3004725×354340×3015.8×11.8
Canvas Printap_canvas_300x4003544×472530×4011.8×15.8
Canvas Printap_canvas_400x4004725×472540×4015.8×15.8
Wood Printap_wood_400x3004725×354340×3015.8×11.8
Wood Printap_wood_300x4003544×472530×4011.8×15.8
Wood Printap_wood_400x4004725×472540×4015.8×15.8
Acrylic Printap_acrylic_300x4003544×472530×4011.8×15.8
Acrylic Printap_acrylic_400x3004725×354340×3015.8×11.8
Acrylic Printap_acrylic_400x4004725×472540×4015.8×15.8
Square Photo Bookap_album_210x2102481×248121×218.3×8.3
Metallic Squaresmetallic_8x82501×250121.2×21.28.3×8.3

Orders

It’s easy to fetch the list of orders and associated order details that you or your customers are placing against the Kite platform.

Getting a list of orders

Example Order List Request

curl "[[api_endpoint]]/v4.0/order/?order_by=-time_submitted&test_order=false&error_exclude=true" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>"

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Order List Response

{
  "meta": {
    "limit": 20,
    "next": "/v4.0/order/?offset=20&limit=20",
    "offset": 0,
    "previous": null,
    "total_count": 960914
  },
  "objects": [
    {
      "attributed_to_notification": null,
      "customer_email": "deon@kite.ly",
      "customer_payment": {
        "amount": "25.59",
        "currency": "GBP",
        "formatted": "£25.59"
      },
      "dispatch_status": "Dispatched",
      "order_id": "PS243-825654811",
      "person_id": 71283,
      "refund_request": null,
      "resource_uri": "/v4.0/order/PS243-825654811/",
      "status": "Processed",
      "test_order": false,
      "time_processed": "2015-08-31T13:09:01.670462",
      "time_submitted": "2015-08-31T13:09:01.670462"
    },
    ...
  ]
}

HTTP Request

GET [[api_endpoint]]/v4.0/order/

Arguments

order_byoptional Controls the ordering of the returned orders, valid options are time_submitted & status. A - can be added to the front of any option i.e. -time_submitted to reverse the ordering.
test_orderoptional If true then the results will be be filtered to only include test orders, if false then only live orders will be returned
error_excludeoptional If true then results will be filtered to only include successful orders, if false then only orders for which an error has occured will be returned
refund_requestedoptional If true then results will be filtered to only include orders for which the customer has requested a refunded, if false then only orders for which there has been no refund request
time_submitted__lteoptional An ISO 8601 UTC formatted date time value i.e. 2016-03-23T11:01:28.710Z. Orders will be filtered to only include those that were placed before this date & time
time_submitted__gteoptional An ISO 8601 UTC formatted date time value i.e. 2016-03-23T11:01:28.710Z. Orders will be filtered to only include those that were placed after this date & time

Returns

Returns a list of optionally filtered orders

Getting an order’s status

Example Order Detail Request

curl "[[api_endpoint]]/v4.0/order/PS320-236374811" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>"

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Order Detail Response

{
  "dispatch_status": "In Print Queue",
  "jobs": [
    {
      "job_id": "PS320-23637481101-S9-MAGNETS-M",
      "shipped_time": null,
      "status": "Received by Printer",
      "template": {
        "id": "s9_magnets_mini",
        "name": "Medium Photo Magnets"
      }
    }
  ],
  "order_id": "PS320-236374811",
  "status": "Processed",
  "test_order": false,
  "time_processed": "2015-11-16T20:04:12.209495",
  "time_submitted": "2015-11-16T20:04:12.209495"
}

HTTP Request

GET [[api_endpoint]]/v4.0/order/<order_id>

Arguments

order_idrequired The kite order id received in the response of a previous order submission

Returns

An order object detailing the order

Shipping Methods

Within versions of the Kite API v4.0 and upwards, it is possible to place orders with particular expedited and tracked shipping methods.

Each product has a 'Standard’ shipping class which in most cases will be an untracked delivery. Tracked and expedited delivery for a product can be retrieved from Kite and placed within the print order request to enable alternative shipping methods.

Getting shipping options for a product

Example Product response

curl "[[api_endpoint]]/v4.0/shipping_methods/a3_poster" \
  -H "Authorization: ApiKey [[public_key]]:"

Example Shipping Response

{
  "shipping_regions": {
    "ROW": {
      "name": "Rest of world",
      "shipping_classes": [
        {
          "class_name": "International Tracked",
          "costs": [
            {
              "amount": 6.35,
              "currency": "USD"
            },
            {
              "amount": 5.96,
              "currency": "EUR"
            },
            {
              "amount": 5.22,
              "currency": "GBP"
            }
          ],
          "display_name": "Royal Mail",
          "id": 2,
          "max_delivery_time": 10,
          "min_delivery_time": 3,
          "tracked": true
        },
        {
          "class_name": "Standard",
          "costs": [
            {
              "amount": 2.91,
              "currency": "USD"
            },
            {
              "amount": 2.73,
              "currency": "EUR"
            },
            {
              "amount": 2.39,
              "currency": "GBP"
            }
          ],
          "display_name": "Guernsey Post",
          "id": 1,
          "max_delivery_time": 10,
          "min_delivery_time": 3,
          "tracked": false
        }
      ]
    },
    "UK": {
      "name": "UK",
      "shipping_classes": [
        {
          "class_name": "UK Signed",
          "costs": [
            {
              "amount": 6.35,
              "currency": "USD"
            },
            {
              "amount": 5.96,
              "currency": "EUR"
            },
            {
              "amount": 5.22,
              "currency": "GBP"
            }
          ],
          "display_name": "Royal Mail",
          "id": 3,
          "max_delivery_time": 2,
          "min_delivery_time": 1,
          "tracked": true
        },
        {
          "class_name": "Standard",
          "costs": [
            {
              "amount": 2.91,
              "currency": "USD"
            },
            {
              "amount": 2.73,
              "currency": "EUR"
            },
            {
              "amount": 2.39,
              "currency": "GBP"
            }
          ],
          "display_name": "Guernsey Post",
          "id": 1,
          "max_delivery_time": 3,
          "min_delivery_time": 1,
          "tracked": false
        }
      ]
    }
  },
  "country_to_region_mapping": {
    "ABW": "ROW",
    "FLK": "ROW",
    "FRA": "ROW",
    "FRO": "ROW",
    "FSM": "ROW",
    "GAB": "ROW",
    "GBR": "UK",
    "GEO": "ROW",
    "GGY": "ROW",
    "GHA": "ROW",
    "GIB": "ROW",
    "GIN": "ROW",
    "GLP": "ROW",
    "GMB": "ROW",
    "USA": "ROW",
  },
  "template_id": "a3_poster",
}

HTTP List Request

GET [[api_endpoint]]/v4.0/shipping_methods/

HTTP Detail Request

GET [[api_endpoint]]/v4.0/shipping_methods/<template_id>

Returns

Returns a list of shipping options for the product. The shipping methods available are dependent on the destination country that you want to send the order too.

Determining your shipping region

The shipping region of your destination country can be found by looking up it’s 3 letter ISO country code within the shipping_regions dictionary of the response.

In the example on the right, a delivery to the United States (“USA”) would fall within the “ROW” shipping region while a delivery to the United Kingdom (“GBR”) would fall in the “GB” shipping region.

Retrieving available shipping methods

The available shipping methods to that country can then be looked up within the shipping_classes field of the shipping response.

The available shipping methods for a delivery to the United States (which is in the “ROW” shipping region) is shown on the right.

In this case there are two available options, International Tracked and Standard shipping.

Shipping response fields

Example Shipping Classes available for a delivery to the United States

{
  "shipping_regions": {
    "ROW": {
      "name": "Rest of world",
      "shipping_classes": [
        {
          "class_name": "International Tracked",
          "costs": [
            {
              "amount": 6.35,
              "currency": "USD"
            },
            {
              "amount": 5.96,
              "currency": "EUR"
            },
            {
              "amount": 5.22,
              "currency": "GBP"
            }
          ],
          "display_name": "Royal Mail",
          "id": 2,
          "max_delivery_time": 10,
          "min_delivery_time": 3,
          "tracked": true
        },
        {
          "class_name": "Standard",
          "costs": [
            {
              "amount": 2.91,
              "currency": "USD"
            },
            {
              "amount": 2.73,
              "currency": "EUR"
            },
            {
              "amount": 2.39,
              "currency": "GBP"
            }
          ],
          "display_name": "Guernsey Post",
          "id": 1,
          "max_delivery_time": 10,
          "min_delivery_time": 3,
          "tracked": false
        }
      ]
    }
  },
}
id The unique identifier of that shipping method
costs A dictionary of the associated postage cost of placing a order with that shipping method.
display_name The name of the mail carrier. Example carriers include Royal Mail, USPS or FedEx.
tracked Whether the delivery method includes order tracking. Tracking details can be retrieved once the order is dispatched from the Orders endpoint.
min_delivery_time The estimated earliest delivery time (in working days) once the order has been dispatched.
max_delivery_time The estimated latest delivery time (in working days) once the order has been dispatched.

Placing an order with a specified shipping method

Example Order Request

curl "[[api_endpoint]]/v4.0/print/" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>" \
  --data '{
    "shipping_address": {
    "recipient_name": "Deon Botha",
    "address_line_1": "The White House",
    "address_line_2": "1600 Pennsylvania Ave NW",
    "city": "Washington",
    "county_state": "Washington D.C",
    "postcode": "20500",
    "country_code": "USA"
    },
    "customer_email": "[[user_email]]",
    "customer_phone": "+44 (0)784297 1234",
    "customer_payment": {
      "amount": 29.99,
      "currency": "USD"
    },
    "jobs": [{
      "assets": ["http://psps.s3.amazonaws.com/sdk_static/2.jpg"],
      "shipping_class": 2,
      "template_id": "a3_poster"
    }]
  }'

Orders placed for products will default to it’s Standard shipping method. However you can specify an alternate shipping method (if it exists) for delivery to your destination country.

For example the request on the right would result in an A3 Poster being created and shipped to the United States using the International Tracked shipping method.

If an incorrect shipping_class is included within the order request that does not correspond to any available methods for that product, the job will fall back to the default Standard shipping method without raising an error.

The job object is covered in more detail within the job objects section of the documentation.

Specifying the shipping method with the job object

id optional The unique identifier of the shipping method that you would like to use for your ordered product

Customers

Rich customer profiles are built automatically for you when you or your users place an order. Our powerful filtering tools then allow you to segment your user base in all kinds of ways - to the point where you can single out individual users if you want.

Getting a list of people

Example Customer List Request

curl "[[api_endpoint]]/v4.0/person/?customer=true" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>"

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Customer List Response

{
  "meta": {
    "limit": 20,
    "next": "/v4.0/person/?customer=true&limit=20&offset=20",
    "offset": 0,
    "previous": null,
    "total_count": 44737
  },
  "objects": [
    {
      "address": {
        "city": "London",
        "country": "United Kingdom",
        "country_code": "GBR",
        "county_state": "Kent",
        "line1": "27-28 Eastcastle House",
        "line2": "Eastcastle Street",
        "line3": "",
        "line4": "",
        "postcode": "W1W 8DH",
        "recipient_name": "Deon Botha"
      },
      "country": {
        "country_code_2": "GB",
        "country_code_3": "GBR",
        "id": 13,
        "name": "United Kingdom",
        "resource_uri": "/v2.1/country/13/"
      },
      "created": "2016-02-27T22:45:28.629607",
      "email": "deon@kite.ly",
      "first_name": "Deon",
      "full_name": "Deon Botha",
      "id": 530395,
      "ip": "86.185.46.67",
      "last_name": "Botha",
      "last_seen": "2016-02-27T22:45:37.283464",
      "live_person": true,
      "meta_data": "{u'environment': u'Live', u'platform': u'iOS', u'Order Count': 1}",
      "orders": [
        "PS58-942265811"
      ],
      "phone": "",
      "region": "United Kingdom",
      "resource_uri": "/v2.1/person/530395/",
      "revenue": {
        "amount": "22.99",
        "currency": "GBP"
      },
      "timezone": "Europe/London",
      "timezone_utc_offset": 0,
      "uuid": "7EFB2CA8-8EFB-4FC3-88AB-2F02E6003731"
    },
    ...
    ]
}

HTTP Request

GET [[api_endpoint]]/v4.0/person/

Arguments

customeroptional If true then the resulting people list will be filtered to only include those who have placed an order, if false then the resulting list will only include people who have not placed an order
countryoptional A comma separated list of 3 digit country codes i.e. GBR,USA that will filter the resulting person list to only include people coming from the specified countries
order_count__gtoptional Filters the resulting list to only include customers who have ordered more than the specified number of times
order_count__ltoptional Filters the resulting list to only include customers who have ordered less than the specified number of times
last_ordered_date__ltoptional Filters the resulting person list to only include people that have ordered more recently that the value. Valid values include Ndays, Nweeks, Nmonths where N is a number i.e. last_ordered_date__lt=1days will filter the resulting list to only include customers who ordered within the last 1 day
last_ordered_date__gtoptional Filters the resulting person list to only include people that have ordered less recently that the value. Valid values include Ndays, Nweeks, Nmonths where N is a number i.e. last_ordered_date__gt=1days will filter the resulting list to only include customers who have ordered more than 1 day ago
push_token__issetoptional If true filters the resulting list to only include people with push notification tokens, if false filters the resulting list to only include people without push notification tokens
created__lteoptional An ISO 8601 UTC formatted date time value i.e. 2016-03-23T11:01:28.710Z. It filters the resulting list to only include those people created before the specified date time
live_personoptional If true filters the resulting person list to only include people created in the live environment, if false filters the resulting person list to only include people created in the test environment

Returns

Returns a list of optionally filtered people

Getting a person’s details

Example Person Detail Request

curl "[[api_endpoint]]/v4.0/person/?id=196" \
  -H "Authorization: ApiKey [[public_key]]:<your_secret_key>"

Replace <your_secret_key> with the one found in the credentials section of the dashboard.

Example Person Detail Response

{
  "meta": {
    "limit": 20,
    "next": null,
    "offset": 0,
    "previous": null,
    "total_count": 1
  },
  "objects": [
    {
      "address": {
        "city": "London",
        "country": "United Kingdom",
        "country_code": "GBR",
        "county_state": "",
        "line1": "Eastcastle House",
        "line2": "27-28 Eastcastle Street",
        "line3": "",
        "line4": "",
        "postcode": "W1W 8DH",
        "recipient_name": "Deon Botha"
      },
      "country": {
        "country_code_2": "GB",
        "country_code_3": "GBR",
        "id": 233,
        "name": "United Kingdom",
        "resource_uri": "/v2.1/country/233/"
      },
      "created": "2015-06-02T20:24:39.519890",
      "email": "deon@kite.ly",
      "first_name": "Deon",
      "full_name": "Deon Botha",
      "id": 196,
      "ip": "10.84.20.98",
      "last_name": "Botha",
      "last_seen": "2015-06-02T20:47:25.434205",
      "live_person": true,
      "meta_data": "{u'environment': u'Development', u'platform': u'iOS', u'Order Count': 2}",
      "orders": [
        "PS153-474134811",
        "PS153-374134811",
        "PS153-164134811",
        "PS153-064134811",
        "PS153-964134811",
        "PS153-864134811"
      ],
      "phone": "",
      "region": "London",
      "resource_uri": "/v2.1/person/196/",
      "revenue": {
        "amount": "180.84",
        "currency": "GBP"
      },
      "timezone": "Europe/London",
      "timezone_utc_offset": 0,
      "uuid": "DF944EDC-90BE-470B-914E-1250E8DD1585"
    }
  ]
}

HTTP Request

GET [[api_endpoint]]/v4.0/person/?id=<person_id>

Arguments

person_idrequired The kite person id

Returns

A person object

Postcard Guidelines

When you supply a back_image to Kite for postcard orders, you gain control of the design that is printed on the back of that postcard.

You are able to style your message whichever way you like, however the back of the card must adhere to certain style guidelines to maximise the chances of accurate dispatch and delivery of the postcard to your customers.

Address formatting

Addresses must be eligible, be formatted on the right hand side of the postcard and include the delivery information with the following structure

Fields

Recipients Namerequired Name of receipient
Address Line 1required Address Line 1
Address Line 2optional Address Line 2
Cityrequired City
Countryrequired Country
Postcoderequired Postcode, The postcode should always be on the last line of the address

Avoid positioning any logo underneath the address text.

Stamp Placement

A blank space must be reserved in the top right corner of the postcard so that Kite can place a stamp there.

This is because stamp designs must be pre-approved by the mail carrier before printing can take place. Designs which have not been approved will unfortunately not be accepted by the mail service for delivery.

Webhooks

Kite allows partners to specify a remote URL to which they can receive status updates of orders placed by their customers. This allows our partners to maintain their own CRM (confirmation & dispatch e-mails, SMS services etc) or accounting systems that exist outside the Kite platform ecosystem.

When an order is placed and any of it’s associated print jobs status is updated, we’ll send a HTTP POST request to the partner’s configured webhook URL. This request will be sent as a JSON payload that includes a range of information about the customer’s order.

Configuring Webhook

A webhook url can be added to your account within the notifications section of the dashboard.

Clicking Test Webhook within this section will trigger an example POST request, which will return a success if your endpoint responds with a HTTP 200 response.

Your endpoint should be configured to receive a JSON payload in the format shown on the right.

Example JSON

{
    "environment": "TEST",
    "time_submitted": "2016-5-1 23:12:30",
    "order_id" : "PS-KITE-WEBHOOK-TEST",
    "job_id" : "PS-KITE-WEBHOOK-TEST01-MS",
    "status" : "Shipped",
    "is_reprint": false,
    "product" : {
        "name": "Squares",
        "id": "squares"
    },
    "customer_details" : {
        "name": "Joe Bloggs",
        "email": "joe@bloggs.com"
    },
    "address": {
        "shipping_address_1": "123 Kite Avenue",
        "shipping_address_2": "",
        "shipping_address_3": "London",
        "shipping_address_4": "",
        "shipping_address_5": "",
        "shipping_postcode": "123 ABD",
        "shipping_country": "United Kingdom",
        "shipping_country_code": "GB"
    }
}

Order status updates

A HTTP POST request will be triggered when a print job within an order is updated to one of the following status’s :

Job Status

Received by Printer Your order has been received and is awaiting fulfilment
Shipped Your customer’s order has been dispatched and is on it’s way
Cancelled Your customer’s order has been cancelled
On Hold The fulfilment of your customer’s order has been put on hold
Fulfilment failed An error has occurred while processing your order. (See errors)