# Choosing an SDK

> Fingerly SDKs for the browser, six web frameworks, iOS, Android, React Native, Flutter, Lynx, and eight server languages. Which to use, and how they fit together.

Last updated: 2026-09-17

A Fingerly integration has two halves. A **client SDK** runs where the visitor is, collects signals and identifies them with a public key. A **server SDK** runs on your backend and reads the result with a secret key, so decisions are made on data the visitor cannot edit.

## Web

Every web SDK is built on the JavaScript SDK. The framework bindings share one identification per page and are safe under server rendering.

- [JavaScript](https://docs.fingerly.io/docs/sdks/javascript): Any site, any framework
- [React](https://docs.fingerly.io/docs/sdks/react): Provider and hooks
- [Next.js](https://docs.fingerly.io/docs/sdks/nextjs): App Router and Server Actions
- [Vue](https://docs.fingerly.io/docs/sdks/vue): Plugin and composables
- [Nuxt](https://docs.fingerly.io/docs/sdks/nuxt): Module with auto-imports
- [Svelte](https://docs.fingerly.io/docs/sdks/svelte): Svelte 5 and SvelteKit
- [Angular](https://docs.fingerly.io/docs/sdks/angular): Providers and signals

## Mobile

The native SDKs collect what only native code can reach. The cross-platform packages call them rather than collecting less.

- [iOS](https://docs.fingerly.io/docs/sdks/ios): Swift, iOS 13+
- [Android](https://docs.fingerly.io/docs/sdks/android): Kotlin, API 21+
- [React Native](https://docs.fingerly.io/docs/sdks/react-native): Bridge to native
- [Flutter](https://docs.fingerly.io/docs/sdks/flutter): Dart plugin
- [Lynx](https://docs.fingerly.io/docs/sdks/lynx): Native module

## Server

Server SDKs read events and verify webhooks, with the same calls in every language. Any other language can do both over [the HTTP API](https://docs.fingerly.io/reference/overview) with one request and one HMAC.

- [Node.js](https://docs.fingerly.io/docs/sdks/node): Events, webhooks, proxy
- [Python](https://docs.fingerly.io/docs/sdks/python): Sync and asyncio
- [Go](https://docs.fingerly.io/docs/sdks/go): Context-aware client
- [Java](https://docs.fingerly.io/docs/sdks/java): Java 11+, Kotlin, Scala
- [.NET](https://docs.fingerly.io/docs/sdks/dotnet): C#, async, DI
- [PHP](https://docs.fingerly.io/docs/sdks/php): PHP 8.1+
- [Ruby](https://docs.fingerly.io/docs/sdks/ruby): Ruby 3.1+, Rails
- [Rust](https://docs.fingerly.io/docs/sdks/rust): Async, Tokio
- [Cloudflare Worker](https://docs.fingerly.io/docs/sdks/cloudflare-worker): First-party proxy

## What every client SDK shares

| Guarantee | What it means for you |
| --- | --- |
| No permission prompts | No dialog, picker or permission request on any platform, for any signal. |
| A strict time budget | Collection stops at its budget. A slow or failing signal is recorded as such and never holds up the answer. |
| Never crashes your app | Every signal source is isolated. One that throws cannot take the report or your app with it. |
| One response shape | Browsers, iPhones and Android phones get the same fields back: request ID, visitor ID, score, level and triggers. |
| Retries once, charged once | Network failures, `429` and `5xx` are retried with a single idempotency key. |
| Advisory local verdicts | Verdicts computed on the device help your interface. The server's score is the one to act on. |

### Versions

Every SDK follows semantic versioning on its own schedule and targets version `v1` of the API. SDKs report their version with every request, and events record it as `sdk_platform` and `sdk_version`, so the dashboard shows which builds are still in use.
