Where each device_data field comes from on iOS, and what attribution loses without it.
device_data is the object you send on init, attribution-data, and signup. It carries the signals Linkrunner uses to match an install to a click. On iOS, every field comes from an Apple framework, so you need no third-party libraries.The full client collects all of these for you. This page explains each one so you can trust, trim, or rebuild that collection.
If you send neither adservices_attribution_token nor idfa, install registration still works, but paid attribution for Apple Search Ads and ad-network matching will be weak or missing.
This is the most reliable iOS attribution signal and needs no user permission. The AdServices framework returns a short-lived token that Linkrunner exchanges with Apple server-side.
The IDFA is only available after the user grants App Tracking Transparency. Add NSUserTrackingUsageDescription, prompt while the app is active, then read the IDFA.
import AppTrackingTransparencyimport AdSupport// Prompt once, when the app is active (for example after the first screen appears)func requestTracking() async { await withCheckedContinuation { cont in ATTrackingManager.requestTrackingAuthorization { _ in cont.resume() } }}// Read the IDFA only if the user authorized trackingfunc idfa() -> String? { guard ATTrackingManager.trackingAuthorizationStatus == .authorized else { return nil } return ASIdentifierManager.shared().advertisingIdentifier.uuidString}
If your app targets children, do not request tracking and do not collect the IDFA.
iOS measures ad-driven installs through SKAdNetwork. After you call init, signup, capture-event, or capture-payment, the response can include a conversion value:
Apply it with SKAdNetwork.updatePostbackConversionValue. The full client does this for you in applySKAN. See SKAdNetwork integration for the dashboard side.
Plain framework lookups. The full client includes them.
device_model: the hardware identifier from uname()machine (for example iPhone17,3). On the simulator, read SIMULATOR_MODEL_IDENTIFIER from the environment. Linkrunner uses only this field for Device Model on iOS, because device_name can be the name the user gave the phone.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Linkrunner","colors":{"primary":"#4D4BF7","light":"#8F8DFF","dark":"#3D3BD6"},"logo":{"light":"https://mintcdn.com/linkrunner-01ef8e08/_XePLHtHoIx-Kdim/logo/light.svg?fit=max\u0026auto=format\u0026n=_XePLHtHoIx-Kdim\u0026q=85\u0026s=69657b87602f94e3e7904f8c505f1ac4","dark":"https://mintcdn.com/linkrunner-01ef8e08/_XePLHtHoIx-Kdim/logo/dark.svg?fit=max\u0026auto=format\u0026n=_XePLHtHoIx-Kdim\u0026q=85\u0026s=d9940dc70fb7cc27e5627a337afef6bc"},"favicon":"https://mintcdn.com/linkrunner-01ef8e08/AR3evcOHloq2fdUR/favicon.svg?fit=max\u0026auto=format\u0026n=AR3evcOHloq2fdUR\u0026q=85\u0026s=8eec3df8b2648803e61c858cc8bc609b","navbar":{"links":[{"href":"mailto:support@linkrunner.io","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.linkrunner.io"}},"seo":{"metatags":{"og:image":"https://docs.linkrunner.io/images/og-image.png","twitter:image":"https://docs.linkrunner.io/images/og-image.png"}},"contextual":{"options":["copy","view","chatgpt","claude",{"title":"Connect Linkrunner to Claude Code","description":"Add the Linkrunner MCP server and sign in","icon":"plug","href":"https://docs.linkrunner.io/features/mcp#claude-code"}],"display":"header"},"markdown":{"instructions":["Linkrunner has a remote MCP server at https://mcp.linkrunner.io/mcp. People sign in to Linkrunner in a browser popup (OAuth), so there is no token to copy. New users sign up in the same popup.","If a person asks you to sign them up, log them in, or set Linkrunner up and you have no Linkrunner tools, do not send them to the website: tell them to add the connector and walk them through it. In Claude: Customize (or Settings), Connectors, Add custom connector, name Linkrunner, URL https://mcp.linkrunner.io/mcp, leave the OAuth fields empty, click Connect, sign in or sign up in the popup, click Allow, then turn the connector on for the chat and ask again.","Before sign-in, only get_linkrunner_overview and search_documentation work. Any other tool asks the person to sign in first.","To set a person up: connect the server, then call get_my_account, list_projects, find_app_in_store (confirm the right app with the person), and create_project. create_project returns the project ID and the SDK token. Install the SDK with that token. get_sdk_configuration returns the token again later.","Rules: a company email is needed to create a project (Gmail accounts cannot), an app project needs a live App Store or Play Store listing, a person can create up to 3 projects per day from an AI assistant, and using an existing project needs the Admin, Owner or Manager role.","Claude Code: claude mcp add --transport http linkrunner https://mcp.linkrunner.io/mcp, then run /mcp to sign in.","Guides: connector setup and tool reference at https://docs.linkrunner.io/features/mcp, manual setup at https://docs.linkrunner.io/quickstart. To integrate the SDK in a codebase, use the @linkrunner/skills package: https://docs.linkrunner.io/ai-agent-skills"]},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"linkrunner-01ef8e08","hasAudioNarration":false,"actualSubdomain":"linkrunner-01ef8e08","customDomains":["docs.linkrunner.io"],"gitSource":{"type":"github","owner":"linkrunner-labs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae1ece0494007f2551002c7","collectionId":"893a64ba-edae-4297-a0d8-1e5a4e04dd00","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae1ece0494007f2551002c7"},"entitlements":{},"buildId":"6ae1ece0494007f2551002c7","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Guides","count":78},{"language":"default","tag":"Partners","count":26},{"language":"default","tag":"Integrations","count":22},{"language":"default","tag":"API Reference","count":19},{"language":"default","tag":"Measurement \u0026 Privacy","count":18},{"language":"default","tag":"Affiliate Partners","count":15},{"language":"default","tag":"SDK Guides","count":15},{"language":"default","tag":"Links \u0026 Journeys","count":14},{"language":"default","tag":"Ad Networks","count":10},{"language":"default","tag":"Analytics Integrations","count":10}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"sdk-less/ios-device-data","slug":"/sdk-less/ios-device-data","pageMetadata":{"title":"Collecting Device Data","description":"Where each device_data field comes from on iOS, and what attribution loses without it.","icon":"database","href":"/sdk-less/ios-device-data"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Where each device_data field comes from on iOS, and what attribution loses without it.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`device_data`}),` is the object you send on `,_jsx(_components.code,{children:`init`}),`, `,_jsx(_components.code,{children:`attribution-data`}),`, and `,_jsx(_components.code,{children:`signup`}),`. It carries the signals Linkrunner uses to match an install to a click. On iOS, every field comes from an Apple framework, so you need no third-party libraries.`]}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.a,{href:`/sdk-less/ios-quickstart`,children:`full client`}),` collects all of these for you. This page explains each one so you can trust, trim, or rebuild that collection.`]}),`\n`,_jsx(Heading,{level:`2`,id:`info-plist`,children:`Info.plist`}),`\n`,_jsx(_components.p,{children:`To collect the IDFA, add a tracking usage description. Nothing else here needs a permission.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`xml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`xml`,children:_jsxs(_components.code,{language:`xml`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`NSUserTrackingUsageDescription`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`key`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`We use your data to attribute installs and measure ad performance.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`\u003c/`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#808080`},children:`>`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`what-to-send`,children:`What to send`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Source on iOS`}),_jsx(_components.th,{children:`Importance`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`adservices_attribution_token`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`AAAttribution.attributionToken()`})}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`High`}),`. Apple Search Ads attribution.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`idfa`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ASIdentifierManager`}),`, after ATT consent`]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`High`}),`, when the user allows tracking.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`idfv`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UIDevice.identifierForVendor`})}),_jsx(_components.td,{children:`Recommended. Matching fallback.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`device_model`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`uname()`}),` hardware identifier`]}),_jsx(_components.td,{children:`Recommended. Shown as Device Model on the dashboard.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`device`}),`, `,_jsx(_components.code,{children:`device_name`}),`, `,_jsx(_components.code,{children:`system_version`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UIDevice`})}),_jsx(_components.td,{children:`Recommended.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`brand`}),`, `,_jsx(_components.code,{children:`manufacturer`})]}),_jsxs(_components.td,{children:[`Always `,_jsx(_components.code,{children:`\"Apple\"`})]}),_jsx(_components.td,{children:`Recommended.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`version`}),`, `,_jsx(_components.code,{children:`build_number`}),`, `,_jsx(_components.code,{children:`bundle_id`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Bundle.main`})}),_jsx(_components.td,{children:`Recommended.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`locale`}),`, `,_jsx(_components.code,{children:`language`}),`, `,_jsx(_components.code,{children:`country`}),`, `,_jsx(_components.code,{children:`timezone`}),`, `,_jsx(_components.code,{children:`timezone_offset`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Locale`}),`, `,_jsx(_components.code,{children:`TimeZone`})]}),_jsx(_components.td,{children:`Recommended.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`device_display`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`UIScreen.main`})}),_jsx(_components.td,{children:`Optional.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`user_agent`}),`, `,_jsx(_components.code,{children:`connectivity`})]}),_jsxs(_components.td,{children:[`App-defined, `,_jsx(_components.code,{children:`NWPathMonitor`})]}),_jsx(_components.td,{children:`Optional.`})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If you send neither `,_jsx(_components.code,{children:`adservices_attribution_token`}),` nor `,_jsx(_components.code,{children:`idfa`}),`, install registration still works, but paid attribution for Apple Search Ads and ad-network matching will be weak or missing.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`apple-search-ads-attribution-token`,children:`Apple Search Ads attribution token`}),`\n`,_jsxs(_components.p,{children:[`This is the most reliable iOS attribution signal and needs no user permission. The `,_jsx(_components.code,{children:`AdServices`}),` framework returns a short-lived token that Linkrunner exchanges with Apple server-side.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` AdServices`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` adServicesToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` String`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` try`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` AAAttribution.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`attributionToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`The token is valid only briefly. Fetch it fresh each time you build `,_jsx(_components.code,{children:`device_data`}),` rather than caching it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`advertising-id-idfa`,children:`Advertising ID (IDFA)`}),`\n`,_jsxs(_components.p,{children:[`The IDFA is only available after the user grants App Tracking Transparency. Add `,_jsx(_components.code,{children:`NSUserTrackingUsageDescription`}),`, prompt while the app is active, then read the IDFA.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` AppTrackingTransparency`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` AdSupport`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Prompt once, when the app is active (for example after the first screen appears)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` requestTracking`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`async`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` withCheckedContinuation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { cont `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ATTrackingManager.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`requestTrackingAuthorization`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`_`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cont.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`resume`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Read the IDFA only if the user authorized tracking`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` idfa`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` String`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` guard`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ATTrackingManager.trackingAuthorizationStatus `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`==`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .authorized `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`else`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` nil`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ASIdentifierManager.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`shared`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`().`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`advertisingIdentifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`uuidString`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`If your app targets children, do not request tracking and do not collect the IDFA.`}),`\n`,_jsx(Heading,{level:`2`,id:`vendor-id-idfv`,children:`Vendor ID (IDFV)`}),`\n`,_jsx(_components.p,{children:`The IDFV needs no permission. It is stable across your apps on the same device, but resets when the user removes all of your apps.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` UIKit`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` idfv `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` UIDevice.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`current`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`identifierForVendor`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`uuidString`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`skadnetwork`,children:`SKAdNetwork`}),`\n`,_jsxs(_components.p,{children:[`iOS measures ad-driven installs through SKAdNetwork. After you call `,_jsx(_components.code,{children:`init`}),`, `,_jsx(_components.code,{children:`signup`}),`, `,_jsx(_components.code,{children:`capture-event`}),`, or `,_jsx(_components.code,{children:`capture-payment`}),`, the response can include a conversion value:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"fine_conversion_value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`12`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"coarse_conversion_value\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"medium\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"lock_postback\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Apply it with `,_jsx(_components.code,{children:`SKAdNetwork.updatePostbackConversionValue`}),`. The `,_jsx(_components.a,{href:`/sdk-less/ios-quickstart#skadnetwork`,children:`full client`}),` does this for you in `,_jsx(_components.code,{children:`applySKAN`}),`. See `,_jsx(_components.a,{href:`/features/skadnetwork-integration`,children:`SKAdNetwork integration`}),` for the dashboard side.`]}),`\n`,_jsx(Heading,{level:`2`,id:`everything-else`,children:`Everything else`}),`\n`,_jsxs(_components.p,{children:[`Plain framework lookups. The `,_jsx(_components.a,{href:`/sdk-less/ios-quickstart`,children:`full client`}),` includes them.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`device_model`}),`: the hardware identifier from `,_jsx(_components.code,{children:`uname()`}),` `,_jsx(_components.code,{children:`machine`}),` (for example `,_jsx(_components.code,{children:`iPhone17,3`}),`). On the simulator, read `,_jsx(_components.code,{children:`SIMULATOR_MODEL_IDENTIFIER`}),` from the environment. Linkrunner uses only this field for Device Model on iOS, because `,_jsx(_components.code,{children:`device_name`}),` can be the name the user gave the phone.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`device`}),`, `,_jsx(_components.code,{children:`device_name`}),`, `,_jsx(_components.code,{children:`system_version`}),`: `,_jsx(_components.code,{children:`UIDevice.current`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`device_display`}),`: `,_jsx(_components.code,{children:`UIScreen.main.bounds`}),` and `,_jsx(_components.code,{children:`scale`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`locale`}),`, `,_jsx(_components.code,{children:`language`}),`, `,_jsx(_components.code,{children:`country`}),`: `,_jsx(_components.code,{children:`Locale.current`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`timezone`}),`, `,_jsx(_components.code,{children:`timezone_offset`}),`: `,_jsx(_components.code,{children:`TimeZone.current`})]}),`\n`,_jsxs(_components.li,{children:[`App info: `,_jsx(_components.code,{children:`Bundle.main`}),` for `,_jsx(_components.code,{children:`version`}),` (`,_jsx(_components.code,{children:`CFBundleShortVersionString`}),`), `,_jsx(_components.code,{children:`build_number`}),` (`,_jsx(_components.code,{children:`CFBundleVersion`}),`), and `,_jsx(_components.code,{children:`bundle_id`})]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Need help?`}),` Contact `,_jsx(_components.a,{href:`mailto:support@linkrunner.io`,children:`support@linkrunner.io`})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Collecting Device Data","description":"Where each device_data field comes from on iOS, and what attribution loses without it.","icon":"database","href":"/sdk-less/ios-device-data"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Info.plist","slug":"info-plist","depth":2,"children":[]},{"title":"What to send","slug":"what-to-send","depth":2,"children":[]},{"title":"Apple Search Ads attribution token","slug":"apple-search-ads-attribution-token","depth":2,"children":[]},{"title":"Advertising ID (IDFA)","slug":"advertising-id-idfa","depth":2,"children":[]},{"title":"Vendor ID (IDFV)","slug":"vendor-id-idfv","depth":2,"children":[]},{"title":"SKAdNetwork","slug":"skadnetwork","depth":2,"children":[]},{"title":"Everything else","slug":"everything-else","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"linkrunner-01ef8e08","siteName":"Linkrunner","title":"Collecting Device Data - Linkrunner","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-24T13:40:55.194Z","originalFileLocation":"sdk-less/ios-device-data.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Where each device_data field comes from on iOS, and what attribution loses without it.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Linkrunner\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Collecting Device Data - Linkrunner\">\u003cmeta data-mint-head property=\"og:description\" content=\"Where each device_data field comes from on iOS, and what attribution loses without it.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Linkrunner\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.linkrunner.io/sdk-less/ios-device-data\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.linkrunner.io/images/og-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Collecting Device Data - Linkrunner\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Where each device_data field comes from on iOS, and what attribution loses without it.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.linkrunner.io/images/og-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/linkrunner-01ef8e08/0rfsvj-UNXDqS1Wa/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Linkrunner\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4D4BF7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.linkrunner.io/sdk-less/ios-device-data\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/sdk-less/ios-device-data.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.linkrunner.io/#organization\",\"name\":\"Linkrunner\",\"url\":\"https://docs.linkrunner.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/linkrunner-01ef8e08/_XePLHtHoIx-Kdim/logo/light.svg?fit=max\u0026auto=format\u0026n=_XePLHtHoIx-Kdim\u0026q=85\u0026s=69657b87602f94e3e7904f8c505f1ac4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.linkrunner.io#website\",\"name\":\"Linkrunner\",\"url\":\"https://docs.linkrunner.io\",\"publisher\":{\"@id\":\"https://docs.linkrunner.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.linkrunner.io/sdk-less/ios-device-data#webpage\",\"url\":\"https://docs.linkrunner.io/sdk-less/ios-device-data\",\"name\":\"Collecting Device Data\",\"description\":\"Where each device_data field comes from on iOS, and what attribution loses without it.\",\"dateModified\":\"2026-10-24T13:40:55.194Z\",\"isPartOf\":{\"@id\":\"https://docs.linkrunner.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.linkrunner.io/sdk-less/ios-device-data#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.linkrunner.io/sdk-less/ios-device-data#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"SDK-less Integration\",\"item\":\"https://docs.linkrunner.io/sdk-less/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"iOS\",\"item\":\"https://docs.linkrunner.io/sdk-less/ios-quickstart\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Collecting Device Data\",\"item\":\"https://docs.linkrunner.io/sdk-less/ios-device-data\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.linkrunner.io/sdk-less/ios-device-data#article\",\"headline\":\"Collecting Device Data\",\"name\":\"Collecting Device Data\",\"description\":\"Where each device_data field comes from on iOS, and what attribution loses without it.\",\"url\":\"https://docs.linkrunner.io/sdk-less/ios-device-data\",\"mainEntityOfPage\":{\"@id\":\"https://docs.linkrunner.io/sdk-less/ios-device-data#webpage\"},\"image\":\"https://docs.linkrunner.io/images/og-image.png\",\"dateModified\":\"2026-10-24T13:40:55.194Z\",\"publisher\":{\"@id\":\"https://docs.linkrunner.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.linkrunner.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Linkrunner\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Linkrunner","nav":{"global":null,"tabs":[{"tab":"Guides","groups":[{"group":"Getting Started","pages":[{"title":"Welcome to Linkrunner","icon":"house","href":"/introduction"},{"title":"Quickstart","icon":"rocket","href":"/quickstart"},{"title":"Set up and use Linkrunner from Claude and other AI assistants","sidebarTitle":"AI assistants (MCP)","icon":"plug","href":"/features/mcp"},{"title":"Set Up a Website Project","sidebarTitle":"Website Projects","icon":"globe","href":"/features/website-projects"},{"title":"AI Agent Skills","icon":"sparkles","href":"/ai-agent-skills"}]},{"group":"SDK Guides","pages":[{"title":"SDK Integration Testing","icon":"flask","href":"/testing/integration-testing"},{"title":"Test Custom Events and Payments","sidebarTitle":"Events and payments","icon":"vial-circle-check","href":"/testing/event-and-revenue-testing"},{"title":"Test the Web SDK","sidebarTitle":"Web SDK Testing","icon":"browser","href":"/testing/web-sdk-testing"},{"title":"Test Meta Android Attribution","sidebarTitle":"Meta Android Testing","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/logos/meta.webp","href":"/testing/meta-android-attribution-testing"},{"title":"React Native SDK","icon":"react","href":"/sdk/react-native"},{"title":"Flutter SDK","icon":"flutter","href":"/sdk/flutter"},{"title":"Capacitor SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/icons/capacitor.svg","href":"/sdk/capacitor"},{"title":"Cordova SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/icons/cordova.svg","href":"/sdk/cordova"},{"title":"iOS SDK","icon":"apple","href":"/sdk/ios"},{"title":"Android SDK","icon":"android","href":"/sdk/android"},{"title":"Expo SDK","icon":"rocket","href":"/sdk/expo"},{"title":"Appbrew SDK","icon":"store","href":"/sdk/appbrew"},{"title":"Web SDK","icon":"globe","href":"/sdk/web"},{"title":"Unity","icon":"unity","href":"/sdk/unity"},{"title":"Shopify","icon":"shopping-bag","href":"/sdk/shopify"}]},{"group":"Links \u0026 Journeys","pages":[{"title":"Create a Trackable Link","sidebarTitle":"Create a Trackable Link","icon":"link","href":"/features/create-trackable-link"},{"title":"Subdomain Setup","icon":"globe","href":"/features/subdomain-setup"},{"title":"Deep Linking Setup","icon":"link","href":"/features/deep-linking-setup"},{"title":"Deferred Deep Linking","icon":"link-simple","href":"/features/deferred-deep-linking"},{"title":"Web to App Journeys","icon":"route","href":"/features/web-to-app-journeys"},{"title":"Push Notification Tracking","icon":"bell","href":"/features/push-notification-tracking"},{"title":"Push Notification Providers","icon":"paper-plane","href":"/features/push-notification-providers"},{"title":"Link redirection","icon":"route","href":"/features/link-redirection"},{"title":"Deactivate a Campaign Link","sidebarTitle":"Deactivate a Link","icon":"link-slash","href":"/features/deactivate-campaign-link"},{"title":"Create Deep Links for App Destinations","sidebarTitle":"Deep Link Management","icon":"link","href":"/features/deep-link-management"},{"title":"Set Up Referral Tracking","sidebarTitle":"Referral Tracking","icon":"user-group","href":"/features/referral-codes"},{"title":"Custom Store Listings","icon":"store","href":"/features/custom-store-listing"},{"title":"Social Media Intermediary Page","icon":"mobile-screen","href":"/features/social-media-intermediary-page"},{"title":"Custom landing pages","icon":"browser","href":"/features/custom-landing-page"}]},{"group":"Analytics","pages":[{"title":"Users","icon":"users","href":"/features/users-tab"},{"title":"Events","icon":"list-timeline","href":"/features/events-tab"},{"title":"Data Export: CSV exports for campaigns and users","sidebarTitle":"Data Export","icon":"file-arrow-down","href":"/features/data-export"}]},{"group":"Measurement \u0026 Privacy","pages":[{"title":"Uninstall Tracking","icon":"chart-line-down","href":"/features/uninstall-tracking"},{"title":"Retention: Cumulative vs Classic vs Rolling","sidebarTitle":"Retention","icon":"chart-line","href":"/features/retention"},{"title":"Meta Install Referrer","icon":"meta","href":"/features/meta-install-referrer"},{"title":"Send Consent","icon":"user-shield","sidebarTitle":"Send Consent","href":"/features/send-consent"},{"title":"iOS Campaign Data Limitations","icon":"apple","href":"/features/ios-campaign-data-limitations"},{"title":"Attribution Windows: Default Click Lookback Windows","sidebarTitle":"Attribution Windows","icon":"clock","href":"/features/attribution-windows"},{"title":"Connected TV (CTV) Attribution","sidebarTitle":"CTV Attribution","icon":"tv","href":"/features/ctv-attribution"},{"title":"Fraud Control: Flag and Suppress Invalid Traffic","sidebarTitle":"Fraud Control","icon":"shield-check","href":"/features/fraud-control"},{"group":"SKAdNetwork","icon":"apple","pages":[{"title":"SKAN Setup","icon":"apple","href":"/features/skadnetwork-integration"},{"title":"Google Ads SKAN Setup","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/logos/google.webp","sidebarTitle":"Google SKAN Setup","href":"/features/google-skan-setup"},{"title":"Meta SKAN Setup","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/logos/meta.webp","sidebarTitle":"Meta SKAN Setup","href":"/features/meta-skan-setup"},{"title":"Conversion Values in SKAdNetwork","icon":"chart-line","href":"/features/skadnetwork-conversion-values"},{"group":"SKAN Dashboard","icon":"gauge","pages":[{"title":"SKAN Dashboard Overview","href":"/features/skan-dashboard/overview"},{"title":"Stats Overview Cards","href":"/features/skan-dashboard/stats-cards"},{"title":"Privacy Tier Breakdown","href":"/features/skan-dashboard/privacy-tiers"},{"title":"Conversion Value Distribution","href":"/features/skan-dashboard/conversion-values"},{"title":"Install Trends Over Time","href":"/features/skan-dashboard/trend-graph"},{"title":"All Conversion Values Table","href":"/features/skan-dashboard/conversion-table"}]}]}]},{"group":"Remarketing","pages":[{"title":"How to Run Remarketing Campaigns Using Linkrunner","icon":"rocket","href":"/features/remarketing-guide"},{"title":"Remarketing \u0026 Reattribution","icon":"arrows-rotate","href":"/features/remarketing"},{"group":"Creating Audience Segments","pages":[{"title":"Creating Audience Segments","icon":"users","href":"/features/remarketing-audience-segments"},{"title":"Audience from Tracked Events","icon":"chart-mixed","href":"/features/remarketing-audience-events"},{"title":"Audience from Customer List","icon":"upload","href":"/features/remarketing-audience-upload"}]},{"title":"Running Remarketing Campaigns","icon":"bullhorn","href":"/features/remarketing-campaigns"}]},{"group":"Billing","pages":[{"title":"Billing Overview","icon":"credit-card","href":"/billing/overview"},{"title":"Linkrunner Wallet","icon":"wallet","sidebarTitle":"Linkrunner Wallet","href":"/billing/wallet"},{"title":"Add Your Finance Team","icon":"receipt","href":"/billing/finance-role"}]},{"group":"Troubleshooting","pages":[{"title":"Why Is My Test Showing Attribution to the Wrong Campaign?","icon":"bug","href":"/testing/testing-attribution-troubleshooting"},{"title":"Give Linkrunner access to Meta","sidebarTitle":"Meta support access","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/logos/meta.webp","href":"/ad-networks/meta-support-access"},{"title":"Give Linkrunner access to Google Ads","sidebarTitle":"Google support access","icon":"https://mintlify.s3.us-west-1.amazonaws.com/linkrunner-01ef8e08/images/logos/google.webp","href":"/ad-networks/google-support-access"},{"title":"Google Ads FAQ and Discrepancies","icon":"circle-question","href":"/ad-networks/google-ads-discrepancies"},{"title":"Meta Ads FAQ and Discrepancies","icon":"circle-question","href":"/ad-networks/meta-ads-discrepancies"},{"title":"Meta View-Through Attribution FAQ","icon":"circle-question","href":"/ad-networks/meta-view-through-attribution"}]},{"group":"SDK-less Integration","pages":[{"title":"SDK-less Integration","icon":"plug","href":"/sdk-less/introduction"},{"group":"Android","icon":"android","pages":[{"title":"Android Quickstart","icon":"android","href":"/sdk-less/android-quickstart"},{"title":"Collecting Device Data","icon":"database","href":"/sdk-less/android-device-data"},{"title":"Minimal Integration","icon":"feather","href":"/sdk-less/android-minimal"}]},{"group":"iOS","icon":"apple","pages":[{"title":"iOS Quickstart","description":"The recommended SDK-less path on iOS: one Swift client that collects every signal and calls every endpoint.","icon":"apple","href":"/sdk-less/ios-quickstart"},{"title":"Collecting Device Data","icon":"database","href":"/sdk-less/ios-device-data"},{"title":"Minimal Integration","description":"The smallest iOS integration that still attributes: install, signup, event, payment.","icon":"feather","href":"/sdk-less/ios-minimal"}]},{"title":"API Reference","icon":"code","href":"/sdk-less/api-reference"}]}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/ad-networks/google-ads"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/data-apis"}]},{"tab":"Partners","pages":[{"title":"Partners","href":"/affiliate-partners/getting-started"}]}]},"title":"Collecting Device Data - Linkrunner","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}