Skip to content

quickstart

Go SDK Quickstart

Consume the Go source module and use context-aware Fieldloop batch and receipt operations.

Go SDK Quickstart

Prerequisites and installation

Use Go 1.25.1+ and a teammately-go source checkout. In an application without an existing workspace:

Shell
go work init . /path/to/teammately-go

For an existing workspace, use go work use /path/to/teammately-go. Keep machine-local workspace configuration out of published module dependencies. The SDK module is github.com/teammately/teammately-go.

Submit and inspect a batch

Inject TEAMMATELY_API_KEY through the host secret mechanism and configure the three destination identifiers below. This complete program sends one fictional record:

Context-aware batch submission
Go
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "os"

    teammately "github.com/teammately/teammately-go"
    "github.com/teammately/teammately-go/fieldloop"
)

func main() {
    if err := capture(context.Background()); err != nil { log.Fatal(err) }
}

func capture(ctx context.Context) error {
    client, err := teammately.New(teammately.Config{
        APIKey: os.Getenv("TEAMMATELY_API_KEY"),
    })
    if err != nil { return err }
    scope := fieldloop.Scope{
        Organization: os.Getenv("TEAMMATELY_ORGANIZATION"),
        Project: os.Getenv("TEAMMATELY_PROJECT"),
        Source: os.Getenv("TEAMMATELY_FIELDLOOP_SOURCE"),
    }
    batch, err := fieldloop.PrepareBatch([]fieldloop.Log{{
        SourceEventID: "support-ticket-1042:reply",
        OccurredAt: "2026-10-31T09:30:00Z",
        Input: json.RawMessage(`{"question":"Has my bicycle shipped?"}`),
        Output: json.RawMessage(`{"reply":"Your bicycle is being packed."}`),
    }}, "support-ticket-1042:batch-1")
    if err != nil { return err }
    receipt, err := client.Fieldloop.SubmitPrepared(
        ctx, scope, batch, teammately.RetryPolicy{})
    if err != nil { return err }
    processed, err := client.Fieldloop.WaitReceipt(
        ctx, scope, receipt.BatchID, fieldloop.PollOptions{})
    if err != nil { return err }
    fmt.Println(processed.AcceptedCount, processed.DuplicateCount,
        processed.ConflictCount, processed.RejectedCount)
    return nil
}

Pass the application's context and optional deadline in real services. Teammately supplies destination IDs; your application owns event/batch keys. json.RawMessage preserves captured JSON numbers.

Continuous ingestion and evaluations

Use fieldloop.NewIngestor(ctx, client.Fieldloop, scope, options) for continuous ingestion. Add acknowledges memory; Close drains. Retain source records until admission is known. Delivery and Recovery explains pending batches and processing receipts.

client.Evaluations provides scoped context, criteria, results, comparisons, external submissions and managed API operations through evaluations.Scope. It does not package source or run an evaluator. Use the CLI for local-file workflows.

Found something unclear?

Report outdated, unsupported, or confusing docs so we can fix the source page.

Report a docs issue

Continue learning

Related docs