{
  "schemaVersion": "2026-08-24",
  "name": "Angels Print",
  "legalName": "Angels Print",
  "description": "Custom printing and signage, printed in Sun Valley, Los Angeles; agents can search the catalogue, get exact prices and prepare orders for their operator to approve.",
  "url": "https://angelsprint.com",
  "documentation": "https://angelsprint.com/for-agents",
  "contact": {
    "email": "hello@angelsprint.com",
    "phone": "+18188069006",
    "phoneDisplay": "(818) 806-9006",
    "address": {
      "street": "8511 Lankershim Blvd",
      "city": "Sun Valley",
      "region": "CA",
      "postalCode": "91352",
      "country": "United States"
    },
    "hours": [
      {
        "days": [
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday"
        ],
        "opens": "09:00",
        "closes": "18:00"
      },
      {
        "days": [
          "Saturday"
        ],
        "opens": "10:00",
        "closes": "16:00"
      }
    ],
    "timezone": "America/Los_Angeles"
  },
  "interfaces": {
    "mcp": {
      "name": "angels-print",
      "transport": "streamable-http",
      "url": "https://angelsprint.com/api/mcp",
      "protocolVersion": "2025-06-18",
      "tools": [
        "search_products",
        "get_product",
        "get_quote",
        "create_order",
        "check_order"
      ]
    },
    "rest": {
      "openapi": "https://angelsprint.com/api/agent/openapi.json",
      "openapiVersion": "3.1.0",
      "baseUrl": "https://angelsprint.com/api/agent"
    }
  },
  "authentication": {
    "type": "none",
    "note": "The catalogue, quoting and draft-order endpoints are open. Payment happens in a human-approved Stripe Checkout session, so an agent never needs a key, a card or an account."
  },
  "capabilities": [
    {
      "id": "search_products",
      "title": "Search the catalogue",
      "description": "Find the product that matches the operator's brief — business cards, banners, stickers, packaging, signage.",
      "endpoint": "GET /api/agent/products"
    },
    {
      "id": "get_product",
      "title": "Read a product's options",
      "description": "Sizes, stocks, finishes, quantity ladder and turnaround speeds, each with the price it adds.",
      "endpoint": "GET /api/agent/products/{slug}"
    },
    {
      "id": "get_quote",
      "title": "Get an exact price",
      "description": "The engine that charges at checkout prices the configuration — no estimates, no client-side arithmetic.",
      "endpoint": "POST /api/agent/quote"
    },
    {
      "id": "create_order",
      "title": "Prepare an order for approval",
      "description": "Returns an approval link for the operator. Nothing is charged and no card is ever exposed to the agent.",
      "endpoint": "POST /api/agent/orders"
    },
    {
      "id": "check_order",
      "title": "Check an order",
      "description": "Poll the draft to see whether the operator approved and paid.",
      "endpoint": "GET /api/agent/orders/{draft_id}"
    }
  ],
  "endpoints": [
    {
      "method": "GET",
      "path": "/api/agent/products",
      "operationId": "searchProducts",
      "summary": "Search or list the catalogue. Every word must match; returns slugs, entry prices and the category counts."
    },
    {
      "method": "GET",
      "path": "/api/agent/products/{slug}",
      "operationId": "getProduct",
      "summary": "One product's whole option surface: stocks and finishes with price deltas, the quantity ladder, turnaround speeds, size limits."
    },
    {
      "method": "POST",
      "path": "/api/agent/quote",
      "operationId": "getQuote",
      "summary": "Exact price for one configured product, plus an itemId that pins those selections for the order."
    },
    {
      "method": "POST",
      "path": "/api/agent/orders",
      "operationId": "createOrder",
      "summary": "Prepare a draft and get the approval link for the human operator. Charges nothing and writes no order."
    },
    {
      "method": "GET",
      "path": "/api/agent/orders/{draft_id}",
      "operationId": "checkOrder",
      "summary": "Read a draft back: awaiting_approval, paid or expired, with the totals the operator sees."
    }
  ],
  "orderPolicy": {
    "humanApprovalRequired": true,
    "statement": "Orders are never charged automatically. An agent can only prepare a draft; a human operator must open the approval link, review the cart and pay via Stripe Checkout.",
    "agentCanPay": false,
    "paidBy": "the human operator, in a Stripe Checkout session opened from the approval link",
    "approvalUrlPattern": "https://angelsprint.com/a/{draft_id}",
    "draftStatuses": [
      "awaiting_approval",
      "paid",
      "expired"
    ],
    "draftExpiresInDays": 7,
    "pricing": "Every price is recomputed on the server from the product configuration — at quote, at draft, and again when the operator pays. A price sent by a client is ignored, so an agent cannot invent, discount or inflate a total."
  },
  "limits": {
    "requestsPerMinutePerIp": {
      "searchProducts": 120,
      "getProduct": 120,
      "getQuote": 60,
      "createOrder": 6,
      "checkOrder": 60
    },
    "maxJsonRpcBatch": 10,
    "maxLinesPerOrder": 7,
    "maxPackagesPerLine": 1000,
    "maxArtworkFiles": 10,
    "overLimitStatus": 429,
    "overLimitCode": "rate_limited"
  },
  "artwork": {
    "acceptedFormats": [
      "PDF",
      "PNG",
      "JPG",
      "WEBP",
      "AI",
      "EPS",
      "DXF",
      "DWG"
    ],
    "maxFileSizeMb": 25,
    "transport": "https URL on the order (no uploads, no data: URLs)",
    "note": "Attach artwork as public https links on the order, or let the operator send the file after approving. DXF/DWG are for cutting jobs."
  },
  "catalogue": {
    "products": 131,
    "categories": [
      {
        "slug": "business-cards",
        "label": "Business Cards",
        "url": "https://angelsprint.com/products/business-cards"
      },
      {
        "slug": "marketing-material",
        "label": "Marketing Material",
        "url": "https://angelsprint.com/products/marketing-material"
      },
      {
        "slug": "banners-and-signs",
        "label": "Banners & Signs",
        "url": "https://angelsprint.com/products/banners-and-signs"
      },
      {
        "slug": "stands-and-displays",
        "label": "Stands & Displays",
        "url": "https://angelsprint.com/products/stands-and-displays"
      },
      {
        "slug": "labels-and-stickers",
        "label": "Labels & Stickers",
        "url": "https://angelsprint.com/products/labels-and-stickers"
      },
      {
        "slug": "packaging-and-boxes",
        "label": "Packaging & Boxes",
        "url": "https://angelsprint.com/products/packaging-and-boxes"
      }
    ],
    "currency": "USD",
    "feeds": [
      "https://angelsprint.com/llms.txt",
      "https://angelsprint.com/llms-full.txt",
      "https://angelsprint.com/sitemap.xml"
    ]
  },
  "fulfilment": {
    "producedIn": "Sun Valley, CA",
    "standardTurnaround": "3-5 business days after artwork approval",
    "rushTurnaround": "next-day production available on 39 of 131 products (a turnaround option inside the product)",
    "shipping": {
      "region": "United States",
      "freeGroundOver": 100,
      "flatRateUnderThreshold": 9.99,
      "automaticRatesEligibility": "standard-size items only",
      "oversize": {
        "products": 61,
        "rule": "Any preset side over 24 inches, or category banners-and-signs / stands-and-displays",
        "freeOrFlatRateEligible": false,
        "policy": "Shipping for oversized items is quoted separately. Choose store pickup or contact us for a shipping quote."
      },
      "currency": "USD",
      "localPickup": "8511 Lankershim Blvd, Sun Valley, CA"
    },
    "areaServed": [
      "Sun Valley",
      "Panorama City",
      "Los Angeles",
      "San Fernando Valley",
      "Van Nuys",
      "North Hollywood",
      "Burbank",
      "Glendale",
      "Reseda",
      "Sherman Oaks",
      "Encino",
      "Northridge",
      "Pacoima",
      "California",
      "United States"
    ]
  }
}