API Reference

Every endpoint on one page. Method, path, body, response, errors.

Updated on
API Reference

In short

  • Thirteen calls on one base URL, all JSON over HTTPS, authenticated with one header. Field names below are exact; copy them.
  • Reads: pricing, products, templates, drafts, bundles, orders. Writes: products, drafts, bundles, orders. Nothing here publishes a listing, pays an order, or changes an order after it is placed; those stay with the seller in the app.
  • Values in angle brackets in example responses are placeholders. Prices only ever come from the live pricing call.
  • Limits, error codes and safe retries are on Limits and Errors; this page lists each endpoint’s own errors.

Every call

Base URL:  https://api.printshrimp.com/functions/v1
Header:    x-api-key: $PS_API_KEY        (or Authorization: Bearer $PS_API_KEY)
Body:      JSON, with Content-Type: application/json

Keys look like psk_live_ plus 32 characters and don’t expire. Successful responses carry "success": true. Errors are always { "error": "<message>" }, sometimes with an errors array (one entry per failing item) or a credits object (402).

Code Body
401 { "error": "Missing or invalid API key" } (no key, or the wrong prefix) or { "error": "Invalid API key" } (unknown or revoked)
405 { "error": "Method not allowed" }
429 { "error": "Rate limit exceeded" }, no Retry-After header
500 { "error": "An unexpected error occurred" } (wording varies by endpoint)

Index

Call Does Limit per hour
GET /api-get-pricing Prices per size for one country 2,000
POST /api-create-product Save a product with files per size 1,000
PUT /api-update-product Rename, re-SKU, add sizes, replace files 500
DELETE /api-delete-product Delete a product or one size 500
GET /api-get-product Read one product or list them 2,000
GET /api-get-templates List the seller’s listing templates 2,000
POST /api-bulk-list Turn artwork links into listing drafts 500
GET /api-bulk-list Read draft progress 2,000
POST /api-create-bundle Save a set of products under one SKU 500
GET /api-get-bundle Read one bundle or list them 2,000
DELETE /api-delete-bundle Delete a bundle 500
POST /api-create-order Create a real order 1,000 orders per 24 hours
GET /api-get-order Read one order or list paid orders 2,000

GET /api-get-pricing

curl -s "https://api.printshrimp.com/functions/v1/api-get-pricing?country=GB" \
  -H "x-api-key: $PS_API_KEY"

country: 2-letter ISO code or full country name. Required.

{
  "success": true,
  "country": "United Kingdom",
  "currency": "GBP",
  "sizes": [
    {
      "size": "A3",
      "label": "A3",
      "print":    { "price": <number>, "shipping": <number>, "vat_rate": 0.2, "vat_amount": <number>, "net_price": <number> },
      "frame":    { "price": <number>, "shipping": <number>, "vat_rate": 0.2, "vat_amount": <number>, "net_price": <number> },
      "fine_art": { "price": <number>, "shipping": <number>, "vat_rate": 0.2, "vat_amount": <number>, "net_price": <number> }
    },
    {
      "size": "30x40cm",
      "label": "12x16\" (30x40cm)",
      "print":    { ... },
      "frame":    null,
      "fine_art": null
    }
  ]
}
  • null means that product isn’t offered in that size to that country; sizes not offered at all are left out.
  • Send size, not label, when ordering.
  • shipping is charged once per order, on the first item.
  • UK prices include VAT (vat_rate 0.2) and vat_amount is inside price, never added on top. Other countries have vat_rate 0.
  • Countries with no prices of their own get Rest of World prices.

Errors: 400 Missing required query parameter: country · 400 Unknown country: XX · 404 No pricing available for <country>.

POST /api-create-product

curl -s -X POST "https://api.printshrimp.com/functions/v1/api-create-product" \
  -H "x-api-key: $PS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "name": "Mountain Sunset Print",
    "sku": "MSP-001",
    "variants": [
      { "size": "A4", "image_url": "https://example.com/sunset-a4.jpg" },
      { "size": "A3", "image_url": "https://example.com/sunset-a3.jpg" }
    ]
  }'
