MCPcopy Index your code
hub / github.com/cloudflare/cloudflare-go

github.com/cloudflare/cloudflare-go @v7.6.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v7.6.0 ↗ · + Follow
93,945 symbols 171,851 edges 1,912 files 30,439 documented · 32% 14 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Cloudflare Go API Library

Go Reference

The Cloudflare Go library provides convenient access to the Cloudflare REST API from applications written in Go.

It is generated with Stainless.

MCP Server

Use the Cloudflare MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.

Add to Cursor Install in VS Code

Note: You may need to set environment variables in your MCP client.

Installation

import (
    "github.com/cloudflare/cloudflare-go/v7" // imported as cloudflare
)

Or to pin the version:

go get -u 'github.com/cloudflare/cloudflare-go/v7@v7.6.0'

Requirements

This library requires Go 1.22+.

Usage

The full API of this library can be found in api.md.

package main

import (
    "context"
    "fmt"

    "github.com/cloudflare/cloudflare-go/v7"
    "github.com/cloudflare/cloudflare-go/v7/option"
    "github.com/cloudflare/cloudflare-go/v7/zones"
)

func main() {
    client := cloudflare.NewClient(
        option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), // defaults to os.LookupEnv("CLOUDFLARE_API_TOKEN")
    )
    zone, err := client.Zones.New(context.TODO(), zones.ZoneNewParams{
        Account: cloudflare.F(zones.ZoneNewParamsAccount{
            ID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
        }),
        Name: cloudflare.F("example.com"),
        Type: cloudflare.F(zones.TypeFull),
    })
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("%+v\n", zone.ID)
}

Request fields

All request parameters are wrapped in a generic Field type, which we use to distinguish zero values from null or omitted fields.

This prevents accidentally sending a zero value if you forget a required parameter, and enables explicitly sending null, false, '', or 0 on optional parameters. Any field not specified is not sent.

To construct fields with values, use the helpers String(), Int(), Float(), or most commonly, the generic F[T](). To send a null, use Null[T](), and to send a nonconforming value, use Raw[T](any). For example:

params := FooParams{
    Name: cloudflare.F("hello"),

    // Explicitly send `"description": null`
    Description: cloudflare.Null[string](),

    Point: cloudflare.F(cloudflare.Point{
        X: cloudflare.Int(0),
        Y: cloudflare.Int(1),

        // In cases where the API specifies a given type,
        // but you want to send something else, use `Raw`:
        Z: cloudflare.Raw[int64](0.01), // sends a float
    }),
}

Response objects

All fields in response structs are value types (not pointers or wrappers).

If a given field is null, not present, or invalid, the corresponding field will simply be its zero value.

All response structs also include a special JSON field, containing more detailed information about each property, which you can use like so:

if res.Name == "" {
    // true if `"name"` is either not present or explicitly null
    res.JSON.Name.IsNull()

    // true if the `"name"` key was not present in the response JSON at all
    res.JSON.Name.IsMissing()

    // When the API returns data that cannot be coerced to the expected type:
    if res.JSON.Name.IsInvalid() {
        raw := res.JSON.Name.Raw()

        legacyName := struct{
            First string `json:"first"`
            Last  string `json:"last"`
        }{}
        json.Unmarshal([]byte(raw), &legacyName)
        name = legacyName.First + " " + legacyName.Last
    }
}

These .JSON structs also include an Extras map containing any properties in the json response that were not specified in the struct. This can be useful for API features not yet present in the SDK.

body := res.JSON.ExtraFields["my_unexpected_field"].Raw()

RequestOptions

This library uses the functional options pattern. Functions defined in the option package return a RequestOption, which is a closure that mutates a RequestConfig. These options can be supplied to the client or at individual requests. For example:

client := cloudflare.NewClient(
    // Adds a header to every request made by the client
    option.WithHeader("X-Some-Header", "custom_header_info"),
)

client.Zones.New(context.TODO(), ...,
    // Override the header
    option.WithHeader("X-Some-Header", "some_other_custom_header_info"),
    // Add an undocumented field to the request body, using sjson syntax
    option.WithJSONSet("some.json.path", map[string]string{"my": "object"}),
)

See the full list of request options.

Pagination

This library provides some conveniences for working with paginated list endpoints.

You can use .ListAutoPaging() methods to iterate through items across all pages:

