SDK Reference
Official Linkit SDKs — integrate the Linkit API from any language with production-grade resilience, fluent builders, and type safety.
SDK Reference
Linkit provides official SDKs for 10 languages across 11 packages. Every SDK implements the same architecture: typed models, fluent builders or transport-first service APIs, production-grade resilience (where applicable), and full public API parity enforced by scripts/sdks/parity-manifest.json (119 operations, MCP excluded) plus 131 generated parity tests per package (119 route assertions + 12 shared integration/queue/golden checks).
Parity gate
Run bash scripts/sdks/verify-sdk-parity.sh after Swagger changes. It regenerates manifests, syncs parity-coverage.json, asserts 131 tests per SDK via verify-sdk-parity-test-counts.py, and executes each language's parity suite when toolchains are installed.
Same API, Every Language
All REST SDKs cover the full public /api/v1 surface: catalog (Products, SKUs, Branches, Categories, Brands, Generics, Customers, Orders, Offers), integrations (apps list, config, execute, batch), queue (async job poll + metrics), SMS, paylinks & payment orders, email marketing, blog, verifications, org-apps, auth/credentials, health/telemetry, and docs — plus typed entity services and generated PublicApi helpers per language.
Choose Your SDK
C# / .NET 10 (Modern)
.NET 10 · System.Text.Json · IAsyncEnumerable · zero external deps · NuGet
C# / .NET Framework 4.8 (Legacy)
.NET Framework 4.8 · Newtonsoft.Json · Task-based async · enterprise-ready · NuGet
TypeScript
Node.js / Deno / Bun · fetch API · full type inference · npm
Python
Python 3.10+ · httpx · asyncio · dataclasses · pip / PyPI
Dart / Flutter
Dart 3 / Flutter · dio · zero reflection · pub.dev
Kotlin / JVM
Kotlin 2.1 · OkHttp · coroutines · Java interop · Maven Central
Rust
Rust · reqwest · tokio · zero-cost abstractions · crates.io
Swift
Swift 5.9+ · URLSession · async/await · Codable · SPM
Go
Go 1.22+ · net/http · context.Context · functional options · go get
C++20
C++20 · transport-first · header-only core · std::future async · CMake
Zig
Zig 0.16.0+ · allocator-aware · pluggable transport · zero forced runtime deps
Architecture Comparison
| Feature | C# Modern | C# Legacy | TypeScript | Python | Dart | Kotlin | Rust | Swift | Go | C++ | Zig |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Async I/O | async/await | async/await | Promise | asyncio | Future | suspend | async/await | async/await | context.Context | std::future | explicit async |
| Serialization | System.Text.Json | Newtonsoft.Json | Native JSON | dataclasses | Hand-written | kotlinx.serialization | serde | Codable | encoding/json | user-defined | user-defined |
| HTTP Client | HttpClient | HttpClient | fetch | httpx | dio | OkHttp | reqwest | URLSession | net/http | pluggable | pluggable |
| Streaming | IAsyncEnumerable | Batch Tasks | AsyncIterator | async for | Stream | Flow | Stream | AsyncSequence | channels | iterators | iterators |
| Resilience | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | ✅ Built-in | transport | transport |
| Builders | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Fluent | ✅ Options | service methods | ✅ Fluent |
| Validation | ✅ On build | ✅ On build | ✅ On build | ✅ On build | ✅ On build | ✅ On build | ✅ On build | ✅ On build | ✅ On call | ✅ Constructor | ✅ On build |
| Package | NuGet | NuGet | npm | pip | pub | Maven | Cargo | SPM | go get | CMake | Zig build |
| External Deps | Zero | Newtonsoft.Json | Zero | httpx | dio | OkHttp | reqwest, serde | Zero | Zero | Zero | Zero |
Common Patterns
Every SDK follows these patterns:
Client Initialization
await using var client = await LinkitClient.CreateClientAsync(
config => config.WithBaseUrl("https://linkit.works/api/v1"),
jwtToken: "your-jwt-token"
);using var client = await LinkitClient.CreateClientAsync(
config => config.WithBaseUrl("https://linkit.works/api/v1"),
jwtToken: "your-jwt-token"
);const client = LinkitClient.quickSetup("https://linkit.works/api/v1", "your-jwt-token");client = LinkitClient.quick_setup("https://linkit.works/api/v1", "your-jwt-token")final client = LinkitClient.quickSetup('https://linkit.works/api/v1', 'your-jwt-token');val client = LinkitClient.quickSetup("https://linkit.works/api/v1", "your-jwt-token")let client = LinkitClient::builder()
.base_url("https://linkit.works/api/v1")
.build()?
.with_auth("your-jwt-token").await?;let client = try LinkitClient.quickSetup(
baseUrl: "https://linkit.works",
jwtToken: "your-jwt-token"
)client, err := linkit.QuickSetup("https://linkit.works/api/v1", "your-jwt-token")auto transport = std::make_shared<MyHttpTransport>();
auto client = linkit::Client::quick_setup(
"https://linkit.works/api/v1",
"your-jwt-token",
transport
);var client = try linkit.Client.init(allocator, .{
.base_url = "https://linkit.works/api/v1",
.jwt_token = "your-jwt-token",
}, .{
.ctx = &transport_state,
.send_fn = my_send_fn,
});Fluent Builders
await client.Skus()
.UpdateStock("SKU-001", "BR-RYD")
.SetQuantity(500)
.SetAvailability(true)
.ExecuteAsync();await client.Skus()
.UpdateStock("SKU-001", "BR-RYD")
.SetQuantity(500)
.SetAvailability(true)
.ExecuteAsync()
.ConfigureAwait(false);const sku = new SkuCreateBuilder()
.withIvId("SKU-001")
.inBranch("BR-RYD")
.forProduct("P-001")
.withPrice(29.99)
.build();sku = (SkuCreateBuilder()
.with_iv_id("SKU-001")
.in_branch("BR-RYD")
.for_product("P-001")
.with_price(29.99)
.build())final sku = (SkuCreateBuilder()
..withIvId('SKU-001')
..inBranch('BR-RYD')
..forProduct('P-001')
..withPrice(29.99))
.build();val sku = SkuCreateBuilder()
.withIvId("SKU-001")
.inBranch("BR-RYD")
.forProduct("P-001")
.withPrice(29.99)
.build()let sku = client.skus().create()
.iv_id("SKU-001")
.branch_iv_id("BR-RYD")
.product_iv_id("P-001")
.price(29.99)
.send().await?;let sku = try await client.skus.create(
SKURequest(
ivId: "SKU-001",
branchIvId: "BR-RYD",
productIvId: "P-001",
price: 29.99,
qty: 100,
available: true
)
)sku, err := client.SKUs.Create(ctx, &linkit.SKURequest{
IvID: "SKU-001", BranchIvID: "BR-RYD",
ProductIvID: "P-001", Price: ptr(29.99),
})auto sku = client.skus().create(linkit::SkuRequest{
.iv_id = "SKU-001",
.branch_iv_id = "BR-RYD",
.product_iv_id = "P-001",
.price = 29.99
});var sku_builder = linkit.SkuCreateBuilder{};
const sku = try sku_builder
.withIvId("SKU-001")
.inBranch("BR-RYD")
.forProduct("P-001")
.withPrice(29.99)
.build();Resilience Pipeline
Every request flows through a 3-layer resilience pipeline — automatically:
- Rate Limiter — Controls concurrent requests (default: 10)
- Circuit Breaker — Opens after N failures, auto-recovers via half-open state
- Retry with Jitter — Exponential backoff + random jitter for transient errors (5xx, 429, timeouts)
C++ and Zig SDKs use a transport-first design — resilience is delegated to whichever HTTP transport you inject. All other SDKs implement the resilience pipeline internally.
No configuration needed — sensible defaults are applied. Override via LinkitConfiguration.
Parity tests
Every REST SDK ships with the same generated route suite: 119 manifest assertions plus 12 shared checks (integration stubs, queue/X-Async, golden fixtures) — 131 tests per package.
After you change docs/swagger.json, run the gate from the repo root:
bash scripts/sdks/verify-sdk-parity.shThat script regenerates parity-manifest.json, syncs each SDK's parity-coverage.json, verifies test counts, and runs each language's suite when the toolchain is installed.
| SDK | Typical test command |
|---|---|
| Rust | cd sdks/rust/linkit && cargo test |
| TypeScript | cd sdks/ts/linkit-ts && bun test |
| Python | cd sdks/python/linkit-python && pytest |
| Go | cd sdks/go/linkit-go && go test ./... |
| Kotlin | cd sdks/kotlin/linkit-kotlin && ./gradlew test (JDK 17–24 via sdks/scripts/resolve-kotlin-jdk.sh) |
| C# modern / legacy | dotnet test in each project directory |
| Dart, Swift, C++, Zig | see sdks/scripts/build-sdks.sh for the exact target |
The machine-readable matrix lives on the Coverage Matrix page and in coverage-matrix.json.
Rust note: generated PublicApi methods use snake_case (for example get_v1_branches_2), matching the parity manifest — not camelCase aliases.
TypeScript note: public-api-service.ts is generated from the same manifest as the parity tests; do not hand-edit it.
See SDK Downloads for tarball/npm/crates links.