Field Required Rules
name yes max 200 characters
sku yes letters, numbers, -, _; max 50; unique on the account and not a bundle SKU
variants no max 22 per call; add more with PUT /api-update-product
variants[].size yes one of the sizes listed at the end of this page, case-sensitive; each size once per call
variants[].image_url yes HTTPS, JPEG or PNG, max 50 MB; the file’s shape must fit the size within 2%
variants[].type no Print (default), Frame, FineArt; ordering decides print or frame anyway, so leave it out

Response 201:

{
  "success": true,
  "product": {
    "id": "f0f17d46-...",
    "name": "Mountain Sunset Print",
    "sku": "MSP-001",
    "type": "poster",
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "variants": [
      { "id": "232171d7-...", "sku": "MSP-001-A4", "size": "A4", "type": "Print", "image_url": "https://...", "thumbnail_url": "https://..." },
      { "id": "8c2e19a0-...", "sku": "MSP-001-A3", "size": "A3", "type": "Print", "image_url": "https://...", "thumbnail_url": null }
    ]
  },
  "warning": "Product created, but one or more thumbnails could not be generated yet."
}
  • This response says id; GET /api-get-product says product_id and variant_id for the same values.
  • variants is missing when none were sent. warning appears only while artwork copying is still running in the background; image_url may still be your URL until it finishes.
  • The variant SKU is always {sku}-{size}.

Errors: 400 Missing required field: name / sku · 400 SKU must be 50 characters or less. · 400 Too many variants. Maximum 22 variants per request. · 400 variants[1]: Invalid size "a4". Accepted values: ... · 400 variants[0]: Duplicate size "A4". ... · 400 variants[0]: Invalid image_url: <reason> · 400 product limit reached (25,000 per account) · 409 SKU "MSP-001" already exists · 409 SKU "X" belongs to a bundle. ...

PUT /api-update-product

curl -s -X PUT "https://api.printshrimp.com/functions/v1/api-update-product" \
  -H "x-api-key: $PS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "sku": "MSP-001",
    "variants": [
      { "size": "A4", "image_url": "https://example.com/sunset-a4-v2.jpg" },
      { "size": "24x36", "image_url": "https://example.com/sunset-24x36.jpg" }
    ]
  }'
Field Required Rules
sku yes existing product SKU
name no new name, max 200
new_sku no new product SKU, same rules as create; variant SKUs follow (MSP-002-A4)
variants no max 22 per call
variants[].image_url yes same rules as create
variants[].size / variant_sku (or sku) / variant_id one of size creates the size if the product doesn’t have it; the other two must match an existing variant
variants[].type no only with size: Print (default), Frame, FineArt

Response 200:

{
  "success": true,
  "sku_updated": false,
  "updated_variants": 1,
  "created_variants": 1,
  "product": {
    "product_id": "f0f17d46-...",
    "name": "Mountain Sunset Print",
    "sku": "MSP-001",
    "thumbnail_url": "https://...",
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "updated_at": "2026-10-19T11:02:44.020+00:00",
    "variants": [
      { "variant_id": "232171d7-...", "sku": "MSP-001-A4", "size": "A4", "type": "Print", "image_url": "https://...", "thumbnail_url": "https://...", "created_at": "...", "updated_at": "..." },
      { "variant_id": "5d0e8b11-...", "sku": "MSP-001-24x36", "size": "24x36", "type": "Print", "image_url": "https://...", "thumbnail_url": null, "created_at": "...", "updated_at": null }
    ]
  }
}

May also carry warning while artwork copying finishes. variants lists every size the product has, not just the ones sent.

DELETE /api-delete-product

# whole product
curl -s -X DELETE "https://api.printshrimp.com/functions/v1/api-delete-product?sku=MSP-001" \
  -H "x-api-key: $PS_API_KEY"

# one size
curl -s -X DELETE "https://api.printshrimp.com/functions/v1/api-delete-product?sku=MSP-001&size=A4" \
  -H "x-api-key: $PS_API_KEY"

Selectors: sku or product_id (whole product); sku + size, variant_sku or variant_id (one size). Also accepted as a JSON body, and POST works as an alias. Cannot be undone; files are removed after 30 days; past orders keep their copy.

