[{"data":1,"prerenderedAt":148},["ShallowReactive",2],{"doc:\u002Fdocs\u002Freading-events":3},{"page":4,"toc":141,"updated":147},{"path":5,"title":6,"seoTitle":7,"description":8,"blocks":9},"\u002Fdocs\u002Freading-events","Reading events","Reading Events with the Server API","Read identification events with a secret key: one event by request ID, or a window of events filtered by visitor or level, for up to 30 days.",[10,13,18,60,62,65,87,109,112,120,123,129,133,136,138],{"type":11,"text":12},"p","Every identification is stored as an event you can read with a secret key for 30 days. Read one to [verify an identification](\u002Fdocs\u002Fserver-side-verification), or list a window of them to investigate a visitor, backfill your warehouse or reconcile with webhooks.",{"type":14,"level":15,"text":16,"id":17},"heading",2,"One event","one-event",{"type":19,"samples":20},"code",[21,25,29,32,36,40,44,48,52,56],{"label":22,"lang":23,"code":24},"Node.js","ts","import { load } from '@fingerly\u002Fnode'\n\nconst fingerly = load({ secretKey: process.env.FINGERLY_SECRET_KEY! })\nconst event = await fingerly.events.get('01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4')",{"label":26,"lang":27,"code":28},"Python","python","import os\nfrom fingerly import Fingerly\n\nfingerly = Fingerly(secret_key=os.environ[\"FINGERLY_SECRET_KEY\"])\nevent = fingerly.events.get(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\")",{"label":30,"lang":27,"code":31},"Python (async)","import os\nfrom fingerly import AsyncFingerly\n\nfingerly = AsyncFingerly(secret_key=os.environ[\"FINGERLY_SECRET_KEY\"])\nevent = await fingerly.events.get(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\")",{"label":33,"lang":34,"code":35},"Go","go","import fingerly \"github.com\u002Ffingerly-io\u002Ffingerly-go\"\n\nclient := fingerly.New(os.Getenv(\"FINGERLY_SECRET_KEY\"))\nevent, err := client.Events.Get(ctx, \"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\")",{"label":37,"lang":38,"code":39},"Java","java","import io.fingerly.server.FingerlyClient;\n\nFingerlyClient fingerly = FingerlyClient.builder()\n    .secretKey(System.getenv(\"FINGERLY_SECRET_KEY\"))\n    .build();\n\nEvent event = fingerly.events().get(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\");",{"label":41,"lang":42,"code":43},".NET","csharp","using Fingerly;\n\nvar fingerly = new FingerlyClient(Environment.GetEnvironmentVariable(\"FINGERLY_SECRET_KEY\"));\nvar ev = await fingerly.Events.GetAsync(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\");",{"label":45,"lang":46,"code":47},"PHP","php","\u003C?php\n\n$fingerly = new \\Fingerly\\Client(getenv('FINGERLY_SECRET_KEY'));\n$event = $fingerly->events->get('01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4');",{"label":49,"lang":50,"code":51},"Ruby","ruby","require \"fingerly\"\n\nfingerly = Fingerly::Client.new(secret_key: ENV.fetch(\"FINGERLY_SECRET_KEY\"))\nevent = fingerly.events.get(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\")",{"label":53,"lang":54,"code":55},"Rust","rust","let fingerly = fingerly::Client::new(std::env::var(\"FINGERLY_SECRET_KEY\")?);\nlet event = fingerly.events().get(\"01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\").await?;",{"label":57,"lang":58,"code":59},"cURL","bash","curl \"https:\u002F\u002Fus.api.fingerly.io\u002Fapi\u002Fv1\u002Fevents\u002F01a0a84b-e6a2-7c09-9f51-0b3d7a26c8e4\" \\\n  -H \"x-api-key: $FINGERLY_SECRET_KEY\"",{"type":11,"text":61},"A single event also includes the archived submission as `document`, with the threshold and weights profile that scored it, and any deferred report as `deferred_signals`. See [Get an event](\u002Freference\u002Fget-event).",{"type":14,"level":15,"text":63,"id":64},"A window of events","a-window-of-events",{"type":19,"samples":66},[67,69,71,73,75,77,79,81,83,85],{"label":22,"lang":23,"code":68},"const page = await fingerly.events.list({ level: 'high', limit: 50 })",{"label":26,"lang":27,"code":70},"page = fingerly.events.list(level=\"high\", limit=50)",{"label":30,"lang":27,"code":72},"page = await fingerly.events.list(level=\"high\", limit=50)",{"label":33,"lang":34,"code":74},"page, err := client.Events.List(ctx, &fingerly.EventListParams{Level: \"high\", Limit: 50})",{"label":37,"lang":38,"code":76},"EventPage page = fingerly.events().list(EventListParams.builder().level(\"high\").limit(50).build());",{"label":41,"lang":42,"code":78},"var page = await fingerly.Events.ListAsync(new EventListOptions { Level = \"high\", Limit = 50 });",{"label":45,"lang":46,"code":80},"$page = $fingerly->events->list(['level' => 'high', 'limit' => 50]);",{"label":49,"lang":50,"code":82},"page = fingerly.events.list(level: \"high\", limit: 50)",{"label":53,"lang":54,"code":84},"let page = fingerly.events().list(&ListEvents { level: Some(Level::High), limit: Some(50), ..Default::default() }).await?;",{"label":57,"lang":58,"code":86},"curl \"https:\u002F\u002Fus.api.fingerly.io\u002Fapi\u002Fv1\u002Fevents?level=high&limit=50\" \\\n  -H \"x-api-key: $FINGERLY_SECRET_KEY\"",{"type":88,"columns":89,"rows":93},"table",[90,91,92],"Parameter","Default","Notes",[94,98,102,106],[95,96,97],"`from`, `to`","The last 24 hours","RFC 3339. At most 30 days wide, starting at most 30 days ago.",[99,100,101],"`page`, `limit`","`1`, `10`","`limit` is at most 200. Pages reach back at most 10,000 events.",[103,104,105],"`visitor`","none","One exact visitor ID.",[107,104,108],"`level`","`low`, `medium` or `high`.",{"type":14,"level":15,"text":110,"id":111},"Everything a visitor did","everything-a-visitor-did",{"type":19,"samples":113},[114,116,118],{"label":22,"lang":23,"code":115},"const history = await fingerly.events.list({\n  visitor: 'X9pL2mRc7KvT4bQw8NdF',\n  from: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n  limit: 200,\n})",{"label":26,"lang":27,"code":117},"history = fingerly.events.list(\n    visitor=\"X9pL2mRc7KvT4bQw8NdF\",\n    from_=datetime.now(timezone.utc) - timedelta(days=30),\n    limit=200,\n)",{"label":30,"lang":27,"code":119},"history = await fingerly.events.list(\n    visitor=\"X9pL2mRc7KvT4bQw8NdF\",\n    from_=datetime.now(timezone.utc) - timedelta(days=30),\n    limit=200,\n)",{"type":14,"level":15,"text":121,"id":122},"Paging through a window","paging-through-a-window",{"type":19,"samples":124},[125,127],{"label":22,"lang":23,"code":126},"async function* allEvents(from: Date, to: Date) {\n  for (let page = 1; ; page++) {\n    const result = await fingerly.events.list({ from, to, page, limit: 200 })\n    yield* result.rows\n    if (result.rows.length \u003C result.page_size) return\n  }\n}",{"label":30,"lang":27,"code":128},"async def all_events(from_: datetime, to: datetime):\n    page = 1\n    while True:\n        result = await fingerly.events.list(from_=from_, to=to, page=page, limit=200)\n        for event in result.rows:\n            yield event\n        if len(result.rows) \u003C result.page_size:\n            return\n        page += 1",{"type":130,"tone":131,"text":132},"callout","tip","A page reaches back at most 10,000 events. To export more, split the window into smaller windows, or keep your own copy with the `identification.completed` [webhook](\u002Fdocs\u002Fwebhooks).",{"type":14,"level":15,"text":134,"id":135},"Triggers in events","triggers-in-events",{"type":11,"text":137},"Events group their triggers by [signal group](\u002Fdocs\u002Fsignals): a trigger's `signal` is the group, such as `vpn`, and its `weight` is what the group added. The identify response and the `visitor.suspect` webhook list the individual signals.",{"type":130,"tone":139,"text":140},"note","Each secret key reads only its own environment. Reads are free and do not count against your rate limit.",[142,143,144,145,146],{"id":17,"text":16,"level":15},{"id":64,"text":63,"level":15},{"id":111,"text":110,"level":15},{"id":122,"text":121,"level":15},{"id":135,"text":134,"level":15},"2026-09-17T08:28:36.000Z",1789667797514]