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 thesigned_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.
print products & template_ids
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 | 2100 x 2400 px (30x40cm) | |
center_backoptional | 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
product | pixels | cm | inches |
---|---|---|---|
A1 Postera1_poster | 7017×9933 | 59.4×84.1 | 23.4×33.1 |
A2 Postera2_poster | 4962×7017 | 42×59.4 | 16.5×23.4 |
A3 Postera3_poster | 3508×4961 | 29.7×42 | 11.7×16.5 |
A4 Postera4_poster | 2481×3507 | 21×29.7 | 8.3×11.7 |
Classic prints (4x6)photos_4x6 | 1760×1276 | 14.9×10.8 | 5.9×4.3 |
Magnetsmagnets | 815×815 | 6.9×6.9 | 2.7×2.7 |
Squaressquares | 1152×1152 | 9.8×9.8 | 3.8×3.8 |
Mini squaressquares_mini | 804×804 | 6.8×6.8 | 2.7×2.7 |
Retro style printspolaroids | 1027×1192 | 8.7×10.1 | 3.4×4 |
Mini retro stylepolaroids_mini | 739×832 | 6.3×7 | 2.5×2.8 |
Greeting Cardsgreeting_cards | 1069×1069 | 9.1×9.1 | 3.6×3.6 |
Greeting Cards A5greeting_cards_a5 | 1749×2481 | 14.8×21 | 5.8×8.3 |
Greeting Cards 7x5greeting_cards_7x5 | 1500×2100 | 12.7×17.8 | 5×7 |
Square Stickersstickers_square | 732×732 | 6.2×6.2 | 2.4×2.4 |
Circle Stickersstickers_circle | 779×779 | 6.6×6.6 | 2.6×2.6 |
Frames 50cmframes_50cm | 3426×3426 | 29×29 | 11.4×11.4 |
Postcardpostcard | 1796×1288 | 15.2×10.9 | 6×4.3 |
OPTIMAL PHONE CASE ASSET DIMENSIONS
product | pixels | cm | inches |
---|---|---|---|
iPhone 6s Plusi6splus_tough_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
iPhone 6s Plusi6splus_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
iPhone 6si6s_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
iPhone 6si6s_tough_case | 1191×1896 | 10.1×16.1 | 4×6.3 |
iPhone 6 Plusi6plus_tough_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
iPhone 6 Plusi6plus_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
iPhone 6/6s Plus Folioi6plus_folio_case | 2228×2015 | 18.9×17.1 | 7.4×6.7 |
iPhone 6i6_tough_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
iPhone 6i6_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
iPhone 6/6s Folioi6_folio_case | 2002×1791 | 17×15.2 | 6.7×6 |
iPhone 6/6s BakPak 1i6_bakpak_1_case | 889×1731 | 7.5×14.7 | 3×5.8 |
iPhone 6/6s BakPak 3i6_bakpak_3_case | 972×1677 | 8.2×14.2 | 3.2×5.6 |
iPhone 5/5si5_tough_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
iPhone 5/5si5_case | 1032×1610 | 8.7×13.6 | 3.4×5.4 |
iPhone 5 Clik Cliki5_clik_case | 770×1542 | 6.5×13.1 | 2.6×5.1 |
iPhone 5Ci5c_tough_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
iPhone 5Ci5c_case | 1032×1610 | 8.7×13.6 | 3.4×5.4 |
iPhone 4/4si4_tough_case | 1032×1610 | 8.7×13.6 | 3.4×5.4 |
iPhone 4/4si4_case | 1032×1542 | 8.7×13.1 | 3.4×5.1 |
Galaxy S6 Edgesamsung_s6e_tough_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Galaxy S6 Edgesamsung_s6e_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Galaxy S6samsung_s6_tough_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Galaxy S6samsung_s6_case | 1192×1896 | 10.1×16.1 | 4×6.3 |
Galaxy S5samsung_s5_tough_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Galaxy S5samsung_s5_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Galaxy S5 Minisamsung_s5_mini_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Galaxy S4samsung_s4_tough_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Galaxy S4samsung_s4_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Galaxy S4 Minisamsung_s4_mini_tough_case | 1032×1610 | 8.7×13.6 | 3.4×5.4 |
Galaxy S4 Minisamsung_s4_mini_case | 1032×1610 | 8.7×13.6 | 3.4×5.4 |
Galaxy S3samsung_s3_tough_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Galaxy S3samsung_s3_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Galaxy S3 Minisamsung_s3_mini_case | 1844×2600 | 15.6×22 | 6.1×8.7 |
Samsung Note 4samsung_n4_tough_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
Samsung Note 4samsung_n4_case | 1335×2132 | 11.3×18.1 | 4.5×7.1 |
Samsung Note 3samsung_n3_case | 1200×2040 | 10.2×17.3 | 4×6.8 |
Sony Xperia Z1sony_x_z1_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Sony Xperia Csony_x_c_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
LG G2lg_g2_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
Motorola Gmoto_g_case | 1086×1736 | 9.2×14.7 | 3.6×5.8 |
Nexus 5nexus_5_case | 1182×1896 | 10×16.1 | 3.9×6.3 |
OPTIMAL TABLET CASE DIMENSIONS
product | pixels | cm | inches |
---|---|---|---|
iPad Mini 1ipad_mini_case | 1844×2600 | 15.6×22 | 6.1×8.7 |
iPad 2, 3 and 4ipad_case | 2472×3080 | 20.9×26.1 | 8.2×10.3 |
iPad Airipad_air_case | 2472×3080 | 20.9×26.1 | 8.2×10.3 |
Nexus 7nexus_7_case | 1778×2841 | 15.1×24.1 | 5.9×9.5 |
OPTIMAL PHOTOBOOK ASSET DIMENSIONS
product | pixels | cm | inches |
---|---|---|---|
Large Landscape Hardcoverphotobook_wrap_321x270_sm | 3792×3190 | 32.1×27 | 12.6×10.6 |
Portrait Hardcoverphotobook_wrap_210x280_sm | 2481×3306 | 21×28 | 8.3×11 |
Landscape Hardcoverphotobook_wrap_280x210_sm | 3308×2481 | 28×21 | 11×8.3 |
Large Square Hardcoverphotobook_wrap_300x300_sm | 3544×3544 | 30×30 | 11.8×11.8 |
Medium Square Hardcoverphotobook_wrap_210x210_sm | 2481×2481 | 21×21 | 8.3×8.3 |
Small Square Hardcoverphotobook_wrap_140x140_sm | 1654×1654 | 14×14 | 5.5×5.5 |
OPTIMAL PHOTOBOX ASSET DIMENSIONS
product | pixels | cm | inches |
---|---|---|---|
iPhone 6 Plus Casei6ptc7 | 1335×2320 | 11.3×19.6 | 4.5×7.7 |
iPhone 6 Casei6cc7 | 1335×2257 | 11.3×19.1 | 4.5×7.5 |
iPhone 5/5S Casei5c4 | 1335×2199 | 11.3×18.6 | 4.5×7.3 |
iPhone 5C Caseiphone5c1 | 1335×2199 | 11.3×18.6 | 4.5×7.3 |
iPhone 5/5S Clear Casei5ccc1 | 1335×2734 | 11.3×23.1 | 4.5×9.1 |
iPhone 5 Clear Case Stickerstickeri5c1 | 732×1500 | 6.2×12.7 | 2.4×5 |
iPhone 4/4S Casei4c9 | 1335×2195 | 11.3×18.6 | 4.5×7.3 |
iPhone 4/4S Clear Casei4ccc1 | 1335×2582 | 11.3×21.9 | 4.5×8.6 |
iPhone 4 Clear Case Stickerstickeri4c1 | 715×1382 | 6.1×11.7 | 2.4×4.6 |
Galaxy S5 Casesgs5c1 | 1335×2403 | 11.3×20.3 | 4.5×8 |
Galaxy S4 Casesgs4c3 | 1335×2299 | 11.3×19.5 | 4.5×7.7 |
Galaxy S3 Casesgs3c4 | 1335×2200 | 11.3×18.6 | 4.5×7.3 |
Galaxy S2 Casesgs2c1 | 1335×2050 | 11.3×17.4 | 4.5×6.8 |
iPad 2/¾ Caseipad_case_1 | 1335×1588 | 11.3×13.4 | 4.5×5.3 |
iPad Mini Caseipadminic1 | 1335×1808 | 11.3×15.3 | 4.5×6 |
iPad Smart Coveripadsmartc6 | 1335×1740 | 11.3×14.7 | 4.5×5.8 |
iPad Mini Smart Coveripadminismartc1 | 1335×1981 | 11.3×16.8 | 4.5×6.6 |
Canvas Print 20 cm x 30 cmpbx_canvas_20x30 | 2363×3544 | 20×30 | 7.9×11.8 |
Canvas Print 30 cm x 20 cmpbx_canvas_30x20 | 3544×2363 | 30×20 | 11.8×7.9 |
Canvas Print 30 cm x 30 cmpbx_canvas_30x30 | 3544×3544 | 30×30 | 11.8×11.8 |
Classic Canvas 40 cm x 40 cmpbx_canvas_40x40 | 4725×4725 | 40×40 | 15.8×15.8 |
12 Prints + Boxpbx_polaroids_12 | 1540×1580 | 13×13.4 | 5.1×5.3 |
24 Prints + Boxpbx_polaroids_24 | 1540×1580 | 13×13.4 | 5.1×5.3 |
36 Prints + Boxpbx_polaroids_36 | 1540×1580 | 13×13.4 | 5.1×5.3 |
A3 Posterpbx_a3 | 3508×4961 | 29.7×42 | 11.7×16.5 |
Classic Printspbx_6x4 | 1800×1200 | 15.2×10.2 | 6×4 |
Large Classic Printspbx_7x5 | 2100×1500 | 17.8×12.7 | 7×5 |
Square Printspbx_squares_5x5 | 1500×1500 | 12.7×12.7 | 5×5 |
Square Printspbx_squares_8x8 | 2400×2400 | 20.3×20.3 | 8×8 |
Square Magnetspbx_magnets_8x8 | 1250×1250 | 10.6×10.6 | 4.2×4.2 |
Classic Magnetspbx_magnets_13x9 | 1536×1062 | 13×9 | 5.1×3.5 |
Classic Magnetspbx_magnets_15x10 | 1773×1182 | 15×10 | 5.9×3.9 |
Reusable Stickers 13cm x 9cmpbx_stickers_13x9 | 1536×1062 | 13×9 | 5.1×3.5 |
Pack of 10 Cardspbx_cards_a6_10pack | 1241×1749 | 10.5×14.8 | 4.1×5.8 |
Mugmgth10 | 4725×4725 | 40×40 | 15.8×15.8 |
Bone China Mugmug_bone_wrap | 5850×2400 | 49.5×20.3 | 19.5×8 |
Timeless Framed Print 30cm x 30cmpbx_frame_30x30 | 3544×3544 | 30×30 | 11.8×11.8 |
Classic Canvas 30 cm x 40 cmpbx_canvas_30x40 | 3544×4725 | 30×40 | 11.8×15.8 |
3 Minute Book23540-3mbook_1 | 4725×4725 | 40×40 | 15.8×15.8 |
OPTIMAL ALBELLI ASSET DIMENSIONS
product | pixels | cm | inches |
---|---|---|---|
Aluminium Printap_aluminium_400x400 | 4725×4725 | 40×40 | 15.8×15.8 |
Aluminium Printap_aluminium_300x400 | 3544×4725 | 30×40 | 11.8×15.8 |
Aluminium Printap_aluminium_400x300 | 4725×3543 | 40×30 | 15.8×11.8 |
Mounted Printap_mounted_400x400 | 4725×4725 | 40×40 | 15.8×15.8 |
Mounted Printap_mounted_400x300 | 4725×3543 | 40×30 | 15.8×11.8 |
Mounted Printap_mounted_300x400 | 3544×4725 | 30×40 | 11.8×15.8 |
Canvas Printap_canvas_400x300 | 4725×3543 | 40×30 | 15.8×11.8 |
Canvas Printap_canvas_300x400 | 3544×4725 | 30×40 | 11.8×15.8 |
Canvas Printap_canvas_400x400 | 4725×4725 | 40×40 | 15.8×15.8 |
Wood Printap_wood_400x300 | 4725×3543 | 40×30 | 15.8×11.8 |
Wood Printap_wood_300x400 | 3544×4725 | 30×40 | 11.8×15.8 |
Wood Printap_wood_400x400 | 4725×4725 | 40×40 | 15.8×15.8 |
Acrylic Printap_acrylic_300x400 | 3544×4725 | 30×40 | 11.8×15.8 |
Acrylic Printap_acrylic_400x300 | 4725×3543 | 40×30 | 15.8×11.8 |
Acrylic Printap_acrylic_400x400 | 4725×4725 | 40×40 | 15.8×15.8 |
Square Photo Bookap_album_210x210 | 2481×2481 | 21×21 | 8.3×8.3 |
Metallic Squaresmetallic_8x8 | 2501×2501 | 21.2×21.2 | 8.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) |