{
  "success": true,
  "deleted": {
    "product_id": "f0f17d46-...",
    "sku": "MSP-001",
    "name": "Mountain Sunset Print",
    "variants": [
      { "variant_id": "232171d7-...", "sku": "MSP-001-A4", "size": "A4", "type": "Print" },
      { "variant_id": "8c2e19a0-...", "sku": "MSP-001-A3", "size": "A3", "type": "Print" }
    ]
  }
}

One size: same, plus "remaining_variants": 3, with deleted.variants holding the one size. Errors: 400 no selector, or variant not on that product · 404 not found · 409 product is used by other records.

GET /api-get-product

curl -s "https://api.printshrimp.com/functions/v1/api-get-product?sku=MSP-001" \
  -H "x-api-key: $PS_API_KEY"

sku = one product. No sku = list, 25 per page, page from 1.

{
  "success": true,
  "product": {
    "product_id": "f0f17d46-...",
    "name": "Mountain Sunset Print",
    "sku": "MSP-001",
    "thumbnail_url": "https://...",
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "variants": [
      {
        "variant_id": "232171d7-...",
        "sku": "MSP-001-A4",
        "size": "A4",
        "type": "Print",
        "image_url": "https://api.printshrimp.com/storage/v1/object/public/...",
        "thumbnail_url": "https://...",
        "created_at": "2026-10-19T09:41:10.512+00:00"
      }
    ]
  }
}

List: { "success": true, "products": [ ...same shape... ], "page": 1, "total_products": 142 }. When every variant’s image_url is on our storage, we have our own copy and the caller can delete theirs. 404 when no product has that SKU.

GET /api-get-templates

curl -s "https://api.printshrimp.com/functions/v1/api-get-templates" -H "x-api-key: $PS_API_KEY"
{
  "success": true,
  "default_template_id": "3f6c1e2a-...",
  "templates": [
    {
      "template_id": "3f6c1e2a-...",
      "name": "Botanical",
      "ratio": "A",
      "ratio_label": "A-series",
      "mode": "easy",
      "sizes": ["A4", "A3", "A2"],
      "mockups": { "scenes": 6, "photos": 2 },
      "print_files": true,
      "is_default": true,
      "created_at": "2026-08-02T09:41:10.512+00:00",
      "updated_at": "2026-09-20T16:03:44.031+00:00"
    }
  ]
}

ratio: A, 2:3, 3:4, 4:5. print_files: false = mockup-only template, never makes PrintShrimp products. More than 6 scenes = 2 credits per draft. Templates are made and edited in the Listing Hub, not through the API.

POST /api-bulk-list

curl -s -X POST "https://api.printshrimp.com/functions/v1/api-bulk-list" \
  -H "x-api-key: $PS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "template_id": "3f6c1e2a-...",
    "tags": ["vintage botanical prints"],
    "instructions": { "title": "Start the title with the plant name." },
    "items": [
      { "image_url": "https://example.com/fern.png", "sku": "FERN-001", "name": "Fern Botanical Print", "keywords": "fern, green, vintage" },
      { "image_url": "https://example.com/oak-leaf.png" }
    ]
  }'
Field Required Rules
template_id no from GET /api-get-templates; default template if left out
items yes 1 to 10
items[].image_url yes HTTPS JPEG or PNG, max 50 MB, ratio = the template’s family (A, 2:3, 3:4, 4:5) within 2%; landscape OK; square not yet
items[].sku no letters, numbers, -, _; max 32; defaults to the file name
items[].name no max 200; defaults to the file name
items[].keywords no hints for the AI, max 300
tags / items[].tags no up to 13 tags, 20 characters each, kept ahead of the AI’s tags
instructions / items[].instructions no { title, description, tags }, free text, max 2,000 characters each
generate no default true; false = drafts only, no credits used

Response 201:

{
  "success": true,
  "template": { "template_id": "3f6c1e2a-...", "name": "Botanical", "ratio": "A", "ratio_label": "A-series" },
  "generate": true,
  "credits": { "cost": 2, "available": 340 },
  "drafts": [
    {
      "index": 0,
      "status": "created",
      "draft_id": "9b1d7c40-...",
      "sku": "FERN-001",
      "name": "Fern Botanical Print",
      "image": { "url": "https://...", "width": 3508, "height": 4961, "ratio": "A", "ratio_label": "A-series", "orientation": "portrait" },
      "mockups": 6,
      "credit_cost": 1,
      "ai_status": "queued"
    }
  ]
}
  • drafts[].status: created, failed (see error), skipped (ran out of time, send that image again). If none were created: 500 with success: false and error: "No draft could be created. See drafts[].error."
  • credits is null when generate is false.

