# Go > Call the gateway from Go with the standard library โ€” no third-party client needed. _Source: https://aiprimetech.io/docs/sdks/go/ ยท Home > Docs > SDKs_ Both endpoints are plain JSON over HTTP, so `net/http` is sufficient. ```go package main import ( "bytes" "encoding/json" "fmt" "net/http" "os" "time" ) type msg struct { Role string `json:"role"` Content string `json:"content"` } type req struct { Model string `json:"model"` MaxTokens int `json:"max_tokens"` Messages []msg `json:"messages"` } type resp struct { Content []struct { Text string `json:"text"` } `json:"content"` Usage struct { InputTokens int `json:"input_tokens"` OutputTokens int `json:"output_tokens"` } `json:"usage"` } func main() { body, _ := json.Marshal(req{ Model: "claude-sonnet-4-6", MaxTokens: 1024, Messages: []msg{{Role: "user", Content: "Hello"}}, }) r, _ := http.NewRequest("POST", "https://aiprimetech.io/v1/messages", bytes.NewReader(body)) r.Header.Set("x-api-key", os.Getenv("CLAUDEAPIKEY")) r.Header.Set("anthropic-version", "2023-06-01") r.Header.Set("content-type", "application/json") client := &http.Client{Timeout: 120 * time.Second} res, err := client.Do(r) if err != nil { panic(err) } defer res.Body.Close() var out resp json.NewDecoder(res.Body).Decode(&out) fmt.Println(out.Content[0].Text) fmt.Println(out.Usage.InputTokens, out.Usage.OutputTokens) } ``` > Always set an explicit `Timeout` on the client. Go's default `http.Client` has none, so a stalled connection blocks a goroutine indefinitely. - [Messages API](https://aiprimetech.io/docs/api-reference/messages/) โ€” Field reference - [Best practices](https://aiprimetech.io/docs/guides/best-practices/) โ€” Retries and timeouts --- _ClaudeAPIKey.dev is an independently operated, Anthropic-compatible API gateway. Not affiliated with Anthropic._