MENU navbar-image

Introduction

PrintOps.com is a print on demand service that focuses on posters and framed prints. Using this API, you can create and manage orders and perform all associated functions.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting the settings page within your dashboard and selecting the API tab. The, just click the Create New Token button. Once a token is created you will need to immediately copy it down - it is only visible for this brief period.

Endpoints

Get Base Products

requires authentication

Base Products are the core products that PrintOps offers for print on demand.

Example request:
curl --request GET \
    --get "https://printops.com/api/base-products" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/base-products"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/base-products';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/base-products'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "base_products": [
            {
                "id": 1,
                "sku": "PP08",
                "name": "8 x 10 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "8x10 Poster Print",
                "properties": {
                    "ratio": "4:5",
                    "width": 8,
                    "height": 10,
                    "weight": 0.037,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.8
                },
                "price": "2.25",
                "ships_alone": false
            },
            {
                "id": 2,
                "sku": "PP07",
                "name": "8.5 x 11 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "8.5x11 Poster Print",
                "properties": {
                    "ratio": "17:22",
                    "width": 11,
                    "height": 8.5,
                    "weight": 0.044,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.773
                },
                "price": "2.40",
                "ships_alone": false
            },
            {
                "id": 3,
                "sku": "PP09",
                "name": "9 x 12 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "9x12 Poster Print",
                "properties": {
                    "ratio": "3:4",
                    "width": 9,
                    "height": 12,
                    "weight": 0.05,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.75
                },
                "price": "2.63",
                "ships_alone": false
            },
            {
                "id": 4,
                "sku": "PP10",
                "name": "11 x 14 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "11x14 Poster Print",
                "properties": {
                    "ratio": "11:14",
                    "width": 11,
                    "height": 14,
                    "weight": 0.071,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.786
                },
                "price": "2.78",
                "ships_alone": false
            },
            {
                "id": 5,
                "sku": "PP11",
                "name": "11 x 17 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "11x17 Poster Print",
                "properties": {
                    "ratio": "11:17",
                    "width": 11,
                    "height": 17,
                    "weight": 0.087,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.647
                },
                "price": "3.00",
                "ships_alone": false
            },
            {
                "id": 6,
                "sku": "PP12",
                "name": "12 x 16 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "12x16 Poster Print",
                "properties": {
                    "ratio": "3:4",
                    "width": 12,
                    "height": 16,
                    "weight": 0.089,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.75
                },
                "price": "3.38",
                "ships_alone": false
            },
            {
                "id": 7,
                "sku": "PP13",
                "name": "12 x 18 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "12x18 Poster Print",
                "properties": {
                    "ratio": "2:3",
                    "width": 12,
                    "height": 18,
                    "weight": 0.1,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.666
                },
                "price": "3.75",
                "ships_alone": false
            },
            {
                "id": 8,
                "sku": "PP14",
                "name": "14 x 20 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "14x20 Poster Print",
                "properties": {
                    "ratio": "7:10",
                    "width": 14,
                    "height": 20,
                    "weight": 0.13,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.7
                },
                "price": "4.00",
                "ships_alone": false
            },
            {
                "id": 9,
                "sku": "PP16",
                "name": "16 x 20 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "16x20 Poster Print",
                "properties": {
                    "ratio": "4:5",
                    "width": 16,
                    "height": 20,
                    "weight": 0.148,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.8
                },
                "price": "4.50",
                "ships_alone": false
            },
            {
                "id": 10,
                "sku": "PP15",
                "name": "16 x 24 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "16x24 Poster Print",
                "properties": {
                    "ratio": "2:3",
                    "width": 16,
                    "height": 24,
                    "weight": 0.178,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.666
                },
                "price": "5.00",
                "ships_alone": false
            },
            {
                "id": 11,
                "sku": "PP17",
                "name": "17 x 22 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "17x22 Poster Print",
                "properties": {
                    "ratio": "17:22",
                    "width": 17,
                    "height": 22,
                    "weight": 0.173,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.773
                },
                "price": "5.25",
                "ships_alone": false
            },
            {
                "id": 12,
                "sku": "PP18",
                "name": "18 x 24 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "18x24 Poster Print",
                "properties": {
                    "ratio": "3:4",
                    "width": 18,
                    "height": 24,
                    "weight": 0.2,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.75
                },
                "price": "6.00",
                "ships_alone": false
            },
            {
                "id": 13,
                "sku": "PP19",
                "name": "18 x 27 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "18 x 27 Poster Print",
                "properties": {
                    "ratio": "2:3",
                    "width": 18,
                    "height": 27,
                    "weight": 0.225,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.666
                },
                "price": "6.75",
                "ships_alone": false
            },
            {
                "id": 14,
                "sku": "PP20",
                "name": "20 x 30 Print",
                "product_category": 1,
                "type": "poster_lg",
                "description": "20x30 Poster Print",
                "properties": {
                    "ratio": "2:3",
                    "width": 20,
                    "height": 30,
                    "weight": 0.278,
                    "paperType": "Canon Oce 46lb Bond",
                    "thickness": 0.008,
                    "ratio_decimal": 0.666
                },
                "price": "11.00",
                "ships_alone": false
            },
            {
                "id": 15,
                "sku": "PP24",
                "name": "24 x 36 Print",
                "product_category": 1,
                "type": "poster_lg",
                "description": "24x36 Poster Print",
                "properties": {
                    "ratio": "2:3",
                    "width": 24,
                    "height": 36,
                    "weight": 0.4,
                    "paperType": "Canon Oce 46lb Bond",
                    "thickness": 0.008,
                    "ratio_decimal": 0.666
                },
                "price": "15.00",
                "ships_alone": false
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/base-products?page=1",
        "last": "https://printops.test/api/base-products?page=9",
        "prev": null,
        "next": "https://printops.test/api/base-products?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 9,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://printops.test/api/base-products?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=6",
                "label": "6",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=7",
                "label": "7",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=8",
                "label": "8",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=9",
                "label": "9",
                "active": false
            },
            {
                "url": "https://printops.test/api/base-products?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/base-products",
        "per_page": 15,
        "to": 15,
        "total": 132
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/base-products

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

page   integer  optional  

The page number for pagination. Example: 1

product_category_id   integer  optional  

Filter products by product category. Example: 1

limit   integer  optional  

The number of records to return per page. Exmaple: 2 Example: 15

Get a Base Product by Id

requires authentication

Base Products are the core products that PrintOps offers for print on demand.

Example request:
curl --request GET \
    --get "https://printops.com/api/base-products/1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/base-products/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/base-products/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/base-products/1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "base_product": {
            "id": 1,
            "sku": "PP08",
            "name": "8 x 10 Print",
            "product_category": 1,
            "type": "poster_sm",
            "description": "8x10 Poster Print",
            "properties": {
                "ratio": "4:5",
                "width": 8,
                "height": 10,
                "weight": 0.037,
                "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                "thickness": 0.009,
                "ratio_decimal": 0.8
            },
            "price": "2.25",
            "ships_alone": false
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/base-products/{baseProduct}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

baseProduct   string   

The id of the base product. Example: 1

Authentication Test

requires authentication

A simple endpoint to confirm authentication was successful.

Example request:
curl --request GET \
    --get "https://printops.com/api/authentication-test" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/authentication-test"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/authentication-test';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/authentication-test'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "message": [
            "Success - you are authenticated."
        ]
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/authentication-test

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Shipping Methods