Errors (nothing is created):

// 400: any image failed the checks
{
  "error": "1 of 2 images failed validation. Nothing was created.",
  "errors": [
    { "index": 1, "image_url": "https://example.com/oak-leaf.png", "error": "Artwork is 2:3 (1024x1536px) but template \"Botanical\" is A-series. Use a 2:3 template or resize the file." }
  ]
}

// 402: not enough credits for the whole batch
{ "error": "Not enough credits: this request needs 12 and you have 4. Top up or send fewer images.", "credits": { "cost": 12, "available": 4 } }

// 409: SKU already on the account
{ "error": "1 SKU conflict(s). Nothing was created.", "errors": [ { "index": 0, "image_url": "https://example.com/fern.png", "error": "SKU \"FERN-001\" is already used by a product or draft on your account." } ] }

GET /api-bulk-list

curl -s "https://api.printshrimp.com/functions/v1/api-bulk-list?draft_id=9b1d7c40-..." \
  -H "x-api-key: $PS_API_KEY"

draft_id = one · draft_ids=a,b,c = up to 50 · nothing = newest 25, page from 1.

{
  "success": true,
  "draft": {
    "draft_id": "9b1d7c40-...",
    "created_at": "2026-10-19T10:12:03.120+00:00",
    "sku": "FERN-001",
    "name": "Fern Botanical Print",
    "template_id": "3f6c1e2a-...",
    "image": { "url": "https://...", "thumbnail_url": "https://...", "width": 3508, "height": 4961, "ratio": "A", "ratio_label": "A-series" },
    "generation": {
      "status": "done",
      "error": null,
      "queued_at": "...", "started_at": "...", "completed_at": "...",
      "title": "Fern Botanical Print, Vintage Green Wall Art",
      "short_title": "Fern Botanical Print",
      "description": "...",
      "tags": ["botanical print", "fern wall art"]
    },
    "mockups": { "total": 6, "rendered": 6, "status": "done" },
    "etsy": { "status": null, "listing_id": null, "error": null, "listed_at": null },
    "product_id": null
  }
}
  • generation.status: not_started, queued, processing, done, failed (failed drafts are not charged).
  • mockups.status: none, pending, rendering, done, failed.
  • etsy.status: null until the seller lists it from the Listing Hub, then queued, processing, done, failed.
  • draft_ids form: { "success": true, "drafts": [...], "missing": ["<id not on account>"] }. List form: { "success": true, "drafts": [...], "page": 1, "total_drafts": 87 }.

POST /api-create-bundle

curl -s -X POST "https://api.printshrimp.com/functions/v1/api-create-bundle" \
  -H "x-api-key: $PS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "name": "Woodland Set of 3",
    "sku": "WOODLAND-SET",
    "items": [ { "sku": "FOX-01" }, { "sku": "OWL-01" }, { "sku": "DEER-01", "size": "A4" } ]
  }'
Field Required Rules
name yes max 255
sku yes letters, numbers, -, _; max 100; not already a bundle, product or size SKU (case ignored)
items yes 1 to 10 products; plain strings also work: ["FOX-01", "OWL-01"]
items[].sku yes a saved product SKU
items[].quantity no default 1
items[].size no always print this item in this size; leave out to use the ordered size

2 to 10 prints per bundle counting quantities. Every product needs artwork in its fixed size; items without a size need a size they all share. All or nothing. No update: delete and create again.

Response 201:

{
  "success": true,
  "bundle": {
    "bundle_id": "b7a1...",
    "name": "Woodland Set of 3",
    "sku": "WOODLAND-SET",
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "total_prints": 3,
    "items": [
      { "product_id": "...", "sku": "FOX-01", "name": "Fox", "quantity": 1, "size": null },
      { "product_id": "...", "sku": "OWL-01", "name": "Owl", "quantity": 1, "size": null },
      { "product_id": "...", "sku": "DEER-01", "name": "Deer", "quantity": 1, "size": "A4" }
    ]
  }
}

