package arenza import ( "bytes" "context" "encoding/json" "fmt" "net/http" "os" "time" ) type Receipt struct { Accepted bool `json:"accepted"` ReceiptID string `json:"receipt_id"` Duplicate bool `json:"duplicate"` StatusURL string `json:"status_url"` } func SendEvent(ctx context.Context, event map[string]any, deliveryID string) (Receipt, error) { var receipt Receipt installID := os.Getenv("ARENZA_INSTALL_ID") apiKey := os.Getenv("ARENZA_API_KEY") if installID == "" || apiKey == "" || deliveryID == "" { return receipt, fmt.Errorf("missing Arenza credentials or delivery ID") } body, err := json.Marshal(event) if err != nil { return receipt, err } url := "https://api.arenza.ai/api/v1/billing-events/" + installID request, err := http.NewRequestWithContext(ctx, http.MethodPost, url, bytes.NewReader(body)) if err != nil { return receipt, err } request.Header.Set("Content-Type", "application/json") request.Header.Set("webhook-id", deliveryID) request.Header.Set("Authorization", "Bearer "+apiKey) client := &http.Client{Timeout: 10 * time.Second} response, err := client.Do(request) if err != nil { return receipt, err } defer response.Body.Close() if response.StatusCode != http.StatusAccepted { return receipt, fmt.Errorf("Arenza returned HTTP %d", response.StatusCode) } if err := json.NewDecoder(response.Body).Decode(&receipt); err != nil { return receipt, err } if !receipt.Accepted || receipt.ReceiptID == "" { return receipt, fmt.Errorf("invalid Arenza receipt") } return receipt, nil }