requires authentication

Returns a list of all available shipping methods.

Example request:
curl --request GET \
    --get "https://printops.com/api/shipping-methods" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/shipping-methods"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/shipping-methods';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/shipping-methods'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "shipping_methods": [
            {
                "shipping_carrier": "UPS",
                "name": "UPS Standard℠",
                "identifier": "ups_standard"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS® Ground",
                "identifier": "ups_ground"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Saver®",
                "identifier": "ups_saver"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Three-Day Select®",
                "identifier": "ups_3_day_select"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Second Day Air®",
                "identifier": "ups_second_day_air"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Second Day Air A.M.®",
                "identifier": "ups_second_day_air_am"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Next Day Air®",
                "identifier": "ups_next_day_air"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Next Day Air Saver®",
                "identifier": "ups_next_day_air_saver"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Next Day Air Early A.M.®",
                "identifier": "ups_next_day_air_early_am"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Mail Innovations (domestic)",
                "identifier": "ups_mail_innovations_domestic"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Express®",
                "identifier": "ups_express"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Express Plus®",
                "identifier": "ups_express_plus"
            },
            {
                "shipping_carrier": "UPS",
                "name": "UPS Expedited®",
                "identifier": "ups_expedited"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS Priority Mail",
                "identifier": "usps_priority"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS Priority Mail Express",
                "identifier": "usps_priority_express"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS First Class",
                "identifier": "usps_first"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS Parcel Select",
                "identifier": "usps_parcel_select"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS Media Mail",
                "identifier": "usps_media_mail"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS International Priority",
                "identifier": "usps_priority_mail_international"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS International Express",
                "identifier": "usps_priority_mail_express_international"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS International First",
                "identifier": "usps_first_class_package_international_service"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Ground",
                "identifier": "fedex_ground"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Home Delivery",
                "identifier": "fedex_home_delivery"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Smartpost",
                "identifier": "fedex_smart_post"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "2 Day",
                "identifier": "fedex_2_day"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "2 Day A.M.",
                "identifier": "fedex_2_day_am"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Express Saver",
                "identifier": "fedex_express_saver"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Standard Overnight",
                "identifier": "fedex_standard_overnight"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Priority Overnight",
                "identifier": "fedex_priority_overnight"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "First Overnight",
                "identifier": "fedex_first_overnight"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "International Economy",
                "identifier": "fedex_international_economy"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "International Priority",
                "identifier": "fedex_international_priority"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "International First",
                "identifier": "fedex_international_first"
            },
            {
                "shipping_carrier": "FedEx",
                "name": "Europe First International Priority",
                "identifier": "fedex_europe_first_international_priority"
            },
            {
                "shipping_carrier": "Flat",
                "name": "Flat Rate",
                "identifier": "flat_rate"
            },
            {
                "shipping_carrier": "USPS",
                "name": "USPS Ground Advantage",
                "identifier": "usps_ground_advantage"
            },
            {
                "shipping_carrier": "USPS",
                "name": "GlobalPost Economy Intl",
                "identifier": "globalpost_economy_international"
            },
            {
                "shipping_carrier": "USPS",
                "name": "GlobalPost Standard Intl",
                "identifier": "globalpost_standard_international"
            },
            {
                "shipping_carrier": "USPS",
                "name": "GlobalPost Plus",
                "identifier": "globalpost_plus"
            },
            {
                "shipping_carrier": "generic",
                "name": "Generic",
                "identifier": "generic"
            },
            {
                "shipping_carrier": "generic",
                "name": "Local Pickup",
                "identifier": "local_pickup"
            }
        ]
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/shipping-methods

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get Stores

requires authentication

The store resource is an organizational unit that holds user products, orders and shipments.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores?limit=2&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores"
);