Errors: 400 with errors per item, e.g. { "error": "1 of 3 items can't go in a bundle. Nothing was created.", "errors": [ { "index": 2, "sku": "DEER-01", "error": "\"DEER-01\" has no artwork uploaded in A4." } ] } · 409 bundle SKU already used.

GET /api-get-bundle

?sku=WOODLAND-SET → { "success": true, "bundle": {...} } (same shape as create). No sku → { "success": true, "bundles": [...], "page": 1, "total_bundles": 12 }, 25 per page, newest first. A deleted product shows as an item with product_id, sku and name all null; that bundle can’t be ordered until it is rebuilt.

DELETE /api-delete-bundle

?sku=WOODLAND-SET or ?bundle_id=<uuid> (or JSON body; POST alias). Response { "success": true, "deleted": { ...bundle shape... } }. Products and their artwork are kept. 400 no selector / bad id · 404 not found.

POST /api-create-order

Makes a real order. Not charged until paid, but with auto-pay on it is paid, printed and shipped. Always send external_order_number.

curl -s -X POST "https://api.printshrimp.com/functions/v1/api-create-order" \
  -H "x-api-key: $PS_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "external_order_number": "SHOP-1001",
    "customerInfo": {
      "name": "Jane Example",
      "address1": "1 Example Street",
      "city": "London",
      "zip": "SW1A 1AA",
      "country": "GB",
      "shipping": "standard"
    },
    "products": [
      { "sku": "MSP-001", "size": "A4", "paper_type": "Matte" },
      { "sku": "MSP-001", "size": "A3", "type": "Frame", "variant": "Oak" },
      { "size": "A4", "paper_type": "Gloss", "image": { "artwork_url": "https://example.com/art.jpg" } }
    ]
  }'

Top level:

Field Required Rules
external_order_number no (always send) max 100; a second API order with the same value is refused with 400
gift_message no max 500
customerInfo yes below
products yes 1 to 50 prints (after bundles are split); one entry = one print

customerInfo:

Field Required Rules
name yes max 60
address1 yes max 60
address2 no max 60
city yes max 60, no digits
state US, CA, AU max 60
zip yes max 20; UK: no hyphen, not all digits; US: no letters
country yes 2-letter ISO (GB, not UK); JE, GG, IM are refused
email no valid format, max 254
phone no max 30
shipping no standard (default), tracking upgrade, priority; the last two UK only; frames and fine art always ship standard

products[], one of two modes per item:

Field Required Rules
sku SKU mode a saved product SKU or a bundle SKU
image.artwork_url URL mode HTTPS, JPEG, PNG or PDF, max 50 MB, ratio must fit the size
size yes product sizes plus 12x16 (= 30x40cm) and 20x28 (= 50x70cm)
type no Print (default), Frame, FineArt (Fine Art also works)
paper_type prints Matte, Satin, Gloss; ignored for frames (Matte) and fine art
variant frames Black, White, Oak

Sending both sku and image.artwork_url, or neither, is a 400. A bundle SKU becomes one print per product in the bundle, using the type, paper_type and variant sent; fixed-size bundle items use their own size.

Response 201 (status is always Pending):

{
  "success": true,
  "order": {
    "order_id": "f0f17d46-...",
    "external_order_number": "SHOP-1001",
    "status": "Pending",
    "shipping_type": "Standard",
    "total_price": <number>,
    "shipping_cost": <number>,
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "items": [
      { "id": "a1...", "sku": "MSP-001", "size": "A4", "type": "Print", "variant": null, "paper_type": "Matte", "price": <number>, "title": "Mountain Sunset Print" },
      { "id": "b2...", "sku": "MSP-001", "size": "A3", "type": "Frame", "variant": "Oak", "paper_type": "Matte", "price": <number>, "title": "Mountain Sunset Print" },
      { "id": "c3...", "sku": null, "size": "A4", "type": "Print", "variant": null, "paper_type": "Gloss", "price": <number>, "title": null }
    ],
    "vat_rate": 0.2,
    "vat_amount": <number>
  }
}
  • shipping_type: Standard, Tracking Upgrade, Priority.
  • total_price includes shipping and, for the UK, VAT (vat_amount is inside it).
  • Unknown SKU: the order is still created and the response looks normal (title: null). That print needs artwork before the order can be paid. GET /api-get-order shows the item as "fulfillable": false, "reason_code": "SKU_NOT_FOUND". Safer: check SKUs with GET /api-get-product first.

