Workers
16 functions
Scripts
GET
ListWorkersAsync
List all Workers in account
Signature
Task<CloudflareResponse<List<WorkerScript>>> ListWorkersAsync()
Example
var result = await cf.ListWorkersAsync();
foreach (var w in result!.Result!)
Console.WriteLine($"{w.Id} — {w.UsageModel}");
GET
GetWorkerScriptAsync
Download raw script content
Signature
Task<string> GetWorkerScriptAsync(
string scriptName)
Example
string js = await cf.GetWorkerScriptAsync("worker-admin");
Console.WriteLine(js[..200]);
PUT
UploadWorkerAsync
Deploy or replace a Worker
Signature
Task<CloudflareResponse<WorkerScript>> UploadWorkerAsync(
string scriptName,
string scriptContent)
Example
string code = "export default { async fetch(req) { return new Response('ok'); } }";
var result = await cf.UploadWorkerAsync("worker-admin", code);
Console.WriteLine(result!.Result!.Etag);
DELETE
DeleteWorkerAsync
Permanently delete a Worker
Signature
Task DeleteWorkerAsync(
string scriptName)
Example
await cf.DeleteWorkerAsync("worker-old");
Console.WriteLine("Deleted.");
GET
GetWorkerSettingsAsync
Get bindings, compat date, usage model
Signature
Task<CloudflareResponse<JsonElement>> GetWorkerSettingsAsync(
string scriptName)
Example
var s = await cf.GetWorkerSettingsAsync("worker-admin");
Console.WriteLine(s!.Result.GetRawText());
PATCH
UpdateWorkerSettingsAsync
Update settings without re-uploading code
Signature
Task<CloudflareResponse<JsonElement>> UpdateWorkerSettingsAsync(
string scriptName,
object settings)
Example
var settings = new { logpush = true, usage_model = "standard" };
await cf.UpdateWorkerSettingsAsync("worker-admin", settings);
GET
ListWorkerVersionsAsync
List all uploaded versions
Signature
Task<CloudflareResponse<List<JsonElement>>> ListWorkerVersionsAsync(
string scriptName)
Example
var v = await cf.ListWorkerVersionsAsync("worker-admin");
Console.WriteLine($"{v!.Result!.Count} versions");
Routes
GET
ListRoutesAsync
List all routes for a zone
Signature
Task<CloudflareResponse<List<WorkerRoute>>> ListRoutesAsync(
string zoneId)
Example
var routes = await cf.ListRoutesAsync("zone-id");
foreach (var r in routes!.Result!)
Console.WriteLine($"{r.Pattern} → {r.Script}");
POST
CreateRouteAsync
Bind a URL pattern to a Worker
Signature
Task<CloudflareResponse<WorkerRoute>> CreateRouteAsync(
string zoneId,
string pattern,
string scriptName)
Example
var r = await cf.CreateRouteAsync("zone-id", "example.com/api/*", "worker-proxy");
Console.WriteLine($"Created route {r!.Result!.Id}");
PUT
UpdateRouteAsync
Change route pattern or Worker
Signature
Task<CloudflareResponse<WorkerRoute>> UpdateRouteAsync(
string zoneId,
string routeId,
string pattern,
string scriptName)
Example
await cf.UpdateRouteAsync("zone-id", "route-id", "example.com/v2/*", "worker-proxy");
DELETE
DeleteRouteAsync
Remove a route binding
Signature
Task DeleteRouteAsync(
string zoneId,
string routeId)
Example
await cf.DeleteRouteAsync("zone-id", "route-id");
Cron Triggers
GET
ListCronTriggersAsync
Get cron schedules for a Worker
Signature
Task<CloudflareResponse<JsonElement>> ListCronTriggersAsync(
string scriptName)
Example
var cron = await cf.ListCronTriggersAsync("worker-admin");
Console.WriteLine(cron!.Result.GetRawText());
PUT
UpdateCronTriggersAsync
Replace all cron triggers
Signature
Task<CloudflareResponse<JsonElement>> UpdateCronTriggersAsync(
string scriptName,
string[] cronExpressions)
Example
await cf.UpdateCronTriggersAsync("worker-admin",
["0 * * * *", "0 0 * * *"]);
Custom Domains
GET
ListCustomDomainsAsync
List custom domains, filter by Worker
Signature
Task<CloudflareResponse<List<JsonElement>>> ListCustomDomainsAsync(
string? workerName = null)
Example
var domains = await cf.ListCustomDomainsAsync("worker-proxy");
Console.WriteLine(domains!.Result!.Count);
PUT
AttachCustomDomainAsync
Attach a hostname to a Worker
Signature
Task<CloudflareResponse<JsonElement>> AttachCustomDomainAsync(
string hostname,
string workerName,
string zoneId)
Example
await cf.AttachCustomDomainAsync(
"api.example.com", "worker-proxy", "zone-id");
DELETE
DeleteCustomDomainAsync
Detach a custom domain
Signature
Task DeleteCustomDomainAsync(
string domainId)
Example
await cf.DeleteCustomDomainAsync("domain-id");
D1 Database
9 functions
Databases
GET
ListD1DatabasesAsync
List all D1 databases
Signature
Task<CloudflareResponse<List<D1Database>>> ListD1DatabasesAsync(
string? nameFilter = null,
int page = 1,
int perPage = 20)
Example
var dbs = await cf.ListD1DatabasesAsync();
foreach (var db in dbs!.Result!)
Console.WriteLine($"{db.Name} — {db.NumTables} tables");
POST
CreateD1DatabaseAsync
Create a new D1 database
Signature
Task<CloudflareResponse<D1Database>> CreateD1DatabaseAsync(
string name,
string? locationHint = null)
Example
var db = await cf.CreateD1DatabaseAsync("my-new-db", "wnam");
Console.WriteLine(db!.Result!.Uuid);
GET
GetD1DatabaseAsync
Get metadata for a D1 database
Signature
Task<CloudflareResponse<D1Database>> GetD1DatabaseAsync(
string databaseId)
Example
var db = await cf.GetD1DatabaseAsync("33da2dc6-9834-44ad-af30-0cefe2652105");
Console.WriteLine($"{db!.Result!.Name}: {db.Result.FileSize} bytes");
GET
GetDefaultD1DatabaseAsync
Get metadata for configured d1_shopify
Signature
Task<CloudflareResponse<D1Database>> GetDefaultD1DatabaseAsync()
Example
var db = await cf.GetDefaultD1DatabaseAsync();
Console.WriteLine($"{db!.Result!.Name}: {db.Result.NumTables} tables");
DELETE
DeleteD1DatabaseAsync
Permanently delete a D1 database
Signature
Task DeleteD1DatabaseAsync(
string databaseId)
Example
await cf.DeleteD1DatabaseAsync("old-db-uuid");
Query / SQL
POST
QueryD1Async
Execute SQL: SELECT, INSERT, UPDATE, DELETE
Signature
Task<CloudflareResponse<List<D1QueryResult>>> QueryD1Async(
string databaseId,
string sql,
object[]? parameters = null)
Example
var res = await cf.QueryD1Async(
"33da2dc6-...",
"SELECT * FROM products WHERE active = ?1",
[true]);
foreach (var row in res!.Result![0].Results)
Console.WriteLine(row["id"]);
POST
QueryDefaultD1Async
SQL on configured d1_shopify
Signature
Task<CloudflareResponse<List<D1QueryResult>>> QueryDefaultD1Async(
string sql,
object[]? parameters = null)
Example
var res = await cf.QueryDefaultD1Async(
"INSERT INTO orders (shop_id, total) VALUES (?1, ?2)",
["shop123", 99.99]);
Console.WriteLine($"Inserted row {res!.Result![0].Meta!.LastRowId}");
POST
BatchQueryD1Async
Execute multiple SQL statements atomically
Signature
Task<CloudflareResponse<List<D1QueryResult>>> BatchQueryD1Async(
string databaseId,
IEnumerable<D1Statement> statements)
Example
var stmts = new D1Statement[]
{
new() { Sql = "INSERT INTO users (name) VALUES (?1)", Params = ["Alice"] },
new() { Sql = "SELECT COUNT(*) as n FROM users" }
};
var res = await cf.BatchQueryD1Async("db-id", stmts);
POST
ExportD1DatabaseAsync
Export database as SQL dump
Signature
Task<CloudflareResponse<JsonElement>> ExportD1DatabaseAsync(
string databaseId)
Example
var export = await cf.ExportD1DatabaseAsync("33da2dc6-...");
var url = export!.Result.GetProperty("result").GetProperty("signed_url").GetString();
Console.WriteLine(url);
R2 Storage
12 functions
Buckets
GET
ListR2BucketsAsync
List all R2 buckets
Signature
Task<CloudflareResponse<JsonElement>> ListR2BucketsAsync(
string? nameContains = null)
Example
var buckets = await cf.ListR2BucketsAsync();
Console.WriteLine(buckets!.Result.GetRawText());
POST
CreateR2BucketAsync
Create a new R2 bucket
Signature
Task<CloudflareResponse<R2Bucket>> CreateR2BucketAsync(
string name,
string? locationHint = null)
Example
var b = await cf.CreateR2BucketAsync("my-assets", "WNAM");
Console.WriteLine(b!.Result!.Name);
GET
GetR2BucketAsync
Get R2 bucket properties
Signature
Task<CloudflareResponse<R2Bucket>> GetR2BucketAsync(
string bucketName)
Example
var b = await cf.GetR2BucketAsync("tenant");
Console.WriteLine($"{b!.Result!.Name} — {b.Result.Location}");
DELETE
DeleteR2BucketAsync
Delete an empty R2 bucket
Signature
Task DeleteR2BucketAsync(
string bucketName)
Example
await cf.DeleteR2BucketAsync("old-bucket");
Objects (S3)
PUT
PutR2ObjectAsync
Upload an object to R2
Signature
Task PutR2ObjectAsync(
string key,
Stream content,
string contentType,
Dictionary<string,string>? metadata = null)
Example
using var stream = File.OpenRead("image.png");
await cf.PutR2ObjectAsync(
"products/image.png", stream, "image/png",
new() { ["uploaded-by"] = "admin" });
GET
GetR2ObjectAsync
Download an object from R2
Signature
Task<Stream> GetR2ObjectAsync(
string key)
Example
using var stream = await cf.GetR2ObjectAsync("products/image.png");
using var file = File.Create("local.png");
await stream.CopyToAsync(file);
HEAD
HeadR2ObjectAsync
Check existence and get metadata
Signature
Task<HttpResponseHeaders> HeadR2ObjectAsync(
string key)
Example
var headers = await cf.HeadR2ObjectAsync("products/image.png");
bool exists = headers != null;
Console.WriteLine($"Exists: {exists}");
DELETE
DeleteR2ObjectAsync
Delete an object from R2
Signature
Task DeleteR2ObjectAsync(
string key)
Example
await cf.DeleteR2ObjectAsync("products/old-image.png");
GET
ListR2ObjectsAsync
List objects with optional prefix filter
Signature
Task<string> ListR2ObjectsAsync(
string? prefix = null,
int maxKeys = 1000)
Example
string xml = await cf.ListR2ObjectsAsync("products/", 100);
Console.WriteLine(xml[..500]);
CORS Policies
GET
GetR2CorsAsync
Get CORS rules for a bucket
Signature
Task<CloudflareResponse<JsonElement>> GetR2CorsAsync(
string bucketName)
Example
var cors = await cf.GetR2CorsAsync("tenant");
Console.WriteLine(cors!.Result.GetRawText());
PUT
PutR2CorsAsync
Set (replace) CORS policy
Signature
Task<CloudflareResponse<JsonElement>> PutR2CorsAsync(
string bucketName,
IEnumerable<CorsRule> rules)
Example
var rules = new[] { new CorsRule
{
AllowedOrigins = ["https://example.com"],
AllowedMethods = ["GET", "PUT"],
MaxAgeSeconds = 3600
}};
await cf.PutR2CorsAsync("tenant", rules);
DELETE
DeleteR2CorsAsync
Remove all CORS rules
Signature
Task DeleteR2CorsAsync(
string bucketName)
Example
await cf.DeleteR2CorsAsync("tenant");
KV Storage
11 functions
Namespaces
GET
ListKvNamespacesAsync
List all KV namespaces
Signature
Task<CloudflareResponse<List<KvNamespace>>> ListKvNamespacesAsync(
int page = 1,
int perPage = 20)
Example
var ns = await cf.ListKvNamespacesAsync();
foreach (var n in ns!.Result!)
Console.WriteLine($"{n.Title} — {n.Id}");
POST
CreateKvNamespaceAsync
Create a KV namespace
Signature
Task<CloudflareResponse<KvNamespace>> CreateKvNamespaceAsync(
string title)
Example
var ns = await cf.CreateKvNamespaceAsync("SESSION_CACHE");
Console.WriteLine(ns!.Result!.Id);
PUT
RenameKvNamespaceAsync
Rename a KV namespace
Signature
Task<CloudflareResponse<KvNamespace>> RenameKvNamespaceAsync(
string namespaceId,
string newTitle)
Example
await cf.RenameKvNamespaceAsync("87747519...", "kv_shopify_v2");
DELETE
DeleteKvNamespaceAsync
Delete namespace and all its keys
Signature
Task DeleteKvNamespaceAsync(
string namespaceId)
Example
await cf.DeleteKvNamespaceAsync("namespace-id");
Values
PUT
WriteKvValueAsync
Write a key-value pair with optional TTL
Signature
Task WriteKvValueAsync(
string namespaceId,
string key,
string value,
int? expirationTtl = null)
Example
await cf.WriteKvValueAsync(
"87747519...",
"session:user123",
"{\"userId\": 42}",
expirationTtl: 3600);
GET
ReadKvValueAsync
Read raw value by key
Signature
Task<string> ReadKvValueAsync(
string namespaceId,
string key)
Example
string val = await cf.ReadKvValueAsync("87747519...", "session:user123");
Console.WriteLine(val);
GET
GetKvMetadataAsync
Read key metadata without fetching value
Signature
Task<CloudflareResponse<JsonElement>> GetKvMetadataAsync(
string namespaceId,
string key)
Example
var meta = await cf.GetKvMetadataAsync("87747519...", "session:user123");
Console.WriteLine(meta!.Result.GetRawText());
DELETE
DeleteKvValueAsync
Delete a key-value pair
Signature
Task DeleteKvValueAsync(
string namespaceId,
string key)
Example
await cf.DeleteKvValueAsync("87747519...", "session:user123");
GET
ListKvKeysAsync
List keys with optional prefix filter
Signature
Task<CloudflareResponse<List<KvKey>>> ListKvKeysAsync(
string namespaceId,
string? prefix = null,
int limit = 1000)
Example
var keys = await cf.ListKvKeysAsync("87747519...", prefix: "session:");
foreach (var k in keys!.Result!)
Console.WriteLine(k.Name);
Bulk Operations
PUT
BulkWriteKvAsync
Write up to 10,000 pairs in one call
Signature
Task<CloudflareResponse<object>> BulkWriteKvAsync(
string namespaceId,
IEnumerable<KvBulkItem> items)
Example
var items = new KvBulkItem[]
{
new() { Key = "u:alice", Value = "{\"score\":100}", ExpirationTtl = 86400 },
new() { Key = "u:bob", Value = "{\"score\":200}" }
};
await cf.BulkWriteKvAsync("87747519...", items);
DELETE
BulkDeleteKvAsync
Delete up to 10,000 keys at once
Signature
Task<CloudflareResponse<object>> BulkDeleteKvAsync(
string namespaceId,
IEnumerable<string> keys)
Example
await cf.BulkDeleteKvAsync(
"87747519...",
["session:user1", "session:user2", "session:user3"]);
Workers for Platforms
11 functions
Dispatch Namespaces
GET
ListDispatchNamespacesAsync
List all dispatch namespaces
Signature
Task<CloudflareResponse<List<DispatchNamespace>>> ListDispatchNamespacesAsync()
Example
var ns = await cf.ListDispatchNamespacesAsync();
foreach (var n in ns!.Result!)
Console.WriteLine(n.NamespaceName);
POST
CreateDispatchNamespaceAsync
Create a dispatch namespace
Signature
Task<CloudflareResponse<DispatchNamespace>> CreateDispatchNamespaceAsync(
string name)
Example
var ns = await cf.CreateDispatchNamespaceAsync("my-platform");
Console.WriteLine(ns!.Result!.NamespaceId);
GET
GetDispatchNamespaceAsync
Get dispatch namespace properties
Signature
Task<CloudflareResponse<DispatchNamespace>> GetDispatchNamespaceAsync(
string namespaceName)
Example
var ns = await cf.GetDispatchNamespaceAsync("my-platform");
Console.WriteLine(ns!.Result!.NamespaceId);
DELETE
DeleteDispatchNamespaceAsync
Delete namespace and all Workers in it
Signature
Task DeleteDispatchNamespaceAsync(
string namespaceName)
Example
await cf.DeleteDispatchNamespaceAsync("old-platform");
Namespace Scripts
GET
ListNamespaceScriptsAsync
List Workers in a dispatch namespace
Signature
Task<CloudflareResponse<List<JsonElement>>> ListNamespaceScriptsAsync(
string namespaceName)
Example
var scripts = await cf.ListNamespaceScriptsAsync("my-platform");
Console.WriteLine($"{scripts!.Result!.Count} tenant workers");
PUT
UploadNamespaceScriptAsync
Deploy a Worker into a namespace
Signature
Task<CloudflareResponse<WorkerScript>> UploadNamespaceScriptAsync(
string namespaceName,
string scriptName,
string scriptContent)
Example
string code = "export default { fetch: (r) => new Response('tenant ok') }";
var r = await cf.UploadNamespaceScriptAsync(
"my-platform", "tenant-acme", code);
GET
GetNamespaceScriptSettingsAsync
Get bindings and settings
Signature
Task<CloudflareResponse<JsonElement>> GetNamespaceScriptSettingsAsync(
string namespaceName,
string scriptName)
Example
var s = await cf.GetNamespaceScriptSettingsAsync("my-platform", "tenant-acme");
Console.WriteLine(s!.Result.GetRawText());
DELETE
DeleteNamespaceScriptAsync
Remove a Worker from a namespace
Signature
Task DeleteNamespaceScriptAsync(
string namespaceName,
string scriptName,
bool force = false)
Example
await cf.DeleteNamespaceScriptAsync("my-platform", "tenant-acme");
Script Tags
GET
ListScriptTagsAsync
List tags on a namespace Worker
Signature
Task<CloudflareResponse<List<string>>> ListScriptTagsAsync(
string namespaceName,
string scriptName)
Example
var tags = await cf.ListScriptTagsAsync("my-platform", "tenant-acme");
Console.WriteLine(string.Join(", ", tags!.Result!));
PUT
SetScriptTagsAsync
Replace all tags on a namespace Worker
Signature
Task<CloudflareResponse<List<string>>> SetScriptTagsAsync(
string namespaceName,
string scriptName,
string[] tags)
Example
await cf.SetScriptTagsAsync(
"my-platform", "tenant-acme",
["tenant:acme", "plan:pro", "region:us"]);
DELETE
DeleteScriptTagAsync
Remove a single tag
Signature
Task DeleteScriptTagAsync(
string namespaceName,
string scriptName,
string tag)
Example
await cf.DeleteScriptTagAsync("my-platform", "tenant-acme", "plan:pro");