{
  "slug": "pilot/sdk/go",
  "title": "Pilot Go SDK",
  "description": "Go client for the Cuitty Pilot API — manage playbooks, runs, and providers with idiomatic Go error handling.",
  "url": "https://cuitty.com/docs/pilot/sdk/go",
  "markdown_url": "https://cuitty.com/docs/pilot/sdk/go.md",
  "json_url": "https://cuitty.com/docs/pilot/sdk/go.json",
  "frontmatter": {
    "title": "Pilot Go SDK",
    "description": "Go client for the Cuitty Pilot API — manage playbooks, runs, and providers with idiomatic Go error handling.",
    "order": 15,
    "section": "Pilot",
    "updatedAt": "2026-06-01"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "pilot-go-sdk",
      "text": "Pilot Go SDK"
    },
    {
      "depth": 2,
      "slug": "install",
      "text": "Install"
    },
    {
      "depth": 2,
      "slug": "quick-start",
      "text": "Quick start"
    },
    {
      "depth": 2,
      "slug": "newclient",
      "text": "NewClient"
    },
    {
      "depth": 2,
      "slug": "playbooks",
      "text": "Playbooks"
    },
    {
      "depth": 2,
      "slug": "runs",
      "text": "Runs"
    },
    {
      "depth": 2,
      "slug": "types",
      "text": "Types"
    },
    {
      "depth": 3,
      "slug": "core-types",
      "text": "Core types"
    },
    {
      "depth": 3,
      "slug": "request-types",
      "text": "Request types"
    },
    {
      "depth": 2,
      "slug": "error-handling",
      "text": "Error handling"
    },
    {
      "depth": 2,
      "slug": "see-also",
      "text": "See also"
    }
  ],
  "body_markdown": "# Pilot Go SDK\n\n`github.com/cuitty/pilot-sdk-go` is a Go client for the Pilot API. It requires Go 1.22+ and has zero external dependencies beyond the standard library.\n\n## Install\n\n```bash\ngo get github.com/cuitty/pilot-sdk-go\n```\n\n## Quick start\n\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\n\tpilot \"github.com/cuitty/pilot-sdk-go\"\n)\n\nfunc main() {\n\tclient := pilot.NewClient(\"http://localhost:4320\", \"your-auth-token\")\n\n\t// List all playbooks\n\tplaybooks, err := client.ListPlaybooks(\"\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfor _, pb := range playbooks {\n\t\tfmt.Printf(\"%s: %s\\n\", pb.ID, pb.Title)\n\t}\n\n\t// Start a run\n\tinputs, _ := json.Marshal(map[string]string{\n\t\t\"zone\":        \"example.com\",\n\t\t\"record_name\": \"app\",\n\t\t\"ip_address\":  \"1.2.3.4\",\n\t})\n\tresp, err := client.StartRun(&pilot.StartRunRequest{\n\t\tPlaybookID: \"cloudflare.dns.add-a-record\",\n\t\tMode:       \"autonomous\",\n\t\tInputs:     inputs,\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Printf(\"Run started: %s (%s)\\n\", resp.ID, resp.Status)\n}\n```\n\n## NewClient\n\nCreates a new Pilot API client. Pass an empty string for `authToken` to skip authentication.\n\n```go\n// With auth\nclient := pilot.NewClient(\"http://localhost:4320\", \"ey...\")\n\n// Without auth\nclient := pilot.NewClient(\"http://localhost:4320\", \"\")\n```\n\nThe `Client` struct exposes `BaseURL`, `AuthToken`, and `HTTP` (*http.Client) fields for customization.\n\n| Method | Returns | Description |\n|--------|---------|-------------|\n| `Health()` | `*HealthStatus, error` | Check server health |\n| `ListPlaybooks(target)` | `[]PlaybookSummary, error` | List playbooks; pass `\"\"` for all |\n| `GetPlaybook(id)` | `*Playbook, error` | Get playbook by ID (latest version) |\n| `CreatePlaybook(req)` | `*CreatePlaybookResponse, error` | Create a new playbook |\n| `UpdatePlaybook(id, req)` | `*UpdatePlaybookResponse, error` | Update (version-bump) a playbook |\n| `DeletePlaybook(id)` | `*DeletePlaybookResponse, error` | Delete all versions |\n| `StartRun(req)` | `*StartRunResponse, error` | Start a new run |\n| `ListRuns(opts)` | `[]Run, error` | List runs with optional filters |\n| `GetRun(id)` | `*Run, error` | Get run details including steps |\n| `AbortRun(id)` | `*AbortRunResponse, error` | Abort a running or queued run |\n| `ApproveRun(id, req)` | `*ApproveResponse, error` | Submit approval decision for a step |\n| `ListProviders()` | `[]Provider, error` | List all provider profiles |\n\n## Playbooks\n\n```go\n// List all\nplaybooks, err := client.ListPlaybooks(\"\")\n\n// Filter by target\ncfPlaybooks, err := client.ListPlaybooks(\"cloudflare\")\n\n// Get one\npb, err := client.GetPlaybook(\"cloudflare.dns.add-a-record\")\n\n// Create\nresp, err := client.CreatePlaybook(&pilot.CreatePlaybookRequest{\n\tTarget:     \"cloudflare\",\n\tTitle:      \"Add CNAME record\",\n\tYAML:       playbookYAML,\n\tAuthoredBy: \"human\",\n})\n\n// Update\nresp, err := client.UpdatePlaybook(\"cloudflare.dns.add-cname\",\n\t&pilot.UpdatePlaybookRequest{YAML: updatedYAML})\n\n// Delete\nresp, err := client.DeletePlaybook(\"cloudflare.dns.add-cname\")\n```\n\n## Runs\n\n```go\n// Start a run\ninputs, _ := json.Marshal(map[string]string{\n\t\"zone\": \"example.com\",\n\t\"record_name\": \"api\",\n\t\"ip_address\": \"1.2.3.4\",\n})\nresp, err := client.StartRun(&pilot.StartRunRequest{\n\tPlaybookID:        \"cloudflare.dns.add-a-record\",\n\tMode:              \"interactive\",\n\tInputs:            inputs,\n\tProviderProfileID: \"cf-prod\",\n})\n\n// Get run with steps\nrun, err := client.GetRun(resp.ID)\nfor _, step := range run.Steps {\n\tfmt.Printf(\"%s: %s\\n\", step.StepID, step.Status)\n}\n\n// List runs with filters\nruns, err := client.ListRuns(&pilot.ListRunsOptions{\n\tStatus: \"running\",\n\tLimit:  10,\n})\n\n// Abort\nresp, err := client.AbortRun(runID)\n\n// Approve a step\nresp, err := client.ApproveRun(runID, &pilot.ApproveRequest{\n\tStepID:   \"save\",\n\tDecision: \"approve\",\n})\n```\n\n## Types\n\n### Core types\n\n| Type | Key fields |\n|------|-----------|\n| `Playbook` | `ID`, `Version`, `Target`, `Title`, `DocumentYAML`, `AuthoredBy`, `CreatedAt` |\n| `PlaybookSummary` | `ID`, `Version`, `Target`, `Title`, `AuthoredBy` |\n| `Run` | `ID`, `ProjectID`, `PlaybookID`, `Mode`, `Status`, `InputsJSON`, `OutputsJSON`, `Steps []RunStep` |\n| `RunStep` | `ID`, `RunID`, `StepID`, `Action`, `Status`, `AIUsed`, `DurationMs *int`, `ErrorMessage *string` |\n| `Provider` | `ID`, `ProjectID`, `Provider`, `Label`, `BaseURL`, `LastAuthenticated`, `ExpiresAt` |\n| `HealthStatus` | `Status`, `Database`, `DriverPool`, `ProviderSessions`, `LastChecked` |\n\n### Request types\n\n| Type | Fields |\n|------|--------|\n| `StartRunRequest` | `PlaybookID`, `Version *int`, `Mode`, `Inputs json.RawMessage`, `ProviderProfileID`, `ProjectID` |\n| `CreatePlaybookRequest` | `Target`, `Title`, `YAML`, `AuthoredBy` |\n| `UpdatePlaybookRequest` | `YAML`, `Target`, `Title`, `AuthoredBy` |\n| `ApproveRequest` | `StepID`, `Decision` |\n| `ListRunsOptions` | `Status`, `PlaybookID`, `Limit int` |\n\n## Error handling\n\nThe SDK returns `*APIError` for non-2xx responses. All other errors are standard Go errors from `net/http` or `encoding/json`.\n\n```go\nimport (\n\t\"errors\"\n\tpilot \"github.com/cuitty/pilot-sdk-go\"\n)\n\nresp, err := client.StartRun(&req)\nif err != nil {\n\tvar apiErr *pilot.APIError\n\tif errors.As(err, &apiErr) {\n\t\tfmt.Printf(\"API error %d: %s\\n\", apiErr.StatusCode, apiErr.Message)\n\t} else {\n\t\tfmt.Printf(\"Network error: %v\\n\", err)\n\t}\n}\n```\n\n| Type | Fields | When |\n|------|--------|------|\n| `*APIError` | `StatusCode int`, `Message string` | Non-2xx HTTP response |\n| `error` | standard | Network, JSON, or other failure |\n\n## See also\n\n- [JavaScript SDK](/docs/pilot/sdk/javascript) — TypeScript client with event streaming\n- [Playbook reference](/docs/pilot/playbook-reference) — YAML schema for playbook documents\n- [Quickstart](/docs/pilot/quickstart) — record and replay your first workflow",
  "body_html": "<h1 id=\"pilot-go-sdk\">Pilot Go SDK</h1>\n<p><code>github.com/cuitty/pilot-sdk-go</code> is a Go client for the Pilot API. It requires Go 1.22+ and has zero external dependencies beyond the standard library.</p>\n<h2 id=\"install\">Install</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"color:#B392F0\">go</span><span style=\"color:#9ECBFF\"> get</span><span style=\"color:#9ECBFF\"> github.com/cuitty/pilot-sdk-go</span></span></code></pre>\n<h2 id=\"quick-start\">Quick start</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"go\"><code><span class=\"line\"><span style=\"color:#F97583\">package</span><span style=\"color:#B392F0\"> main</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> (</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"</span><span style=\"color:#B392F0\">encoding/json</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"</span><span style=\"color:#B392F0\">fmt</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"</span><span style=\"color:#B392F0\">log</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tpilot </span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#B392F0\">github.com/cuitty/pilot-sdk-go</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#F97583\">func</span><span style=\"color:#B392F0\"> main</span><span style=\"color:#E1E4E8\">() {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tclient </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> pilot.</span><span style=\"color:#B392F0\">NewClient</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"http://localhost:4320\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#9ECBFF\">\"your-auth-token\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">\t// List all playbooks</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tplaybooks, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">ListPlaybooks</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\tif</span><span style=\"color:#E1E4E8\"> err </span><span style=\"color:#F97583\">!=</span><span style=\"color:#79B8FF\"> nil</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tlog.</span><span style=\"color:#B392F0\">Fatal</span><span style=\"color:#E1E4E8\">(err)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t}</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\tfor</span><span style=\"color:#E1E4E8\"> _, pb </span><span style=\"color:#F97583\">:=</span><span style=\"color:#F97583\"> range</span><span style=\"color:#E1E4E8\"> playbooks {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tfmt.</span><span style=\"color:#B392F0\">Printf</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#79B8FF\">%s</span><span style=\"color:#9ECBFF\">: </span><span style=\"color:#79B8FF\">%s\\n</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#E1E4E8\">, pb.ID, pb.Title)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">\t// Start a run</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tinputs, _ </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> json.</span><span style=\"color:#B392F0\">Marshal</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">map</span><span style=\"color:#E1E4E8\">[</span><span style=\"color:#F97583\">string</span><span style=\"color:#E1E4E8\">]</span><span style=\"color:#F97583\">string</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\t\"zone\"</span><span style=\"color:#E1E4E8\">:        </span><span style=\"color:#9ECBFF\">\"example.com\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\t\"record_name\"</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"app\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\t\"ip_address\"</span><span style=\"color:#E1E4E8\">:  </span><span style=\"color:#9ECBFF\">\"1.2.3.4\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t})</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tresp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">StartRun</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">StartRunRequest</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tPlaybookID: </span><span style=\"color:#9ECBFF\">\"cloudflare.dns.add-a-record\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tMode:       </span><span style=\"color:#9ECBFF\">\"autonomous\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tInputs:     inputs,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t})</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\tif</span><span style=\"color:#E1E4E8\"> err </span><span style=\"color:#F97583\">!=</span><span style=\"color:#79B8FF\"> nil</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tlog.</span><span style=\"color:#B392F0\">Fatal</span><span style=\"color:#E1E4E8\">(err)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t}</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tfmt.</span><span style=\"color:#B392F0\">Printf</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"Run started: </span><span style=\"color:#79B8FF\">%s</span><span style=\"color:#9ECBFF\"> (</span><span style=\"color:#79B8FF\">%s</span><span style=\"color:#9ECBFF\">)</span><span style=\"color:#79B8FF\">\\n</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#E1E4E8\">, resp.ID, resp.Status)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span></code></pre>\n<h2 id=\"newclient\">NewClient</h2>\n<p>Creates a new Pilot API client. Pass an empty string for <code>authToken</code> to skip authentication.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"go\"><code><span class=\"line\"><span style=\"color:#6A737D\">// With auth</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">client </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> pilot.</span><span style=\"color:#B392F0\">NewClient</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"http://localhost:4320\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#9ECBFF\">\"ey...\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Without auth</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">client </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> pilot.</span><span style=\"color:#B392F0\">NewClient</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"http://localhost:4320\"</span><span style=\"color:#E1E4E8\">, </span><span style=\"color:#9ECBFF\">\"\"</span><span style=\"color:#E1E4E8\">)</span></span></code></pre>\n<p>The <code>Client</code> struct exposes <code>BaseURL</code>, <code>AuthToken</code>, and <code>HTTP</code> (*http.Client) fields for customization.</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Method</th><th>Returns</th><th>Description</th></tr></thead><tbody><tr><td><code>Health()</code></td><td><code>*HealthStatus, error</code></td><td>Check server health</td></tr><tr><td><code>ListPlaybooks(target)</code></td><td><code>[]PlaybookSummary, error</code></td><td>List playbooks; pass <code>\"\"</code> for all</td></tr><tr><td><code>GetPlaybook(id)</code></td><td><code>*Playbook, error</code></td><td>Get playbook by ID (latest version)</td></tr><tr><td><code>CreatePlaybook(req)</code></td><td><code>*CreatePlaybookResponse, error</code></td><td>Create a new playbook</td></tr><tr><td><code>UpdatePlaybook(id, req)</code></td><td><code>*UpdatePlaybookResponse, error</code></td><td>Update (version-bump) a playbook</td></tr><tr><td><code>DeletePlaybook(id)</code></td><td><code>*DeletePlaybookResponse, error</code></td><td>Delete all versions</td></tr><tr><td><code>StartRun(req)</code></td><td><code>*StartRunResponse, error</code></td><td>Start a new run</td></tr><tr><td><code>ListRuns(opts)</code></td><td><code>[]Run, error</code></td><td>List runs with optional filters</td></tr><tr><td><code>GetRun(id)</code></td><td><code>*Run, error</code></td><td>Get run details including steps</td></tr><tr><td><code>AbortRun(id)</code></td><td><code>*AbortRunResponse, error</code></td><td>Abort a running or queued run</td></tr><tr><td><code>ApproveRun(id, req)</code></td><td><code>*ApproveResponse, error</code></td><td>Submit approval decision for a step</td></tr><tr><td><code>ListProviders()</code></td><td><code>[]Provider, error</code></td><td>List all provider profiles</td></tr></tbody></table>\n<h2 id=\"playbooks\">Playbooks</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"go\"><code><span class=\"line\"><span style=\"color:#6A737D\">// List all</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">playbooks, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">ListPlaybooks</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Filter by target</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">cfPlaybooks, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">ListPlaybooks</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"cloudflare\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Get one</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">pb, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">GetPlaybook</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"cloudflare.dns.add-a-record\"</span><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Create</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">CreatePlaybook</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">CreatePlaybookRequest</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tTarget:     </span><span style=\"color:#9ECBFF\">\"cloudflare\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tTitle:      </span><span style=\"color:#9ECBFF\">\"Add CNAME record\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tYAML:       playbookYAML,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tAuthoredBy: </span><span style=\"color:#9ECBFF\">\"human\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Update</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">UpdatePlaybook</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"cloudflare.dns.add-cname\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\t&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">UpdatePlaybookRequest</span><span style=\"color:#E1E4E8\">{YAML: updatedYAML})</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Delete</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">DeletePlaybook</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"cloudflare.dns.add-cname\"</span><span style=\"color:#E1E4E8\">)</span></span></code></pre>\n<h2 id=\"runs\">Runs</h2>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"go\"><code><span class=\"line\"><span style=\"color:#6A737D\">// Start a run</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">inputs, _ </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> json.</span><span style=\"color:#B392F0\">Marshal</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">map</span><span style=\"color:#E1E4E8\">[</span><span style=\"color:#F97583\">string</span><span style=\"color:#E1E4E8\">]</span><span style=\"color:#F97583\">string</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"zone\"</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"example.com\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"record_name\"</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"api\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"ip_address\"</span><span style=\"color:#E1E4E8\">: </span><span style=\"color:#9ECBFF\">\"1.2.3.4\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">StartRun</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">StartRunRequest</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tPlaybookID:        </span><span style=\"color:#9ECBFF\">\"cloudflare.dns.add-a-record\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tMode:              </span><span style=\"color:#9ECBFF\">\"interactive\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tInputs:            inputs,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tProviderProfileID: </span><span style=\"color:#9ECBFF\">\"cf-prod\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Get run with steps</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">run, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">GetRun</span><span style=\"color:#E1E4E8\">(resp.ID)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">for</span><span style=\"color:#E1E4E8\"> _, step </span><span style=\"color:#F97583\">:=</span><span style=\"color:#F97583\"> range</span><span style=\"color:#E1E4E8\"> run.Steps {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tfmt.</span><span style=\"color:#B392F0\">Printf</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#79B8FF\">%s</span><span style=\"color:#9ECBFF\">: </span><span style=\"color:#79B8FF\">%s\\n</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#E1E4E8\">, step.StepID, step.Status)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// List runs with filters</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">runs, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">ListRuns</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">ListRunsOptions</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tStatus: </span><span style=\"color:#9ECBFF\">\"running\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tLimit:  </span><span style=\"color:#79B8FF\">10</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Abort</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">AbortRun</span><span style=\"color:#E1E4E8\">(runID)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#6A737D\">// Approve a step</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">ApproveRun</span><span style=\"color:#E1E4E8\">(runID, </span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">ApproveRequest</span><span style=\"color:#E1E4E8\">{</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tStepID:   </span><span style=\"color:#9ECBFF\">\"save\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tDecision: </span><span style=\"color:#9ECBFF\">\"approve\"</span><span style=\"color:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">})</span></span></code></pre>\n<h2 id=\"types\">Types</h2>\n<h3 id=\"core-types\">Core types</h3>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Type</th><th>Key fields</th></tr></thead><tbody><tr><td><code>Playbook</code></td><td><code>ID</code>, <code>Version</code>, <code>Target</code>, <code>Title</code>, <code>DocumentYAML</code>, <code>AuthoredBy</code>, <code>CreatedAt</code></td></tr><tr><td><code>PlaybookSummary</code></td><td><code>ID</code>, <code>Version</code>, <code>Target</code>, <code>Title</code>, <code>AuthoredBy</code></td></tr><tr><td><code>Run</code></td><td><code>ID</code>, <code>ProjectID</code>, <code>PlaybookID</code>, <code>Mode</code>, <code>Status</code>, <code>InputsJSON</code>, <code>OutputsJSON</code>, <code>Steps []RunStep</code></td></tr><tr><td><code>RunStep</code></td><td><code>ID</code>, <code>RunID</code>, <code>StepID</code>, <code>Action</code>, <code>Status</code>, <code>AIUsed</code>, <code>DurationMs *int</code>, <code>ErrorMessage *string</code></td></tr><tr><td><code>Provider</code></td><td><code>ID</code>, <code>ProjectID</code>, <code>Provider</code>, <code>Label</code>, <code>BaseURL</code>, <code>LastAuthenticated</code>, <code>ExpiresAt</code></td></tr><tr><td><code>HealthStatus</code></td><td><code>Status</code>, <code>Database</code>, <code>DriverPool</code>, <code>ProviderSessions</code>, <code>LastChecked</code></td></tr></tbody></table>\n<h3 id=\"request-types\">Request types</h3>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Type</th><th>Fields</th></tr></thead><tbody><tr><td><code>StartRunRequest</code></td><td><code>PlaybookID</code>, <code>Version *int</code>, <code>Mode</code>, <code>Inputs json.RawMessage</code>, <code>ProviderProfileID</code>, <code>ProjectID</code></td></tr><tr><td><code>CreatePlaybookRequest</code></td><td><code>Target</code>, <code>Title</code>, <code>YAML</code>, <code>AuthoredBy</code></td></tr><tr><td><code>UpdatePlaybookRequest</code></td><td><code>YAML</code>, <code>Target</code>, <code>Title</code>, <code>AuthoredBy</code></td></tr><tr><td><code>ApproveRequest</code></td><td><code>StepID</code>, <code>Decision</code></td></tr><tr><td><code>ListRunsOptions</code></td><td><code>Status</code>, <code>PlaybookID</code>, <code>Limit int</code></td></tr></tbody></table>\n<h2 id=\"error-handling\">Error handling</h2>\n<p>The SDK returns <code>*APIError</code> for non-2xx responses. All other errors are standard Go errors from <code>net/http</code> or <code>encoding/json</code>.</p>\n<pre class=\"astro-code github-dark\" style=\"background-color:#24292e;color:#e1e4e8; overflow-x: auto;\" tabindex=\"0\" data-language=\"go\"><code><span class=\"line\"><span style=\"color:#F97583\">import</span><span style=\"color:#E1E4E8\"> (</span></span>\n<span class=\"line\"><span style=\"color:#9ECBFF\">\t\"</span><span style=\"color:#B392F0\">errors</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\tpilot </span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#B392F0\">github.com/cuitty/pilot-sdk-go</span><span style=\"color:#9ECBFF\">\"</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">resp, err </span><span style=\"color:#F97583\">:=</span><span style=\"color:#E1E4E8\"> client.</span><span style=\"color:#B392F0\">StartRun</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#E1E4E8\">req)</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">if</span><span style=\"color:#E1E4E8\"> err </span><span style=\"color:#F97583\">!=</span><span style=\"color:#79B8FF\"> nil</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\tvar</span><span style=\"color:#E1E4E8\"> apiErr </span><span style=\"color:#F97583\">*</span><span style=\"color:#B392F0\">pilot</span><span style=\"color:#E1E4E8\">.</span><span style=\"color:#B392F0\">APIError</span></span>\n<span class=\"line\"><span style=\"color:#F97583\">\tif</span><span style=\"color:#E1E4E8\"> errors.</span><span style=\"color:#B392F0\">As</span><span style=\"color:#E1E4E8\">(err, </span><span style=\"color:#F97583\">&#x26;</span><span style=\"color:#E1E4E8\">apiErr) {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tfmt.</span><span style=\"color:#B392F0\">Printf</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"API error </span><span style=\"color:#79B8FF\">%d</span><span style=\"color:#9ECBFF\">: </span><span style=\"color:#79B8FF\">%s\\n</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#E1E4E8\">, apiErr.StatusCode, apiErr.Message)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t} </span><span style=\"color:#F97583\">else</span><span style=\"color:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t\tfmt.</span><span style=\"color:#B392F0\">Printf</span><span style=\"color:#E1E4E8\">(</span><span style=\"color:#9ECBFF\">\"Network error: </span><span style=\"color:#79B8FF\">%v\\n</span><span style=\"color:#9ECBFF\">\"</span><span style=\"color:#E1E4E8\">, err)</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">\t}</span></span>\n<span class=\"line\"><span style=\"color:#E1E4E8\">}</span></span></code></pre>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>Type</th><th>Fields</th><th>When</th></tr></thead><tbody><tr><td><code>*APIError</code></td><td><code>StatusCode int</code>, <code>Message string</code></td><td>Non-2xx HTTP response</td></tr><tr><td><code>error</code></td><td>standard</td><td>Network, JSON, or other failure</td></tr></tbody></table>\n<h2 id=\"see-also\">See also</h2>\n<ul>\n<li><a href=\"/docs/pilot/sdk/javascript\">JavaScript SDK</a> — TypeScript client with event streaming</li>\n<li><a href=\"/docs/pilot/playbook-reference\">Playbook reference</a> — YAML schema for playbook documents</li>\n<li><a href=\"/docs/pilot/quickstart\">Quickstart</a> — record and replay your first workflow</li>\n</ul>",
  "links_out": [
    "/docs/pilot/sdk/javascript",
    "/docs/pilot/playbook-reference",
    "/docs/pilot/quickstart"
  ]
}