# PixGlory > Guides and API reference for PixGlory: bulk image processing and CDN delivery. ## Docs - [Quickstart](https://docs.pixglory.com/quickstart.md): Create an API key and authenticate your first request. - [Set up a custom domain](https://docs.pixglory.com/guides/custom-domains.md): Serve a CDN project from a hostname you own, alongside your pixglory.com link. - [Key introspection — the plugin's connection test](https://docs.pixglory.com/api-reference/key-introspection-—-the-plugins-connection-test.md): No permission required. Any valid key of EITHER class (api or wordpress) may introspect itself — this is the endpoint the Quickstart guide points a brand-new key at. - [CDN projects this key may see](https://docs.pixglory.com/api-reference/cdn-projects-this-key-may-see.md): Requires projects:["read"]. Accepts either key class. A key bound to one project (today, only a wordpress key can be) sees exactly that project; an unbound key — every api-class key, by design — sees the org's full paginated list. - [Presign one PUT URL per file, into a CDN project](https://docs.pixglory.com/api-reference/presign-one-put-url-per-file-into-a-cdn-project.md): Requires files:["write"]. Accepts either key class, with different project resolution: a wordpress key always uses its bound project; an api-class key (unbound by design) must name the target project via the projectId field. Offload-first: no batch, no processor, no transforms billed. Nothing is per… - [Verify PUTs landed in R2 and record the files](https://docs.pixglory.com/api-reference/verify-puts-landed-in-r2-and-record-the-files.md): Requires files:["write"]. Same per-class project resolution as POST /uploads (projectId). Idempotent per path. Every requested path comes back with its canonical public URL — the ONLY URL form the plugin should persist. - [Presign a PUT to overwrite an existing file's bytes in place](https://docs.pixglory.com/api-reference/presign-a-put-to-overwrite-an-existing-files-bytes-in-place.md): Requires files:["write"]. Accepts either key class — unlike upload, replace addresses an EXISTING file by id, so it takes no projectId: a wordpress key's fileId must belong to its bound project (404 otherwise); an api-class key (unbound by design) may touch any file in its own org. Same id, same r2K… - [Verify the replacement PUT landed and finalize it](https://docs.pixglory.com/api-reference/verify-the-replacement-put-landed-and-finalize-it.md): Requires files:["write"]. Same per-class file-access resolution as POST .../replace, no body. Storage usage adjusts by the DELTA. The public URL and fileId never change. ## OpenAPI Specs - [openapi](https://docs.pixglory.com/api/openapi.json)