[{"data":1,"prerenderedAt":88},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fsdks\u002Fangular":3},{"page":4,"toc":79,"updated":87},{"path":5,"title":6,"seoTitle":7,"description":8,"blocks":9},"\u002Fdocs\u002Fsdks\u002Fangular","Angular","Angular SDK: Signals and Providers","Identify visitors in Angular 19 and newer with environment providers and signal-based injection functions. Zoneless and server-rendering safe.",[10,13,18,23,26,39,42,48,50,53,58,61,63,66,72,74,77],{"type":11,"text":12},"p","`@fingerly\u002Fangular` provides the [JavaScript SDK](\u002Fdocs\u002Fsdks\u002Fjavascript) to your application and reads the shared identification as read-only signals.",{"type":14,"level":15,"text":16,"id":17},"heading",2,"Requirements","requirements",{"type":19,"items":20},"list",[21,22],"Angular 19 or newer, with standalone bootstrap.","A [public key](\u002Fdocs\u002Fapi-keys) with your site in its allowed origins.",{"type":14,"level":15,"text":24,"id":25},"Install","install",{"type":27,"samples":28},"code",[29,33,36],{"label":30,"lang":31,"code":32},"npm","bash","npm install @fingerly\u002Fangular",{"label":34,"lang":31,"code":35},"pnpm","pnpm add @fingerly\u002Fangular",{"label":37,"lang":31,"code":38},"yarn","yarn add @fingerly\u002Fangular",{"type":14,"level":15,"text":40,"id":41},"Provide it","provide-it",{"type":27,"samples":43},[44],{"label":45,"lang":46,"code":47},"app.config.ts","ts","import { ApplicationConfig } from '@angular\u002Fcore'\nimport { provideFingerly } from '@fingerly\u002Fangular'\n\nexport const appConfig: ApplicationConfig = {\n  providers: [provideFingerly({ apiKey: 'fly_pk_us_production_…' })],\n}",{"type":11,"text":49},"Add it where the application or a route is bootstrapped, not in component providers. The state is created lazily, once per application.",{"type":14,"level":15,"text":51,"id":52},"Identify on an action","identify-on-an-action",{"type":27,"samples":54},[55],{"label":56,"lang":46,"code":57},"checkout.component.ts","import { Component, input } from '@angular\u002Fcore'\nimport { injectIdentify } from '@fingerly\u002Fangular'\n\n@Component({\n  selector: 'app-checkout',\n  template: `\n    \u003Cbutton (click)=\"submit()\" [disabled]=\"fingerly.isLoading()\">\n      {{ fingerly.isLoading() ? 'Checking…' : 'Pay now' }}\n    \u003C\u002Fbutton>\n    @if (fingerly.error(); as failure) { \u003Cp>{{ failure.message }}\u003C\u002Fp> }\n  `,\n})\nexport class CheckoutComponent {\n  readonly orderId = input.required\u003Cstring>()\n  readonly fingerly = injectIdentify({ tag: () => 'checkout:' + this.orderId() })\n\n  async submit() {\n    const { requestId } = await this.fingerly.identify()\n    await submitOrder(this.orderId(), requestId)\n  }\n}",{"type":14,"level":15,"text":59,"id":60},"injectIdentify","injectidentify",{"type":11,"text":62},"Call it in an injection context: a field initialiser, a constructor, or `runInInjectionContext`. Options are `immediate` (identify in `afterNextRender`) and `tag` (a string, a getter or a signal). Every state field is a `Signal`, including the computed `isReady` and `isSuspicious`.",{"type":14,"level":15,"text":64,"id":65},"injectVerdict","injectverdict",{"type":27,"samples":67},[68],{"label":69,"lang":46,"code":70,"check":71},"notice.component.ts","readonly automation = injectVerdict('automation', { min: 'high' })\n\n\u002F\u002F template: @if (automation.matched()) { … }",false,{"type":11,"text":73},"Returns `matched`, `verdict`, `confidence` and `reasons` as signals. Verdict names are `incognito`, `shields`, `tor`, `emulator`, `automation` and `farm`.",{"type":14,"level":15,"text":75,"id":76},"Server rendering","server-rendering",{"type":11,"text":78},"`afterNextRender` callbacks never run on the server, and the state is inert without a window. Calling `identify()` during server rendering rejects with `FingerlyServerError`.",[80,81,82,83,84,85,86],{"id":17,"text":16,"level":15},{"id":25,"text":24,"level":15},{"id":41,"text":40,"level":15},{"id":52,"text":51,"level":15},{"id":60,"text":59,"level":15},{"id":65,"text":64,"level":15},{"id":76,"text":75,"level":15},"2026-09-17T16:59:11.000Z",1789667797806]