iter := client.Accounts.ListAutoPaging(context.TODO(), accounts.AccountListParams{})
// Automatically fetches more pages as needed.
for iter.Next() {
    account := iter.Current()
    fmt.Printf("%+v\n", account)
}
if err := iter.Err(); err != nil {
    panic(err.Error())
}

Or you can use simple .List() methods to fetch a single page and receive a standard response object with additional helper methods like .GetNextPage(), e.g.:

page, err := client.Accounts.List(context.TODO(), accounts.AccountListParams{})
for page != nil {
    for _, account := range page.Result {
        fmt.Printf("%+v\n", account)
    }
    page, err = page.GetNextPage()
}
if err != nil {
    panic(err.Error())
}

Errors

When the API returns a non-success status code, we return an error with type *cloudflare.Error. This contains the StatusCode, *http.Request, and *http.Response values of the request, as well as the JSON of the error body (much like other response objects in the SDK).

To handle errors, we recommend that you use the errors.As pattern:

_, err := client.Zones.Get(context.TODO(), zones.ZoneGetParams{
    ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
})
if err != nil {
    var apierr *cloudflare.Error
    if errors.As(err, &apierr) {
        println(string(apierr.DumpRequest(true)))  // Prints the serialized HTTP request
        println(string(apierr.DumpResponse(true))) // Prints the serialized HTTP response
    }
    panic(err.Error()) // GET "/zones/{zone_id}": 400 Bad Request { ... }
}

When other errors occur, they are returned unwrapped; for example, if HTTP transport fails, you might receive *url.Error wrapping *net.OpError.

Timeouts

Requests do not time out by default; use context to configure a timeout for a request lifecycle.

Note that if a request is retried, the context timeout does not start over. To set a per-retry timeout, use option.WithRequestTimeout().

// This sets the timeout for the request, including all the retries.
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
client.Zones.Edit(
    ctx,
    zones.ZoneEditParams{
        ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    },
    // This sets the per-retry timeout
    option.WithRequestTimeout(20*time.Second),
)

File uploads

Request parameters that correspond to file uploads in multipart requests are typed as param.Field[io.Reader]. The contents of the io.Reader will by default be sent as a multipart form part with the file name of "anonymous_file" and content-type of "application/octet-stream".

The file name and content-type can be customized by implementing Name() string or ContentType() string on the run-time type of io.Reader. Note that os.File implements Name() string, so a file returned by os.Open will be sent with the file name on disk.

We also provide a helper cloudflare.FileParam(reader io.Reader, filename string, contentType string) which can be used to wrap any io.Reader with the appropriate file name and content type.

// A file from the file system
file, err := os.Open("/path/to/file")
kv.NamespaceValueUpdateParams{
    AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    Value:     cloudflare.F[io.Reader](file),
}

// A file from a string
kv.NamespaceValueUpdateParams{
    AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    Value:     cloudflare.F[io.Reader](strings.NewReader("my file contents")),
}

// With a custom filename and contentType
kv.NamespaceValueUpdateParams{
    AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    Value:     cloudflare.FileParam(strings.NewReader(`{"hello": "foo"}`), "file.go", "application/json"),
}

Retries

Certain errors will be automatically retried 2 times by default, with a short exponential backoff. We retry by default all connection errors, 408 Request Timeout, 409 Conflict, 429 Rate Limit, and >=500 Internal errors.

You can use the WithMaxRetries option to configure or disable this:

// Configure the default for all requests:
client := cloudflare.NewClient(
    option.WithMaxRetries(0), // default is 2
)

// Override per-request:
client.Zones.Get(
    context.TODO(),
    zones.ZoneGetParams{
        ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    },
    option.WithMaxRetries(5),
)

Accessing raw response data (e.g. response headers)

You can access the raw HTTP response data by using the option.WithResponseInto() request option. This is useful when you need to examine response headers, status codes, or other details.

// Create a variable to store the HTTP response
var response *http.Response
zone, err := client.Zones.New(
    context.TODO(),
    zones.ZoneNewParams{
        Account: cloudflare.F(zones.ZoneNewParamsAccount{
            ID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
        }),
        Name: cloudflare.F("example.com"),
        Type: cloudflare.F(zones.TypeFull),
    },
    option.WithResponseInto(&response),
)
if err != nil {
    // handle error
}
fmt.Printf("%+v\n", zone)

fmt.Printf("Status Code: %d\n", response.StatusCode)
fmt.Printf("Headers: %+#v\n", response.Header)

Making custom/undocumented requests

This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, params, or response properties, the library can still be used.

