---
title: Go SDK
description: "The official Go SDK — github.com/syntext-dev/syntext-sdk-go."
---

# Go SDK

Idiomatic Go client for the Syntext API. Requires Go 1.21+.

## Installation

```bash
go get github.com/syntext-dev/syntext-sdk-go
```

## Quick Start

```go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	syntext "github.com/syntext-dev/syntext-sdk-go"
)

func main() {
	client := syntext.NewClient(os.Getenv("SYNTEXT_API_KEY"))
	ctx := context.Background()

	// Get a project
	project, err := client.Projects.Get(ctx, "prj_abc123")
	if err != nil {
		log.Fatal(err)
	}

	// Trigger a build
	build, err := client.Builds.Trigger(ctx, project.ID, &syntext.TriggerBuildOptions{
		Branch: "main",
	})
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("build queued:", build.ID)
}
```

## Services

| Service | Methods |
|---------|---------|
| `client.Projects` | `List`, `Get`, `Create`, `Update`, `Delete` |
| `client.Builds` | `List`, `Get`, `Trigger`, `Cancel` |
| `client.Search` | `Query`, `Reindex` |
| `client.Domains` | `Add`, `Verify`, `Remove` |
| `client.APIKeys` | `List`, `Create`, `Rotate`, `Revoke` |

All methods take a `context.Context` as the first argument.

## Error Handling

Errors are typed — use `errors.As` to branch on error kinds:

```go
build, err := client.Builds.Trigger(ctx, "prj_abc123", nil)
if err != nil {
	var apiErr *syntext.APIError
	if errors.As(err, &apiErr) {
		switch apiErr.Code {
		case "not_found":
			// project doesn't exist
		case "rate_limited":
			time.Sleep(time.Duration(apiErr.RetryAfterSeconds) * time.Second)
		}
	}
	return err
}
```

`429` and `5xx` responses are retried automatically with exponential backoff before an error is returned.

## CI Usage

The Go SDK is a good fit for build automation — e.g. triggering a docs rebuild after a service deploy:

```go
build, err := client.Builds.Trigger(ctx, projectID, &syntext.TriggerBuildOptions{
	Branch: "main",
	Force:  true,
})
```

<Note>
For most CI pipelines the [CLI](/cli/deploy) (`stx deploy`) is simpler — use the SDK when you need programmatic control from Go services.
</Note>
