# RPI Print API documentation > The RPI Print API prints and ships books. A customer creates an order naming a product SKU, a shipping address, and the URLs of the book's press-ready PDFs, and RPI Print preflights the files, prints the book, and ships it, and it can report each step by webhook. These pages cover API keys, orders and their states, print assets, preflight, shipping, webhooks, the product catalog and how a price is computed, and support. The API's OpenAPI contract is at https://docs.api.rpiprint.com/OAS3/public-api-OAS3.yaml. It is not included below. ## Overview RPI Print API is an API for automating the printing of books on demand. The order endpoints are the core of RPI Print API. They let you place orders, retrieve them, and cancel them. Orders are charged to a credit card you add to your account in the [RPI Print API Dashboard](https://api.rpiprint.com). The [Dashboard accounts](dashboard-accounts.md) page explains how your user account relates to your organization. ### Products Before you place an order, you must add your products on the dashboard's [Products page](https://api.rpiprint.com/dashboard/customer-products). Products are a mapping from a product SKU to a set of physical attributes for manufacturing. Each order item specifies its product by the product SKU. [Products](products.md) explains products in more detail. ### Placing an order To place an order, you send a destination address and, for each item you want printed, its product SKU and its design files. An order ships to one destination only. The address must be a destination RPI ships to, as [Shipping](shipping.md) explains. Every book takes an interior book block. This is the PDF holding the design of the book's pages, and a create-order request carries it in `gutsUrl`. Which further files a book takes depends on the product: a product with a designable cover takes a cover, and a product with a designable dust jacket takes a dust jacket. Each file is a PDF that you host at a public HTTPS URL. RPI downloads it from that URL after you create the order, so the URL must stay reachable until RPI has processed the file. [Files](print-assets.md) explains which files you must provide and how to provide them. An [order](orders.md) moves through a series of [states](order-states.md). RPI [preflights](preflight.md) its files, collects payment, and holds the order in the holding bin. The order then leaves the holding bin, manufacturing begins, and RPI ships the books. To follow an order's progress, either include a `webhookUrl` in the create-order request so that RPI sends you [webhooks](webhooks.md), or poll the order for its status. ### Authentication The API is served over HTTPS. Each request carries the Authorization Header value of one of your API keys, which uses HTTP Basic authentication. The API key identifies and authenticates your account. It also decides whether an order is a sandbox order or a production order, because each mode has its own set of API keys. [API Keys](api-key-states.md) explains how to get and manage your keys. API keys are authentication secrets. Store them securely and provide them to your application securely. If a key is exposed for any reason, rotate it. --- ## Getting started Get started by creating a new account on RPI Print API. Visit the [RPI Print API Dashboard](https://api.rpiprint.com) and create a new account with RPI Print. Your account is automatically associated with a customer that holds your organization's shared state, such as API keys, products, orders, and payment methods. [Dashboard accounts](dashboard-accounts.md) explains how the two relate. ### Getting your bearings Use the following steps to create your first product and understand the system at a high level. 1. Ensure the dashboard is in Sandbox mode. It is selected by default for new users. 2. Open Products and create a product. A product maps an identifier called a product SKU to the physical characteristics of what we produce. 3. Open API Keys under Developer Tools. This is where you find the credentials you use to place orders. Copy the Authorization Header value of an enabled key and send it as the `Authorization` header of each request. The value already includes the `Basic` scheme, because RPI Print API uses HTTP Basic authentication. The rest of the value is the base64 encoding of your API key and shared secret joined by a colon, so a client that takes a username and password can decode it and use the key as the username and the secret as the password. Use a sandbox key while you test, so that orders are neither printed nor charged. Each key is either enabled or disabled; see [API Keys](api-key-states.md). 4. Open API Explorer under Developer Tools. Place a test order using the `/orders/create` endpoint with one of your API keys and the product from the previous steps. Take note of the request body, because this endpoint is how you will submit orders from your system. [Create order request](first-request.md) shows a complete example. You now know how to create products and place orders. You can begin building your integration. :::info Production orders do not proceed beyond the "Awaiting Payment" state until you add a credit card in the dashboard and RPI charges it successfully. ::: To receive updates about an order, include a `webhookUrl` in the create-order request, as [Webhooks](webhooks.md) explains. [Support](../support.md) explains how sandbox mode differs from production mode. --- ## Dashboard accounts Your account in the [RPI Print API Dashboard](https://api.rpiprint.com) is a user account that belongs to you alone. Your organization's API keys, products, orders, and payment methods belong to a customer that represents the organization. ### Your user account belongs to a customer Your user account is attached to a customer. The customer holds your organization's API keys, products, orders, and payment methods. None of these belong to an individual user account. Every user account attached to the same customer therefore works with the same API keys, products, orders, and payment methods, within the limits of its role. When a Customer Admin adds user accounts for other people in your organization on the dashboard's Users page, those people work with the same resources, and their role decides what they can change. ### User roles Each user account has one of two roles, User or Customer Admin. - A Customer Admin can change every setting that belongs to the customer. - A User can do most of what a Customer Admin can, but cannot manage payments, billing, or user accounts. --- ## Files Placing an order requires providing RPI Print API with the files that contain the design of each item. Every file must be a PDF, whatever its URL or its server's `Content-Type` says. Preflight cannot open a file in any other format, such as a JPEG or a PNG, and fails the order with a message that begins "This PDF could not be opened. It may be damaged, or it may not be a valid PDF." ### What files does a product take? Every book product takes an interior book block, which you send as `gutsUrl`. Which further files it takes depends on the product. Products with a designable cover take a cover, which you send as `coverUrl`. Products with a designable dust jacket take a dust jacket, which you send as `dustJacketUrl`. RPI Print API fails an order item whose files do not match the set its SKU declares. The create request still returns 201, the order moves to `FAILED`, and RPI Print API sends the `OrderValidationFailed` webhook. The order's validations carry the message "Validation failed: Invalid pdf-assets provided for order items". The message does not name the fields the SKU expects, so compare the order item with the files its product takes. No file may reach 2.5 GB, meaning 2,500,000,000 bytes; a file of exactly that size is rejected. Smaller files are recommended because they process faster. ### How do I produce a file for every order? Many RPI Print API customers build products where every file in every order is unique: a customer's name woven into a story, a family photo dropped into a layout, or fully AI-generated text and illustrations. RPI Print API does not provide file creation, design, or hosting tools; that stage is entirely up to you. In practice, customers building personalized products tend to use one of a few approaches: - Template merge. A fixed design has variable fields, such as a name, date, photo, or address, and a PDF-generation service or a headless-browser HTML-to-PDF pipeline renders it for each order. - Custom rendering pipeline. An in-house service, often built on a document-templating library or Adobe InDesign Server, assembles pages programmatically and automates tasks like photo placement and resizing. - AI-generated content. A language model writes personalized text and an image model generates or restyles illustrations. A post-processing step then upscales images to print resolution and corrects the color space. Whichever approach you use, your integration needs to produce the same output: a press-ready PDF for each file your product takes, meeting the specifications in [Content Creation Standards](press-ready-PDFs.md) and [Preflighting](preflight.md), hosted at a URL your integration can pass to the API. ### Where do I host the files? Each file must be reachable at a public HTTPS URL. RPI refuses `http://` URLs and redirects from HTTPS to HTTP, and follows at most 3 redirects. We strongly recommend Amazon S3 pre-signed URLs in the _us-west-2_ region. RPI stops a download that runs slower than 50 KB/s for 30 seconds in a row, or that does not finish within about 14 minutes, and the file fails to process. Because these files often contain a customer's personal photos or text, we recommend time-limited pre-signed URLs rather than permanently public objects, and removing source files from your own storage once your retention needs have passed. When you host the files yourself or use another service, be aware that RPI may download them using HTTP range requests where your server supports them, which can produce several concurrent requests to the same file in a short period. A Dropbox share link opens a preview page rather than the file. Replace the `dl=0` at the end of the link with `dl=1` so that Dropbox returns the PDF itself. We advise against using Google Drive. Its sharing permissions frequently block RPI from downloading the file, and the order fails. ### How long do my files need to stay reachable? Your files need to stay reachable until RPI sends one of these [webhooks](webhooks.md) for the order. For most orders that happens within a few minutes of submission. | Webhook | Why RPI no longer needs your files | | ---------------------------------------- | ----------------------------------------------------------------------------------------- | | `OrderAssetsAllProcessed` | Every file in the order has been processed, and RPI works from its own copy of each file. | | `OrderFailed` or `OrderValidationFailed` | The order has failed. A failed order is final, and RPI does not fetch its files again. | If you use pre-signed URLs, set them to expire 7 days after you create the order. RPI does not download the files of an order placed over your daily limit until the queue releases it (see [Limits and Quotas](orders.md#limits-and-quotas)). With the default limits, at most 300 orders wait in the queue and RPI releases up to 50 of them a day, so every queued order is released within 6 days, and 7 days covers that with a day to spare. A pre-signed URL stops working when the credentials that signed it expire, whatever expiry you set. To get the full 7 days, which is also the longest expiry S3 allows, sign the URL with an IAM user's long-term access keys. A URL signed with temporary credentials, such as an IAM role's credentials in AWS Lambda or Amazon ECS, expires when those credentials do, often within hours. RPI keeps its copy of each file for 60 days, so that the file is available if it is needed again, for example for a reprint when a recipient receives a damaged book. ### What if RPI can't download a file? When RPI cannot download a file, or cannot finish processing it, the order fails before preflight runs. The order's validations, in the API response and in webhooks, carry one error for that file. It names the file, a code for what went wrong, and the HTTP status your server answered with when that status is why the download failed: ```json { "source": "PrintAssetError-Cover", "humanReadableString": "Cover file failed (SOURCE_ERROR, HTTP 403): your server refused the download.", "fatalError": true } ``` The file is named `Cover file`, `Interior book block file`, or `Dust jacket file`. A failed order is final, so fix the file or its URL and place a new order. An order that failed before RPI began reporting these codes, in October 2026, carries the message `Cover file could not be downloaded.` (or the same for the other files) with no code. | Code | What happened | What to do | | -------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SOURCE_ERROR` | Your server answered with an error status, or the download failed partway through. | With a status, fix what that status reports. A 403 from a pre-signed URL usually means the link expired or was signed for a different request; see [How long do my files need to stay reachable?](#how-long-do-my-files-need-to-stay-reachable). With no status, the download failed partway through, usually because the connection to your server dropped and occasionally on RPI's side. Place the order again, and if it fails again, check that your server stays up for the whole download. | | `SOURCE_NOT_FOUND` | Your server answered 404: no file exists at the URL. | Check the URL, and keep the file in place until RPI no longer needs it. | | `EMPTY_BODY` | Your server returned an empty file. | Check that the URL serves the PDF itself and not a placeholder or a preview page. | | `FILE_TOO_LARGE` | The file is 2.5 GB or larger. | Make the file smaller, for example by downsampling images above the resolution the product needs. | | `DOWNLOAD_TOO_SLOW` | The download ran slower than 50 KB/s for 30 seconds in a row. | Host the file somewhere faster. We recommend Amazon S3 in _us-west-2_. | | `DOWNLOAD_TIMEOUT` | The download did not finish within about 14 minutes. | Host the file somewhere faster, or make it smaller. | | `HTTPS_REQUIRED` | The URL does not start with `https://`. | Send an `https://` URL. | | `HTTPS_DOWNGRADE` | A redirect sent the download to an `http://` address. | Make every redirect stay on `https://`, or send the final URL. | | `REDIRECT_LIMIT` | The URL redirected more than 3 times. | Send the file's final URL. | | `DNS_FAILED` | The URL's host name could not be found. | Check that the host name is spelled correctly and resolves on the public internet. | | `INVALID_URL` | The URL, or a URL it redirected to, is not a valid URL. | Check that the URL is complete and that special characters are percent-encoded. | | `SSRF_BLOCKED` | The URL points to a private or reserved network address. | Host the file on a server reachable from the public internet. | | `INGEST_TIMEOUT` | The download stopped without a result on RPI's side. | Place the order again. If it happens again, contact [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). | | `PROCESSING_TIMEOUT` | RPI downloaded the file but could not finish processing it. | Place the order again. If it happens again, contact [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). | ### How long does processing take? Processing files can take a long time. Smaller files usually process in tens of seconds, while larger files can take a few minutes. In extremely rare cases, when system load is very high, your files could be put into a queue and it could take many minutes before processing completes. To learn when processing finishes, use [webhooks](webhooks.md), or poll the order as [Polling for order status](webhooks.md#polling-for-order-status) describes. --- ## API Keys Every API request must carry the Authorization Header value of one of your API keys, which you copy from the API Keys table in the RPI Print API Dashboard. The header uses HTTP Basic authentication. The API key identifies and authenticates the customer making the request, and it decides whether the request works in sandbox or production mode. API keys are authentication secrets. Store them securely and provide them to your application securely. If a key is exposed for any reason, rotate it: create a new key, and then disable the old one. ### Enabled and disabled keys Every API key is either enabled or disabled. A request you authenticate with an enabled key succeeds; a request you authenticate with a disabled key is rejected with HTTP 403. Disabling a key neither deletes it nor changes its Authorization Header value, so you can enable the same key later and your existing header keeps working. Your keys are listed under Developer Tools in the [RPI Print API Dashboard](https://api.rpiprint.com), where you can read each key's current state and change it. ### Allow up to 5 minutes for a change to take effect The API keeps the result of each authentication check for 5 minutes, so for that long it can still answer with a decision it reached before you changed the key: - A key you disabled can keep working for up to 5 minutes. - A key you enabled can keep being rejected for up to 5 minutes. Five minutes is the longest either delay lasts. The API may apply your change sooner, and it applies the change within 5 minutes. :::caution Disabling a key does not revoke it on the spot. If someone outside your organization has obtained a key, disable it and then treat the following 5 minutes as time in which that person can still call the API with it. ::: --- ## Content Creation Standards A press-ready PDF is one a printer can print without problems. A PDF that looks right on screen can still print badly: some of its colors may not reproduce on press, and some of its graphics may print at very low quality. Check the three things below when you generate one, and build each cover to the size its product gives. ### Embedded fonts Embed every font the PDF uses. A PDF that leaves a font out still looks correct on the machine that produced it, because the font is installed there. Any other machine, including the one that prints the file, replaces the missing font with the nearest one it has, which changes how the text looks. Preflight rejects a PDF that uses a font it does not embed; see [Preflighting](preflight.md). ### Bleed Bleed is the part of a design's pictures or color that extends past the edge of the page. The page is trimmed to size after printing, and the bleed is what gets trimmed away, so any design whose pictures or color run to the edge needs it. A press-ready PDF is therefore larger than the printed book in both height and width. Missing bleed is one of the most common problems in the PDFs RPI receives. The exact dimensions of each product, including its bleed, are on [Product specifications](../product-spec.mdx) and in the Products section of the RPI Print API Dashboard. ### Images We recommend images of at least 300ppi at the size they will be printed. Whether a lower resolution prints acceptably depends on the image: a sunset may print well at 150ppi, while fine detail such as jewelry can look pixelated at the same resolution. Preflight warns about images below 150ppi. ### How do I build a cover? A cover is a single PDF page that holds the back cover, the spine, and the front cover side by side. A dust jacket is also a single page, and it holds a flap at each end as well. Preflight fails a cover or dust jacket file with more than one page and cannot fix it. Build the cover to the same size as the template that [Product specifications](../product-spec.mdx#template-generator) generates for your product and page count. The template is the exact size preflight expects, and its size already includes every allowance its cover type needs, so do not add anything to it. The generator also shows the spine width, the flap width of a dust jacket, and the cover's total width and height. The spine width depends on the interior book block's page count, including any blank pages preflight adds to it, so generate the template for the page count your interior book block will have. Preflight rejects a cover whose size does not match the product's specifications, unless it can fix the difference; [Preflighting](preflight.md#what-does-preflight-check) lists the size checks and the fixes. --- ## Preflighting Preflight takes the design files for an order and validates them against the product's properties. If it finds errors it can correct, it fixes them automatically, but only when it can fix every error in the file. The problems preflight fixes are listed [below](#what-does-preflight-fix-automatically). Preflight also produces a report that tells you whether your files are press-ready and, if not, what needs to change. ### What can preflight decide? Every preflight produces one of three outcomes: - Pass. The files meet the product's requirements, and the order proceeds to production. - Pass with warnings. The files are acceptable and production proceeds, but the report notes issues worth addressing on future files, for example an image below the recommended resolution. - Fail. Preflight found one or more errors that it could not fix. The order fails, and the report lists every issue preflight found. The order's page in the RPI Print API Dashboard shows the report, including when preflight fails. The order's `validations`, in the API response and in webhooks, carry the same issues. A failed order cannot take a new file. To print the book, correct the file and place a new order. ### What does preflight check? Preflight validates each file: the interior book block, the cover, and the dust jacket where the product takes one. It checks each file in the categories below. An error fails the order unless preflight can fix it. A warning is advisory and does not stop production. | Category | What it validates | Blocks? | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | File integrity | File isn't empty, is under 2.5 GB, and can be opened — no corrupt data or repaired cross-reference table | Error if empty, oversized, corrupt, or otherwise unreadable | | Resource limits | The file stays within the limits RPI needs to process it: no oversized image stream, no image too large to decode, and no forms nested too deeply to read | Error if the file reaches any of these limits | | Security | PDF isn't password-protected or otherwise encrypted in a way that prevents opening | Error if the file can't be opened for processing | | Dimensions / page geometry | Page boxes exist and are readable; the page size matches the product's trim size plus its bleed, within 2.5 points; interior book block pages don't have mismatched sizes when the product doesn't allow mixed dimensions; page coordinates use a standard user unit | Error if a page box is missing or the wrong size, the page size doesn't match, mixed page sizes aren't supported, or the user unit isn't 1. A cover's size is described in [How do I build a cover?](press-ready-PDFs.md#how-do-i-build-a-cover) | | Bleed | On bleed-supporting products, a page whose content reaches the trim edge has enough bleed. Hardcover and ImageWrap covers are not checked | Warning if the bleed is missing or below the required amount | | Page count | Interior page count is valid for the binding — meets minimum/maximum and any modulus (e.g. multiple of 4 for saddle-stitch) | Error if below minimum, above maximum, or not a valid multiple | | Cover / spine sheet count | A cover or dust jacket file has the number of pages its product expects, and its width matches the spine width that the interior book block's page count gives | Error if the page count or the width doesn't match. See [How do I build a cover?](press-ready-PDFs.md#how-do-i-build-a-cover) | | Fonts | All fonts referenced by text are embedded | Error if a font isn't embedded | | Font quality | Type3 fonts are flagged; character codes set by page content resolve to a glyph in their font | Warning for Type3 fonts or unmapped characters | | Images — resolution | Effective PPI is within the product's supported range | By default, warning if an image is below 150 PPI on either axis, or at or above 600 PPI on both axes | | Images — rendering intent | Every embedded image declares a rendering intent | Warning if /Intent is absent | | Vector complexity — node count | Vector node density and count per page stay within limits | Warning if exceeded | | Vector complexity — object count | Drawing-object density and count per page stay within limits | Error if exceeded | | Color space | Detected colorspaces are in the product's allowed set; Lab colorspace isn't used on images or vector fills/strokes when disallowed; spot colors carry a usable alternate or tint transform | Error if an unsupported colorspace, disallowed Lab usage, or an undefined spot color is found | | Color channel count | Total process + unique spot channels don't exceed the product's maximum | Warning if exceeded | | Transparency | Flags overlapping transparent colors and objects; flags a document declaring both transparency-permitting and transparency-prohibiting PDF/X variants | Warning for live transparency (resolved at the press, not by the customer); Error for mixed variant declarations | | Interactivity / annotations | No annotations, AcroForm fields, or JavaScript actions | Error if any are present | | Layers | No default-off layer carries visible content; a dieline layer, if present, is a non-printing spot color | Error for hidden content on an off layer; Warning for an invalid dieline layer | | White overprint | No white-filled or white-stroked element has overprint enabled in a way that would make it vanish on press | Error if detected | | PDF metadata | Producer field is present in the document | Warning if missing | | Fixed file size | A file that preflight has fixed is under 2.5 GB | Error if the fixed file reaches 2.5 GB | ### What does preflight fix automatically? Preflight fixes the problems below only when it can fix every error in the file. If any error has no fix, preflight changes nothing, and the order fails with every issue preflight found. When preflight does fix a file, RPI prints from the fixed file rather than the one you sent, so these changes appear in the printed book. | Row in the table above | Problem | What preflight does to the file | | --------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | | Page count | Too few pages, or a count that isn't the multiple the binding requires | Adds blank white pages at the end until the count is valid | | Dimensions / page geometry | The page size doesn't match the product, but each side is within 10% of it | Rebuilds the page at the product's size, stretching the content's width and height separately to fill it | | Dimensions / page geometry | A page box is the wrong size | Sets the page boxes where the product needs them, cropping an oversized page; the content is not moved or scaled | | Dimensions / page geometry | Interior pages of mixed sizes, where every size is within 10% of the product's | Clears once the pages have been rebuilt at the product's size | | Images — rendering intent | An image declares no rendering intent | Gives the image the rendering intent in effect where it is drawn, or Perceptual if none is | | Color space | Lab color on an image | Re-encodes the image in RGB | | Color space | Lab color on text or vector shapes | Converts the color to CMYK | | Interactivity / annotations | Annotations on a page | Removes the page's annotations | Preflight does not fix anything else in the table above. A missing page box, a page more than 10% away from the product's size, and a page count above the product's maximum are all errors that preflight cannot fix. Such an error fails the order, and you need to correct the file and place a new order. --- ## Create order request This page shows a complete create order request. [Getting started](getting-started.md) explains how to create an account and a product, and where to copy the Authorization Header value that replaces `{{Authorization}}` below. ### Request headers ``` POST https://open.api.rpiprint.com/orders/create Content-Type: application/json Authorization: {{Authorization}} # the Authorization Header value from the API Keys table ``` ### Request body Replace the value of `sku` with the product SKU of a product you created on the RPI Print API Dashboard's [Products page](https://api.rpiprint.com/dashboard/customer-products). The create endpoint looks the SKU up among your own products, so the example SKU below works only if you created a product with it. The `coverUrl` and `gutsUrl` below link the published templates for the product whose manufacturing SKU is `BKPH_HCIW_STD_11.000x8.500IN_80C_GL_40_100T_GLS_44`, at 20 pages. To use templates for your own product, replace that manufacturing SKU in both URLs with your product's [manufacturing SKU](products.md#manufacturing-sku), and replace `pageCount=20` in both URLs with the page count you want. Use the same page count in both URLs, and choose one your product allows. ```json { "currency": "USD", "shippingClassification": "standard", "webhookUrl": "", "destination": { "name": "John Doe", "address1": "3325 S 116th St", "city": "Tukwila", "state": "Washington", "postal": "98168", "country": "US", "phone": "(206) 905 5999", "email": "shipping.dept@rpiprint.com" }, "orderItems": [ { "sku": "HCIW_11x8.5_GLS_GL100T", "quantity": 1, "retailPrice": "12.30", "itemDescription": "My photo book", "product": { "coverUrl": "https://products.api.rpiprint.com/templates/published/BKPH_HCIW_STD_11.000x8.500IN_80C_GL_40_100T_GLS_44/cover/pdf?units=in&pageCount=20&barcode=false", "gutsUrl": "https://products.api.rpiprint.com/templates/published/BKPH_HCIW_STD_11.000x8.500IN_80C_GL_40_100T_GLS_44/pages/pdf?units=in&pageCount=20" } } ] } ``` --- ## Products A product is a type of book you have set up to order: a set of physical attributes that RPI manufactures, under a product SKU that you choose. You create products on the [Products page](https://api.rpiprint.com/dashboard/customer-products) of the RPI Print API Dashboard. Each order item specifies its product by the product SKU. ### Product SKU The product SKU is the identifier your orders use. Each order item sends it as `sku`, and RPI Print API looks it up among your account's products. An item whose `sku` matches none of your products fails validation. You choose the product SKU when you add the product, and the dashboard fills in a suggestion you can keep or replace. A product SKU must be unique within your account. You can change it later, but be aware that an order that still sends the old SKU will then fail validation. Your account can have only one product for each combination of attributes. ### Attributes A product's attributes describe the book RPI manufactures. When you add a product, the dashboard asks for them one at a time: - The size, which is the book's trim size. - The cover type, such as softcover or hardcover. - The paper, which is the paper's weight and finish. - The interior color, which is how the pages are printed. - The bleed, which says whether the design may run to the edge of the page. The dashboard shows the book's price as you choose. [Product specifications](../product-spec.mdx) shows the attributes that change a product's dimensions and gives a template for each combination. Page count is not an attribute. A product allows a range of page counts, and each order's interior book block decides how many pages that order's book has. ### Prices Each product has a base price and a per-page price. The base price covers the product's minimum page count, and every page above that minimum adds the per-page price: ``` unit price = base price + per-page price × (page count − minimum page count) ``` RPI rounds the unit price to the nearest cent, rounding a half cent to the even cent. An order item's price is its unit price multiplied by its quantity. Shipping and sales tax are charged on top; see [Shipping](shipping.md). RPI takes the page count from the order's interior book block. To see what an order will cost before you create it, call `POST /orders/pricing/estimate`, which returns the order's items, shipping and tax. See the [API reference](../api-reference.mdx). ### Manufacturing SKU Every combination of attributes has a manufacturing SKU, such as `BKPH_HCIW_STD_11.000x8.500IN_80C_GL_40_100T_GLS_44`. The manufacturing SKU is the same for every customer, and the Manufacturing SKU column of the [Products page](https://api.rpiprint.com/dashboard/customer-products) shows it for each of your products. It identifies the product that [Product specifications](../product-spec.mdx) and its templates describe. Orders do not use a manufacturing SKU. An order item specifies your product SKU, which RPI maps to the manufacturing SKU of your product. If you kept the dashboard's suggested product SKU, the two are the same. --- ## Orders An order is a group of printable products that RPI prints and ships to a single destination address. Each order item specifies one of your products by its [product SKU](products.md#product-sku), sent as `sku`. An item whose `sku` matches none of your products fails validation. You can fetch the available shipping options and the price of an order through the API without creating the order. Orders are validated on submission. A malformed request, or one to an unsupported country, is refused with HTTP 400 and no order is created. Other problems, such as a shipping tier the destination does not offer or a missing `retailPrice`, do not refuse the request: it returns 201, the order moves to `FAILED`, and RPI Print API sends the `OrderValidationFailed` webhook. ### Customer Order Ids When creating an order you can include an optional `customerOrderId` of up to 40 characters. If you do not send one, RPI Print API generates one for the order. This is the identifier you use in API requests and responses, and it appears under the Customer Order ID column in the RPI Print API Dashboard. Specifying a `customerOrderId` does not make order creation idempotent. A second create request carrying a `customerOrderId` you have already used is rejected with HTTP 400 and a message naming the identifier. It neither creates a second order nor returns the first one. This matters when a create request fails without telling you whether it succeeded, such as a network timeout. Retrying it blindly gives you a 400 that does not distinguish "your first attempt worked" from "that identifier is used by an unrelated older order". Call `GET /orders/{customerOrderId}` with the same API key to find out which. If it returns the order, your first attempt succeeded. If it returns 404, the identifier belongs to an order in your other mode (sandbox or production). Choose a new identifier rather than retrying with this one. A `customerOrderId` must be unique across sandbox and production. The identifiers you use while testing in sandbox are therefore not available to your production orders. ### Payload When creating an order you can include an optional `payload` field of up to 512 characters. RPI Print API returns this string in every webhook and every GET response for the order, so you can use it to match orders to records in your own system. ### Holding bin Orders enter the holding bin after payment is processed. RPI Print API holds them there for 2 hours before sending them to the printer. The hold gives you a window to cancel an order, for example when your own customer cancels it with you. A cancel request for an order in the holding bin cancels it. Once an order leaves the holding bin, RPI Print API forwards a cancel request to the printer, and the printer may reject it. You can send a cancel request until the order ships, except while its status is `VALIDATING`, `CANCELLATION_REQUESTED` or `EXCEPTION`; see [Order states](order-states.md). ### Tracking numbers When the printer ships the order, the order moves to `SHIPPED` and RPI Print API sends the `OrderShipped` webhook. The order's `shipmentTracking` field then lists the tracking details. The field is part of the order object that every webhook carries, starting with that `OrderShipped` webhook, and of the order that `GET /orders/{customerOrderId}` returns. Each entry groups the packages that share a master tracking number. Each package has a `trackingNumber`, an `altTrackingNumber` for carriers that assign two, and a `trackingUrl` that links to the carrier's tracking page. RPI records tracking once, when the whole order has shipped, so `shipmentTracking` is empty until then. A field can be empty when the carrier provided no value. ### When an Enterprise order shows its amounts An Enterprise order shows its amounts once the printer has priced them, and shows none before then. RPI does not charge an Enterprise account through RPI Print API, so the printer sets the price, and it does so in two steps. It prices the items when it accepts the order, and it prices the shipping when the order ships. Until that pricing arrives, the order responses and webhooks for the order report the amounts as follows: - The `pricing` block is absent until the items have been priced. Once they have, it carries `itemsTotal` and `taxesTotal`. - `pricing.shippingTotal` and `selectedShipping.price` are `null` until the shipping has been priced. - `pricing.orderTotal` and `paymentInfo.total` are `null` until both the items and the shipping have been priced. Read `null` as "not priced yet", not as zero. Orders on an account that RPI Print API charges are not affected by these rules. ### Limits and quotas :::info Daily order limit By default, an account can create 50 orders in any rolling 24-hour period. Customer support can change this limit for your account. To ask for a different limit, email [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). ::: Reprints do not count toward the limit. RPI Print API accepts an order created over the limit with HTTP 201 and moves it to `QUEUED`. It releases queued orders as the rolling 24-hour limit allows. A released order moves to `RECEIVED` and continues processing. The queue has a ceiling of 350 orders by default. The ceiling counts the orders received in the last 24 hours and the orders waiting in the queue together, so with the default limit up to 300 orders can wait. RPI Print API still accepts an order past the ceiling with HTTP 201, then moves it to `REJECTED` and sends the `OrderExceedsLimitQueue` webhook. A rejected order is not processed. In sandbox, an order over the limit moves to `REJECTED` immediately and is never queued. For example, if you create 420 orders within 24 hours with the default settings: - The first 50 orders are `RECEIVED` and continue processing. - The next 300 orders are `QUEUED`, and RPI Print API releases them as the limit allows. - The last 70 orders are `REJECTED`. --- ## Order states Once an order has been created, API clients and RPI Print API Dashboard users can follow its progress through the order status. | Order status | Final state | Description | | ---------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | RECEIVED | no | Initial state. The order passed initial validation, and RPI Print API is processing its files. | | QUEUED | no | Initial state. RPI Print API accepted the order, but the customer has exceeded its order limit for the rolling 24 hours. The order moves to RECEIVED when the limit allows. See [Limits and quotas](orders.md#limits-and-quotas). | | VALIDATING | no | RPI Print API is calculating shipping, pricing and tax. The order cannot be cancelled in this status. | | VALID_AWAITING_PAYMENT | no | The order has been validated and is waiting for the daily charge (02:00 UTC) to the default payment method set in the dashboard. It stays here until a charge succeeds; see `PaymentFailure` in [Webhooks](webhooks.md). | | VALID_HOLDING_BIN | no | The order is in the holding bin and is waiting to be sent to the printer. While the order is in the holding bin, it can be cancelled. | | PRINTING | no | The order has been submitted to the printer. Cancellation requests are forwarded to the printer, which may still reject them. | | RECEIVED_BY_PRINTER | no | The printer has accepted the order. Cancellation requests are forwarded to the printer, which may still reject them. | | IN_PRODUCTION | no | The printer has begun producing the order. Cancellation requests are forwarded to the printer, which may still reject them. | | READY_TO_SHIP | no | The order has been produced and is ready to ship. Cancellation requests are forwarded to the printer, which may still reject them. | | SHIPPED | yes | The order has been shipped, and its tracking details are in `shipmentTracking`; see [Tracking numbers](orders.md#tracking-numbers). Cancellation is no longer possible. | | FAILED | yes | The order failed validation or the processing of its files. The order's validations explain why it failed. | | CANCELLATION_REQUESTED | no | Cancellation has been requested for this order. The printer answers the request asynchronously, which can take a while. | | CANCELLED | yes | The order has been cancelled. If the order was already paid, a full or partial refund has been queued, depending on how far the order had progressed. If the refund fails, the order moves to EXCEPTION. | | EXCEPTION | no | The order typically needs manual action, because the printer rejected a cancellation or because of another internal error. After that action, the order can resume production or ship. Contact customer support about it. | | REJECTED | yes | The order was rejected because the order-limit queue was full. A sandbox order is rejected as soon as it exceeds the order limit, because sandbox has no queue. | :::info Orders in final states cannot be cancelled. A cancel request is also refused while the order is `VALIDATING`, `CANCELLATION_REQUESTED` or `EXCEPTION`. ::: :::note `PRINTING` is the API and webhook status value for an order that has been submitted to the printer. The dashboard displays this same status as "Submitted to Printer". The status value on the API and webhook contract remains `PRINTING`. The printer then reports progress through `RECEIVED_BY_PRINTER`, `IN_PRODUCTION`, and `READY_TO_SHIP` before `SHIPPED`. ::: ### Success flow ```mermaid flowchart TD SHIPPED(((SHIPPED))) START{POST /orders/create} START==>RECEIVED RECEIVED==>VALIDATING VALIDATING==>VALID_AWAITING_PAYMENT VALID_AWAITING_PAYMENT==>|Scheduled automatic payment| VALID_HOLDING_BIN VALID_HOLDING_BIN==> |Submitted for printing| PRINTING PRINTING==> |Accepted by printer| RECEIVED_BY_PRINTER RECEIVED_BY_PRINTER==> |Production started| IN_PRODUCTION IN_PRODUCTION==> |Production complete| READY_TO_SHIP READY_TO_SHIP===> |Order shipped|SHIPPED ``` ### Before the order reaches the printer An order waits here for validation, payment and the holding bin. A cancel request succeeds at any of these statuses except `VALIDATING`. ```mermaid flowchart TB START{POST /orders/create} START==>RECEIVED START-->|Over 24h limit| QUEUED QUEUED-->|Released| RECEIVED START-->|Over queue limit| REJECTED(((REJECTED))) START-->|Validation failed| FAILED(((FAILED))) RECEIVED-->|Validation failed| FAILED RECEIVED==>VALIDATING VALIDATING==>VALID_AWAITING_PAYMENT VALID_AWAITING_PAYMENT==>|Payment processed| VALID_HOLDING_BIN VALID_HOLDING_BIN==>|Submitted for printing| PRINTING QUEUED-.->|Cancelled| CANCELLED(((CANCELLED))) RECEIVED-.->|Cancelled| CANCELLED VALID_AWAITING_PAYMENT-.->|Cancelled| CANCELLED VALID_HOLDING_BIN-.->|Cancelled| CANCELLED ``` ### At the printer An order is at the printer while its status is `PRINTING`, `RECEIVED_BY_PRINTER`, `IN_PRODUCTION` or `READY_TO_SHIP`. A cancel request for such an order is sent to the printer, which decides the outcome. The printer can also cancel an order on its own. If RPI Print API cannot submit an order to the printer, the order returns to `VALID_HOLDING_BIN` and RPI Print API submits it again, so a status you poll can move from `PRINTING` back to `VALID_HOLDING_BIN`. ```mermaid %%{init: {"flowchart": {"nodeSpacing": 60, "rankSpacing": 70}}}%% flowchart LR AT_PRINTER[Any status at the printer] AT_PRINTER==>|Order shipped| SHIPPED(((SHIPPED))) AT_PRINTER-->|Cancel request sent to printer| CANCELLATION_REQUESTED CANCELLATION_REQUESTED-->|Printer confirmed| CANCELLED(((CANCELLED))) CANCELLATION_REQUESTED-->|Printer declined and shipped| SHIPPED CANCELLATION_REQUESTED-.->|Printer refused, order already shipping| EXCEPTION["EXCEPTION (usually clears when the order ships)"] AT_PRINTER-->|Cancelled by printer| CANCELLED ``` The statuses an order passes through at the printer, in order: ```mermaid flowchart LR subgraph AT_PRINTER_VIEW[Any status at the printer] direction LR PRINTING==>|Accepted by printer| RECEIVED_BY_PRINTER RECEIVED_BY_PRINTER==>|Production started| IN_PRODUCTION IN_PRODUCTION==>|Production complete| READY_TO_SHIP end ``` ### Exceptions An order in `EXCEPTION` typically needs manual action from RPI customer support. Where support can resolve it, the order resumes at the printer or ships. ```mermaid flowchart LR VALIDATING-.->|Shipping or tax calculation failed| EXCEPTION AT_PRINTER[Any status at the printer]-.->|Printer or submission error| EXCEPTION CANCELLATION_REQUESTED-.->|Printer refused cancellation, order already shipping| EXCEPTION CANCELLED-.->|Refund failed| EXCEPTION EXCEPTION-.->|Resolved by support, where possible| RESUMED[Resumes at the printer] EXCEPTION-.->|Resolved| SHIPPED(((SHIPPED))) ``` --- ## Shipping To get the shipping speeds and prices available for an address, call `POST /orders/shipping/estimate` with that address. RPI opens and closes destinations without releasing a new version of the API, and the estimate always reflects the current ones, so use it to confirm an address rather than relying on the list below. If the estimate refuses an address with HTTP 400, you cannot place an order to that address. ### Where RPI Print API ships RPI Print API groups every destination into one of six destination groups. An order's destination group comes from its destination country and, within the US, its state or territory: | Destination group | Destinations | | ----------------- | ---------------------------------------------------------------------------------------------- | | US | The continental US and DC | | Canada | Canada | | Puerto Rico | Puerto Rico | | US Territories | Guam, US Virgin Islands, American Samoa, Northern Mariana Islands, U.S. Minor Outlying Islands | | Hawaii | Hawaii | | Alaska | Alaska | Address Puerto Rico and the US territories as country `US`, with the territory as the state. For example, an order to Guam uses country `US` with `regionCode` set to `GU`, or with `state` set to `Guam`. Create refuses with HTTP 400 any order whose country is not `US` or `CA`, and stores no order. An order that gives Guam as country `GU` is refused this way. RPI Print API does not ship to military addresses. Create refuses the military state codes `AA`, `AE` and `AP` with HTTP 400. Every order item shipping to Canada, Puerto Rico, or the US Territories group must include a `retailPrice`, because customs declaration requires a declared value. An order to one of those destinations with an item missing `retailPrice` fails validation. A validation failure such as a missing `retailPrice` does not refuse the create request. The request succeeds, the order ends in the `FAILED` state, and RPI Print API sends the `OrderValidationFailed` webhook. ### How a shipping price is calculated Each destination group offers up to three speeds: Standard, Expedited, and Rush. Not every group offers all three — see the per-group tables below for which speeds a group sells. Each speed prices an order by quantity, using bands: the price of unit 1 comes from the first band, and each additional unit is priced from whichever band it falls into. For example, an order of 12 units on a tier priced at $6.99 for unit 1, $2.50 for units 2-5, $2.00 for units 6-10, and $1.50 for units 11-20 costs: $6.99 (unit 1) + 4 × $2.50 (units 2-5) + 5 × $2.00 (units 6-10) + 2 × $1.50 (units 11-20) = $29.99 The top band has no upper limit — every unit at or above its starting quantity is priced at that band's rate. ### Shipping speeds, transit times, and prices by destination Production time is separate from transit time: it's the number of business days RPI Print API takes to print and prepare the order before it ships. Production is 4 business days for Standard and Expedited, and 3 business days for Rush, in every destination group that offers it. Transit time is counted in calendar days from the day the order ships. #### US | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | ----------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | 2-5 calendar days | $6.99 | $2.50 | $2.00 | $1.50 | $1.00 | | Expedited | 2 calendar days | $30.99 | $3.00 | $2.50 | $4.00 | $2.00 | | Rush | 1 calendar day | $35.99 | $5.50 | $5.00 | $2.50 | $1.50 | #### Canada | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | ----------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | 2-5 calendar days | $17.99 | $3.00 | $2.00 | $1.00 | $0.50 | | Expedited | Not offered | — | — | — | — | — | | Rush | 1 calendar day | $39.99 | $3.00 | $1.50 | $1.00 | $0.50 | Canadian orders ship DAP (Delivered at Place). RPI collects Canadian sales tax when you are charged, and the recipient is responsible for any import duties, customs-clearance charges, and fees assessed at the border. #### Puerto Rico | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | ----------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | 2-5 calendar days | $19.99 | $3.00 | $2.00 | $1.00 | $0.50 | | Expedited | 2-4 calendar days | $24.99 | $4.00 | $3.00 | $2.00 | $1.00 | | Rush | 1-2 calendar days | $79.99 | $5.00 | $4.00 | $3.00 | $1.50 | #### US Territories (Guam, US Virgin Islands, American Samoa, Northern Mariana Islands, U.S. Minor Outlying Islands) | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | ----------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | 2-5 calendar days | $29.99 | $4.00 | $3.00 | $2.00 | $1.00 | | Expedited | 1-3 calendar days | $34.99 | $4.00 | $3.00 | $2.00 | $1.00 | | Rush | Not offered | — | — | — | — | — | #### Hawaii | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | --------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | Not offered | — | — | — | — | — | | Expedited | 2 calendar days | $29.99 | $3.00 | $2.00 | $1.00 | $0.50 | | Rush | 1 calendar day | $39.99 | $4.00 | $3.00 | $2.00 | $1.00 | #### Alaska | Speed | Transit time | Unit 1 | Units 2-5 | Units 6-10 | Units 11-20 | Units 21+ | | --------- | --------------- | ------ | --------- | ---------- | ----------- | --------- | | Standard | Not offered | — | — | — | — | — | | Expedited | 2 calendar days | $29.99 | $3.00 | $2.00 | $1.00 | $0.50 | | Rush | 1 calendar day | $39.99 | $4.00 | $3.00 | $2.00 | $1.00 | --- ## Webhooks To avoid the need for polling, RPI Print API sends webhooks, which are HTTP notifications, when certain order events happen. To turn them on, set the `webhookUrl` property when you create an order. RPI Print API retries a webhook for about 7.5 hours: five times about 30 seconds apart, then about every 15 minutes. Delivery is not guaranteed. If your integration can miss a webhook, call `GET /orders/{customerOrderId}` to recover the order's current status. Every webhook body is JSON that describes the order, much like the response to a GET request for it. Set `webhookUrl` in the create order request: ```json { "webhookUrl": "https://endpoint.com/callbacks/741231" } ``` Each order can have a different `webhookUrl`, and the URL may include query parameters, for example `?orderid=1234`. During development you might want to use a webhook testing service, such as https://webhook.site or https://ngrok.com/. The create request fails if `webhookUrl` does not meet these requirements: - It must be a valid URL of no more than 2048 characters. - It must start with `https://`. RPI Print API accepts no other protocol. - Its host must not be `localhost` or an IP address in a private or reserved range, such as 192.168.x.x or 10.x.x.x. Create does not check that the URL is reachable. For RPI Print API to deliver webhooks, the URL must be reachable from the public internet, and it should be an endpoint you control. ### Webhook request The webhook request sent to your endpoint has a JSON body with this structure: | property name | type | description | | ------------- | -------- | -------------------------------------------------------------------------------------------- | | `source` | `string` | The event type that caused RPI Print API to send this webhook. | | `time` | `string` | The time of the event, in UTC, in ISO-8601 format. | | `data` | `object` | The order, as an `OrderFullResponse` described in the [API reference](../api-reference.mdx). | If an order cannot be created, the create request returns the error and RPI Print API sends no webhook. #### List of webhook sources | `source` | event that causes this webhook | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OrderAcceptedByPrinter` | The printer has confirmed that it received the order, and the order moves to `RECEIVED_BY_PRINTER`. The printer can refuse a cancellation request from `PRINTING` onward, which comes before this. | | `OrderAssetsAllProcessed` | Every file in the order has been processed successfully. | | `OrderCancellationRequestSentToPrinter` | The order is already at the printer, and RPI Print API has sent the printer a cancellation request. The printer will confirm or refuse it. | | `OrderCancelledBeforeSubmissionToPrinter` | The order was cancelled in the holding bin, before it was sent to the printer. | | `OrderCancelled` | The order was cancelled before it entered the holding bin, or the printer confirmed a cancellation request. A cancellation in the holding bin sends `OrderCancelledBeforeSubmissionToPrinter` instead. | | `OrderCreated` | The order has passed initial validation and is queued for further processing. | | `OrderEnteredHoldingBin` | The order has entered the holding bin, where it stays for about 2 hours. A cancellation during this time always succeeds. | | `OrderErrorAtPrinter` | The printer reported a problem printing the order. Check the order's details for more information, or contact customer support. | | `OrderExceedsLimitQueue` | The order arrived when both the daily order limit and the queue for orders over the limit were full, so it was rejected. RPI will not process it. | | `OrderExitedHoldingBin` | The order has left the holding bin, after 2 hours or when customer support released it early, and is scheduled to be sent to the printer. | | `OrderExitedLimitQueue` | An order that was over the daily order limit has been released from the queue and continues through the normal workflow. | | `OrderFailed` | Processing the order's files failed, which usually means there is a problem with the files. Check the order's validations for details. | | `OrderFinishedPricing` | RPI has applied pricing and taxes to the order, and those fields are now available. | | `OrderInExceptionState` | The order has entered the `EXCEPTION` state, which usually needs customer support to resolve. | | `OrderInProduction` | The printer has begun producing the order. | | `OrderOverLimitQueued` | The order has been placed in the queue for orders over the limit, because more than the maximum number of orders were submitted in the last 24 hours. | | `OrderPricingReceived` | For an order the printer prices, the printer has priced its items, and the `pricing` block now carries `itemsTotal`. RPI records this event once per order. | | `OrderReadyToShip` | The printer has produced the order, and it is ready to ship. | | `OrderReceived` | The order has passed initial validation, and RPI Print API has received it. | | `OrderReprintRequested` | A reprint of this order has been created. | | `OrderShipped` | The order has shipped. An order can ship in one shipment or several, and the last shipment ends the order's workflow. | | `OrderShippingEstimatesRefreshed` | RPI updated the order's shipping estimates before sending it to the printer. The ship date may have changed because of the time the order spent in the limit queue or the holding bin. | | `OrderSubmittedToPrinter` | The order has been sent to the printer and is waiting for the printer to confirm it. | | `OrderValidationFailed` | Validation of the order failed. Check the order's validations for details. | | `OrderVoidedByPrinter` | The printer has cancelled an order that had already reached it. | | `PaymentFailure` | A payment failed. RPI retries scheduled payments the next day. Check your payment information. | | `PaymentSuccessful` | A payment succeeded, and the orders waiting for it move to the holding bin. | | `RefundSuccessful` | A refund for this order has been processed. | ### Webhook response Your endpoint should respond with an HTTP status from 200 to 299, ideally within 10 seconds. If it does not, RPI Print API sends the webhook again later. After a number of failed attempts, RPI Print API stops sending that webhook. The Event Logs tab on an order's page in the RPI Print API Dashboard lists each event on the order and when it happened. It does not show webhook bodies, delivery attempts, or failures. ### Webhook signature RPI Print API signs each webhook body with an `hmac-sha256` signature, so that you can confirm that RPI Print API sent the webhook and that nobody changed it on the way. The signature is a Base64 encoded hash, sent in the `x-rpi-printapi-hmac-sha256` request header. RPI Print API computes the signature with your webhook secret. The webhook secret is an authentication credential: anyone who has it can sign a request that your endpoint will accept as coming from RPI Print API. Store it as securely as your API keys. Each [customer](dashboard-accounts.md) has two webhook secrets, one for production and one for sandbox. Webhooks for production orders are signed with the production secret, and webhooks for sandbox orders with the sandbox secret. The API Keys page under Developer Tools in the dashboard shows the secret for the mode the dashboard is in. #### Example: calculate `hmac-sha256` in Node.js ```js import { createHmac } from "crypto" ... const hmacSignature = createHmac('sha256', webHookSecret).update(webhookReceivedBodyAsString, 'utf8').digest('base64'); ``` ### Polling for order status If you do not use webhooks, you can poll for an order's status by calling `GET /orders/{customerOrderId}`, which the [API reference](../api-reference.mdx) describes. [Order states](order-states.md) describes each status it can return. Polling returns the same data that a webhook delivers. Polling suits displaying progress to your end user. For everything else, webhooks are easier to use and more reliable. If you need both to display progress and to continue a process in your backend, set up a webhook for the backend and poll only to display progress. --- ## Support Quick answers for developers building on the RPI Print API. ### Contact us Email [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com) with any question about the API or your orders. Support hours are Monday to Friday, 8 AM to 5 PM Pacific Time, except RPI holidays. For a question about your integration, include whether you used a sandbox or production API key, the order ID, the API request data (preferably as a curl command), and any error message. Before you send the request, remove or replace every value that is a credential or personal data: the Authorization header, the recipient's name, address, phone and email, pre-signed file URLs, and any token in the `webhookUrl`. Send the smallest request that shows the problem. For a question about a specific order, include your customer name and the order identifier, or a link to the order in the RPI Print API Dashboard. ### FAQs #### General 1. **What fees or costs are associated with using the RPI Print API?** There are no fees for setting up or using the API. You are charged for print orders: books, fulfillment and shipping, and sales tax as applicable. 2. **Where can I find the list of standard products offered?** The [RPI Print website](https://www.rpiprint.com) gives an overview of the available book sizes, bindings, and papers. If you already have an account, you can also review the Products section of the dashboard. The [Product specifications](product-spec.mdx) page shows the options that affect a product's specifications, and has downloadable templates and guidance on setting up your files. You can explore further customizations in the dashboard's add product wizard. 3. **How is a book priced?** Each product has a base price that covers its minimum page count, which is 20 or 24 pages depending on the product. Every page after that adds a per-page price, which runs from $0.02 to $0.34 depending on the product's size, paper, and print mode. Shipping and sales tax are charged on top. [Prices](documentation/products.md#prices) gives the formula, and the dashboard shows each product's price when you add it. Current prices are also on the [product and pricing page](https://www.rpiprint.com/products-services/print-apis/self-service). To price an order before you create it, call `POST /orders/pricing/estimate`. #### Product setup 1. **How do I get started?** 1. Create an account at [api.rpiprint.com](https://api.rpiprint.com). 2. Work with your developer (or yourself, if that is also you) to configure your API credentials. The [API Endpoints](api-reference.mdx) and [Webhooks](documentation/webhooks.md) documentation will help you get started. 3. Choose products from our catalog before you start accepting orders. See our [Product specifications](product-spec.mdx). When you add a product, you select its attributes and see its book price, excluding taxes and shipping. 4. Place a test order in Sandbox. 5. Switch the dashboard to Production. [Getting started](documentation/getting-started.md) explains each step in detail. 2. **How do I add my products?** Go to the [Products page](https://api.rpiprint.com/dashboard/customer-products) in the dashboard and select your attributes: size, cover, paper type, text color, and bleed. You see the book price, excluding tax and shipping, as you go. After you select your attributes, you can edit the product SKU and product name, for which we provide a default naming convention, and add a description. Your product SKU is what you send in each order. To edit a product later, open the menu (three dots) at the right end of the product's row in the Products list. 3. **Can I get proofs or samples of my products and/or the standard products you offer?** At this time, we do not offer complimentary samples. We recommend placing a production order for the exact product you plan to sell. That order tests your setup end to end and gives you a physical copy of your product. Sandbox orders are not printed; they let you test the API integration itself. #### Files 1. **Can every order use different files?** Yes. A product defines only the physical specifications, and each order item carries its own files, so every book can be unique. RPI Print API does not provide design or personalization tools, so your system produces the press-ready PDFs. See [How do I produce a file for every order?](documentation/print-assets.md#how-do-i-produce-a-file-for-every-order) 2. **Where should I host my files, and for how long?** Host each file at a public HTTPS URL. We recommend Amazon S3 pre-signed URLs in the us-west-2 region. Your files must stay reachable until RPI sends `OrderAssetsAllProcessed`, usually within minutes, or the order fails. RPI does not download the files of an order queued over your daily limit until the queue releases it, so set pre-signed URLs to expire 7 days after you create the order. RPI keeps its own copy of each file for 60 days, for reprints. [Files](documentation/print-assets.md#how-long-do-my-files-need-to-stay-reachable) explains how to sign URLs that last the full 7 days. 3. **How do I get file dimensions and spine width?** Use the template generator on [Product specifications](product-spec.mdx). It gives a template showing the trim, bleed, and safe zone for any size, cover type, and paper. The same page has spine width tables by page count. 4. **Why did my order fail?** Usually because of a problem in a file, such as a font that is not embedded, a page size that does not match the product's trim size, or a page count the binding does not allow. RPI sends an `OrderFailed` or `OrderValidationFailed` webhook. The order's `validations`, in the API response and in webhooks, list every issue, and the order's page in the dashboard shows the same report. A failed order cannot take a new file. Correct the files and place a new order with a new `customerOrderId`. See [Preflighting](documentation/preflight.md) and [Content Creation Standards](documentation/press-ready-PDFs.md). #### Orders, Shipping, and Payments 1. **Is there a limit on the number of orders I can place per day?** You may place up to 50 orders in a rolling 24-hour period. Reprints do not count toward the limit. Orders over the limit wait in a queue and are released as the limit allows, and their SLAs and shipping dates are updated to match. The queue has a ceiling of 350, which counts received and queued orders together. With the default limits, up to 300 orders can wait in the queue, and RPI rejects any order past the ceiling. RPI emails the address on record when you go over your limit. Both numbers are defaults. To change them, contact [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). 2. **How long do I have to cancel an order?** After an order's payment succeeds, the order waits in a holding bin for 2 hours before it is sent to the printer. Until the order leaves the holding bin, a cancellation always succeeds. After that, and until the order ships, a cancellation sends a request to the printer, and the order moves to `CANCELLATION_REQUESTED`. The printer can accept or refuse the request. A shipped order cannot be cancelled. 3. **How do I cancel an order?** Call the cancel endpoint, `DELETE /orders/{customerOrderId}`, any time before the order ships, except while its status is `VALIDATING`, `CANCELLATION_REQUESTED` or `EXCEPTION`. The previous answer explains when the printer decides the outcome. 4. **How long will it take to manufacture my products?** Manufacturing takes 4 business days for Standard and Expedited shipping, and 3 business days for Rush. Manufacturing happens before the order ships, so add the shipping speed's transit time to get the total. See [Shipping](documentation/shipping.md). 5. **What shipping methods are available?** RPI offers Standard, Expedited, and Rush. Which of them a destination sells varies, so call `POST /orders/shipping/estimate` for an address. See [Shipping](documentation/shipping.md). 6. **What shipping rates are available?** Rates depend on the destination and on how many items the order contains. See [Shipping](documentation/shipping.md) for the rate tables, and call `POST /orders/shipping/estimate` for the price of a specific order. 7. **Do you ship internationally?** Yes, to Canada. RPI also ships to the US, Puerto Rico, and the US territories. Orders to Canada, Puerto Rico, and the US territories need a `retailPrice` on every item for customs. Canadian orders ship DAP (Delivered at Place), so the recipient pays any import duties and customs charges. See [Shipping](documentation/shipping.md) for the speeds and rates each destination sells, and call `POST /orders/shipping/estimate` to confirm what a particular address can be sold. 8. **Can I safely retry a create-order request?** A `customerOrderId` can be used only once, across Sandbox and production, and reusing one returns HTTP 400. If a create request times out, call `GET /orders/{customerOrderId}` with the same API key before you retry. If it returns the order, your first request succeeded. If it returns 404 and a retry then returns 400, the identifier belongs to an order in your other mode, so choose a new identifier. See [Customer Order Ids](documentation/orders.md#customer-order-ids). 9. **Can I change an order's shipping address?** No. The API has no endpoint that changes an order. To ship to a different address, cancel the order and place a new one while cancellation is still possible. The cancellation answers above explain when that is. 10. **Can one order ship to multiple addresses?** No. Each order ships to a single address. Create a separate order for each recipient. 11. **How do I track an order?** Set a `webhookUrl` on each order to receive signed notifications as the order moves through each stage, or poll `GET /orders/{customerOrderId}`. `OrderShipped` is the last shipping event, and the order's `shipmentTracking` then lists the tracking numbers and carrier links. RPI does not send a delivery confirmation. See [Tracking numbers](documentation/orders.md#tracking-numbers), [Webhooks](documentation/webhooks.md), and [Order states](documentation/order-states.md). 12. **How do I pay for orders?** RPI charges your production orders to the credit card on your account. A Customer Admin adds the card on the Payments page of the dashboard. RPI charges the card once a day at 02:00 UTC for every order in the `VALID_AWAITING_PAYMENT` status. That is 9 PM Eastern and 6 PM Pacific in winter, and 10 PM Eastern and 7 PM Pacific during daylight saving time. A production order stays in `VALID_AWAITING_PAYMENT` until its payment succeeds. The dashboard shows when your next charge is expected. 13. **What forms of payment do you accept?** We accept Visa, MasterCard, and American Express credit cards. We charge in US dollars (USD) only. International credit cards are accepted. When selecting the associated country for your card, you can type the name of the country to filter. 14. **Will I be charged taxes?** Orders are charged sales tax by default, based on RPI's ship-from address and your order's destination. If you are eligible for tax exemption, for example as a reseller, you can upload your documentation so that you are not charged unnecessary taxes. Only a Customer Admin sees the Tax exemption section. To upload your documentation, switch the dashboard to Production, open the Payments page, and find your Tax exemption options at the bottom of the page. If your status says "Not tax exempt", upload your documentation. Once you upload it, you will receive an email confirming that you will not be charged taxes. If a review finds your documentation invalid, your status is changed to "Not tax exempt", and you receive an email asking you to upload a valid tax document. Tax exemption is not available for Canadian sales tax at this time. #### Technical Integration Setup 1. **How does Sandbox work?** Every account includes Sandbox, and it is on by default for new users. Switch modes with the toggle at the right end of the banner across the top of every dashboard page. Sandbox orders are never printed or charged. Orders and API credentials are separate for each mode. Products are shared by both modes, so a product you test in Sandbox is ready to use in production. Orders placed with sandbox credentials are sandbox orders. 2. **How do I test payments in Sandbox mode?** You can simulate a payment succeeding or failing from the Orders page while the dashboard is in Sandbox mode. Open the Test Order Payments menu above the orders table and choose Payment Success or Payment Failed. Sandbox orders never charge a card, so you do not need a real payment method. --- ## Terms and Conditions #### Terms & Conditions for RPI PRINT, Inc. Small Business Fulfillment (API) These Terms and Conditions (" **Agreement**") are made and entered between RPI Print, Inc. (" **RPI PRINT**") and you (" **Customer**" or " **you**"). You wish to engage RPI PRINT for the manufacture and fulfillment of professional quality printed products and publications (" **Products**")using self-serve print on-demand services (" **Services**") that are in some cases available through the use of proprietary RPI PRINT technology. RPI Print will providesuch Products and Services pursuant to the terms and conditions of this Agreement. By clicking "I Agree", you agree to be bound by this Agreement, and you are indicating that you have read and acknowledge the terms and conditions of this Agreement. If you do not agree to every provision of this Agreement, do not click "I Agree" and do not proceed to access, browse, or use the Services. BY USING THE SERVICES, YOU AGREE TO FOLLOW AND BE BOUND BY THIS AGREEMENT AND THE PRIVACY POLICY FOR THE SERVICES THAT YOU ARE USING, WHICH IS HEREBY INCORPORATED BY REFERENCE. IF YOU DO NOT WISH TO BE BOUND BY THIS AGREEMENT AND THE APPLICABLE PRIVACY POLICY, YOU MAY NOT ACCESS OR USE THE SERVICES. By accepting this Agreement, you represent that you are 18 years of age or older, or the applicable age of majority in your jurisdiction, and that, if you have accepted this Agreement on behalf of any person or entity, you represent that you have legal authority to do so and that such person or entity agrees to be responsible to us if you or such person or entity violates this Agreement. **Amendments.** We may modify any of the terms this Agreement from time to time and such modification will be effective with respect to the Customer's use of the Services at any time after the effective modification date. Customer will be required to agree to the modified terms of this Agreement. If Customer does not agree to the modification, Customer must cease use of the Services. #### 1. DEFINITIONS In these Terms unless stated otherwise: "**Affiliate(s)"** means any entity or entities that directly or indirectly controls, is controlled by, or is under common control with, a party; "**Business Day**", if unmodified, means Monday through Friday, 9:00 AM to 5:00 PM; "**Intellectual Property Rights"** means all copyright, moral rights, patent rights, trademarks, design rights, trade secrets, rights in or relating to databases, rights in or relating to confidential information, rights in relation to domain names, and any other intellectual property rights (registered or unregistered) throughout the world; "**Keys"** means the unique security keys, secrets, tokens, passwords or other credentials used for accessing the RPI PRINT API for which Customer registers and managing Customer's account; "**Customer Application"** means the software application Customer creates that is developed to interface with the RPI PRINT API, that is authorized pursuant to the Keys and that meets the interoperability specifications as RPI PRINT provides to Customer from time to time; "**Local Time**" means Pacific Time Zone, adjusted for Daylight Savings Time if in effect at the given time; "**Order**" means an order for Products transmitted by Customer to RPI PRINT for fulfillment; "**RPI PRINT API"** means an application programming interface made available to Customer by RPI PRINT in order for Customer to receive the Services; "**RPI PRINT Data"** means all information, data and materials, whether in oral, written, source code or machine-readable form, either provided by RPI PRINT to Customer or generated by RPI PRINT or Customer in connection the Services, including but not limited to the RPI PRINT's past, present and future plans, businesses, activities, products, services, customers, suppliers development status of the RPI PRINT API, the functionality, operability and other aspects of the RPI PRINT API, the pricing of the Products and Services offered to Customer, and all other information provided by RPI PRINT that is marked as "confidential" or that reasonably should be understood to be confidential; "**RPI Holidays**" – RPI Holidays will include: New Year's Day Dr. M. L. King Jr. Birthday Presidents' Day Memorial Day Independence Day Labor Day Thanksgiving Day Christmas Eve Day Christmas Day "**RPI PRINT Privacy Policies"** can be found online at https://www.rpiprint.com/compliance "**RPI PRINT Trademark(s)"** means such trademarks, logos, brands and company names used to designate the products and services of RPI PRINT and its Affiliates; **"RPI PRINT Website(s)"** means any website owned or operated by RPI PRINT or any website nominated by RPI PRINT (including but not limited to those of its Affiliates), including in each case all subdomains and corresponding international domains however accessed (e.g., desktop, mobile applications) #### 2. SERVICES RPI PRINT provides the Services to Customer subject to this Agreement. Customer agrees to be bound by this Agreement, which are incorporated herein by reference. Subject to this Agreement, and so long as Customer complies with all the terms of this Agreement, RPI PRINT grants to Customer, a limited, non-exclusive, royalty-free, revocable, non-assignable, non-sublicensable and non-transferable license to **(i)** use the Services, and **(ii)** install, imbed and incorporate the RPI PRINT API, in each case, solely to develop and enable the Customer Application. Customer will not, and shall ensure that its end users of the Customer Application do not, directly or indirectly: **(i)** sublicense, rent, lease, sell, loan, transfer, distribute, translate, reverse engineer, decompile, or disassemble or otherwise obtain or attempt to create, derive the source code of the RPI PRINT API; **(ii)** modify, enhance or otherwise change the RPI PRINT API, or prepare derivative works based on the RPI PRINT API; **(iii)** copy or otherwise reproduce the RPI PRINT API, or any materials provided in connection there with except as expressly permitted herein; **(iv)** remove, obscure, or alter any notice of copyright, trademark, or other proprietary right appearing in or on any item included with the RPI PRINT API; **(v)** circumvent or attempt to circumvent any methods employed by RPI PRINT to control access to the components, features or functions of the RPI PRINT API, or to prevent unauthorized use of the RPI PRINT API; or **(vi)** use the Services for purposes of competitive analysis, the development of a competing software product or any other purpose that is to RPI PRINT's commercial disadvantage. Customer is solely responsible and liable for all Content that Customer (or its end user) uploads, posts, e-mails, or otherwise transmits in connection with the Services (" **User Content**"). RPI PRINT has no control over, and shall have no liability for, any damages resulting from the use (including without limitation) or misuse by any third party of information made public through the Services. With respect to User Content that Customer transmits to the Services, Customer hereby grants to RPI PRINT a worldwide, royalty-free, non-exclusive license to use, copy, excerpt, reproduce, display, publish, modify, normalize, distribute and create derivative works of such User Content in any form or media, to provide the Services. By transmitting User Content to RPI PRINT, Customer represents, warrants, and covenants that Customer has all rights necessary to grant the licenses set forth in this Agreement, to permit RPI PRINT to use the User Content to perform the Services. #### 3. METHOD OF PERFORMANCE **3.1 Customer Application** Customer will have sole responsibility for developing and enabling the Customer Application, at Customer's sole cost and expense, that will provide the technical integration between Customer's systems and the Services. Customer acknowledges and agrees that its ability to use the Services is wholly dependent on the availability of the Customer Application and Customer's development of the Customer Application in accordance with the specifications that RPI PRINT makes available to Customer from time to time. RPI PRINT will have no liability for Customer's failure to use the Services or order Products. RPI PRINT will manufacture and deliver the Products ordered by Customer under the terms of this Agreement. **3.2 Orders** Customer will ensure that the form and content of each Order complies with the Order API Technical Specifications (as RPI makes available to Customer from time to time) and Product specifications, and that image assets accompanying Orders conform to the Content Creation Standards as RPI makes available to Customer from time to time. On receipt of each Order, RPI PRINT will timestamp that Order with the date and time received, using RPI PRINT's Local Time. Every Order is subject to RPI PRINT's acceptance; any Order not expressly accepted by RPI PRINT is deemed rejected, except where RPI PRINT has commenced production. On or about [5 pm Local Time] each Business Day, RPI PRINT will transmit electronic acceptance of each Order for Products that was submitted since [5 pm Local Time of the prior Business Day]. RPI PRINT will manufacture, package and ship Products as specified in the Order, in compliance with the terms and specifications herein. After submission of an Order and prior to such time that RPI PRINT has commenced preparation of the Order for shipment, Customer may, using the Customer Application, change the delivery method for an Order and/or the delivery address. If other changes are required prior to such time that RPI PRINT has commenced production on the Order or any part thereof, Customer must cancel that Order and resubmit a new Order with the desired changes. Customer may, after placing an Order, cancel that Order. If such cancellations are made prior to RPI PRINT transmitting electronic acknowledgement of acceptance for that Order, Customer will incur no charges for that Order. In the event that Customer cancels an Order after RPI PRINT transmits electronic acknowledgement of acceptance for that Order, RPI PRINT will invoice, and Customer will pay for those Products ordered using the rates in effect at the time of Order placement. Customer will not be liable for packaging or shipping costs of an Order canceled if Customer cancels the Order before shipment. Except as otherwise provided, once RPI PRINT has commenced production of an Order or any part thereof, it will be irrevocable and not subject to change or cancellation by Customer. **3.3 Rejection of Orders** > **i.**. "Non-Conforming Order" means an order that is malformed, contains incomplete or invalid product information, missing or corrupt image data, or incomplete or invalid shipping information, or in any other way does not comply with the terms and conditions of this Agreement. > **ii.**. "Prohibited Content" means any Content that: (i) is offensive, pornographic, or promotes racism, bigotry, hatred, or physical harm of any kind against any group or individuals; (ii) bullies, harasses, or advocates stalking, bullying, or harassment, of another person; (iii) involves the transmission of "junk mail," "chain letters," unsolicited mass mailing, or "spamming,"; (iv) is false or misleading or promotes, endorses or furthers illegal activities or conduct that is abusive, threatening, obscene, defamatory, or libelous; (v) promotes, reproduces, performs, or distributes an illegal or unauthorized copy of another person's work that is protected by copyright or trade secret law, such as providing pirated computer programs or links to them, providing information to circumvent manufacturer-installed copy-protection devices, or providing pirated music or links to pirated music files; (vi) is involved in the exploitation of persons under the age of eighteen (18) in a sexual or violent manner, or solicits personal information from anyone under thirteen (13); (vii) provides instructional information about illegal activities such as making or buying illegal weapons, violating someone's privacy, or providing or creating computer viruses and other harmful code; (viii) solicits passwords or personally identifying information for commercial or unlawful purposes from others; (ix) contains viruses, Trojan horses, worms, time bombs, cancelbots, corrupted files, or similar software; (x) violates any applicable law (that is, in connection with any jurisdiction relevant to Customer, RPI PRINT, or User Content), including, but not limited to laws and regulations governing hate speech, child pornography, export control, unfair competition, anti-discrimination, and false advertising; (xi) involves commercial activities that are detrimental to our interests; (xii) involves commercial activities or content that harms buyers and/or affects the reputations of others, including but not limited to RPI PRINT distributors, as determined in RPI PRINT's sole discretion; (xiii) features a photograph of another person without that person's permission; or (xiv) otherwise violates this Agreement or creates liability for RPI PRINT. Such content prohibited from selling via third-party channels may include: (i) summaries, workbooks, or similar content for which permission from the original author has not been obtained; (ii) books which have more than 10% of blank pages, including journals, notepads, planners, and publications with similar repetitive, low content; (iii) books or content that mirrors or mimics popular books (for example similar covers, titles, author names, or content); (iv) books that mislead or are likely to cause confusion to the buyer, including without limitation, inaccurate descriptions and cover art, pixelated images, unreadable text, or trimmed content; (v) books or other products listed at prices which do not reflect the book's or product's market value; (vi) books scanned from original versions where parts contain illegible content; (vii) books created using artificial intelligence or automated processes including but not limited to content scraped/collected from Wikipedia, or other online sources and publications, content that violates rights of publicity, public domain titles that are too similar to existing versions of the same title available via other retail sites. > **iii.**. RPI PRINT may reject a Non-Conforming Order, or an Order that contains Prohibited Content. RPI PRINT will use commercially reasonable efforts to reject such Orders within three (3) Business Days of receipt of the Order. RPI PRINT will provide notice of the rejection to Customer and specify the reason for the rejection. Such notice will be delivered by email or other electronic means to such person designated by Customer. Failure by RPI PRINT to reject such Order within three (3) Business Days of receipt of the Order will not constitute a waiver by RPI PRINT to exercise its right to reject the Order. Failure to reject an Order will not affect RPI PRINT's right to indemnification under this Agreement. **3.4 Manufacturing Time** **i.** **Service Level Agreement for Products** a) Definitions > "Manufacturing Time" means the number of Business Days from Order Acceptance Date to Order Ship Date, the Order Acceptance Date being Day Zero, the day following Day Zero being Day One and so forth. > "Order Acceptance Date" means the date upon which RPI PRINT accepts an Order if such date is a Business Day, and otherwise will be the first Business Day thereafter. > "Order Ship Date" means the date upon which RPI PRINT marks an Order in its production system as shipped. b) Manufacturing Time – Up to 5 business days after the Order Acceptance Date. c) Exceptions to Manufacturing Time > RPI PRINT will not be required to meet the Manufacturing Time requirements set forth in this Agreement for Non-Conforming Orders. RPI PRINT may reject Non-Conforming Orders, or at its option, may attempt to correct a Non-Conforming Order. If RPI PRINT corrects a Non-Conforming Order, the date of such correction will be considered as the Order Acceptance Date. **ii.** **Advance Notice for Planned Closures, Outage** > RPI PRINT will use commercially reasonable efforts to provide no longer than [two (2)] calendar days' advance notice in the event of a planned closure, except for closures for RPI PRINT Holidays, as set forth in this Agreement. > > RPI PRINT will use commercially reasonable efforts to provide no longer than [two (2)] calendar days' advance notice in the event of other planned service outages. In such notifications, RPI PRINT will provide an estimated duration for the outages and will, with reasonable notice, notify Customer in the event that the duration of the outage is likely to exceed the estimated duration. **iii.** **Calendar of Planned Closures, Outage** > Routine service and maintenance to RPI PRINT's information systems are performed each Tuesday and Thursday from 04:00 to 06:00 Local Time. Access to RPI PRINT's information systems, including the Service and web portals, may be interrupted during these periods. > > RPI PRINT facilities are closed during RPI Holidays. **3.5 Shipping and Carriers** **i.** **Risk of Loss; Transfer of Title** > All Orders shipped on RPI PRINT carrier accounts will be shipped FOB Destination to the address provided by Customer, with risk of loss and transfer of title passing to Customer upon delivery of the Order to the designated destination. **ii.** **Packaging** > RPI PRINT will package Products in a manner to reasonably protect the Products from damage in shipping. RPI PRINT will package and ship items for an Order in accordance with the shipping option selected by Customer during the ordering process. **iii.** **International Shipments** > No international shipping options will be made available at this time. RPI PRINT will only ship to United States delivery addresses. **iv.** **Carriers and Billing** > Orders will be shipped using RPI PRINT's account. Estimated charges for shipments made on RPI PRINT's account on behalf of Customer are available on the RPI PRINT Website. The charges for shipments will be in effect as of the Order Acceptance Date. These rates are exclusive of fuel and delivery surcharges which may be assessed by carriers. Shipping charges and surcharges are subject to change without advance notice. RPI PRINT will use commercially reasonable efforts to timely notify Customer of changes in shipping charges and surcharges. **v.** **Shipping Acknowledgements; Tracking IDs** > RPI PRINT will provide electronic shipping acknowledgements for each Order as it is prepared for courier pickup. Such acknowledgements will include a tracking ID for each shipment if provided by the courier. **vi.** **Undeliverable Goods** > In the event that RPI PRINT produces Products, and such Products cannot be delivered due to incomplete or incorrect destination information provided by Customer, or such delivery is rejected by the addressee, Customer will be responsible for payment to RPI PRINT for those Products including any shipping costs incurred by RPI PRINT. Customer and RPI PRINT will agree to a process for handling, re-shipping or scrapping of all undeliverable Products that are physically returned to RPI PRINT. **3.6 Fees and Invoicing** **i.** **Pricing Schedule** > The Pricing schedule for Services is set forth on the RPI PRINT Website at: api.rpiprint.com. > > Pricing will be subject to change by RPI PRINT in the event Customer requests a modification to the Services provided. Notwithstanding the foregoing, RPI PRINT reserves the right to change the pricing at any time, such change will be reflected on the RPI PRINT Website. **ii.** **Fees** > You acknowledge that we reserve the right to charge for Services and to change our fees from time to time in our discretion, upon posting the price change on the RPI PRINT Website. Upon using the Services, you will be responsible for the payment of any applicable fees, and will pay such fees to us as set forth on the RPI PRINT Website. All prices on the RPI PRINT Website are in U.S. Dollars and we only accept payment in U.S. Dollars. If you initiate payment for any Products or Services in currency other than US dollars, the payment will be converted into the equivalent amount in US dollars using the prevailing exchange rate in use by the company processing the credit card payment. > You agree to pay all fees and charges incurred in connection with your Orders and purchases (including any taxes imposed on your orders and purchases, including, but not limited to, sales, use, or value-added taxes, unless, in cases where you intend to resell or redistribute your product(s), you provide us with sufficient evidence that the order and purchase is made solely for the resale or redistribution of the product your ordered to your customers) at the rates in effect when the charges were incurred. We may automatically charge and withhold such taxes for Orders to be delivered to addresses within any jurisdictions where it deems it is required. **iii.** **Invoicing and Payment** > RPI PRINT will compile Customer's daily Orders into a final fulfillment invoice at the end of each day and the total amount of the fulfillment invoice will be charged to the Customer's credit card on file. The fulfillment invoice will be sent to Customer by email and will include the price for the Services, applicable shipping charges, fuel and delivery surcharges and any applicable fees, surcharges, credits, or adjustments. All invoices will be in US Dollars. > You will be required to give us a valid credit card number (VISA, MasterCard, American Express, or any other issuer then accepted by RPI PRINT) and associated payment information at the time you engage RPI PRINT for fulfillment of your Products, including all of the following: (i) your name as it appears on the card; (ii) the credit card type; (iii) the date of expiration of your credit card; (iv) billing address; and (v) any activation numbers or codes needed to charge your card. We currently do not accept cash, checks, or any other payment form. Your credit card issuer agreement governs your use of your designated credit card, and you must refer to that agreement and not this Agreement to determine your rights and liabilities as a cardholder. You agree that no additional notice or consent is required before we invoice the credit card for all amounts due and payable. By providing us with your credit card number and associated payment information, you agree that we are authorized to immediately charge your account for all fees and charges invoiced. You agree to immediately notify us of any change in your billing address or the credit card used for payment hereunder. We reserve the right, at any time, to change our prices and billing methods for RPI PRINT API, either immediately upon posting on the RPI PRINT Website, or by e-mail. **iv.** **Disputes** > You must notify us in writing within seven (7) days after receiving your credit card statement, if you dispute any of our charges on that statement, or such dispute will be deemed waived. Billing disputes should be notified to the following address: RPI Print, Inc., 3325 S. 116th St., Suite 161, Tukwila, WA 98168. If we do not receive payment from your credit card issuer or its agent, your Order will be deemed cancelled. **v.** **Returns and cancellations** > RPI Print does not proof, edit, or change content submitted via the RPI PRINT API in any way. This means it's your responsibility to review file integrity and compliance to RPI API specifications before your submission. Typical errors that can occur are: > - Typos, grammar, unfinished text, or other text errors > - Low-resolution images that may appear blurry in print or onscreen > - Dark images that appear dark on screen (we don't lighten your images to match what you see on a backlit screen) > - Design issues, including book format, organization, style, color, and page layout > > You are responsible for the content of your file submission. > > On the off chance your printed product arrives damaged, with a material manufacturing defect, or a material defect in workmanship, contact us via our Customer Support within 30 days of receipt and we will work with you to secure a replacement copy if necessary. Please note that each printed product you order from us is individually made by one of our print sites or partners. There may be minor differences across different prints of the same product and/or across products printed by our different printing sites or partners, including, but not limited to, slight variances in color fidelity and binding type. While we work very hard to keep our products as consistent as possible, this variation is a normal occurrence and is not considered a manufacturing defect or a defect in workmanship and does not qualify for a reprint. > > A User can cancel an order for approximately two hours from the time of payment. Past two hours, we cannot provide refunds or cancel orders, and except for the cases expressly described in this return policy (i.e., we agree to replace your printed product because it arrives damaged, with a material manufacturing defect, or a material defect in workmanship), we will not accept returns. **3.7 Support Services** **i.** **Web Portal** > RPI PRINT will maintain a Web Portal that enables Customer to view real-time order and shipment information for Products. **ii.** **Customer Service Support** > RPI PRINT will provide commercially reasonable customer service support to Customer. Customer may request support from RPI PRINT's customer support by email: [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). RPI PRINT will at all times use commercially reasonable efforts to cooperate with Customer to resolve issues with the fulfillment and shipment of Orders for Products. RPI PRINT's customer support will be available during the following hours, except on RPI PRINT Holidays or planned closures: Monday-Friday 8am – 5pm US Pacific Time. **iii.** **Technical Support** > RPI PRINT will use commercially reasonable efforts to provide technical support to assist Customer in troubleshooting issues related to order transmission to RPI's API Service. Customer may request technical support from RPI PRINT's technical support by email: [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). Technical support will be available during the following hours, except on RPI Holidays or planned closure: Monday-Friday 8am – 5pm US Pacific Time. > > RPI PRINT will seek to provide Emergency Technical Support to Customer for circumstances that prevent or materially limit Customer's ability to access the Order Service. Emergency Technical Support will be available all days and times via RPI's Emergency Help Desk phone number. #### 4. DEVELOPER AND ACCOUNT KEYS In order to obtain access to the Services, Customer must register for a developer account. Upon Customer providing the requested registration information (" **Registration Information**"), and subject to any other terms and conditions set forth herein, RPI PRINT may issue Customer one or more Keys in RPI PRINT's sole discretion. Customer may not sell, transfer, sublicense or otherwise disclose the Keys to any other party. If Customer becomes aware of any unauthorized use of the Keys, the Customer agrees to notify RPI PRINT immediately. CUSTOMER IS ENTIRELY RESPONSIBLE FOR MAINTAINING THE CONFIDENTIALITY OF THE KEY AND PASSWORD AND FOR ANY AND ALL ACTIVITIES (INCLUDING PURCHASES, AS APPLICABLE) THAT ARE CONDUCTED THROUGH CUSTOMER'S ACCOUNT. Customer is responsible for ensuring that the Registration Information provided by Customer is at all times accurate, current and complete. Customer's failure to provide accurate, current and complete Registration Information may result in RPI PRINT terminating Customer's ability to use the Services and terminating the Keys. #### 5. CUSTOMER OBLIGATIONS AND CONDUCT > **i.** Customer agrees to use the Services only for purposes that are permitted by this Agreement. > > **ii.** Customer hereby specifically agrees not to: > > > **a.** pretend to be RPI PRINT, any of its Affiliates, or an agent of RPI PRINT or its Affiliates or someone else, or otherwise misrepresent Customer identity or affiliation; > > > **b.** forge headers or otherwise manipulate identifiers (including URLs) in order to disguise the origin of any RPI PRINT Data transmitted through the Services; > > > **c.** engage in activities that would violate any fiduciary relationship, any applicable local, state, national, or international law, or any regulations having the force of law; > > > **d.** download any file posted by another that cannot legally be distributed in such manner; > > > **e.** interfere with or disrupt the RPI PRINT Data or Services, servers or networks connected with the RPI PRINT APIs, or violate any requirements, procedures, policies or regulations connected thereto; > > > **f.** provide, procure or permit third party access to the Services or RPI PRINT Data unless expressly authorized by RPI PRINT; > > > **g.** transmit any materials: **(i)** that Customer does not have the right to transmit, under any law or contractual or fiduciary relationships, including, without limitation, any inside information or proprietary or confidential information; **(ii)** that infringes any Intellectual Property Rights or misappropriates any trade secret or right of privacy of any third-party; > > > **h.** transmit software viruses or any other computer code, files, or programs designed to interrupt, destroy, or limit the functionality of any computer software or hardware or telecommunications equipment, or use any robot, spider, or other automatic device to monitor or copy portions of the RPI PRINT Website or Services; > > > **i.** be injurious to the interests of RPI PRINT, or other users of the Services as determined by RPI PRINT in its sole discretion; > > > **j.** conduct Customer's business using the Services in a way that is unfair, unlawful, or constitutes a deceptive business practice; or > > > **k.** mirror or display the Site or any portion thereof in frames without RPI PRINT's prior written permission. > > **iii.** Notwithstanding anything to the contrary, Customer agrees that if Customer uses the Services in a way that RPI PRINT finds unacceptable for any reason, including if Customer violates this Agreement, RPI PRINT may require that Customer immediately stop such usage, terminate Customer's access to the Services and cease all use of the RPI PRINT API, in RPI PRINT's sole discretion. > > **iv.** Customer agrees to provide RPI PRINT with access to Customer Application and/or other materials related to Customer's use of the Services as reasonably requested by RPI PRINT to verify Customer's compliance with this Agreement. Customer agrees that RPI PRINT may monitor online the Customer Applications and Customer agree not to block or interfere with such efforts by RPI PRINT. > > **v.** Customer agrees that RPI PRINT may **(i)** modify, suspend or terminate Customer access to the Services or any of its RPI PRINT Data or Services **(ii)** remove any RPI PRINT Data from the Services at any time without any liability to Customer and without the requirement of providing prior notice. > > **vi.** Customer is solely responsible for Customer Applications that Customer has developed, and RPI PRINT is not liable to Customer or any other party (including Customer's end-user) for damages of any sort resulting from use of the Services or Customer Application. Customer will indemnify, defend and hold harmless RPI PRINT and its Affiliates from any and all losses, liabilities, fines, damages, costs and expenses including legal fees, judgment, interest and penalties arising from or in connection with the Customer Application or Customer's or its end user's use of the Services. > > **vii.** Customer is solely responsible for the quality of the Customer Application, and RPI PRINT is not liable to Customer or any other party (including the end-user) for damages of any sort resulting from any decision by RPI PRINT to reject Customer's Orders submitted through the Services. > > **viii.** Customer will not engage in any 'screen scraping', any automated algorithm, device, method, system, software or manual process to access, use, search, copy, monitor or extract data (in whole or in part) from or through any RPI PRINT Website. Customer will take all reasonable steps to prevent third parties from screen scraping or the use of other automated data collection of the RPI PRINT Data from Customer Application. #### 6. PUBLICITY AND TRADEMARK USE > **i.** Customer will not use any logos, trademarks or services ("**RPI PRINT Marks**") or name of RPI PRINT or any Affiliate of RPI PRINT without RPI PRINT's prior written consent. > > **ii.** Customer agrees that it will not: create, acquire, license or support any internet keyword or search term which contains any of the RPI PRINT Marks. > > **iii.** The Customer agrees that it will not: register any trademark, trade name, trade dress, service mark, or domain name that is identical to or confusingly similar to any of the RPI PRINT Marks. > > **iv.** Customer grants to RPI PRINT (including RPI PRINT's third-party production partners) a limited, non-exclusive, non-transferable, non-assignable, non-sublicensable, royalty-free license to use the trademarks and service marks of Customer (collectively, " **Customer Marks**"), only as necessary to comply with the packaging requirements of this Agreement and as otherwise by written consent of Customer, until such time that all Services in connection with this Agreement have been completed by RPI PRINT. RPI PRINT will use the Customer Marks in accordance with Customer's trademark usage guidelines as provided from time to time to RPI PRINT in writing. All rights, interest, and title to such Customer Marks and all goodwill arising out of the use of such trademarks and service marks will insure in the benefit of the Customer. #### 7. INTELLECTUAL PROPERTY AND LICENSE > **i.** As between the Parties, RPI retains all right, title, and interest in any property, information, data, materials, systems, technology, including RPI PRINT Data and all Intellectual Property Rights in the Services (collectively, " **RPI Property**"), exclusive of User Content. To the extent that by operation of law or otherwise, any right, title, or interest in or to the RPI Property, including any improvements or modifications thereto, (including Intellectual Property Rights) vests in Customer or its employees or other representatives, Customer hereby irrevocably and unconditionally assigns and agrees to assign, and will cause all such employees or other representatives to assign, to RPI PRINT and forever waives and agrees never to assert, and will cause all such employees and representatives to forever waive and agree never to assert, any and all such right, title, and interest. Customer will and will cause all such employees and other representatives to execute all documents and take all other actions requested by RPI PRINT in connection with the foregoing assignments and waivers. At RPI PRINT's request, Customer will assist RPI PRINT in obtaining protection for any Intellectual Property Rights in the Services arising out of this Agreement. > > **ii.** The Customer agrees and understands that RPI PRINT may be evaluating similar proposals and/or transactions with other parties, including, but not limited to potentially competing companies, and may be considering, currently or in the future, internal developments similar to those being discussed by the Parties. Nothing in this Agreement will restrict the right of RPI PRINT to create, protect (whether by patent, trademark, copyright, trade secret or other means), procure or market any products or services, including, but not limited to those that may be competitive with those offered by Customer. Customer further agrees not to challenge or make claims against or to such RPI PRINT products or services. > > **iii.** Customer understands and acknowledges that RPI PRINT may be independently creating applications, content and other products or services that may be similar to or competitive with Customer Application and its content, and nothing in this Agreement will be construed as restricting or preventing RPI PRINT from creating and fully exploiting such applications, content and other items, without any obligation to Customer. > > **iv.** This Agreement will not be construed to limit either party's right to independently develop or acquire applications or services without use of the other party's confidential information (including without use of the RPI PRINT Data by Customer). Nothing in this Agreement deprives either party of the ownership rights to any independently developed or received information. #### 8. DATA PROTECTION > **i.** Personal data of Customer, and other data provided by Customer to RPI PRINT, may be used and disclosed to provide the Services and as otherwise permitted by RPI PRINT's Privacy Policy, available at [https://www.rpiprint.com/compliance/](https://www.rpiprint.com/compliance/) (the " **RPI PRINT Privacy Policy**"). Customer consents to the collection, processing and storage by RPI PRINT of Customer information, including personal information, in accordance with the terms of the RPI PRINT Privacy Policy. > > **ii.** The statutory and operational regulations concerning data protection shall be observed. Customer will accordingly impose the same obligations that apply to Customer on its employees and subcontractors who should in any way be involved in the contractual performances, and upon RPI PRINT's request, hand over to RPI PRINT the relevant documentation. > > **iii.** The provision of personal data of customers to Customer requires an appropriate consent of the customer in the data transmission. Customer will obtain all consents from the customer or end user prior to transmitting such data to RPI PRINT, so that RPI PRINT may use and disclose such data for the purposes set forth in this Agreement, including without limitation to provide the Services. Customer agrees to comply with all applicable laws and regulations, and the terms of the RPI PRINT Privacy Policy, with respect to any access, use and/or submission by Customer of any personal information in connection with the Services. #### 9. TERM AND TERMINATION This Agreement will remain in full force and effect while you use the Services. RPI PRINT may terminate this Agreement at any time and for any reason, effective upon 90 days' written notice to Customer. Either Party may terminate this Agreement upon written notice to the other party in the event of a material breach of the obligations and regulations of this Agreement. Effective upon termination of this Agreement: 1. RPI PRINT will cease providing the Customer with Services; and 2. The Customer and its Affiliates will immediately cease using the Services and the RPI PRINT API and will promptly remove the RPI PRINT API from the Customer Application. 3. The parties agree that the RPI PRINT Data is and shall remain confidential in perpetuity. 4. All Orders that have an Order Acceptance Date prior to the effective termination date will be fulfilled and RPI PRINT will invoice Customer for such Orders and charge Customer's credit card as provided in this Agreement. 5. The provisions of Sections 1 (Definitions), 3.6 (Fees and Invoicing), 5 (Customer Obligations and Conduct), 6 (Publicity and Trademark Use), 7 (Intellectual Property and License), 8 (Data Protection), 9 (Term and Termination), 11 (Representations and Warranties), 12 (Limitation of Liability), 13 (Release), 14 (Indemnity), 15 (Electronic Communications), 17 (Governing Law), 18 (Relationship of Parties), 19 (Notices), 20 (Force Majeure), 21 (Other) and 22 (Copyright/Trademark Protection) will survive termination or expiration of these Terms. #### 10. RPI PRINT MODIFICATIONS AND SUPPORT > **i.** RPI PRINT has no obligation to provide Customer with support, software upgrades, enhancements, or modifications to the RPI PRINT API or the Customer Application. Customer understands that the RPI PRINT API is provided on an "as is" basis. RPI PRINT has the right to enhance, upgrade, modify or deprecate any or all RPI PRINT APIs, Services, Keys, or RPI PRINT Data at any point in time without giving prior notice to Customer. > > **ii.** Customer understands and agrees that Customer is solely responsible for the Customer Applications and for providing user support and any other technical assistance for Customer Applications. > > **iii.** Customer acknowledges and agrees that RPI PRINT may modify the RPI PRINT Data and/or Services at any time and such modification may create technical issues with Customer Applications, including rendering them unusable until Customer has modified the application for use with the modified RPI PRINT Data and/or Services and Customer agrees that RPI PRINT will have no liability for such technical issues. #### 11. REPRESENTATIONS AND WARRANTIES THE PRODUCTS, SERVICES, THE CONTENT OF THE SERVICES, AND THE RPI PRINT DATA ARE PROVIDED ON AN "AS IS", "AS AVAILABLE" AND "WITH ALL FAULTS" BASIS. TO THE FULLEST EXTENT PERMISSIBLE BY LAW, NEITHER RPI PRINT NOR ITS SUBSIDIARIES AND AFFILIATES, BUSINESS PARTNERS, CONTRACTORS, CLIENTS AND SERVICE PROVIDERS, AND THEIR RESPECTIVE OFFICERS, EMPLOYEES, AGENTS AND REPRESENTATIVES (COLLECTIVELY, THE " **RPI PRINT PARTIES**") MAKE ANY REPRESENTATIONS OR WARRANTIES OR ENDORSEMENTS OF ANY KIND WHATSOEVER, EXPRESS,IMPLIED, OR STATUTORY, AS TO: **(A)** THE PRODUCTS AND SERVICES; **(B)** THE CONTENT OR THE RPI PRINT DATA; **(C)** USER CONTENT; OR **(D)** SECURITY ASSOCIATED WITH THE TRANSMISSION OF INFORMATION TO THE SERVICES. IN ADDITION, THE RPI PRINT PARTIES HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, THAT ANY RESULTS WILL BE ACHIEVED, NON-INFRINGEMENT, TITLE, CUSTOM, TRADE, QUIET ENJOYMENT, SYSTEM INTEGRATION AND FREEDOM FROM COMPUTER VIRUS. THE RPI PRINT PARTIES DO NOT REPRESENT OR WARRANT THAT THE SERVICES WILL BE ERROR-FREE OR UNINTERRUPTED; THAT DEFECTS WILL BE CORRECTED; OR THAT THE SERVICES OR THE SERVER THAT MAKES THE SERVICES AVAILABLE IS FREE FROM ANY HARMFUL COMPONENTS, INCLUDING, WITHOUT LIMITATION, VIRUSES. THE RPI PRINT PARTIES DO NOT MAKE ANY REPRESENTATIONS OR WARRANTIES THAT THE INFORMATION OR RPI PRINT DATA (INCLUDING ANY INSTRUCTIONS) ON THE SERVICES IS ACCURATE, COMPLETE, OR USEFUL. CUSTOMER ACKNOWLEDGES THAT CUSTOMER'S USE OF SERVICES AND RPI PRINT DATA IS AT CUSTOMER'S SOLE RISK. THE RPI PRINT PARTIES DO NOT WARRANT THAT CUSTOMER'S USE OF THE SITE OR SERVICES IS LAWFUL IN ANY PARTICULAR JURISDICTION, AND THE RPI PRINT PARTIES SPECIFICALLY DISCLAIM SUCH WARRANTIES. SOME JURISDICTIONS LIMIT OR DO NOT ALLOW THE DISCLAIMER OF IMPLIED OR OTHER WARRANTIES SO THE ABOVE DISCLAIMER MAY NOT APPLY TO CUSTOMER TO THE EXTENT SUCH JURISDICTION'S LAW IS APPLICABLE TO CUSTOMER AND THIS AGREEMENT. BY ACCESSING OR USING THE SERVICES CUSTOMER REPRESENTS AND WARRANTS THAT CUSTOMER'S ACTIVITIES ARE LAWFUL IN EVERY JURISDICTION WHERE CUSTOMER ACCESSES OR USES THE SERVICES. CUSTOMER REPRESENTS AND WARRANTS THAT NO INTELLECTUAL PROPERTY IT PROVIDES TO RPI PRINT IN ASSOCIATION WITH THE SERVICES AND PRODUCTS INFRINGES ON THE INTELLECTUAL PROPERTY RIGHTS OF ANY THIRD PARTIES. THE RPI PRINT PARTIES DO NOT ENDORSE CONTENT AND SPECIFICALLY DISCLAIM ANY RESPONSIBILITY OR LIABILITY TO ANY PERSON OR ENTITY FOR ANY LOSS, DAMAGE (WHETHER ACTUAL, CONSEQUENTIAL, PUNITIVE OR OTHERWISE), INJURY, CLAIM, LIABILITY OR OTHER CAUSE OF ANY KIND OR CHARACTER BASED UPON OR RESULTING FROM ANY CONTENT. #### 12. LIMITATION OF LIABILITY CUSTOMER ASSUMES TOTAL RESPONSIBILITY AND RISK FOR CUSTOMER'S USE OF THE RPI PRINT API, CUSTOMER APPLICATION, SERVICES AND RPI PRINT DATA. ANY USE OF THE RPI PRINT API, SERVICES AND RPI PRINT DATA IS AT CUSTOMER'S OWN RISK. TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE RPI PRINT PARTIES BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY INDIRECT, EXEMPLARY, SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES OF ANY KIND, LOSS OF REVENUE, INCOME OR PROFITS, LOST BUSINESS OPPORTUNITY, LOSS OF USE OR DATA, LOSS OR DIMINUTION IN VALUE OF ASSETS OR SECURITIES, OR DAMAGES FOR BUSINESS INTERRUPTION ARISING OUT OF OR IN ANY WAY RELATED TO THE ACCESS TO OR USE OF THE SERVICES OR PRODUCTS (INCLUDING, BUT NOT LIMITED TO, USER CONTENT OR RPI PRINT DATA, AND LINKS TO THIRD PARTY SITES), OR THE ORDER, RECEIPT OR USE OF ANY PRODUCT OR SERVICE, OR OTHERWISE RELATED TO THIS AGREEMENT (INCLUDING, BUT NOT LIMITED TO, ANY DAMAGES CAUSED BY OR RESULTING FROM RELIANCE ON ANY INFORMATION OBTAINED FROM ANY RPI PRINT PARTY, OR FROM EVENTS BEYOND THE RPI PRINT PARTIES' REASONABLE CONTROL, SUCH AS SITE INTERRUPTIONS, DELETIONS OF FILES OR EMAILS, ERRORS OR OMISSIONS, DEFECTS, BUGS, VIRUSES, TROJAN HORSES, DELAYS IN OPERATION OR TRANSMISSION OR ANY FAILURE OF PERFORMANCE, WHETHER OR NOT RESULTING FROM ACTS OF GOD, COMMUNICATIONS FAILURE, THEFT, DESTRUCTION OR UNAUTHORIZED ACCESS TO THE RPI PRINT PARTIES' RECORDS, PROGRAMS OR SYSTEMS), REGARDLESS OF THE FORM OF ACTION, WHETHER BASED IN CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, SIMPLE NEGLIGENCE, WHETHER ACTIVE, PASSIVE OR IMPUTED) OR ANY OTHER LEGAL OR EQUITABLE THEORY (EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF WHETHER SUCH DAMAGES WERE FORESEEABLE). TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE MAXIMUM AGGREGATE LIABILITY OF THE RPI PRINT PARTIES (JOINTLY) ARISING OUT OF OR IN ANY WAY RELATED TO THE ORDER OR RECEIPT OF PRODUCTS, USE OF THE RPI PRINT API OR USE OF SERVICES EXCEED THE AMOUNT PAID FOR THE PRODUCTS OR SERVICES THAT ARE THE SUBJECT OF THE CLAIM. THE FOREGOING LIMITATIONS SHALL APPLY EVEN IN THE EVENT YOUR REMEDIES HEREUNDER FAIL OF THEIR ESSENTIAL PURPOSE, AND THE FOREGOING SHALL CONSTITUTE THE RPI PRINT PARTIES' SOLE LIABILITY AND OBLIGATION IN RESPECT HEREOF, REGARDLESS OF THE FORM OF ACTION, WHETHER BASED IN CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, SIMPLE NEGLIGENCE, WHETHER ACTIVE, PASSIVE OR IMPUTED), OR ANY OTHER LEGAL OR EQUITABLE THEORY. TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, CUSTOMER, ON BEHALF OF ITS HEIRS, EXECUTORS, ADMINISTRATORS, LEGAL AND PERSONAL REPRESENTATIVES, HEREBY RELEASE, WAIVE, ACQUIT AND FOREVER DISCHARGE THE RPI PRINT PARTIES FROM AND AGAINST, AND COVENANT NOT TO SUE ANY SUCH RPI PRINT PARTY FOR, ALL CLAIMS CUSTOMER HAS OR MAY HAVE ARISING OUT OF OR IN ANY WAY RELATED TO THIS AGREEMENT. #### 13. RELEASE You hereby release us, our subsidiaries, affiliates and our and their respective officers, employees, agents, and successors from claims, demands any and all losses, damages, rights, claims, and actions of any kind including, without limitation, personal injuries, death, and property damage, that is either directly or indirectly related to or arises from any interactions with other Users. If you are a California resident, you hereby waive California Civil Code Section 1542, which states: "A general release does not extend to claims which the creditor does not know or suspect to exist in his favor at the time of executing the release, which, if known by him must have materially affected his settlement with the debtor." #### 14. INDEMNITY To the fullest extent permitted by applicable law, Customer agrees to defend, hold harmless and indemnify the RPI PRINT Parties from and against any claims, liabilities, costs or damages, including reasonable attorneys' fees and paralegal fees through final appeals, made by any third party, relating to or arising from Customer's use of the Services, RPI PRINT Data or any User Content that Customer transmits to or through the Services, any violation of this Agreement by Customer, or any other act or omission by Customer, including Customer's violation of any rights of another, arising from Customer's use of the Services. Customer further agrees that RPI PRINT shall have control of the defense or settlement of any third party claims. This indemnity is in addition to, and not in lieu of, any other indemnities set forth in a written agreement between Customer and RPI PRINT. #### 15. ELECTRONIC COMMUNICATIONS The communications between you and us use electronic means, whether you visit the RPI PRINT Website or otherwise use the Service or send us e-mails, or whether we post notices on the RPI PRINT Website or communicates with you via e-mail. For contractual purposes, you (a) consent to receive communications from us in an electronic form; and (b) agree that all terms and conditions, agreements, notices, disclosures, and other communications that we provide to you electronically satisfy any legal requirement that such communications would satisfy if it were to be in writing. The foregoing does not affect your statutory rights. #### 16. U.S. EXPORT CONTROLS RPI PRINT API and software available in connection with the Services (the **"Software"** ) is further subject to export controls of the United States and other jurisdictions. No Software may be downloaded from the Services or otherwise exported or re-exported in violation of export laws of the United States or any other applicable jurisdiction. #### 17. GOVERNING LAW RPI PRINT's headquarters and principal operations, including control and supervision of the RPI PRINT Website, are based in 3325 S 116th St, Tukwila, WA 98168. This Agreement is governed by the laws of the State of Washington, without regard to its "choice of law" or "conflict of laws" provisions that would apply the laws of another jurisdiction. The UN Convention on Contracts for the International Sale of Goods shall not be applicable. #### 18. RELATIONSHIP OF PARTIES. RPI PRINT and Customer are independent contractors, and nothing in this Agreement will create any partnership, joint venture, agency, franchise, sales representative, or employment relationship between us. You have no authority to make or accept any offers or representations on our behalf. You will not make any statement, whether on your site or in your other products that would reasonably contradict anything in this section. #### 19. NOTICES. RPI PRINT may give any notice required by this Agreement by means of a general notice on the RPI PRINT Website, electronic mail to your e-mail address on record with us, or by written communication sent by first class mail or pre-paid post to your address on record with us. Such notice will be deemed to have been given upon the expiration of forty-eight (48) hours after mailing or posting (if sent by first class mail or pre-paid post) or twelve (12) hours after sending (if sent by email). You may give notice to us, addressed to the attention of our Chief Operating Officer (such notice will be deemed given when received by RPI PRINT) at any time by any of the following: (i) letter sent by confirmed facsimile to us at the following fax number: 415-364-6301; (ii) letter delivered by nationally recognized overnight delivery service, first class postage, or prepaid mail to RPI PRINT at the following address: Chief Operating Officer, RPI Print, Inc., 3325 S. 116th St., Suite 161, Tukwila, WA 98168. #### 20. FORCE MAJEURE. Either party will not be liable for non-performance or delay in performance (other than of obligations regarding payment of money) caused by any event reasonably beyond the control of such party including, but not limited to wars, hostilities, revolutions, riots, civil commotion, national emergency, pandemics, epidemics, fire, flood, earthquake, force of nature (including extreme weather conditions), explosion, embargo, or any "act of God." #### 21. OTHER This Agreement is accepted upon your use of the RPI PRINT Website or any of the Services. This Agreement constitutes the final, complete, and exclusive agreement between RPI RPINT and Customer regarding the subject matter hereof and supersedes and merges all prior discussions between the parties. If any provision of this Agreement is found to be invalid or unenforceable, such provision will be changed and interpreted to accomplish the objectives to the greatest extent possible under any applicable law and the remaining provisions will continue in full force and effect. RPI PRINT's failure to exercise or enforce any right or provision of this Agreement will not operate as a waiver of such right or provision. The section titles in this Agreement are for convenience only and have no legal or contractual effect. The parties of this Agreement have expressly required that the present Agreement be drawn up in the English language. Please contact RPI PRINT with any questions regarding this Agreement. Customer may also receive a copy of this Agreement in (in ASCII text format) by contacting RPI PRINT by email: [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com). #### 22. COPYRIGHT/TRADEMARK INFORMATION. Copyright © 2022 RPI Print, Inc. All rights reserved. The RPI PRINT Marks displayed on the RPI PRINT Website or in connection with the Services‎, and all RPI PRINT Data (collectively, " **Our ‎Materials**")‎, are the property of RPI PRINT or other third parties. You are not permitted to use these RPI PRINT Marks or any other of Our Materials without the prior written consent of the third party that owns the RPI PRINT Marks, or us, in the case of Our Materials. As between you and us, we own any and all rights, title, and interest in ‎and to Our Materials, and all ‎intellectual property rights related to Our Materials.‎ Your only permission to use Our Materials is as set ‎out herein. --- ## Products, templates and pricing The public product catalog is a Markdown document at `https://products.api.rpiprint.com/catalog/v1/products.md`. It is unauthenticated and allows every origin. A second endpoint renders a template for a product the catalog lists. It is described below. ### What the catalog holds The catalog is one Markdown table listing the products available publicly, one row per product. A row shows the product's options by their English names, its prices and its page-count bounds. The header above the table states when the catalog was generated and the currency of its prices. It also states, once, any option every product shares, rather than repeating that option as a column. These columns need explaining: - SKU holds the product's `manufacturingSku`, the identifier the template endpoint takes. The ordering API does not take it, because an order names a customer SKU, which a customer's own account defines. - Product Class says what kind of product the row describes. Full Bleed and No Bleed are both book products, and they differ in how they handle bleed. - Base price and Per-page price are amounts in the currency the header states, written with a `$` sign, such as `$12.60`. A product with no price in one of them shows `unpriced` in that column. - Page counts gives the minimum page count, the maximum page count, and the step a page count has to be a multiple of. `20–502, step 2` allows 20, 22, 24 and so on up to 502. ### What a template is A template is a product specification in a human-friendly format. Templates are available as a PDF, PNG, or IDML file. Each template expresses the product specification as visual content. Multiple products can share an exact specification and thus a template. For books, any rows with the same Product Class, Cover Type, Text Paper Weight, Paper Finish and Trim Size have the same specification, and their templates are interchangeable. ### Books A book is a row whose Product Class is Full Bleed or No Bleed. A product of another class has different options. Books that share a template can still differ in other columns, such as Cover Finish and Text Print Mode. Each of those rows has its own base price and per-page price. ### Template requests A template request names one `manufacturingSku`, one artifact and one format. It is a plain URL against an unauthenticated endpoint, so a browser can fetch it directly. ``` GET https://products.api.rpiprint.com/templates/published/{manufacturingSku}/{artifact}/{format} ``` The artifact is `cover`, `jacket` or `pages`, and the format is `pdf`, `png` or `idml`. The Cover Type decides which artifacts a product has. A Hardcover, Dust Jacket product has the `jacket` and `pages` artifacts, and every other product has the `cover` and `pages` artifacts. The endpoint returns 404 for an artifact the product does not have. A cover or jacket request takes `units`, `pageCount`, `barcode` and `productDescription`. A pages request takes `units` and `pageCount`, and takes `side` as well when the format is `png`, because that format renders one page of the spread rather than the whole book block. `productDescription` is an English description of the product, such as the option names in its row. The renderers print that string as a footer label on the template, and they omit the footer when it is unset. The parameters `pageCount`, `barcode`, `units` and `side` do not change which product a request resolves to. They change what the renderer draws for it. The endpoint checks `pageCount` against the Page counts column only for cover and jacket requests. A cover or jacket request whose `pageCount` is outside the Page counts range or off its step returns 404. A pages request renders any `pageCount` from 1 to the product's maximum, so a pages template that renders does not show that its page count can be ordered. A rejected page count and an unrecognised `manufacturingSku` return the same response: 404 with the error `Template not found`. ### How a price is computed A product's unit price is its Base price plus its Per-page price for every page above the product's minimum page count. The minimum is the first number in the Page counts column. ``` extraPages = max(0, pageCount - minimum page count) unitPrice = Base price + Per-page price * extraPages ``` The unit price is rounded to two decimal places. A value exactly halfway between two cents rounds to the even one. A line total is the unit price multiplied by the quantity ordered. --- ## Introducing Release Notes We're launching a dedicated release notes page to keep you informed about product updates, API changes, and new features. ### What to expect - **Product updates** — New features and improvements to the dashboard and API - **API changes** — Breaking changes, deprecations, and migration guides - **Platform notices** — Scheduled maintenance, environment changes, and timeline reminders Bookmark this page or check the **Release Notes** link in the docs navigation to stay current. --- ## Shipping tiers renamed to Expedited and Rush Two shipping tiers have been renamed in the RPI Print API. Express is now Expedited, and Priority is now Rush. Standard is unchanged. The new names came in with new shipping prices and production times; see [Shipping](/documentation/shipping) for the current rates. ### What you need to do `express` and `priority` remain valid values for `shippingClassification` on order creation, with no retirement date. Requests you send today keep working exactly as they do now, so most integrators need to do nothing. The exception is `economy` on an enterprise account, described below. Orders you have already placed are unaffected. Their stored classification does not change. ### What your responses contain An order submitted as `express` or `priority` is stored and returned with that spelling. Create an order with `"shippingClassification": "express"` and the `methodClassification` field on the order response and on the order webhook comes back as `express`, not `expedited`. Economy behaves differently, and which behavior you get depends on your account. On an account priced under an enterprise agreement, an order submitted as `economy` currently fails: the create request succeeds and the order ends in `FAILED`. A fix is in progress. If you have an enterprise agreement, contact [printapicustomersupport@rpiprint.com](mailto:printapicustomersupport@rpiprint.com) before you send `economy`. On every other account Economy is no longer offered, so an order submitted as `economy` ships and is returned as `standard`. ### What changed in the documentation The API reference, the shipping estimate endpoint, and the pricelist now name the tiers Standard, Expedited and Rush. If you display tier names taken from those responses, your users will see the new names. Which tiers you can buy depends on where the order ships. The continental US and Puerto Rico sell all three tiers. Hawaii and Alaska sell Expedited and Rush. Canada sells Standard and Rush. The US Territories group sells Standard and Expedited. Call the shipping estimate for an address to get the tiers that address can be sold. Move to the new names whenever it suits you. There is no deadline.