{"success":true,"data":{"service":"cnf-api","version":"2.0.0","base_url":"https://api.c.nf","docs_html":"https://api.c.nf/v1/docs","openapi":"https://api.c.nf/v1/openapi.json","agents":"https://api.c.nf/v1/ai","auth":{"type":"bearer","header":"Authorization: Bearer cnf_<32 hex characters>","issued_at":"https://console.c.nf/account/api","note":"A token acts only for the account that issued it. There is no cross-user or administrative override anywhere in this API."},"scopes":{"dns:read":"Read DNS zones and records.","dns:write":"Claim zones, verify them, and change records.","cred:read":"Read stored credentials.","cred:write":"Store credentials.","files:read":"List and download your files.","files:write":"Upload, edit, and delete your files.","packages:read":"Read your packages and their versions.","packages:write":"Publish, edit, and delete packages.","whois:read":"Look up domain registration data.","cdn:read":"Read CDN settings and traffic for your shared files.","cdn:write":"Change CDN caching and purge the edge.","sms:read":"Read forwarded messages and your forwarder keys.","sms:write":"Create and revoke forwarder keys.","sites:read":"List your static sites.","sites:write":"Deploy and delete static sites.","deploy:read":"List your deployments.","deploy:write":"Enable, disable, and delete deployments.","domain:read":"Read your domain portfolio.","domain:write":"Refresh registration data on your domains.","account:read":"Read your profile and active sessions.","account:write":"Change your display name and revoke your sessions.","*":"Every scope, including scopes added later."},"envelope":{"success":"bool — always present","data":"object — present on success","error":"string — machine-readable code, present on failure","message":"string — human description, present on failure","request_id":"string — req_<16 hex>, present on every response; quote it in support requests"},"errors":{"bad_request":400,"unauthorized":401,"forbidden_scope":403,"forbidden_zone":403,"not_found":404,"method_not_allowed":405,"unprocessable":422,"upstream_error":502},"services":{"public":{"name":"Public utilities","description":"Small dependable endpoints that need no account: time, address, country, exchange rates and hashes.","auth":"none","endpoints":[{"id":"public.time","method":"GET","path":"/v1/public/time","summary":"The current UTC time in ISO 8601, RFC 2822 and Unix form.","aliases":["/time"],"example":"curl https://api.c.nf/v1/public/time"},{"id":"public.timestamp","method":"GET","path":"/v1/public/timestamp","summary":"The current Unix timestamp, in seconds and milliseconds.","aliases":["/timestamp"],"example":"curl https://api.c.nf/v1/public/timestamp"},{"id":"public.ip","method":"GET","path":"/v1/public/ip","summary":"The address this request came from.","aliases":["/ip"],"example":"curl https://api.c.nf/v1/public/ip"},{"id":"public.geo","method":"GET","path":"/v1/public/geo","summary":"The country this request came from, as resolved at the edge.","aliases":["/ip-geolocation"],"example":"curl https://api.c.nf/v1/public/geo"},{"id":"public.fx","method":"GET","path":"/v1/public/fx","summary":"Exchange rates for a base currency, refreshed hourly.","aliases":["/fx/rate"],"params":[{"name":"base","in":"query","type":"string","required":false,"about":"ISO 4217 base currency. Defaults to USD."},{"name":"symbols","in":"query","type":"string","required":false,"about":"Comma-separated ISO 4217 codes to return. Defaults to all."}],"example":"curl \"https://api.c.nf/v1/public/fx?base=EUR&symbols=USD,JPY\""},{"id":"public.hash","method":"GET","path":"/v1/public/hash","summary":"Hash a string with SHA-256 or another supported algorithm.","aliases":["/hash/sha256"],"params":[{"name":"value","in":"query","type":"string","required":true,"about":"The string to hash. Maximum 8192 bytes."},{"name":"algo","in":"query","type":"string","required":false,"about":"One of sha256, sha512, sha1, md5, crc32b. Defaults to sha256."}],"example":"curl \"https://api.c.nf/v1/public/hash?value=hello&algo=sha256\""}]},"account":{"name":"Account","description":"Who a token belongs to, and what it is allowed to do.","auth":"bearer","endpoints":[{"id":"account.me","method":"GET","path":"/v1/account/me","summary":"The account behind the token, its scopes, and the endpoints they open.","scopes":["any"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/account/me"},{"id":"account.sessions.list","method":"GET","path":"/v1/account/sessions","summary":"Every browser session currently signed in to this account.","scopes":["account:read"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/account/sessions"},{"id":"account.sessions.revoke","method":"POST","path":"/v1/account/sessions/revoke","summary":"Sign one session out.","scopes":["account:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The session identifier from /v1/account/sessions."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":9}' https://api.c.nf/v1/account/sessions/revoke"},{"id":"account.sessions.revoke_all","method":"POST","path":"/v1/account/sessions/revoke-all","summary":"Sign every session out.","scopes":["account:write"],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/account/sessions/revoke-all"},{"id":"account.profile.update","method":"POST","path":"/v1/account/profile","summary":"Change your display name.","scopes":["account:write"],"params":[{"name":"field","in":"body","type":"string","required":true,"about":"Only nickname may be changed here."},{"name":"value","in":"body","type":"string","required":true,"about":"The new display name, up to 64 characters."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"field\":\"nickname\",\"value\":\"Ada\"}' https://api.c.nf/v1/account/profile"}]},"dns":{"name":"DNS","description":"Claim a domain, prove you control it, then manage its records.","auth":"bearer","endpoints":[{"id":"dns.zones.list","method":"GET","path":"/v1/dns/zones","summary":"Every zone this account has claimed.","scopes":["dns:read"],"params":[{"name":"status","in":"query","type":"string","required":false,"about":"verified, pending, or all. Defaults to all."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones"},{"id":"dns.zones.claim","method":"POST","path":"/v1/dns/zones","summary":"Claim a zone. An uncontested claim is instant; a contested one gets a TXT challenge.","scopes":["dns:write"],"params":[{"name":"zone","in":"body","type":"string","required":true,"about":"The apex domain to claim, for example example.com."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"zone\":\"example.com\"}' https://api.c.nf/v1/dns/zones"},{"id":"dns.zones.get","method":"GET","path":"/v1/dns/zones/{zone}","summary":"One zone, with its verification instructions if it is still pending.","scopes":["dns:read"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com"},{"id":"dns.zones.verify","method":"POST","path":"/v1/dns/zones/{zone}/verify","summary":"Run the verification lookup and mark the zone verified if it matches.","scopes":["dns:write"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com/verify"},{"id":"dns.zones.unclaim","method":"DELETE","path":"/v1/dns/zones/{zone}","summary":"Release a claim. The records themselves are left alone.","scopes":["dns:write"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."}],"example":"curl -X DELETE -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com"},{"id":"dns.records.list","method":"GET","path":"/v1/dns/zones/{zone}/records","summary":"Every record in a verified zone.","scopes":["dns:read"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."},{"name":"type","in":"query","type":"string","required":false,"about":"Filter by record type, for example A or MX."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com/records"},{"id":"dns.records.create","method":"POST","path":"/v1/dns/zones/{zone}/records","summary":"Add a record to a verified zone.","scopes":["dns:write"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."},{"name":"type","in":"body","type":"string","required":true,"about":"A, AAAA, CNAME, MX, TXT, NS, SRV, CAA."},{"name":"host","in":"body","type":"string","required":false,"about":"Subdomain label. Empty or @ means the apex."},{"name":"value","in":"body","type":"string","required":true,"about":"The record value."},{"name":"ttl","in":"body","type":"integer","required":false,"about":"Seconds. Defaults to 3600."},{"name":"priority","in":"body","type":"integer","required":false,"about":"Required for MX and SRV."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"type\":\"A\",\"host\":\"api\",\"value\":\"192.0.2.10\"}' https://api.c.nf/v1/dns/zones/example.com/records"},{"id":"dns.records.get","method":"GET","path":"/v1/dns/zones/{zone}/records/{id}","summary":"A single record.","scopes":["dns:read"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."},{"name":"id","in":"path","type":"integer","required":true,"about":"The record identifier."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com/records/12345"},{"id":"dns.records.update","method":"PATCH","path":"/v1/dns/zones/{zone}/records/{id}","summary":"Change part of a record; whatever you omit keeps its value.","scopes":["dns:write"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."},{"name":"id","in":"path","type":"integer","required":true,"about":"The record identifier."},{"name":"value","in":"body","type":"string","required":false,"about":"New value."},{"name":"ttl","in":"body","type":"integer","required":false,"about":"New TTL in seconds."},{"name":"priority","in":"body","type":"integer","required":false,"about":"New priority for MX and SRV."}],"example":"curl -X PATCH -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"ttl\":300}' https://api.c.nf/v1/dns/zones/example.com/records/12345"},{"id":"dns.records.delete","method":"DELETE","path":"/v1/dns/zones/{zone}/records/{id}","summary":"Remove a record.","scopes":["dns:write"],"params":[{"name":"zone","in":"path","type":"string","required":true,"about":"The zone apex."},{"name":"id","in":"path","type":"integer","required":true,"about":"The record identifier."}],"example":"curl -X DELETE -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/dns/zones/example.com/records/12345"}]},"cred":{"name":"Credentials","description":"The private credential store behind the credentials tool.","auth":"bearer","endpoints":[{"id":"cred.list","method":"GET","path":"/v1/cred","summary":"Stored credentials, optionally filtered by platform.","scopes":["cred:read","cred:write"],"params":[{"name":"platform","in":"query","type":"string","required":false,"about":"Case-insensitive substring filter on the platform name."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/cred"},{"id":"cred.create","method":"POST","path":"/v1/cred","summary":"Store a credential.","scopes":["cred:write"],"params":[{"name":"platform","in":"body","type":"string","required":true,"about":"Site or service name. Maximum 255 characters."},{"name":"username","in":"body","type":"string","required":true,"about":"Login name. Maximum 255 characters."},{"name":"password","in":"body","type":"string","required":true,"about":"Secret. Maximum 4096 characters."},{"name":"email","in":"body","type":"string","required":false,"about":"Defaults to the username."},{"name":"remarks","in":"body","type":"string","required":false,"about":"Free-text note. Maximum 2000 characters."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"platform\":\"example.com\",\"username\":\"me\",\"password\":\"s3cret\"}' https://api.c.nf/v1/cred"}]},"files":{"name":"Files","description":"Personal file storage: list, upload, edit, share and delete.","auth":"bearer","endpoints":[{"id":"files.list","method":"GET","path":"/v1/files","summary":"Your stored files, newest first.","scopes":["files:read","files:write"],"params":[{"name":"category","in":"query","type":"string","required":false,"about":"Filter by category."},{"name":"visibility","in":"query","type":"string","required":false,"about":"private or unlisted."},{"name":"limit","in":"query","type":"integer","required":false,"about":"1 to 500. Defaults to 100."},{"name":"offset","in":"query","type":"integer","required":false,"about":"Rows to skip. Defaults to 0."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/files"},{"id":"files.get","method":"GET","path":"/v1/files/{id}","summary":"One file, including its share link if it has one.","scopes":["files:read","files:write"],"params":[{"name":"id","in":"path","type":"integer","required":true,"about":"The file identifier."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/files/42"},{"id":"files.download","method":"GET","path":"/v1/files/download","summary":"Download a file.","scopes":["files:read","files:write"],"params":[{"name":"id","in":"query","type":"integer","required":true,"about":"The file identifier."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" -O -J \"https://api.c.nf/v1/files/download?id=42\""},{"id":"files.upload","method":"POST","path":"/v1/files/upload","summary":"Upload a file.","scopes":["files:write"],"encoding":"multipart/form-data","params":[{"name":"file","in":"form","type":"file","required":true,"about":"The file part. Size is capped per account."},{"name":"category","in":"form","type":"string","required":false,"about":"Optional grouping label."},{"name":"description","in":"form","type":"string","required":false,"about":"Optional description."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -F file=@./report.pdf https://api.c.nf/v1/files/upload"},{"id":"files.update","method":"POST","path":"/v1/files/update","summary":"Edit a file’s details, including whether it is shared.","scopes":["files:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The file identifier."},{"name":"display_name","in":"body","type":"string","required":false,"about":"Shown in the console and on share pages."},{"name":"original_name","in":"body","type":"string","required":false,"about":"Filename offered on download."},{"name":"description","in":"body","type":"string","required":false,"about":"Free-text description."},{"name":"category","in":"body","type":"string","required":false,"about":"Grouping label."},{"name":"visibility","in":"body","type":"string","required":false,"about":"private or unlisted. Switching to unlisted mints a share token."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":42,\"visibility\":\"unlisted\"}' https://api.c.nf/v1/files/update"},{"id":"files.rename","method":"POST","path":"/v1/files/rename","summary":"Change the name a file downloads as.","scopes":["files:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The file identifier."},{"name":"original_name","in":"body","type":"string","required":true,"about":"New name. No slashes. Maximum 255 characters."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":42,\"original_name\":\"q3-report.pdf\"}' https://api.c.nf/v1/files/rename"},{"id":"files.delete","method":"POST","path":"/v1/files/delete","summary":"Delete a file and its contents.","scopes":["files:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The file identifier."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":42}' https://api.c.nf/v1/files/delete"},{"id":"files.upload_chunk","method":"POST","path":"/v1/files/upload-chunk","summary":"Send one part of a large upload.","scopes":["files:write"],"encoding":"multipart/form-data","params":[{"name":"chunk","in":"form","type":"file","required":true,"about":"One part of the file, up to about 50 MB."},{"name":"index","in":"form","type":"integer","required":true,"about":"Zero-based part number."},{"name":"total","in":"form","type":"integer","required":true,"about":"How many parts there are, 1 to 400."},{"name":"filename","in":"form","type":"string","required":false,"about":"Required on the first part."},{"name":"id","in":"form","type":"string","required":false,"about":"Upload session id; omit on the first part and reuse what comes back."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -F index=0 -F total=3 -F filename=big.zip -F chunk=@part0 https://api.c.nf/v1/files/upload-chunk"},{"id":"files.upload_finalize","method":"POST","path":"/v1/files/upload-finalize","summary":"Assemble the parts into a file.","scopes":["files:write"],"params":[{"name":"id","in":"body","type":"string","required":true,"about":"The upload session id."},{"name":"display_name","in":"body","type":"string","required":false,"about":"Label shown in the console."},{"name":"description","in":"body","type":"string","required":false,"about":"Free-text description."},{"name":"category","in":"body","type":"string","required":false,"about":"Grouping label."},{"name":"visibility","in":"body","type":"string","required":false,"about":"private or unlisted."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":\"u_abc123\"}' https://api.c.nf/v1/files/upload-finalize"}]},"cdn":{"name":"CDN","description":"Edge caching and traffic for the files you share.","auth":"bearer","endpoints":[{"id":"cdn.stats","method":"GET","path":"/v1/cdn/stats","summary":"Cache settings and request counts for your shared files.","scopes":["cdn:read"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/cdn/stats"},{"id":"cdn.config","method":"POST","path":"/v1/cdn/config","summary":"Set how long the edge keeps a file, or stop serving it.","scopes":["cdn:write"],"params":[{"name":"file_id","in":"body","type":"integer","required":true,"about":"One of your files, shared as unlisted."},{"name":"ttl","in":"body","type":"integer","required":false,"about":"Edge cache lifetime in seconds, 0 to 31536000."},{"name":"enabled","in":"body","type":"integer","required":false,"about":"1 to serve through the CDN, 0 to stop."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"file_id\":42,\"ttl\":3600}' https://api.c.nf/v1/cdn/config"},{"id":"cdn.purge","method":"POST","path":"/v1/cdn/purge","summary":"Drop a file from the edge cache now.","scopes":["cdn:write"],"params":[{"name":"file_id","in":"body","type":"integer","required":true,"about":"One of your files."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"file_id\":42}' https://api.c.nf/v1/cdn/purge"}]},"sms":{"name":"SMS forwarder","description":"Messages relayed from your phone, and the keys that let it in.","auth":"bearer","endpoints":[{"id":"sms.messages","method":"GET","path":"/v1/sms/messages","summary":"Messages forwarded to your account.","scopes":["sms:read"],"params":[{"name":"since","in":"query","type":"integer","required":false,"about":"Return only messages with an id above this one."},{"name":"limit","in":"query","type":"integer","required":false,"about":"How many to return."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/sms/messages"},{"id":"sms.keys.list","method":"GET","path":"/v1/sms/keys","summary":"The forwarder keys your devices use.","scopes":["sms:read","sms:write"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/sms/keys"},{"id":"sms.keys.create","method":"POST","path":"/v1/sms/keys","summary":"Issue a forwarder key. Five at a time.","scopes":["sms:write"],"params":[{"name":"name","in":"body","type":"string","required":false,"about":"A label for the device. Five keys maximum."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"name\":\"pixel\"}' https://api.c.nf/v1/sms/keys"},{"id":"sms.keys.revoke","method":"DELETE","path":"/v1/sms/keys","summary":"Revoke a forwarder key.","scopes":["sms:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The forwarder key identifier."}],"example":"curl -X DELETE -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":3}' https://api.c.nf/v1/sms/keys"}]},"sites":{"name":"Static sites","description":"Upload a zip, serve a site.","auth":"bearer","endpoints":[{"id":"sites.list","method":"GET","path":"/v1/sites","summary":"Your static sites, most recently deployed first.","scopes":["sites:read","sites:write"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/sites"},{"id":"sites.deploy","method":"POST","path":"/v1/sites/deploy","summary":"Deploy a zip as a site.","scopes":["sites:write"],"encoding":"multipart/form-data","params":[{"name":"file","in":"form","type":"file","required":true,"about":"A zip of the site, up to 50 MB. It is expanded into your storage."},{"name":"slug","in":"form","type":"string","required":true,"about":"3 to 63 lowercase letters, digits or hyphens. Unique across all accounts."},{"name":"name","in":"form","type":"string","required":true,"about":"Display name, up to 128 characters."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -F file=@./site.zip -F slug=docs -F name=Docs https://api.c.nf/v1/sites/deploy"},{"id":"sites.delete","method":"POST","path":"/v1/sites/delete","summary":"Delete a site and its files.","scopes":["sites:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The site identifier."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":4}' https://api.c.nf/v1/sites/delete"}]},"deploy":{"name":"Deployments","description":"The form, webhook and shortlink endpoints you have deployed.","auth":"bearer","endpoints":[{"id":"deploy.list","method":"GET","path":"/v1/deployments","summary":"Your deployments and how often each has been used.","scopes":["deploy:read","deploy:write"],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/deployments"},{"id":"deploy.toggle","method":"POST","path":"/v1/deployments/toggle","summary":"Enable or disable a deployment.","scopes":["deploy:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The deployment identifier."},{"name":"enabled","in":"body","type":"integer","required":true,"about":"1 to enable, 0 to disable."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":7,\"enabled\":0}' https://api.c.nf/v1/deployments/toggle"},{"id":"deploy.delete","method":"POST","path":"/v1/deployments/delete","summary":"Delete a deployment.","scopes":["deploy:write"],"params":[{"name":"id","in":"body","type":"integer","required":true,"about":"The deployment identifier."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"id\":7}' https://api.c.nf/v1/deployments/delete"}]},"domain":{"name":"Domains","description":"Your domain portfolio and its registration data.","auth":"bearer","endpoints":[{"id":"domain.list","method":"GET","path":"/v1/domains","summary":"Your domains, soonest to expire first.","scopes":["domain:read","domain:write"],"params":[{"name":"status","in":"query","type":"string","required":false,"about":"Filter by status, for example active."},{"name":"expiring","in":"query","type":"integer","required":false,"about":"Only domains expiring within this many days."},{"name":"limit","in":"query","type":"integer","required":false,"about":"1 to 1000. Defaults to 200."},{"name":"offset","in":"query","type":"integer","required":false,"about":"Rows to skip."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" \"https://api.c.nf/v1/domains?expiring=30\""},{"id":"domain.whois_sync","method":"POST","path":"/v1/domains/whois-sync","summary":"Refresh one domain from its registry record.","scopes":["domain:write"],"params":[{"name":"udid","in":"body","type":"string","required":true,"about":"The portfolio identifier of one of your domains."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"udid\":\"d_0a1b2c\"}' https://api.c.nf/v1/domains/whois-sync"}]},"packages":{"name":"Packages","description":"Publish releases and read back their versions and download counts.","auth":"bearer","endpoints":[{"id":"packages.list","method":"GET","path":"/v1/packages","summary":"Your packages, with version counts and download totals.","scopes":["packages:read","packages:write"],"params":[{"name":"visibility","in":"query","type":"string","required":false,"about":"public, unlisted, or private."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/packages"},{"id":"packages.get","method":"GET","path":"/v1/packages/{slug}","summary":"One package, with every version and artifact.","scopes":["packages:read","packages:write"],"params":[{"name":"slug","in":"path","type":"string","required":true,"about":"The package slug."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" https://api.c.nf/v1/packages/my-tool"},{"id":"packages.publish","method":"POST","path":"/v1/packages/publish","summary":"Publish a version, creating the package if it is new.","scopes":["packages:write"],"encoding":"multipart/form-data","params":[{"name":"slug","in":"form","type":"string","required":true,"about":"URL-safe identifier, unique within the account."},{"name":"version","in":"form","type":"string","required":true,"about":"Version string, for example 1.2.0."},{"name":"file","in":"form","type":"file","required":true,"about":"The artifact to publish."},{"name":"name","in":"form","type":"string","required":false,"about":"Display name. Defaults to the slug."},{"name":"description","in":"form","type":"string","required":false,"about":"Short description."},{"name":"category","in":"form","type":"string","required":false,"about":"Grouping label."},{"name":"visibility","in":"form","type":"string","required":false,"about":"public, unlisted, or private."},{"name":"changelog","in":"form","type":"string","required":false,"about":"Notes for this version."},{"name":"label","in":"form","type":"string","required":false,"about":"Artifact label when a version has several files."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -F slug=my-tool -F version=1.2.0 -F file=@./my-tool-1.2.0.zip https://api.c.nf/v1/packages/publish"},{"id":"packages.update","method":"POST","path":"/v1/packages/update","summary":"Edit a package’s details.","scopes":["packages:write"],"params":[{"name":"slug","in":"body","type":"string","required":true,"about":"The package slug. The slug itself cannot be changed."},{"name":"name","in":"body","type":"string","required":false,"about":"Display name."},{"name":"description","in":"body","type":"string","required":false,"about":"Short description."},{"name":"category","in":"body","type":"string","required":false,"about":"Grouping label."},{"name":"icon","in":"body","type":"string","required":false,"about":"Icon identifier."},{"name":"visibility","in":"body","type":"string","required":false,"about":"public, unlisted, or private."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"slug\":\"my-tool\",\"visibility\":\"public\"}' https://api.c.nf/v1/packages/update"},{"id":"packages.delete","method":"POST","path":"/v1/packages/delete","summary":"Delete a package, every version and every artifact.","scopes":["packages:write"],"params":[{"name":"slug","in":"body","type":"string","required":true,"about":"The package slug."}],"example":"curl -X POST -H \"Authorization: Bearer $CNF_TOKEN\" -d '{\"slug\":\"my-tool\"}' https://api.c.nf/v1/packages/delete"}]},"whois":{"name":"WHOIS","description":"Registration data for a domain, cached and shared with the domain tools.","auth":"bearer","endpoints":[{"id":"whois.lookup","method":"GET","path":"/v1/whois","summary":"Registration details for a domain.","scopes":["whois:read"],"params":[{"name":"domain","in":"query","type":"string","required":true,"about":"The domain to look up. Unicode domains are punycoded for you."}],"example":"curl -H \"Authorization: Bearer $CNF_TOKEN\" \"https://api.c.nf/v1/whois?domain=example.com\""}]}},"isolation":"Every operation is scoped strictly to the API key's owning user. There is no cross-user or administrative override on this API.","not_exposed":{"account/api-keys.php":"Minting API keys with an API key is privilege escalation: a token holding one narrow scope could issue itself a token holding every scope. Keys come from a signed-in session only.","account/passkey-delete.php":"Removing an authentication factor is not something a long-lived bearer credential should be able to do.","account/passkey-rename.php":"Same surface as passkey deletion; kept behind the session for the same reason.","admin/redirects.php":"Platform administration, not account data.","admin/seo-settings.php":"Platform administration, not account data.","admin/seo-overrides.php":"Platform administration, not account data.","admin/seo-sitemap-status.php":"Platform administration, not account data.","admin/seo-indexnow-ping.php":"Platform administration, not account data.","dns/admin-claims.php":"Reads other accounts' zone claims. This API has no cross-user surface at all, and adding one for administrators would make that claim untrue.","dns/admin-status.php":"Cross-user administration; see dns/admin-claims.","dns/zone-approve.php":"Approves another account's zone claim.","downloads/item-add.php":"Publishes to the public download catalogue on d.c.nf.","downloads/item-update.php":"Publishes to the public download catalogue on d.c.nf.","downloads/item-patch.php":"Publishes to the public download catalogue on d.c.nf.","downloads/item-delete.php":"Publishes to the public download catalogue on d.c.nf.","downloads/upload.php":"Publishes to the public download catalogue on d.c.nf.","downloads/upload-chunk.php":"Publishes to the public download catalogue on d.c.nf.","downloads/upload-finalize.php":"Publishes to the public download catalogue on d.c.nf.","downloads/upload-status.php":"Publishes to the public download catalogue on d.c.nf.","downloads/files-scan.php":"Lists the server filesystem under the download root.","deploy-recv/webhook.php":"A public receiver for deployed endpoints, authenticated by its own deployment token. Not account API.","deploy-recv/form.php":"Public receiver; see deploy-recv/webhook.","deploy-recv/shortlink.php":"Public receiver; see deploy-recv/webhook.","files/shared.php":"Serves a file to anyone holding its share token. That is already published at cdn.c.nf and needs no key.","whois/client.php":"A library, not an endpoint.","domain/registrar-map.php":"Writes registrar_map, which has no owner column: it is one table shared by every account's domain tool. A token editing it would be changing other people's data, and this API has no shared-state writes anywhere else. The per-domain registrar name and URL come back from GET /v1/domains instead."}},"request_id":"req_cfad7bf66a9c1eba"}