Skip to content
Start here

Create a Turnstile Widget

client.Turnstile.Widgets.New(ctx, params) (*Widget, error)
POST/accounts/{account_id}/challenges/widgets

Lists challenge widgets.

Security
API Token

The preferred authorization scheme for interacting with the Cloudflare API. Create a token.

Example:Authorization: Bearer Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY
API Email + API Key

The previous authorization scheme for interacting with the Cloudflare API, used in conjunction with a Global API key.

Example:X-Auth-Email: user@example.com

The previous authorization scheme for interacting with the Cloudflare API. When possible, use API tokens instead of Global API keys.

Example:X-Auth-Key: 144c9defac04969c7bfad8efaa8ea194
Accepted Permissions (at least one required)
Turnstile Sites WriteAccount Settings Write
ParametersExpand Collapse
params WidgetNewParams
AccountID param.Field[string]

Path param: Identifier

maxLength32
Domains param.Field[[]WidgetDomain]

Body param

maxLength10
Mode param.Field[WidgetNewParamsMode]

Body param: Widget Mode

const WidgetNewParamsModeNonInteractive WidgetNewParamsMode = "non-interactive"
const WidgetNewParamsModeInvisible WidgetNewParamsMode = "invisible"
const WidgetNewParamsModeManaged WidgetNewParamsMode = "managed"
Name param.Field[string]

Body param: Human readable widget name. Not unique. Cloudflare suggests that you set this to a meaningful string to make it easier to identify your widget, and where it is used.

maxLength254
minLength1
Direction param.Field[WidgetNewParamsDirection]optional

Query param: Direction to order widgets.

const WidgetNewParamsDirectionAsc WidgetNewParamsDirection = "asc"
const WidgetNewParamsDirectionDesc WidgetNewParamsDirection = "desc"
Filter param.Field[string]optional

Query param: Filter widgets by field using case-insensitive substring matching. Format: field:value

Supported fields:

  • name - Filter by widget name (e.g., filter=name:login-form)
  • sitekey - Filter by sitekey (e.g., filter=sitekey:0x4AAA)

Returns 400 Bad Request if the field is unsupported or format is invalid. An empty filter value returns all results.

Order param.Field[WidgetNewParamsOrder]optional

Query param: Field to order widgets by.

const WidgetNewParamsOrderID WidgetNewParamsOrder = "id"
const WidgetNewParamsOrderSitekey WidgetNewParamsOrder = "sitekey"
const WidgetNewParamsOrderName WidgetNewParamsOrder = "name"
const WidgetNewParamsOrderCreatedOn WidgetNewParamsOrder = "created_on"
const WidgetNewParamsOrderModifiedOn WidgetNewParamsOrder = "modified_on"
Page param.Field[float64]optional

Query param: Page number of paginated results.

minimum1
PerPage param.Field[float64]optional

Query param: Number of items per page.

maximum1000
minimum5
BotFightMode param.Field[bool]optional

Body param: If bot_fight_mode is set to true, Cloudflare issues computationally expensive challenges in response to malicious bots (ENT only).

ClearanceLevel param.Field[WidgetNewParamsClearanceLevel]optional

Body param: If Turnstile is embedded on a Cloudflare site and the widget should grant challenge clearance, this setting can determine the clearance level to be set

const WidgetNewParamsClearanceLevelNoClearance WidgetNewParamsClearanceLevel = "no_clearance"
const WidgetNewParamsClearanceLevelJschallenge WidgetNewParamsClearanceLevel = "jschallenge"
const WidgetNewParamsClearanceLevelManaged WidgetNewParamsClearanceLevel = "managed"
const WidgetNewParamsClearanceLevelInteractive WidgetNewParamsClearanceLevel = "interactive"
EphemeralID param.Field[bool]optional

Body param: Return the Ephemeral ID in /siteverify (ENT only).

Offlabel param.Field[bool]optional

Body param: Do not show any Cloudflare branding on the widget (ENT only).

Region param.Field[WidgetNewParamsRegion]optional

Body param: Region where this widget can be used. This cannot be changed after creation.

const WidgetNewParamsRegionWorld WidgetNewParamsRegion = "world"
const WidgetNewParamsRegionChina WidgetNewParamsRegion = "china"
ReturnsExpand Collapse
type Widget struct{…}

A Turnstile widget's detailed configuration

