Go client for the YNAB API, generated from the official OpenAPI spec using oapi-codegen.
go get thde.io/ynabclient, err := ynab.New(
ynab.WithBearerToken("your-personal-access-token"),
)
if err != nil {
log.Fatal(err)
}
resp, err := client.GetBudgetsWithResponse(ctx, nil)Get a personal access token from your YNAB developer settings.
Use WithUserAgent to identify your application in requests:
client, err := ynab.New(
ynab.WithBearerToken("your-personal-access-token"),
ynab.WithUserAgent("my-app/1.0"),
)The YNAB API allows 200 requests per hour. Use WithRateLimiter to avoid hitting the limit:
// Use the built-in default (200 req/hour, burst 1):
client, err := ynab.New(
ynab.WithBearerToken("your-personal-access-token"),
ynab.WithRateLimiter(nil),
)
// Or bring your own limiter:
limiter := rate.NewLimiter(rate.Every(time.Hour/200), 5)
client, err := ynab.New(
ynab.WithBearerToken("your-personal-access-token"),
ynab.WithRateLimiter(limiter),
)Most endpoints accept a LastKnowledgeOfServer parameter. When set, the server returns only entities that changed since that point, making repeated polling much cheaper. Each response includes a ServerKnowledge value to use on the next call.
var knowledge int64
// First call, fetch everything.
resp, err := client.GetAccountsWithResponse(ctx, budgetID, &ynab.GetAccountsParams{})
// Persist resp.JSON200.Data.ServerKnowledge, then on subsequent calls:
resp, err = client.GetAccountsWithResponse(ctx, budgetID, &ynab.GetAccountsParams{
LastKnowledgeOfServer: knowledge,
})
knowledge = resp.JSON200.Data.ServerKnowledgeSee the YNAB API docs for details.
make generate # regenerate client from the YNAB OpenAPI spec
make test # run tests
make lint # run linters
make lint-fix # run linters and auto-fix issues
make update # update dependencies and regenerateMIT