printkk-print-on-demand — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited printkk-print-on-demand (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
PrintKK is a print-on-demand platform that connects sellers with production and fulfillment for custom products — apparel, home decor, accessories, and more. Use the API to automate design creation, product browsing, order placement, and image management.
Base URL: https://api.printkk.com/pkk-openapi
The API covers internal PrintKK operations only:
All requests require an Api-Key header.
Api-Key: <your-api-key>All responses follow this structure:
{
"code": 200,
"success": true,
"msg": "OK",
"data": { ... }
}Check success field first, not just HTTP status code.
Product (catalog) Image (media library)
├── productCode ├── imageId
├── printAreas[] ├── folderId
└── specifications[] └── keywords
│ │
▼ ▼
Design ◄────────────── uses imageId per printArea
├── designCode
├── designSpecifications[]
│ └── designSpecificationCode
└── taskId (async creation)
│
▼
Order
├── orderId
├── designSpecificationCode + quantity
├── shippingAddress
└── shippingType priority list
│
▼
Payment (wallet)Key relationships:
taskId, then poll for completion.designSpecificationCode (a specific size/color variant of your design), NOT the product directly.imageId returned from upload is used in design creation.This is the most common end-to-end flow. Follow these steps in order — skipping steps will fail.
1. Browse products GET /api/v1/product/page
2. Get product detail GET /api/v1/product/{productCode}
→ Note the printAreas and their printAreaCodes
→ Note isWhole (1=full coverage, 0=fragment/placement)
3. Upload image POST /api/v1/image
→ Returns imageId
4. Create design POST /api/v1/design
→ Returns taskId (NOT designCode yet!)
5. Poll task status GET /api/v1/design/task/{taskId}
→ Wait for designTaskStatus = "completed"
→ Now you have designCode
6. Get design detail GET /api/v1/design/{designCode}
→ Get designSpecificationCode for the variant you want
7. Create order POST /api/v1/order
→ Use designSpecificationCode + quantity
8. Pay with wallet POST /api/v1/pay/wallet
→ orderId required, wallet must have sufficient balanceFor sellers with branded product lines:
1. List brand groups GET /api/v1/design/brand-group/list
2. Browse brand designs GET /api/v1/design/brand/page
3. Create brand design POST /api/v1/design/brand
→ Requires brandName (max 50 chars)
→ Same async flow: returns taskId, poll for completionCreate folder POST /api/v1/image/folder
List folders GET /api/v1/image/folder/list
Upload image POST /api/v1/image (multipart/form-data)
Browse images GET /api/v1/image/page
Update metadata PUT /api/v1/image/{imageId}This is the #1 mistake. POST /api/v1/design does NOT return a design — it returns a taskId. You must poll GET /api/v1/design/task/{taskId} until designTaskStatus is "completed" before you can use the design. Status progression: pending → generating → completed.
When creating a design, isWhole must match the product's print area type:
1 = whole (full-surface print, e.g. all-over print t-shirt)0 = fragment (placement print, e.g. logo on chest)Using the wrong value will produce incorrect output.
Each print area requires an imageFillingMode:
cover — image fills the entire area, may crop edgescontain — image fits within the area, may have blank spacefill — image stretches to fill exactly, may distortshippingType in order creation is not a single choice — it's an ordered array of all three options. The order determines fallback priority:
"shippingType": ["economy", "standard", "express"]All three values must be present. Put your preferred option first.
Order Address Update and Order Cancel only work on orders with status pendingPaymentwaitingForFulfillment and beyond), the order is lockedOnce a design has been ordered, exported, or published, its status becomes immutable. You can no longer update it — you'd need to create a new design.
All paginated endpoints default to current=1, size=10, max size=50. If you need all records, loop through pages.
multipart/form-data, not JSONpendingPayment → waitingForFulfillment → beingFulfilled → partiallyShipped → shipped → completed
│
└→ canceled → closedDefault: 60 requests/minute. Exceeding this returns Too Many Requests. When polling design task status, add reasonable delays (2–3 seconds) between calls.
PrintKK does not provide webhooks. To track order status or design task completion, you must poll the relevant endpoints. Design task polling is mandatory; order status polling is optional but recommended for automation.
All timestamps are in fixed UTC-8 timezone (does NOT follow daylight saving). Response format: MM/dd/yyyy HH:mm:ss. Date filter params in order pagination use yyyy-MM-dd HH:mm:ss format — note the inconsistency between input and output formats.
Two product types exist:
template — regular catalog productsbrand — brand-specific products (requires separate brand design flow)| Module | Method | Path | Summary |
|---|---|---|---|
| General | GET | /api/v1/general/ping | Health check |
| General | GET | /api/v1/general/time | Server timestamp |
| General | GET | /api/v1/general/country-list | Country list (ISO codes) |
| Auth | PUT | /api/v1/auth/renewal | Renew API key (≤7 days remaining) |
| Image | POST | /api/v1/image | Upload image (multipart) |
| Image | GET | /api/v1/image/page | List images (paginated) |
| Image | PUT | /api/v1/image/{imageId} | Update image metadata |
| Image | POST | /api/v1/image/folder | Create folder |
| Image | GET | /api/v1/image/folder/list | List all folders |
| Image | PUT | /api/v1/image/folder/{folderId} | Update folder |
| Image | DELETE | /api/v1/image/folder/{folderId} | Delete folder |
| Product | GET | /api/v1/product/category | Product categories |
| Product | GET | /api/v1/product/page | List products (paginated) |
| Product | GET | /api/v1/product/{productCode} | Product detail |
| Design | POST | /api/v1/design | Create design (async) |
| Design | GET | /api/v1/design/page | List designs (paginated) |
| Design | GET | /api/v1/design/{designCode} | Design detail |
| Design | PUT | /api/v1/design/{designCode} | Update design |
| Design | GET | /api/v1/design/task/{taskId} | Poll design task |
| Design | POST | /api/v1/design/brand | Create brand design |
| Design | GET | /api/v1/design/brand/page | List brand designs |
| Design | GET | /api/v1/design/brand-group/list | List brand groups |
| Order | POST | /api/v1/order | Create order |
| Order | GET | /api/v1/order/page | List orders (paginated) |
| Order | GET | /api/v1/order/{orderId} | Order detail |
| Order | PUT | /api/v1/order/address/{orderId} | Update address |
| Order | PUT | /api/v1/order/cancel/{orderId} | Cancel order |
| Order | POST | /api/v1/pay/wallet | Pay with wallet |
| Order | GET | /api/v1/pay/{orderId} | Query payment status |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.