const params = {
    "limit": "2",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores'
params = {
  'limit': '2',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 57
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "stores": [
            {
                "id": 786321,
                "name": "My First Store",
                "type": "generic",
                "is_live": true,
                "dropbox_name": null
            },
            {
                "id": 786322,
                "name": "Best Posters LLC",
                "type": "generic",
                "is_live": true,
                "dropbox_name": null
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/stores?page=1",
        "last": "https://printops.test/api/stores?page=5",
        "prev": null,
        "next": "https://printops.test/api/stores?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 5,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://printops.test/api/stores?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/stores",
        "per_page": 2,
        "to": 2,
        "total": 9
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

limit   integer  optional  

The number of records to return per page. Example: 2

page   integer  optional  

The page number for pagination. Example: 1

Get a Store by Id

requires authentication

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786322" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786322"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786322';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786322'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 56
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "store": {
            "id": 786322,
            "name": "Best Posters LLC",
            "type": "generic",
            "is_live": true,
            "dropbox_name": null
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer  optional  

The id of the store. Example: 786322

Create a store

requires authentication

Example request:
curl --request POST \
    "https://printops.com/api/stores" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"My Great Store\",
    \"type\": \"generic\"
}"
const url = new URL(
    "https://printops.com/api/stores"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "My Great Store",
    "type": "generic"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'My Great Store',
            'type' => 'generic',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores'
payload = {
    "name": "My Great Store",
    "type": "generic"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "store": {
            "id": 786323,
            "name": "My Great Store",
            "type": "generic",
            "is_live": true,
            "dropbox_name": null
        }
    },
    "status": "created",
    "code": 201,
    "messages": []
}
 

Request   

POST api/stores

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

Name of the store. Example: My Great Store

type   string   

Type of store. Example: generic

shipping_address   object  optional  
state   string   

Shipping address state. Example: TX

Get Images

requires authentication

Get images that have been created through the UI.

Example request:
curl --request GET \
    --get "https://printops.com/api/images?limit=2&page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/images"
);

const params = {
    "limit": "2",
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/images';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/images'
params = {
  'limit': '2',
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 55
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "images": [
            {
                "id": 1,
                "original_name": "_VC_3717.JPG",
                "pixel_width": 1920,
                "pixel_height": 2880,
                "native_width": "26.67",
                "native_height": "40.00",
                "aspect_ratio": "0.66675",
                "resolution": "72.00",
                "extension": "JPG",
                "image_token": "zTeRYWVWFSULPghhT2gaJsoiBJRnQAtN",
                "created_at": "2025-02-16T20:27:29.000000Z",
                "updated_at": "2025-02-16T20:27:44.000000Z"
            },
            {
                "id": 2,
                "original_name": "18x24_blue_poster.jpeg",
                "pixel_width": 3307,
                "pixel_height": 3306,
                "native_width": "11.02",
                "native_height": "11.02",
                "aspect_ratio": "1",
                "resolution": "300.00",
                "extension": "jpeg",
                "image_token": "wNS5PKUQeHhr988Kh9XTBJz7npvZC1UZ",
                "created_at": "2025-02-16T21:15:53.000000Z",
                "updated_at": "2025-02-16T21:16:26.000000Z"
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/images?page=1",
        "last": "https://printops.test/api/images?page=105",
        "prev": null,
        "next": "https://printops.test/api/images?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 105,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://printops.test/api/images?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=6",
                "label": "6",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=7",
                "label": "7",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=8",
                "label": "8",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=9",
                "label": "9",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=10",
                "label": "10",
                "active": false
            },
            {
                "url": null,
                "label": "...",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=104",
                "label": "104",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=105",
                "label": "105",
                "active": false
            },
            {
                "url": "https://printops.test/api/images?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/images",
        "per_page": 2,
        "to": 2,
        "total": 210
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/images

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

limit   integer  optional  

The number of records to return per page. Example: 2

page   integer  optional  

The page number for pagination. Example: 1

Get an Image By Id

requires authentication

Get an image that has been created through the UI.

Example request:
curl --request GET \
    --get "https://printops.com/api/images/20" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/images/20"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/images/20';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/images/20'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 54
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "image": {
            "id": 20,
            "original_name": "ARSH-IceSkaters-18x24-WhtFrame_wBorder.jpg",
            "pixel_width": 9000,
            "pixel_height": 12000,
            "native_width": "30.00",
            "native_height": "40.00",
            "aspect_ratio": "0.75",
            "resolution": "300.00",
            "extension": "jpg",
            "image_token": "NuAKklZrtqoHilz5mtpf8IuikqHiB6bXR",
            "created_at": "2025-07-23T19:58:04.000000Z",
            "updated_at": "2025-07-23T19:58:07.000000Z"
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/images/{image}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

image   integer  optional  

The id of the image. Example: 20

Create an Image

requires authentication

Example request:
curl --request POST \
    "https://printops.com/api/images" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"image_url\": \"https:\\/\\/printops.com\\/images\\/picture.jpg\",
    \"filename\": \"myfile.jpg\"
}"
const url = new URL(
    "https://printops.com/api/images"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "image_url": "https:\/\/printops.com\/images\/picture.jpg",
    "filename": "myfile.jpg"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/images';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'image_url' => 'https://printops.com/images/picture.jpg',
            'filename' => 'myfile.jpg',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/images'
payload = {
    "image_url": "https:\/\/printops.com\/images\/picture.jpg",
    "filename": "myfile.jpg"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "image_url": "https://printops.com/images/picture.jpg",
        "filename": "picture.jpg",
        "image_token": "LA5qNgx7HxxjYRRduJJeVXzA",
        "downloaded_at": "2024-11-18 13:03:03",
        "processed_at": "2024-11-18 13:03:12",
        "errors": null,
        "image_id": null,
        "created_at": "2024-02-29T20:19:42.000000Z",
        "updated_at": "2024-02-29T20:19:42.000000Z"
    },
    "status": "created",
    "code": 201,
    "messages": []
}
 

Request   

POST api/images

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

image_url   string   

Accessible url to download the image. Example: https://printops.com/images/picture.jpg

filename   string   

The name of the file. Example: myfile.jpg

Get User Products

requires authentication

The user product resource is the customized product that PrintOps fulfills. It includes details such as the underlying base product and associated art file. User products belong to a single store.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786321/user-products?page=1&product_category_id=1&limit=2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786321/user-products"
);

const params = {
    "page": "1",
    "product_category_id": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786321/user-products';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'product_category_id' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786321/user-products'
params = {
  'page': '1',
  'product_category_id': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 53
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "user_products": [
            {
                "id": 48604,
                "store_id": 786321,
                "base_product_id": 6,
                "type": null,
                "external_product_id": null,
                "user_sku": "pacific_sunset_12x16",
                "name": "Pacific Sunset 12x16",
                "scale_option": "fill",
                "description": "Beautiful sunset on Cannon Beach in Oregon",
                "base_product": {
                    "id": 6,
                    "sku": "PP12",
                    "name": "12 x 16 Print",
                    "product_category": 1,
                    "type": "poster_sm",
                    "description": "12x16 Poster Print",
                    "properties": {
                        "ratio": "3:4",
                        "width": 12,
                        "height": 16,
                        "weight": 0.089,
                        "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                        "thickness": 0.009,
                        "ratio_decimal": 0.75
                    },
                    "price": "3.38",
                    "ships_alone": false
                },
                "image": {
                    "id": 210,
                    "original_name": "IMG_9711.jpeg",
                    "pixel_width": 3848,
                    "pixel_height": 3024,
                    "native_width": "53.44",
                    "native_height": "42.00",
                    "aspect_ratio": "1.272380952381",
                    "resolution": "72.00",
                    "extension": "jpeg",
                    "image_token": "8z3dV3QqLeejvYF3X9qhAU8QR3cmkEqD",
                    "created_at": "2025-10-23T21:31:25.000000Z",
                    "updated_at": "2025-10-23T21:32:31.000000Z"
                },
                "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/iQEP00lQqTHNu4Zx49jgkgQCr27oKeMNdlu5qT0F.jpg"
            },
            {
                "id": 48605,
                "store_id": 786321,
                "base_product_id": 12,
                "type": null,
                "external_product_id": null,
                "user_sku": "pacific_sunset_18x24",
                "name": "Pacific Sunset 18x24",
                "scale_option": "fill",
                "description": "Beautiful sunset on Cannon Beach in Oregon",
                "base_product": {
                    "id": 12,
                    "sku": "PP18",
                    "name": "18 x 24 Print",
                    "product_category": 1,
                    "type": "poster_sm",
                    "description": "18x24 Poster Print",
                    "properties": {
                        "ratio": "3:4",
                        "width": 18,
                        "height": 24,
                        "weight": 0.2,
                        "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                        "thickness": 0.009,
                        "ratio_decimal": 0.75
                    },
                    "price": "6.00",
                    "ships_alone": false
                },
                "image": {
                    "id": 211,
                    "original_name": "IMG_9711.jpeg",
                    "pixel_width": 3848,
                    "pixel_height": 3024,
                    "native_width": "53.44",
                    "native_height": "42.00",
                    "aspect_ratio": "1.272380952381",
                    "resolution": "72.00",
                    "extension": "jpeg",
                    "image_token": "Pb7QUsswMeWON7hJLRdhMCoKM2fI7cD4",
                    "created_at": "2025-10-23T21:32:48.000000Z",
                    "updated_at": "2025-10-23T21:33:41.000000Z"
                },
                "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/aI8O3OlXsKAEu7lSGknMt6ywUlN1NGMLdwMcQXnv.jpg"
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/stores/786321/user-products?page=1",
        "last": "https://printops.test/api/stores/786321/user-products?page=2",
        "prev": null,
        "next": "https://printops.test/api/stores/786321/user-products?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786321/user-products?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://printops.test/api/stores/786321/user-products?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786321/user-products?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/stores/786321/user-products",
        "per_page": 2,
        "to": 2,
        "total": 3
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store_id}/user-products

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store_id   integer   

The ID of the store. Example: 786321

store   string   

The id of the store. Example: 786322

Query Parameters

page   integer  optional  

The page number for pagination. Example: 1

product_category_id   integer  optional  

Filter products by product category. Example: 1

limit   integer  optional  

The number of records to return per page. Example: 2

Get a User Product by Id

requires authentication

Get a specific User Product that was created in the UI.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786321/user-products/48604" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786321/user-products/48604"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786321/user-products/48604';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786321/user-products/48604'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 52
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "userProduct": {
            "id": 48604,
            "store_id": 786321,
            "base_product_id": 6,
            "type": null,
            "external_product_id": null,
            "user_sku": "pacific_sunset_12x16",
            "name": "Pacific Sunset 12x16",
            "scale_option": "fill",
            "description": "Beautiful sunset on Cannon Beach in Oregon",
            "base_product": {
                "id": 6,
                "sku": "PP12",
                "name": "12 x 16 Print",
                "product_category": 1,
                "type": "poster_sm",
                "description": "12x16 Poster Print",
                "properties": {
                    "ratio": "3:4",
                    "width": 12,
                    "height": 16,
                    "weight": 0.089,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.75
                },
                "price": "3.38",
                "ships_alone": false
            },
            "image": {
                "id": 210,
                "original_name": "IMG_9711.jpeg",
                "pixel_width": 3848,
                "pixel_height": 3024,
                "native_width": "53.44",
                "native_height": "42.00",
                "aspect_ratio": "1.272380952381",
                "resolution": "72.00",
                "extension": "jpeg",
                "image_token": "8z3dV3QqLeejvYF3X9qhAU8QR3cmkEqD",
                "created_at": "2025-10-23T21:31:25.000000Z",
                "updated_at": "2025-10-23T21:32:31.000000Z"
            },
            "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/iQEP00lQqTHNu4Zx49jgkgQCr27oKeMNdlu5qT0F.jpg"
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store_id}/user-products/{userProduct}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store_id   integer   

The ID of the store. Example: 786321

userProduct   integer  optional  

The id of the user product. Example: 48604

store   integer  optional  

The id of the store. Example: 786322

Create a UserProduct

requires authentication

UserProducts are the products that will be ordered from your PrintOps store. They reference the base product and image to be used.

Example request:
curl --request POST \
    "https://printops.com/api/stores/786321/user-products" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"base_product_id\": 50,
    \"name\": \"Landscape Gas Station 12x16 Framed Black\",
    \"user_sku\": \"LS_Gas_station_12x16_FB\",
    \"scale_option\": \"fit\",
    \"image_id\": 3456,
    \"image\": {
        \"image_url\": \"https:\\/\\/www.printops.com\\/images\\/LS_Gas_station_18x24.jpg\",
        \"filename\": \"cdnzrhwmxruiqoxa\"
    },
    \"description\": \"Landscape Gas Station Photo in 18x24 size.\"
}"
const url = new URL(
    "https://printops.com/api/stores/786321/user-products"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "base_product_id": 50,
    "name": "Landscape Gas Station 12x16 Framed Black",
    "user_sku": "LS_Gas_station_12x16_FB",
    "scale_option": "fit",
    "image_id": 3456,
    "image": {
        "image_url": "https:\/\/www.printops.com\/images\/LS_Gas_station_18x24.jpg",
        "filename": "cdnzrhwmxruiqoxa"
    },
    "description": "Landscape Gas Station Photo in 18x24 size."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786321/user-products';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'base_product_id' => 50,
            'name' => 'Landscape Gas Station 12x16 Framed Black',
            'user_sku' => 'LS_Gas_station_12x16_FB',
            'scale_option' => 'fit',
            'image_id' => 3456,
            'image' => [
                'image_url' => 'https://www.printops.com/images/LS_Gas_station_18x24.jpg',
                'filename' => 'cdnzrhwmxruiqoxa',
            ],
            'description' => 'Landscape Gas Station Photo in 18x24 size.',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786321/user-products'
payload = {
    "base_product_id": 50,
    "name": "Landscape Gas Station 12x16 Framed Black",
    "user_sku": "LS_Gas_station_12x16_FB",
    "scale_option": "fit",
    "image_id": 3456,
    "image": {
        "image_url": "https:\/\/www.printops.com\/images\/LS_Gas_station_18x24.jpg",
        "filename": "cdnzrhwmxruiqoxa"
    },
    "description": "Landscape Gas Station Photo in 18x24 size."
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "userProduct": {
            "id": 17263,
            "store_id": 186322,
            "base_product_id": 50,
            "type": null,
            "external_product_id": null,
            "user_sku": "LS_Gas_station_12x16_FB",
            "name": "Landscape Gas Station 12x16 Framed Black",
            "scale_option": "fit",
            "description": "Landscape Gas Station Photo in 12x16 Black Frame",
            "base_product": {
                "id": 50,
                "sku": "FB12",
                "name": "12 x 16 Black Framed Print",
                "product_category": 5,
                "type": "poster_sm",
                "description": "12x16 Black Framed Poster Print",
                "properties": {
                    "ratio": "3:4",
                    "width": 12,
                    "height": 16,
                    "weight": 2.5,
                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                    "thickness": 0.009,
                    "ratio_decimal": 0.75
                },
                "price": "29.00",
                "ships_alone": false
            },
            "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/SCHE-FallTrail-12x16-BlkFrame-2.jpg"
        }
    },
    "status": [
        "OK",
        "created"
    ],
    "code": [
        201
    ],
    "messages": []
}
 

Request   

POST api/stores/{store_id}/user-products

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store_id   integer   

The ID of the store. Example: 786321

Body Parameters

base_product_id   integer   

The id of the base product. Example: 50

name   string   

The name of the userProduct. Example: Landscape Gas Station 12x16 Framed Black

user_sku   string   

The user defined sku for the userProduct. Example: LS_Gas_station_12x16_FB

scale_option   string   

The scaling option for the image: fit, fill, stretch, noscale. Example: fit

image_id   integer  optional  

The id of the image to be used. Example: 3456

image   object  optional  
image_url   string  optional  

The accessible url of the image to be used. Example: https://www.printops.com/images/LS_Gas_station_18x24.jpg

filename   string  optional  

This field is required when image.image_url is present. Must match the regex /^[\w,\s-]+.(jpg. Must not be greater than 255 characters. Example: cdnzrhwmxruiqoxa

description   string   

The description of the user product. Example: Landscape Gas Station Photo in 18x24 size.

Get Orders

requires authentication

Get a list of orders from a store.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786322/orders?page=1&limit=2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786322/orders"
);

const params = {
    "page": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786322/orders';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786322/orders'
params = {
  'page': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 51
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "orders": [
            {
                "id": 320100,
                "store_id": 786322,
                "type": "standard",
                "state": "payment_pending",
                "is_live": null,
                "requested_shipping": "usps_ground_advantage",
                "estimated_ship_date": "2025-02-19",
                "external_order_id": "MAN37660_WML",
                "packing_slip_url": null,
                "shipping_label_url": null,
                "canceled_at": null,
                "closed_at": null,
                "cancel_reason": null,
                "remote_ip": null,
                "total_item_count": null,
                "gift_message": null,
                "line_items": [
                    {
                        "id": 1,
                        "quantity": 1,
                        "unit_price": 225,
                        "total_price": 225,
                        "scale_option": null,
                        "user_product": {
                            "id": 47230,
                            "store_id": 786322,
                            "base_product_id": 102,
                            "type": null,
                            "external_product_id": null,
                            "user_sku": "134",
                            "name": "134",
                            "scale_option": "fit",
                            "description": "134",
                            "base_product": {
                                "id": 102,
                                "sku": "PP06",
                                "name": "6 x 8 Print",
                                "product_category": 1,
                                "type": "poster_sm",
                                "description": "6x8 Poster Print",
                                "properties": {
                                    "ratio": "3:4",
                                    "width": 6,
                                    "height": 8,
                                    "weight": 0.02,
                                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                    "thickness": 0.009,
                                    "ratio_decimal": 0.75
                                },
                                "price": "2.25",
                                "ships_alone": false
                            },
                            "image": {
                                "id": 1,
                                "original_name": "_VC_3717.JPG",
                                "pixel_width": 1920,
                                "pixel_height": 2880,
                                "native_width": "26.67",
                                "native_height": "40.00",
                                "aspect_ratio": "0.66675",
                                "resolution": "72.00",
                                "extension": "JPG",
                                "image_token": "zTeRYWVWFSULPghhT2gaJsoiBJRnQAtN",
                                "created_at": "2025-02-16T20:27:29.000000Z",
                                "updated_at": "2025-02-16T20:27:44.000000Z"
                            },
                            "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/hSs5VXEQR2rLh64TqxjCVZwftr26uzIW7l3ZEYCX.jpg"
                        }
                    }
                ],
                "shipping_address": {
                    "order_id": null,
                    "company": "PrintOps, LLC.",
                    "first_name": "John",
                    "last_name": "Von Colln",
                    "address_1": "111 Oak Valley Drive",
                    "address_2": null,
                    "city": "Nashville",
                    "state": "Tennessee",
                    "postal_code": "37207",
                    "country": "US",
                    "phone": "6153208900"
                },
                "fulfillments": [
                    {
                        "id": 621500,
                        "carton_id": 1,
                        "total_quantity": 1,
                        "line_items": [
                            {
                                "id": 1,
                                "quantity": 1,
                                "unit_price": 225,
                                "total_price": 225,
                                "user_product": {
                                    "id": 47230,
                                    "store_id": 786322,
                                    "base_product_id": 102,
                                    "type": null,
                                    "external_product_id": null,
                                    "user_sku": "134",
                                    "name": "134",
                                    "scale_option": "fit",
                                    "description": "134",
                                    "base_product": {
                                        "id": 102,
                                        "sku": "PP06",
                                        "name": "6 x 8 Print",
                                        "product_category": 1,
                                        "type": "poster_sm",
                                        "description": "6x8 Poster Print",
                                        "properties": {
                                            "ratio": "3:4",
                                            "width": 6,
                                            "height": 8,
                                            "weight": 0.02,
                                            "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                            "thickness": 0.009,
                                            "ratio_decimal": 0.75
                                        },
                                        "price": "2.25",
                                        "ships_alone": false
                                    },
                                    "image": {
                                        "id": 1,
                                        "original_name": "_VC_3717.JPG",
                                        "pixel_width": 1920,
                                        "pixel_height": 2880,
                                        "native_width": "26.67",
                                        "native_height": "40.00",
                                        "aspect_ratio": "0.66675",
                                        "resolution": "72.00",
                                        "extension": "JPG",
                                        "image_token": "zTeRYWVWFSULPghhT2gaJsoiBJRnQAtN",
                                        "created_at": "2025-02-16T20:27:29.000000Z",
                                        "updated_at": "2025-02-16T20:27:44.000000Z"
                                    },
                                    "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/hSs5VXEQR2rLh64TqxjCVZwftr26uzIW7l3ZEYCX.jpg"
                                }
                            }
                        ]
                    }
                ],
                "shipments": {
                    "shipments": []
                },
                "order_total": {
                    "id": 2,
                    "line_items_total": 225,
                    "fulfillment_total": 300,
                    "handling": null,
                    "shipping_total": 430,
                    "subtotal": null,
                    "tax_total": 88,
                    "grand_total": 1043
                },
                "order_notes": [],
                "order_events": []
            },
            {
                "id": 320101,
                "store_id": 786322,
                "type": "standard",
                "state": "shipped",
                "is_live": null,
                "requested_shipping": "usps_ground_advantage",
                "estimated_ship_date": "2025-02-19",
                "external_order_id": "MAN81955_GVH",
                "packing_slip_url": null,
                "shipping_label_url": null,
                "canceled_at": null,
                "closed_at": null,
                "cancel_reason": null,
                "remote_ip": null,
                "total_item_count": null,
                "gift_message": null,
                "line_items": [
                    {
                        "id": 2,
                        "quantity": 1,
                        "unit_price": 450,
                        "total_price": 450,
                        "scale_option": null,
                        "user_product": {
                            "id": 47231,
                            "store_id": 786322,
                            "base_product_id": 9,
                            "type": null,
                            "external_product_id": null,
                            "user_sku": "poster_16x20",
                            "name": "poster",
                            "scale_option": "fill",
                            "description": "poster",
                            "base_product": {
                                "id": 9,
                                "sku": "PP16",
                                "name": "16 x 20 Print",
                                "product_category": 1,
                                "type": "poster_sm",
                                "description": "16x20 Poster Print",
                                "properties": {
                                    "ratio": "4:5",
                                    "width": 16,
                                    "height": 20,
                                    "weight": 0.148,
                                    "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                    "thickness": 0.009,
                                    "ratio_decimal": 0.8
                                },
                                "price": "4.50",
                                "ships_alone": false
                            },
                            "image": {
                                "id": 2,
                                "original_name": "18x24_blue_poster.jpeg",
                                "pixel_width": 3307,
                                "pixel_height": 3306,
                                "native_width": "11.02",
                                "native_height": "11.02",
                                "aspect_ratio": "1",
                                "resolution": "300.00",
                                "extension": "jpeg",
                                "image_token": "wNS5PKUQeHhr988Kh9XTBJz7npvZC1UZ",
                                "created_at": "2025-02-16T21:15:53.000000Z",
                                "updated_at": "2025-02-16T21:16:26.000000Z"
                            },
                            "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/uo7QefRj9x2PGPKzxByXa0Jfv8xxHO5WZe38KrCc.jpg"
                        }
                    }
                ],
                "shipping_address": {
                    "order_id": null,
                    "company": "Cumberland Graphics, Inc.",
                    "first_name": "John",
                    "last_name": "Von Colln",
                    "address_1": "3840 Saunders Avenue",
                    "address_2": null,
                    "city": "Nashville",
                    "state": "TN",
                    "postal_code": "37216",
                    "country": "US",
                    "phone": "6155541886"
                },
                "fulfillments": [
                    {
                        "id": 621501,
                        "carton_id": 3,
                        "total_quantity": 1,
                        "line_items": [
                            {
                                "id": 2,
                                "quantity": 1,
                                "unit_price": 450,
                                "total_price": 450,
                                "user_product": {
                                    "id": 47231,
                                    "store_id": 786322,
                                    "base_product_id": 9,
                                    "type": null,
                                    "external_product_id": null,
                                    "user_sku": "poster_16x20",
                                    "name": "poster",
                                    "scale_option": "fill",
                                    "description": "poster",
                                    "base_product": {
                                        "id": 9,
                                        "sku": "PP16",
                                        "name": "16 x 20 Print",
                                        "product_category": 1,
                                        "type": "poster_sm",
                                        "description": "16x20 Poster Print",
                                        "properties": {
                                            "ratio": "4:5",
                                            "width": 16,
                                            "height": 20,
                                            "weight": 0.148,
                                            "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                            "thickness": 0.009,
                                            "ratio_decimal": 0.8
                                        },
                                        "price": "4.50",
                                        "ships_alone": false
                                    },
                                    "image": {
                                        "id": 2,
                                        "original_name": "18x24_blue_poster.jpeg",
                                        "pixel_width": 3307,
                                        "pixel_height": 3306,
                                        "native_width": "11.02",
                                        "native_height": "11.02",
                                        "aspect_ratio": "1",
                                        "resolution": "300.00",
                                        "extension": "jpeg",
                                        "image_token": "wNS5PKUQeHhr988Kh9XTBJz7npvZC1UZ",
                                        "created_at": "2025-02-16T21:15:53.000000Z",
                                        "updated_at": "2025-02-16T21:16:26.000000Z"
                                    },
                                    "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/uo7QefRj9x2PGPKzxByXa0Jfv8xxHO5WZe38KrCc.jpg"
                                }
                            }
                        ]
                    }
                ],
                "shipments": {
                    "shipments": [
                        {
                            "id": 3,
                            "order_id": 320101,
                            "fulfillment_id": 621501,
                            "shipping_carrier": "USPS",
                            "shipping_carrier_identifier": "usps",
                            "shipping_method": "USPS Ground Advantage",
                            "shipping_method_identifier": "usps_ground_advantage",
                            "price": 1100,
                            "tracking_number": "9434611206219544571716",
                            "weight": "16.00",
                            "voided_on": null,
                            "created_at": "2025-02-17T17:51:08.000000Z"
                        }
                    ]
                },
                "order_total": {
                    "id": 7,
                    "line_items_total": 450,
                    "fulfillment_total": 300,
                    "handling": null,
                    "shipping_total": 550,
                    "subtotal": null,
                    "tax_total": 120,
                    "grand_total": 1420
                },
                "order_notes": [],
                "order_events": []
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/stores/786322/orders?page=1",
        "last": "https://printops.test/api/stores/786322/orders?page=166",
        "prev": null,
        "next": "https://printops.test/api/stores/786322/orders?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 166,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=3",
                "label": "3",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=4",
                "label": "4",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=5",
                "label": "5",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=6",
                "label": "6",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=7",
                "label": "7",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=8",
                "label": "8",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=9",
                "label": "9",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=10",
                "label": "10",
                "active": false
            },
            {
                "url": null,
                "label": "...",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=165",
                "label": "165",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=166",
                "label": "166",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/orders?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/stores/786322/orders",
        "per_page": 2,
        "to": 2,
        "total": 331
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store}/orders

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer  optional  

The id of the store. Example: 786322

Query Parameters

page   integer  optional  

The page number for pagination. Example: 1

limit   integer  optional  

The number of records to return per page. Example: 2

Get an Order by Id

requires authentication

Get a single order by order id.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786322/orders/320100" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786322/orders/320100"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786322/orders/320100';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786322/orders/320100'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 50
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "order": {
            "id": 320100,
            "store_id": 786322,
            "type": "standard",
            "state": "payment_pending",
            "is_live": null,
            "requested_shipping": "usps_ground_advantage",
            "estimated_ship_date": "2025-02-19",
            "external_order_id": "MAN37660_WML",
            "packing_slip_url": null,
            "shipping_label_url": null,
            "canceled_at": null,
            "closed_at": null,
            "cancel_reason": null,
            "remote_ip": null,
            "total_item_count": null,
            "gift_message": null,
            "line_items": [
                {
                    "id": 1,
                    "quantity": 1,
                    "unit_price": 225,
                    "total_price": 225,
                    "scale_option": null,
                    "user_product": {
                        "id": 47230,
                        "store_id": 786322,
                        "base_product_id": 102,
                        "type": null,
                        "external_product_id": null,
                        "user_sku": "134",
                        "name": "134",
                        "scale_option": "fit",
                        "description": "134",
                        "base_product": {
                            "id": 102,
                            "sku": "PP06",
                            "name": "6 x 8 Print",
                            "product_category": 1,
                            "type": "poster_sm",
                            "description": "6x8 Poster Print",
                            "properties": {
                                "ratio": "3:4",
                                "width": 6,
                                "height": 8,
                                "weight": 0.02,
                                "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                "thickness": 0.009,
                                "ratio_decimal": 0.75
                            },
                            "price": "2.25",
                            "ships_alone": false
                        },
                        "image": {
                            "id": 1,
                            "original_name": "_VC_3717.JPG",
                            "pixel_width": 1920,
                            "pixel_height": 2880,
                            "native_width": "26.67",
                            "native_height": "40.00",
                            "aspect_ratio": "0.66675",
                            "resolution": "72.00",
                            "extension": "JPG",
                            "image_token": "zTeRYWVWFSULPghhT2gaJsoiBJRnQAtN",
                            "created_at": "2025-02-16T20:27:29.000000Z",
                            "updated_at": "2025-02-16T20:27:44.000000Z"
                        },
                        "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/hSs5VXEQR2rLh64TqxjCVZwftr26uzIW7l3ZEYCX.jpg"
                    }
                }
            ],
            "shipping_address": {
                "order_id": null,
                "company": "PrintOps, LLC.",
                "first_name": "John",
                "last_name": "Von Colln",
                "address_1": "111 Oak Valley Drive",
                "address_2": null,
                "city": "Nashville",
                "state": "Tennessee",
                "postal_code": "37207",
                "country": "US",
                "phone": "6153208900"
            },
            "fulfillments": [
                {
                    "id": 621500,
                    "carton_id": 1,
                    "total_quantity": 1,
                    "line_items": [
                        {
                            "id": 1,
                            "quantity": 1,
                            "unit_price": 225,
                            "total_price": 225,
                            "user_product": {
                                "id": 47230,
                                "store_id": 786322,
                                "base_product_id": 102,
                                "type": null,
                                "external_product_id": null,
                                "user_sku": "134",
                                "name": "134",
                                "scale_option": "fit",
                                "description": "134",
                                "base_product": {
                                    "id": 102,
                                    "sku": "PP06",
                                    "name": "6 x 8 Print",
                                    "product_category": 1,
                                    "type": "poster_sm",
                                    "description": "6x8 Poster Print",
                                    "properties": {
                                        "ratio": "3:4",
                                        "width": 6,
                                        "height": 8,
                                        "weight": 0.02,
                                        "paperType": "Sappi McCoy 80lb/216gsm Coated Cover",
                                        "thickness": 0.009,
                                        "ratio_decimal": 0.75
                                    },
                                    "price": "2.25",
                                    "ships_alone": false
                                },
                                "image": {
                                    "id": 1,
                                    "original_name": "_VC_3717.JPG",
                                    "pixel_width": 1920,
                                    "pixel_height": 2880,
                                    "native_width": "26.67",
                                    "native_height": "40.00",
                                    "aspect_ratio": "0.66675",
                                    "resolution": "72.00",
                                    "extension": "JPG",
                                    "image_token": "zTeRYWVWFSULPghhT2gaJsoiBJRnQAtN",
                                    "created_at": "2025-02-16T20:27:29.000000Z",
                                    "updated_at": "2025-02-16T20:27:44.000000Z"
                                },
                                "thumbnail": "https://printops.s3.amazonaws.com/1245/thumbnails/hSs5VXEQR2rLh64TqxjCVZwftr26uzIW7l3ZEYCX.jpg"
                            }
                        }
                    ]
                }
            ],
            "shipments": {
                "shipments": []
            },
            "order_total": {
                "id": 2,
                "line_items_total": 225,
                "fulfillment_total": 300,
                "handling": null,
                "shipping_total": 430,
                "subtotal": null,
                "tax_total": 88,
                "grand_total": 1043
            },
            "order_notes": [],
            "order_events": []
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store}/orders/{order}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer  optional  

The id of the store. Example: 786322

order   integer  optional  

The id of the order. Example: 320100

Request to cancel an Order

requires authentication

This is a request to cancel an order. Depending on the state of the order, it may or may not be able to be canceled.

Example request:
curl --request POST \
    "https://printops.com/api/stores/786321/orders/320100/cancel" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786321/orders/320100/cancel"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786321/orders/320100/cancel';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786321/orders/320100/cancel'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (201):


{
    "data": {
        "message": "Cancellation request received."
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

POST api/stores/{store}/orders/{order}/cancel

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer   

The store. Example: 786321

order   integer   

The order. Example: 320100

Get Shipments

requires authentication

Get a list of shipments from a particular store.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786322/shipments?page=1&limit=2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786322/shipments"
);

const params = {
    "page": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786322/shipments';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786322/shipments'
params = {
  'page': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 49
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "shipments": [
            {
                "id": 3,
                "order_id": 320101,
                "fulfillment_id": 621501,
                "shipping_carrier": "USPS",
                "shipping_carrier_identifier": "usps",
                "shipping_method": "USPS Ground Advantage",
                "shipping_method_identifier": "usps_ground_advantage",
                "price": 1100,
                "tracking_number": "9434611206219544571716",
                "weight": "16.00",
                "voided_on": null,
                "created_at": "2025-02-17T17:51:08.000000Z"
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/stores/786322/shipments?page=1",
        "last": "https://printops.test/api/stores/786322/shipments?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/stores/786322/shipments?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/stores/786322/shipments",
        "per_page": 2,
        "to": 1,
        "total": 1
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store}/shipments

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer  optional  

The id of the store. Example: 786322

Query Parameters

page   integer  optional  

The page number for pagination. Example: 1

limit   integer  optional  

The number of records to return per page. Example: 2

Get a Shipment by Id

requires authentication

Retrieve a particular shipment by id.

Example request:
curl --request GET \
    --get "https://printops.com/api/stores/786322/shipments/3" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/stores/786322/shipments/3"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/stores/786322/shipments/3';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/stores/786322/shipments/3'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 48
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "shipment": {
            "id": 3,
            "order_id": 320101,
            "fulfillment_id": 621501,
            "shipping_carrier": "USPS",
            "shipping_carrier_identifier": "usps",
            "shipping_method": "USPS Ground Advantage",
            "shipping_method_identifier": "usps_ground_advantage",
            "price": 1100,
            "tracking_number": "9434611206219544571716",
            "weight": "16.00",
            "voided_on": null,
            "created_at": "2025-02-17T17:51:08.000000Z"
        }
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/stores/{store}/shipments/{shipment}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

store   integer  optional  

The id of the store. Example: 786322

shipment   integer  optional  

The id of the shipment. Example: 3

Get Webhooks

requires authentication

Webhooks allow you to subscribe to certain events during the order process.

Example request:
curl --request GET \
    --get "https://printops.com/api/webhooks" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/webhooks"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/webhooks';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/webhooks'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 47
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "webhooks": [
            {
                "id": 1,
                "is_active": 1,
                "type": "order_state_update",
                "created_at": "2025-10-23T21:39:40.000000Z",
                "updated_at": "2025-10-23T21:39:40.000000Z"
            },
            {
                "id": 2,
                "is_active": 1,
                "type": "order_shipment",
                "created_at": "2025-10-23T21:39:41.000000Z",
                "updated_at": "2025-10-23T21:39:41.000000Z"
            }
        ]
    },
    "links": {
        "first": "https://printops.test/api/webhooks?page=1",
        "last": "https://printops.test/api/webhooks?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "https://printops.test/api/webhooks?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "https://printops.test/api/webhooks",
        "per_page": 15,
        "to": 2,
        "total": 2
    },
    "status": "OK",
    "code": 200,
    "messages": []
}
 

Request   

GET api/webhooks

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Get a Webhook by Id

requires authentication

Retrieve a webhook by id.

Example request:
curl --request GET \
    --get "https://printops.com/api/webhooks/14?page=1&limit=2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/webhooks/14"
);

const params = {
    "page": "1",
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/webhooks/14';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/webhooks/14'
params = {
  'page': '1',
  'limit': '2',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (404):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 46
permissions-policy: interest-cohort=()
access-control-allow-origin: *
 

{
    "data": {
        "message": "The webhook record was not found."
    },
    "status": "Not Found",
    "code": 404,
    "messages": []
}
 

Request   

GET api/webhooks/{webhook}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

webhook   string   

The id of the webhook. Example: 14

Query Parameters

page   integer  optional  

The page number for pagination. Example: 1

limit   integer  optional  

The number of records to return per page. Example: 2

Create a Webhook

requires authentication

Example request:
curl --request POST \
    "https://printops.com/api/webhooks" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"order_shipment\",
    \"is_active\": \"true\"
}"
const url = new URL(
    "https://printops.com/api/webhooks"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "type": "order_shipment",
    "is_active": "true"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/webhooks';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'type' => 'order_shipment',
            'is_active' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/webhooks'
payload = {
    "type": "order_shipment",
    "is_active": "true"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (201):


{
    "data": {
        "id": 9,
        "is_active": true,
        "type": "order_shipment",
        "created_at": "2024-02-29T20:19:42.000000Z",
        "updated_at": "2024-02-29T20:19:42.000000Z"
    },
    "status": "created",
    "code": 201,
    "messages": []
}
 

Request   

POST api/webhooks

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

type   string  optional  

The type of webhook. Example: order_shipment

is_active   string  optional  

If the webhook is active or not. Example: true

Delete a Webhook

requires authentication

Example request:
curl --request DELETE \
    "https://printops.com/api/webhooks/1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://printops.com/api/webhooks/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://printops.com/api/webhooks/1';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://printops.com/api/webhooks/1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "message": "Webhook deleted"
    },
    "status": "Success",
    "code": 200,
    "messages": []
}
 

Request   

DELETE api/webhooks/{webhook}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

webhook   integer   

The webhook. Example: 1