Undocumented endpoints

To make requests to undocumented endpoints, you can use client.Get, client.Post, and other HTTP verbs. RequestOptions on the client, such as retries, will be respected when making these requests.

var (
    // params can be an io.Reader, a []byte, an encoding/json serializable object,
    // or a "…Params" struct defined in this library.
    params map[string]interface{}

    // result can be an []byte, *http.Response, a encoding/json deserializable object,
    // or a model defined in this library.
    result *http.Response
)
err := client.Post(context.Background(), "/unspecified", params, &result)
if err != nil {
    …
}

Undocumented request params

To make requests using undocumented parameters, you may use either the option.WithQuerySet() or the option.WithJSONSet() methods.

params := FooNewParams{
    ID:   cloudflare.F("id_xxxx"),
    Data: cloudflare.F(FooNewParamsData{
        FirstName: cloudflare.F("John"),
    }),
}
client.Foo.New(context.Background(), params, option.WithJSONSet("data.last_name", "Doe"))

Undocumented response properties

To access undocumented response properties, you may either access the raw JSON of the response as a string with result.JSON.RawJSON(), or get the raw JSON of a particular field on the result with `result.

Extension points exported contracts — how you extend this code

CachePurgeParamsBodyUnion (Interface)
Satisfied by [cache.CachePurgeParamsBodyCachePurgeFlexPurgeByTags], [cache.CachePurgeParamsBodyCachePurgeFlexPurgeByHost [7 …
cache/cache.go
RuleEditParamsPositionUnion (Interface)
Update rule order among zone rules. Satisfied by [token_validation.RuleEditParamsPositionAPIShieldIndex], [token_valida [8 …
token_validation/rule.go
BatchPatchUnionParam (Interface)
Satisfied by [dns.BatchPatchARecordParam], [dns.BatchPatchAAAARecordParam], [dns.BatchPatchCNAMERecordParam], [dns.Batch [21 …
dns/record.go
SubscriptionNewResponseSourceUnion (Interface)
Source configuration for the subscription Union satisfied by [SubscriptionNewResponseSourceMqEventSourceImages], [Subsc [8 …
queues/subscription.go
ConfigurationTriggersExcludeRulesUnion (Interface)
Union satisfied by [ConfigurationTriggersExcludeRulesZarazLoadRule], [ConfigurationTriggersExcludeRulesZarazClickListene [7 …
zaraz/config.go
PageRuleActionsUnion (Interface)
Union satisfied by [zones.AlwaysUseHTTPS], [zones.AutomaticHTTPSRewrites], [zones.BrowserCacheTTL], [zones.BrowserCheck] [34 …
page_rules/pagerule.go
ResourceTaggingListResponseUnion (Interface)
Response for access_application resources Union satisfied by [ResourceTaggingListResponseResourceTaggingTaggedResourceO [27 …
resource_tagging/resourcetagging.go
AccountTagUpdateResponseUnion (Interface)
Response for access_application resources Union satisfied by [AccountTagUpdateResponseResourceTaggingTaggedResourceObje [27 …
resource_tagging/accounttag.go

Core symbols most depended-on inside this repo

UnmarshalRoot
called by 13021
internal/apijson/decoder.go
MarshalRoot
called by 3458
internal/apijson/encoder.go
Error
called by 2466
internal/apierror/apierror.go
DumpRequest
called by 2453
internal/apierror/apierror.go
WithAPIKey
called by 2453
option/requestoption.go
WithAPIEmail
called by 2453
option/requestoption.go
WithBaseURL
called by 2441
option/requestoption.go
CheckTestServer
called by 2425
internal/testutil/testutil.go

Shape

Method 47,726
Struct 32,219
TypeAlias 9,564
Function 3,603
Interface 827
FuncType 6

Languages

Go100%

Modules by API surface

rulesets/rule.go3,598 symbols
rulesets/ruleset.go1,978 symbols
zones/setting.go1,404 symbols
rulesets/phase.go1,209 symbols
dns/record.go1,073 symbols
workers/scriptscriptandversionsetting.go1,012 symbols
workers_for_platforms/dispatchnamespacescriptsetting.go1,002 symbols
ai_gateway/aigateway.go937 symbols
workers/scriptversion.go899 symbols
url_scanner/scan.go810 symbols
ai_search/namespaceinstance.go790 symbols
ai_search/instance.go790 symbols

For agents

$ claude mcp add cloudflare-go \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page