CDN endpoints and URL signing keys
A CDN endpoint is the stable delivery identity for one environment, site, or customer. Its URL namespace is safe to embed because it is not a secret:Manage endpoints and signing keys
cvly_... API key. WordPress site keys cannot create, list, or revoke workspace URL signing keys.
The full signing key secret is returned only when a key is created.
What is secure, and what is public
For a signed request, Convertly canonicalizes the endpoint, asset identifier, and every transform parameter, then verifies an HMAC signature using the active key identified by
kid. Changing the file, width, quality, expiry, or any other signed parameter invalidates the URL. If exp is present, the edge rejects the URL after that Unix timestamp.
Signing-key secrets are shown once and stored as hashes. The edge receives active key IDs, not plaintext customer keys. Revoking a key removes it from the endpoint’s active key set after the short authorization-cache window. New signed URLs include kid, so old and new keys can overlap safely during rotation.
Endpoint URLs
The URL namespace is a short prefix (marketing, site, products) in the endpoint URL:
- Set when creating a CDN endpoint (3-63 chars, lowercase,
[a-z0-9_-], globally unique) - Checked with
GET /api/delivery-keys/alias?alias=...before you commit. The endpoint name is kept for backward compatibility. - Compatible with custom domains, signed URLs, and CDN slugs
Custom domains
When you use a custom CDN hostname, the hostname maps to one CDN endpoint, so its URL namespace does not need to appear in the URL:Rotating a signing key
URL signing keys can be rotated without downtime. Create a new key for the same endpoint, update your backend signing configuration, then revoke the old one. Newly signed URLs includekid, allowing old and new keys to overlap safely while the endpoint URL remains stable.
Delivery access modes
Each CDN endpoint has an access policy. The CDN enforces it on every request.
When mode is
signed or private, embed URLs only after your backend signs them with a URL signing key. Unsigned requests return:
public endpoint. Member-only or paid assets should use signed/private plus POST /api/delivery-keys/{id}/sign or your SDK signing helper.
Forma AI transforms (upscale=ai, bgReplace, etc.) already require signed URLs on every endpoint when those parameters are present. See AI & ML transforms.
Origin sources
Required before origin-backed CDN URLs work. Any URL containing/o/{slug}/ tells Convertly to fetch from a source you registered here. The SDK and Next.js loader only rewrite paths to that shape - they do not create origins for you.
Typical setups:
Each external host must be registered separately. Convertly does not offer open per-request remote URL fetch (unlike some competitors); origins are workspace-scoped for security.
Add sources from Image CDN -> Sources in the dashboard (or
POST /api/cdn-origins).
Private credentials are encrypted at rest and never returned by the API. Rotate credentials by updating the origin source with new keys.
For public origins, Convertly does not fetch
localhost, 127.0.0.1, private IP ranges, or non-HTTPS URLs. That keeps the CDN from becoming a private-network proxy.
Private Google Cloud Storage
Private Azure Blob Storage
s3 (AWS S3, R2, Wasabi, Linode, any S3-compatible endpoint), gcs, and azure. See Origin deliverability if fetches fail or time out.
Purging the edge cache
When you change a file’s underlying bytes in place (rare — see Replacing a file for the recommended pattern) and need cached variants evicted immediately, call the purge API. You can purge exact URLs or cache tags.Purge by URL
Purge by cache tag
CDN responses include aCache-Tag header with tags Convertly assigns automatically. Purge every cached variant for an asset or origin without listing every query string:
You can pass URLs and tags in the same request (up to 30 of each). Tag values must match the
Cache-Tag header on CDN responses exactly.
Purge notes
- Use your server-side
cvly_...API key, not a CDN signing key. Purging is a workspace mutation. - URL purge is exact-match:
?w=1200and?w=600are separate entries. - Tag purge evicts all width/format/gravity variants that share the tag — best when you overwrite a file in place or bulk-refresh an origin.
- Up to 30 URLs or 30 tags per request. Send multiple requests for more.
- Purges complete in seconds globally.
503, retry later or use the file-id versioning pattern below instead.
Analytics
The dashboard includes Image CDN -> Analytics for month-to-date delivery monitoring. It shows:- Origin requests used against your plan allowance
- Total edge deliveries, including cache hits, against the safety ceiling
- Data delivered through the image CDN edge against the safety ceiling
- Daily request trends for the current billing month
- Recent 24-hour activity
- Active CDN endpoints, origins, and custom domains
Replacing a file
URLs are immutable for a year by design. That enables high cache hit ratios. Practical implications when you need to update an image:- Upload the new version as a separate file (which gets its own
fileId), then update your markup to point at the new id. The old URL keeps serving the old bytes from CDN cache until it eventually expires, and the new one is fresh from day one. - Overwriting a file in place will not refresh cached URLs. Caches that already have the old bytes will keep serving them until edge eviction or the year-long TTL expires. Use the purge API if you need immediate invalidation.
Security model
- CDN endpoint URL namespaces are globally unique public routing identifiers assigned to one endpoint. They are not secrets.
- Access modes (
public,signed,private) control whether unsigned CDN URLs are accepted — see Delivery access modes. - URL signing keys are revocable credentials. Revoking one stops URLs signed with it after the short edge authorization cache expires.
- Storage-backed CDN URLs can use generated filename slugs or UUIDs. UUID URLs remain valid, and slugs are public identifiers. Anyone who sees a URL can request that asset at allowed transform sizes on a
publicendpoint. - For gated content, use Signed URLs on a
signedorprivateendpoint. A signed URL covers the endpoint path, file ID, and every parameter. Any tampering invalidates the signature and returns403. - The endpoint never reveals file lists, account identifiers, or any internal storage path.
- URL signing keys can overlap during rotation without changing endpoint URLs.
Local development
Public origin sources must be reachable over public HTTPS. Convertly does not fetchlocalhost, 127.0.0.1, or private IP ranges through the public-URL path.
Private origin sources do not require a public bucket URL. Credentials are used server-side only.
For framework loaders, use a local passthrough option while running your app locally so public-folder assets render from your dev server. Those local requests are not transformed by Convertly. To test the real optimized path before production, use a public preview deployment as the origin source, or temporarily expose your local server through an HTTPS tunnel and point the origin source at that tunnel URL.