{"id":42242994,"url":"https://github.com/vmorsell/avanza-sdk-go","last_synced_at":"2026-04-28T02:00:32.132Z","repository":{"id":320457059,"uuid":"1082160541","full_name":"vmorsell/avanza-sdk-go","owner":"vmorsell","description":"Go SDK for the trading platform Avanza","archived":false,"fork":false,"pushed_at":"2026-04-21T01:04:47.000Z","size":257,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-21T01:37:36.670Z","etag":null,"topics":["avanza","bankid","broker","brokerage","brokerage-api","fintech","go","golang","investment","nordic","reverse-engineered","sdk","server-sent-events","sse","stock-market","sweden","trading"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/vmorsell/avanza-sdk-go","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vmorsell.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-23T20:28:56.000Z","updated_at":"2026-04-21T01:04:48.000Z","dependencies_parsed_at":"2025-10-31T00:07:21.976Z","dependency_job_id":null,"html_url":"https://github.com/vmorsell/avanza-sdk-go","commit_stats":null,"previous_names":["vmorsell/avanza-sdk-go"],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/vmorsell/avanza-sdk-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmorsell%2Favanza-sdk-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmorsell%2Favanza-sdk-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmorsell%2Favanza-sdk-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmorsell%2Favanza-sdk-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vmorsell","download_url":"https://codeload.github.com/vmorsell/avanza-sdk-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vmorsell%2Favanza-sdk-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32362782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"online","status_checked_at":"2026-04-28T02:00:07.250Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avanza","bankid","broker","brokerage","brokerage-api","fintech","go","golang","investment","nordic","reverse-engineered","sdk","server-sent-events","sse","stock-market","sweden","trading"],"created_at":"2026-01-27T04:18:52.848Z","updated_at":"2026-04-28T02:00:32.110Z","avatar_url":"https://github.com/vmorsell.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# avanza-sdk-go\n\n[![CI](https://github.com/vmorsell/avanza-sdk-go/actions/workflows/ci.yml/badge.svg)](https://github.com/vmorsell/avanza-sdk-go/actions/workflows/ci.yml)\n[![Go Reference](https://pkg.go.dev/badge/github.com/vmorsell/avanza-sdk-go.svg)](https://pkg.go.dev/github.com/vmorsell/avanza-sdk-go)\n[![Go Report Card](https://goreportcard.com/badge/github.com/vmorsell/avanza-sdk-go)](https://goreportcard.com/report/github.com/vmorsell/avanza-sdk-go)\n[![Latest Release](https://img.shields.io/github/v/release/vmorsell/avanza-sdk-go?sort=semver)](https://github.com/vmorsell/avanza-sdk-go/releases)\n[![Go Version](https://img.shields.io/github/go-mod/go-version/vmorsell/avanza-sdk-go)](go.mod)\n[![License](https://img.shields.io/github/license/vmorsell/avanza-sdk-go)](LICENSE)\n\nGo SDK for [Avanza Bank](https://www.avanza.se), the Swedish online broker. Unofficial, reverse-engineered from the web client, so the API surface here tracks whatever Avanza's own frontend uses. No public API exists.\n\nCovers BankID login, account and position data, order placement (stocks, funds, stop-loss), instrument search, and real-time streams (order-book depth, own-order updates, stop-loss events) over SSE.\n\n\u003e 0.x software. The Avanza endpoints are undocumented and can change without notice. Pin exact versions, and expect minor bumps to occasionally break things.\n\n## Install\n\n```bash\ngo get github.com/vmorsell/avanza-sdk-go\n```\n\nRequires Go 1.23 or newer.\n\n## Quick start\n\nAuthentication is BankID only. The flow starts a session, renders a QR in your terminal, polls until you scan it, then exchanges the result for session cookies.\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n    \"time\"\n\n    \"github.com/vmorsell/avanza-sdk-go\"\n)\n\nfunc main() {\n    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)\n    defer cancel()\n\n    c := avanza.New()\n\n    startResp, err := c.Auth.StartBankID(ctx)\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    if err := c.Auth.DisplayQRCode(startResp.QRToken); err != nil {\n        log.Fatal(err)\n    }\n\n    collectResp, err := c.Auth.PollBankIDWithQRUpdates(ctx)\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    if err := c.Auth.EstablishSession(ctx, collectResp); err != nil {\n        log.Fatal(err)\n    }\n\n    overview, err := c.Accounts.GetOverview(ctx)\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Printf(\"logged in as %s, %d accounts\\n\", collectResp.Name, len(overview.Accounts))\n}\n```\n\nHold on to the `Avanza` struct after that. Every service (`Auth`, `Accounts`, `Trading`, `Market`) hangs off it and they share one HTTP client, cookie jar, and rate limiter. Safe to share across goroutines.\n\n## Placing an order\n\n```go\nresp, err := c.Trading.PlaceOrder(ctx, \u0026trading.PlaceOrderRequest{\n    RequestID:   uuid.New().String(),\n    AccountID:   accountID,\n    OrderbookID: \"5247\", // Investor B on Stockholmsbörsen\n    Side:        trading.OrderSideBuy,\n    Condition:   trading.OrderConditionNormal,\n    Price:       245.50,\n    Volume:      10,\n})\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Printf(\"order %s: %s\\n\", resp.OrderID, resp.OrderRequestStatus)\n```\n\nFor anything real, run `Trading.ValidateOrder` and `Trading.GetPreliminaryFee` first. Validation flags commission thresholds, price ramping, large-in-scale, etc. The fee call gives you the commission in the order's currency before you commit.\n\n## Streaming\n\nOrder-book depth, own-order updates, and stop-loss events come over Server-Sent Events. Subscriptions reconnect automatically on transient failures with exponential backoff from 3s up to 30s.\n\n```go\nsub, err := c.Market.SubscribeToOrderDepth(ctx, \"738784\")\nif err != nil {\n    log.Fatal(err)\n}\ndefer sub.Close()\n\nfor {\n    select {\n    case event := \u003c-sub.Events():\n        if event.Event == \"ORDER_DEPTH\" {\n            for i, lvl := range event.Data.Levels {\n                fmt.Printf(\"%d: %.0f @ %.2f / %.0f @ %.2f\\n\",\n                    i, lvl.BuyVolume, lvl.BuyPrice, lvl.SellVolume, lvl.SellPrice)\n            }\n        }\n    case err := \u003c-sub.Errors():\n        log.Printf(\"stream error: %v\", err)\n        return\n    case \u003c-ctx.Done():\n        return\n    }\n}\n```\n\n`sub.Close()` cancels the underlying context and waits for goroutines to drain before returning.\n\n## Configuration\n\nFunctional options on `avanza.New`:\n\n```go\nc := avanza.New(\n    avanza.WithBaseURL(\"http://localhost:8080\"),\n    avanza.WithHTTPClient(\u0026http.Client{Timeout: 60 * time.Second}),\n    avanza.WithUserAgent(\"my-trading-bot/1.0\"),\n    avanza.WithRateLimiter(\u0026client.SimpleRateLimiter{Interval: 200 * time.Millisecond}),\n)\n```\n\nDefaults: `https://www.avanza.se`, stdlib `http.Client`, minimum 100ms between requests. The rate limiter is an interface, so swap it for something smarter if you need token bucket or adaptive behavior.\n\n## Errors\n\nNon-2xx responses come back as `*client.HTTPError`:\n\n```go\n_, err := c.Accounts.GetOverview(ctx)\nif err != nil {\n    var httpErr *client.HTTPError\n    if errors.As(err, \u0026httpErr) {\n        log.Printf(\"avanza %d: %s\", httpErr.StatusCode, httpErr.Body)\n    }\n}\n```\n\nBodies are left raw because Avanza's error shapes aren't consistent enough to model generically.\n\n## Examples\n\nRunnable end-to-end examples live under [`examples/`](examples/), grouped by feature. Each is a `main.go` you can run directly once you have a test account.\n\n## License\n\n[MIT](LICENSE).\n\n## Disclaimer\n\nNot affiliated with Avanza Bank AB. The endpoints are undocumented and may change or break at any point. Trading involves real money; bugs here could cause unintended orders. Test against small positions before letting anything loose.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmorsell%2Favanza-sdk-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvmorsell%2Favanza-sdk-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvmorsell%2Favanza-sdk-go/lists"}