Errors, all 400 with { "error": "..." }, for example:

  • Invalid request format. Expected { customerInfo: {...}, products: [...] }
  • Missing customer information: zip. All of these are required: name, address1, city, zip, country
  • Country must be a 2-letter ISO code (e.g. "GB", "US", "AU"). Received: "UK"
  • State/province is required for United States. Please provide a "state" field.
  • Shipping option "priority" is only available for United Kingdom. Use "standard" for other countries.
  • Product[0]: Missing required field: paper_type. Accepted values: Matte, Satin, Gloss
  • Product[1]: Frame orders require a "variant" field. Accepted values: Black, White, Oak
  • Product[0]: Provide either "sku" (to reference a saved product) or "image.artwork_url" (to provide artwork directly), not both.
  • An order with external_order_number "SHOP-1001" already exists. (the safe-retry case: treat it as already placed and look it up)

GET /api-get-order

curl -s "https://api.printshrimp.com/functions/v1/api-get-order?external_order_number=SHOP-1001" \
  -H "x-api-key: $PS_API_KEY"

order_id or external_order_number = one order (Pending included). Nothing = paid orders only, all sources, 25 per page, newest first, page from 1.

Paid order:

{
  "success": true,
  "order": {
    "order_id": "f0f17d46-...",
    "external_order_number": "SHOP-1001",
    "status": "Shipped",
    "paid": true,
    "shipping_type": "Standard",
    "total_price": <number>,
    "shipping_cost": <number>,
    "vat_rate": 0.2,
    "vat_amount": <number>,
    "vat_treatment": "uk_standard",
    "tracking": "AB123456789GB",
    "tracking_courier": "Royal Mail",
    "completed": false,
    "order_num": 10042,
    "created_at": "2026-10-19T09:41:10.512+00:00",
    "items": [
      { "id": "a1...", "sku": "MSP-001", "size": "A4", "type": "Print", "paper_type": "Matte", "price": <number>, "friendly_name": null }
    ]
  }
}
  • Pending order: same top fields with paid: false, vat_* and tracking* null, and no completed or order_num. Its items carry fulfillable (true/false) and reason_code (e.g. SKU_NOT_FOUND) instead of friendly_name.
  • List: { "success": true, "orders": [ ...paid shape... ], "page": 1, "total_orders": 42 }.
  • status: Pending, Paid, In Production, Shipped, Cancelled, Reshipping. Treat anything else as In Production.
  • vat_treatment: uk_standard, zero_export, out_of_scope.
  • tracking appears once shipped. Poll every 30 to 60 minutes; no webhooks.

Sizes

Products and orders: A5 A4 A3 A2 A1 A0 5x7 6x8 8x10 8.5x11 11x14 11x17 12x18 16x20 16x24 18x24 20x30 24x32 24x36 28x40 30x40 30x40cm 50x70cm 10x10 12x12 14x14 16x16 18x18 20x20. Case-sensitive. Orders also accept 12x16 for 30x40cm and 20x28 for 50x70cm. Inches unless marked cm or A-series; 8.5x11 ships to the USA only. Which sizes are offered to a country, and as which products, comes from GET /api-get-pricing.

What the API doesn’t do

  • Create an account or an API key; the seller does that in the app.
  • Pay an order, top up the wallet or change auto-pay.
  • Edit or cancel an order after it is created, or open a case about one.
  • Publish a listing to Etsy or Shopify, or create or edit a listing template.
  • Regenerate a draft’s AI writing, or return the Etsy attributes it filled in.
  • Send webhooks. Poll GET /api-get-order and GET /api-bulk-list.
  • List unpaid orders. One unpaid order is readable by order_id or external_order_number.

What this page doesn’t cover

Next

Previous: Limits and Errors · Next: Rules · Back to the hub: PrintShrimp for AI agents

Last updated 19 October 2026.

CoFounder
Updated on