Get a key
No sign-up and no email. The tenant is real in the sense that everything works against it, and disposable in the sense that the plane can be reset without notice.
The walkthrough worth doing
The last step is the product. Everything before it exists so that step has something to refuse.
- Create a product
POST /v1/productsName it, classify it. Classification is what makes pack resolution possible at all. - Add packaging
POST /v1/packagingThe physical pack the artwork will go on. - Open a manifest
POST /v1/manifestsThe manifest is the unit of compliance — every run, finding, approval and release hangs off one. - Declare the markets
POST /v1/manifests/:manifest_id/marketsWhich jurisdictions this pack is going to. The resolved pack set follows from this and nothing else. - Attach artwork
POST /v1/manifests/:manifest_id/artworkCanonicalised extraction output, content-hashed. PackAuth checks artwork; it does not run OCR. - Run the checks
POST /v1/compliance-runsDeterministic rules over stored facts. Same inputs, byte-identical findings. - Read the findings
GET /v1/findingsA blocking finding stops the flow. It is not a warning the next stage may ignore. - Try to release
POST /v1/print-releasesThis is the one to watch: with a blocking finding open it returns 409, and the refusal names the rail that stopped it.
What is different from production
The database, and nothing else. Same code path, same rules, same decision engine, same
tenant isolation — a query on this host carries the same tenant_id predicate it
would carry anywhere. Every response from this host also carries
x-packauth-plane: sandbox, so a client can tell which plane answered without
inspecting the body.