Go SDK¶
The official Go client library for AMP.
Installation¶
Quick Start¶
package main
import (
"context"
"fmt"
"github.com/ubiship/amp-go"
)
func main() {
client := amp.NewClient("amp_live_xxxxxxxxxxxxx")
// Create a mission
mission, err := client.Missions.Create(context.Background(), &.MissionCreateParams{
Name: "Go SDK Test",
Objectives: []string{"Test the SDK"},
Platforms: []string{"twitter"},
Duration: 7,
})
if err != nil {
panic(err)
}
fmt.Printf("Created mission: %s\n", mission.ID)
}
Configuration¶
Client Options¶
client := amp.NewClient(
"amp_live_xxx",
amp.WithBaseURL("https://custom.api.url"),
amp.WithTimeout(60 * time.Second),
amp.WithHTTPClient(customHTTPClient),
)
Environment Variables¶
Resources¶
Missions¶
// List missions
missions, err := client.Missions.List(ctx, &.MissionListParams{
Status: amp.String("active"),
Limit: amp.Int64(20),
})
// Create mission
mission, err := client.Missions.Create(ctx, &.MissionCreateParams{
Name: "My Mission",
Objectives: []string{"Drive awareness"},
Platforms: []string{"twitter", "linkedin"},
Constraints: &.MissionConstraints{
Tone: "professional",
Cadence: "daily",
PostsPerDay: 2,
RequireApproval: true,
},
Duration: 30,
})
// Get mission
mission, err := client.Missions.Get(ctx, "msn_xxx")
// Update mission
mission, err := client.Missions.Update(ctx, "msn_xxx", &.MissionUpdateParams{
Constraints: &.MissionConstraints{
PostsPerDay: 3,
},
})
// Pause mission
mission, err := client.Missions.Pause(ctx, "msn_xxx")
// Resume mission
mission, err := client.Missions.Resume(ctx, "msn_xxx")
// Delete mission
err := client.Missions.Delete(ctx, "msn_xxx")
Content¶
// List content
content, err := client.Content.List(ctx, &.ContentListParams{
MissionID: amp.String("msn_xxx"),
Status: amp.String("pending_review"),
})
// Get content
content, err := client.Content.Get(ctx, "cnt_xxx")
// Approve content
content, err := client.Content.Approve(ctx, "cnt_xxx", &.ContentApproveParams{
Notes: amp.String("Looks good"),
})
// Reject content
content, err := client.Content.Reject(ctx, "cnt_xxx", &.ContentRejectParams{
Reason: "Too casual",
Feedback: amp.String("Use professional tone"),
Regenerate: amp.Bool(true),
})
Analytics¶
// Get overview
analytics, err := client.Analytics.Overview(ctx, &.AnalyticsParams{
Period: "30d",
})
// Get mission analytics
analytics, err := client.Analytics.Mission(ctx, "msn_xxx")
// Get costs
costs, err := client.Analytics.Costs(ctx, &.AnalyticsParams{
Period: "30d",
})
Error Handling¶
mission, err := client.Missions.Get(ctx, "msn_xxx")
if err != nil {
var apiErr *amp.Error
if errors.As(err, &apiErr) {
switch apiErr.Code {
case "not_found":
// Handle not found
case "unauthorized":
// Handle auth error
case "rate_limit_exceeded":
// Handle rate limit
time.Sleep(time.Duration(apiErr.RetryAfter) * time.Second)
default:
// Handle other errors
}
}
return err
}
Pagination¶
// Iterate through all missions
params := &.MissionListParams{Limit: amp.Int64(20)}
for {
missions, err := client.Missions.List(ctx, params)
if err != nil {
return err
}
for _, mission := range missions.Data {
fmt.Println(mission.ID)
}
if !missions.HasMore {
break
}
params.StartingAfter = amp.String(missions.Data[len(missions.Data)-1].ID)
}
Webhooks¶
func handleWebhook(w http.ResponseWriter, r *http.Request) {
payload, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "Error reading body", http.StatusBadRequest)
return
}
signature := r.Header.Get("X-AMP-Signature")
timestamp := r.Header.Get("X-AMP-Timestamp")
event, err := amp.ConstructEvent(payload, signature, timestamp, webhookSecret)
if err != nil {
http.Error(w, "Invalid signature", http.StatusUnauthorized)
return
}
switch event.Type {
case "content.published":
var content amp.Content
if err := json.Unmarshal(event.Data, &content); err != nil {
http.Error(w, "Error parsing event", http.StatusBadRequest)
return
}
// Handle published content
}
w.WriteHeader(http.StatusOK)
}