 Kestra Go SDK
Kestra Go SDK
Release: 1.0.0
Install the Go SDK
To get started with the Kestra Go SDK, install the following dependencies:
go get github.com/stretchr/testify/assert
go get golang.org/x/net/context
Then, import the SDK package into your project:
import kestra_api_client "github.com/kestra-io/client-sdk/go-sdk"
If you need to use a proxy, set the HTTP_PROXY environment variable:
os.Setenv("HTTP_PROXY", "http://proxy_name:proxy_port")
Configure the server URL
By default, the configuration includes a Servers field that contains server objects as defined in the OpenAPI specification. You can customize these values to point to your Kestra instance or a specific environment.
Selecting a server configuration
To use a server other than the default (index 0), set the context value kestra_api_client.ContextServerIndex:
ctx := context.WithValue(context.Background(), kestra_api_client.ContextServerIndex, 1)
Using templated server URLs
Templated server URLs can be formatted using variables from either the configuration or context values. Use kestra_api_client.ContextServerVariables to define custom values:
ctx := context.WithValue(context.Background(), kestra_api_client.ContextServerVariables, map[string]string{
    "basePath": "v2",
})
Note: enum values are validated automatically, and unused variables are silently ignored.
Per-operation URL configuration
Each API operation can use its own server URL, defined through the OperationServers map in the Configuration.
An operation is uniquely identified by the string "{classname}Service.{nickname}".
To override the default operation server index and variables, use these context maps:
ctx := context.WithValue(context.Background(), kestra_api_client.ContextOperationServerIndices, map[string]int{
    "{classname}Service.{nickname}": 2,
})
ctx = context.WithValue(context.Background(), kestra_api_client.ContextOperationServerVariables, map[string]map[string]string{
    "{classname}Service.{nickname}": {
        "port": "8443",
    },
})
Create a flow
You can create a new flow in Kestra by providing its YAML source using the CreateFlow model:
package main
import (
    "context"
    "fmt"
    "os"
    openapiclient "github.com/kestra-io/client-sdk/go-sdk"
)
func main() {
    tenant := "tenant_example" // The tenant identifier
    body := "body_example"     // The flow source code in YAML
    configuration := openapiclient.NewConfiguration()
    apiClient := openapiclient.NewAPIClient(configuration)
    resp, r, err := apiClient.FlowsAPI.CreateFlow(context.Background(), tenant).Body(body).Execute()
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error when calling `FlowsAPI.CreateFlow`: %v\n", err)
        fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
    }
    // Response from `CreateFlow`: FlowWithSource
    fmt.Fprintf(os.Stdout, "Response from `FlowsAPI.CreateFlow`: %v\n", resp)
}
Important:
- The bodyvariable must contain valid YAML defining the flow.
- Make sure the flow is scoped to the correct tenant (multi-tenant setups may reject cross-tenant operations).
- The response object (FlowWithSource) includes both the flow metadata and its source definition.
Execute a flow
You can trigger a flow execution using the CreateExecution model:
package main
import (
    "context"
    "fmt"
    "os"
    "time"
    openapiclient "github.com/kestra-io/client-sdk/go-sdk"
)
func main() {
    namespace := "namespace_example" // The flow namespace
    id := "id_example"               // The flow ID
    wait := true                     // Whether to wait for execution completion
    tenant := "tenant_example"       // Tenant identifier
    labels := []string{"key:value"}  // Optional labels for traceability
    revision := int32(56)            // Flow revision (or latest if null)
    scheduleDate := time.Now()       // Optional scheduled date for execution
    breakpoints := "task1,task2"     // Optional list of breakpoints
    kind := openapiclient.ExecutionKind("NORMAL") // Execution kind
    configuration := openapiclient.NewConfiguration()
    apiClient := openapiclient.NewAPIClient(configuration)
    resp, r, err := apiClient.ExecutionsAPI.CreateExecution(context.Background(), namespace, id, tenant).
        Wait(wait).
        Labels(labels).
        Revision(revision).
        ScheduleDate(scheduleDate).
        Breakpoints(breakpoints).
        Kind(kind).
        Execute()
    if err != nil {
        fmt.Fprintf(os.Stderr, "Error when calling `ExecutionsAPI.CreateExecution`: %v\n", err)
        fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
    }
    // Response from `CreateExecution`: []ExecutionControllerExecutionResponse
    fmt.Fprintf(os.Stdout, "Response from `ExecutionsAPI.CreateExecution`: %v\n", resp)
}
Notes:
- The waitflag determines whether the API call blocks until execution completes or returns immediately.
- If using scheduleDate, ensure your Kestra instance supports delayed executions.
- breakpointsallow pausing at specific tasks for debugging or step-by-step analysis.
- The API returns an ExecutionControllerExecutionResponse, which includes the execution ID and status for tracking.
Next steps
- Explore the Kestra API Reference for details on available endpoints.
- Combine executions with event triggers or task templates for more advanced workflows.
- For production use, configure retry logic and connection timeouts in your API client.
Was this page helpful?
