FORMQUOTE / API
Different products. One quotation interface.
Three digital categories offer public catalog and quote access; PCB retains operator authentication. Results describe suitability, pricing evidence and next steps. No payments, purchases, email verification or automatic delivery are executed.
OpenAPI 3.1 ↗ · JSON Schema ↗ · Capabilities ↗ · Full original technical reference (Chinese) ↗
https://pcba-quote-lab.pages.dev/api/v2Endpoints and access
GET /api/v2/categories | Categories, form fields, defaults and request schemas. |
|---|---|
GET /api/v2/catalog | Digital catalog; filter by categoryId, excluding pcb. |
GET /api/v2/capabilities | Actual authentication, quotation, transaction and delivery capabilities. |
POST /api/v2/quotes | Unified results. Digital categories are public; PCB requires an operator Bearer token. |
POST /api/v1/offers | Original PCB request, response and authentication contract unchanged. |
Requests and examples
Send Content-Type: application/json with a UTF-8 body no larger than 32 KiB. Only quantities, specifications and use cases are accepted—not email lists, manufacturing files, fonts or audio. schemaVersion remains 1. The examples do not create transactions.
email_verification
curl 'https://pcba-quote-lab.pages.dev/api/v2/quotes' \
--header 'Content-Type: application/json' \
--data '{
"schemaVersion": 1,
"categoryId": "email_verification",
"specifications": {
"count": 10001
},
"comparisonGoal": "lowest_cash_now"
}'sound_effects
curl 'https://pcba-quote-lab.pages.dev/api/v2/quotes' \
--header 'Content-Type: application/json' \
--data '{
"schemaVersion": 1,
"categoryId": "sound_effects",
"specifications": {
"intent": "ui",
"seats": 1,
"aiUse": false
},
"usageContext": {
"commercialUse": true,
"standaloneResale": false
},
"comparisonGoal": "best_requirement_fit"
}'font_license
curl 'https://pcba-quote-lab.pages.dev/api/v2/quotes' \
--header 'Content-Type: application/json' \
--data '{
"schemaVersion": 1,
"categoryId": "font_license",
"specifications": {
"licenseUse": "web",
"seats": 1,
"websites": 1,
"monthlyPageviews": 10000,
"trafficMetric": "pv",
"termYears": 1
},
"usageContext": {
"medium": "website",
"commercialProjects": 1,
"requiresAllStyles": false
},
"comparisonGoal": "best_requirement_fit"
}'Category-specific inputs
Email count: 1–10,000,000. User-declared balances can be supplied in purchaseContext.creditsBySupplier; expired credits are unavailable. Sound intent: any/ui/motion/nature/train/kettle; seats: 1–1000; aiUse concerns the audio itself. Font licenseUse: web/desktop/both; specify users, sites, monthly traffic per site, pv/uv and years separately. PV and UV are not converted; web licences do not automatically cover apps, SaaS or logos. OpenAPI defines exact limits and aliases.
Shared model, distinct product rules
Category defines valid input. QuoteRequest holds specifications, usageContext and purchaseContext. CatalogItem and Supplier identify the offer and provider. Offer binds a result to a request. Pricing separates amounts; PricingEvidence preserves sources; RequirementMatch uses yes/no/unknown; ComparisonGroup defines comparable groups; Fulfillment declares only available next steps.
Prices, currencies and ranking
referencePrice is the original catalog price; quotedSubtotal is the applicable subtotal. cashRequiredNow requires confirmed mandatory costs. allocatedJobCost is usage allocation, not a whole-package payment. recurringCharge identifies subscriptions; requestedTermCost is not first-year price multiplied by years. Amounts are decimal strings or null, never zero for unknown. Follow groups[].offerIds; do not claim the cheapest delivered total across currencies, periods or different PCB lead times.
Evidence and freshness
published_observed records collected public pages; derived_estimate calculates from them; supplier_live is used for current customer-visible PCB estimates, not final or locked prices. generatedAt differs from source checkedAt. Review windows are seven days for email, thirty days for sound and fonts, and at most five minutes for PCB. Calling the API does not refresh source dates. Preserve sourceUrl and ineligibility reasons.
Result states and errors
HTTP 200 can still carry partial or blocked results. complete/partial/blocked describe completeness, not order status. Read offers, eligibility, supplierErrors and missingInputs, and support the separate error.code/message shape. For 400 fix input; 401/403 check PCB credentials and Origin; 405/413/415 check method, size and type. Never substitute an old quote after a 502. A request ID is not an order number.
AI integration and permissions
Register only email_verification, sound_effects and font_license in public AI tools, using DigitalQuoteRequest. PCB requires authorized operator credentials; browser Origin checks and authentication remain unchanged. Never distribute credentials to customers or public AI. merchant_checkout/inquiry only opens merchant pages; it does not confirm a purchase, message or licence. order/payment/automaticFulfillment are disabled.
Localization and compatibility
Pages support /zh/, /en/, /ja/, /fr/ and /de/. Language changes presentation only. Quote APIs retain their original routes, fields and enums; do not add an undeclared locale field to the request body. No currency conversion occurs. Original supplier evidence is marked and retained in its source language. The PCB backend still depends on a retained deployment; do not delete it before a validated migration.