Cloudflare
Let hires read and change DNS records, clear the cache, check traffic, and see Workers and Pages deployments, on the zones you choose.
Explore 11 actions and their permissionsExact inputs, sign-in scopes, access limits and approval rules.
With Cloudflare, a hire can:
- list your zones (domains) and their DNS records,
- add, change and delete DNS records,
- clear the cache for some URLs, hostnames, prefixes or tags, or for a whole zone,
- see a zone's traffic over the last day, 3 days, week or 30 days: requests, how much came from the cache, bandwidth, threats and page views, day by day,
- list Workers and their recent deployments, and Pages projects and their deployments (branch, commit, status).
It never sees your Pages projects' environment variables.
1. Make an API token in Cloudflare
The quickest way: open this token template. It has the permissions below already ticked: limit Zone Resources to the zones hires work on, untick what they don't need, then Continue to summary → Create Token.
- In Cloudflare, open My Profile → API Tokens and click Create Token, then Create
Custom Token. Name it
Roster. - Give it only what hires need:
- Zone → Zone → Read, and Zone → Analytics → Read for traffic,
- Zone → DNS → Read (or Edit, for hires that change records),
- Zone → Cache Purge → Purge, for hires that clear the cache,
- Account → Workers Scripts → Read and Account → Cloudflare Pages → Read, for deployments.
- Under Zone Resources, pick only the zones hires work on.
- Create it and copy the token.
2. Connect it in Roster
- Open Integrations → Tools → Add a tool, search for Cloudflare and choose it.
- API token: paste the token.
- Account ID (only for Workers and Pages, and only if the token reaches more than one account): from your account's home page in Cloudflare.
- Click Connect.
Roster checks the key when you click Connect. Once it's accepted, the connection shows Connected as the Cloudflare account the token reaches, and how many zones. If it's refused, Roster says what to fix (a mistyped key, a missing permission) and saves nothing.
3. Give hires access
On the hire's Tools tab, click Give access on Cloudflare:
- Read only: zones, DNS records, traffic, Workers and Pages.
- Read and write: also add, change and delete DNS records, and clear the cache.
- Zones: domains like
example.com, one per line. Every DNS change, cache clear and traffic report is for one of these, and a record's name can't leave its zone (wwwmeanswww.example.com). Leave it empty for every zone the token reaches. - Workers and Pages projects: their names, one per line. Leave it empty for all.
Changes that are hard to take back
Deleting a DNS record makes whatever used that name stop working, and clearing a whole zone's cache sends every visitor to your servers at once. Both wait for a person's approval: the hire asks in the thread ("Delete the A record www.example.com"), and when the approver says yes, Roster does exactly that, once. Adding and changing records, and clearing the cache for some URLs, go ahead without asking; to change that for a hire, use When it asks first on its Tools tab.
If something goes wrong
- "Didn't accept the connection's credential": the token was deleted or has expired.
- "Unauthorized to access requested resource": the token lacks a permission (often DNS Edit or Cache Purge), or doesn't cover that zone.
- "Someone needs to set the Account ID": the token reaches several accounts; add the one to use on the connection.
Tools and permissions reference
This reference is built from the same definitions Roster uses to connect Cloudflare and give hires access. It updates with each release.
Authentication and requested permissions
The account or app you connect sets the outer limit. Each hire's access can narrow it further. Connecting a tool gives it to no hire until you give access on that hire's Tools tab.
API key or access token
In Cloudflare: My Profile → API Tokens → Create Token, with only the permissions hires need, for only the zones they work on.
When making a key, use these permissions from the connection guide:
- Zone: Read
- DNS: Edit
- Cache Purge: Purge
- Analytics: Read
- Workers Scripts: Read
- Cloudflare Pages: Read
Connection fields
| Field | What to provide |
|---|---|
API tokentokenRequired · sealed secret | In Cloudflare: My Profile → API Tokens → Create Token, with only the permissions hires need, for only the zones they work on. |
Account IDaccountIdOptional | For Workers and Pages: from the dashboard's account home (Account ID). Leave empty when the token reaches one account. |
Per-hire limits
Read-only hires receive only actions that read. Read-and-write access also allows actions that change things, where the connection itself permits them. An empty resource allowlist usually means everything the connected account can reach; each field below explains its meaning.
| Field | What to provide |
|---|---|
ZoneszonesOptional | Domains (zones) like example.com, or zone IDs, one per line. Leave empty for every zone the token reaches. |
Workers and Pages projectsprojectsOptional | Worker and Pages project names, one per line. Leave empty for all. |
Actions
11 actions: 7 only read and 4 change something. A read action may still need approval when your workspace or hire is set to ask. A locked approval requirement always applies.
11 of 11 actions. Open an action for its arguments and full input schema.
list_zonesRead only
The zones (domains) this hire can work on.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}list_dns_recordsRead only
A zone's DNS records, optionally of one type or with part of a name.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
typeOptional | "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "SRV" | "CAA" | "PTR" | "HTTPS" | "SVCB" | See input schema below. |
nameOptional | string | part of the record's name |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"type": {
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"NS",
"SRV",
"CAA",
"PTR",
"HTTPS",
"SVCB"
]
},
"name": {
"description": "part of the record's name",
"type": "string",
"maxLength": 253
}
},
"required": [
"zone"
]
}create_dns_recordRead and write
Add a DNS record. Names may be short ("www", "@" for the zone itself). Proxied (orange cloud) only for A, AAAA and CNAME.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
typeRequired | "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | See input schema below. |
nameRequired | string | See input schema below. |
contentRequired | string | the address, target or text |
ttlOptional | integer | See input schema below.Default: 1 |
proxiedOptional | boolean | See input schema below.Default: false |
priorityOptional | integer | for MX |
commentOptional | string | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"type": {
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"NS"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 253
},
"content": {
"type": "string",
"minLength": 1,
"maxLength": 4096,
"description": "the address, target or text"
},
"ttl": {
"default": 1,
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"proxied": {
"default": false,
"type": "boolean"
},
"priority": {
"description": "for MX",
"type": "integer",
"minimum": 0,
"maximum": 65535
},
"comment": {
"type": "string",
"maxLength": 100
}
},
"required": [
"zone",
"type",
"name",
"content"
]
}update_dns_recordRead and write
Change a DNS record's content, TTL, proxying or comment (by its ID from list_dns_records).
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
recordRequired | string | See input schema below. |
contentOptional | string | See input schema below. |
ttlOptional | integer | See input schema below. |
proxiedOptional | boolean | See input schema below. |
commentOptional | string | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"record": {
"type": "string",
"pattern": "^[a-f0-9]{32}$"
},
"content": {
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"ttl": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"proxied": {
"type": "boolean"
},
"comment": {
"type": "string",
"maxLength": 100
}
},
"required": [
"zone",
"record"
]
}delete_dns_recordRead and write
Delete a DNS record (by its ID and name from list_dns_records). Whatever used that name stops resolving. It waits for a person's approval: Roster asks in the thread and deletes it, once, when they approve.
Approval: Always asks for approval.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
recordRequired | string | See input schema below. |
nameRequired | string | the record's name, as list_dns_records shows it; checked |
typeRequired | "A" | "AAAA" | "CNAME" | "TXT" | "MX" | "NS" | "SRV" | "CAA" | "PTR" | "HTTPS" | "SVCB" | the record's type; checked |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"record": {
"type": "string",
"pattern": "^[a-f0-9]{32}$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the record's name, as list_dns_records shows it; checked"
},
"type": {
"type": "string",
"enum": [
"A",
"AAAA",
"CNAME",
"TXT",
"MX",
"NS",
"SRV",
"CAA",
"PTR",
"HTTPS",
"SVCB"
],
"description": "the record's type; checked"
}
},
"required": [
"zone",
"record",
"name",
"type"
]
}purge_cacheRead and write
Clear Cloudflare's cache for some URLs (up to 100), hostnames, URL prefixes or cache tags in a zone. Purging everything makes every visitor hit your servers at once: only when asked to.
Approval: when it clears a whole zone's cache.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
urlsOptional | string[] | See input schema below.Default: [] |
hostsOptional | string[] | See input schema below.Default: [] |
prefixesOptional | string[] | like www.example.com/images, without https://Default: [] |
tagsOptional | string[] | See input schema below.Default: [] |
everythingOptional | boolean | See input schema below.Default: false |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"urls": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"hosts": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
},
"prefixes": {
"default": [],
"description": "like www.example.com/images, without https://",
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"maxLength": 1024
}
},
"tags": {
"default": [],
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"maxLength": 1024
}
},
"everything": {
"default": false,
"type": "boolean"
}
},
"required": [
"zone"
]
}zone_analyticsRead only
A zone's traffic over the last hours or days: requests, how much came from cache, bandwidth, threats and page views, per day.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
zoneRequired | string | the zone, e.g. example.com |
periodOptional | "24h" | "3d" | "7d" | "30d" | See input schema below.Default: "24h" |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"zone": {
"type": "string",
"minLength": 1,
"maxLength": 253,
"description": "the zone, e.g. example.com"
},
"period": {
"default": "24h",
"type": "string",
"enum": [
"24h",
"3d",
"7d",
"30d"
]
}
},
"required": [
"zone"
]
}list_workersRead only
The account's Workers, with when each was last changed.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}list_worker_deploymentsRead only
A Worker's recent deployments: when, by whom, which versions at what share, and the message.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
workerRequired | string | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"worker": {
"type": "string",
"pattern": "^[a-z0-9_-]{1,63}$"
}
},
"required": [
"worker"
]
}list_pages_projectsRead only
The account's Pages projects, with their domains and production branch.
Approval: Uses your workspace and hire approval settings.
This action takes no arguments.
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}list_pages_deploymentsRead only
A Pages project's recent deployments: environment, status, branch and commit.
Approval: Uses your workspace and hire approval settings.
| Argument | Type | Details |
|---|---|---|
projectRequired | string | See input schema below. |
environmentOptional | "production" | "preview" | See input schema below. |
Full input schema (JSON)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"project": {
"type": "string",
"pattern": "^[a-z0-9_-]{1,63}$"
},
"environment": {
"type": "string",
"enum": [
"production",
"preview"
]
}
},
"required": [
"project"
]
}Watches and incoming events
- No built-in watch is declared. Give a hire a scheduled responsibility if it should check this service regularly.
- No incoming webhook handler is declared for this integration.
Limits and troubleshooting
- Permission errors: check both the connected account's rights and the hire's resource and read/write limits.
- Expired or revoked access: reconnect or replace the key on the connection.
- Rate limits and unavailable services can interrupt work. The hire's timecard records the outcome.
- The action schema describes accepted inputs. It does not grant additional access or bypass approvals.