[{"data":1,"prerenderedAt":459},["ShallowReactive",2],{"navigation":3,"\u002Fsync-api":99,"\u002Fsync-api-surround":451},[4,16,52,71,91],{"title":5,"path":6,"stem":7,"children":8,"icon":15},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F2.authentication","i-lucide-rocket",{"title":17,"path":18,"stem":19,"children":20,"icon":51},"GraphQL API","\u002Fgraphql-api","2.graphql-api\u002F1.index",[21,23,27,31,35,39,43,47],{"title":22,"path":18,"stem":19},"API Overview",{"title":24,"path":25,"stem":26},"Querying Patterns","\u002Fgraphql-api\u002Fquerying","2.graphql-api\u002F2.querying",{"title":28,"path":29,"stem":30},"Mutation Patterns","\u002Fgraphql-api\u002Fmutations","2.graphql-api\u002F3.mutations",{"title":32,"path":33,"stem":34},"List SaaS Applications","\u002Fgraphql-api\u002Fguides\u002Flist-applications","2.graphql-api\u002F4.guides\u002F1.list-applications",{"title":36,"path":37,"stem":38},"Find Unused Licenses","\u002Fgraphql-api\u002Fguides\u002Ffind-unused-licenses","2.graphql-api\u002F4.guides\u002F2.find-unused-licenses",{"title":40,"path":41,"stem":42},"Retrieve Upcoming Renewals","\u002Fgraphql-api\u002Fguides\u002Fupcoming-renewals","2.graphql-api\u002F4.guides\u002F3.upcoming-renewals",{"title":44,"path":45,"stem":46},"Handle GraphQL Errors","\u002Fgraphql-api\u002Fguides\u002Fhandle-errors","2.graphql-api\u002F4.guides\u002F4.handle-errors",{"title":48,"path":49,"icon":50},"API Reference","\u002Fgql-schema-reference","i-lucide-file-code","i-lucide-braces",{"title":53,"path":54,"stem":55,"children":56,"icon":70},"Sync API","\u002Fsync-api","3.sync-api\u002F1.index",[57,59,63,67],{"title":58,"path":54,"stem":55},"Viio Sync API",{"title":60,"path":61,"stem":62},"Quickstart","\u002Fsync-api\u002Fquickstart","3.sync-api\u002F2.quickstart",{"title":64,"path":65,"icon":66},"Examples","\u002Fsync-api\u002Faws-lambda-python","i-lucide-code-xml",{"title":68,"path":69,"icon":50},"SDK Reference","\u002Fsync-api\u002Fapi-reference","i-lucide-refresh-cw",{"title":72,"path":73,"stem":74,"children":75,"icon":90},"MCP Server","\u002Fmcp-server","4.mcp-server\u002F1.index",[76,78,82,86],{"title":77,"path":73,"stem":74},"Viio MCP Server",{"title":79,"path":80,"stem":81},"Setup","\u002Fmcp-server\u002Fsetup","4.mcp-server\u002F2.setup",{"title":83,"path":84,"stem":85},"Available Tools","\u002Fmcp-server\u002Ftools","4.mcp-server\u002F3.tools",{"title":87,"path":88,"stem":89},"SaaS Analysis Use Cases","\u002Fmcp-server\u002Fuse-cases","4.mcp-server\u002F4.use-cases","i-lucide-bot",{"title":92,"path":93,"stem":94,"children":95,"icon":98},"AI Integration","\u002Fai","5.ai\u002F1.index",[96],{"title":97,"path":93,"stem":94},"llms.txt","i-lucide-sparkles",{"id":100,"title":58,"body":101,"dateModified":440,"datePublished":441,"description":442,"extension":443,"links":444,"meta":445,"navigation":446,"path":54,"seo":447,"stem":55,"__hash__":450},"docs\u002F3.sync-api\u002F1.index.md",{"type":102,"value":103,"toc":427},"minimark",[104,108,111,127,143,148,151,156,159,162,173,176,201,205,208,212,227,230,233,241,248,252,255,265,268,272,387,392,396,399,402,417,421,424],[105,106,107],"p",{},"The Viio Sync API is a customer-facing ingestion API for sending integration data to Viio. It is the same data path used by Viio-managed integrations.",[105,109,110],{},"Use the Sync API when:",[112,113,114,118,121,124],"ul",{},[115,116,117],"li",{},"You need to control which data leaves a third-party product such as Microsoft Entra ID.",[115,119,120],{},"Your source is custom, on-premises, or not supported by a Viio-managed integration.",[115,122,123],{},"You need to transform, filter, or redact records inside your own environment before sending them.",[115,125,126],{},"You want to own the extraction schedule while keeping the resulting data visible and actionable in Viio.",[105,128,129,130,133,134,138,139,142],{},"The Sync API complements the ",[131,132,17],"a",{"href":18},": use Sync API to ",[135,136,137],"strong",{},"write integration data into Viio",", and GraphQL to ",[135,140,141],{},"read and work with Viio data",".",[144,145,147],"h2",{"id":146},"how-it-works","How It Works",[105,149,150],{},"Each source reports data under a direct integration installation in your Viio workspace. The Sync API supports two processing models: snapshots for data that represents the source's current state, and events for activity that happened at a point in time.",[152,153,155],"h3",{"id":154},"snapshot-backed-data","Snapshot-backed data",[105,157,158],{},"Snapshot-backed data is a complete list of the records that currently exist in the source. Accounts, plans, licenses, employees, groups, group members, and devices use this model.",[105,160,161],{},"When you complete a batch for one of these datasets, Viio compares the stable source IDs received in the batch with the previous completed snapshot:",[112,163,164,167,170],{},[115,165,166],{},"New IDs are added.",[115,168,169],{},"Existing IDs are updated.",[115,171,172],{},"IDs that existed in the previous snapshot but are missing from the new snapshot are marked as removed.",[105,174,175],{},"This comparison lets Viio detect records deleted from the source even when the source only returns its current records and does not provide a deletion event.",[105,177,178,179,183,184,187,188,191,192,194,195,197,198,200],{},"For example, if a completed account snapshot contains ",[180,181,182],"code",{},"account-1",", ",[180,185,186],{},"account-2",", and ",[180,189,190],{},"account-3",", and the next completed account snapshot contains only ",[180,193,182],{}," and ",[180,196,190],{},", Viio treats ",[180,199,186],{}," as removed.",[152,202,204],{"id":203},"event-based-data","Event-based data",[105,206,207],{},"Usage, externally discovered usage, audit logs, AI usage, and AI cost are individual observations. Viio processes each accepted record as an event. The absence of an event from a later batch does not remove an earlier event.",[152,209,211],{"id":210},"batch-flow","Batch flow",[213,214,215,218,221,224],"ol",{},[115,216,217],{},"Start a batch using the direct integration installation ID.",[115,219,220],{},"Stream snapshot-backed records, event records, or both in one or more messages.",[115,222,223],{},"Complete the batch after every intended record has been accepted and every snapshot-backed collection included in the run is complete.",[115,225,226],{},"Viio reconciles the included snapshot-backed collections, retains accepted events, and finishes the run.",[105,228,229],{},"Only one Sync API batch can be active for a direct integration installation at a time. A second run cannot start until the active batch is completed or aborted.",[105,231,232],{},"If a run cannot finish, abort it to release the integration lock and allow the next run to start. Aborting does not roll back records already accepted by Viio.",[234,235,238],"callout",{"color":236,"icon":237},"amber","i-lucide-triangle-alert",[105,239,240],{},"Only complete a batch when every snapshot-backed collection included in the run represents the source's complete current state. A filtered, truncated, or partially paginated snapshot can cause valid source records to be marked as removed. Event-only batches do not perform missing-record reconciliation.",[105,242,243,244,247],{},"See the ",[131,245,246],{"href":61},"quickstart"," for the complete SDK lifecycle, including completion, deletion, abort, and retry behavior.",[144,249,251],{"id":250},"endpoint","Endpoint",[105,253,254],{},"The production endpoint is:",[256,257,263],"pre",{"className":258,"code":260,"language":261,"meta":262},[259],"language-text","https:\u002F\u002Fsync.viio.io\n","text","",[180,264,260],{"__ignoreMap":262},[105,266,267],{},"The official SDKs connect to this endpoint over TLS with HTTP\u002F2.",[144,269,271],{"id":270},"supported-data","Supported Data",[273,274,275,291],"table",{},[276,277,278],"thead",{},[279,280,281,285,288],"tr",{},[282,283,284],"th",{},"Data type",[282,286,287],{},"Processing model",[282,289,290],{},"Common uses",[292,293,294,306,316,327,337,347,357,367,377],"tbody",{},[279,295,296,300,303],{},[297,298,299],"td",{},"Accounts",[297,301,302],{},"Snapshot",[297,304,305],{},"Accounts in a SaaS product, including identity, state, and roles",[279,307,308,311,313],{},[297,309,310],{},"Plans and licenses",[297,312,302],{},[297,314,315],{},"Subscription plans and the accounts assigned to them",[279,317,318,321,324],{},[297,319,320],{},"Usage",[297,322,323],{},"Event",[297,325,326],{},"Last activity for an account, plan, or product",[279,328,329,332,334],{},[297,330,331],{},"Employees",[297,333,302],{},[297,335,336],{},"Workforce identity and organizational profile data",[279,338,339,342,344],{},[297,340,341],{},"Groups and group members",[297,343,302],{},[297,345,346],{},"Teams, directory groups, and membership relationships",[279,348,349,352,354],{},[297,350,351],{},"Externally discovered usage",[297,353,323],{},[297,355,356],{},"Usage activity discovered by an external (non-Viio) Discovery Engine",[279,358,359,362,364],{},[297,360,361],{},"Devices",[297,363,302],{},[297,365,366],{},"Managed devices and their owners",[279,368,369,372,374],{},[297,370,371],{},"Audit logs",[297,373,323],{},[297,375,376],{},"Application activity and its actor",[279,378,379,382,384],{},[297,380,381],{},"AI usage and cost",[297,383,323],{},[297,385,386],{},"Provider-native AI consumption and cost records",[105,388,243,389,391],{},[131,390,68],{"href":69}," for the supported record models and their language-specific properties.",[144,393,395],{"id":394},"before-you-start","Before You Start",[105,397,398],{},"Currently, your Viio representative must provision a passive direct integration installation under which the source's data can be reported. Self-service creation of passive integrations in the Viio UI is coming soon.",[105,400,401],{},"You need:",[112,403,404,407,414],{},[115,405,406],{},"The direct integration installation ID.",[115,408,409,410,413],{},"A workspace API key with write access and the ",[180,411,412],{},"integration:sync"," permission.",[115,415,416],{},"An official Viio Sync API SDK for your language when available.",[418,419],"read-more",{"title":420,"to":61},"Build a complete SDK sync",[418,422],{"title":423,"to":69},"SDK reference",[418,425],{"title":426,"to":65},"AWS Lambda with Python",{"title":262,"searchDepth":428,"depth":429,"links":430},1,2,[431,437,438,439],{"id":146,"depth":429,"text":147,"children":432},[433,435,436],{"id":154,"depth":434,"text":155},3,{"id":203,"depth":434,"text":204},{"id":210,"depth":434,"text":211},{"id":250,"depth":429,"text":251},{"id":270,"depth":429,"text":271},{"id":394,"depth":429,"text":395},"2026-08-10","2026-07-30","Use the Viio Sync API to push data from custom, on-premises, or customer-managed software into Viio.","md",null,{},true,{"title":448,"description":449},"Viio Sync API Documentation","Use the Viio Sync API to push identity, license, usage, device, and audit data from custom or customer-managed systems into Viio.","EzDeR2X81ot52HR-IQttGtiaSdHxNNeMSNup_kY_8Lw",[452,457],{"title":453,"path":454,"stem":455,"description":456,"children":-1},"Tenant","\u002Fgql-schema-reference\u002Ftenant","3.gql-schema-reference\u002Ftenant","Tenant settings, members, currency, and data retention.",{"title":60,"path":61,"stem":62,"description":458,"children":-1},"Install an SDK and safely start, stream, complete, retry, and abort Sync API batches.",1787319043123]