Skip to content
Start here

Get Transfer Status

client.Registrar.TransferInStatus.Get(ctx, domainName, query) (*WorkflowStatus, error)
GET/accounts/{account_id}/registrar/registrations/{domain_name}/transfer-in-status

Returns the current status of a domain transfer workflow.

Use this endpoint to poll transfer progress after initiating a transfer with POST /accounts/{account_id}/registrar/registrations/{domain_name}/transfer-in. The URL is provided in the links.self field of the transfer response.

Transfer timelines

Transfers typically take 1–10 days due to ICANN-mandated approval windows.

Workflow states

Terminal states: succeeded and failed are terminal and always have completed: true.

Non-terminal states:

  • in_progress: Transfer has been submitted to the registry and is being processed. Continue polling.
  • blocked: The workflow is waiting on the losing registrar or registry to release the domain. This is the most common state for transfers and is entirely normal — it means the ICANN transfer approval window is in effect. The losing registrar has up to 5 days to approve or reject. Continue polling with longer intervals (e.g., every 30–60 minutes).
  • action_required: The user needs to take action (e.g., the FOA email needs to be accepted). See context for details on what is needed.
  • pending: Transfer workflow created but not yet started processing.

Polling guidance

Adjust your polling interval based on the current workflow state:

  • pending or in_progress: Poll every 30 seconds.
  • blocked: The transfer is waiting on a third party (e.g., losing registrar approval). Poll every 30–60 minutes.
  • action_required: Stop polling. The workflow will not advance until the user takes action. Check context for details on what is needed.
  • succeeded or failed: Terminal — stop polling.
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
ParametersExpand Collapse
domainName string

Provides a fully qualified domain name (FQDN), including the extension (e.g., example.com, mybrand.app). The domain name uniquely identifies a registration. Cloudflare permits only one registration per domain, making the domain name a natural idempotency key for registration requests.

query TransferInStatusGetParams
AccountID param.Field[string]

Identifier.

maxLength32
ReturnsExpand Collapse
type WorkflowStatus struct{…}

Status of an async registration workflow.

Completed bool

Indicates whether the workflow reached a terminal state. A succeeded or failed state returns true; pending, in_progress, action_required, and blocked return false.

CreatedAt Time
formatdate-time
State WorkflowStatusState

Describes the workflow lifecycle state.

  • pending: The workflow awaits processing.
  • in_progress: Processing started. Continue polling links.self. An internal deadline limits the duration of this state.
  • action_required: The workflow pauses for user action. See context.action for details. Stop automated polling until the user completes the required action.
  • blocked: A third party, such as the domain extension’s registry or a losing registrar, prevents progress. Continue polling because the block may resolve when the third party responds.
  • succeeded: Terminal state. The operation completed successfully. completed equals true. For registrations, context.registration contains the resulting registration resource.
  • failed: Terminal state. The operation failed. completed equals true. See error.code and error.message for the reason. Require user review before retrying.
One of the following:
const WorkflowStatusStatePending WorkflowStatusState = "pending"
const WorkflowStatusStateInProgress WorkflowStatusState = "in_progress"
const WorkflowStatusStateActionRequired WorkflowStatusState = "action_required"
const WorkflowStatusStateBlocked WorkflowStatusState = "blocked"
const WorkflowStatusStateSucceeded WorkflowStatusState = "succeeded"
const WorkflowStatusStateFailed WorkflowStatusState = "failed"
UpdatedAt Time
formatdate-time
Context map[string, unknown]Optional

Provides workflow-specific data.

For domain-centric workflows, context.domain_name identifies the workflow subject.

Error WorkflowStatusErrorOptional

Provides error details when a workflow reaches the failed state. The workflow type (registration, update, etc.) and underlying registry response determine the specific codes and messages. Workflow error codes differ from immediate HTTP error errors[].code values in non-2xx responses. Surface error.message to the user for context.

Code string

Machine-readable error code identifying the failure reason.

Message string

Human-readable explanation of the failure. May include registry-specific details.

Get Transfer Status

package main

import (
  "context"
  "fmt"

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

func main() {
  client := cloudflare.NewClient(
    option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"),
  )
  workflowStatus, err := client.Registrar.TransferInStatus.Get(
    context.TODO(),
    "example.com",
    registrar.TransferInStatusGetParams{
      AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", workflowStatus.Completed)
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com",
      "foa_required": true,
      "transfer_status": "awaiting_foa"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "action_required",
    "updated_at": "2025-10-27T12:00:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com",
      "transfer_status": "awaiting_approval"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "blocked",
    "updated_at": "2025-10-28T14:30:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": true,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "error": {
      "code": "transfer_rejected",
      "message": "Transfer rejected"
    },
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "failed",
    "updated_at": "2025-10-30T12:00:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "in_progress",
    "updated_at": "2025-10-27T10:05:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": true,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "succeeded",
    "updated_at": "2025-10-30T08:15:00Z"
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "No workflow found for example.com"
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}
Returns Examples
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com",
      "foa_required": true,
      "transfer_status": "awaiting_foa"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "action_required",
    "updated_at": "2025-10-27T12:00:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com",
      "transfer_status": "awaiting_approval"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "blocked",
    "updated_at": "2025-10-28T14:30:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": true,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "error": {
      "code": "transfer_rejected",
      "message": "Transfer rejected"
    },
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "failed",
    "updated_at": "2025-10-30T12:00:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": false,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "in_progress",
    "updated_at": "2025-10-27T10:05:00Z"
  },
  "success": true
}
{
  "errors": [],
  "messages": [],
  "result": {
    "completed": true,
    "context": {
      "domain_name": "example.com"
    },
    "created_at": "2025-10-27T10:00:00Z",
    "links": {
      "resource": "/accounts/abc/registrar/registrations/example.com",
      "self": "/accounts/abc/registrar/registrations/example.com/transfer-in-status"
    },
    "state": "succeeded",
    "updated_at": "2025-10-30T08:15:00Z"
  },
  "success": true
}
{
  "errors": [
    {
      "code": 10000,
      "message": "No workflow found for example.com"
    }
  ],
  "messages": [],
  "result": null,
  "success": false
}