BotFightMode bool

If bot_fight_mode is set to true, Cloudflare issues computationally expensive challenges in response to malicious bots (ENT only).

ClearanceLevel WidgetClearanceLevel

If Turnstile is embedded on a Cloudflare site and the widget should grant challenge clearance, this setting can determine the clearance level to be set

One of the following:
const WidgetClearanceLevelNoClearance WidgetClearanceLevel = "no_clearance"
const WidgetClearanceLevelJschallenge WidgetClearanceLevel = "jschallenge"
const WidgetClearanceLevelManaged WidgetClearanceLevel = "managed"
const WidgetClearanceLevelInteractive WidgetClearanceLevel = "interactive"
CreatedOn Time

When the widget was created.

formatdate-time
Domains []WidgetDomain
maxLength10
EphemeralID bool

Return the Ephemeral ID in /siteverify (ENT only).

Mode WidgetMode

Widget Mode

One of the following:
const WidgetModeNonInteractive WidgetMode = "non-interactive"
const WidgetModeInvisible WidgetMode = "invisible"
const WidgetModeManaged WidgetMode = "managed"
ModifiedOn Time

When the widget was modified.

formatdate-time
Name string

Human readable widget name. Not unique. Cloudflare suggests that you set this to a meaningful string to make it easier to identify your widget, and where it is used.

maxLength254
minLength1
Offlabel bool

Do not show any Cloudflare branding on the widget (ENT only).

Region WidgetRegion

Region where this widget can be used. This cannot be changed after creation.

One of the following:
const WidgetRegionWorld WidgetRegion = "world"
const WidgetRegionChina WidgetRegion = "china"
Secret string

Secret key for this widget.

Sitekey string

Widget item identifier tag.

maxLength32

Create a Turnstile Widget

package main

import (
  "context"
  "fmt"

  "github.com/cloudflare/cloudflare-go"
  "github.com/cloudflare/cloudflare-go/option"
  "github.com/cloudflare/cloudflare-go/turnstile"
)

func main() {
  client := cloudflare.NewClient(
    option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"),
  )
  widget, err := client.Turnstile.Widgets.New(context.TODO(), turnstile.WidgetNewParams{
    AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    Domains: cloudflare.F([]turnstile.WidgetDomainParam{"203.0.113.1", "cloudflare.com", "blog.example.com"}),
    Mode: cloudflare.F(turnstile.WidgetNewParamsModeInvisible),
    Name: cloudflare.F("blog.cloudflare.com login form"),
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", widget.EphemeralID)
}
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "success": true,
  "result": {
    "bot_fight_mode": false,
    "clearance_level": "interactive",
    "created_on": "2014-01-01T05:20:00.123123Z",
    "domains": [
      "203.0.113.1",
      "cloudflare.com",
      "blog.example.com"
    ],
    "ephemeral_id": false,
    "mode": "invisible",
    "modified_on": "2014-01-01T05:20:00.123123Z",
    "name": "blog.cloudflare.com login form",
    "offlabel": false,
    "region": "world",
    "secret": "0x4AAF00AAAABn0R22HWm098HVBjhdsYUc",
    "sitekey": "0x4AAF00AAAABn0R22HWm-YUc"
  },
  "result_info": {
    "count": 1,
    "page": 1,
    "per_page": 20,
    "total_count": 2000
  }
}
Returns Examples
{
  "errors": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "messages": [
    {
      "code": 1000,
      "message": "message",
      "documentation_url": "documentation_url",
      "source": {
        "pointer": "pointer"
      }
    }
  ],
  "success": true,
  "result": {
    "bot_fight_mode": false,
    "clearance_level": "interactive",
    "created_on": "2014-01-01T05:20:00.123123Z",
    "domains": [
      "203.0.113.1",
      "cloudflare.com",
      "blog.example.com"
    ],
    "ephemeral_id": false,
    "mode": "invisible",
    "modified_on": "2014-01-01T05:20:00.123123Z",
    "name": "blog.cloudflare.com login form",
    "offlabel": false,
    "region": "world",
    "secret": "0x4AAF00AAAABn0R22HWm098HVBjhdsYUc",
    "sitekey": "0x4AAF00AAAABn0R22HWm-YUc"
  },
  "result_info": {
    "count": 1,
    "page": 1,
    "per_page": 20,
    "total_count": 2000
  }
}