# Introduction ## What is Viio? Viio is a SaaS management platform that gives organizations full visibility into their software portfolio. It tracks applications, licenses, users, spending, and renewals — helping IT and procurement teams optimize costs and manage their SaaS stack. ## What Can You Build? The Viio developer platform lets you: - **Query your SaaS data** — Retrieve applications, license plans, users, spending, and renewal information via the GraphQL API. - **Sync data from any system** — Push normalized identity, license, usage, device, and audit data from custom or unsupported software into Viio. - **Automate analysis with AI** — Connect AI assistants like Claude, ChatGPT, Cursor, and Microsoft Copilot to Viio through the MCP Server for intelligent spend analysis and optimization recommendations. - **Build custom dashboards** — Pull Viio data into your own tools and reporting systems. - **Integrate with workflows** — Use API data to trigger actions in your existing IT management processes. ## Available Integrations ### GraphQL API The primary way to interact with Viio programmatically. The API exposes your workspace's full SaaS portfolio: - Applications and their details - License plans and seat allocations - User accounts and usage data - Contract renewals and spending - Savings opportunities :read-more{title="GraphQL API" to="https://developers.viio.io/graphql-api"} ### Viio Sync API The Sync API lets you control how data is collected and push it into Viio. Use it when an existing integration does not meet your data-governance requirements or when the source is custom, on-premises, or not yet supported by Viio. :read-more{title="Viio Sync API" to="https://developers.viio.io/sync-api"} ### Viio MCP Server The Viio MCP Server connects AI assistants directly to your Viio workspace. It provides specialized tools for SaaS spend analysis, cost optimization, renewal preparation, and license reclamation. :read-more{title="Viio MCP Server" to="https://developers.viio.io/mcp-server"} ## Start with a Use Case - [List SaaS applications with GraphQL](https://developers.viio.io/graphql-api/guides/list-applications) - [Find unused licenses and potential savings](https://developers.viio.io/graphql-api/guides/find-unused-licenses) - [Retrieve upcoming contract renewals](https://developers.viio.io/graphql-api/guides/upcoming-renewals) - [Analyze SaaS spend with an AI assistant](https://developers.viio.io/mcp-server/use-cases) # Authentication All Viio API requests require authentication via an **API key** generated from the Viio dashboard. ## Generating an API Key 1. Log in to the [Viio dashboard](https://app.viio.io){rel=""nofollow""}. 2. Open the account menu by clicking your workspace logo in the sidebar, then go to [**Preferences** > **API Keys**](https://app.viio.io/preferences/api-keys){rel=""nofollow""}. 3. Click **New Key**. 4. Give your key a descriptive name (e.g., "CI/CD Integration" or "Custom Dashboard"). 5. Select a permission scope — **Full Access (Read & Write)** or **Full Access (Read)**. 6. Click **Create Key**. 7. Copy the generated key — it will only be shown once. ::callout{color="amber" icon="i-lucide-triangle-alert"} Store your API key securely. Do not commit it to version control or share it in plain text. Use environment variables or a secrets manager. :: ## Making Authenticated GraphQL Requests Include your API key in the `Authorization` header: ```bash curl -X POST https://api.viio.io/graphql \ -H "Content-Type: application/json" \ -H "Authorization: YOUR_API_KEY" \ -d '{"query": "{ applications { nodes { id name } } }"}' ``` ### Header Format | Header | Value | | --------------- | ------------------ | | `Authorization` | `YOUR_API_KEY` | | `Content-Type` | `application/json` | ## Making Authenticated Sync API Requests The Sync API uses the same workspace API keys, but its gRPC metadata includes the `ApiKey` authentication scheme: ```text Authorization: ApiKey YOUR_API_KEY ``` Official SDKs attach this metadata to every request: ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp SyncApiAuthentication.ApiKey(apiKey) ``` ::: :::tabs-item{label="Python"} ```python SyncApiAuthentication.api_key(api_key) ``` ::: :: The key must have write access and the `integration:sync` permission. If that permission is not available when you create a key, contact your Viio representative to enable Sync API access for the workspace. :read-more{title="Build a complete Sync API integration" to="https://developers.viio.io/sync-api/quickstart"} ## Token Scoping API keys are scoped to your workspace. All queries return data only for the workspace associated with the key. You cannot access data from other workspaces. ## Revoking API Keys To revoke an API key: 1. Open the account menu and go to [**Preferences** > **API Keys**](https://app.viio.io/preferences/api-keys){rel=""nofollow""}. 2. Find the key you want to revoke and click the **⋮** action menu. 3. Click **Delete** and confirm in the dialog. Revoked keys immediately stop working. Any integrations using the key will receive `401 Unauthorized` responses. # API Overview The Viio GraphQL API is the primary interface for programmatic access to your SaaS management data. ## Endpoint All GraphQL requests are sent to a single endpoint: ```text POST https://api.viio.io/graphql ``` ## Why GraphQL? GraphQL lets you request exactly the data you need in a single request. Instead of calling multiple REST endpoints, you describe the shape of the data you want and the API returns it. ```graphql query { licenses(first: 5) { nodes { state annualPrice { currency amount } plan { name integration { name } } } } } ``` This single query returns the first 5 licenses with their pricing, plan, and the plan's integration — something that would require multiple requests with a traditional REST API. ## Making Your First Request Make sure you have an [API key](https://developers.viio.io/getting-started/authentication), then send a query: ```bash curl -X POST https://api.viio.io/graphql \ -H "Content-Type: application/json" \ -H "Authorization: YOUR_API_KEY" \ -d '{ "query": "{ applications(first: 3) { nodes { id state application { name } } }" }' ``` ### Response ```json { "data": { "applications": { "nodes": [ { "id": "6650a3f1e4b0...", "state": "SANCTIONED", "application": { "name": "Slack" } }, { "id": "6650a3f1e4b1...", "state": "SANCTIONED", "application": { "name": "GitHub" } }, { "id": "6650a3f1e4b2...", "state": "DISCOVERED", "application": { "name": "Figma" } } ] } } } ``` ## Operations GraphQL defines two main operation types: - **Queries** — read data without side effects. - **Mutations** — create, update, or delete data. Browse the available queries and their related schema types in the [area-based schema reference](https://developers.viio.io/gql-schema-reference). ## Error Handling GraphQL errors are returned in the `errors` array alongside any partial `data`: ```json { "errors": [ { "message": "The current user is not authorized to access this resource.", "path": ["applications"], "extensions": { "code": "AUTH_NOT_AUTHORIZED" } } ], "data": { "applications": null } } ``` Common error scenarios: | Scenario | Example message | | -------------------------- | ---------------------------------------------------------------- | | Invalid or missing API key | `The current user is not authorized to access this resource.` | | Missing required argument | `The argument 'id' is required.` | | Wrong argument type | `The specified argument value does not match the argument type.` | | Unknown field | `The field 'foo' does not exist on the type 'Query'.` | ## Practical Guides - [List SaaS applications](https://developers.viio.io/graphql-api/guides/list-applications) - [Find unused licenses](https://developers.viio.io/graphql-api/guides/find-unused-licenses) - [Retrieve upcoming renewals](https://developers.viio.io/graphql-api/guides/upcoming-renewals) - [Handle GraphQL errors safely](https://developers.viio.io/graphql-api/guides/handle-errors) # Querying Patterns The Viio GraphQL API uses cursor-based pagination and provides filtering and sorting on most collection fields. ## Pagination All collection queries use the **Relay connection pattern** with cursor-based pagination. ### Forward Pagination Use `first` to limit results and `after` to paginate forward: ```graphql query { applications(first: 10) { nodes { id application { name } } pageInfo { hasNextPage endCursor } } } ``` To fetch the next page, pass the `endCursor` value as `after`: ```graphql query { applications(first: 10, after: "eyJpZCI6Imxhc3RfaWQifQ==") { nodes { id application { name } } pageInfo { hasNextPage endCursor } } } ``` ### Backward Pagination Use `last` and `before` to paginate backward from a cursor: ```graphql query { applications(last: 10, before: "eyJpZCI6InNvbWVfaWQifQ==") { nodes { id application { name } } pageInfo { hasPreviousPage startCursor } } } ``` ### Pagination Arguments | Argument | Type | Description | | -------- | -------- | -------------------------------------------------------- | | `first` | `Int` | Number of items to return from the start of the list | | `after` | `String` | Return items after this cursor (`pageInfo.endCursor`) | | `last` | `Int` | Number of items to return from the end of the list | | `before` | `String` | Return items before this cursor (`pageInfo.startCursor`) | ### PageInfo Fields | Field | Type | Description | | ----------------- | --------- | ----------------------------------------- | | `hasNextPage` | `Boolean` | Whether more items exist after this page | | `endCursor` | `String` | Cursor of the last item in the page | | `hasPreviousPage` | `Boolean` | Whether more items exist before this page | | `startCursor` | `String` | Cursor of the first item in the page | ### Iterating Through All Pages To fetch all results, loop until `hasNextPage` is `false`: ```javascript let allNodes = []; let cursor = null; let hasNextPage = true; while (hasNextPage) { const { data } = await client.query({ query: APPLICATIONS_QUERY, variables: { first: 50, after: cursor }, }); allNodes.push(...data.applications.nodes); hasNextPage = data.applications.pageInfo.hasNextPage; cursor = data.applications.pageInfo.endCursor; } ``` ## Filtering Use the `where` argument to filter results. Filters are passed as an object with field names and conditions: ```graphql query { applications(first: 20, where: { state: { eq: SANCTIONED } }) { nodes { id state application { name } } } } ``` ### Filter Operators The available operators depend on the field type. Common operators include: **Enum and scalar fields:** | Operator | Description | Example | | -------- | ------------ | ---------------------------------------------- | | `eq` | Equal to | `{ state: { eq: SANCTIONED } }` | | `neq` | Not equal to | `{ state: { neq: DISCOVERED } }` | | `in` | In list | `{ state: { in: [SANCTIONED, IN_REVIEW] } }` | | `nin` | Not in list | `{ state: { nin: [DISQUALIFIED, ARCHIVED] } }` | **String fields:** | Operator | Description | Example | | ------------- | ------------------- | -------------------------------------- | | `eq` | Equal to | `{ name: { eq: "Slack" } }` | | `neq` | Not equal to | `{ name: { neq: "Slack" } }` | | `contains` | Contains substring | `{ name: { contains: "Slack" } }` | | `ncontains` | Does not contain | `{ name: { ncontains: "test" } }` | | `startsWith` | Starts with | `{ name: { startsWith: "Cloud" } }` | | `nstartsWith` | Does not start with | `{ name: { nstartsWith: "Test" } }` | | `endsWith` | Ends with | `{ name: { endsWith: "Pro" } }` | | `nendsWith` | Does not end with | `{ name: { nendsWith: "Beta" } }` | | `in` | In list | `{ name: { in: ["Slack", "Zoom"] } }` | | `nin` | Not in list | `{ name: { nin: ["Slack", "Zoom"] } }` | ### Combining Filters Multiple fields in the same filter object are combined with AND logic: ```graphql query { applications( first: 20 where: { state: { eq: SANCTIONED } application: { name: { contains: "Cloud" } } } ) { nodes { id application { name } } } } ``` You can also use explicit `and` / `or` arrays for more complex logic: ```graphql query { applications( first: 20 where: { or: [ { state: { eq: SANCTIONED } } { state: { eq: IN_REVIEW } } ] } ) { nodes { id state } } } ``` ## Sorting Use the `order` argument to sort results: ```graphql query { applications(first: 20, order: { application: { name: ASC } }) { nodes { id application { name } } } } ``` ### Sorting by Multiple Fields The `order` argument accepts an array, so you can sort by multiple fields. Items are sorted by the first field, with ties broken by subsequent fields: ```graphql query { applications( first: 20 order: [ { state: ASC } { application: { name: ASC } } ] ) { nodes { id state application { name } } } } ``` ### Sort Directions | Direction | Description | | --------- | ------------------------------- | | `ASC` | Ascending (A-Z, lowest first) | | `DESC` | Descending (Z-A, highest first) | # Mutation Patterns Mutations are used to create, update, or delete data. Unlike queries, mutations can have side effects and modify server-side state. ## Structure A mutation call looks similar to a query, but uses the `mutation` keyword: ```graphql mutation { createProcurementCase(input: { state: PRE, name: "Slack renewal" }) { case { id name state } errors { ... on ProcurementCaseCreationError { message } } } } ``` ## Input Arguments Mutations accept an `input` argument containing the fields to set. Some mutations also accept a `where` argument to scope the operation to matching records. The exact input type for each mutation is documented with its product area in the [schema reference](https://developers.viio.io/gql-schema-reference). ## Using Variables For dynamic values, use GraphQL variables instead of inline arguments: ```graphql mutation CreateCase($input: CreateProcurementCaseInput!) { createProcurementCase(input: $input) { case { id name state } errors { ... on ProcurementCaseCreationError { message } } } } ``` Variables are passed as a separate JSON object: ```json { "input": { "state": "PRE", "name": "Slack renewal", "deadline": "2025-06-01", "baselineType": "LAST_YEAR_COST", "baselinePrice": 12000.00 } } ``` ## Response Payloads Mutations return a payload type that contains the result and an `errors` field. Always check `errors` in the response — a non-null payload does not guarantee the operation succeeded. ```graphql mutation UpdateCase($input: UpdateProcurementCaseInput!) { updateProcurementCase(input: $input) { case { id name state savingAmount savingPercentage } errors { ... on ProcurementCaseCompletedError { message } ... on ProcurementCaseNotFoundError { message } } } } ``` ## Bulk Operations with Filters Some mutations apply changes to multiple records at once using a `where` filter. For example, to change the state of vendors matching a filter: ```graphql mutation ChangeState($input: ChangeVendorsStateInput!, $where: VendorDiscoveryFilterInput) { changeVendorsState(input: $input, where: $where) { updatedCount errors { ... on ChangeVendorsStateError { message } } } } ``` ```json { "input": { "state": "SANCTIONED" }, "where": { "vendor": { "name": { "contains": "Acme" } } } } ``` # List SaaS Applications Use the `applications` query to build an application inventory, populate a dashboard, or synchronize Viio portfolio data with another system. ## Request ```graphql query ListApplications($first: Int!, $after: String) { applications(first: $first, after: $after) { nodes { id state portfolioType lastUsed application { id name vendorName category { name } } owner { id name } userCountStat { all last30Days } } pageInfo { hasNextPage endCursor } totalCount } } ``` Send the first request with these variables: ```json { "first": 50, "after": null } ``` ## Paginate through the result When `pageInfo.hasNextPage` is `true`, send the same query again with `pageInfo.endCursor` as `after`. Continue until `hasNextPage` is `false`. Use a stable page size and process each page before requesting the next one. This bounds memory usage when a workspace contains many applications. ## Filter the inventory The optional `where` argument accepts an [`ApplicationDiscoveryFilterInput`](https://developers.viio.io/gql-schema-reference/discovery#applicationdiscoveryfilterinput-input). For example, request sanctioned applications only: ```graphql query ListSanctionedApplications { applications(first: 50, where: { state: { eq: SANCTIONED } }) { nodes { id state application { name vendorName } } } } ``` ## Related reference - [`applications` query](https://developers.viio.io/gql-schema-reference/discovery#applications-query) - [`ApplicationDiscovery` type](https://developers.viio.io/gql-schema-reference/discovery#applicationdiscovery-object) - [Pagination and filtering](https://developers.viio.io/graphql-api/querying) - [API authentication](https://developers.viio.io/getting-started/authentication) # Find Unused Licenses Use the `licenses` query with a license-activity filter to identify unused assignments and their potential annual savings. ## Request ```graphql query FindUnusedLicenses($first: Int!, $after: String) { licenses( first: $first after: $after where: { state: { activity: { eq: UNUSED } } } ) { nodes { id holder { name email employeeId } plan { id name integration { name } } annualPrice { amount currency } potentialSaving { amount currency } state { ... on UnusedLicenseState { activity reason } } } pageInfo { hasNextPage endCursor } totalCount } } ``` ## Interpret the result - `potentialSaving` is the estimated annual saving associated with the license. - `holder` identifies the employee or external user assigned to the license. - `UnusedLicenseState.reason` explains why Viio classified the license as unused. - `plan.integration.name` identifies the application or integration that supplied the license data. Group savings by currency before summing them. Convert currencies with an approved finance rate if you need a single reporting currency. ## Operational safeguards Confirm the application owner and employee context before reclaiming access. Usage signals can be delayed or incomplete, and some assignments may be required for compliance, seasonal work, or planned onboarding. ## Related reference - [`licenses` query](https://developers.viio.io/gql-schema-reference/licenses#licenses-query) - [`LicenseFilterInput` input](https://developers.viio.io/gql-schema-reference/licenses#licensefilterinput-input) - [`License` type](https://developers.viio.io/gql-schema-reference/licenses#license-object) - [`LicenseActivity` enum](https://developers.viio.io/gql-schema-reference/licenses#licenseactivity-enum) # Retrieve Upcoming Renewals Use `licensePlans` to retrieve plans whose contract-renewal dates fall inside a planning window. ## Request ```graphql query UpcomingRenewals($from: Date!, $to: Date!, $first: Int!, $after: String) { licensePlans( first: $first after: $after where: { contractDetails: { renewal: { upcomingDate: { value: { gte: $from lte: $to } } } } } order: { contractDetails: { renewal: { upcomingDate: { value: ASC } } } } ) { nodes { id name integration { id name } contractDetails { type renewal { upcomingDate { value origin } terminationPeriod { value origin } } } pricingStats { annualCost currency potentialSaving { amount percentage } } usageStats { total inUse { total } unused { total } } } pageInfo { hasNextPage endCursor } } } ``` Example variables for a 90-day planning window: ```json { "from": "2026-08-01", "to": "2026-10-31", "first": 50, "after": null } ``` ## Plan the renewal Use the renewal date together with `terminationPeriod` to calculate the practical decision deadline. Review pricing and usage before that deadline so procurement has time to validate seats, negotiate terms, or cancel. The `origin` fields indicate where contract values came from. Treat manually entered and integrated data according to your organization’s data-quality process. ## Related reference - [`licensePlans` query](https://developers.viio.io/gql-schema-reference/licenses#licenseplans-query) - [`LicensePlanFilterInput` input](https://developers.viio.io/gql-schema-reference/licenses#licenseplanfilterinput-input) - [`ContractRenewal` type](https://developers.viio.io/gql-schema-reference/licenses#contractrenewal-object) - [`Date` scalar](https://developers.viio.io/gql-schema-reference/common#date-scalar) # Handle GraphQL Errors A successful HTTP response does not always mean that every GraphQL field succeeded. Handle transport status, the top-level `errors` array, returned `data`, and typed mutation errors separately. ## Check every response layer 1. Treat network failures and non-success HTTP status codes as transport failures. 2. Parse the JSON body only when the response declares a supported JSON content type. 3. Inspect the top-level `errors` array. 4. Accept partial `data` only when your use case can safely operate without the failed fields. 5. For mutations, inspect the operation payload’s typed `errors` field before using the result. ```typescript type GraphQlError = { message: string; path?: Array; extensions?: { code?: string; }; }; type GraphQlResponse = { data?: TData; errors?: GraphQlError[]; }; const requestViio = async (query: string, variables: Record) => { const response = await fetch("https://api.viio.io/graphql", { method: "POST", headers: { Authorization: process.env.VIIO_API_KEY ?? "", "Content-Type": "application/json", }, body: JSON.stringify({ query, variables }), }); if (!response.ok) { throw new Error("Viio API request failed"); } const result: GraphQlResponse = await response.json(); if (result.errors?.length) { throw new Error("Viio API returned an unsuccessful response"); } if (!result.data) { throw new Error("Viio API response did not include data"); } return result.data; }; ``` ## Protect user-facing messages Do not display raw API error messages to end users. Log diagnostic details in an access-controlled system, then show a localized generic message such as “We couldn’t load this data. Try again.” Never log API keys, authorization headers, complete request bodies containing sensitive variables, or personal data returned by the API. ## Retry selectively Retry transient network failures and server errors with exponential backoff and jitter. Do not automatically retry authentication failures, validation errors, or mutations unless the operation is demonstrably idempotent. ## Related reference - [API overview and error responses](https://developers.viio.io/graphql-api) - [Mutation response payloads](https://developers.viio.io/graphql-api/mutations) - [API authentication](https://developers.viio.io/getting-started/authentication) # Viio Sync API 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. Use the Sync API when: - You need to control which data leaves a third-party product such as Microsoft Entra ID. - Your source is custom, on-premises, or not supported by a Viio-managed integration. - You need to transform, filter, or redact records inside your own environment before sending them. - You want to own the extraction schedule while keeping the resulting data visible and actionable in Viio. The Sync API complements the [GraphQL API](https://developers.viio.io/graphql-api): use Sync API to **write integration data into Viio**, and GraphQL to **read and work with Viio data**. ## How It Works 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. ### Snapshot-backed data 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. 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: - New IDs are added. - Existing IDs are updated. - IDs that existed in the previous snapshot but are missing from the new snapshot are marked as removed. 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. For example, if a completed account snapshot contains `account-1`, `account-2`, and `account-3`, and the next completed account snapshot contains only `account-1` and `account-3`, Viio treats `account-2` as removed. ### Event-based data 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. ### Batch flow 1. Start a batch using the direct integration installation ID. 2. Stream snapshot-backed records, event records, or both in one or more messages. 3. Complete the batch after every intended record has been accepted and every snapshot-backed collection included in the run is complete. 4. Viio reconciles the included snapshot-backed collections, retains accepted events, and finishes the run. 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. 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. ::callout{color="amber" icon="i-lucide-triangle-alert"} 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. :: See the [quickstart](https://developers.viio.io/sync-api/quickstart) for the complete SDK lifecycle, including completion, deletion, abort, and retry behavior. ## Endpoint The production endpoint is: ```text https://sync.viio.io ``` The official SDKs connect to this endpoint over TLS with HTTP/2. ## Supported Data | Data type | Processing model | Common uses | | --------------------------- | ---------------- | -------------------------------------------------------------------- | | Accounts | Snapshot | Accounts in a SaaS product, including identity, state, and roles | | Plans and licenses | Snapshot | Subscription plans and the accounts assigned to them | | Usage | Event | Last activity for an account, plan, or product | | Employees | Snapshot | Workforce identity and organizational profile data | | Groups and group members | Snapshot | Teams, directory groups, and membership relationships | | Externally discovered usage | Event | Usage activity discovered by an external (non-Viio) Discovery Engine | | Devices | Snapshot | Managed devices and their owners | | Audit logs | Event | Application activity and its actor | | AI usage and cost | Event | Provider-native AI consumption and cost records | See the [SDK Reference](https://developers.viio.io/sync-api/api-reference) for the supported record models and their language-specific properties. ## Before You Start 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. You need: - The direct integration installation ID. - A workspace API key with write access and the `integration:sync` permission. - An official Viio Sync API SDK for your language when available. :read-more{title="Build a complete SDK sync" to="https://developers.viio.io/sync-api/quickstart"} :read-more{title="SDK reference" to="https://developers.viio.io/sync-api/api-reference"} :read-more{title="AWS Lambda with Python" to="https://developers.viio.io/sync-api/aws-lambda-python"} # Quickstart A Sync API batch groups all records from one extraction run. Only one batch can be active for a direct integration installation at a time. The official SDKs manage the authenticated gRPC channel, attach the active batch ID to writes, and prevent local operations after the batch is completed or aborted. ## Before You Start You need: - A passive direct integration installation under which the source's data can be reported. - The direct integration installation ID. - A Viio API key with the `integration:sync` permission. - An official Sync API SDK. ::callout{icon="i-lucide-info"} Currently, Viio must provision the passive integration installation for you. After it is provisioned, open the integration details view in Viio to copy its direct integration installation ID. :: Install an official SDK: ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```bash dotnet add package Viio.SyncApi.Sdk --version 1.1.0 ``` ::: :::tabs-item{label="Python"} ```bash python -m pip install viio-sync-api-sdk==0.2.0 ``` ::: :: ## SDK Lifecycle | Step | Purpose | | -------- | -------------------------------------------------------------- | | Start | Acquire the integration lock and create a batch | | Write | Send one typed collection or chunk for the batch | | Complete | Reconcile snapshot-backed data and release the lock | | Abort | Stop the run and release the lock without completing snapshots | ## Configure the Client ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp using Viio.SyncApi; using Viio.SyncApi.V1.Contracts; var apiKey = Environment.GetEnvironmentVariable("VIIO_API_KEY") ?? throw new InvalidOperationException("VIIO_API_KEY is required."); using var client = new SyncApiClient( new SyncApiClientOptions( new Uri("https://sync.viio.io"), SyncApiAuthentication.ApiKey(apiKey) ) ); var cancellationToken = CancellationToken.None; ``` ::: :::tabs-item{label="Python"} ```python import os from viio_sync_api import SyncApiAuthentication, SyncApiClient, SyncApiClientOptions from viio_sync_api.v1 import Account, AccountRecords, GenericAccountDetails, SyncRecordsRequest options = SyncApiClientOptions( endpoint="https://sync.viio.io", authentication=SyncApiAuthentication.api_key(os.environ["VIIO_API_KEY"]), ) async with SyncApiClient(options) as client: ... ``` ::: :: The API key must have the `integration:sync` permission. The SDK sends it using the `Authorization: ApiKey YOUR_API_KEY` gRPC metadata value. ## StartSyncBatch Start a batch for the direct integration installation receiving the data. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp var directIntegrationInstallationId = Environment.GetEnvironmentVariable( "VIIO_DIRECT_INTEGRATION_INSTALLATION_ID" ) ?? throw new InvalidOperationException( "VIIO_DIRECT_INTEGRATION_INSTALLATION_ID is required." ); using var batch = await client.StartBatch( directIntegrationInstallationId, cancellationToken ); Console.WriteLine(batch.BatchId); ``` ::: :::tabs-item{label="Python"} ```python batch = await client.start_batch( os.environ["VIIO_DIRECT_INTEGRATION_INSTALLATION_ID"] ) print(batch.batch_id) ``` ::: :: The SDK keeps the returned batch ID on the batch object and adds it to subsequent writes. If another run owns the integration lock, the SDK raises a batch-already-in-progress error. ## SyncRecords Create a typed records wrapper and send it through the active batch. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp var accounts = new AccountRecords(); accounts.Records.Add( new Account { Generic = new GenericAccountDetails { Id = "account-100", Email = "owner@example.com", Active = true, }, } ); await batch.Write( new SyncRecordsRequest { Accounts = accounts }, cancellationToken ); ``` ::: :::tabs-item{label="Python"} ```python await batch.write( SyncRecordsRequest( accounts=AccountRecords( records=[ Account( generic=GenericAccountDetails( id="account-100", email="owner@example.com", active=True, ) ) ] ) ) ) ``` ::: :: The collection and record model must describe the same data type, and each record selects one supported details model. See the [Model Reference](https://developers.viio.io/sync-api/api-reference/models) for every collection, record model, and property. The SDK adds the active batch identifier automatically and requires exactly one typed collection in each write request. Use repeated writes for additional data types or chunks. You may: - Split a large typed collection across several writes. - Send data types in any order across writes. Writes for one batch must be sequential. Wait for the current write to finish before starting the next one, and finish every write before completing the batch. Each `SyncRecordsRequest` message must be smaller than 16 MiB. Use stable source IDs so later batches update the same logical records. ### Empty snapshots A present typed collection with an empty record list means that the source was processed successfully and currently contains no records of that type. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp await batch.Write( new SyncRecordsRequest { Accounts = new AccountRecords() }, cancellationToken ); ``` ::: :::tabs-item{label="Python"} ```python await batch.write( SyncRecordsRequest(accounts=AccountRecords()) ) ``` ::: :: When the batch completes, Viio reconciles that empty account snapshot and marks accounts from the previous snapshot as removed. Omitting `accounts` means accounts were not processed in that message; omission alone does not register an empty snapshot. ## CompleteSyncBatch Complete the batch after every intended record has been accepted and every snapshot-backed collection included in the run is complete. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp await batch.Complete(cancellationToken); ``` ::: :::tabs-item{label="Python"} ```python await batch.complete() ``` ::: :: Viio tracks each typed collection accepted during the batch. On completion, it reconciles the snapshot-backed collections that were processed and retains accepted event records. Existing snapshot records that were not included are removed. | Processing model | Data types | Completion behavior | | ---------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------------- | | Snapshot | Account, plan, license, employee, group, group member, device | Records missing from the completed snapshot are removed | | Event | Usage, externally discovered usage, audit log, AI usage, AI cost | Accepted records are processed as events; absence does not remove earlier events | ::callout{color="error" icon="i-lucide-shield-alert"} Do not complete a batch after a partial snapshot fetch. A filtered or truncated snapshot can remove valid data from Viio. Event-only batches do not perform missing-record reconciliation. :: ## AbortSyncBatch Abort an unfinished batch through its SDK batch object. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp await batch.Abort(cancellationToken); ``` ::: :::tabs-item{label="Python"} ```python await batch.abort() ``` ::: :: Abort releases only that batch's active lock so a new run can start. A delayed abort for an old batch cannot release a newer batch's lock. Aborting does not roll back records already accepted during the batch and does not run full-snapshot deletion. ## Retry Strategy Wrap the complete write lifecycle so an unsuccessful run is aborted before the error is propagated. ::tabs{sync="sync-api-language"} :::tabs-item{label="C#"} ```csharp try { await WriteBatchRecords(batch, cancellationToken); await batch.Complete(cancellationToken); } catch { await batch.Abort(CancellationToken.None); throw; } ``` ::: :::tabs-item{label="Python"} ```python try: await write_batch_records(batch) await batch.complete() except BaseException: await batch.abort() raise ``` ::: :: Use this recovery sequence after a network, source, or validation failure: 1. Stop sending records for the failed run. 2. Call `AbortSyncBatch`. 3. Fix the source or payload problem. 4. Start a new batch. 5. Resend every snapshot-backed collection in full and retry event records that were not accepted. If a records stream is interrupted, requests already accepted by Viio remain associated with the batch. Retry the failed chunk using a new stream, or abort the batch and restart the run. After aborting, resend snapshot-backed collections in full because accepted records are not carried into the new batch. The SDK batch object retains the batch identifier needed for completion and abort. If the process can terminate between operations, persist that identifier so recovery tooling can identify the unfinished server-side batch. ## Batch Lease An active batch has a renewable 15-minute lease. Successfully accepted record requests refresh the lease. If the lease expires, the batch is no longer available and a new batch can acquire the installation lock. ## Authentication and Authorization Errors | gRPC status | Meaning | | ------------------ | ------------------------------------------------------------------------------------------ | | `Unauthenticated` | The API key is missing, inactive, malformed, or could not be verified | | `PermissionDenied` | The key lacks `integration:sync` or the installation or batch belongs to another workspace | The SDK raises the corresponding authentication, protocol, or transport error. API keys are workspace-scoped, so a key cannot start, write to, complete, or abort a batch owned by another workspace. See the language-specific SDK guide for concrete error types. :read-more{title="Browse model properties" to="https://developers.viio.io/sync-api/api-reference/models"} # SDK Reference The SDK guides cover installation, client configuration, lifecycle methods, and language-specific errors. The separate Model Reference lists every supported record property and whether it is required. | Language | Package | Version reflected | Runtime | | -------- | ------------------------------------------------------------------------------------------------------- | ----------------- | ------------------------- | | C# | [`Viio.SyncApi.Sdk`](https://www.nuget.org/packages/Viio.SyncApi.Sdk/1.1.0){rel=""nofollow""} | `1.1.0` | .NET 10 | | Python | [`viio-sync-api-sdk`](https://pypi.org/project/viio-sync-api-sdk/0.2.0/){rel=""nofollow""} | `0.2.0` | Python 3.11+ with AsyncIO | ::card-group :::card --- icon: i-simple-icons-dotnet title: C# SDK to: https://developers.viio.io/sync-api/api-reference/csharp --- NuGet installation, client and batch members, and C# exceptions. ::: :::card --- icon: i-simple-icons-python title: Python SDK to: https://developers.viio.io/sync-api/api-reference/python --- Python installation, asynchronous client and batch members, and errors. ::: :::card --- icon: i-lucide-braces title: Model Reference to: https://developers.viio.io/sync-api/api-reference/models --- Collections, record properties, types, and requiredness for both SDKs. ::: :: :read-more{title="Build a complete SDK sync" to="https://developers.viio.io/sync-api/quickstart"} # C# SDK This guide covers behavior specific to [`Viio.SyncApi.Sdk` 1.1.0](https://www.nuget.org/packages/Viio.SyncApi.Sdk/1.1.0){rel=""nofollow""}. For record types and properties, use the [Model Reference](https://developers.viio.io/sync-api/api-reference/models). ## Installation ```bash dotnet add package Viio.SyncApi.Sdk --version 1.1.0 ``` The package targets .NET 10. ## Usage ```csharp using Viio.SyncApi; using Viio.SyncApi.V1.Contracts; using var client = new SyncApiClient( new SyncApiClientOptions( new Uri("https://sync.viio.io"), SyncApiAuthentication.ApiKey(apiKey) ) ); using var batch = await client.StartBatch(installationId, cancellationToken); await batch.Write( new SyncRecordsRequest { Accounts = new AccountRecords { Records = { new Account { Generic = new GenericAccountDetails { Id = "account-1", Email = "person@example.com", }, }, }, }, }, cancellationToken ); await batch.Complete(cancellationToken); ``` ## Client Configuration | Property | Required | Default | Description | | --------------------------- | -------- | ------------ | ------------------------------------------------------------------------------- | | `Endpoint` | Yes | — | Absolute HTTPS Sync API endpoint; HTTP is allowed only for loopback development | | `Authentication` | Yes | — | API-key or Viio-managed authentication | | `MaxReceiveMessageSize` | No | 16 MiB | Maximum response-message size accepted by the client | | `MaxSendMessageSize` | No | gRPC default | Maximum request-message size | | `Timeout` | No | 100 seconds | Per-operation timeout | | `HttpMessageHandlerFactory` | No | SDK default | Factory for proxies, custom certificates, or test transports | Customer-managed integrations use `SyncApiAuthentication.ApiKey(apiKey)`. The key must have the `integration:sync` permission and belong to the target installation's workspace. ## Batch Lifecycle `SyncApiBatch` implements `ISyncApiBatch` and `IDisposable`. | Member | Description | | ----------------------------------- | ----------------------------------------------------------------------- | | `BatchId` | Server-generated batch identifier | | `Write(request, cancellationToken)` | Send one typed collection | | `Complete(cancellationToken)` | Complete the batch and make the local handle terminal | | `Abort(cancellationToken)` | Abort the batch and make the local handle terminal | | `Dispose()` | Release local resources without completing or aborting the server batch | Writes are serialized. A successful completion or abort rejects later operations on the same batch object. ## Error Handling | Exception | Meaning | | ---------------------------------------- | ---------------------------------------------------- | | `SyncApiBatchAlreadyInProgressException` | Another batch owns the installation lock | | `SyncApiProtocolException` | The server rejected an SDK operation | | `SyncApiAuthenticationException` | Authentication could not produce a usable credential | | `Grpc.Core.RpcException` | Transport or server RPC failure | | `ArgumentException` | Invalid client input or configuration | | `InvalidOperationException` | The batch was already completed or aborted | For retry and abort guidance, see the [Quickstart](https://developers.viio.io/sync-api/quickstart). ## Requests and Models `Write` accepts `SyncRecordsRequest`. Set exactly one typed collection per call; the SDK adds `BatchId` automatically. The dedicated [Model Reference](https://developers.viio.io/sync-api/api-reference/models) lists every supported collection and record property, including its C# name, type, and requiredness. # Python SDK This guide covers behavior specific to [`viio-sync-api-sdk` 0.2.0](https://pypi.org/project/viio-sync-api-sdk/0.2.0/){rel=""nofollow""}. For record types and fields, use the [Model Reference](https://developers.viio.io/sync-api/api-reference/models). ## Installation ```bash python -m pip install viio-sync-api-sdk==0.2.0 ``` Python 3.11 and later are supported. ## Usage ```python from viio_sync_api import SyncApiAuthentication, SyncApiClient, SyncApiClientOptions from viio_sync_api.v1 import Account, AccountRecords, GenericAccountDetails, SyncRecordsRequest options = SyncApiClientOptions( endpoint="https://sync.viio.io", authentication=SyncApiAuthentication.api_key(api_key), ) async with SyncApiClient(options) as client: batch = await client.start_batch(installation_id) try: await batch.write( SyncRecordsRequest( accounts=AccountRecords( records=[ Account( generic=GenericAccountDetails( id="account-1", email="person@example.com", ) ) ] ) ) ) await batch.complete() except BaseException: await batch.abort() raise ``` ## Client Configuration | Field | Required | Default | Description | | -------------------------- | -------- | ------------ | ---------------------------------------------------------------------- | | `endpoint` | Yes | — | HTTPS Sync API endpoint; HTTP is allowed only for loopback development | | `authentication` | Yes | — | API-key or Viio-managed authentication | | `max_receive_message_size` | No | 16 MiB | Maximum response-message size accepted by the client | | `max_send_message_size` | No | gRPC default | Maximum request-message size | | `timeout` | No | 100 seconds | Positive per-operation timeout | Customer-managed integrations use `SyncApiAuthentication.api_key(api_key)`. The key must have the `integration:sync` permission and belong to the target installation's workspace. ## Batch Lifecycle | Member | Description | | ---------------------- | ----------------------------------------------------------------------- | | `batch_id` | Server-generated batch identifier | | `await write(request)` | Send one typed collection | | `await complete()` | Complete the batch and make the local handle terminal | | `await abort()` | Abort the batch and make the local handle terminal | | `close()` | Release local resources without completing or aborting the server batch | Writes are serialized. A successful completion or abort rejects later operations on the same batch object. ## Error Handling | Error | Meaning | | ------------------------------------ | ---------------------------------------------------- | | `SyncApiBatchAlreadyInProgressError` | Another batch owns the installation lock | | `SyncApiProtocolError` | The server rejected an SDK operation | | `SyncApiAuthenticationError` | Authentication could not produce a usable credential | | `SyncApiBatchStateError` | The batch was already completed or aborted | | `SyncApiClosedError` | The client or batch was closed | | `grpc.aio.AioRpcError` | Transport or server RPC failure | | `TypeError` or `ValueError` | Invalid client input or configuration | For retry and abort guidance, see the [Quickstart](https://developers.viio.io/sync-api/quickstart). ## Requests and Models `write` accepts `SyncRecordsRequest`. Set exactly one typed collection per call; the SDK adds `batch_id` automatically. The dedicated [Model Reference](https://developers.viio.io/sync-api/api-reference/models) lists every supported collection and record field, including its Python name, type, and requiredness. # Model Reference Use the language selector to view the public names and types exposed by each SDK. ::callout{icon="i-lucide-info"} Requiredness describes Sync API expectations; Protobuf does not enforce required fields on the wire. :: :model-property-tabs ## Accounts ::model-property-tables Accounts are snapshot-backed records representing users inside a connected product. ### Account | Property | Property | Type | Type | Required | Description | | --------- | --------- | ----------------------- | ----------------------- | ----------- | -------------------------------- | | `Generic` | `generic` | `GenericAccountDetails` | `GenericAccountDetails` | Exactly one | Provider-neutral account details | ### GenericAccountDetails | Property | Property | Type | Type | Required | Description | | ---------- | ---------- | ----------------------- | ---------------- | -------- | -------------------------------- | | `Id` | `id` | `string` | `str` | Yes | Stable source account identifier | | `Name` | `name` | `string` | `str` | No | Display name | | `Email` | `email` | `string` | `str` | No | Primary email | | `Username` | `username` | `string` | `str` | No | Source username | | `Active` | `active` | `bool` | `bool` | No | Whether the account is active | | `Roles` | `roles` | `RepeatedField` | `list[str]` | No | Roles assigned in the source | | `Details` | `details` | `AccountDetails` | `AccountDetails` | No | Vendor metadata | | `Type` | `type` | `string` | `str` | No | Source-defined account type | ### AccountDetails | Property | Property | Type | Type | Required | Description | | ------------------------------- | ------------------------------- | ------------------------- | ------------------------- | ----------- | ----------------------------------------------------------- | | `Microsoft` | `microsoft` | `MicrosoftAccountDetails` | `MicrosoftAccountDetails` | Exactly one | Microsoft-specific metadata when vendor details are present | | `MicrosoftAccountDetails.Teams` | `MicrosoftAccountDetails.teams` | `TeamsMetadata` | `TeamsMetadata` | No | Microsoft Teams metadata | | `TeamsMetadata.HasTeams` | `TeamsMetadata.has_teams` | `bool` | `bool` | Yes | Whether the account has Teams | :: ## Plans and Licenses ::model-property-tables Plans and licenses are snapshot-backed. A license associates a source account with a source plan. ### Plan | Property | Property | Type | Type | Required | Description | | --------- | --------- | -------------------- | -------------------- | ----------- | ----------------------------- | | `Generic` | `generic` | `GenericPlanDetails` | `GenericPlanDetails` | Exactly one | Provider-neutral plan details | ### GenericPlanDetails | Property | Property | Type | Type | Required | Description | | --------------------- | ----------------------- | -------------------------- | ---------------- | -------- | ------------------------------------------------------- | | `Id` | `id` | `string` | `str` | Yes | Stable source plan identifier | | `ExternalPlanName` | `external_plan_name` | `string` | `str` | Yes | Source plan name | | `ExternalProductName` | `external_product_name` | `string` | `str` | No | Product name when the source contains multiple products | | `Attributes` | `attributes` | `MapField` | `dict[str, str]` | No | Source-specific metadata | | `Details` | `details` | `PlanDetails` | `PlanDetails` | Yes | Subscription details | ### PlanDetails | Property | Property | Type | Type | Required | Description | | ------------------------- | --------------------------- | ---------------------------- | ---------------------------- | ----------- | ----------------------------------- | | `Model` | `model` | `SubscriptionModel` | `SubscriptionModel` | Yes | Subscription model | | `SeatBased` | `seat_based` | `SeatBasedSubscriptionModel` | `SeatBasedSubscriptionModel` | Conditional | Required when `Model` is seat-based | | `SeatBased.PaidSeats` | `seat_based.paid_seats` | `int` | `int` | No | Purchased seats | | `SeatBased.ConsumedSeats` | `seat_based.consumed_seats` | `int` | `int` | No | Assigned or consumed seats | ### License | Property | Property | Type | Type | Required | Description | | --------- | --------- | ----------------------- | ----------------------- | ----------- | -------------------------------- | | `Generic` | `generic` | `GenericLicenseDetails` | `GenericLicenseDetails` | Exactly one | Provider-neutral license details | ### GenericLicenseDetails | Property | Property | Type | Type | Required | Description | | ------------------- | --------------------- | -------- | ------ | -------- | -------------------------------------------------- | | `SourceId` | `source_id` | `string` | `str` | Yes | Stable license or assignment identifier | | `SourceAccountId` | `source_account_id` | `string` | `str` | Yes | Referenced account identifier | | `SourcePlanId` | `source_plan_id` | `string` | `str` | Yes | Referenced plan identifier | | `Billable` | `billable` | `bool` | `bool` | Yes | Whether the assignment consumes a paid entitlement | | `ExternalProductId` | `external_product_id` | `string` | `str` | No | Source product identifier | ### SubscriptionModel | C# | Python | Description | | ------------- | -------------------------------- | ------------------------------ | | `Unspecified` | `SUBSCRIPTION_MODEL_UNSPECIFIED` | No subscription model selected | | `SeatBased` | `SUBSCRIPTION_MODEL_SEAT_BASED` | Seat-based subscription | :: ## Usage ::model-property-tables Usage records are event-based. Their absence from a later batch does not remove earlier events. ### Usage | Property | Property | Type | Type | Required | Description | | --------- | --------- | --------------------- | --------------------- | ----------- | ------------------------------ | | `Generic` | `generic` | `GenericUsageDetails` | `GenericUsageDetails` | Exactly one | Provider-neutral usage details | ### GenericUsageDetails | Property | Property | Type | Type | Required | Description | | --------------------- | ----------------------- | ----------- | ---------------------- | -------- | ------------------------------------------------ | | `Id` | `id` | `string` | `str` | Yes | Stable usage-event identifier | | `SourceActorId` | `source_actor_id` | `string` | `str` | Yes | Account or employee responsible for the activity | | `ExternalProductName` | `external_product_name` | `string` | `str` | No | Product in which activity occurred | | `SourcePlanId` | `source_plan_id` | `string` | `str` | No | Related plan identifier | | `LastActivity` | `last_activity` | `Timestamp` | `datetime | Timestamp` | Yes | Most recent activity time | ### ExternallyDiscoveredUsage | Property | Property | Type | Type | Required | Description | | --------- | --------- | ----------------------------------------- | ----------------------------------------- | ----------- | ----------------------------------------- | | `Generic` | `generic` | `GenericExternallyDiscoveredUsageDetails` | `GenericExternallyDiscoveredUsageDetails` | Exactly one | Provider-neutral discovered-usage details | ### GenericExternallyDiscoveredUsageDetails | Property | Property | Type | Type | Required | Description | | --------------------- | ----------------------- | ----------- | ---------------------- | ----------- | ------------------------------------------- | | `SourceActorId` | `source_actor_id` | `string` | `str` | Yes | Stable actor identifier | | `ActorEmail` | `actor_email` | `string` | `str` | No | Actor email when known | | `ExternalProductName` | `external_product_name` | `string` | `str` | No | Discovered product | | `Source` | `source` | `string` | `str` | No | Discovery source | | `LastActivity` | `last_activity` | `Timestamp` | `datetime | Timestamp` | Conditional | Provide this or the complete activity range | | `LastActivityFrom` | `last_activity_from` | `Timestamp` | `datetime | Timestamp` | Conditional | Range start; requires the range end | | `LastActivityTo` | `last_activity_to` | `Timestamp` | `datetime | Timestamp` | Conditional | Range end; requires the range start | :: ## Employees ::model-property-tables Employees are snapshot-backed. Select the details model that matches the source data. ### Employee | Property | Property | Type | Type | Required | Description | | ----------- | ----------- | -------------------------- | -------------------------- | ----------- | --------------------------------------- | | `Generic` | `generic` | `GenericEmployeeDetails` | `GenericEmployeeDetails` | Exactly one | Provider-neutral or normalized employee | | `Microsoft` | `microsoft` | `MicrosoftEmployeeDetails` | `MicrosoftEmployeeDetails` | Exactly one | Microsoft Graph user | | `Google` | `google` | `GoogleEmployeeDetails` | `GoogleEmployeeDetails` | Exactly one | Google Directory user | | `Okta` | `okta` | `OktaEmployeeDetails` | `OktaEmployeeDetails` | Exactly one | Okta user | | `BambooHr` | `bamboo_hr` | `BambooHrEmployeeDetails` | `BambooHrEmployeeDetails` | Exactly one | BambooHR employee | ### GenericEmployeeDetails | Property | Property | Type | Type | Required | Description | | ---------------- | ----------------- | -------------------------- | ---------------------- | -------- | ---------------------------------- | | `Id` | `id` | `string` | `str` | Yes | Stable source employee identifier | | `FullName` | `full_name` | `string` | `str` | Yes | Display name | | `FirstName` | `first_name` | `string` | `str` | No | Given name | | `LastName` | `last_name` | `string` | `str` | No | Family name | | `Email` | `email` | `string` | `str` | No | Primary email | | `EmailAliases` | `email_aliases` | `RepeatedField` | `list[str]` | No | Alternate emails | | `Active` | `active` | `bool` | `bool` | No | Whether the employee is active | | `Deleted` | `deleted` | `bool` | `bool` | No | Whether the employee was deleted | | `DeletionTime` | `deletion_time` | `Timestamp` | `datetime | Timestamp` | No | Source deletion time | | `CreationTime` | `creation_time` | `Timestamp` | `datetime | Timestamp` | No | Source creation time | | `AvatarUrl` | `avatar_url` | `string` | `str` | No | Profile image URL | | `OrgUnit` | `org_unit` | `string` | `str` | No | Organizational unit | | `DepartmentPath` | `department_path` | `RepeatedField` | `list[str]` | No | Department hierarchy | | `JobTitle` | `job_title` | `string` | `str` | No | Job title | | `Country` | `country` | `string` | `str` | No | Country | | `Division` | `division` | `string` | `str` | No | Division | | `CostCenter` | `cost_center` | `string` | `str` | No | Cost center | | `UserType` | `user_type` | `string` | `str` | No | Source-defined employee type | | `ManagerId` | `manager_id` | `string` | `str` | No | Source manager identifier | | `HasMailbox` | `has_mailbox` | `bool` | `bool` | No | Whether the employee has a mailbox | | `Attributes` | `attributes` | `MapField` | `dict[str, str]` | No | Source-specific metadata | ### MicrosoftEmployeeDetails | Property | Property | Type | Type | Required | Description | | ------------------- | --------------------- | -------------------------- | -------------------------- | -------- | ------------------------------ | | `Id` | `id` | `string` | `str` | Yes | Microsoft user identifier | | `DisplayName` | `display_name` | `string` | `str` | Yes | Display name | | `UserPrincipalName` | `user_principal_name` | `string` | `str` | Yes | User principal name | | `GivenName` | `given_name` | `string` | `str` | No | Given name | | `Surname` | `surname` | `string` | `str` | No | Family name | | `Mail` | `mail` | `string` | `str` | No | Primary email | | `Department` | `department` | `string` | `str` | No | Department | | `AccountEnabled` | `account_enabled` | `bool` | `bool` | No | Whether the account is enabled | | `CreatedDateTime` | `created_date_time` | `Timestamp` | `datetime | Timestamp` | No | Creation time | | `DeletedDateTime` | `deleted_date_time` | `Timestamp` | `datetime | Timestamp` | No | Deletion time | | `JobTitle` | `job_title` | `string` | `str` | No | Job title | | `UserType` | `user_type` | `string` | `str` | No | Microsoft user type | | `Country` | `country` | `string` | `str` | No | Country | | `EmployeeOrgData` | `employee_org_data` | `MicrosoftEmployeeOrgData` | `MicrosoftEmployeeOrgData` | No | Division and cost-center data | | `ManagerId` | `manager_id` | `string` | `str` | No | Microsoft manager identifier | `MicrosoftEmployeeOrgData` exposes optional `Division` / `division` and `CostCenter` / `cost_center` strings. ### GoogleEmployeeDetails | Property | Property | Type | Type | Required | Description | | ------------------- | --------------------- | ------------------------------------------- | ---------------------------------- | -------- | ----------------------------------------------------- | | `Id` | `id` | `string` | `str` | Yes | Google user identifier | | `Name` | `name` | `GoogleEmployeeName` | `GoogleEmployeeName` | Yes | Full, given, and family names; all three are required | | `PrimaryEmail` | `primary_email` | `string` | `str` | Yes | Primary email | | `Aliases` | `aliases` | `RepeatedField` | `list[str]` | No | Alternate emails | | `ThumbnailPhotoUrl` | `thumbnail_photo_url` | `string` | `str` | No | Profile image URL | | `OrgUnitPath` | `org_unit_path` | `string` | `str` | No | Organizational-unit path | | `CreationTime` | `creation_time` | `Timestamp` | `datetime | Timestamp` | No | Creation time | | `Suspended` | `suspended` | `bool` | `bool` | No | Whether the user is suspended | | `Archived` | `archived` | `bool` | `bool` | No | Whether the user is archived | | `DeletionTime` | `deletion_time` | `Timestamp` | `datetime | Timestamp` | No | Deletion time | | `IsMailboxSetup` | `is_mailbox_setup` | `bool` | `bool` | No | Whether the mailbox is set up | | `Organizations` | `organizations` | `RepeatedField` | `list[GoogleEmployeeOrganization]` | No | Organization entries | | `Addresses` | `addresses` | `RepeatedField` | `list[GoogleEmployeeAddress]` | No | Address entries | | `Relations` | `relations` | `RepeatedField` | `list[GoogleEmployeeRelation]` | No | Employee relations | Organization entries expose optional cost center, description, title, primary, and type fields. Address entries expose optional country, primary, and type fields. Relation entries expose optional type and value fields. ### OktaEmployeeDetails | Property | Property | Type | Type | Required | Description | | --------- | --------- | --------------------- | ---------------------- | -------- | --------------------- | | `Id` | `id` | `string` | `str` | Yes | Okta user identifier | | `Status` | `status` | `string` | `str` | Yes | Okta lifecycle status | | `Created` | `created` | `Timestamp` | `datetime | Timestamp` | Yes | Creation time | | `Profile` | `profile` | `OktaEmployeeProfile` | `OktaEmployeeProfile` | Yes | User profile | `OktaEmployeeProfile` requires `Email` / `email`, `FirstName` / `first_name`, and `LastName` / `last_name`. Department, manager ID, manager, country code, division, cost center, user type, and title are optional strings. ### BambooHrEmployeeDetails | Property | Property | Type | Type | Required | Description | | ------------------ | ------------------- | ----------- | ---------------------- | -------- | ---------------------------- | | `Id` | `id` | `string` | `str` | Yes | BambooHR employee identifier | | `FirstName` | `first_name` | `string` | `str` | Yes | Given name | | `LastName` | `last_name` | `string` | `str` | Yes | Family name | | `WorkEmail` | `work_email` | `string` | `str` | No | Work email | | `Department` | `department` | `string` | `str` | No | Department | | `JobTitle` | `job_title` | `string` | `str` | No | Job title | | `Division` | `division` | `string` | `str` | No | Division | | `Country` | `country` | `string` | `str` | No | Country | | `Status` | `status` | `string` | `str` | No | Employment status | | `HireDate` | `hire_date` | `Timestamp` | `datetime | Timestamp` | No | Hire date | | `EmploymentStatus` | `employment_status` | `string` | `str` | No | Source employment status | | `SupervisorId` | `supervisor_id` | `string` | `str` | No | Supervisor identifier | | `SupervisorEmail` | `supervisor_email` | `string` | `str` | No | Supervisor email | | `PhotoUrl` | `photo_url` | `string` | `str` | No | Profile image URL | | `MetaUserStatus` | `meta_user_status` | `string` | `str` | No | BambooHR meta-user status | | `CostCenter` | `cost_center` | `string` | `str` | No | Cost center | | `EmployeeType` | `employee_type` | `string` | `str` | No | Employee type | :: ## Groups and Devices ::model-property-tables Groups, memberships, and devices are snapshot-backed records. ### Group | Property | Property | Type | Type | Required | Description | | --------- | --------- | --------------------- | --------------------- | ----------- | ------------------------------ | | `Generic` | `generic` | `GenericGroupDetails` | `GenericGroupDetails` | Exactly one | Provider-neutral group details | ### GenericGroupDetails | Property | Property | Type | Type | Required | Description | | -------------- | --------------- | -------------------------- | ---------------------- | -------- | ------------------------------ | | `Id` | `id` | `string` | `str` | Yes | Stable source group identifier | | `Name` | `name` | `string` | `str` | Yes | Group name | | `Description` | `description` | `string` | `str` | No | Group description | | `DeletionTime` | `deletion_time` | `Timestamp` | `datetime | Timestamp` | No | Source deletion time | | `CreationTime` | `creation_time` | `Timestamp` | `datetime | Timestamp` | No | Source creation time | | `EmailAliases` | `email_aliases` | `RepeatedField` | `list[str]` | No | Group email aliases | | `Attributes` | `attributes` | `MapField` | `dict[str, str]` | No | Source-specific metadata | ### GroupMember | Property | Property | Type | Type | Required | Description | | --------- | --------- | --------------------------- | --------------------------- | ----------- | ----------------------------------- | | `Generic` | `generic` | `GenericGroupMemberDetails` | `GenericGroupMemberDetails` | Exactly one | Provider-neutral membership details | ### GenericGroupMemberDetails | Property | Property | Type | Type | Required | Description | | -------------- | --------------- | -------------------------- | ---------------------- | ----------- | -------------------------------------- | | `GroupId` | `group_id` | `string` | `str` | Yes | Referenced group identifier | | `MemberId` | `member_id` | `string` | `str` | Yes | Referenced user or group identifier | | `Type` | `type` | `GroupMemberType` | `GroupMemberType` | Yes | Whether the member is a user or group | | `DeletionTime` | `deletion_time` | `Timestamp` | `datetime | Timestamp` | No | Membership deletion time | | `CreationTime` | `creation_time` | `Timestamp` | `datetime | Timestamp` | No | Membership creation time | | `Role` | `role` | `string` | `str` | No | Source membership role | | `Attributes` | `attributes` | `MapField` | `dict[str, str]` | Conditional | Must include a stable `sourceId` entry | ### Device | Property | Property | Type | Type | Required | Description | | --------- | --------- | ---------------------- | ---------------------- | ----------- | ------------------------------- | | `Generic` | `generic` | `GenericDeviceDetails` | `GenericDeviceDetails` | Exactly one | Provider-neutral device details | ### GenericDeviceDetails | Property | Property | Type | Type | Required | Description | | -------------- | --------------- | ------------- | ------------- | -------- | ------------------------------- | | `Id` | `id` | `string` | `str` | Yes | Stable source device identifier | | `Name` | `name` | `string` | `str` | Yes | Device name | | `SerialNumber` | `serial_number` | `string` | `str` | Yes | Device serial number | | `Owner` | `owner` | `DeviceOwner` | `DeviceOwner` | No | Device owner | | `Uuid` | `uuid` | `string` | `str` | No | Device UUID | ### DeviceOwner | Property | Property | Type | Type | Required | Description | | -------- | -------- | -------- | ----- | -------- | --------------------------- | | `Id` | `id` | `string` | `str` | Yes | Referenced owner identifier | | `Email` | `email` | `string` | `str` | No | Owner email | ### GroupMemberType | C# | Python | Description | | ------------- | ------------------------------- | ----------------------- | | `Unspecified` | `GROUP_MEMBER_TYPE_UNSPECIFIED` | No member type selected | | `User` | `GROUP_MEMBER_TYPE_USER` | User member | | `Group` | `GROUP_MEMBER_TYPE_GROUP` | Nested group member | :: ## Audit Logs ::model-property-tables Audit logs are event-based. Select the details model that matches the source event. ### AuditLog | Property | Property | Type | Type | Required | Description | | ------------------- | -------------------- | ---------------------------------- | ---------------------------------- | ----------- | ------------------------------------ | | `Generic` | `generic` | `GenericAuditLogDetails` | `GenericAuditLogDetails` | Exactly one | Provider-neutral audit event | | `MicrosoftSignIn` | `microsoft_sign_in` | `MicrosoftSignInAuditLogDetails` | `MicrosoftSignInAuditLogDetails` | Exactly one | Microsoft Graph sign-in event | | `MicrosoftSecurity` | `microsoft_security` | `MicrosoftSecurityAuditLogDetails` | `MicrosoftSecurityAuditLogDetails` | Exactly one | Microsoft Graph security audit event | ### GenericAuditLogDetails | Property | Property | Type | Type | Required | Description | | ----------------- | ------------------ | --------------- | ---------------------- | -------- | ------------------------------- | | `Date` | `date` | `Timestamp` | `datetime | Timestamp` | Yes | Event time | | `AuditLogSource` | `audit_log_source` | `string` | `str` | Yes | Source audit-log stream | | `Actor` | `actor` | `AuditLogActor` | `AuditLogActor` | Yes | Actor identity | | `ApplicationName` | `application_name` | `string` | `str` | Yes | Application name | | `Source` | `source` | `string` | `str` | Yes | Event source | | `ActivityName` | `activity_name` | `string` | `str` | Yes | Activity name | | `EventProvider` | `event_provider` | `string` | `str` | Yes | Provider that emitted the event | | `Scopes` | `scopes` | `string` | `str` | No | Event scopes | `AuditLogActor` requires `Email` / `email`. Its `Id` / `id` field is optional. ### MicrosoftSignInAuditLogDetails | Property | Property | Type | Type | Required | Description | | --------------------- | ----------------------- | ----------------------- | ----------------------- | -------- | ----------------------------------- | | `CreatedDateTime` | `created_date_time` | `Timestamp` | `datetime | Timestamp` | Yes | Sign-in time | | `UserId` | `user_id` | `string` | `str` | Yes | Microsoft user identifier | | `AppDisplayName` | `app_display_name` | `string` | `str` | Yes | Application display name | | `UserPrincipalName` | `user_principal_name` | `string` | `str` | No | User principal name | | `ClientAppUsed` | `client_app_used` | `string` | `str` | No | Client used for sign-in | | `AppId` | `app_id` | `string` | `str` | No | Application identifier | | `ResourceDisplayName` | `resource_display_name` | `string` | `str` | No | Resource display name | | `ResourceId` | `resource_id` | `string` | `str` | No | Resource identifier | | `IsInteractive` | `is_interactive` | `bool` | `bool` | No | Whether the sign-in was interactive | | `Status` | `status` | `MicrosoftSignInStatus` | `MicrosoftSignInStatus` | No | Error code and failure details | Omit the complete sign-in record when the source does not provide `AppDisplayName` / `app_display_name`. Status error code, failure reason, and additional details are all optional. ### MicrosoftSecurityAuditLogDetails | Property | Property | Type | Type | Required | Description | | -------------------- | ----------------------- | ----------- | ---------------------- | -------- | ------------------------------------------------------------- | | `ActorId` | `actor_id` | `string` | `str` | Yes | Entra ID user object ID resolved from the user principal name | | `CreatedDateTime` | `created_date_time` | `Timestamp` | `datetime | Timestamp` | No | Event time | | `UserPrincipalName` | `user_principal_name` | `string` | `str` | No | User principal name | | `Service` | `service` | `string` | `str` | No | Microsoft service | | `Operation` | `operation` | `string` | `str` | No | Audit operation | | `AuditLogRecordType` | `audit_log_record_type` | `string` | `str` | No | Microsoft record type | :: ## AI Usage and Cost ::model-property-tables AI usage and cost records are event-based. The models preserve provider response fields without normalization. ### AiUsage and AiCost | Property | Property | Type | Type | Required | Description | | ----------------------------- | ------------------------------- | -------------------------- | -------------------------- | ----------- | ---------------------------- | | `AiUsage.Provider` | `AiUsage.provider` | `AiProvider` | `AiProvider` | Yes | Usage provider | | `AiUsage.AnthropicChatUsage` | `AiUsage.anthropic_chat_usage` | `AnthropicChatUsage` | `AnthropicChatUsage` | Exactly one | Anthropic Messages API usage | | `AiUsage.AnthropicClaudeCode` | `AiUsage.anthropic_claude_code` | `AnthropicClaudeCodeUsage` | `AnthropicClaudeCodeUsage` | Exactly one | Anthropic Claude Code usage | | `AiCost.Provider` | `AiCost.provider` | `AiProvider` | `AiProvider` | Yes | Cost provider | | `AiCost.AnthropicCost` | `AiCost.anthropic_cost` | `AnthropicCost` | `AnthropicCost` | Exactly one | Anthropic cost report item | ### AnthropicChatUsage | Property | Property | Type | Type | Required | Description | | ---------------------- | ------------------------- | ------------------------ | ------------------------ | -------- | ---------------------------------------------------- | | `StartingAt` | `starting_at` | `Timestamp` | `datetime | Timestamp` | Yes | Bucket start, inclusive | | `EndingAt` | `ending_at` | `Timestamp` | `datetime | Timestamp` | Yes | Bucket end, exclusive | | `UncachedInputTokens` | `uncached_input_tokens` | `long` | `int` | Yes | Uncached input tokens | | `CacheReadInputTokens` | `cache_read_input_tokens` | `long` | `int` | Yes | Cache-read input tokens | | `OutputTokens` | `output_tokens` | `long` | `int` | Yes | Output tokens | | `CacheCreation` | `cache_creation` | `AnthropicCacheCreation` | `AnthropicCacheCreation` | Yes | One-hour and five-minute cache-creation token counts | | `ServerToolUse` | `server_tool_use` | `AnthropicServerToolUse` | `AnthropicServerToolUse` | Yes | Server tool-use counts | | `AccountId` | `account_id` | `string` | `str` | No | Anthropic account identifier | | `ApiKeyId` | `api_key_id` | `string` | `str` | No | API key identifier | | `ServiceAccountId` | `service_account_id` | `string` | `str` | No | Service-account identifier | | `WorkspaceId` | `workspace_id` | `string` | `str` | No | Anthropic workspace identifier | | `Model` | `model` | `string` | `str` | No | Model | | `ServiceTier` | `service_tier` | `string` | `str` | No | Service tier | | `ContextWindow` | `context_window` | `string` | `str` | No | Context-window group | | `InferenceGeo` | `inference_geo` | `string` | `str` | No | Inference geography | `AnthropicCacheCreation` requires the one-hour and five-minute token counts. `AnthropicServerToolUse` requires the web-search request count. ### AnthropicCost | Property | Property | Type | Type | Required | Description | | --------------- | ---------------- | ----------- | ---------------------- | -------- | ---------------------------------------------- | | `StartingAt` | `starting_at` | `Timestamp` | `datetime | Timestamp` | Yes | Bucket start, inclusive | | `EndingAt` | `ending_at` | `Timestamp` | `datetime | Timestamp` | Yes | Bucket end, exclusive | | `Amount` | `amount` | `string` | `str` | Yes | Lowest currency units as reported by Anthropic | | `Currency` | `currency` | `string` | `str` | Yes | Currency code | | `WorkspaceId` | `workspace_id` | `string` | `str` | No | Anthropic workspace identifier | | `Description` | `description` | `string` | `str` | No | Cost description | | `CostType` | `cost_type` | `string` | `str` | No | Cost category | | `TokenType` | `token_type` | `string` | `str` | No | Token category | | `Model` | `model` | `string` | `str` | No | Model | | `ServiceTier` | `service_tier` | `string` | `str` | No | Service tier | | `ContextWindow` | `context_window` | `string` | `str` | No | Context-window group | | `InferenceGeo` | `inference_geo` | `string` | `str` | No | Inference geography | ### AnthropicClaudeCodeUsage | Property | Property | Type | Type | Required | Description | | ------------------ | ------------------- | -------------------------------------------------- | ----------------------------------------- | -------- | ---------------------------------------------------- | | `Date` | `date` | `Timestamp` | `datetime | Timestamp` | Yes | UTC usage day | | `Actor` | `actor` | `AnthropicClaudeCodeActor` | `AnthropicClaudeCodeActor` | Yes | User or API actor | | `CoreMetrics` | `core_metrics` | `AnthropicClaudeCodeCoreMetrics` | `AnthropicClaudeCodeCoreMetrics` | Yes | Session, code-line, commit, and pull-request metrics | | `ToolActions` | `tool_actions` | `AnthropicClaudeCodeToolActions` | `AnthropicClaudeCodeToolActions` | Yes | Accepted and rejected tool actions | | `OrganizationId` | `organization_id` | `string` | `str` | No | Anthropic organization identifier | | `CustomerType` | `customer_type` | `string` | `str` | No | API or subscription customer type | | `SubscriptionType` | `subscription_type` | `string` | `str` | No | Subscription type | | `TerminalType` | `terminal_type` | `string` | `str` | No | Terminal or editor | | `ModelBreakdowns` | `model_breakdowns` | `RepeatedField` | `list[AnthropicClaudeCodeModelBreakdown]` | No | Per-model tokens and estimated cost | The nested Claude Code metrics use required numeric counters. The actor type is required; actor email and API-key name are optional. Each model breakdown requires its model, token counts, and estimated currency and amount. ### AiProvider | C# | Python | Description | | ------------- | ------------------------- | ----------------------- | | `Unspecified` | `AI_PROVIDER_UNSPECIFIED` | No provider selected | | `Anthropic` | `AI_PROVIDER_ANTHROPIC` | Anthropic provider data | | `Generic` | `AI_PROVIDER_GENERIC` | Provider-neutral data | :: # AWS Lambda with Python This example runs a nightly Microsoft Entra employee sync from AWS Lambda. The function acquires a Microsoft Graph application token, processes every page of users, maps the records to `MicrosoftEmployeeDetails`, and writes the complete snapshot through the [Viio Python SDK](https://pypi.org/project/viio-sync-api-sdk/){rel=""nofollow""}. It is a concrete Python snapshot example. For the entity-neutral lifecycle and event-processing behavior, start with the [quickstart](https://developers.viio.io/sync-api/quickstart). ::callout{color="amber" icon="i-lucide-triangle-alert"} The function must process every Microsoft Graph page before completing the batch. Completing a partial employee snapshot can mark valid employees as removed. :: ## Prerequisites You need: - Python 3.11 or later. - A passive direct integration installation and its ID. - A Viio API key with the `integration:sync` permission. - A Microsoft Entra application with the Microsoft Graph `User.Read.All` application permission and tenant-wide admin consent. - The Entra tenant ID, client ID, and client secret. Add the SDK to `requirements.txt`: ```text viio-sync-api-sdk ``` ## Lambda Handler Create `aws_lambda.py`: ```python import asyncio import json import os from typing import Any from urllib.parse import urlencode, urlsplit from urllib.request import Request, urlopen from viio_sync_api import SyncApiAuthentication, SyncApiClient, SyncApiClientOptions from viio_sync_api.v1 import ( Employee, EmployeeRecords, MicrosoftEmployeeDetails, MicrosoftEmployeeOrgData, SyncRecordsRequest, ) GRAPH_USERS_URL = "https://graph.microsoft.com/v1.0/users?" + urlencode( { "$select": ",".join( ( "id", "displayName", "givenName", "surname", "mail", "userPrincipalName", "department", "accountEnabled", "jobTitle", "userType", "country", "employeeOrgData", ) ), "$top": "999", } ) def request_json(request: Request) -> dict[str, Any]: with urlopen(request, timeout=30) as response: payload = json.load(response) if not isinstance(payload, dict): raise RuntimeError("Remote service returned an invalid JSON response") return payload def request_graph_token() -> str: tenant_id = os.environ["MICROSOFT_TENANT_ID"] allowed_characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-" if not tenant_id or any(character not in allowed_characters for character in tenant_id): raise ValueError("MICROSOFT_TENANT_ID must be a tenant ID or verified domain name") request = Request( f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token", data=urlencode( { "grant_type": "client_credentials", "client_id": os.environ["MICROSOFT_CLIENT_ID"], "client_secret": os.environ["MICROSOFT_CLIENT_SECRET"], "scope": "https://graph.microsoft.com/.default", } ).encode(), headers={"Content-Type": "application/x-www-form-urlencoded"}, method="POST", ) token = request_json(request).get("access_token") if not isinstance(token, str) or not token: raise RuntimeError("Microsoft identity platform returned no access token") return token def request_graph_users(url: str, access_token: str) -> tuple[list[dict[str, Any]], str | None]: parsed_url = urlsplit(url) if parsed_url.scheme != "https" or parsed_url.hostname != "graph.microsoft.com": raise RuntimeError("Microsoft Graph returned an invalid pagination URL") payload = request_json( Request( url, headers={ "Accept": "application/json", "Authorization": f"Bearer {access_token}", }, ) ) users = payload.get("value") if not isinstance(users, list) or not all(isinstance(user, dict) for user in users): raise RuntimeError("Microsoft Graph returned an invalid users response") next_url = payload.get("@odata.nextLink") if next_url is not None and not isinstance(next_url, str): raise RuntimeError("Microsoft Graph returned an invalid pagination URL") return users, next_url def required_string(source: dict[str, Any], field: str) -> str: value = source.get(field) if not isinstance(value, str) or not value: raise RuntimeError(f"Microsoft Graph user is missing {field}") return value def optional_string(source: dict[str, Any], field: str) -> str | None: value = source.get(field) return value if isinstance(value, str) and value else None def optional_bool(source: dict[str, Any], field: str) -> bool | None: value = source.get(field) return value if isinstance(value, bool) else None def employee_org_data(user: dict[str, Any]) -> MicrosoftEmployeeOrgData | None: value = user.get("employeeOrgData") if not isinstance(value, dict): return None division = optional_string(value, "division") cost_center = optional_string(value, "costCenter") if division is None and cost_center is None: return None return MicrosoftEmployeeOrgData(division=division, cost_center=cost_center) def employee_from_graph_user(user: dict[str, Any]) -> Employee: return Employee( microsoft=MicrosoftEmployeeDetails( id=required_string(user, "id"), display_name=required_string(user, "displayName"), given_name=optional_string(user, "givenName"), surname=optional_string(user, "surname"), mail=optional_string(user, "mail"), user_principal_name=required_string(user, "userPrincipalName"), department=optional_string(user, "department"), account_enabled=optional_bool(user, "accountEnabled"), job_title=optional_string(user, "jobTitle"), user_type=optional_string(user, "userType"), country=optional_string(user, "country"), employee_org_data=employee_org_data(user), ) ) async def sync_employees() -> int: graph_token = await asyncio.to_thread(request_graph_token) options = SyncApiClientOptions( endpoint=os.environ["VIIO_SYNC_API_ENDPOINT"], authentication=SyncApiAuthentication.api_key(os.environ["VIIO_SYNC_API_KEY"]), ) async with SyncApiClient(options) as client: batch = await client.start_batch(os.environ["VIIO_DIRECT_INTEGRATION_INSTALLATION_ID"]) employee_count = 0 next_url: str | None = GRAPH_USERS_URL try: while next_url is not None: users, next_url = await asyncio.to_thread(request_graph_users, next_url, graph_token) if users: employees = [employee_from_graph_user(user) for user in users] await batch.write(SyncRecordsRequest(employees=EmployeeRecords(records=employees))) employee_count += len(employees) if employee_count == 0: await batch.write(SyncRecordsRequest(employees=EmployeeRecords())) await batch.complete() except BaseException: await batch.abort() raise return employee_count def lambda_handler(event: dict[str, Any], context: object) -> dict[str, Any]: del event, context employee_count = asyncio.run(sync_employees()) return {"ok": True, "employee_count": employee_count} ``` Each Graph page becomes one `batch.write` call. If Microsoft Graph returns no users, the function sends a present empty `EmployeeRecords` wrapper so Viio records an intentionally empty employee snapshot. The client is created and closed inside the invocation's event loop. This prevents a reused Lambda execution environment from retaining a gRPC AsyncIO channel bound to an earlier event loop. The [complete maintained handler](https://github.com/viio-io/integration-domain/blob/main/sdk/python/examples/aws_lambda.py){rel=""nofollow""} also maps Microsoft creation and deletion timestamps and employee organization data. ## Environment Variables Configure: | Variable | Description | | ----------------------------------------- | ------------------------------------------------ | | `MICROSOFT_TENANT_ID` | Microsoft Entra tenant ID or verified domain | | `MICROSOFT_CLIENT_ID` | Entra application client ID | | `MICROSOFT_CLIENT_SECRET` | Entra application client secret | | `VIIO_SYNC_API_ENDPOINT` | `https://sync.viio.io` | | `VIIO_SYNC_API_KEY` | Viio API key with `integration:sync` | | `VIIO_DIRECT_INTEGRATION_INSTALLATION_ID` | Installation that receives the employee snapshot | Supply secret values through your secret-management system. Do not commit them to the deployment package or template. ## Schedule with AWS SAM The maintained [AWS SAM template](https://github.com/viio-io/integration-domain/blob/main/sdk/python/examples/template.yaml){rel=""nofollow""} configures a Python 3.11 Arm64 function with a 15-minute timeout and invokes it nightly through Amazon EventBridge Scheduler: ```yaml Resources: EmployeeSyncFunction: Type: AWS::Serverless::Function Properties: Architectures: - arm64 CodeUri: . Handler: aws_lambda.lambda_handler Runtime: python3.11 MemorySize: 512 Timeout: 900 Environment: Variables: MICROSOFT_TENANT_ID: !Ref MicrosoftTenantId MICROSOFT_CLIENT_ID: !Ref MicrosoftClientId MICROSOFT_CLIENT_SECRET: !Ref MicrosoftClientSecret VIIO_SYNC_API_ENDPOINT: !Ref ViioSyncApiEndpoint VIIO_SYNC_API_KEY: !Ref ViioSyncApiKey VIIO_DIRECT_INTEGRATION_INSTALLATION_ID: !Ref ViioDirectIntegrationInstallationId Events: NightlyEmployeeSync: Type: ScheduleV2 Properties: ScheduleExpression: cron(0 2 * * ? *) ScheduleExpressionTimezone: UTC ``` ## Package Native Dependencies `grpcio` contains native code. When building an Arm64 Lambda ZIP or layer on another operating system, install the matching Linux wheel: ```bash python -m pip install \ --platform manylinux2014_aarch64 \ --implementation cp \ --python-version 3.11 \ --only-binary=:all: \ --target package \ viio-sync-api-sdk ``` Replace `3.11` with the target Lambda runtime version. For an x86-64 function, use `manylinux2014_x86_64`. Python Lambda container images can install the package normally. :read-more{title="Build a complete SDK sync" to="https://developers.viio.io/sync-api/quickstart"} :read-more{title="Browse employee models" to="https://developers.viio.io/sync-api/api-reference/models#employees"} # GraphQL Schema Reference Use this reference to find operations by the part of Viio you are integrating with. Every operation links to its return types, inputs, enums, and scalars. ## Reference by area ### [Accounts](https://developers.viio.io/gql-schema-reference/accounts) Account records and account-level SaaS activity. ### [Procurement](https://developers.viio.io/gql-schema-reference/procurement) Procurement cases, savings, totals, and case workflows. ### [Discovery](https://developers.viio.io/gql-schema-reference/discovery) Application and device discovery, overlap analysis, vendors, ownership, and agent diagnostics. ### [Licenses](https://developers.viio.io/gql-schema-reference/licenses) Contracts, license plans, assigned licenses, analytics, usage, pricing, and optimization opportunities. ### [People & Organization](https://developers.viio.io/gql-schema-reference/people-organization) Employees, departments, organizational attributes, and analysis scope. ### [Integrations](https://developers.viio.io/gql-schema-reference/integrations) Direct integration installations and synchronization state. ### [Boards](https://developers.viio.io/gql-schema-reference/boards) Portal boards, content, names, privacy, and lifecycle. ### [Tenant](https://developers.viio.io/gql-schema-reference/tenant) Tenant settings, members, currency, and data retention. ### [Surveys](https://developers.viio.io/gql-schema-reference/surveys) Survey definitions, responses, reminders, and lifecycle. ### [Identity](https://developers.viio.io/gql-schema-reference/identity) The authenticated user's identity and permissions. ### [Common Types](https://developers.viio.io/gql-schema-reference/common) Shared types used across GraphQL product areas. Start with the [GraphQL API overview](https://developers.viio.io/graphql-api) for the endpoint, authentication, and a complete request example. # Accounts ## Queries ### account query Retrieve account data from the Viio GraphQL API. ```graphql account(id: ID!): Account ``` **Returns:** [Account](https://developers.viio.io/#account-object) **Arguments for `account`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### accounts query Retrieve accounts data from the Viio GraphQL API. ```graphql accounts(first: Int, after: String, last: Int, before: String, where: AccountFilterInput, order: [AccountSortInput!]): AccountsConnection ``` **Returns:** [AccountsConnection](https://developers.viio.io/#accountsconnection-object) **Arguments for `accounts`** | Name | Description | | ------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([AccountFilterInput](https://developers.viio.io/#accountfilterinput-input)) | | | `order` ([\[AccountSortInput!\]](https://developers.viio.io/#accountsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ## Objects ### Account object Fields returned by the Account object type. | Name | Description | | --------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `integrationKey` (`String!`) | | | `tenant` (`String`) | | | `sourceId` (`String!`) | | | `name` (`String`) | | | `primaryEmail` (`String`) | | | `emailAliases` (`[String!]!`) | | | `type` ([AccountType!](https://developers.viio.io/#accounttype-enum)) | | | `status` ([AccountStatus!](https://developers.viio.io/#accountstatus-enum)) | | ### AccountsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[AccountsEdge!\]](https://developers.viio.io/#accountsedge-object)) | A list of edges. | | `nodes` ([\[Account!\]](https://developers.viio.io/#account-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### AccountsEdge object An edge in a connection. | Name | Description | | --------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Account!](https://developers.viio.io/#account-object)) | The item at the end of the edge. | ## Input Types ### AccountFilterInput input Input fields accepted by AccountFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[AccountFilterInput!\]](https://developers.viio.io/#accountfilterinput-input)) | | | `or` ([\[AccountFilterInput!\]](https://developers.viio.io/#accountfilterinput-input)) | | | `integrationKey` ([StringOperationFilterInput](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `tenant` ([StringOperationFilterInput](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `primaryEmail` ([StringOperationFilterInput](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `type` ([AccountTypeOperationFilterInput](https://developers.viio.io/#accounttypeoperationfilterinput-input)) | | | `status` ([AccountStatusOperationFilterInput](https://developers.viio.io/#accountstatusoperationfilterinput-input)) | | ### AccountSortInput input Input fields accepted by AccountSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `primaryEmail` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### AccountStatusOperationFilterInput input Input fields accepted by AccountStatusOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------------- | ----------- | | `eq` ([AccountStatus](https://developers.viio.io/#accountstatus-enum)) | | | `neq` ([AccountStatus](https://developers.viio.io/#accountstatus-enum)) | | | `in` ([\[AccountStatus!\]](https://developers.viio.io/#accountstatus-enum)) | | | `nin` ([\[AccountStatus!\]](https://developers.viio.io/#accountstatus-enum)) | | ### AccountTypeOperationFilterInput input Input fields accepted by AccountTypeOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------ | ----------- | | `eq` ([AccountType](https://developers.viio.io/#accounttype-enum)) | | | `neq` ([AccountType](https://developers.viio.io/#accounttype-enum)) | | | `in` ([\[AccountType!\]](https://developers.viio.io/#accounttype-enum)) | | | `nin` ([\[AccountType!\]](https://developers.viio.io/#accounttype-enum)) | | ### StringOperationFilterInput input Input fields accepted by StringOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[StringOperationFilterInput!\]](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `or` ([\[StringOperationFilterInput!\]](https://developers.viio.io/#stringoperationfilterinput-input)) | | | `eq` (`String`) | | | `neq` (`String`) | | | `contains` (`String`) | | | `ncontains` (`String`) | | | `in` (`[String]`) | | | `nin` (`[String]`) | | | `startsWith` (`String`) | | | `nstartsWith` (`String`) | | | `endsWith` (`String`) | | | `nendsWith` (`String`) | | ## Enums ### AccountStatus enum Accepted values for the AccountStatus enum. | Value | Description | | ----------- | ----------- | | `ACTIVE` | | | `SUSPENDED` | | | `DELETED` | | ### AccountType enum Accepted values for the AccountType enum. | Value | Description | | -------- | ----------- | | `MEMBER` | | | `GUEST` | | | `BOT` | | # Boards ## Queries ### portalBoards query Retrieve portalBoards data from the Viio GraphQL API. ```graphql portalBoards(first: Int, after: String, last: Int, before: String, where: PortalBoardFilterInput, order: [PortalBoardSortInput!]): PortalBoardsConnection ``` **Returns:** [PortalBoardsConnection](https://developers.viio.io/#portalboardsconnection-object) **Arguments for `portalBoards`** | Name | Description | | --------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([PortalBoardFilterInput](https://developers.viio.io/#portalboardfilterinput-input)) | | | `order` ([\[PortalBoardSortInput!\]](https://developers.viio.io/#portalboardsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### portalBoard query Retrieve portalBoard data from the Viio GraphQL API. ```graphql portalBoard(input: PortalBoardInput!): PortalBoard ``` **Returns:** [PortalBoard](https://developers.viio.io/#portalboard-object) **Arguments for `portalBoard`** | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `input` ([PortalBoardInput!](https://developers.viio.io/#portalboardinput-input)) | | ## Mutations ### createPortalBoard mutation Run the createPortalBoard mutation through the Viio GraphQL API. ```graphql createPortalBoard(input: CreatePortalBoardInput!): CreatePortalBoardPayload! ``` **Returns:** [CreatePortalBoardPayload!](https://developers.viio.io/#createportalboardpayload-object) **Arguments for `createPortalBoard`** | Name | Description | | --------------------------------------------------------------------------------------------- | ----------- | | `input` ([CreatePortalBoardInput!](https://developers.viio.io/#createportalboardinput-input)) | | ### renamePortalBoard mutation Run the renamePortalBoard mutation through the Viio GraphQL API. ```graphql renamePortalBoard(input: RenamePortalBoardInput!): RenamePortalBoardPayload! ``` **Returns:** [RenamePortalBoardPayload!](https://developers.viio.io/#renameportalboardpayload-object) **Arguments for `renamePortalBoard`** | Name | Description | | --------------------------------------------------------------------------------------------- | ----------- | | `input` ([RenamePortalBoardInput!](https://developers.viio.io/#renameportalboardinput-input)) | | ### updatePortalBoardContent mutation Run the updatePortalBoardContent mutation through the Viio GraphQL API. ```graphql updatePortalBoardContent(input: UpdatePortalBoardContentInput!): UpdatePortalBoardContentPayload! ``` **Returns:** [UpdatePortalBoardContentPayload!](https://developers.viio.io/#updateportalboardcontentpayload-object) **Arguments for `updatePortalBoardContent`** | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdatePortalBoardContentInput!](https://developers.viio.io/#updateportalboardcontentinput-input)) | | ### removePortalBoards mutation Run the removePortalBoards mutation through the Viio GraphQL API. ```graphql removePortalBoards(where: PortalBoardFilterInput): RemovePortalBoardsPayload! ``` **Returns:** [RemovePortalBoardsPayload!](https://developers.viio.io/#removeportalboardspayload-object) **Arguments for `removePortalBoards`** | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `where` ([PortalBoardFilterInput](https://developers.viio.io/#portalboardfilterinput-input)) | | ### setPortalBoardPrivacy mutation Run the setPortalBoardPrivacy mutation through the Viio GraphQL API. ```graphql setPortalBoardPrivacy(input: SetPortalBoardPrivacyInput!, where: PortalBoardFilterInput): SetPortalBoardPrivacyPayload! ``` **Returns:** [SetPortalBoardPrivacyPayload!](https://developers.viio.io/#setportalboardprivacypayload-object) **Arguments for `setPortalBoardPrivacy`** | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `input` ([SetPortalBoardPrivacyInput!](https://developers.viio.io/#setportalboardprivacyinput-input)) | | | `where` ([PortalBoardFilterInput](https://developers.viio.io/#portalboardfilterinput-input)) | | ## Objects ### CreatePortalBoardPayload object Fields returned by the CreatePortalBoardPayload object type. | Name | Description | | ------------------------------------------------------------------------------ | ----------- | | `portalBoard` ([PortalBoard!](https://developers.viio.io/#portalboard-object)) | | ### PortalBoard object Fields returned by the PortalBoard object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([PortalBoardType!](https://developers.viio.io/#portalboardtype-enum)) | | | `name` (`String!`) | | | `ownerId` (`ID!`) | | | `isPrivate` (`Boolean!`) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `updatedAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `content` ([JSON](https://developers.viio.io/#json-scalar)) | | | `owner` ([User](https://developers.viio.io/gql-schema-reference/tenant#user-object)) | | ### PortalBoardNotFoundError object Fields returned by the PortalBoardNotFoundError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### PortalBoardsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[PortalBoardsEdge!\]](https://developers.viio.io/#portalboardsedge-object)) | A list of edges. | | `nodes` ([\[PortalBoard!\]](https://developers.viio.io/#portalboard-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### PortalBoardsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([PortalBoard!](https://developers.viio.io/#portalboard-object)) | The item at the end of the edge. | ### RemovePortalBoardsPayload object Fields returned by the RemovePortalBoardsPayload object type. | Name | Description | | ----------------------- | ----------- | | `removedCount` (`Int!`) | | ### RenamePortalBoardPayload object Fields returned by the RenamePortalBoardPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `portalBoard` ([PortalBoard](https://developers.viio.io/#portalboard-object)) | | | `errors` ([\[RenamePortalBoardError!\]](https://developers.viio.io/#renameportalboarderror-union)) | | ### SetPortalBoardPrivacyPayload object Fields returned by the SetPortalBoardPrivacyPayload object type. | Name | Description | | ------------------------ | ----------- | | `modifiedCount` (`Int!`) | | ### UpdatePortalBoardContentPayload object Fields returned by the UpdatePortalBoardContentPayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `portalBoard` ([PortalBoard](https://developers.viio.io/#portalboard-object)) | | | `errors` ([\[UpdatePortalBoardContentError!\]](https://developers.viio.io/#updateportalboardcontenterror-union)) | | ## Input Types ### CreatePortalBoardInput input Input fields accepted by CreatePortalBoardInput. | Name | Description | | ----------------------------------------------------------------------------- | ----------- | | `name` (`String!`) | | | `type` ([PortalBoardType!](https://developers.viio.io/#portalboardtype-enum)) | | | `isPrivate` (`Boolean`) | | | `content` ([JSON](https://developers.viio.io/#json-scalar)) | | ### PortalBoardFilterInput input Input fields accepted by PortalBoardFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[PortalBoardFilterInput!\]](https://developers.viio.io/#portalboardfilterinput-input)) | | | `or` ([\[PortalBoardFilterInput!\]](https://developers.viio.io/#portalboardfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `type` ([PortalBoardTypeOperationFilterInput](https://developers.viio.io/#portalboardtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `ownerId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `isPrivate` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | ### PortalBoardInput input Input fields accepted by PortalBoardInput. | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### PortalBoardSortInput input Input fields accepted by PortalBoardSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `createdAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `updatedAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### PortalBoardTypeOperationFilterInput input Input fields accepted by PortalBoardTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------- | ----------- | | `eq` ([PortalBoardType](https://developers.viio.io/#portalboardtype-enum)) | | | `neq` ([PortalBoardType](https://developers.viio.io/#portalboardtype-enum)) | | | `in` ([\[PortalBoardType!\]](https://developers.viio.io/#portalboardtype-enum)) | | | `nin` ([\[PortalBoardType!\]](https://developers.viio.io/#portalboardtype-enum)) | | ### RenamePortalBoardInput input Input fields accepted by RenamePortalBoardInput. | Name | Description | | ------------------ | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | ### SetPortalBoardPrivacyInput input Input fields accepted by SetPortalBoardPrivacyInput. | Name | Description | | ------------------------ | ----------- | | `isPrivate` (`Boolean!`) | | ### UpdatePortalBoardContentInput input Input fields accepted by UpdatePortalBoardContentInput. | Name | Description | | ----------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `content` ([JSON](https://developers.viio.io/#json-scalar)) | | ## Unions ### RenamePortalBoardError union Possible object types returned by the RenamePortalBoardError union. Possible types: [PortalBoardNotFoundError](https://developers.viio.io/#portalboardnotfounderror-object) ### UpdatePortalBoardContentError union Possible object types returned by the UpdatePortalBoardContentError union. Possible types: [PortalBoardNotFoundError](https://developers.viio.io/#portalboardnotfounderror-object) ## Enums ### PortalBoardType enum Accepted values for the PortalBoardType enum. | Value | Description | | ----------- | ----------- | | `ANALYTICS` | | ## Scalars ### JSON scalar The custom JSON scalar used by the Viio GraphQL API. # Common Types ## Objects ### PageInfo object Information about pagination in a connection. | Name | Description | | ------------------------------ | -------------------------------------------------------------------------------------- | | `hasNextPage` (`Boolean!`) | Indicates whether more edges exist following the set defined by the clients arguments. | | `hasPreviousPage` (`Boolean!`) | Indicates whether more edges exist prior the set defined by the clients arguments. | | `startCursor` (`String`) | When paginating backwards, the cursor to continue. | | `endCursor` (`String`) | When paginating forwards, the cursor to continue. | ## Input Types ### BooleanOperationFilterInput input Input fields accepted by BooleanOperationFilterInput. | Name | Description | | ----------------- | ----------- | | `eq` (`Boolean`) | | | `neq` (`Boolean`) | | ### ComparableIdTypeOperationFilterInput input Input fields accepted by ComparableIdTypeOperationFilterInput. | Name | Description | | -------------- | ----------- | | `eq` (`ID`) | | | `neq` (`ID`) | | | `in` (`[ID]`) | | | `nin` (`[ID]`) | | | `gt` (`ID`) | | | `ngt` (`ID`) | | | `gte` (`ID`) | | | `ngte` (`ID`) | | | `lt` (`ID`) | | | `nlt` (`ID`) | | | `lte` (`ID`) | | | `nlte` (`ID`) | | ## Enums ### SortEnumType enum Accepted values for the SortEnumType enum. | Value | Description | | ------ | ----------- | | `ASC` | | | `DESC` | | ## Scalars ### Date scalar The `Date` scalar represents an ISO-8601 compliant date type. ### DateTime scalar The `DateTime` scalar represents an ISO-8601 compliant date time type. ### URL scalar A valid URL string. ### UUID scalar A universally unique identifier in standard format, such as `550e8400-e29b-41d4-a716-446655440000`. # Discovery ## Queries ### applications query Retrieve applications data from the Viio GraphQL API. ```graphql applications(first: Int, after: String, last: Int, before: String, where: ApplicationDiscoveryFilterInput, order: [ApplicationDiscoverySortInput!]): ApplicationsConnection ``` **Returns:** [ApplicationsConnection](https://developers.viio.io/#applicationsconnection-object) **Arguments for `applications`** | Name | Description | | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([ApplicationDiscoveryFilterInput](https://developers.viio.io/#applicationdiscoveryfilterinput-input)) | | | `order` ([\[ApplicationDiscoverySortInput!\]](https://developers.viio.io/#applicationdiscoverysortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### archivedApplications query Retrieve archivedApplications data from the Viio GraphQL API. ```graphql archivedApplications(first: Int, after: String, last: Int, before: String): ArchivedApplicationsConnection ``` **Returns:** [ArchivedApplicationsConnection](https://developers.viio.io/#archivedapplicationsconnection-object) **Arguments for `archivedApplications`** | Name | Description | | ------------------- | --------------------------------------------- | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### application query Retrieve application data from the Viio GraphQL API. ```graphql application(id: ID!): Application ``` **Returns:** [Application](https://developers.viio.io/#application-object) **Arguments for `application`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### productsOverlap query Analyzes user overlap between products. Returns users who use at least 'overlapSize' apps from 'productIds' list and don't use any apps from 'excludeProductIds' list. ```graphql productsOverlap(input: ProductsOverlapInput!): ProductsOverlap! ``` **Returns:** [ProductsOverlap!](https://developers.viio.io/#productsoverlap-object) **Arguments for `productsOverlap`** | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `input` ([ProductsOverlapInput!](https://developers.viio.io/#productsoverlapinput-input)) | | ### overlappedUsers query Retrieves users who overlap across multiple products. Returns users who use at least 'overlapSize' apps from 'productIds' list and don't use any apps from 'excludeProductIds' list. ```graphql overlappedUsers(input: ProductsOverlapInput!, first: Int, after: String, last: Int, before: String): OverlappedUsersConnection ``` **Returns:** [OverlappedUsersConnection](https://developers.viio.io/#overlappedusersconnection-object) **Arguments for `overlappedUsers`** | Name | Description | | ----------------------------------------------------------------------------------------- | --------------------------------------------- | | `input` ([ProductsOverlapInput!](https://developers.viio.io/#productsoverlapinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### vendors query Retrieve vendors data from the Viio GraphQL API. ```graphql vendors(first: Int, after: String, last: Int, before: String, where: VendorDiscoveryFilterInput, order: [VendorSortInput!]): VendorsConnection ``` **Returns:** [VendorsConnection](https://developers.viio.io/#vendorsconnection-object) **Arguments for `vendors`** | Name | Description | | ---------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([VendorDiscoveryFilterInput](https://developers.viio.io/#vendordiscoveryfilterinput-input)) | | | `order` ([\[VendorSortInput!\]](https://developers.viio.io/#vendorsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### deviceAgents query Retrieve deviceAgents data from the Viio GraphQL API. ```graphql deviceAgents(first: Int, after: String, last: Int, before: String, where: DeviceAgentFilterInput, order: [DeviceAgentSortInput!]): DeviceAgentsConnection ``` **Returns:** [DeviceAgentsConnection](https://developers.viio.io/#deviceagentsconnection-object) **Arguments for `deviceAgents`** | Name | Description | | --------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([DeviceAgentFilterInput](https://developers.viio.io/#deviceagentfilterinput-input)) | | | `order` ([\[DeviceAgentSortInput!\]](https://developers.viio.io/#deviceagentsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### deviceAgentsSummary query Retrieve deviceAgentsSummary data from the Viio GraphQL API. ```graphql deviceAgentsSummary(where: DeviceAgentFilterInput): DeviceAgentsSummary! ``` **Returns:** [DeviceAgentsSummary!](https://developers.viio.io/#deviceagentssummary-object) **Arguments for `deviceAgentsSummary`** | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `where` ([DeviceAgentFilterInput](https://developers.viio.io/#deviceagentfilterinput-input)) | | ## Mutations ### changeVendorsState mutation Run the changeVendorsState mutation through the Viio GraphQL API. ```graphql changeVendorsState(input: ChangeVendorsStateInput!, where: VendorDiscoveryFilterInput): ChangeVendorsStatePayload! ``` **Returns:** [ChangeVendorsStatePayload!](https://developers.viio.io/#changevendorsstatepayload-object) **Arguments for `changeVendorsState`** | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `input` ([ChangeVendorsStateInput!](https://developers.viio.io/#changevendorsstateinput-input)) | | | `where` ([VendorDiscoveryFilterInput](https://developers.viio.io/#vendordiscoveryfilterinput-input)) | | ### changeVendorsOwners mutation Run the changeVendorsOwners mutation through the Viio GraphQL API. ```graphql changeVendorsOwners(input: ChangeVendorsOwnersInput!, where: VendorDiscoveryFilterInput): ChangeVendorsOwnersPayload! ``` **Returns:** [ChangeVendorsOwnersPayload!](https://developers.viio.io/#changevendorsownerspayload-object) **Arguments for `changeVendorsOwners`** | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `input` ([ChangeVendorsOwnersInput!](https://developers.viio.io/#changevendorsownersinput-input)) | | | `where` ([VendorDiscoveryFilterInput](https://developers.viio.io/#vendordiscoveryfilterinput-input)) | | ## Objects ### Application object Fields returned by the Application object type. Implements [Product](https://developers.viio.io/#product-interface). | Name | Description | | -------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([ApplicationType!](https://developers.viio.io/#applicationtype-enum)) | | | `vendorId` (`ID`) | | | `vendorName` (`String!`) | | | `categoryId` (`ID!`) | | | `name` (`String!`) | | | `description` (`String`) | | | `subdomains` ([\[Subdomain!\]!](https://developers.viio.io/#subdomain-object)) | | | `links` ([DiscoveryLinks!](https://developers.viio.io/#discoverylinks-object)) | | | `tagIds` (`[ID!]!`) | | | `category` ([ProductCategory!](https://developers.viio.io/#productcategory-object)) | | | `vendor` ([Vendor](https://developers.viio.io/#vendor-object)) | | | `tags` ([\[ApplicationTag!\]!](https://developers.viio.io/#applicationtag-object)) | | | `plans` ([LicensePlansConnection](https://developers.viio.io/gql-schema-reference/licenses#licenseplansconnection-object)) | | ### ApplicationDiscoveriesConnection object A connection to a list of items. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ApplicationDiscoveriesEdge!\]](https://developers.viio.io/#applicationdiscoveriesedge-object)) | A list of edges. | | `nodes` ([\[ApplicationDiscovery!\]](https://developers.viio.io/#applicationdiscovery-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ApplicationDiscoveriesEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ApplicationDiscovery!](https://developers.viio.io/#applicationdiscovery-object)) | The item at the end of the edge. | ### ApplicationDiscovery object Fields returned by the ApplicationDiscovery object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `applicationId` (`ID!`) | | | `state` ([DiscoveryState!](https://developers.viio.io/#discoverystate-enum)) | | | `portfolioType` ([PortfolioType](https://developers.viio.io/#portfoliotype-enum)) | | | `detailedSources` ([\[DiscoveryDetailedSource!\]!](https://developers.viio.io/#discoverydetailedsource-union)) | | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `ownerId` (`ID`) | | | `owners` ([ProductDiscoveryOwners!](https://developers.viio.io/#productdiscoveryowners-object)) | | | `license` ([ProductLicense](https://developers.viio.io/#productlicense-interface)) | | | `contractDetails` ([DiscoveryContractDetails](https://developers.viio.io/#discoverycontractdetails-object)) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `userCountStat` ([ApplicationDiscoveryUserCountStat!](https://developers.viio.io/#applicationdiscoveryusercountstat-object)) | | | `sources` ([\[ApplicationDiscoverySource!\]!](https://developers.viio.io/#applicationdiscoverysource-union)) | | | `name` (`String!`) | | | `description` (`String`) | | | `links` ([DiscoveryLinks!](https://developers.viio.io/#discoverylinks-object)) | | | `vendor` ([Vendor](https://developers.viio.io/#vendor-object)) | | | `vendorId` (`ID`) | | | `vendorName` (`String!`) | | | `category` ([ProductCategory!](https://developers.viio.io/#productcategory-object)) | | | `tags` ([\[ApplicationTag!\]!](https://developers.viio.io/#applicationtag-object)) | | | `type` ([ApplicationType!](https://developers.viio.io/#applicationtype-enum)) | | | `userStats` ([ApplicationUsageStats!](https://developers.viio.io/#applicationusagestats-object)) | | | `spendStats` ([ApplicationUsageSpends!](https://developers.viio.io/#applicationusagespends-object)) | | | `application` ([Application!](https://developers.viio.io/#application-object)) | | | `owner` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `invoices` ([InvoicesConnection](https://developers.viio.io/#invoicesconnection-object)) | | ### ApplicationDiscoveryUserCountStat object Fields returned by the ApplicationDiscoveryUserCountStat object type. | Name | Description | | ----------------------- | ----------- | | `all` (`Int!`) | | | `last12Months` (`Int!`) | | | `last6Months` (`Int!`) | | | `last3Months` (`Int!`) | | | `last2Months` (`Int!`) | | | `last1Month` (`Int!`) | | | `last60Days` (`Int!`) | | | `last30Days` (`Int!`) | | ### ApplicationsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ApplicationsEdge!\]](https://developers.viio.io/#applicationsedge-object)) | A list of edges. | | `nodes` ([\[ApplicationDiscovery!\]](https://developers.viio.io/#applicationdiscovery-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ApplicationsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ApplicationDiscovery!](https://developers.viio.io/#applicationdiscovery-object)) | The item at the end of the edge. | ### ApplicationsUsageConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | --------------------------------- | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ApplicationsUsageEdge!\]](https://developers.viio.io/#applicationsusageedge-object)) | A list of edges. | | `nodes` ([\[UserUsage!\]](https://developers.viio.io/#userusage-object)) | A flattened list of the nodes. | ### ApplicationsUsageEdge object An edge in a connection. | Name | Description | | ------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([UserUsage!](https://developers.viio.io/#userusage-object)) | The item at the end of the edge. | ### ApplicationsUser object Fields returned by the ApplicationsUser object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `id` (`ID!`) | | | `employeeId` (`ID`) | | | `unmappedIntegratedUser` ([IntegratedUser](https://developers.viio.io/#integrateduser-object)) | | | `employee` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### ApplicationTag object Fields returned by the ApplicationTag object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `applicationDiscoveries` ([ApplicationDiscoveriesConnection](https://developers.viio.io/#applicationdiscoveriesconnection-object)) | | ### ApplicationUsageMonthAmount object Fields returned by the ApplicationUsageMonthAmount object type. | Name | Description | | ------------------- | ----------- | | `month` (`String!`) | | | `amount` (`Float!`) | | ### ApplicationUsageMonthSpend object Fields returned by the ApplicationUsageMonthSpend object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------- | ----------- | | `type` (`String!`) | | | `months` ([\[ApplicationUsageMonthAmount!\]!](https://developers.viio.io/#applicationusagemonthamount-object)) | | ### ApplicationUsageMonthStats object Fields returned by the ApplicationUsageMonthStats object type. | Name | Description | | ------------------------ | ----------- | | `month` (`String!`) | | | `usersCount` (`Int!`) | | | `daysCount` (`Int!`) | | | `averageDays` (`Float!`) | | ### ApplicationUsageSpends object Fields returned by the ApplicationUsageSpends object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `total` ([\[ApplicationUsageTotalSpend!\]!](https://developers.viio.io/#applicationusagetotalspend-object)) | | | `months` ([\[ApplicationUsageMonthSpend!\]!](https://developers.viio.io/#applicationusagemonthspend-object)) | | ### ApplicationUsageStats object Fields returned by the ApplicationUsageStats object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `months` ([\[ApplicationUsageMonthStats!\]!](https://developers.viio.io/#applicationusagemonthstats-object)) | | ### ApplicationUsageTotalSpend object Fields returned by the ApplicationUsageTotalSpend object type. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `type` (`String!`) | | | `count` (`Int!`) | | | `amount` (`Float!`) | | | `minDate` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `maxDate` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `numberOfMonths` (`Int!`) | | | `averageMonthly` (`Float!`) | | ### ArchivedApplicationsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ArchivedApplicationsEdge!\]](https://developers.viio.io/#archivedapplicationsedge-object)) | A list of edges. | | `nodes` ([\[ApplicationDiscovery!\]](https://developers.viio.io/#applicationdiscovery-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ArchivedApplicationsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ApplicationDiscovery!](https://developers.viio.io/#applicationdiscovery-object)) | The item at the end of the edge. | ### AuditLogDiscoverySource object Fields returned by the AuditLogDiscoverySource object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `installationIds` (`[ID!]!`) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `installations` ([DirectIntegrationInstallationsConnection](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallationsconnection-object)) | | ### BrowserExtensionDiscoverySource object Fields returned by the BrowserExtensionDiscoverySource object type. | Name | Description | | ------------------------------------------------------------------------------------------------ | ----------- | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### BrowserExtensionInstance object Fields returned by the BrowserExtensionInstance object type. | Name | Description | | ------------------------ | ----------- | | `instanceId` (`String!`) | | ### BrowserExtensionMetadata object Fields returned by the BrowserExtensionMetadata object type. | Name | Description | | -------------------------------------------------------------------------- | ----------- | | `edition` (`String!`) | | | `browser` ([BrowserInfo!](https://developers.viio.io/#browserinfo-object)) | | ### BrowserInfo object Fields returned by the BrowserInfo object type. | Name | Description | | ---------------------- | ----------- | | `name` (`String!`) | | | `version` (`String!`) | | | `platform` (`String!`) | | ### BuiltInSource object Fields returned by the BuiltInSource object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `dataSource` ([DiscoverySourceName!](https://developers.viio.io/#discoverysourcename-enum)) | | | `firstUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `recency` (`Int!`) | | ### ChangeVendorsOwnersPayload object Fields returned by the ChangeVendorsOwnersPayload object type. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[ChangeVendorsOwnersError!\]](https://developers.viio.io/#changevendorsownerserror-union)) | | ### ChangeVendorsStatePayload object Fields returned by the ChangeVendorsStatePayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[ChangeVendorsStateError!\]](https://developers.viio.io/#changevendorsstateerror-union)) | | ### DesktopAgentMetadata object Fields returned by the DesktopAgentMetadata object type. | Name | Description | | ----------------------------------------------------------- | ----------- | | `hostname` (`String!`) | | | `os` ([OsInfo!](https://developers.viio.io/#osinfo-object)) | | ### DesktopDiscoverySource object Fields returned by the DesktopDiscoverySource object type. | Name | Description | | ------------------------------------------------------------------------------------------------ | ----------- | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### DeviceAgent object Fields returned by the DeviceAgent object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `instanceId` (`String!`) | | | `agentType` ([DeviceAgentType!](https://developers.viio.io/#deviceagenttype-enum)) | | | `identity` ([DeviceAgentIdentity!](https://developers.viio.io/#deviceagentidentity-object)) | | | `version` (`String!`) | | | `metadata` ([DeviceAgentMetadata!](https://developers.viio.io/#deviceagentmetadata-union)) | | | `diagnostics` ([\[KeyValuePairOfStringAndString!\]](https://developers.viio.io/#keyvaluepairofstringandstring-object)) | | | `lastHeartbeatAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `employeeId` (`ID`) | | | `employee` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### DeviceAgentIdentity object Fields returned by the DeviceAgentIdentity object type. | Name | Description | | -------------------------- | ----------- | | `workspaceKey` (`String!`) | | | `email` (`String`) | | ### DeviceAgentsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[DeviceAgentsEdge!\]](https://developers.viio.io/#deviceagentsedge-object)) | A list of edges. | | `nodes` ([\[DeviceAgent!\]](https://developers.viio.io/#deviceagent-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### DeviceAgentsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([DeviceAgent!](https://developers.viio.io/#deviceagent-object)) | The item at the end of the edge. | ### DeviceAgentsSummary object Fields returned by the DeviceAgentsSummary object type. | Name | Description | | --------------------- | ----------- | | `total` (`Int!`) | | | `recognized` (`Int!`) | | ### DirectIntegrationDiscoverySource object Fields returned by the DirectIntegrationDiscoverySource object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `installationIds` (`[ID!]!`) | | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `installations` ([DirectIntegrationInstallationsConnection](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallationsconnection-object)) | | ### DiscoveredUser object Fields returned by the DiscoveredUser object type. | Name | Description | | ------------------------------------------------------------------------------------------------ | ----------- | | `id` (`ID!`) | | | `employeeId` (`ID`) | | | `name` (`String`) | | | `email` (`String`) | | | `products` ([ProductUsersConnection](https://developers.viio.io/#productusersconnection-object)) | | ### DiscoveryContractDetails object Fields returned by the DiscoveryContractDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `renewal` ([DiscoveryContractRenewal](https://developers.viio.io/#discoverycontractrenewal-object)) | | | `startDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `billingFrequency` (`Int!`) | | | `type` ([ContractType!](https://developers.viio.io/#contracttype-enum)) | | ### DiscoveryContractRenewal object Fields returned by the DiscoveryContractRenewal object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `upcomingDate` ([Date!](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `terminationPeriod` (`Int!`) | | ### DiscoveryLink object Fields returned by the DiscoveryLink object type. | Name | Description | | --------------------------------------------------------------------------------------- | ----------- | | `source` ([DiscoveryLinkSource!](https://developers.viio.io/#discoverylinksource-enum)) | | | `url` ([URL!](https://developers.viio.io/gql-schema-reference/common#url-scalar)) | | ### DiscoveryLinks object Fields returned by the DiscoveryLinks object type. | Name | Description | | ------------------------------------------------------------------------------------ | ----------- | | `homePage` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `pricingPage` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `privacyPolicy` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `termsOfService` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `security` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `gdpr` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `cookiePolicy` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | | `about` ([DiscoveryLink](https://developers.viio.io/#discoverylink-object)) | | ### DiscoveryOwners object Fields returned by the DiscoveryOwners object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ------------------ | | `itOwnerId` (`ID`) | For stitching only | | `legalOwnerId` (`ID`) | For stitching only | | `procurementOwnerId` (`ID`) | For stitching only | | `businessOwnerId` (`ID`) | For stitching only | | `financeOwnerId` (`ID`) | For stitching only | | `securityOwnerId` (`ID`) | For stitching only | | `it` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `legal` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `procurement` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `business` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `finance` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `security` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### DiscoverySource object Fields returned by the DiscoverySource object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `name` ([DiscoverySourceName!](https://developers.viio.io/#discoverysourcename-enum)) | | | `firstUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### DiscoveryUserCountStat object Fields returned by the DiscoveryUserCountStat object type. | Name | Description | | ----------------------- | ----------- | | `all` (`Int!`) | | | `last12Months` (`Int!`) | | | `last6Months` (`Int!`) | | | `last3Months` (`Int!`) | | | `last2Months` (`Int!`) | | | `last1Month` (`Int!`) | | | `last60Days` (`Int!`) | | | `last30Days` (`Int!`) | | ### EmailDiscoverySource object Fields returned by the EmailDiscoverySource object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `installationIds` (`[ID!]!`) | | | `installations` ([DirectIntegrationInstallationsConnection](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallationsconnection-object)) | | ### ExternalDiscoveryEngineDiscoverySource object Fields returned by the ExternalDiscoveryEngineDiscoverySource object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `installationIds` (`[ID!]!`) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `installations` ([DirectIntegrationInstallationsConnection](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallationsconnection-object)) | | ### FailedToChangeVendorsOwnersError object Fields returned by the FailedToChangeVendorsOwnersError object type. Implements [Error](https://developers.viio.io/#error-interface). | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FailedToChangeVendorsStateError object Fields returned by the FailedToChangeVendorsStateError object type. Implements [Error](https://developers.viio.io/#error-interface). | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FinanceDiscoverySource object Fields returned by the FinanceDiscoverySource object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `installationIds` (`[ID!]!`) | | | `installations` ([DirectIntegrationInstallationsConnection](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallationsconnection-object)) | | ### IntegratedUser object Fields returned by the IntegratedUser object type. | Name | Description | | ------------------------------- | ----------- | | `customerIntegrationId` (`ID!`) | | | `sourceId` (`String!`) | | | `deleted` (`Boolean!`) | | | `email` (`String`) | | | `username` (`String`) | | | `name` (`String`) | | | `billable` (`Boolean`) | | | `active` (`Boolean`) | | ### IntegrationPlanSource object Fields returned by the IntegrationPlanSource object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `planId` (`ID!`) | | | `customerIntegrationId` (`ID!`) | | | `dataSource` ([DiscoverySourceName!](https://developers.viio.io/#discoverysourcename-enum)) | | | `firstUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `recency` (`Int!`) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | | `plan` ([Plan](https://developers.viio.io/gql-schema-reference/licenses#plan-object)) | | ### IntegrationSource object Fields returned by the IntegrationSource object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `customerIntegrationId` (`ID!`) | | | `dataSource` ([DiscoverySourceName!](https://developers.viio.io/#discoverysourcename-enum)) | | | `firstUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `recency` (`Int!`) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | ### Invoice object Fields returned by the Invoice object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------- | ----------- | | `customerId` (`ID!`) | | | `name` (`String`) | | | `date` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `from` (`String`) | | | `applicationId` (`ID!`) | | | `customerIntegrations` ([\[InvoiceCustomerIntegration!\]!](https://developers.viio.io/#invoicecustomerintegration-object)) | | | `employeeIds` (`[ID!]!`) | | | `recipientIds` (`[ID!]!`) | | | `firstRelatedAttachmentId` (`ID!`) | | | `employees` ([InvoiceEmployeeCollectionSegment](https://developers.viio.io/#invoiceemployeecollectionsegment-object)) | | | `recipients` ([InvoiceRecipientCollectionSegment](https://developers.viio.io/#invoicerecipientcollectionsegment-object)) | | | `application` ([Application](https://developers.viio.io/#application-object)) | | ### InvoiceCustomerIntegration object Fields returned by the InvoiceCustomerIntegration object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | ### InvoiceEmployee object Fields returned by the InvoiceEmployee object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String`) | | | `email` (`String`) | | | `status` ([EmployeeStatus](https://developers.viio.io/gql-schema-reference/people-organization#employeestatus-enum)) | | ### InvoiceEmployeeCollectionSegment object A segment of a collection. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/gql-schema-reference/people-organization#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[InvoiceEmployee!\]](https://developers.viio.io/#invoiceemployee-object)) | A flattened list of the items. | | `totalCount` (`Int!`) | | ### InvoiceRecipient object Fields returned by the InvoiceRecipient object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String`) | | | `email` (`String`) | | | `status` ([EmployeeStatus](https://developers.viio.io/gql-schema-reference/people-organization#employeestatus-enum)) | | ### InvoiceRecipientCollectionSegment object A segment of a collection. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/gql-schema-reference/people-organization#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[InvoiceRecipient!\]](https://developers.viio.io/#invoicerecipient-object)) | A flattened list of the items. | | `totalCount` (`Int!`) | | ### InvoicesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[InvoicesEdge!\]](https://developers.viio.io/#invoicesedge-object)) | A list of edges. | | `nodes` ([\[Invoice!\]](https://developers.viio.io/#invoice-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### InvoicesEdge object An edge in a connection. | Name | Description | | --------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Invoice!](https://developers.viio.io/#invoice-object)) | The item at the end of the edge. | ### KeyValuePairOfStringAndString object Fields returned by the KeyValuePairOfStringAndString object type. | Name | Description | | ------------------- | ----------- | | `key` (`String!`) | | | `value` (`String!`) | | ### LicenseStats object Fields returned by the LicenseStats object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `licensesCount` ([LicenseStatsLicensesCount!](https://developers.viio.io/#licensestatslicensescount-object)) | | | `wastedLicensesCount` ([LicenseStatsWastedCount](https://developers.viio.io/#licensestatswastedcount-object)) | | | `annualLicenseCost` ([LicenseStatsCosts](https://developers.viio.io/#licensestatscosts-object)) | | | `potentialSaving` (`Float`) | | | `currency` (`String`) | | ### LicenseStatsCosts object Fields returned by the LicenseStatsCosts object type. | Name | Description | | ---------------------- | ----------- | | `total` (`Float!`) | | | `perLicense` (`Float`) | | ### LicenseStatsLicensesCount object Fields returned by the LicenseStatsLicensesCount object type. | Name | Description | | ---------------------- | ----------- | | `billable` (`Int!`) | | | `nonBillable` (`Int!`) | | | `assigned` (`Int!`) | | | `unassigned` (`Int`) | | ### LicenseStatsWastedCount object Fields returned by the LicenseStatsWastedCount object type. | Name | Description | | ---------------------- | ----------- | | `billable` (`Int!`) | | | `nonBillable` (`Int!`) | | ### ManualDiscoverySource object Fields returned by the ManualDiscoverySource object type. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### OsInfo object Fields returned by the OsInfo object type. | Name | Description | | --------------------- | ----------- | | `name` (`String!`) | | | `version` (`String`) | | | `platform` (`String`) | | ### OverlappedUsersConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[OverlappedUsersEdge!\]](https://developers.viio.io/#overlappedusersedge-object)) | A list of edges. | | `nodes` ([\[DiscoveredUser!\]](https://developers.viio.io/#discovereduser-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### OverlappedUsersEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([DiscoveredUser!](https://developers.viio.io/#discovereduser-object)) | The item at the end of the edge. | ### PotentialSaving object Fields returned by the PotentialSaving object type. | Name | Description | | ------------------------------------------------------------------------------------- | ----------- | | `amount` (`Float!`) | | | `percentage` (`Float!`) | | | `rate` ([PotentialSavingRate!](https://developers.viio.io/#potentialsavingrate-enum)) | | ### PricingStats object Fields returned by the PricingStats object type. | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `currency` (`String!`) | | | `annualCost` (`Float`) | | | `annualUnitPrice` (`Float`) | | | `potentialSaving` ([PotentialSaving](https://developers.viio.io/#potentialsaving-object)) | | ### ProductCategory object Fields returned by the ProductCategory object type. | Name | Description | | ------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `description` (`String!`) | | ### ProductDiscoveryOwners object Fields returned by the ProductDiscoveryOwners object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `itOwnerId` (`ID`) | | | `legalOwnerId` (`ID`) | | | `procurementOwnerId` (`ID`) | | | `businessOwnerId` (`ID`) | | | `financeOwnerId` (`ID`) | | | `securityOwnerId` (`ID`) | | | `it` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `legal` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `procurement` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `business` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `finance` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `security` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### ProductFamiliesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ProductFamiliesEdge!\]](https://developers.viio.io/#productfamiliesedge-object)) | A list of edges. | | `nodes` ([\[ProductFamily!\]](https://developers.viio.io/#productfamily-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ProductFamiliesEdge object An edge in a connection. | Name | Description | | --------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ProductFamily!](https://developers.viio.io/#productfamily-object)) | The item at the end of the edge. | ### ProductFamily object Fields returned by the ProductFamily object type. Implements [Product](https://developers.viio.io/#product-interface). | Name | Description | | ----------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `description` (`String`) | | | `links` ([DiscoveryLinks!](https://developers.viio.io/#discoverylinks-object)) | | | `category` ([ProductCategory!](https://developers.viio.io/#productcategory-object)) | | | `vendor` ([Vendor!](https://developers.viio.io/#vendor-object)) | | ### ProductsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ProductsEdge!\]](https://developers.viio.io/#productsedge-object)) | A list of edges. | | `nodes` ([\[Product\]](https://developers.viio.io/#product-interface)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ProductsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Product](https://developers.viio.io/#product-interface)) | The item at the end of the edge. | ### ProductsOverlap object Fields returned by the ProductsOverlap object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `productIds` (`[ID!]!`) | | | `usersAmount` ([ProductsOverlapUsersAmount!](https://developers.viio.io/#productsoverlapusersamount-object)) | | | `products` ([\[Product!\]!](https://developers.viio.io/#product-interface)) | | ### ProductsOverlapUsersAmount object Fields returned by the ProductsOverlapUsersAmount object type. | Name | Description | | --------------------- | ----------- | | `last60Days` (`Int!`) | | ### ProductUsage object Fields returned by the ProductUsage object type. | Name | Description | | ------------------------------------------------------------------------------------------------ | ----------- | | `sources` ([\[UsageSource!\]!](https://developers.viio.io/#usagesource-object)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### ProductUser object Fields returned by the ProductUser object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `userId` (`ID!`) | | | `target` ([UsageTarget](https://developers.viio.io/#usagetarget-object)) | | | `usage` ([ProductUsage](https://developers.viio.io/#productusage-object)) | | | `employeeId` (`ID`) | | | `actor` ([ProductUserActor](https://developers.viio.io/#productuseractor-union)) | | | `product` ([Product](https://developers.viio.io/#product-interface)) | | | `employee` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | | `licenses` ([LicensesConnection](https://developers.viio.io/gql-schema-reference/licenses#licensesconnection-object)) | | ### ProductUsersConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ProductUsersEdge!\]](https://developers.viio.io/#productusersedge-object)) | A list of edges. | | `nodes` ([\[ProductUser!\]](https://developers.viio.io/#productuser-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ProductUsersEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ProductUser!](https://developers.viio.io/#productuser-object)) | The item at the end of the edge. | ### Subdomain object Fields returned by the Subdomain object type. | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([SubdomainType](https://developers.viio.io/#subdomaintype-enum)) | | | `url` ([URL!](https://developers.viio.io/gql-schema-reference/common#url-scalar)) | | ### UsageSource object Fields returned by the UsageSource object type. | Name | Description | | ------------------------------------------------------------------------------------------------ | ----------- | | `customerIntegrationId` (`ID`) | | | `dataSource` ([DiscoverySourceName!](https://developers.viio.io/#discoverysourcename-enum)) | | | `lastUsed` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### UsageTarget object Fields returned by the UsageTarget object type. | Name | Description | | ----------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([UsageTargetType!](https://developers.viio.io/#usagetargettype-enum)) | | ### UserUsage object Fields returned by the UserUsage object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `applicationId` (`ID!`) | | | `userId` (`ID!`) | | | `sources` ([\[DiscoverySource!\]!](https://developers.viio.io/#discoverysource-object)) | | | `detailedSources` ([\[UsageDetailedSource!\]!](https://developers.viio.io/#usagedetailedsource-union)) | | | `firstUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `recency` (`Int`) | | | `applicationDiscovery` ([ApplicationDiscovery](https://developers.viio.io/#applicationdiscovery-object)) | | | `applicationsUser` ([ApplicationsUser](https://developers.viio.io/#applicationsuser-object)) | | | `licenses` ([LicensesConnection](https://developers.viio.io/gql-schema-reference/licenses#licensesconnection-object)) | | ### Vendor object Fields returned by the Vendor object type. Implements [Product](https://developers.viio.io/#product-interface). | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `description` (`String`) | | | `links` ([DiscoveryLinks](https://developers.viio.io/#discoverylinks-object)) | | | `state` ([DiscoveryState!](https://developers.viio.io/#discoverystate-enum)) | | | `owners` ([DiscoveryOwners!](https://developers.viio.io/#discoveryowners-object)) | | | `licensesCount` ([LicenseStatsLicensesCount!](https://developers.viio.io/#licensestatslicensescount-object)) | | | `userCountStat` ([DiscoveryUserCountStat!](https://developers.viio.io/#discoveryusercountstat-object)) | | | `pricingStats` ([PricingStats](https://developers.viio.io/#pricingstats-object)) | | | `productFamilies` ([ProductFamiliesConnection](https://developers.viio.io/#productfamiliesconnection-object)) | | ### VendorsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[VendorsEdge!\]](https://developers.viio.io/#vendorsedge-object)) | A list of edges. | | `nodes` ([\[Vendor!\]](https://developers.viio.io/#vendor-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### VendorsEdge object An edge in a connection. | Name | Description | | ------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Vendor!](https://developers.viio.io/#vendor-object)) | The item at the end of the edge. | ## Input Types ### AccountUsageActorFilterInput input Input fields accepted by AccountUsageActorFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[AccountUsageActorFilterInput!\]](https://developers.viio.io/#accountusageactorfilterinput-input)) | | | `or` ([\[AccountUsageActorFilterInput!\]](https://developers.viio.io/#accountusageactorfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### ApplicationDiscoveryDetailedSourceFilterInput input Input fields accepted by ApplicationDiscoveryDetailedSourceFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoveryDetailedSourceFilterInput!\]](https://developers.viio.io/#applicationdiscoverydetailedsourcefilterinput-input)) | | | `or` ([\[ApplicationDiscoveryDetailedSourceFilterInput!\]](https://developers.viio.io/#applicationdiscoverydetailedsourcefilterinput-input)) | | | `customerIntegrationId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `dataSource` ([DiscoverySourceNameOperationFilterInput](https://developers.viio.io/#discoverysourcenameoperationfilterinput-input)) | | | `firstUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | ### ApplicationDiscoveryEmployeeMetadataFilterInput input Input fields accepted by ApplicationDiscoveryEmployeeMetadataFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoveryEmployeeMetadataFilterInput!\]](https://developers.viio.io/#applicationdiscoveryemployeemetadatafilterinput-input)) | | | `or` ([\[ApplicationDiscoveryEmployeeMetadataFilterInput!\]](https://developers.viio.io/#applicationdiscoveryemployeemetadatafilterinput-input)) | | | `groupIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#listcomparableidtypeoperationfilterinput-input)) | | | `countries` ([ListStringOperationFilterInput](https://developers.viio.io/#liststringoperationfilterinput-input)) | | | `divisions` ([ListStringOperationFilterInput](https://developers.viio.io/#liststringoperationfilterinput-input)) | | | `costCenters` ([ListStringOperationFilterInput](https://developers.viio.io/#liststringoperationfilterinput-input)) | | | `departmentPaths` ([DepartmentPathsFilterInput](https://developers.viio.io/#departmentpathsfilterinput-input)) | | ### ApplicationDiscoveryEnrichedApplicationFilterInput input Input fields accepted by ApplicationDiscoveryEnrichedApplicationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoveryEnrichedApplicationFilterInput!\]](https://developers.viio.io/#applicationdiscoveryenrichedapplicationfilterinput-input)) | | | `or` ([\[ApplicationDiscoveryEnrichedApplicationFilterInput!\]](https://developers.viio.io/#applicationdiscoveryenrichedapplicationfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `categoryId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `tagIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#listcomparableidtypeoperationfilterinput-input)) | | | `vendorName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `vendorId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | ### ApplicationDiscoveryEnrichedApplicationSortInput input Input fields accepted by ApplicationDiscoveryEnrichedApplicationSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `categoryId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `portfolioType` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `vendorName` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `vendorId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ApplicationDiscoveryFilterInput input Input fields accepted by ApplicationDiscoveryFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoveryFilterInput!\]](https://developers.viio.io/#applicationdiscoveryfilterinput-input)) | | | `or` ([\[ApplicationDiscoveryFilterInput!\]](https://developers.viio.io/#applicationdiscoveryfilterinput-input)) | | | `detailedSources` ([ListFilterInputTypeOfDetailedSourceDbModelFilterInput](https://developers.viio.io/#listfilterinputtypeofdetailedsourcedbmodelfilterinput-input)) | | | `employeeMetadata` ([ApplicationDiscoveryEmployeeMetadataFilterInput](https://developers.viio.io/#applicationdiscoveryemployeemetadatafilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `applicationId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `state` ([DiscoveryStateOperationFilterInput](https://developers.viio.io/#discoverystateoperationfilterinput-input)) | | | `portfolioType` ([NullableOfPortfolioTypeOperationFilterInput](https://developers.viio.io/#nullableofportfoliotypeoperationfilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `ownerId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `owners` ([DiscoveryOwnersFilterInput](https://developers.viio.io/#discoveryownersfilterinput-input)) | | | `license` ([ProductLicenseFilterInput](https://developers.viio.io/#productlicensefilterinput-input)) | | | `contractDetails` ([DiscoveryContractDetailsFilterInput](https://developers.viio.io/#discoverycontractdetailsfilterinput-input)) | | | `createdAt` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `application` ([ApplicationDiscoveryEnrichedApplicationFilterInput](https://developers.viio.io/#applicationdiscoveryenrichedapplicationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `userCountStat` ([ApplicationDiscoveryUserCountStatFilterInput](https://developers.viio.io/#applicationdiscoveryusercountstatfilterinput-input)) | | | `sources` ([ListFilterInputTypeOfApplicationDiscoverySourceFilterInput](https://developers.viio.io/#listfilterinputtypeofapplicationdiscoverysourcefilterinput-input)) | | ### ApplicationDiscoverySortInput input Input fields accepted by ApplicationDiscoverySortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `applicationId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `state` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `portfolioType` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `lastUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `ownerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `license` ([ProductLicenseSortInput](https://developers.viio.io/#productlicensesortinput-input)) | | | `contractDetails` ([DiscoveryContractDetailsSortInput](https://developers.viio.io/#discoverycontractdetailssortinput-input)) | | | `createdAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `application` ([ApplicationDiscoveryEnrichedApplicationSortInput](https://developers.viio.io/#applicationdiscoveryenrichedapplicationsortinput-input)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `userCountStat` ([ApplicationDiscoveryUserCountStatSortInput](https://developers.viio.io/#applicationdiscoveryusercountstatsortinput-input)) | | ### ApplicationDiscoverySourceFilterInput input Input fields accepted by ApplicationDiscoverySourceFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoverySourceFilterInput!\]](https://developers.viio.io/#applicationdiscoverysourcefilterinput-input)) | | | `or` ([\[ApplicationDiscoverySourceFilterInput!\]](https://developers.viio.io/#applicationdiscoverysourcefilterinput-input)) | | | `dataSource` ([DataSourceOperationFilterInput](https://developers.viio.io/#datasourceoperationfilterinput-input)) | | ### ApplicationDiscoveryUserCountStatFilterInput input Input fields accepted by ApplicationDiscoveryUserCountStatFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ApplicationDiscoveryUserCountStatFilterInput!\]](https://developers.viio.io/#applicationdiscoveryusercountstatfilterinput-input)) | | | `or` ([\[ApplicationDiscoveryUserCountStatFilterInput!\]](https://developers.viio.io/#applicationdiscoveryusercountstatfilterinput-input)) | | | `all` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last12Months` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last6Months` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last3Months` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last2Months` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last1Month` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last60Days` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | | `last30Days` ([IntOperationFilterInput](https://developers.viio.io/#intoperationfilterinput-input)) | | ### ApplicationDiscoveryUserCountStatSortInput input Input fields accepted by ApplicationDiscoveryUserCountStatSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last12Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last6Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last3Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last2Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last1Month` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last60Days` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last30Days` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ApplicationUsagePeriodInput input Input fields accepted by ApplicationUsagePeriodInput. | Name | Description | | ----------------------------------------------------------------------------------- | ----------- | | `from` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `to` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | ### ChangeVendorOwnerInput input Input fields accepted by ChangeVendorOwnerInput. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `ownerType` ([DiscoveryOwnerType!](https://developers.viio.io/#discoveryownertype-enum)) | | | `ownerId` (`ID`) | | ### ChangeVendorsOwnersInput input Input fields accepted by ChangeVendorsOwnersInput. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `owners` ([\[ChangeVendorOwnerInput!\]!](https://developers.viio.io/#changevendorownerinput-input)) | | ### ChangeVendorsStateInput input Input fields accepted by ChangeVendorsStateInput. | Name | Description | | ---------------------------------------------------------------------------- | ----------- | | `state` ([DiscoveryState!](https://developers.viio.io/#discoverystate-enum)) | | ### ContractTypeOperationFilterInput input Input fields accepted by ContractTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------- | ----------- | | `eq` ([ContractType](https://developers.viio.io/#contracttype-enum)) | | | `neq` ([ContractType](https://developers.viio.io/#contracttype-enum)) | | | `in` ([\[ContractType!\]](https://developers.viio.io/#contracttype-enum)) | | | `nin` ([\[ContractType!\]](https://developers.viio.io/#contracttype-enum)) | | ### DataSourceOperationFilterInput input Input fields accepted by DataSourceOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `eq` ([DiscoverySourceName](https://developers.viio.io/#discoverysourcename-enum)) | | | `neq` ([DiscoverySourceName](https://developers.viio.io/#discoverysourcename-enum)) | | | `in` ([\[DiscoverySourceName!\]](https://developers.viio.io/#discoverysourcename-enum)) | | | `nin` ([\[DiscoverySourceName!\]](https://developers.viio.io/#discoverysourcename-enum)) | | ### DepartmentPathFilterInput input Input fields accepted by DepartmentPathFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `none` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `some` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `any` (`Boolean`) | | | `startsWith` (`[String!]`) | | | `nstartsWith` (`[String!]`) | | | `isNullish` (`Boolean`) | | ### DepartmentPathsFilterInput input Input fields accepted by DepartmentPathsFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DepartmentPathsFilterInput!\]](https://developers.viio.io/#departmentpathsfilterinput-input)) | | | `or` ([\[DepartmentPathsFilterInput!\]](https://developers.viio.io/#departmentpathsfilterinput-input)) | | | `startsWith` (`[String!]`) | | ### DeviceAgentEmployeeFilterInput input Input fields accepted by DeviceAgentEmployeeFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DeviceAgentEmployeeFilterInput!\]](https://developers.viio.io/#deviceagentemployeefilterinput-input)) | | | `or` ([\[DeviceAgentEmployeeFilterInput!\]](https://developers.viio.io/#deviceagentemployeefilterinput-input)) | | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `firstName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `lastName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `status` ([EmployeeStatusOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#employeestatusoperationfilterinput-input)) | | | `country` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `division` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `costCenter` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `departmentPath` ([DepartmentPathFilterInput](https://developers.viio.io/#departmentpathfilterinput-input)) | | ### DeviceAgentFilterInput input Input fields accepted by DeviceAgentFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DeviceAgentFilterInput!\]](https://developers.viio.io/#deviceagentfilterinput-input)) | | | `or` ([\[DeviceAgentFilterInput!\]](https://developers.viio.io/#deviceagentfilterinput-input)) | | | `agentType` ([DeviceAgentTypeOperationFilterInput](https://developers.viio.io/#deviceagenttypeoperationfilterinput-input)) | | | `lastHeartbeatAt` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `employee` ([DeviceAgentEmployeeFilterInput](https://developers.viio.io/#deviceagentemployeefilterinput-input)) | | ### DeviceAgentSortInput input Input fields accepted by DeviceAgentSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `lastHeartbeatAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `version` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### DeviceAgentTypeOperationFilterInput input Input fields accepted by DeviceAgentTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------- | ----------- | | `eq` ([DeviceAgentType](https://developers.viio.io/#deviceagenttype-enum)) | | | `neq` ([DeviceAgentType](https://developers.viio.io/#deviceagenttype-enum)) | | | `in` ([\[DeviceAgentType!\]](https://developers.viio.io/#deviceagenttype-enum)) | | | `nin` ([\[DeviceAgentType!\]](https://developers.viio.io/#deviceagenttype-enum)) | | ### DiscoveryContractDetailsFilterInput input Input fields accepted by DiscoveryContractDetailsFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[DiscoveryContractDetailsFilterInput!\]](https://developers.viio.io/#discoverycontractdetailsfilterinput-input)) | | | `or` ([\[DiscoveryContractDetailsFilterInput!\]](https://developers.viio.io/#discoverycontractdetailsfilterinput-input)) | | | `startDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `renewal` ([DiscoveryContractRenewalFilterInput](https://developers.viio.io/#discoverycontractrenewalfilterinput-input)) | | | `type` ([ContractTypeOperationFilterInput](https://developers.viio.io/#contracttypeoperationfilterinput-input)) | | ### DiscoveryContractDetailsSortInput input Input fields accepted by DiscoveryContractDetailsSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `startDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `renewal` ([DiscoveryContractRenewalSortInput](https://developers.viio.io/#discoverycontractrenewalsortinput-input)) | | ### DiscoveryContractRenewalFilterInput input Input fields accepted by DiscoveryContractRenewalFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DiscoveryContractRenewalFilterInput!\]](https://developers.viio.io/#discoverycontractrenewalfilterinput-input)) | | | `or` ([\[DiscoveryContractRenewalFilterInput!\]](https://developers.viio.io/#discoverycontractrenewalfilterinput-input)) | | | `upcomingDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `isNullish` (`Boolean`) | | ### DiscoveryContractRenewalSortInput input Input fields accepted by DiscoveryContractRenewalSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `upcomingDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### DiscoveryLinkSortInput input Input fields accepted by DiscoveryLinkSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `source` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `url` ([UriSortInput](https://developers.viio.io/#urisortinput-input)) | | ### DiscoveryLinksSortInput input Input fields accepted by DiscoveryLinksSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `homePage` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `pricingPage` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `privacyPolicy` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `termsOfService` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `security` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `gdpr` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `cookiePolicy` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | | `about` ([DiscoveryLinkSortInput](https://developers.viio.io/#discoverylinksortinput-input)) | | ### DiscoveryOwnerFilterInput input Input fields accepted by DiscoveryOwnerFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[DiscoveryOwnerFilterInput!\]](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `or` ([\[DiscoveryOwnerFilterInput!\]](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | ### DiscoveryOwnersFilterInput input Input fields accepted by DiscoveryOwnersFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DiscoveryOwnersFilterInput!\]](https://developers.viio.io/#discoveryownersfilterinput-input)) | | | `or` ([\[DiscoveryOwnersFilterInput!\]](https://developers.viio.io/#discoveryownersfilterinput-input)) | | | `itOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `legalOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `procurementOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `businessOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `financeOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | | `securityOwner` ([DiscoveryOwnerFilterInput](https://developers.viio.io/#discoveryownerfilterinput-input)) | | ### DiscoveryOwnerSortInput input Input fields accepted by DiscoveryOwnerSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `updatedAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `setAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `removedAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### DiscoveryOwnersSortInput input Input fields accepted by DiscoveryOwnersSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `itOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `itOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `legalOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `legalOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `procurementOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `procurementOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `businessOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `businessOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `financeOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `financeOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `securityOwner` ([DiscoveryOwnerSortInput](https://developers.viio.io/#discoveryownersortinput-input)) | | | `securityOwnerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### DiscoverySourceNameOperationFilterInput input Input fields accepted by DiscoverySourceNameOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `eq` ([DiscoverySourceName](https://developers.viio.io/#discoverysourcename-enum)) | | | `neq` ([DiscoverySourceName](https://developers.viio.io/#discoverysourcename-enum)) | | | `in` ([\[DiscoverySourceName!\]](https://developers.viio.io/#discoverysourcename-enum)) | | | `nin` ([\[DiscoverySourceName!\]](https://developers.viio.io/#discoverysourcename-enum)) | | ### DiscoveryStateOperationFilterInput input Input fields accepted by DiscoveryStateOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------ | ----------- | | `eq` ([DiscoveryState](https://developers.viio.io/#discoverystate-enum)) | | | `neq` ([DiscoveryState](https://developers.viio.io/#discoverystate-enum)) | | | `in` ([\[DiscoveryState!\]](https://developers.viio.io/#discoverystate-enum)) | | | `nin` ([\[DiscoveryState!\]](https://developers.viio.io/#discoverystate-enum)) | | ### DiscoveryUserCountStatSortInput input Input fields accepted by DiscoveryUserCountStatSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last12Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last6Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last3Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last2Months` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last1Month` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last60Days` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `last30Days` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### EmployeeLicenseFilterInput input Input fields accepted by EmployeeLicenseFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `productId` ([EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput](https://developers.viio.io/gql-schema-reference/licenses#equalonlyoperationfilterinputtypeofidtypefilterinput-input)) | | ### EmployeeProductFilterInput input Input fields accepted by EmployeeProductFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `productId` ([EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput](https://developers.viio.io/gql-schema-reference/licenses#equalonlyoperationfilterinputtypeofidtypefilterinput-input)) | | ### EmployeeUsageActorFilterInput input Input fields accepted by EmployeeUsageActorFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[EmployeeUsageActorFilterInput!\]](https://developers.viio.io/#employeeusageactorfilterinput-input)) | | | `or` ([\[EmployeeUsageActorFilterInput!\]](https://developers.viio.io/#employeeusageactorfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `status` ([EmployeeStatusOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#employeestatusoperationfilterinput-input)) | | | `groupIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#listcomparableidtypeoperationfilterinput-input)) | | | `country` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `division` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `costCenter` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `departmentPath` ([DepartmentPathFilterInput](https://developers.viio.io/#departmentpathfilterinput-input)) | | ### IntOperationFilterInput input Input fields accepted by IntOperationFilterInput. | Name | Description | | --------------- | ----------- | | `eq` (`Int`) | | | `neq` (`Int`) | | | `in` (`[Int]`) | | | `nin` (`[Int]`) | | | `gt` (`Int`) | | | `ngt` (`Int`) | | | `gte` (`Int`) | | | `ngte` (`Int`) | | | `lt` (`Int`) | | | `nlt` (`Int`) | | | `lte` (`Int`) | | | `nlte` (`Int`) | | ### InvoiceSortInput input Input fields accepted by InvoiceSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `customerId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `date` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `from` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `applicationId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `firstRelatedAttachmentId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseStatsCostsFilterInput input Input fields accepted by LicenseStatsCostsFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[LicenseStatsCostsFilterInput!\]](https://developers.viio.io/#licensestatscostsfilterinput-input)) | | | `or` ([\[LicenseStatsCostsFilterInput!\]](https://developers.viio.io/#licensestatscostsfilterinput-input)) | | | `total` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `perLicense` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `isNullish` (`Boolean`) | | ### LicenseStatsCostsSortInput input Input fields accepted by LicenseStatsCostsSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `perLicense` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseStatsFilterInput input Input fields accepted by LicenseStatsFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[LicenseStatsFilterInput!\]](https://developers.viio.io/#licensestatsfilterinput-input)) | | | `or` ([\[LicenseStatsFilterInput!\]](https://developers.viio.io/#licensestatsfilterinput-input)) | | | `annualLicenseCost` ([LicenseStatsCostsFilterInput](https://developers.viio.io/#licensestatscostsfilterinput-input)) | | ### LicenseStatsLicensesCountSortInput input Input fields accepted by LicenseStatsLicensesCountSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------------- | ----------- | | `billable` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `nonBillable` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `assigned` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `unassigned` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseStatsSortInput input Input fields accepted by LicenseStatsSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `annualLicenseCost` ([LicenseStatsCostsSortInput](https://developers.viio.io/#licensestatscostssortinput-input)) | | ### ListFilterInputTypeOfApplicationDiscoverySourceFilterInput input Input fields accepted by ListFilterInputTypeOfApplicationDiscoverySourceFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([ApplicationDiscoverySourceFilterInput](https://developers.viio.io/#applicationdiscoverysourcefilterinput-input)) | | | `none` ([ApplicationDiscoverySourceFilterInput](https://developers.viio.io/#applicationdiscoverysourcefilterinput-input)) | | | `some` ([ApplicationDiscoverySourceFilterInput](https://developers.viio.io/#applicationdiscoverysourcefilterinput-input)) | | | `any` (`Boolean`) | | ### ListFilterInputTypeOfDetailedSourceDbModelFilterInput input Input fields accepted by ListFilterInputTypeOfDetailedSourceDbModelFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([ApplicationDiscoveryDetailedSourceFilterInput](https://developers.viio.io/#applicationdiscoverydetailedsourcefilterinput-input)) | | | `none` ([ApplicationDiscoveryDetailedSourceFilterInput](https://developers.viio.io/#applicationdiscoverydetailedsourcefilterinput-input)) | | | `some` ([ApplicationDiscoveryDetailedSourceFilterInput](https://developers.viio.io/#applicationdiscoverydetailedsourcefilterinput-input)) | | | `any` (`Boolean`) | | ### ListFilterInputTypeOfUsageSourceFilterInput input Input fields accepted by ListFilterInputTypeOfUsageSourceFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------- | ----------- | | `all` ([UsageSourceFilterInput](https://developers.viio.io/#usagesourcefilterinput-input)) | | | `none` ([UsageSourceFilterInput](https://developers.viio.io/#usagesourcefilterinput-input)) | | | `some` ([UsageSourceFilterInput](https://developers.viio.io/#usagesourcefilterinput-input)) | | | `any` (`Boolean`) | | ### ListStringOperationFilterInput input Input fields accepted by ListStringOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `none` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `some` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `any` (`Boolean`) | | ### NullableOfPortfolioTypeOperationFilterInput input Input fields accepted by NullableOfPortfolioTypeOperationFilterInput. | Name | Description | | --------------------------------------------------------------------------- | ----------- | | `eq` ([PortfolioType](https://developers.viio.io/#portfoliotype-enum)) | | | `neq` ([PortfolioType](https://developers.viio.io/#portfoliotype-enum)) | | | `in` ([\[PortfolioType\]](https://developers.viio.io/#portfoliotype-enum)) | | | `nin` ([\[PortfolioType\]](https://developers.viio.io/#portfoliotype-enum)) | | ### PotentialSavingSortInput input Input fields accepted by PotentialSavingSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `amount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `percentage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `rate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### PricingStatsSortInput input Input fields accepted by PricingStatsSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `annualCost` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `annualUnitPrice` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `potentialSaving` ([PotentialSavingSortInput](https://developers.viio.io/#potentialsavingsortinput-input)) | | ### ProductFamilyFilterInput input Input fields accepted by ProductFamilyFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[ProductFamilyFilterInput!\]](https://developers.viio.io/#productfamilyfilterinput-input)) | | | `or` ([\[ProductFamilyFilterInput!\]](https://developers.viio.io/#productfamilyfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### ProductFamilySortInput input Input fields accepted by ProductFamilySortInput. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ProductLicenseFilterInput input Input fields accepted by ProductLicenseFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ProductLicenseFilterInput!\]](https://developers.viio.io/#productlicensefilterinput-input)) | | | `or` ([\[ProductLicenseFilterInput!\]](https://developers.viio.io/#productlicensefilterinput-input)) | | | `stats` ([LicenseStatsFilterInput](https://developers.viio.io/#licensestatsfilterinput-input)) | | | `origin` ([ProductLicenseOriginOperationFilterInput](https://developers.viio.io/#productlicenseoriginoperationfilterinput-input)) | | ### ProductLicenseOriginOperationFilterInput input Input fields accepted by ProductLicenseOriginOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------ | ----------- | | `eq` ([ProductLicenseOrigin](https://developers.viio.io/#productlicenseorigin-enum)) | | | `neq` ([ProductLicenseOrigin](https://developers.viio.io/#productlicenseorigin-enum)) | | | `in` ([\[ProductLicenseOrigin!\]](https://developers.viio.io/#productlicenseorigin-enum)) | | | `nin` ([\[ProductLicenseOrigin!\]](https://developers.viio.io/#productlicenseorigin-enum)) | | ### ProductLicenseSortInput input Input fields accepted by ProductLicenseSortInput. | Name | Description | | ------------------------------------------------------------------------------------------ | ----------- | | `stats` ([LicenseStatsSortInput](https://developers.viio.io/#licensestatssortinput-input)) | | ### ProductSortInput input Input fields accepted by ProductSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ProductsOverlapInput input Input for analyzing user overlap between products. Returns users who use at least overlapSize apps from productIds list and don't use any apps from excludeProductIds list. | Name | Description | | ----------------------------- | ------------------------------------------------------------------------------------------------ | | `productIds` (`[ID!]!`) | List of product IDs to analyze for overlap | | `overlapSize` (`Int!`) | Minimum number of products from ProductIds that users must use | | `excludeProductIds` (`[ID!]`) | Optional list of product IDs to exclude - users using any of these products will be filtered out | ### ProductUsageActorFilterInput input Input fields accepted by ProductUsageActorFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[ProductUsageActorFilterInput!\]](https://developers.viio.io/#productusageactorfilterinput-input)) | | | `or` ([\[ProductUsageActorFilterInput!\]](https://developers.viio.io/#productusageactorfilterinput-input)) | | | `account` ([AccountUsageActorFilterInput](https://developers.viio.io/#accountusageactorfilterinput-input)) | | | `employee` ([EmployeeUsageActorFilterInput](https://developers.viio.io/#employeeusageactorfilterinput-input)) | | | `browserExtensionInstanceId` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### ProductUsageFilterInput input Input fields accepted by ProductUsageFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ProductUsageFilterInput!\]](https://developers.viio.io/#productusagefilterinput-input)) | | | `or` ([\[ProductUsageFilterInput!\]](https://developers.viio.io/#productusagefilterinput-input)) | | | `sources` ([ListFilterInputTypeOfUsageSourceFilterInput](https://developers.viio.io/#listfilterinputtypeofusagesourcefilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | ### ProductUsageSortInput input Input fields accepted by ProductUsageSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `lastUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ProductUsageTargetFilterInput input Input fields accepted by ProductUsageTargetFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[ProductUsageTargetFilterInput!\]](https://developers.viio.io/#productusagetargetfilterinput-input)) | | | `or` ([\[ProductUsageTargetFilterInput!\]](https://developers.viio.io/#productusagetargetfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `type` ([UsageTargetTypeOperationFilterInput](https://developers.viio.io/#usagetargettypeoperationfilterinput-input)) | | ### ProductUserFilterInput input Input fields accepted by ProductUserFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ProductUserFilterInput!\]](https://developers.viio.io/#productuserfilterinput-input)) | | | `or` ([\[ProductUserFilterInput!\]](https://developers.viio.io/#productuserfilterinput-input)) | | | `target` ([ProductUsageTargetFilterInput](https://developers.viio.io/#productusagetargetfilterinput-input)) | | | `actor` ([ProductUsageActorFilterInput](https://developers.viio.io/#productusageactorfilterinput-input)) | | | `usage` ([ProductUsageFilterInput](https://developers.viio.io/#productusagefilterinput-input)) | | ### ProductUserSortInput input Input fields accepted by ProductUserSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `usage` ([ProductUsageSortInput](https://developers.viio.io/#productusagesortinput-input)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### UriSortInput input Input fields accepted by UriSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `absolutePath` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `absoluteUri` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `localPath` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `authority` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `hostNameType` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `isDefaultPort` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `isFile` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `isLoopback` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `pathAndQuery` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `isUnc` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `host` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `port` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `query` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `fragment` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `scheme` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `originalString` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `dnsSafeHost` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `idnHost` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `isAbsoluteUri` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `userEscaped` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `userInfo` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### UsageSourceFilterInput input Input fields accepted by UsageSourceFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[UsageSourceFilterInput!\]](https://developers.viio.io/#usagesourcefilterinput-input)) | | | `or` ([\[UsageSourceFilterInput!\]](https://developers.viio.io/#usagesourcefilterinput-input)) | | | `customerIntegrationId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `dataSource` ([DataSourceOperationFilterInput](https://developers.viio.io/#datasourceoperationfilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | ### UsageTargetTypeOperationFilterInput input Input fields accepted by UsageTargetTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------- | ----------- | | `eq` ([UsageTargetType](https://developers.viio.io/#usagetargettype-enum)) | | | `neq` ([UsageTargetType](https://developers.viio.io/#usagetargettype-enum)) | | | `in` ([\[UsageTargetType!\]](https://developers.viio.io/#usagetargettype-enum)) | | | `nin` ([\[UsageTargetType!\]](https://developers.viio.io/#usagetargettype-enum)) | | ### VendorDiscoveryFilterInput input Input fields accepted by VendorDiscoveryFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[VendorDiscoveryFilterInput!\]](https://developers.viio.io/#vendordiscoveryfilterinput-input)) | | | `or` ([\[VendorDiscoveryFilterInput!\]](https://developers.viio.io/#vendordiscoveryfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `state` ([DiscoveryStateOperationFilterInput](https://developers.viio.io/#discoverystateoperationfilterinput-input)) | | ### VendorSortInput input Input fields accepted by VendorSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ----------- | | `state` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `owners` ([DiscoveryOwnersSortInput](https://developers.viio.io/#discoveryownerssortinput-input)) | | | `licensesCount` ([LicenseStatsLicensesCountSortInput](https://developers.viio.io/#licensestatslicensescountsortinput-input)) | | | `userCountStat` ([DiscoveryUserCountStatSortInput](https://developers.viio.io/#discoveryusercountstatsortinput-input)) | | | `pricingStats` ([PricingStatsSortInput](https://developers.viio.io/#pricingstatssortinput-input)) | | | `description` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `links` ([DiscoveryLinksSortInput](https://developers.viio.io/#discoverylinkssortinput-input)) | | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ## Interfaces ### Error interface Fields defined by the Error interface. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### Product interface Fields defined by the Product interface. | Name | Description | | ------------------ | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | ### ProductLicense interface Fields defined by the ProductLicense interface. | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `origin` ([ProductLicenseOrigin!](https://developers.viio.io/#productlicenseorigin-enum)) | | | `stats` ([LicenseStats!](https://developers.viio.io/#licensestats-object)) | | ## Unions ### ApplicationDiscoverySource union Possible object types returned by the ApplicationDiscoverySource union. Possible types: [DirectIntegrationDiscoverySource](https://developers.viio.io/#directintegrationdiscoverysource-object), [AuditLogDiscoverySource](https://developers.viio.io/#auditlogdiscoverysource-object), [ExternalDiscoveryEngineDiscoverySource](https://developers.viio.io/#externaldiscoveryenginediscoverysource-object), [BrowserExtensionDiscoverySource](https://developers.viio.io/#browserextensiondiscoverysource-object), [DesktopDiscoverySource](https://developers.viio.io/#desktopdiscoverysource-object), [FinanceDiscoverySource](https://developers.viio.io/#financediscoverysource-object), [ManualDiscoverySource](https://developers.viio.io/#manualdiscoverysource-object), [EmailDiscoverySource](https://developers.viio.io/#emaildiscoverysource-object) ### ChangeVendorsOwnersError union Possible object types returned by the ChangeVendorsOwnersError union. Possible types: [FailedToChangeVendorsOwnersError](https://developers.viio.io/#failedtochangevendorsownerserror-object) ### ChangeVendorsStateError union Possible object types returned by the ChangeVendorsStateError union. Possible types: [FailedToChangeVendorsStateError](https://developers.viio.io/#failedtochangevendorsstateerror-object) ### DeviceAgentMetadata union Possible object types returned by the DeviceAgentMetadata union. Possible types: [BrowserExtensionMetadata](https://developers.viio.io/#browserextensionmetadata-object), [DesktopAgentMetadata](https://developers.viio.io/#desktopagentmetadata-object) ### DiscoveryDetailedSource union Possible object types returned by the DiscoveryDetailedSource union. Possible types: [BuiltInSource](https://developers.viio.io/#builtinsource-object), [IntegrationSource](https://developers.viio.io/#integrationsource-object) ### ProductUserActor union Possible object types returned by the ProductUserActor union. Possible types: [Account](https://developers.viio.io/gql-schema-reference/accounts#account-object), [BrowserExtensionInstance](https://developers.viio.io/#browserextensioninstance-object) ### UsageDetailedSource union Possible object types returned by the UsageDetailedSource union. Possible types: [BuiltInSource](https://developers.viio.io/#builtinsource-object), [IntegrationSource](https://developers.viio.io/#integrationsource-object), [IntegrationPlanSource](https://developers.viio.io/#integrationplansource-object) ## Enums ### ApplicationType enum Accepted values for the ApplicationType enum. | Value | Description | | ------------- | ----------- | | `APPLICATION` | | ### ContractType enum Contract type | Value | Description | | --------- | ----------- | | `CUSTOM` | | | `MONTHLY` | | | `YEARLY` | | ### DeviceAgentType enum Accepted values for the DeviceAgentType enum. | Value | Description | | ------------------- | ----------- | | `BROWSER_EXTENSION` | | | `DESKTOP_AGENT` | | ### DiscoveryLinkSource enum Accepted values for the DiscoveryLinkSource enum. | Value | Description | | -------- | ----------- | | `MANUAL` | | | `AI` | | ### DiscoveryOwnerType enum Accepted values for the DiscoveryOwnerType enum. | Value | Description | | ------------- | ----------- | | `IT` | | | `LEGAL` | | | `PROCUREMENT` | | | `BUSINESS` | | | `FINANCE` | | | `SECURITY` | | ### DiscoverySourceName enum Accepted values for the DiscoverySourceName enum. | Value | Description | | --------------------------- | ----------- | | `EMAIL` | | | `BROWSER_EXTENSION` | | | `AUDIT_LOG` | | | `FINANCE` | | | `NETWORK_LOG` | | | `DIRECT_INTEGRATION` | | | `DESKTOP` | | | `MANUAL` | | | `TOKEN` | | | `EXTERNAL_DISCOVERY_ENGINE` | | ### DiscoveryState enum Accepted values for the DiscoveryState enum. | Value | Description | | --------------------- | ----------- | | `DISCOVERED` | | | `IN_REVIEW` | | | `BUSINESS_EVALUATION` | | | `DISQUALIFIED` | | | `SANCTIONED` | | | `DEPRECATED` | | | `ARCHIVED` | | ### PortfolioType enum Accepted values for the PortfolioType enum. | Value | Description | | ----------------- | ----------- | | `CORE` | | | `DIFFERENTIATION` | | | `INNOVATION` | | | `CUT` | | ### PotentialSavingRate enum Accepted values for the PotentialSavingRate enum. | Value | Description | | -------- | ----------- | | `NONE` | | | `LOW` | | | `MEDIUM` | | | `HIGH` | | ### ProductLicenseOrigin enum Accepted values for the ProductLicenseOrigin enum. | Value | Description | | ------------- | ----------- | | `MANUAL` | | | `INTEGRATION` | | ### ProductType enum Accepted values for the ProductType enum. | Value | Description | | ---------------- | ----------- | | `APPLICATION` | | | `VENDOR` | | | `PRODUCT_FAMILY` | | ### SubdomainType enum Accepted values for the SubdomainType enum. | Value | Description | | ------------------ | ----------- | | `PRICING` | | | `PRIVACY_POLICY` | | | `TERMS_OF_SERVICE` | | | `SECURITY` | | | `GDPR` | | | `HOMEPAGE` | | | `COOKIE_POLICY` | | | `ABOUT` | | ### UsageTargetType enum Accepted values for the UsageTargetType enum. | Value | Description | | ---------------- | ----------- | | `APPLICATION` | | | `PRODUCT_FAMILY` | | | `VENDOR` | | # Identity ## Queries ### userProfile query Retrieve userProfile data from the Viio GraphQL API. ```graphql userProfile(): UserProfile! ``` **Returns:** [UserProfile!](https://developers.viio.io/gql-schema-reference/tenant#userprofile-object) This operation has no arguments. # Integrations ## Queries ### directIntegrationInstallation query Returns the direct-integration installation with the given id. ```graphql directIntegrationInstallation(id: ID!): DirectIntegrationInstallation ``` **Returns:** [DirectIntegrationInstallation](https://developers.viio.io/#directintegrationinstallation-object) **Arguments for `directIntegrationInstallation`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### directIntegrationInstallations query Returns the direct-integration installations. ```graphql directIntegrationInstallations(first: Int, after: String, last: Int, before: String, where: DirectIntegrationInstallationFilterInput, order: [DirectIntegrationInstallationSortInput!]): DirectIntegrationInstallationsConnection ``` **Returns:** [DirectIntegrationInstallationsConnection](https://developers.viio.io/#directintegrationinstallationsconnection-object) **Arguments for `directIntegrationInstallations`** | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([DirectIntegrationInstallationFilterInput](https://developers.viio.io/#directintegrationinstallationfilterinput-input)) | | | `order` ([\[DirectIntegrationInstallationSortInput!\]](https://developers.viio.io/#directintegrationinstallationsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ## Objects ### AdIntegrationDataAccess object Fields returned by the AdIntegrationDataAccess object type. | Name | Description | | ------------------------ | ----------- | | `installed` (`Boolean!`) | | | `groups` (`Boolean!`) | | ### AssignLicenseActionMetadata object Fields returned by the AssignLicenseActionMetadata object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `plansSelection` ([PlansSelection!](https://developers.viio.io/#plansselection-union)) | | | `userShouldExist` (`Boolean!`) | | | `customInputs` ([\[CustomInputMetadata!\]!](https://developers.viio.io/#custominputmetadata-object)) | | ### ConnectedDirectIntegrationInstallationStatus object The installation is connected. | Name | Description | | --------------------------------------------------------------------------------------------------- | ------------------------------------ | | `connectedAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | When the installation was connected. | ### CustomerSetting object Fields returned by the CustomerSetting object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `name` (`String!`) | | | `description` (`String!`) | | | `formType` ([CustomerSettingFormType!](https://developers.viio.io/#customersettingformtype-enum)) | | | `validationStrategies` (`[String!]!`) | | | `initialValues` (`[String!]!`) | | | `required` (`Boolean!`) | | | `sensitive` (`Boolean!`) | | ### CustomInputMetadata object Fields returned by the CustomInputMetadata object type. | Name | Description | | ----------------------------------------------------------------------------- | ----------- | | `key` (`String!`) | | | `name` (`String!`) | | | `description` (`String!`) | | | `type` ([CustomInputType!](https://developers.viio.io/#custominputtype-enum)) | | | `required` (`Boolean!`) | | ### DirectIntegration object Fields returned by the DirectIntegration object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([UUID!](https://developers.viio.io/gql-schema-reference/common#uuid-scalar)) | | | `objectId` (`ID!`) | | | `name` (`String!`) | | | `status` ([DirectIntegrationStatus!](https://developers.viio.io/#directintegrationstatus-enum)) | | | `helpUrl` ([URL](https://developers.viio.io/gql-schema-reference/common#url-scalar)) | | | `vendorId` (`ID`) | | | `categories` (`[String!]!`) | | | `features` (`[String!]!`) | | | `description` (`String!`) | | | `htmlDescription` (`String!`) | | | `applicationId` (`ID`) | | | `customerSettings` ([\[CustomerSetting!\]](https://developers.viio.io/#customersetting-object)) | | | `installations` ([InstallationsConnection](https://developers.viio.io/#installationsconnection-object)) | | | `recommended` (`Boolean!`) | | | `authorization` ([BaseAuthorizationConfiguration!](https://developers.viio.io/#baseauthorizationconfiguration-interface)) | | | `popupAuthorization` ([PopupAuthorizationOptions](https://developers.viio.io/#popupauthorizationoptions-object)) | | | `integrationCustomInputs` ([\[CustomInputMetadata!\]!](https://developers.viio.io/#custominputmetadata-object)) | | | `application` ([Application](https://developers.viio.io/gql-schema-reference/discovery#application-object)) | | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | ### DirectIntegrationEntitySyncResult object The synchronization result for one entity. | Name | Description | | -------------------- | --------------------------------- | | `entity` (`String!`) | The synchronized entity. | | `count` (`Int!`) | The number of synchronized items. | ### DirectIntegrationExternalApiRequest object A request sent to the integrated service. | Name | Description | | ----------------- | ------------------ | | `url` (`String!`) | The requested URL. | ### DirectIntegrationExternalApiResponse object An error response received from the integrated service. | Name | Description | | ------------------------- | --------------------------------------- | | `message` (`String`) | The error message. | | `statusCode` (`Int!`) | The HTTP status code of the response. | | `reasonPhrase` (`String`) | The HTTP reason phrase of the response. | ### DirectIntegrationInstallation object An installation of a direct integration. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | | `id` (`ID!`) | The installation id. | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | When the installation was connected. | | `integratedByUserId` (`ID!`) | The id of the user who connected the installation. | | `name` (`String!`) | The installation name. | | `installationStatus` ([DirectIntegrationInstallationStatus!](https://developers.viio.io/#directintegrationinstallationstatus-union)) | The current status of the installation. | | `syncMetrics` ([DirectIntegrationSyncMetrics!](https://developers.viio.io/#directintegrationsyncmetrics-object)) | The installation's data synchronization metrics. | | `integration` ([DirectIntegration](https://developers.viio.io/#directintegration-object)) | The direct integration this installation belongs to. | | `integratedBy` ([User](https://developers.viio.io/gql-schema-reference/tenant#user-object)) | | ### DirectIntegrationInstallationsConnection object A connection to a list of items. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[DirectIntegrationInstallationsEdge!\]](https://developers.viio.io/#directintegrationinstallationsedge-object)) | A list of edges. | | `nodes` ([\[DirectIntegrationInstallation!\]](https://developers.viio.io/#directintegrationinstallation-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### DirectIntegrationInstallationsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([DirectIntegrationInstallation!](https://developers.viio.io/#directintegrationinstallation-object)) | The item at the end of the edge. | ### DirectIntegrationSyncMetrics object The installation's data synchronization metrics. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------- | | `lastRun` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | When the last synchronization ran. | | `lastSuccessfulRun` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | When the last successful synchronization ran. | | `fetching` (`Boolean!`) | Whether a synchronization is currently running. | | `entitySyncResults` ([\[DirectIntegrationEntitySyncResult!\]](https://developers.viio.io/#directintegrationentitysyncresult-object)) | The synchronization results per entity. | ### DisconnectedDirectIntegrationInstallationStatus object The installation is disconnected. | Name | Description | | ------------------------------------------------------------------------------------------------------ | --------------------------------------- | | `reason` (`String!`) | Why the installation was disconnected. | | `disconnectedAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | When the installation was disconnected. | ### FetchedInterval object Fields returned by the FetchedInterval object type. | Name | Description | | ------------------------------------------------------------------------------------ | ----------- | | `from` ([Date!](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `to` ([Date!](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | ### InstallationsConnection object A connection to a list of items. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[InstallationsEdge!\]](https://developers.viio.io/#installationsedge-object)) | A list of edges. | | `nodes` ([\[DirectIntegrationInstallation!\]](https://developers.viio.io/#directintegrationinstallation-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### InstallationsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([DirectIntegrationInstallation!](https://developers.viio.io/#directintegrationinstallation-object)) | The item at the end of the edge. | ### Integration object Fields returned by the Integration object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `integratedByUserId` (`ID!`) | | | `name` (`String!`) | | | `templateId` ([UUID!](https://developers.viio.io/gql-schema-reference/common#uuid-scalar)) | | | `interval` ([FetchedInterval](https://developers.viio.io/#fetchedinterval-object)) | | | `customSettings` ([\[IntegrationCustomSetting!\]](https://developers.viio.io/#integrationcustomsetting-object)) | | | `actionAvailability` ([\[IActionAvailabilityResult!\]!](https://developers.viio.io/#iactionavailabilityresult-interface)) | | | `actions` ([\[IntegrationAction!\]!](https://developers.viio.io/#integrationaction-object)) | | | `categories` (`[String!]!`) | | | `template` ([DirectIntegration](https://developers.viio.io/#directintegration-object)) | | | `integratedBy` ([User](https://developers.viio.io/gql-schema-reference/tenant#user-object)) | | ### IntegrationAction object Fields returned by the IntegrationAction object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------- | ----------- | | `actionName` (`String!`) | | | `availability` ([IActionAvailabilityResult!](https://developers.viio.io/#iactionavailabilityresult-interface)) | | | `metadata` ([ActionMetadata](https://developers.viio.io/#actionmetadata-union)) | | ### IntegrationCustomSetting object Fields returned by the IntegrationCustomSetting object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `single` ([IntegrationCustomSettingSingle](https://developers.viio.io/#integrationcustomsettingsingle-object)) | | | `multiple` ([IntegrationCustomSettingMultiple](https://developers.viio.io/#integrationcustomsettingmultiple-object)) | | ### IntegrationCustomSettingMultiple object Fields returned by the IntegrationCustomSettingMultiple object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------ | ----------- | | `inputKey` (`String!`) | | | `values` ([\[IntegrationCustomSettingValue!\]!](https://developers.viio.io/#integrationcustomsettingvalue-object)) | | ### IntegrationCustomSettingSingle object Fields returned by the IntegrationCustomSettingSingle object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `inputKey` (`String!`) | | | `value` ([IntegrationCustomSettingValue!](https://developers.viio.io/#integrationcustomsettingvalue-object)) | | ### IntegrationCustomSettingValue object Fields returned by the IntegrationCustomSettingValue object type. | Name | Description | | ------------------- | ----------- | | `key` (`String!`) | | | `value` (`String!`) | | ### LimitedPlansSelection object Fields returned by the LimitedPlansSelection object type. | Name | Description | | ------------------------------ | ----------- | | `sourcePlanIds` (`[String!]!`) | | | `multiple` (`Boolean!`) | | ### PopupAuthorizationOptions object Fields returned by the PopupAuthorizationOptions object type. | Name | Description | | ------------------------- | ----------- | | `required` (`Boolean!`) | | | `popupUrl` (`String!`) | | | `redirectUrl` (`String!`) | | ### PreselectedPlansSelection object Fields returned by the PreselectedPlansSelection object type. | Name | Description | | ------------------------------ | ----------- | | `sourcePlanIds` (`[String!]!`) | | | `additional` (`Boolean!`) | | ### RemoveLicenseActionMetadata object Fields returned by the RemoveLicenseActionMetadata object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `customInputs` ([\[CustomInputMetadata!\]!](https://developers.viio.io/#custominputmetadata-object)) | | ### SimplePlansSelection object Fields returned by the SimplePlansSelection object type. | Name | Description | | ----------------------- | ----------- | | `multiple` (`Boolean!`) | | ### UnderInvestigationDirectIntegrationInstallationStatus object The installation reported errors and is under investigation. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | `response` ([DirectIntegrationExternalApiResponse](https://developers.viio.io/#directintegrationexternalapiresponse-object)) | The error response that triggered the investigation. | | `request` ([DirectIntegrationExternalApiRequest](https://developers.viio.io/#directintegrationexternalapirequest-object)) | The request that caused the error response. | ## Input Types ### ComparableObjectIdOperationFilterInput input Input fields accepted by ComparableObjectIdOperationFilterInput. | Name | Description | | --------------- | ----------- | | `eq` (`ID`) | | | `neq` (`ID`) | | | `in` (`[ID!]`) | | | `nin` (`[ID!]`) | | | `gt` (`ID`) | | | `ngt` (`ID`) | | | `gte` (`ID`) | | | `ngte` (`ID`) | | | `lt` (`ID`) | | | `nlt` (`ID`) | | | `lte` (`ID`) | | | `nlte` (`ID`) | | ### DirectIntegrationInstallationFilterInput input An installation of a direct integration. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | | `and` ([\[DirectIntegrationInstallationFilterInput!\]](https://developers.viio.io/#directintegrationinstallationfilterinput-input)) | | | `or` ([\[DirectIntegrationInstallationFilterInput!\]](https://developers.viio.io/#directintegrationinstallationfilterinput-input)) | | | `id` ([ComparableObjectIdOperationFilterInput](https://developers.viio.io/#comparableobjectidoperationfilterinput-input)) | The installation id. | | `name` ([queryable\_StringOperationFilterInput](https://developers.viio.io/#queryable_stringoperationfilterinput-input)) | The installation name. | | `integration` ([DirectIntegrationWithoutInstallationsFilterType](https://developers.viio.io/#directintegrationwithoutinstallationsfiltertype-input)) | The direct integration this installation belongs to. | | `installationStatus` ([queryable\_DirectIntegrationInstallationStatusFilterInput](https://developers.viio.io/#queryable_directintegrationinstallationstatusfilterinput-input)) | The current status of the installation. | ### DirectIntegrationInstallationSortInput input An installation of a direct integration. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------ | | `createdAt` ([queryable\_SortEnumType](https://developers.viio.io/#queryable_sortenumtype-enum)) | When the installation was connected. | | `name` ([queryable\_SortEnumType](https://developers.viio.io/#queryable_sortenumtype-enum)) | The installation name. | ### DirectIntegrationWithoutInstallationsFilterType input Input fields accepted by DirectIntegrationWithoutInstallationsFilterType. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DirectIntegrationWithoutInstallationsFilterType!\]](https://developers.viio.io/#directintegrationwithoutinstallationsfiltertype-input)) | | | `or` ([\[DirectIntegrationWithoutInstallationsFilterType!\]](https://developers.viio.io/#directintegrationwithoutinstallationsfiltertype-input)) | | | `id` ([ComparableObjectIdOperationFilterInput](https://developers.viio.io/#comparableobjectidoperationfilterinput-input)) | | | `name` ([queryable\_StringOperationFilterInput](https://developers.viio.io/#queryable_stringoperationfilterinput-input)) | | | `vendorId` ([ComparableObjectIdOperationFilterInput](https://developers.viio.io/#comparableobjectidoperationfilterinput-input)) | | | `applicationId` ([ComparableObjectIdOperationFilterInput](https://developers.viio.io/#comparableobjectidoperationfilterinput-input)) | | | `categories` ([ListStringOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#liststringoperationfilterinput-input)) | | ### queryable\_DirectIntegrationInstallationStatusFilterInput input Input fields accepted by queryable\_DirectIntegrationInstallationStatusFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[queryable\_DirectIntegrationInstallationStatusFilterInput!\]](https://developers.viio.io/#queryable_directintegrationinstallationstatusfilterinput-input)) | | | `or` ([\[queryable\_DirectIntegrationInstallationStatusFilterInput!\]](https://developers.viio.io/#queryable_directintegrationinstallationstatusfilterinput-input)) | | | `type` ([queryable\_DirectIntegrationInstallationStatusTypeOperationFilterInput](https://developers.viio.io/#queryable_directintegrationinstallationstatustypeoperationfilterinput-input)) | | ### queryable\_DirectIntegrationInstallationStatusTypeOperationFilterInput input Input fields accepted by queryable\_DirectIntegrationInstallationStatusTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `eq` ([DirectIntegrationInstallationStatusType](https://developers.viio.io/#directintegrationinstallationstatustype-enum)) | | | `neq` ([DirectIntegrationInstallationStatusType](https://developers.viio.io/#directintegrationinstallationstatustype-enum)) | | | `in` ([\[DirectIntegrationInstallationStatusType!\]](https://developers.viio.io/#directintegrationinstallationstatustype-enum)) | | | `nin` ([\[DirectIntegrationInstallationStatusType!\]](https://developers.viio.io/#directintegrationinstallationstatustype-enum)) | | ### queryable\_StringOperationFilterInput input Input fields accepted by queryable\_StringOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[queryable\_StringOperationFilterInput!\]](https://developers.viio.io/#queryable_stringoperationfilterinput-input)) | | | `or` ([\[queryable\_StringOperationFilterInput!\]](https://developers.viio.io/#queryable_stringoperationfilterinput-input)) | | | `eq` (`String`) | | | `neq` (`String`) | | | `contains` (`String`) | | | `ncontains` (`String`) | | | `in` (`[String]`) | | | `nin` (`[String]`) | | | `startsWith` (`String`) | | | `nstartsWith` (`String`) | | | `endsWith` (`String`) | | | `nendsWith` (`String`) | | ## Interfaces ### BaseAuthorizationConfiguration interface Fields defined by the BaseAuthorizationConfiguration interface. | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `type` ([AuthorizationType!](https://developers.viio.io/#authorizationtype-enum)) | | ### IActionAvailabilityResult interface Fields defined by the IActionAvailabilityResult interface. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `actionName` (`String!`) | | | `isAvailable` (`Boolean!`) | | | `reason` ([ActionUnAvailabilityReason](https://developers.viio.io/#actionunavailabilityreason-enum)) | | | `description` (`String`) | | ## Unions ### ActionMetadata union Possible object types returned by the ActionMetadata union. Possible types: [AssignLicenseActionMetadata](https://developers.viio.io/#assignlicenseactionmetadata-object), [RemoveLicenseActionMetadata](https://developers.viio.io/#removelicenseactionmetadata-object) ### DirectIntegrationInstallationStatus union Possible object types returned by the DirectIntegrationInstallationStatus union. Possible types: [DisconnectedDirectIntegrationInstallationStatus](https://developers.viio.io/#disconnecteddirectintegrationinstallationstatus-object), [UnderInvestigationDirectIntegrationInstallationStatus](https://developers.viio.io/#underinvestigationdirectintegrationinstallationstatus-object), [ConnectedDirectIntegrationInstallationStatus](https://developers.viio.io/#connecteddirectintegrationinstallationstatus-object) ### PlansSelection union Possible object types returned by the PlansSelection union. Possible types: [SimplePlansSelection](https://developers.viio.io/#simpleplansselection-object), [LimitedPlansSelection](https://developers.viio.io/#limitedplansselection-object), [PreselectedPlansSelection](https://developers.viio.io/#preselectedplansselection-object) ## Enums ### ActionUnAvailabilityReason enum Accepted values for the ActionUnAvailabilityReason enum. | Value | Description | | ------------------------- | ----------- | | `NOT_IMPLEMENTED` | | | `NOT_SUPPORTED` | | | `CUSTOMER_SETTING_MISSED` | | | `TOKEN_PERMISSION_MISSED` | | ### AuthorizationType enum Accepted values for the AuthorizationType enum. | Value | Description | | ------------- | ----------- | | `NONE` | | | `CUSTOM` | | | `O_AUTH_PKCE` | | ### CustomerSettingFormType enum Accepted values for the CustomerSettingFormType enum. | Value | Description | | ----------- | ----------- | | `INPUT` | | | `DROP_DOWN` | | | `RICH_TEXT` | | ### CustomInputType enum Accepted values for the CustomInputType enum. | Value | Description | | -------------- | ----------- | | `TEXT_INPUT` | | | `DROP_DOWN` | | | `MULTI_SELECT` | | ### DirectIntegrationInstallationStatusType enum Accepted values for the DirectIntegrationInstallationStatusType enum. | Value | Description | | --------------------- | ----------- | | `CONNECTED` | | | `DISCONNECTED` | | | `UNDER_INVESTIGATION` | | ### DirectIntegrationStatus enum Accepted values for the DirectIntegrationStatus enum. | Value | Description | | --------- | ----------- | | `ACTIVE` | | | `BETA` | | | `ROADMAP` | | ### queryable\_SortEnumType enum Accepted values for the queryable\_SortEnumType enum. | Value | Description | | ------ | ----------- | | `ASC` | | | `DESC` | | # Licenses ## Queries ### contract query Retrieve contract data from the Viio GraphQL API. ```graphql contract(id: ID!): Contract ``` **Returns:** [Contract](https://developers.viio.io/#contract-object) **Arguments for `contract`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### contracts query Retrieve contracts data from the Viio GraphQL API. ```graphql contracts(first: Int, after: String, last: Int, before: String, where: ContractFilterInput, order: [ContractSortInput!]): ContractsConnection ``` **Returns:** [ContractsConnection](https://developers.viio.io/#contractsconnection-object) **Arguments for `contracts`** | Name | Description | | --------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([ContractFilterInput](https://developers.viio.io/#contractfilterinput-input)) | | | `order` ([\[ContractSortInput!\]](https://developers.viio.io/#contractsortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### licensePlans query Retrieve licensePlans data from the Viio GraphQL API. ```graphql licensePlans(first: Int, after: String, last: Int, before: String, where: LicensePlanFilterInput, order: [LicensePlanSortInput!]): LicensePlansConnection ``` **Returns:** [LicensePlansConnection](https://developers.viio.io/#licenseplansconnection-object) **Arguments for `licensePlans`** | Name | Description | | --------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([LicensePlanFilterInput](https://developers.viio.io/#licenseplanfilterinput-input)) | | | `order` ([\[LicensePlanSortInput!\]](https://developers.viio.io/#licenseplansortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### licensePlan query Retrieve licensePlan data from the Viio GraphQL API. ```graphql licensePlan(id: ID!): LicensePlan ``` **Returns:** [LicensePlan](https://developers.viio.io/#licenseplan-union) **Arguments for `licensePlan`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### aggregatedLicensePlans query Retrieve aggregatedLicensePlans data from the Viio GraphQL API. ```graphql aggregatedLicensePlans(groupBy: AggregatedLicensePlansGroupByInput!, first: Int, after: String, last: Int, before: String, where: LicensePlanFilterInput, order: [LicensePlanSortInput!]): AggregatedLicensePlansConnection ``` **Returns:** [AggregatedLicensePlansConnection](https://developers.viio.io/#aggregatedlicenseplansconnection-object) **Arguments for `aggregatedLicensePlans`** | Name | Description | | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `groupBy` ([AggregatedLicensePlansGroupByInput!](https://developers.viio.io/#aggregatedlicenseplansgroupbyinput-input)) | | | `where` ([LicensePlanFilterInput](https://developers.viio.io/#licenseplanfilterinput-input)) | | | `order` ([\[LicensePlanSortInput!\]](https://developers.viio.io/#licenseplansortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### licenses query Retrieve licenses data from the Viio GraphQL API. ```graphql licenses(first: Int, after: String, last: Int, before: String, where: LicenseFilterInput, order: [LicenseSortInput!]): LicensesConnection ``` **Returns:** [LicensesConnection](https://developers.viio.io/#licensesconnection-object) **Arguments for `licenses`** | Name | Description | | ------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([LicenseFilterInput](https://developers.viio.io/#licensefilterinput-input)) | | | `order` ([\[LicenseSortInput!\]](https://developers.viio.io/#licensesortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### licenseAnalytics query Retrieve licenseAnalytics data from the Viio GraphQL API. ```graphql licenseAnalytics(input: LicenseAnalyticsInput!, where: LicenseFilterInput, order: [LicenseAnalyticsBucketSortInput!]): LicenseAnalyticsResult! ``` **Returns:** [LicenseAnalyticsResult!](https://developers.viio.io/#licenseanalyticsresult-object) **Arguments for `licenseAnalytics`** | Name | Description | | ------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([LicenseAnalyticsInput!](https://developers.viio.io/#licenseanalyticsinput-input)) | | | `where` ([LicenseFilterInput](https://developers.viio.io/#licensefilterinput-input)) | | | `order` ([\[LicenseAnalyticsBucketSortInput!\]](https://developers.viio.io/#licenseanalyticsbucketsortinput-input)) | | ## Mutations ### createContract mutation Creates a contract. ```graphql createContract(input: CreateContractInput!): CreateContractPayload! ``` **Returns:** [CreateContractPayload!](https://developers.viio.io/#createcontractpayload-object) **Arguments for `createContract`** | Name | Description | | --------------------------------------------------------------------------------------- | ----------- | | `input` ([CreateContractInput!](https://developers.viio.io/#createcontractinput-input)) | | ### createManualLicensePlan mutation Creates a manually managed license plan for a vendor or product. Use this to track a plan that is not discovered automatically through an integration. ```graphql createManualLicensePlan(input: CreateManualLicensePlanInput!): CreateManualLicensePlanPayload! ``` **Returns:** [CreateManualLicensePlanPayload!](https://developers.viio.io/#createmanuallicenseplanpayload-object) **Arguments for `createManualLicensePlan`** | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([CreateManualLicensePlanInput!](https://developers.viio.io/#createmanuallicenseplaninput-input)) | | ### linkContracts mutation Links a contract to other contracts. ```graphql linkContracts(input: LinkContractsInput!): LinkContractsPayload! ``` **Returns:** [LinkContractsPayload!](https://developers.viio.io/#linkcontractspayload-object) **Arguments for `linkContracts`** | Name | Description | | ------------------------------------------------------------------------------------- | ----------- | | `input` ([LinkContractsInput!](https://developers.viio.io/#linkcontractsinput-input)) | | ### removeContracts mutation Removes the contracts that match the given filter. ```graphql removeContracts(where: ContractFilterInput): RemoveContractsPayload! ``` **Returns:** [RemoveContractsPayload!](https://developers.viio.io/#removecontractspayload-object) **Arguments for `removeContracts`** | Name | Description | | -------------------------------------------------------------------------------------- | ----------- | | `where` ([ContractFilterInput](https://developers.viio.io/#contractfilterinput-input)) | | ### unlinkContracts mutation Removes links between contracts. ```graphql unlinkContracts(input: UnlinkContractsInput!): UnlinkContractsPayload! ``` **Returns:** [UnlinkContractsPayload!](https://developers.viio.io/#unlinkcontractspayload-object) **Arguments for `unlinkContracts`** | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `input` ([UnlinkContractsInput!](https://developers.viio.io/#unlinkcontractsinput-input)) | | ### updateContractDatesAndTerms mutation Changes a contract's dates and renewal terms. ```graphql updateContractDatesAndTerms(input: UpdateContractDatesAndTermsInput!): UpdateContractDatesAndTermsPayload! ``` **Returns:** [UpdateContractDatesAndTermsPayload!](https://developers.viio.io/#updatecontractdatesandtermspayload-object) **Arguments for `updateContractDatesAndTerms`** | Name | Description | | ----------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractDatesAndTermsInput!](https://developers.viio.io/#updatecontractdatesandtermsinput-input)) | | ### updateContractName mutation Changes a contract's name. ```graphql updateContractName(input: UpdateContractNameInput!): UpdateContractNamePayload! ``` **Returns:** [UpdateContractNamePayload!](https://developers.viio.io/#updatecontractnamepayload-object) **Arguments for `updateContractName`** | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractNameInput!](https://developers.viio.io/#updatecontractnameinput-input)) | | ### updateContractNumber mutation Changes a contract's number. ```graphql updateContractNumber(input: UpdateContractNumberInput!): UpdateContractNumberPayload! ``` **Returns:** [UpdateContractNumberPayload!](https://developers.viio.io/#updatecontractnumberpayload-object) **Arguments for `updateContractNumber`** | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractNumberInput!](https://developers.viio.io/#updatecontractnumberinput-input)) | | ### updateContractPaymentTerms mutation Changes a contract's value and payment terms. ```graphql updateContractPaymentTerms(input: UpdateContractPaymentTermsInput!): UpdateContractPaymentTermsPayload! ``` **Returns:** [UpdateContractPaymentTermsPayload!](https://developers.viio.io/#updatecontractpaymenttermspayload-object) **Arguments for `updateContractPaymentTerms`** | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractPaymentTermsInput!](https://developers.viio.io/#updatecontractpaymenttermsinput-input)) | | ### updateContractReferenceTarget mutation Changes the vendor or product a contract applies to. ```graphql updateContractReferenceTarget(input: UpdateContractReferenceTargetInput!): UpdateContractReferenceTargetPayload! ``` **Returns:** [UpdateContractReferenceTargetPayload!](https://developers.viio.io/#updatecontractreferencetargetpayload-object) **Arguments for `updateContractReferenceTarget`** | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractReferenceTargetInput!](https://developers.viio.io/#updatecontractreferencetargetinput-input)) | | ### updateContractsOwner mutation Changes the owner of the contracts that match the given filter. ```graphql updateContractsOwner(input: UpdateContractsOwnerInput!, where: ContractFilterInput): UpdateContractsOwnerPayload! ``` **Returns:** [UpdateContractsOwnerPayload!](https://developers.viio.io/#updatecontractsownerpayload-object) **Arguments for `updateContractsOwner`** | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractsOwnerInput!](https://developers.viio.io/#updatecontractsownerinput-input)) | | | `where` ([ContractFilterInput](https://developers.viio.io/#contractfilterinput-input)) | | ### updateContractSupplier mutation Changes a contract's supplier. ```graphql updateContractSupplier(input: UpdateContractSupplierInput!): UpdateContractSupplierPayload! ``` **Returns:** [UpdateContractSupplierPayload!](https://developers.viio.io/#updatecontractsupplierpayload-object) **Arguments for `updateContractSupplier`** | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateContractSupplierInput!](https://developers.viio.io/#updatecontractsupplierinput-input)) | | ## Objects ### AggregatedLicensePlans object Fields returned by the AggregatedLicensePlans object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `criteria` ([AggregatedLicensePlansCriteria](https://developers.viio.io/#aggregatedlicenseplanscriteria-union)) | | | `upcomingRenewalContract` ([ContractDetails](https://developers.viio.io/#contractdetails-object)) | | | `usageStats` ([AggregatedUsageLicenseStats](https://developers.viio.io/#aggregatedusagelicensestats-object)) | | | `pricingStats` ([LicensePlanPricingStats](https://developers.viio.io/#licenseplanpricingstats-object)) | | | `plans` ([\[LicensePlan!\]!](https://developers.viio.io/#licenseplan-union)) | | ### AggregatedLicensePlansAttributeCriteria object Fields returned by the AggregatedLicensePlansAttributeCriteria object type. | Name | Description | | ------------------- | ----------- | | `value` (`String!`) | | ### AggregatedLicensePlansConnection object A connection to a list of items. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[AggregatedLicensePlansEdge!\]](https://developers.viio.io/#aggregatedlicenseplansedge-object)) | A list of edges. | | `nodes` ([\[AggregatedLicensePlans!\]](https://developers.viio.io/#aggregatedlicenseplans-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### AggregatedLicensePlansEdge object An edge in a connection. | Name | Description | | --------------------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([AggregatedLicensePlans!](https://developers.viio.io/#aggregatedlicenseplans-object)) | The item at the end of the edge. | ### AggregatedLicensePlansIntegrationCriteria object Fields returned by the AggregatedLicensePlansIntegrationCriteria object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `integration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | ### AggregatedLicensePlansProductCriteria object Fields returned by the AggregatedLicensePlansProductCriteria object type. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([ProductType!](https://developers.viio.io/gql-schema-reference/discovery#producttype-enum)) | | | `product` ([Product](https://developers.viio.io/gql-schema-reference/discovery#product-interface)) | | ### AggregatedLicensePlansVendorCriteria object Fields returned by the AggregatedLicensePlansVendorCriteria object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | ### AggregatedUsageLicenseStats object Fields returned by the AggregatedUsageLicenseStats object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------- | ----------- | | `inUse` ([InUseLicensePlanStats!](https://developers.viio.io/#inuselicenseplanstats-object)) | | | `unused` ([UnusedLicensePlanStats!](https://developers.viio.io/#unusedlicenseplanstats-object)) | | | `noData` ([NoDataLicensePlanStats!](https://developers.viio.io/#nodatalicenseplanstats-object)) | | | `downgradable` ([DowngradableLicensePlanStats!](https://developers.viio.io/#downgradablelicenseplanstats-object)) | | | `assigned` (`Int!`) | | | `unassigned` (`Int`) | | | `wasted` (`Int!`) | | | `total` (`Int`) | | | `effective` (`Int!`) | | ### BulkIntegrationLicenseDetails object Fields returned by the BulkIntegrationLicenseDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `costPerLicense` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | | `licensesCount` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `calculationMethod` ([CountCalculationMethod!](https://developers.viio.io/#countcalculationmethod-object)) | | | `licensePeriod` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### BulkPricingModel object Fields returned by the BulkPricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### Contract object A contract with a supplier, optionally scoped to a vendor or product. | Name | Description | | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | `id` (`ID!`) | The unique identifier of the contract. | | `reference` ([ContractReferenceTarget](https://developers.viio.io/#contractreferencetarget-union)) | The vendor or product the contract applies to. | | `ownerId` (`ID`) | The identifier of the employee who owns the contract. | | `name` (`String!`) | The name shown for the contract. | | `contractNumber` (`String`) | The reference number of the contract. | | `supplier` (`String`) | The supplier the contract is with. | | `startDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract starts. | | `endDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract ends. | | `status` ([ContractStatus](https://developers.viio.io/#contractstatus-enum)) | The current status of the contract. | | `termInMonths` (`Int`) | The duration of the contract in months. | | `autoRenewEnabled` (`Boolean!`) | Whether the contract renews automatically. | | `upcomingRenewalDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The next date the contract is due to renew. | | `noticePeriodInDays` (`Int`) | How many days of notice are required to cancel before the contract renews. | | `cancelByDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The last date to cancel before the contract renews. | | `originalTotalContractValue` ([ContractPrice](https://developers.viio.io/#contractprice-object)) | The total contract value in the currency it was entered in. | | `totalContractValue` ([ContractPrice](https://developers.viio.io/#contractprice-object)) | The total contract value converted to the workspace currency. | | `annualContractValue` ([ContractPrice](https://developers.viio.io/#contractprice-object)) | The contract value expressed as a yearly amount, in the workspace currency. | | `billingFrequency` ([BillingFrequency](https://developers.viio.io/#billingfrequency-enum)) | How often the contract is billed. | | `paymentTerms` (`String`) | The payment terms agreed with the supplier. | | `links` ([\[ContractLink!\]!](https://developers.viio.io/#contractlink-object)) | Links from this contract to other contracts. | | `linkedBy` ([\[ContractLink!\]!](https://developers.viio.io/#contractlink-object)) | Links from other contracts to this contract. | | `licensePlans` ([LicensePlansConnection](https://developers.viio.io/#licenseplansconnection-object)) | The license plans assigned to this contract. | | `owner` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### ContractDetails object Fields returned by the ContractDetails object type. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ---------------- | | `startDate` ([OriginValueOfDateOnly](https://developers.viio.io/#originvalueofdateonly-object)) | | | `billingFrequency` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | Number of months | | `renewal` ([ContractRenewal](https://developers.viio.io/#contractrenewal-object)) | | | `type` ([ContractType!](https://developers.viio.io/gql-schema-reference/discovery#contracttype-enum)) | | ### ContractLink object A link from one contract to another. | Name | Description | | ------------------------------------------------------------------------------- | --------------------------------- | | `type` ([ContractLinkType!](https://developers.viio.io/#contractlinktype-enum)) | How the two contracts are linked. | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The linked contract. | ### ContractNotFoundError object Indicates that the requested contract does not exist. | Name | Description | | --------------------- | ---------------------------- | | `message` (`String!`) | An explanation of the error. | ### ContractPrice object A monetary amount in a given currency. | Name | Description | | ---------------------- | --------------------------------------------- | | `currency` (`String!`) | The three-letter ISO currency code, e.g. USD. | | `amount` (`Float!`) | The amount in the given currency. | ### ContractRenewal object Fields returned by the ContractRenewal object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | | `upcomingDate` ([OriginValueOfDateOnly](https://developers.viio.io/#originvalueofdateonly-object)) | Upcoming renewal date | | `terminationPeriod` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | Number of days before the contract renewal date, after which contract renewal cannot be canceled | ### ContractsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ContractsEdge!\]](https://developers.viio.io/#contractsedge-object)) | A list of edges. | | `nodes` ([\[Contract!\]](https://developers.viio.io/#contract-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ContractsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Contract!](https://developers.viio.io/#contract-object)) | The item at the end of the edge. | ### CostCenterBucketKey object Fields returned by the CostCenterBucketKey object type. | Name | Description | | ----------------------- | ----------- | | `costCenter` (`String`) | | ### CountCalculationMethod object Count calculation method | Name | Description | | --------------------------------------------------------------------------------------- | ---------------- | | `type` ([CountCalculationType!](https://developers.viio.io/#countcalculationtype-enum)) | Calculation type | | `amount` (`Int`) | Manual amount | ### CountryBucketKey object Fields returned by the CountryBucketKey object type. | Name | Description | | -------------------- | ----------- | | `country` (`String`) | | ### CreateContractPayload object The result of creating a contract. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The newly created contract. Null when creation failed. | | `errors` ([\[CreateContractError!\]](https://developers.viio.io/#createcontracterror-union)) | The reasons the contract was not created. Null when creation succeeded. | ### CreateManualLicensePlanPayload object The result of creating a manual license plan. Exactly one outcome applies: on success `licensePlan` is set and `errors` is empty; on failure `licensePlan` is null and `errors` explains why. | Name | Description | | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | | `licensePlan` ([LicensePlan](https://developers.viio.io/#licenseplan-union)) | The newly created plan. Null when creation failed. | | `errors` ([\[CreateManualLicensePlanError!\]](https://developers.viio.io/#createmanuallicenseplanerror-union)) | The reasons the plan was not created. Null when creation succeeded. | ### DivisionBucketKey object Fields returned by the DivisionBucketKey object type. | Name | Description | | --------------------- | ----------- | | `division` (`String`) | | ### DowngradableLicensePlanStats object Fields returned by the DowngradableLicensePlanStats object type. | Name | Description | | ---------------- | ----------- | | `total` (`Int!`) | | ### DowngradableLicenseState object Fields returned by the DowngradableLicenseState object type. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `activity` ([LicenseActivity!](https://developers.viio.io/#licenseactivity-enum)) | | | `reason` ([LicenseDowngradeReason!](https://developers.viio.io/#licensedowngradereason-union)) | | | `target` ([LicenseDowngradeTarget!](https://developers.viio.io/#licensedowngradetarget-object)) | | ### EmployeeStatusBucketKey object Fields returned by the EmployeeStatusBucketKey object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ----------- | | `employeeStatus` ([EmployeeStatus](https://developers.viio.io/gql-schema-reference/people-organization#employeestatus-enum)) | | ### EntitledLicenses object How many licenses a plan includes. | Name | Description | | ------------------- | ------------------------------------------------------------------------------------------ | | `api` (`Int`) | The license count reported by the integration, when available. | | `manual` (`Int`) | The license count entered manually, when provided. | | `effective` (`Int`) | The count to rely on: the manual value when set, otherwise the value from the integration. | ### ExternalKey object Fields returned by the ExternalKey object type. | Name | Description | | ---------------------------- | ----------- | | `integrationKey` (`String!`) | | | `tenant` (`String`) | | ### ExternalUser object Fields returned by the ExternalUser object type. | Name | Description | | ---------------------- | ----------- | | `sourceId` (`String!`) | | | `name` (`String`) | | | `email` (`String`) | | | `roles` (`[String!]!`) | | ### FlatFeeIntegrationLicenseDetails object Fields returned by the FlatFeeIntegrationLicenseDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `flatFee` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | | `useLicensesCount` (`Boolean!`) | | | `licensesCount` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `licensePeriod` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### FlatFeePricingModel object Fields returned by the FlatFeePricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### FreeIntegrationLicenseDetails object Fields returned by the FreeIntegrationLicenseDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `useLicensesCount` (`Boolean!`) | | | `licensesCount` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### FreePricingModel object Fields returned by the FreePricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### IntegratedLicensePlan object Fields returned by the IntegratedLicensePlan object type. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | `id` (`ID!`) | | | `origin` ([LicensePlanOrigin!](https://developers.viio.io/#licenseplanorigin-enum)) | | | `externalId` (`String`) | | | `directIntegrationInstallationId` (`ID`) | | | `externalKey` ([ExternalKey](https://developers.viio.io/#externalkey-object)) | | | `name` (`String!`) | | | `pricing` ([PricingModel!](https://developers.viio.io/#pricingmodel-union)) | | | `pricingComponents` ([\[LicensePlanPricingComponent!\]](https://developers.viio.io/#licenseplanpricingcomponent-union)) | The plan's price list — the charges that make up its cost. | | `contractDetails` ([ContractDetails](https://developers.viio.io/#contractdetails-object)) | | | `entitledLicenses` ([EntitledLicenses](https://developers.viio.io/#entitledlicenses-object)) | | | `usageStats` ([LicensePlanUsageStats](https://developers.viio.io/#licenseplanusagestats-object)) | | | `pricingStats` ([LicensePlanPricingStats](https://developers.viio.io/#licenseplanpricingstats-object)) | | | `originalPricingStats` ([LicensePlanPricingStats](https://developers.viio.io/#licenseplanpricingstats-object)) | | | `attributes` ([\[LicensePlanAttribute!\]](https://developers.viio.io/#licenseplanattribute-object)) | | | `reference` ([LicenseReferenceTarget!](https://developers.viio.io/#licensereferencetarget-union)) | | | `directIntegrationInstallation` ([DirectIntegrationInstallation](https://developers.viio.io/gql-schema-reference/integrations#directintegrationinstallation-object)) | | ### IntegratedLicensePlanExistsError object The plan was not created because an integration already manages a plan for the requested vendor or product. | Name | Description | | --------------------- | ---------------------------- | | `message` (`String!`) | An explanation of the error. | ### InUseLicensePlanStats object Fields returned by the InUseLicensePlanStats object type. | Name | Description | | ------------------------------- | ----------- | | `hasRecentUsage` (`Int!`) | | | `ssoLogin` (`Int!`) | | | `excludedFromAnalysis` (`Int!`) | | | `total` (`Int!`) | | ### InUseLicenseState object Fields returned by the InUseLicenseState object type. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `activity` ([LicenseActivity!](https://developers.viio.io/#licenseactivity-enum)) | | | `reason` ([InUseLicenseStateReason!](https://developers.viio.io/#inuselicensestatereason-enum)) | | ### InvalidContractDateError object Indicates that the contract's end date is before its start date. | Name | Description | | --------------------- | ---------------------------- | | `message` (`String!`) | An explanation of the error. | ### License object Fields returned by the License object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `state` ([LicenseState!](https://developers.viio.io/#licensestate-union)) | | | `holder` ([LicenseHolder!](https://developers.viio.io/#licenseholder-object)) | | | `usage` ([LicenseUsage!](https://developers.viio.io/#licenseusage-object)) | | | `annualPrice` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `originalAnnualPrice` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `potentialSaving` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `originalPotentialSaving` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `reference` ([LicenseReferenceTarget!](https://developers.viio.io/#licensereferencetarget-union)) | | | `plan` ([LicensePlan!](https://developers.viio.io/#licenseplan-union)) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | | `integrationActions` ([\[IntegrationAction!\]!](https://developers.viio.io/gql-schema-reference/integrations#integrationaction-object)) | | | `userUsage` ([UserUsage](https://developers.viio.io/gql-schema-reference/discovery#userusage-object)) | | ### LicenseAnalyticsBucket object Fields returned by the LicenseAnalyticsBucket object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `key` ([LicenseAnalyticsBucketKey!](https://developers.viio.io/#licenseanalyticsbucketkey-union)) | | | `metrics` ([LicenseAnalyticsMetrics!](https://developers.viio.io/#licenseanalyticsmetrics-object)) | | ### LicenseAnalyticsMetrics object Fields returned by the LicenseAnalyticsMetrics object type. | Name | Description | | ----------------------------------------------------------------------------------- | ----------- | | `licenseCount` (`Int!`) | | | `inUseCount` (`Int!`) | | | `unusedCount` (`Int!`) | | | `noDataCount` (`Int!`) | | | `downgradableCount` (`Int!`) | | | `utilizationPercentage` (`Float`) | | | `totalAnnualCost` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `potentialSaving` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `potentialSavingPercentage` (`Float`) | | ### LicenseAnalyticsResult object Fields returned by the LicenseAnalyticsResult object type. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `buckets` ([\[LicenseAnalyticsBucket!\]!](https://developers.viio.io/#licenseanalyticsbucket-object)) | | | `totals` ([LicenseAnalyticsMetrics!](https://developers.viio.io/#licenseanalyticsmetrics-object)) | | ### LicenseDetailedSource object Fields returned by the LicenseDetailedSource object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ----------- | | `dataSource` ([DiscoverySourceName!](https://developers.viio.io/gql-schema-reference/discovery#discoverysourcename-enum)) | | | `integrationId` (`ID`) | | | `firstUsed` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `lastUsed` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `isPrimary` (`Boolean!`) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | ### LicenseDowngradeExclusiveUsageReason object Fields returned by the LicenseDowngradeExclusiveUsageReason object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `productIds` (`[ID!]!`) | | | `products` ([ProductsConnection](https://developers.viio.io/gql-schema-reference/discovery#productsconnection-object)) | | ### LicenseDowngradeNoUsageReason object Fields returned by the LicenseDowngradeNoUsageReason object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `productIds` (`[ID!]!`) | | | `products` ([ProductsConnection](https://developers.viio.io/gql-schema-reference/discovery#productsconnection-object)) | | ### LicenseDowngradeTarget object Fields returned by the LicenseDowngradeTarget object type. | Name | Description | | ----------------------------------------------------------------------------------- | ----------- | | `planTemplateId` (`ID!`) | | | `planId` (`ID`) | | | `annualUnitPrice` ([LicensePrice](https://developers.viio.io/#licenseprice-object)) | | | `planTemplate` ([PlanTemplate!](https://developers.viio.io/#plantemplate-object)) | | | `plan` ([LicensePlan](https://developers.viio.io/#licenseplan-union)) | | ### LicenseHolder object Fields returned by the LicenseHolder object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `name` (`String`) | | | `email` (`String`) | | | `external` ([ExternalUser!](https://developers.viio.io/#externaluser-object)) | | | `employeeId` (`ID`) | | | `employee` ([Employee](https://developers.viio.io/gql-schema-reference/people-organization#employee-object)) | | ### LicensePlanAttribute object Fields returned by the LicensePlanAttribute object type. | Name | Description | | ------------------- | ----------- | | `key` (`String!`) | | | `value` (`String!`) | | ### LicensePlanFixedFeePricingComponent object A fixed recurring charge billed at a set frequency, regardless of how many licenses are used. | Name | Description | | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | | `billingFrequency` ([BillingFrequency!](https://developers.viio.io/#billingfrequency-enum)) | How often the fixed fee is charged, for example monthly or yearly. | | `price` ([LicensePrice!](https://developers.viio.io/#licenseprice-object)) | The amount charged each billing period. | ### LicensePlanPotentialSaving object Fields returned by the LicensePlanPotentialSaving object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `amount` (`Float!`) | | | `percentage` (`Float!`) | | | `rate` ([LicensePlanPotentialSavingRate!](https://developers.viio.io/#licenseplanpotentialsavingrate-enum)) | | ### LicensePlanPricingStats object Fields returned by the LicensePlanPricingStats object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` (`String!`) | | | `annualUnitPrice` (`Float`) | | | `annualCost` (`Float!`) | | | `potentialSaving` ([LicensePlanPotentialSaving!](https://developers.viio.io/#licenseplanpotentialsaving-object)) | | ### LicensePlansConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[LicensePlansEdge!\]](https://developers.viio.io/#licenseplansedge-object)) | A list of edges. | | `nodes` ([\[LicensePlan!\]](https://developers.viio.io/#licenseplan-union)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### LicensePlansEdge object An edge in a connection. | Name | Description | | ---------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([LicensePlan!](https://developers.viio.io/#licenseplan-union)) | The item at the end of the edge. | ### LicensePlanUsageStats object Fields returned by the LicensePlanUsageStats object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------- | ----------- | | `inUse` ([InUseLicensePlanStats!](https://developers.viio.io/#inuselicenseplanstats-object)) | | | `unused` ([UnusedLicensePlanStats!](https://developers.viio.io/#unusedlicenseplanstats-object)) | | | `noData` ([NoDataLicensePlanStats!](https://developers.viio.io/#nodatalicenseplanstats-object)) | | | `downgradable` ([DowngradableLicensePlanStats!](https://developers.viio.io/#downgradablelicenseplanstats-object)) | | | `assigned` (`Int!`) | | | `unassigned` (`Int`) | | | `wasted` (`Int!`) | | | `total` (`Int`) | | | `effective` (`Int!`) | | | `usageAvailability` ([UsageAvailability!](https://developers.viio.io/#usageavailability-object)) | | ### LicensePrice object Fields returned by the LicensePrice object type. | Name | Description | | ---------------------- | ----------- | | `currency` (`String!`) | | | `amount` (`Float!`) | | ### LicensesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[LicensesEdge!\]](https://developers.viio.io/#licensesedge-object)) | A list of edges. | | `nodes` ([\[License!\]](https://developers.viio.io/#license-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### LicensesEdge object An edge in a connection. | Name | Description | | --------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([License!](https://developers.viio.io/#license-object)) | The item at the end of the edge. | ### LicenseUsage object Fields returned by the LicenseUsage object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `detailedSources` ([\[LicenseDetailedSource!\]!](https://developers.viio.io/#licensedetailedsource-object)) | | | `lastUsed` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | ### LinkContractsPayload object The result of linking a contract to other contracts. | Name | Description | | ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | `contracts` ([\[Contract!\]](https://developers.viio.io/#contract-object)) | The contracts affected by the operation: the contract the links were added to, followed by the contracts it was linked to. Null when the operation failed. | | `errors` ([\[LinkContractsError!\]](https://developers.viio.io/#linkcontractserror-union)) | The reasons the contracts were not linked. Null when the operation succeeded. | ### ManualLicensePlan object Fields returned by the ManualLicensePlan object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | `id` (`ID!`) | | | `origin` ([LicensePlanOrigin!](https://developers.viio.io/#licenseplanorigin-enum)) | | | `name` (`String!`) | | | `pricing` ([PricingModel!](https://developers.viio.io/#pricingmodel-union)) | | | `pricingComponents` ([\[LicensePlanPricingComponent!\]](https://developers.viio.io/#licenseplanpricingcomponent-union)) | The plan's price list — the charges that make up its cost. | | `contractDetails` ([ContractDetails](https://developers.viio.io/#contractdetails-object)) | | | `entitledLicenses` ([EntitledLicenses](https://developers.viio.io/#entitledlicenses-object)) | | | `pricingStats` ([LicensePlanPricingStats](https://developers.viio.io/#licenseplanpricingstats-object)) | | | `originalPricingStats` ([LicensePlanPricingStats](https://developers.viio.io/#licenseplanpricingstats-object)) | | | `reference` ([LicenseReferenceTarget!](https://developers.viio.io/#licensereferencetarget-union)) | | ### NoDataLicensePlanStats object Fields returned by the NoDataLicensePlanStats object type. | Name | Description | | -------------------------- | ----------- | | `newEmployee` (`Int!`) | | | `noUsageDetected` (`Int!`) | | | `total` (`Int!`) | | ### NoDataLicenseState object Fields returned by the NoDataLicenseState object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `activity` ([LicenseActivity!](https://developers.viio.io/#licenseactivity-enum)) | | | `reason` ([NoDataLicenseStateReason!](https://developers.viio.io/#nodatalicensestatereason-enum)) | | ### OriginValueOfDateOnly object Fields returned by the OriginValueOfDateOnly object type. | Name | Description | | ------------------------------------------------------------------------------------- | ----------- | | `origin` ([DataOrigin!](https://developers.viio.io/#dataorigin-enum)) | | | `value` ([Date!](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | ### OriginValueOfDouble object Fields returned by the OriginValueOfDouble object type. | Name | Description | | --------------------------------------------------------------------- | ----------- | | `origin` ([DataOrigin!](https://developers.viio.io/#dataorigin-enum)) | | | `value` (`Float!`) | | ### OriginValueOfInt32 object Fields returned by the OriginValueOfInt32 object type. | Name | Description | | --------------------------------------------------------------------- | ----------- | | `origin` ([DataOrigin!](https://developers.viio.io/#dataorigin-enum)) | | | `value` (`Int!`) | | ### OriginValueOfLicenseDetailsType object Fields returned by the OriginValueOfLicenseDetailsType object type. | Name | Description | | -------------------------------------------------------------------------------- | ----------- | | `origin` ([DataOrigin!](https://developers.viio.io/#dataorigin-enum)) | | | `value` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### OriginValueOfString object Fields returned by the OriginValueOfString object type. | Name | Description | | --------------------------------------------------------------------- | ----------- | | `origin` ([DataOrigin!](https://developers.viio.io/#dataorigin-enum)) | | | `value` (`String`) | | ### PerLicenseIntegrationLicenseDetails object Fields returned by the PerLicenseIntegrationLicenseDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `costPerLicense` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | | `calculationMethod` ([CountCalculationMethod!](https://developers.viio.io/#countcalculationmethod-object)) | | | `apiProvidedLicensesCount` (`Int`) | | | `licensePeriod` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### PerLicensePricingModel object Fields returned by the PerLicensePricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### Plan object Fields returned by the Plan object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `customerIntegrationId` (`ID!`) | | | `vendorId` (`ID`) | | | `applicationId` (`ID`) | | | `name` (`String!`) | | | `type` ([PlanType!](https://developers.viio.io/#plantype-enum)) | | | `contractDetails` ([ContractDetails](https://developers.viio.io/#contractdetails-object)) | | | `sourceId` (`String!`) | | | `licenseDetails` ([IntegrationLicenseDetails](https://developers.viio.io/#integrationlicensedetails-union)) | | | `rawLicenseDetails` ([RawIntegrationLicenseDetails!](https://developers.viio.io/#rawintegrationlicensedetails-object)) | | | `application` ([Application](https://developers.viio.io/gql-schema-reference/discovery#application-object)) | | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | | `customerIntegration` ([Integration](https://developers.viio.io/gql-schema-reference/integrations#integration-object)) | | ### PlanBucketKey object Fields returned by the PlanBucketKey object type. | Name | Description | | ---------------------------------------------------------------------- | ----------- | | `planId` (`ID!`) | | | `plan` ([LicensePlan!](https://developers.viio.io/#licenseplan-union)) | | ### PlanTemplate object Fields returned by the PlanTemplate object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `externalPlanName` (`String!`) | | | `displayPlanName` (`String!`) | | | `pricingModel` ([PricingModel](https://developers.viio.io/#pricingmodel-union)) | | | `licensePlans` ([LicensePlansConnection](https://developers.viio.io/#licenseplansconnection-object)) | | ### PricingModelBucketKey object Fields returned by the PricingModelBucketKey object type. | Name | Description | | -------------------------------------------------------------------------------------- | ----------- | | `pricingModel` ([PricingModelType](https://developers.viio.io/#pricingmodeltype-enum)) | | ### ProductBucketKey object Fields returned by the ProductBucketKey object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `productId` (`ID`) | | | `product` ([Product](https://developers.viio.io/gql-schema-reference/discovery#product-interface)) | | ### ProductNotFoundError object Indicates that the referenced product does not exist. | Name | Description | | --------------------- | ---------------------------- | | `message` (`String!`) | An explanation of the error. | ### ProductReference object A reference to a product. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ------------------------------ | | `productId` (`ID!`) | The identifier of the product. | | `productType` ([ProductType!](https://developers.viio.io/gql-schema-reference/discovery#producttype-enum)) | The type of the product. | | `product` ([Product](https://developers.viio.io/gql-schema-reference/discovery#product-interface)) | | ### RawIntegrationLicenseDetails object Fields returned by the RawIntegrationLicenseDetails object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | | `useLicensesCount` (`Boolean`) | | | `licensesCount` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `currency` ([OriginValueOfString](https://developers.viio.io/#originvalueofstring-object)) | | | `overallCost` ([OriginValueOfDouble](https://developers.viio.io/#originvalueofdouble-object)) | | | `licensePeriod` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `costPerLicense` ([OriginValueOfDouble](https://developers.viio.io/#originvalueofdouble-object)) | | | `calculationMethod` ([CountCalculationMethod](https://developers.viio.io/#countcalculationmethod-object)) | | | `apiProvidedLicensesCount` (`Int`) | | | `steps` ([\[RawIntegrationLicenseDetailsStep!\]](https://developers.viio.io/#rawintegrationlicensedetailsstep-object)) | | ### RawIntegrationLicenseDetailsStep object Fields returned by the RawIntegrationLicenseDetailsStep object type. | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `minCount` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `cost` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | ### RemoveContractsPayload object The result of removing contracts. | Name | Description | | ----------------------- | ------------------------------------------ | | `removedCount` (`Int!`) | The number of contracts that were removed. | ### StairStepIntegrationLicenseDetails object Fields returned by the StairStepIntegrationLicenseDetails object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `calculationMethod` ([CountCalculationMethod!](https://developers.viio.io/#countcalculationmethod-object)) | | | `apiProvidedLicensesCount` (`Int`) | | | `licensePeriod` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `steps` ([\[StairStepIntegrationLicenseDetailsStep!\]!](https://developers.viio.io/#stairstepintegrationlicensedetailsstep-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### StairStepIntegrationLicenseDetailsStep object Fields returned by the StairStepIntegrationLicenseDetailsStep object type. | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `minCount` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `cost` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | ### StairStepPricingModel object Fields returned by the StairStepPricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### StateBucketKey object Fields returned by the StateBucketKey object type. | Name | Description | | ------------------------------------------------------------------------------ | ----------- | | `state` ([LicenseActivity!](https://developers.viio.io/#licenseactivity-enum)) | | ### StateReasonBucketKey object Fields returned by the StateReasonBucketKey object type. | Name | Description | | ------------------------ | ----------- | | `stateReason` (`String`) | | ### UnknownIntegrationLicenseDetails object Fields returned by the UnknownIntegrationLicenseDetails object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `rawCurrency` ([OriginValueOfString](https://developers.viio.io/#originvalueofstring-object)) | | | `rawCostPerLicense` ([OriginValueOfDouble](https://developers.viio.io/#originvalueofdouble-object)) | | | `rawOverallCost` ([OriginValueOfDouble](https://developers.viio.io/#originvalueofdouble-object)) | | | `rawUseLicensesCount` (`Boolean`) | | | `rawLicensesCount` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `rawCalculationMethod` ([CountCalculationMethod](https://developers.viio.io/#countcalculationmethod-object)) | | | `rawApiProvidedLicensesCount` (`Int`) | | | `rawLicensePeriod` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `rawSteps` ([\[UnknownLicenseDetailsStep!\]](https://developers.viio.io/#unknownlicensedetailsstep-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### UnknownLicenseDetailsStep object Fields returned by the UnknownLicenseDetailsStep object type. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `minCount` ([OriginValueOfInt32](https://developers.viio.io/#originvalueofint32-object)) | | | `cost` ([OriginValueOfDouble](https://developers.viio.io/#originvalueofdouble-object)) | | ### UnknownPricingModel object Fields returned by the UnknownPricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ### UnlinkContractsPayload object The result of removing links between contracts. | Name | Description | | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `contracts` ([\[Contract!\]](https://developers.viio.io/#contract-object)) | The contracts affected by the operation: the contract the links were removed from, followed by the contracts that were unlinked. Null when the operation failed. | | `errors` ([\[UnlinkContractsError!\]](https://developers.viio.io/#unlinkcontractserror-union)) | The reasons the links were not removed. Null when the operation succeeded. | ### UnusedLicensePlanStats object Fields returned by the UnusedLicensePlanStats object type. | Name | Description | | --------------------------- | ----------- | | `noRecentUsage` (`Int!`) | | | `noSsoLogin` (`Int!`) | | | `leftOrganization` (`Int!`) | | | `total` (`Int!`) | | ### UnusedLicenseState object Fields returned by the UnusedLicenseState object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `activity` ([LicenseActivity!](https://developers.viio.io/#licenseactivity-enum)) | | | `reason` ([UnusedLicenseStateReason!](https://developers.viio.io/#unusedlicensestatereason-enum)) | | ### UpdateContractDatesAndTermsPayload object The result of changing a contract's dates and renewal terms. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractDatesAndTermsError!\]](https://developers.viio.io/#updatecontractdatesandtermserror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UpdateContractNamePayload object The result of renaming a contract. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractNameError!\]](https://developers.viio.io/#updatecontractnameerror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UpdateContractNumberPayload object The result of changing a contract's number. | Name | Description | | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractNumberError!\]](https://developers.viio.io/#updatecontractnumbererror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UpdateContractPaymentTermsPayload object The result of changing a contract's value and payment terms. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractPaymentTermsError!\]](https://developers.viio.io/#updatecontractpaymenttermserror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UpdateContractReferenceTargetPayload object The result of changing the vendor or product a contract applies to. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractReferenceTargetError!\]](https://developers.viio.io/#updatecontractreferencetargeterror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UpdateContractsOwnerPayload object The result of changing the owner of contracts. | Name | Description | | ----------------------- | ------------------------------------------ | | `updatedCount` (`Int!`) | The number of contracts that were updated. | ### UpdateContractSupplierPayload object The result of changing a contract's supplier. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------- | | `contract` ([Contract](https://developers.viio.io/#contract-object)) | The updated contract. Null when the update failed. | | `errors` ([\[UpdateContractSupplierError!\]](https://developers.viio.io/#updatecontractsuppliererror-union)) | The reasons the contract was not updated. Null when the update succeeded. | ### UsageAvailability object Fields returned by the UsageAvailability object type. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `status` ([UsageAvailabilityStatus!](https://developers.viio.io/#usageavailabilitystatus-enum)) | | ### VendorBucketKey object Fields returned by the VendorBucketKey object type. | Name | Description | | ------------------------ | ----------- | | `vendorName` (`String!`) | | ### VendorNotFoundError object Indicates that the referenced vendor does not exist. | Name | Description | | --------------------- | ---------------------------- | | `message` (`String!`) | An explanation of the error. | ### VendorReference object A reference to a vendor. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------------------------- | | `vendorId` (`ID!`) | The identifier of the vendor. | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | ### VolumeIntegrationLicenseDetails object Fields returned by the VolumeIntegrationLicenseDetails object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `calculationMethod` ([CountCalculationMethod!](https://developers.viio.io/#countcalculationmethod-object)) | | | `apiProvidedLicensesCount` (`Int`) | | | `licensePeriod` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `steps` ([\[VolumeIntegrationLicenseDetailsStep!\]!](https://developers.viio.io/#volumeintegrationlicensedetailsstep-object)) | | | `type` ([OriginValueOfLicenseDetailsType!](https://developers.viio.io/#originvalueoflicensedetailstype-object)) | | | `label` ([OriginValueOfString!](https://developers.viio.io/#originvalueofstring-object)) | | | `description` (`String`) | | ### VolumeIntegrationLicenseDetailsStep object Fields returned by the VolumeIntegrationLicenseDetailsStep object type. | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `minCount` ([OriginValueOfInt32!](https://developers.viio.io/#originvalueofint32-object)) | | | `cost` ([OriginValueOfDouble!](https://developers.viio.io/#originvalueofdouble-object)) | | ### VolumePricingModel object Fields returned by the VolumePricingModel object type. | Name | Description | | ------------------------------------------------------------------------------- | ----------- | | `type` ([PricingModelType!](https://developers.viio.io/#pricingmodeltype-enum)) | | ## Input Types ### AggregatedLicensePlansGroupByInput input Input fields accepted by AggregatedLicensePlansGroupByInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `product` (`Boolean`) | | | `reference` (`Boolean`) | | | `integration` (`Boolean`) | | | `attribute` ([LicensePlanGroupingAttribute](https://developers.viio.io/#licenseplangroupingattribute-enum)) | | ### ContractDetailsFilterInput input Input fields accepted by ContractDetailsFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[ContractDetailsFilterInput!\]](https://developers.viio.io/#contractdetailsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[ContractDetailsFilterInput!\]](https://developers.viio.io/#contractdetailsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `startDate` ([OriginValueOfDateOnlyFilterInput](https://developers.viio.io/#originvalueofdateonlyfilterinput-input)) | | | `renewal` ([ContractRenewalFilterInput](https://developers.viio.io/#contractrenewalfilterinput-input)) | | | `type` ([ContractTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#contracttypeoperationfilterinput-input)) | | ### ContractDetailsSortInput input Input fields accepted by ContractDetailsSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `startDate` ([OriginValueOfDateOnlySortInput](https://developers.viio.io/#originvalueofdateonlysortinput-input)) | | | `renewal` ([ContractRenewalSortInput](https://developers.viio.io/#contractrenewalsortinput-input)) | | ### ContractFilterInput input Input fields accepted by ContractFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[ContractFilterInput!\]](https://developers.viio.io/#contractfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[ContractFilterInput!\]](https://developers.viio.io/#contractfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `reference` ([LicenseReferenceTargetFilterInput](https://developers.viio.io/#licensereferencetargetfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `contractNumber` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `supplier` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `startDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `endDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `status` ([NullableOfContractStatusOperationFilterInput](https://developers.viio.io/#nullableofcontractstatusoperationfilterinput-input)) | | | `termInMonths` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `autoRenewEnabled` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `upcomingRenewalDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `cancelByDate` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `billingFrequency` ([NullableOfBillingFrequencyOperationFilterInput](https://developers.viio.io/#nullableofbillingfrequencyoperationfilterinput-input)) | | ### ContractLinkInput input A link from one contract to another. | Name | Description | | ------------------------------------------------------------------------------- | ------------------------------------------ | | `type` ([ContractLinkType!](https://developers.viio.io/#contractlinktype-enum)) | How the two contracts are linked. | | `contractId` (`ID!`) | The identifier of the contract to link to. | ### ContractPriceInput input A monetary amount in a given currency. | Name | Description | | ---------------------- | --------------------------------------------- | | `currency` (`String!`) | The three-letter ISO currency code, e.g. USD. | | `amount` (`Float!`) | The amount in the given currency. | ### ContractRenewalFilterInput input Input fields accepted by ContractRenewalFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[ContractRenewalFilterInput!\]](https://developers.viio.io/#contractrenewalfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[ContractRenewalFilterInput!\]](https://developers.viio.io/#contractrenewalfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `upcomingDate` ([OriginValueOfDateOnlyFilterInput](https://developers.viio.io/#originvalueofdateonlyfilterinput-input)) | | | `isNullish` (`Boolean`) | Matches when the field is null or missing (not present in the database). | ### ContractRenewalSortInput input Input fields accepted by ContractRenewalSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------- | ----------- | | `upcomingDate` ([OriginValueOfDateOnlySortInput](https://developers.viio.io/#originvalueofdateonlysortinput-input)) | | | `terminationPeriod` ([OriginValueOfInt32SortInput](https://developers.viio.io/#originvalueofint32sortinput-input)) | | | `originalUpcomingDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ContractSortInput input Input fields accepted by ContractSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `termInMonths` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `startDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `endDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `upcomingRenewalDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### CreateContractInput input The details needed to create a contract. | Name | Description | | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | | `reference` ([ReferenceTargetInput](https://developers.viio.io/#referencetargetinput-input)) | The vendor or product the contract applies to. Leave empty for a contract without a scope. | | `ownerId` (`ID`) | The identifier of the employee who owns the contract. | | `name` (`String!`) | The name shown for the contract. | | `contractNumber` (`String`) | The reference number of the contract. | | `supplier` (`String`) | The supplier the contract is with. | | `startDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract starts. | | `endDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract ends. | | `autoRenewEnabled` (`Boolean!`) | Whether the contract renews automatically. | | `upcomingRenewalDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The next date the contract is due to renew. | | `noticePeriodInDays` (`Int`) | How many days of notice are required to cancel before the contract renews. | | `totalContractValue` ([ContractPriceInput](https://developers.viio.io/#contractpriceinput-input)) | The total value of the contract over its whole term. | | `billingFrequency` ([BillingFrequency](https://developers.viio.io/#billingfrequency-enum)) | How often the contract is billed. | | `paymentTerms` (`String`) | The payment terms agreed with the supplier, e.g. "Net 30". | ### CreateManualLicensePlanInput input The details needed to create a manual license plan. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | `reference` ([ReferenceTargetInput!](https://developers.viio.io/#referencetargetinput-input)) | The vendor or product this plan applies to. | | `name` (`String!`) | The name shown for the plan. | | `entitledLicenses` (`Int`) | How many licenses the plan includes. Leave empty if the number is unknown. | | `pricingComponents` ([\[LicensePlanPricingComponentInput!\]!](https://developers.viio.io/#licenseplanpricingcomponentinput-input)) | The plan's full price list. | ### DataOriginOperationFilterInput input Input fields accepted by DataOriginOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([DataOrigin](https://developers.viio.io/#dataorigin-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([DataOrigin](https://developers.viio.io/#dataorigin-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[DataOrigin!\]](https://developers.viio.io/#dataorigin-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[DataOrigin!\]](https://developers.viio.io/#dataorigin-enum)) | Matches when the field value is none of the values in the given list. | ### DowngradableLicensePlanStatsFilterInput input Input fields accepted by DowngradableLicensePlanStatsFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[DowngradableLicensePlanStatsFilterInput!\]](https://developers.viio.io/#downgradablelicenseplanstatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[DowngradableLicensePlanStatsFilterInput!\]](https://developers.viio.io/#downgradablelicenseplanstatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `total` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | ### DowngradableLicensePlanStatsSortInput input Input fields accepted by DowngradableLicensePlanStatsSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput input Input fields accepted by EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput. | Name | Description | | ----------- | ----------------------------------------------------------------- | | `eq` (`ID`) | Matches when the field value is exactly equal to the given value. | ### ExternalKeyFilterInput input Input fields accepted by ExternalKeyFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | `and` ([\[ExternalKeyFilterInput!\]](https://developers.viio.io/#externalkeyfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[ExternalKeyFilterInput!\]](https://developers.viio.io/#externalkeyfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `integrationKey` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `tenant` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### ExternalUserFilterInput input Input fields accepted by ExternalUserFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | `and` ([\[ExternalUserFilterInput!\]](https://developers.viio.io/#externaluserfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[ExternalUserFilterInput!\]](https://developers.viio.io/#externaluserfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `sourceId` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `roles` ([ListStringOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#liststringoperationfilterinput-input)) | | ### InUseLicensePlanStatsFilterInput input Input fields accepted by InUseLicensePlanStatsFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[InUseLicensePlanStatsFilterInput!\]](https://developers.viio.io/#inuselicenseplanstatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[InUseLicensePlanStatsFilterInput!\]](https://developers.viio.io/#inuselicenseplanstatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `hasRecentUsage` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `ssoLogin` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `excludedFromAnalysis` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `total` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | ### InUseLicensePlanStatsSortInput input Input fields accepted by InUseLicensePlanStatsSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------- | ----------- | | `hasRecentUsage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `ssoLogin` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `excludedFromAnalysis` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseActivityOperationFilterInput input Input fields accepted by LicenseActivityOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([LicenseActivity](https://developers.viio.io/#licenseactivity-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([LicenseActivity](https://developers.viio.io/#licenseactivity-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[LicenseActivity!\]](https://developers.viio.io/#licenseactivity-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[LicenseActivity!\]](https://developers.viio.io/#licenseactivity-enum)) | Matches when the field value is none of the values in the given list. | ### LicenseAnalyticsBucketSortInput input Input fields accepted by LicenseAnalyticsBucketSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------ | ----------- | | `metrics` ([LicenseAnalyticsMetricsSortInput](https://developers.viio.io/#licenseanalyticsmetricssortinput-input)) | | ### LicenseAnalyticsInput input Input fields accepted by LicenseAnalyticsInput. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `groupBy` ([LicenseAnalyticsDimension!](https://developers.viio.io/#licenseanalyticsdimension-enum)) | | | `topN` (`Int!`) | | ### LicenseAnalyticsMetricsSortInput input Input fields accepted by LicenseAnalyticsMetricsSortInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ----------- | | `licenseCount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `inUseCount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `unusedCount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `noDataCount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `downgradableCount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `utilizationPercentage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `potentialSavingPercentage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `totalAnnualCost` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | | `potentialSaving` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | ### LicenseDetailedSourceFilterInput input Input fields accepted by LicenseDetailedSourceFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseDetailedSourceFilterInput!\]](https://developers.viio.io/#licensedetailedsourcefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseDetailedSourceFilterInput!\]](https://developers.viio.io/#licensedetailedsourcefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `dataSource` ([DiscoverySourceNameOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#discoverysourcenameoperationfilterinput-input)) | | | `firstUsed` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `lastUsed` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | | `isPrimary` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | ### LicenseFilterInput input Input fields accepted by LicenseFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseFilterInput!\]](https://developers.viio.io/#licensefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseFilterInput!\]](https://developers.viio.io/#licensefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `externalKey` ([ExternalKeyFilterInput](https://developers.viio.io/#externalkeyfilterinput-input)) | | | `reference` ([LicenseReferenceTargetFilterInput](https://developers.viio.io/#licensereferencetargetfilterinput-input)) | | | `state` ([LicenseStateFilterInput](https://developers.viio.io/#licensestatefilterinput-input)) | | | `holder` ([LicenseHolderFilterInput](https://developers.viio.io/#licenseholderfilterinput-input)) | | | `plan` ([LicensePlanReducedModelFilterInput](https://developers.viio.io/#licenseplanreducedmodelfilterinput-input)) | | | `usage` ([LicenseUsageFilterInput](https://developers.viio.io/#licenseusagefilterinput-input)) | | | `annualPrice` ([LicensePriceFilterInput](https://developers.viio.io/#licensepricefilterinput-input)) | | | `originalAnnualPrice` ([LicensePriceFilterInput](https://developers.viio.io/#licensepricefilterinput-input)) | | | `potentialSaving` ([LicensePriceFilterInput](https://developers.viio.io/#licensepricefilterinput-input)) | | | `originalPotentialSaving` ([LicensePriceFilterInput](https://developers.viio.io/#licensepricefilterinput-input)) | | ### LicenseHolderEmployeeFilterInput input Input fields accepted by LicenseHolderEmployeeFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseHolderEmployeeFilterInput!\]](https://developers.viio.io/#licenseholderemployeefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseHolderEmployeeFilterInput!\]](https://developers.viio.io/#licenseholderemployeefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `groupIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#listcomparableidtypeoperationfilterinput-input)) | | | `status` ([EmployeeStatusOperationFilterInput](https://developers.viio.io/gql-schema-reference/people-organization#employeestatusoperationfilterinput-input)) | | | `excludeFromFetch` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `userType` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `country` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `division` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `costCenter` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `departmentPath` ([StringListFilterInput](https://developers.viio.io/#stringlistfilterinput-input)) | | ### LicenseHolderFilterInput input Input fields accepted by LicenseHolderFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseHolderFilterInput!\]](https://developers.viio.io/#licenseholderfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseHolderFilterInput!\]](https://developers.viio.io/#licenseholderfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `external` ([ExternalUserFilterInput](https://developers.viio.io/#externaluserfilterinput-input)) | | | `employee` ([LicenseHolderEmployeeFilterInput](https://developers.viio.io/#licenseholderemployeefilterinput-input)) | | ### LicenseHolderSortInput input Input fields accepted by LicenseHolderSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `email` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicensePlanFilterInput input Input fields accepted by LicensePlanFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePlanFilterInput!\]](https://developers.viio.io/#licenseplanfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePlanFilterInput!\]](https://developers.viio.io/#licenseplanfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `directIntegrationInstallationId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `externalKey` ([ExternalKeyFilterInput](https://developers.viio.io/#externalkeyfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `vendorId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `productId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `pricing` ([PricingModelFilterInput](https://developers.viio.io/#pricingmodelfilterinput-input)) | | | `contractDetails` ([ContractDetailsFilterInput](https://developers.viio.io/#contractdetailsfilterinput-input)) | | | `usageStats` ([LicensePlanUsageStatsFilterInput](https://developers.viio.io/#licenseplanusagestatsfilterinput-input)) | | | `pricingStats` ([LicensePlanPricingStatsFilterInput](https://developers.viio.io/#licenseplanpricingstatsfilterinput-input)) | | | `originalPricingStats` ([LicensePlanPricingStatsFilterInput](https://developers.viio.io/#licenseplanpricingstatsfilterinput-input)) | | ### LicensePlanFixedFeePricingComponentInput input A fixed recurring charge billed at a set frequency, regardless of how many licenses are used. | Name | Description | | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | | `billingFrequency` ([BillingFrequency!](https://developers.viio.io/#billingfrequency-enum)) | How often the fixed fee is charged, for example monthly or yearly. | | `price` ([LicensePriceInput!](https://developers.viio.io/#licensepriceinput-input)) | The amount charged each billing period. | ### LicensePlanPotentialSavingFilterInput input Input fields accepted by LicensePlanPotentialSavingFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePlanPotentialSavingFilterInput!\]](https://developers.viio.io/#licenseplanpotentialsavingfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePlanPotentialSavingFilterInput!\]](https://developers.viio.io/#licenseplanpotentialsavingfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `amount` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `percentage` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | ### LicensePlanPotentialSavingSortInput input Input fields accepted by LicensePlanPotentialSavingSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `amount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `percentage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `rate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicensePlanPricingComponentInput input A single pricing component to add to a plan's price list. Provide exactly one component type per entry. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | | `fixedFee` ([LicensePlanFixedFeePricingComponentInput](https://developers.viio.io/#licenseplanfixedfeepricingcomponentinput-input)) | A fixed recurring charge billed at a set frequency. | ### LicensePlanPricingStatsFilterInput input Input fields accepted by LicensePlanPricingStatsFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePlanPricingStatsFilterInput!\]](https://developers.viio.io/#licenseplanpricingstatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePlanPricingStatsFilterInput!\]](https://developers.viio.io/#licenseplanpricingstatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `currency` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `annualUnitPrice` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `annualCost` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `potentialSaving` ([LicensePlanPotentialSavingFilterInput](https://developers.viio.io/#licenseplanpotentialsavingfilterinput-input)) | | ### LicensePlanPricingStatsSortInput input Input fields accepted by LicensePlanPricingStatsSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `currency` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `annualUnitPrice` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `annualCost` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `potentialSaving` ([LicensePlanPotentialSavingSortInput](https://developers.viio.io/#licenseplanpotentialsavingsortinput-input)) | | ### LicensePlanReducedModelFilterInput input Input fields accepted by LicensePlanReducedModelFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePlanReducedModelFilterInput!\]](https://developers.viio.io/#licenseplanreducedmodelfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePlanReducedModelFilterInput!\]](https://developers.viio.io/#licenseplanreducedmodelfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `directIntegrationInstallationId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `vendorId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `pricing` ([PricingModelFilterInput](https://developers.viio.io/#pricingmodelfilterinput-input)) | | ### LicensePlanReducedModelSortInput input Input fields accepted by LicensePlanReducedModelSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicensePlanSortInput input Input fields accepted by LicensePlanSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------- | ----------- | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `contractDetails` ([ContractDetailsSortInput](https://developers.viio.io/#contractdetailssortinput-input)) | | | `usageStats` ([LicensePlanUsageStatsSortInput](https://developers.viio.io/#licenseplanusagestatssortinput-input)) | | | `pricingStats` ([LicensePlanPricingStatsSortInput](https://developers.viio.io/#licenseplanpricingstatssortinput-input)) | | ### LicensePlanUsageStatsFilterInput input Input fields accepted by LicensePlanUsageStatsFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePlanUsageStatsFilterInput!\]](https://developers.viio.io/#licenseplanusagestatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePlanUsageStatsFilterInput!\]](https://developers.viio.io/#licenseplanusagestatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `inUse` ([InUseLicensePlanStatsFilterInput](https://developers.viio.io/#inuselicenseplanstatsfilterinput-input)) | | | `unused` ([UnusedLicensePlanStatsFilterInput](https://developers.viio.io/#unusedlicenseplanstatsfilterinput-input)) | | | `noData` ([NoDataLicensePlanStatsFilterInput](https://developers.viio.io/#nodatalicenseplanstatsfilterinput-input)) | | | `downgradable` ([DowngradableLicensePlanStatsFilterInput](https://developers.viio.io/#downgradablelicenseplanstatsfilterinput-input)) | | | `assigned` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `unassigned` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `wasted` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `total` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `effective` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `usageAvailability` ([UsageAvailabilityFilterInput](https://developers.viio.io/#usageavailabilityfilterinput-input)) | | ### LicensePlanUsageStatsSortInput input Input fields accepted by LicensePlanUsageStatsSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `inUse` ([InUseLicensePlanStatsSortInput](https://developers.viio.io/#inuselicenseplanstatssortinput-input)) | | | `unused` ([UnusedLicensePlanStatsSortInput](https://developers.viio.io/#unusedlicenseplanstatssortinput-input)) | | | `noData` ([NoDataLicensePlanStatsSortInput](https://developers.viio.io/#nodatalicenseplanstatssortinput-input)) | | | `downgradable` ([DowngradableLicensePlanStatsSortInput](https://developers.viio.io/#downgradablelicenseplanstatssortinput-input)) | | | `assigned` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `unassigned` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `wasted` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `effective` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicensePriceFilterInput input Input fields accepted by LicensePriceFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicensePriceFilterInput!\]](https://developers.viio.io/#licensepricefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicensePriceFilterInput!\]](https://developers.viio.io/#licensepricefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `amount` ([FloatOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#floatoperationfilterinput-input)) | | | `isNullish` (`Boolean`) | Matches when the field is null or missing (not present in the database). | ### LicensePriceInput input A monetary amount in a specific currency. | Name | Description | | ---------------------- | --------------------------------------------------- | | `currency` (`String!`) | Three-letter ISO currency code, such as USD or EUR. | | `amount` (`Float!`) | The amount of money. Must not be negative. | ### LicensePriceSortInput input Input fields accepted by LicensePriceSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `amount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseReferenceTargetFilterInput input Input fields accepted by LicenseReferenceTargetFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | `and` ([\[LicenseReferenceTargetFilterInput!\]](https://developers.viio.io/#licensereferencetargetfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseReferenceTargetFilterInput!\]](https://developers.viio.io/#licensereferencetargetfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `vendorId` ([EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput](https://developers.viio.io/#equalonlyoperationfilterinputtypeofidtypefilterinput-input)) | | | `productId` ([EqualOnlyOperationFilterInputTypeOfIdTypeFilterInput](https://developers.viio.io/#equalonlyoperationfilterinputtypeofidtypefilterinput-input)) | | | `vendorName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### LicenseSortInput input Input fields accepted by LicenseSortInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `state` ([LicenseStateSortInput](https://developers.viio.io/#licensestatesortinput-input)) | | | `holder` ([LicenseHolderSortInput](https://developers.viio.io/#licenseholdersortinput-input)) | | | `plan` ([LicensePlanReducedModelSortInput](https://developers.viio.io/#licenseplanreducedmodelsortinput-input)) | | | `usage` ([LicenseUsageSortInput](https://developers.viio.io/#licenseusagesortinput-input)) | | | `annualPrice` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | | `originalAnnualPrice` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | | `potentialSaving` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | | `originalPotentialSaving` ([LicensePriceSortInput](https://developers.viio.io/#licensepricesortinput-input)) | | ### LicenseStateFilterInput input Input fields accepted by LicenseStateFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseStateFilterInput!\]](https://developers.viio.io/#licensestatefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseStateFilterInput!\]](https://developers.viio.io/#licensestatefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `activity` ([LicenseActivityOperationFilterInput](https://developers.viio.io/#licenseactivityoperationfilterinput-input)) | | ### LicenseStateSortInput input Input fields accepted by LicenseStateSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `activity` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LicenseUsageFilterInput input Input fields accepted by LicenseUsageFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[LicenseUsageFilterInput!\]](https://developers.viio.io/#licenseusagefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[LicenseUsageFilterInput!\]](https://developers.viio.io/#licenseusagefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `detailedSources` ([ListLicenseDetailedSourceFilterInput](https://developers.viio.io/#listlicensedetailedsourcefilterinput-input)) | | | `lastUsed` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | ### LicenseUsageSortInput input Input fields accepted by LicenseUsageSortInput. | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `lastUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### LinkContractsInput input The details needed to link a contract to other contracts. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------------------------------------------- | | `contractId` (`ID!`) | The identifier of the contract to add links to. | | `links` ([\[ContractLinkInput!\]!](https://developers.viio.io/#contractlinkinput-input)) | The contracts to link, each with its link type. | ### ListLicenseDetailedSourceFilterInput input Input fields accepted by ListLicenseDetailedSourceFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | | `all` ([LicenseDetailedSourceFilterInput](https://developers.viio.io/#licensedetailedsourcefilterinput-input)) | Matches when every element of the list satisfies the given filter. | | `none` ([LicenseDetailedSourceFilterInput](https://developers.viio.io/#licensedetailedsourcefilterinput-input)) | Matches when no element of the list satisfies the given filter. | | `some` ([LicenseDetailedSourceFilterInput](https://developers.viio.io/#licensedetailedsourcefilterinput-input)) | Matches when at least one element of the list satisfies the given filter. | | `any` (`Boolean`) | Matches when the list contains any elements (or none, when set to false). | ### NoDataLicensePlanStatsFilterInput input Input fields accepted by NoDataLicensePlanStatsFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[NoDataLicensePlanStatsFilterInput!\]](https://developers.viio.io/#nodatalicenseplanstatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[NoDataLicensePlanStatsFilterInput!\]](https://developers.viio.io/#nodatalicenseplanstatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `newEmployee` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `noUsageDetected` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `total` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | ### NoDataLicensePlanStatsSortInput input Input fields accepted by NoDataLicensePlanStatsSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------ | ----------- | | `newEmployee` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `noUsageDetected` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### NullableOfBillingFrequencyOperationFilterInput input Input fields accepted by NullableOfBillingFrequencyOperationFilterInput. | Name | Description | | --------------------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([BillingFrequency](https://developers.viio.io/#billingfrequency-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([BillingFrequency](https://developers.viio.io/#billingfrequency-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[BillingFrequency\]](https://developers.viio.io/#billingfrequency-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[BillingFrequency\]](https://developers.viio.io/#billingfrequency-enum)) | Matches when the field value is none of the values in the given list. | ### NullableOfContractStatusOperationFilterInput input Input fields accepted by NullableOfContractStatusOperationFilterInput. | Name | Description | | ----------------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([ContractStatus](https://developers.viio.io/#contractstatus-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([ContractStatus](https://developers.viio.io/#contractstatus-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[ContractStatus\]](https://developers.viio.io/#contractstatus-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[ContractStatus\]](https://developers.viio.io/#contractstatus-enum)) | Matches when the field value is none of the values in the given list. | ### OriginValueOfDateOnlyFilterInput input Input fields accepted by OriginValueOfDateOnlyFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[OriginValueOfDateOnlyFilterInput!\]](https://developers.viio.io/#originvalueofdateonlyfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[OriginValueOfDateOnlyFilterInput!\]](https://developers.viio.io/#originvalueofdateonlyfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `origin` ([DataOriginOperationFilterInput](https://developers.viio.io/#dataoriginoperationfilterinput-input)) | | | `value` ([DateOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#dateoperationfilterinput-input)) | | ### OriginValueOfDateOnlySortInput input Input fields accepted by OriginValueOfDateOnlySortInput. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `origin` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `value` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### OriginValueOfInt32SortInput input Input fields accepted by OriginValueOfInt32SortInput. | Name | Description | | --------------------------------------------------------------------------------------------------- | ----------- | | `origin` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `value` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### PricingModelFilterInput input Input fields accepted by PricingModelFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[PricingModelFilterInput!\]](https://developers.viio.io/#pricingmodelfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[PricingModelFilterInput!\]](https://developers.viio.io/#pricingmodelfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `type` ([PricingModelTypeOperationFilterInput](https://developers.viio.io/#pricingmodeltypeoperationfilterinput-input)) | | ### PricingModelTypeOperationFilterInput input Input fields accepted by PricingModelTypeOperationFilterInput. | Name | Description | | --------------------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([PricingModelType](https://developers.viio.io/#pricingmodeltype-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([PricingModelType](https://developers.viio.io/#pricingmodeltype-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[PricingModelType\]](https://developers.viio.io/#pricingmodeltype-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[PricingModelType\]](https://developers.viio.io/#pricingmodeltype-enum)) | Matches when the field value is none of the values in the given list. | ### ReferenceTargetInput input A reference to either a vendor or a product. Provide exactly one. | Name | Description | | ------------------ | ------------------------------ | | `vendorId` (`ID`) | The identifier of the vendor. | | `productId` (`ID`) | The identifier of the product. | ### StringListFilterInput input Input fields accepted by StringListFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | `all` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | Matches when every element of the list satisfies the given filter. | | `none` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | Matches when no element of the list satisfies the given filter. | | `some` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | Matches when at least one element of the list satisfies the given filter. | | `any` (`Boolean`) | Matches when the list contains any elements (or none, when set to false). | | `startsWith` (`[String!]`) | Matches when the list of strings starts with the given segments. For example, ["A", "B"] matches ["A", "B", "C"]. | | `nstartsWith` (`[String!]`) | Matches when the list of strings does not start with the given segments. | ### UnlinkContractsInput input The details needed to remove links between contracts. | Name | Description | | ------------------------------ | ---------------------------------------------------- | | `contractId` (`ID!`) | The identifier of the contract to remove links from. | | `linkedContractIds` (`[ID!]!`) | The identifiers of the linked contracts to unlink. | ### UnusedLicensePlanStatsFilterInput input Input fields accepted by UnusedLicensePlanStatsFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[UnusedLicensePlanStatsFilterInput!\]](https://developers.viio.io/#unusedlicenseplanstatsfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[UnusedLicensePlanStatsFilterInput!\]](https://developers.viio.io/#unusedlicenseplanstatsfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `noRecentUsage` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `noSsoLogin` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `leftOrganization` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `total` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | ### UnusedLicensePlanStatsSortInput input Input fields accepted by UnusedLicensePlanStatsSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `noRecentUsage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `noSsoLogin` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `leftOrganization` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `total` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### UpdateContractDatesAndTermsInput input The details needed to change a contract's dates and renewal terms. | Name | Description | | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | `id` (`ID!`) | The identifier of the contract to update. | | `startDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract starts. Leave empty to clear it. | | `endDate` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | The date the contract ends. Leave empty to clear it. | | `termInMonths` (`Int`) | The duration of the contract in months. Leave empty to clear it. | | `autoRenewEnabled` (`Boolean!`) | Whether the contract renews automatically. | | `noticePeriodInDays` (`Int`) | How many days of notice are required to cancel before the contract renews. Leave empty to clear it. | ### UpdateContractNameInput input The details needed to rename a contract. | Name | Description | | ------------------ | ----------------------------------------- | | `id` (`ID!`) | The identifier of the contract to update. | | `name` (`String!`) | The new name for the contract. | ### UpdateContractNumberInput input The details needed to change a contract's number. | Name | Description | | --------------------------- | ------------------------------------------------- | | `id` (`ID!`) | The identifier of the contract to update. | | `contractNumber` (`String`) | The new contract number. Leave empty to clear it. | ### UpdateContractPaymentTermsInput input The details needed to change a contract's value and payment terms. | Name | Description | | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | `id` (`ID!`) | The identifier of the contract to update. | | `totalContractValue` ([ContractPriceInput](https://developers.viio.io/#contractpriceinput-input)) | The total value of the contract. Leave empty to clear it. | | `billingFrequency` ([BillingFrequency](https://developers.viio.io/#billingfrequency-enum)) | How often the contract is billed. Leave empty to clear it. | | `paymentTerms` (`String`) | The payment terms agreed with the supplier. Leave empty to clear them. | ### UpdateContractReferenceTargetInput input The details needed to change the vendor or product a contract applies to. | Name | Description | | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | | `id` (`ID!`) | The identifier of the contract to update. | | `reference` ([ReferenceTargetInput](https://developers.viio.io/#referencetargetinput-input)) | The vendor or product the contract applies to. Leave empty to clear the scope. | ### UpdateContractsOwnerInput input The details needed to change the owner of contracts. | Name | Description | | ---------------- | -------------------------------------------------------------------------------------- | | `ownerId` (`ID`) | The identifier of the employee who owns the contracts. Leave empty to unset the owner. | ### UpdateContractSupplierInput input The details needed to change a contract's supplier. | Name | Description | | --------------------- | ------------------------------------------ | | `id` (`ID!`) | The identifier of the contract to update. | | `supplier` (`String`) | The new supplier. Leave empty to clear it. | ### UsageAvailabilityFilterInput input Input fields accepted by UsageAvailabilityFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[UsageAvailabilityFilterInput!\]](https://developers.viio.io/#usageavailabilityfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[UsageAvailabilityFilterInput!\]](https://developers.viio.io/#usageavailabilityfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `status` ([UsageAvailabilityStatusOperationFilterInput](https://developers.viio.io/#usageavailabilitystatusoperationfilterinput-input)) | | ### UsageAvailabilityStatusOperationFilterInput input Input fields accepted by UsageAvailabilityStatusOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- | | `eq` ([UsageAvailabilityStatus](https://developers.viio.io/#usageavailabilitystatus-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([UsageAvailabilityStatus](https://developers.viio.io/#usageavailabilitystatus-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[UsageAvailabilityStatus!\]](https://developers.viio.io/#usageavailabilitystatus-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[UsageAvailabilityStatus!\]](https://developers.viio.io/#usageavailabilitystatus-enum)) | Matches when the field value is none of the values in the given list. | ## Unions ### AggregatedLicensePlansCriteria union Possible object types returned by the AggregatedLicensePlansCriteria union. Possible types: [AggregatedLicensePlansProductCriteria](https://developers.viio.io/#aggregatedlicenseplansproductcriteria-object), [AggregatedLicensePlansVendorCriteria](https://developers.viio.io/#aggregatedlicenseplansvendorcriteria-object), [AggregatedLicensePlansIntegrationCriteria](https://developers.viio.io/#aggregatedlicenseplansintegrationcriteria-object), [AggregatedLicensePlansAttributeCriteria](https://developers.viio.io/#aggregatedlicenseplansattributecriteria-object) ### ContractReferenceTarget union The vendor or product a contract applies to. Possible types: [VendorReference](https://developers.viio.io/#vendorreference-object), [ProductReference](https://developers.viio.io/#productreference-object) ### CreateContractError union A reason a contract could not be created. Possible types: [VendorNotFoundError](https://developers.viio.io/#vendornotfounderror-object), [ProductNotFoundError](https://developers.viio.io/#productnotfounderror-object), [InvalidContractDateError](https://developers.viio.io/#invalidcontractdateerror-object) ### CreateManualLicensePlanError union A reason a license plan could not be created. Possible types: [VendorNotFoundError](https://developers.viio.io/#vendornotfounderror-object), [ProductNotFoundError](https://developers.viio.io/#productnotfounderror-object), [IntegratedLicensePlanExistsError](https://developers.viio.io/#integratedlicenseplanexistserror-object) ### IntegrationLicenseDetails union Possible object types returned by the IntegrationLicenseDetails union. Possible types: [UnknownIntegrationLicenseDetails](https://developers.viio.io/#unknownintegrationlicensedetails-object), [FreeIntegrationLicenseDetails](https://developers.viio.io/#freeintegrationlicensedetails-object), [FlatFeeIntegrationLicenseDetails](https://developers.viio.io/#flatfeeintegrationlicensedetails-object), [PerLicenseIntegrationLicenseDetails](https://developers.viio.io/#perlicenseintegrationlicensedetails-object), [BulkIntegrationLicenseDetails](https://developers.viio.io/#bulkintegrationlicensedetails-object), [StairStepIntegrationLicenseDetails](https://developers.viio.io/#stairstepintegrationlicensedetails-object), [VolumeIntegrationLicenseDetails](https://developers.viio.io/#volumeintegrationlicensedetails-object) ### LicenseAnalyticsBucketKey union Possible object types returned by the LicenseAnalyticsBucketKey union. Possible types: [VendorBucketKey](https://developers.viio.io/#vendorbucketkey-object), [ProductBucketKey](https://developers.viio.io/#productbucketkey-object), [PlanBucketKey](https://developers.viio.io/#planbucketkey-object), [StateBucketKey](https://developers.viio.io/#statebucketkey-object), [StateReasonBucketKey](https://developers.viio.io/#statereasonbucketkey-object), [PricingModelBucketKey](https://developers.viio.io/#pricingmodelbucketkey-object), [EmployeeStatusBucketKey](https://developers.viio.io/#employeestatusbucketkey-object), [DivisionBucketKey](https://developers.viio.io/#divisionbucketkey-object), [CostCenterBucketKey](https://developers.viio.io/#costcenterbucketkey-object), [CountryBucketKey](https://developers.viio.io/#countrybucketkey-object) ### LicenseDowngradeReason union Possible object types returned by the LicenseDowngradeReason union. Possible types: [LicenseDowngradeNoUsageReason](https://developers.viio.io/#licensedowngradenousagereason-object), [LicenseDowngradeExclusiveUsageReason](https://developers.viio.io/#licensedowngradeexclusiveusagereason-object) ### LicensePlan union Possible object types returned by the LicensePlan union. Possible types: [ManualLicensePlan](https://developers.viio.io/#manuallicenseplan-object), [IntegratedLicensePlan](https://developers.viio.io/#integratedlicenseplan-object) ### LicensePlanPricingComponent union One part of how a license plan is priced. A plan's price list is made up of one or more of these components. Possible types: [LicensePlanFixedFeePricingComponent](https://developers.viio.io/#licenseplanfixedfeepricingcomponent-object) ### LicenseReferenceTarget union Possible object types returned by the LicenseReferenceTarget union. Possible types: [VendorReference](https://developers.viio.io/#vendorreference-object), [ProductReference](https://developers.viio.io/#productreference-object) ### LicenseState union Possible object types returned by the LicenseState union. Possible types: [InUseLicenseState](https://developers.viio.io/#inuselicensestate-object), [UnusedLicenseState](https://developers.viio.io/#unusedlicensestate-object), [NoDataLicenseState](https://developers.viio.io/#nodatalicensestate-object), [DowngradableLicenseState](https://developers.viio.io/#downgradablelicensestate-object) ### LinkContractsError union A reason contracts could not be linked. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### PricingModel union Possible object types returned by the PricingModel union. Possible types: [UnknownPricingModel](https://developers.viio.io/#unknownpricingmodel-object), [FreePricingModel](https://developers.viio.io/#freepricingmodel-object), [FlatFeePricingModel](https://developers.viio.io/#flatfeepricingmodel-object), [PerLicensePricingModel](https://developers.viio.io/#perlicensepricingmodel-object), [BulkPricingModel](https://developers.viio.io/#bulkpricingmodel-object), [StairStepPricingModel](https://developers.viio.io/#stairsteppricingmodel-object), [VolumePricingModel](https://developers.viio.io/#volumepricingmodel-object) ### UnlinkContractsError union A reason contract links could not be removed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractDatesAndTermsError union A reason a contract's dates and terms could not be changed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractNameError union A reason a contract's name could not be changed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractNumberError union A reason a contract's number could not be changed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractPaymentTermsError union A reason a contract's value and payment terms could not be changed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractReferenceTargetError union A reason a contract's vendor or product could not be changed. Possible types: [VendorNotFoundError](https://developers.viio.io/#vendornotfounderror-object), [ProductNotFoundError](https://developers.viio.io/#productnotfounderror-object), [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ### UpdateContractSupplierError union A reason a contract's supplier could not be changed. Possible types: [ContractNotFoundError](https://developers.viio.io/#contractnotfounderror-object) ## Enums ### BillingFrequency enum How often a contract is billed. | Value | Description | | ------------ | -------------------------- | | `ONCE` | Billed a single time. | | `MONTHLY` | Billed every month. | | `QUARTERLY` | Billed every three months. | | `SEMIANNUAL` | Billed every six months. | | `YEARLY` | Billed every year. | | `DAILY` | | | `WEEKLY` | | ### ContractLinkType enum How one contract is linked to another. | Value | Description | | ------------ | -------------------------------------------------------------------- | | `SUPERSEDES` | This contract replaces the linked contract. | | `RELATED_TO` | This contract is related to the other contract without replacing it. | ### ContractStatus enum The lifecycle status of a contract. | Value | Description | | ---------- | ------------------------------------ | | `UPCOMING` | The contract has not started yet. | | `ACTIVE` | The contract is currently in effect. | | `EXPIRED` | The contract has ended. | ### CountCalculationType enum Count calculation type | Value | Description | | ----------- | ----------------------------------- | | `AUTOMATIC` | Calculate value based on statistics | | `MANUAL` | Use manually entered value | ### DataOrigin enum Accepted values for the DataOrigin enum. | Value | Description | | -------- | ----------- | | `API` | | | `AUTO` | | | `MANUAL` | | ### InUseLicenseStateReason enum Accepted values for the InUseLicenseStateReason enum. | Value | Description | | ------------------------ | ----------- | | `HAS_RECENT_USAGE` | | | `SSO_LOGIN` | | | `EXCLUDED_FROM_ANALYSIS` | | ### LicenseActivity enum Accepted values for the LicenseActivity enum. | Value | Description | | -------------- | ----------- | | `IN_USE` | | | `UNUSED` | | | `NO_DATA` | | | `DOWNGRADABLE` | | ### LicenseAnalyticsDimension enum Accepted values for the LicenseAnalyticsDimension enum. | Value | Description | | ----------------- | ----------- | | `VENDOR` | | | `REFERENCE` | | | `PLAN` | | | `STATE` | | | `STATE_REASON` | | | `PRICING_MODEL` | | | `DIVISION` | | | `COST_CENTER` | | | `COUNTRY` | | | `EMPLOYEE_STATUS` | | ### LicensePlanGroupingAttribute enum Accepted values for the LicensePlanGroupingAttribute enum. | Value | Description | | -------------- | ----------- | | `ORGANIZATION` | | ### LicensePlanOrigin enum Where a license plan came from. | Value | Description | | ------------- | ---------------------------------------------------------------------- | | `INTEGRATION` | The plan was discovered automatically through a connected integration. | | `MANUAL` | The plan was created manually. | ### LicensePlanPotentialSavingRate enum Accepted values for the LicensePlanPotentialSavingRate enum. | Value | Description | | -------- | ----------- | | `NONE` | | | `LOW` | | | `MEDIUM` | | | `HIGH` | | ### NoDataLicenseStateReason enum Accepted values for the NoDataLicenseStateReason enum. | Value | Description | | ------------------- | ----------- | | `NEW_EMPLOYEE` | | | `NO_USAGE_DETECTED` | | ### PlanType enum Accepted values for the PlanType enum. | Value | Description | | -------- | ----------- | | `MANUAL` | | | `AUTO` | | ### PricingModelType enum Accepted values for the PricingModelType enum. | Value | Description | | ------------- | ----------- | | `UNKNOWN` | | | `FREE` | | | `FLAT_FEE` | | | `PER_LICENSE` | | | `BULK` | | | `STAIR_STEP` | | | `VOLUME` | | ### UnusedLicenseStateReason enum Accepted values for the UnusedLicenseStateReason enum. | Value | Description | | ------------------- | ----------- | | `NO_RECENT_USAGE` | | | `NO_SSO_LOGIN` | | | `LEFT_ORGANIZATION` | | ### UsageAvailabilityStatus enum Accepted values for the UsageAvailabilityStatus enum. | Value | Description | | --------------- | ----------- | | `AVAILABLE` | | | `NOT_SUPPORTED` | | # People & Organization ## Queries ### employee query Retrieve employee data from the Viio GraphQL API. ```graphql employee(id: ID!): Employee ``` **Returns:** [Employee](https://developers.viio.io/#employee-object) **Arguments for `employee`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### employees query Retrieve employees data from the Viio GraphQL API. ```graphql employees(first: Int, after: String, last: Int, before: String, where: EmployeeFilterInput, order: [EmployeeSortInput!]): EmployeesConnection ``` **Returns:** [EmployeesConnection](https://developers.viio.io/#employeesconnection-object) **Arguments for `employees`** | Name | Description | | --------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([EmployeeFilterInput](https://developers.viio.io/#employeefilterinput-input)) | | | `order` ([\[EmployeeSortInput!\]](https://developers.viio.io/#employeesortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### departmentsSearch query Retrieve departmentsSearch data from the Viio GraphQL API. ```graphql departmentsSearch(skip: Int, take: Int, search: String!): DepartmentsSearchCollectionSegment ``` **Returns:** [DepartmentsSearchCollectionSegment](https://developers.viio.io/#departmentssearchcollectionsegment-object) **Arguments for `departmentsSearch`** | Name | Description | | -------------------- | ----------- | | `skip` (`Int`) | | | `take` (`Int`) | | | `search` (`String!`) | | ### departmentsHierarchy query Retrieve departmentsHierarchy data from the Viio GraphQL API. ```graphql departmentsHierarchy(skip: Int, take: Int, rootPath: [String!]): DepartmentsHierarchyCollectionSegment ``` **Returns:** [DepartmentsHierarchyCollectionSegment](https://developers.viio.io/#departmentshierarchycollectionsegment-object) **Arguments for `departmentsHierarchy`** | Name | Description | | ------------------------ | ----------- | | `skip` (`Int`) | | | `take` (`Int`) | | | `rootPath` (`[String!]`) | | ### departmentExclusions query Retrieve departmentExclusions data from the Viio GraphQL API. ```graphql departmentExclusions(skip: Int, take: Int): DepartmentExclusionsCollectionSegment ``` **Returns:** [DepartmentExclusionsCollectionSegment](https://developers.viio.io/#departmentexclusionscollectionsegment-object) **Arguments for `departmentExclusions`** | Name | Description | | -------------- | ----------- | | `skip` (`Int`) | | | `take` (`Int`) | | ### organizationCountries query Retrieve organizationCountries data from the Viio GraphQL API. ```graphql organizationCountries(where: OrganizationAttributeFilterInput, first: Int, after: String, last: Int, before: String): OrganizationAttributeConnection ``` **Returns:** [OrganizationAttributeConnection](https://developers.viio.io/#organizationattributeconnection-object) **Arguments for `organizationCountries`** | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([OrganizationAttributeFilterInput](https://developers.viio.io/#organizationattributefilterinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### organizationDivisions query Retrieve organizationDivisions data from the Viio GraphQL API. ```graphql organizationDivisions(where: OrganizationAttributeFilterInput, first: Int, after: String, last: Int, before: String): OrganizationAttributeConnection ``` **Returns:** [OrganizationAttributeConnection](https://developers.viio.io/#organizationattributeconnection-object) **Arguments for `organizationDivisions`** | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([OrganizationAttributeFilterInput](https://developers.viio.io/#organizationattributefilterinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### organizationCostCenters query Retrieve organizationCostCenters data from the Viio GraphQL API. ```graphql organizationCostCenters(where: OrganizationAttributeFilterInput, first: Int, after: String, last: Int, before: String): OrganizationAttributeConnection ``` **Returns:** [OrganizationAttributeConnection](https://developers.viio.io/#organizationattributeconnection-object) **Arguments for `organizationCostCenters`** | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([OrganizationAttributeFilterInput](https://developers.viio.io/#organizationattributefilterinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### organizationUserTypes query Retrieve organizationUserTypes data from the Viio GraphQL API. ```graphql organizationUserTypes(where: OrganizationAttributeFilterInput, first: Int, after: String, last: Int, before: String): OrganizationAttributeConnection ``` **Returns:** [OrganizationAttributeConnection](https://developers.viio.io/#organizationattributeconnection-object) **Arguments for `organizationUserTypes`** | Name | Description | | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([OrganizationAttributeFilterInput](https://developers.viio.io/#organizationattributefilterinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ## Mutations ### updateEmployeesAnalysisStatus mutation Run the updateEmployeesAnalysisStatus mutation through the Viio GraphQL API. ```graphql updateEmployeesAnalysisStatus(input: UpdateEmployeesAnalysisStatusInput!, where: EmployeeFilterInput): UpdateEmployeesAnalysisStatusPayload! ``` **Returns:** [UpdateEmployeesAnalysisStatusPayload!](https://developers.viio.io/#updateemployeesanalysisstatuspayload-object) **Arguments for `updateEmployeesAnalysisStatus`** | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateEmployeesAnalysisStatusInput!](https://developers.viio.io/#updateemployeesanalysisstatusinput-input)) | | | `where` ([EmployeeFilterInput](https://developers.viio.io/#employeefilterinput-input)) | | ### updateGroupsAnalysisStatus mutation Run the updateGroupsAnalysisStatus mutation through the Viio GraphQL API. ```graphql updateGroupsAnalysisStatus(input: UpdateGroupsAnalysisStatusInput!, where: GroupFilterInput): UpdateGroupsAnalysisStatusPayload! ``` **Returns:** [UpdateGroupsAnalysisStatusPayload!](https://developers.viio.io/#updategroupsanalysisstatuspayload-object) **Arguments for `updateGroupsAnalysisStatus`** | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateGroupsAnalysisStatusInput!](https://developers.viio.io/#updategroupsanalysisstatusinput-input)) | | | `where` ([GroupFilterInput](https://developers.viio.io/#groupfilterinput-input)) | | ### includeDepartmentPathToAnalysis mutation Run the includeDepartmentPathToAnalysis mutation through the Viio GraphQL API. ```graphql includeDepartmentPathToAnalysis(input: IncludeDepartmentPathToAnalysisInput!): IncludeDepartmentPathToAnalysisPayload! ``` **Returns:** [IncludeDepartmentPathToAnalysisPayload!](https://developers.viio.io/#includedepartmentpathtoanalysispayload-object) **Arguments for `includeDepartmentPathToAnalysis`** | Name | Description | | ------------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([IncludeDepartmentPathToAnalysisInput!](https://developers.viio.io/#includedepartmentpathtoanalysisinput-input)) | | ### excludeDepartmentPathFromAnalysis mutation Run the excludeDepartmentPathFromAnalysis mutation through the Viio GraphQL API. ```graphql excludeDepartmentPathFromAnalysis(input: ExcludeDepartmentPathFromAnalysisInput!): ExcludeDepartmentPathFromAnalysisPayload! ``` **Returns:** [ExcludeDepartmentPathFromAnalysisPayload!](https://developers.viio.io/#excludedepartmentpathfromanalysispayload-object) **Arguments for `excludeDepartmentPathFromAnalysis`** | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([ExcludeDepartmentPathFromAnalysisInput!](https://developers.viio.io/#excludedepartmentpathfromanalysisinput-input)) | | ## Objects ### AncestorAlreadyExcludedError object Fields returned by the AncestorAlreadyExcludedError object type. | Name | Description | | ----------------------------- | ----------- | | `ancestorPath` (`[String!]!`) | | | `message` (`String!`) | | ### BrowserExtensionInstallation object Fields returned by the BrowserExtensionInstallation object type. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `installed` (`Boolean!`) | | | `installationDate` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `firstUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### CollectionSegmentInfo object Information about the offset pagination. | Name | Description | | ------------------------------ | -------------------------------------------------------------------------------------- | | `hasNextPage` (`Boolean!`) | Indicates whether more items exist following the set defined by the clients arguments. | | `hasPreviousPage` (`Boolean!`) | Indicates whether more items exist prior the set defined by the clients arguments. | ### DepartmentExclusionNode object Fields returned by the DepartmentExclusionNode object type. | Name | Description | | --------------------- | ----------- | | `path` (`[String!]!`) | | | `name` (`String!`) | | ### DepartmentExclusionsCollectionSegment object A segment of a collection. | Name | Description | | ---------------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[DepartmentExclusionNode!\]](https://developers.viio.io/#departmentexclusionnode-object)) | A flattened list of the items. | ### DepartmentNode object Fields returned by the DepartmentNode object type. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `path` (`[String!]!`) | | | `name` (`String!`) | | | `employeesCount` (`Int!`) | | | `childrenCount` (`Int!`) | | | `hasChildren` (`Boolean!`) | | | `analysisStatus` ([DepartmentAnalysisStatus!](https://developers.viio.io/#departmentanalysisstatus-enum)) | | | `children` ([\[DepartmentNode!\]!](https://developers.viio.io/#departmentnode-object)) | | ### DepartmentSearchResult object Fields returned by the DepartmentSearchResult object type. | Name | Description | | --------------------------------------------------------------------------------------------------------- | ----------- | | `path` (`[String!]!`) | | | `name` (`String!`) | | | `employeesCount` (`Int!`) | | | `analysisStatus` ([DepartmentAnalysisStatus!](https://developers.viio.io/#departmentanalysisstatus-enum)) | | ### DepartmentsHierarchyCollectionSegment object A segment of a collection. | Name | Description | | ----------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[DepartmentNode!\]](https://developers.viio.io/#departmentnode-object)) | A flattened list of the items. | | `totalCount` (`Int!`) | | ### DepartmentsSearchCollectionSegment object A segment of a collection. | Name | Description | | -------------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[DepartmentSearchResult!\]](https://developers.viio.io/#departmentsearchresult-object)) | A flattened list of the items. | ### DesktopAgentInstallation object Fields returned by the DesktopAgentInstallation object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `operatingSystem` ([DesktopAgentOperatingSystem](https://developers.viio.io/#desktopagentoperatingsystem-enum)) | | | `installed` (`Boolean!`) | | | `installationDate` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `firstUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lastUsed` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### DirectReportsConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[DirectReportsEdge!\]](https://developers.viio.io/#directreportsedge-object)) | A list of edges. | | `nodes` ([\[Employee!\]](https://developers.viio.io/#employee-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### DirectReportsEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Employee!](https://developers.viio.io/#employee-object)) | The item at the end of the edge. | ### Employee object Fields returned by the Employee object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `id` (`ID!`) | | | `userType` (`String`) | | | `status` ([EmployeeStatus!](https://developers.viio.io/#employeestatus-enum)) | | | `name` (`String!`) | | | `firstName` (`String`) | | | `lastName` (`String`) | | | `avatar` (`String`) | | | `email` (`String`) | | | `emailAliases` (`[String!]!`) | | | `jobTitle` (`String`) | | | `sourceId` (`String!`) | | | `source` (`String!`) | | | `orgUnit` (`String!`) | | | `excludeFromFetch` (`Boolean!`) | | | `creationTime` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `deletionTime` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | UTC timestamp for when the employee was detected as deleted from the connected directory source. This may be the deletion time reported by the source, or the time Viio detected the deletion during sync — so treat it as when the deletion became known, not necessarily the exact moment it occurred. Null while the employee is still present. | | `installations` ([EmployeeInstallations!](https://developers.viio.io/#employeeinstallations-object)) | | | `groupIds` (`[ID!]!`) | | | `country` (`String`) | | | `division` (`String`) | | | `costCenter` (`String`) | | | `departmentPath` (`[String!]!`) | | | `managerId` (`ID`) | | | `directReports` ([DirectReportsConnection](https://developers.viio.io/#directreportsconnection-object)) | | | `groups` ([\[Group!\]!](https://developers.viio.io/#group-object)) | | | `manager` ([Employee](https://developers.viio.io/#employee-object)) | | | `licenses` ([LicensesConnection](https://developers.viio.io/gql-schema-reference/licenses#licensesconnection-object)) | | | `products` ([ProductUsersConnection](https://developers.viio.io/gql-schema-reference/discovery#productusersconnection-object)) | | | `applicationsUsage` ([ApplicationsUsageConnection](https://developers.viio.io/gql-schema-reference/discovery#applicationsusageconnection-object)) | | ### EmployeeInstallations object Fields returned by the EmployeeInstallations object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `browserExtension` ([BrowserExtensionInstallation!](https://developers.viio.io/#browserextensioninstallation-object)) | | | `desktopAgent` ([DesktopAgentInstallation!](https://developers.viio.io/#desktopagentinstallation-object)) | | ### EmployeesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[EmployeesEdge!\]](https://developers.viio.io/#employeesedge-object)) | A list of edges. | | `nodes` ([\[Employee!\]](https://developers.viio.io/#employee-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### EmployeesEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Employee!](https://developers.viio.io/#employee-object)) | The item at the end of the edge. | ### ExcludeDepartmentPathFromAnalysisPayload object Fields returned by the ExcludeDepartmentPathFromAnalysisPayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[ExcludeDepartmentPathFromAnalysisError!\]](https://developers.viio.io/#excludedepartmentpathfromanalysiserror-union)) | | ### FailedToExecuteUpdateAnalysisStatusError object Fields returned by the FailedToExecuteUpdateAnalysisStatusError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### Group object Fields returned by the Group object type. | Name | Description | | ------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `description` (`String`) | | | `groupIds` (`[ID!]!`) | | | `excludeFromFetch` (`Boolean!`) | | | `groups` ([\[Group!\]!](https://developers.viio.io/#group-object)) | | | `nestedGroups` ([\[Group!\]!](https://developers.viio.io/#group-object)) | | | `employees` ([EmployeesConnection](https://developers.viio.io/#employeesconnection-object)) | | ### IncludeDepartmentPathToAnalysisPayload object Fields returned by the IncludeDepartmentPathToAnalysisPayload object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[IncludeDepartmentPathToAnalysisError!\]](https://developers.viio.io/#includedepartmentpathtoanalysiserror-union)) | | ### OrganizationAttributeConnection object A connection to a list of items. | Name | Description | | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[OrganizationAttributeEdge!\]](https://developers.viio.io/#organizationattributeedge-object)) | A list of edges. | | `nodes` (`[String!]`) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### OrganizationAttributeEdge object An edge in a connection. | Name | Description | | -------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` (`String!`) | The item at the end of the edge. | ### UpdateEmployeesAnalysisStatusPayload object Fields returned by the UpdateEmployeesAnalysisStatusPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------------------- | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[UpdateAnalysisStatusError!\]](https://developers.viio.io/#updateanalysisstatuserror-union)) | | ### UpdateGroupsAnalysisStatusPayload object Fields returned by the UpdateGroupsAnalysisStatusPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------------------- | ----------- | | `updatedCount` (`Int`) | | | `errors` ([\[UpdateAnalysisStatusError!\]](https://developers.viio.io/#updateanalysisstatuserror-union)) | | ## Input Types ### BrowserExtensionInstallationFilterInput input Input fields accepted by BrowserExtensionInstallationFilterInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[BrowserExtensionInstallationFilterInput!\]](https://developers.viio.io/#browserextensioninstallationfilterinput-input)) | | | `or` ([\[BrowserExtensionInstallationFilterInput!\]](https://developers.viio.io/#browserextensioninstallationfilterinput-input)) | | | `installed` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `installationDate` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `firstUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | ### BrowserExtensionInstallationSortInput input Input fields accepted by BrowserExtensionInstallationSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `installed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `installationDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `firstUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `lastUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### DesktopAgentInstallationFilterInput input Input fields accepted by DesktopAgentInstallationFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[DesktopAgentInstallationFilterInput!\]](https://developers.viio.io/#desktopagentinstallationfilterinput-input)) | | | `or` ([\[DesktopAgentInstallationFilterInput!\]](https://developers.viio.io/#desktopagentinstallationfilterinput-input)) | | | `operatingSystem` ([NullableOfDesktopAgentOperatingSystemOperationFilterInput](https://developers.viio.io/#nullableofdesktopagentoperatingsystemoperationfilterinput-input)) | | | `installed` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `installationDate` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `firstUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `lastUsed` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | ### DesktopAgentInstallationSortInput input Input fields accepted by DesktopAgentInstallationSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `operatingSystem` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `installed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `installationDate` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `firstUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `lastUsed` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### EmployeeFilterInput input Input fields accepted by EmployeeFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[EmployeeFilterInput!\]](https://developers.viio.io/#employeefilterinput-input)) | | | `or` ([\[EmployeeFilterInput!\]](https://developers.viio.io/#employeefilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `managerId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `userType` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `status` ([EmployeeStatusOperationFilterInput](https://developers.viio.io/#employeestatusoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `sourceId` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `source` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `orgUnit` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `excludeFromFetch` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `creationTime` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `deletionTime` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `installations` ([EmployeeInstallationsFilterInput](https://developers.viio.io/#employeeinstallationsfilterinput-input)) | | | `groupIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/#listcomparableidtypeoperationfilterinput-input)) | | | `country` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `division` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `costCenter` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `departmentPath` ([StringListFilterInput](https://developers.viio.io/gql-schema-reference/licenses#stringlistfilterinput-input)) | | ### EmployeeInstallationsFilterInput input Input fields accepted by EmployeeInstallationsFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[EmployeeInstallationsFilterInput!\]](https://developers.viio.io/#employeeinstallationsfilterinput-input)) | | | `or` ([\[EmployeeInstallationsFilterInput!\]](https://developers.viio.io/#employeeinstallationsfilterinput-input)) | | | `browserExtension` ([BrowserExtensionInstallationFilterInput](https://developers.viio.io/#browserextensioninstallationfilterinput-input)) | | | `desktopAgent` ([DesktopAgentInstallationFilterInput](https://developers.viio.io/#desktopagentinstallationfilterinput-input)) | | ### EmployeeInstallationsSortInput input Input fields accepted by EmployeeInstallationsSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `browserExtension` ([BrowserExtensionInstallationSortInput](https://developers.viio.io/#browserextensioninstallationsortinput-input)) | | | `desktopAgent` ([DesktopAgentInstallationSortInput](https://developers.viio.io/#desktopagentinstallationsortinput-input)) | | ### EmployeeSortInput input Input fields accepted by EmployeeSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `userType` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `status` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `sourceId` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `source` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `orgUnit` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `excludeFromFetch` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `creationTime` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `deletionTime` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `installations` ([EmployeeInstallationsSortInput](https://developers.viio.io/#employeeinstallationssortinput-input)) | | ### EmployeeStatusOperationFilterInput input Input fields accepted by EmployeeStatusOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------ | ----------- | | `eq` ([EmployeeStatus](https://developers.viio.io/#employeestatus-enum)) | | | `neq` ([EmployeeStatus](https://developers.viio.io/#employeestatus-enum)) | | | `in` ([\[EmployeeStatus!\]](https://developers.viio.io/#employeestatus-enum)) | | | `nin` ([\[EmployeeStatus!\]](https://developers.viio.io/#employeestatus-enum)) | | ### ExcludeDepartmentPathFromAnalysisInput input Input fields accepted by ExcludeDepartmentPathFromAnalysisInput. | Name | Description | | ------------------------------- | ----------- | | `departmentPath` (`[String!]!`) | | ### GroupFilterInput input Input fields accepted by GroupFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `and` ([\[GroupFilterInput!\]](https://developers.viio.io/#groupfilterinput-input)) | | | `or` ([\[GroupFilterInput!\]](https://developers.viio.io/#groupfilterinput-input)) | | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `description` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `groupIds` ([ListComparableIdTypeOperationFilterInput](https://developers.viio.io/#listcomparableidtypeoperationfilterinput-input)) | | | `excludeFromFetch` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | ### IncludeDepartmentPathToAnalysisInput input Input fields accepted by IncludeDepartmentPathToAnalysisInput. | Name | Description | | ------------------------------- | ----------- | | `departmentPath` (`[String!]!`) | | ### ListComparableIdTypeOperationFilterInput input Input fields accepted by ListComparableIdTypeOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `all` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `none` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `some` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `any` (`Boolean`) | | ### NullableOfDesktopAgentOperatingSystemOperationFilterInput input Input fields accepted by NullableOfDesktopAgentOperatingSystemOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `eq` ([DesktopAgentOperatingSystem](https://developers.viio.io/#desktopagentoperatingsystem-enum)) | | | `neq` ([DesktopAgentOperatingSystem](https://developers.viio.io/#desktopagentoperatingsystem-enum)) | | | `in` ([\[DesktopAgentOperatingSystem\]](https://developers.viio.io/#desktopagentoperatingsystem-enum)) | | | `nin` ([\[DesktopAgentOperatingSystem\]](https://developers.viio.io/#desktopagentoperatingsystem-enum)) | | ### OrganizationAttributeFilterInput input Input fields accepted by OrganizationAttributeFilterInput. | Name | Description | | --------------------- | ----------- | | `contains` (`String`) | | ### UpdateEmployeesAnalysisStatusInput input Input fields accepted by UpdateEmployeesAnalysisStatusInput. | Name | Description | | ------------------------------------------------------------------------------------- | ----------- | | `analysisStatus` ([AnalysisStatus!](https://developers.viio.io/#analysisstatus-enum)) | | ### UpdateGroupsAnalysisStatusInput input Input fields accepted by UpdateGroupsAnalysisStatusInput. | Name | Description | | ------------------------------------------------------------------------------------- | ----------- | | `analysisStatus` ([AnalysisStatus!](https://developers.viio.io/#analysisstatus-enum)) | | ## Unions ### ExcludeDepartmentPathFromAnalysisError union Possible object types returned by the ExcludeDepartmentPathFromAnalysisError union. Possible types: [AncestorAlreadyExcludedError](https://developers.viio.io/#ancestoralreadyexcludederror-object) ### IncludeDepartmentPathToAnalysisError union Possible object types returned by the IncludeDepartmentPathToAnalysisError union. Possible types: [AncestorAlreadyExcludedError](https://developers.viio.io/#ancestoralreadyexcludederror-object) ### UpdateAnalysisStatusError union Possible object types returned by the UpdateAnalysisStatusError union. Possible types: [FailedToExecuteUpdateAnalysisStatusError](https://developers.viio.io/#failedtoexecuteupdateanalysisstatuserror-object) ## Enums ### AnalysisStatus enum Accepted values for the AnalysisStatus enum. | Value | Description | | --------- | ----------- | | `INCLUDE` | | | `EXCLUDE` | | ### DepartmentAnalysisStatus enum Accepted values for the DepartmentAnalysisStatus enum. | Value | Description | | -------------------- | ----------- | | `INCLUDE` | | | `EXCLUDE` | | | `PARTIALLY_EXCLUDED` | | ### DesktopAgentOperatingSystem enum Accepted values for the DesktopAgentOperatingSystem enum. | Value | Description | | --------- | ----------- | | `WINDOWS` | | | `MAC_OS` | | ### EmployeeStatus enum Accepted values for the EmployeeStatus enum. | Value | Description | | ----------- | ----------- | | `ACTIVE` | | | `SUSPENDED` | | | `DELETED` | | | `INVALID` | | # Procurement ## Queries ### procurementCases query Retrieve procurementCases data from the Viio GraphQL API. ```graphql procurementCases(first: Int, after: String, last: Int, before: String, where: ProcurementCaseFilterInput, order: [ProcurementCaseSortInput!]): ProcurementCasesConnection ``` **Returns:** [ProcurementCasesConnection](https://developers.viio.io/#procurementcasesconnection-object) **Arguments for `procurementCases`** | Name | Description | | ----------------------------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([ProcurementCaseFilterInput](https://developers.viio.io/#procurementcasefilterinput-input)) | | | `order` ([\[ProcurementCaseSortInput!\]](https://developers.viio.io/#procurementcasesortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ### procurementCasesTotalStats query Retrieve procurementCasesTotalStats data from the Viio GraphQL API. ```graphql procurementCasesTotalStats(where: ProcurementCaseFilterInput): ProcurementTotals ``` **Returns:** [ProcurementTotals](https://developers.viio.io/#procurementtotals-object) **Arguments for `procurementCasesTotalStats`** | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `where` ([ProcurementCaseFilterInput](https://developers.viio.io/#procurementcasefilterinput-input)) | | ### procurementCase query Retrieve procurementCase data from the Viio GraphQL API. ```graphql procurementCase(input: ProcurementCaseInput!): ProcurementCase ``` **Returns:** [ProcurementCase](https://developers.viio.io/#procurementcase-object) **Arguments for `procurementCase`** | Name | Description | | ----------------------------------------------------------------------------------------- | ----------- | | `input` ([ProcurementCaseInput!](https://developers.viio.io/#procurementcaseinput-input)) | | ### procurementSavings query Retrieve procurementSavings data from the Viio GraphQL API. ```graphql procurementSavings(input: ProcurementSavingsInput!): ProcurementSavings ``` **Returns:** [ProcurementSavings](https://developers.viio.io/#procurementsavings-object) **Arguments for `procurementSavings`** | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `input` ([ProcurementSavingsInput!](https://developers.viio.io/#procurementsavingsinput-input)) | | ## Mutations ### createProcurementCase mutation Run the createProcurementCase mutation through the Viio GraphQL API. ```graphql createProcurementCase(input: CreateProcurementCaseInput!): CreateProcurementCasePayload! ``` **Returns:** [CreateProcurementCasePayload!](https://developers.viio.io/#createprocurementcasepayload-object) **Arguments for `createProcurementCase`** | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `input` ([CreateProcurementCaseInput!](https://developers.viio.io/#createprocurementcaseinput-input)) | | ### updateProcurementCase mutation Run the updateProcurementCase mutation through the Viio GraphQL API. ```graphql updateProcurementCase(input: UpdateProcurementCaseInput!): UpdateProcurementCasePayload! ``` **Returns:** [UpdateProcurementCasePayload!](https://developers.viio.io/#updateprocurementcasepayload-object) **Arguments for `updateProcurementCase`** | Name | Description | | ----------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateProcurementCaseInput!](https://developers.viio.io/#updateprocurementcaseinput-input)) | | ## Objects ### CreateProcurementCasePayload object Fields returned by the CreateProcurementCasePayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ----------- | | `case` ([ProcurementCase](https://developers.viio.io/#procurementcase-object)) | | | `errors` ([\[CreateProcurementCaseError!\]](https://developers.viio.io/#createprocurementcaseerror-union)) | | ### ProcurementCase object Fields returned by the ProcurementCase object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `state` ([ProcurementCaseState!](https://developers.viio.io/#procurementcasestate-enum)) | | | `completedAt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `name` (`String!`) | | | `comment` (`String`) | | | `deadline` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `renewal` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `baselineType` ([ProcurementBaselineType](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `baselinePrice` (`Float`) | | | `newPrice` (`Float`) | | | `contractLengthInYears` (`Int`) | | | `savingAmount` (`Float`) | | | `savingPercentage` (`Int`) | | ### ProcurementCaseCompletedError object Fields returned by the ProcurementCaseCompletedError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### ProcurementCaseCreationError object Fields returned by the ProcurementCaseCreationError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### ProcurementCaseNotFoundError object Fields returned by the ProcurementCaseNotFoundError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### ProcurementCasesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[ProcurementCasesEdge!\]](https://developers.viio.io/#procurementcasesedge-object)) | A list of edges. | | `nodes` ([\[ProcurementCase!\]](https://developers.viio.io/#procurementcase-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### ProcurementCasesEdge object An edge in a connection. | Name | Description | | ------------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([ProcurementCase!](https://developers.viio.io/#procurementcase-object)) | The item at the end of the edge. | ### ProcurementSavings object Fields returned by the ProcurementSavings object type. | Name | Description | | ------------------------- | ----------- | | `baselinePrice` (`Float`) | | | `newPrice` (`Float`) | | | `amount` (`Float`) | | | `percentage` (`Int`) | | ### ProcurementTotals object Fields returned by the ProcurementTotals object type. | Name | Description | | ------------------------- | ----------- | | `baselinePrice` (`Float`) | | | `newPrice` (`Float`) | | | `amount` (`Float`) | | | `percentage` (`Int`) | | ### UpdateProcurementCasePayload object Fields returned by the UpdateProcurementCasePayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ----------- | | `case` ([ProcurementCase](https://developers.viio.io/#procurementcase-object)) | | | `errors` ([\[UpdateProcurementCaseError!\]](https://developers.viio.io/#updateprocurementcaseerror-union)) | | ## Input Types ### CreateProcurementCaseInput input Input fields accepted by CreateProcurementCaseInput. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `state` ([ProcurementCaseState!](https://developers.viio.io/#procurementcasestate-enum)) | | | `name` (`String!`) | | | `comment` (`String`) | | | `deadline` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `renewal` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `baselineType` ([ProcurementBaselineType](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `baselinePrice` (`Float`) | | | `newPrice` (`Float`) | | | `contractLengthInYears` (`Int`) | | ### DateOperationFilterInput input Input fields accepted by DateOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------------------- | ----------- | | `eq` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `neq` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `in` ([\[Date\]](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `nin` ([\[Date\]](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `gt` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `ngt` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `gte` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `ngte` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `lt` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `nlt` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `lte` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `nlte` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | ### DateTimeOperationFilterInput input Input fields accepted by DateTimeOperationFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------- | ----------- | | `eq` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `neq` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `in` ([\[DateTime\]](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `nin` ([\[DateTime\]](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `gt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `ngt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `gte` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `ngte` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `nlt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `lte` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `nlte` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### FloatOperationFilterInput input Input fields accepted by FloatOperationFilterInput. | Name | Description | | ----------------- | ----------- | | `eq` (`Float`) | | | `neq` (`Float`) | | | `in` (`[Float]`) | | | `nin` (`[Float]`) | | | `gt` (`Float`) | | | `ngt` (`Float`) | | | `gte` (`Float`) | | | `ngte` (`Float`) | | | `lt` (`Float`) | | | `nlt` (`Float`) | | | `lte` (`Float`) | | | `nlte` (`Float`) | | ### NullableOfProcurementBaselineTypeOperationFilterInput input Input fields accepted by NullableOfProcurementBaselineTypeOperationFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `eq` ([ProcurementBaselineType](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `neq` ([ProcurementBaselineType](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `in` ([\[ProcurementBaselineType\]](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `nin` ([\[ProcurementBaselineType\]](https://developers.viio.io/#procurementbaselinetype-enum)) | | ### ProcurementCaseFilterInput input Input fields accepted by ProcurementCaseFilterInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `and` ([\[ProcurementCaseFilterInput!\]](https://developers.viio.io/#procurementcasefilterinput-input)) | | | `or` ([\[ProcurementCaseFilterInput!\]](https://developers.viio.io/#procurementcasefilterinput-input)) | | | `state` ([ProcurementCaseStateOperationFilterInput](https://developers.viio.io/#procurementcasestateoperationfilterinput-input)) | | | `completedAt` ([DateTimeOperationFilterInput](https://developers.viio.io/#datetimeoperationfilterinput-input)) | | | `name` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `deadline` ([DateOperationFilterInput](https://developers.viio.io/#dateoperationfilterinput-input)) | | | `renewal` ([DateOperationFilterInput](https://developers.viio.io/#dateoperationfilterinput-input)) | | | `baselineType` ([NullableOfProcurementBaselineTypeOperationFilterInput](https://developers.viio.io/#nullableofprocurementbaselinetypeoperationfilterinput-input)) | | | `baselinePrice` ([FloatOperationFilterInput](https://developers.viio.io/#floatoperationfilterinput-input)) | | | `newPrice` ([FloatOperationFilterInput](https://developers.viio.io/#floatoperationfilterinput-input)) | | | `savingAmount` ([FloatOperationFilterInput](https://developers.viio.io/#floatoperationfilterinput-input)) | | | `savingPercentage` ([FloatOperationFilterInput](https://developers.viio.io/#floatoperationfilterinput-input)) | | ### ProcurementCaseInput input Input fields accepted by ProcurementCaseInput. | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### ProcurementCaseSortInput input Input fields accepted by ProcurementCaseSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `state` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `completedAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `name` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `deadline` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `renewal` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `baselinePrice` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `newPrice` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `savingAmount` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `savingPercentage` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### ProcurementCaseStateOperationFilterInput input Input fields accepted by ProcurementCaseStateOperationFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------ | ----------- | | `eq` ([ProcurementCaseState](https://developers.viio.io/#procurementcasestate-enum)) | | | `neq` ([ProcurementCaseState](https://developers.viio.io/#procurementcasestate-enum)) | | | `in` ([\[ProcurementCaseState!\]](https://developers.viio.io/#procurementcasestate-enum)) | | | `nin` ([\[ProcurementCaseState!\]](https://developers.viio.io/#procurementcasestate-enum)) | | ### ProcurementSavingsInput input Input fields accepted by ProcurementSavingsInput. | Name | Description | | ---------------------------------------------------------------------------------------------- | ----------- | | `states` ([\[ProcurementCaseState!\]!](https://developers.viio.io/#procurementcasestate-enum)) | | ### UpdateProcurementCaseInput input Input fields accepted by UpdateProcurementCaseInput. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `state` ([ProcurementCaseState!](https://developers.viio.io/#procurementcasestate-enum)) | | | `name` (`String!`) | | | `comment` (`String`) | | | `deadline` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `renewal` ([Date](https://developers.viio.io/gql-schema-reference/common#date-scalar)) | | | `baselineType` ([ProcurementBaselineType](https://developers.viio.io/#procurementbaselinetype-enum)) | | | `baselinePrice` (`Float`) | | | `newPrice` (`Float`) | | | `contractLengthInYears` (`Int`) | | ## Unions ### CreateProcurementCaseError union Possible object types returned by the CreateProcurementCaseError union. Possible types: [ProcurementCaseCreationError](https://developers.viio.io/#procurementcasecreationerror-object) ### UpdateProcurementCaseError union Possible object types returned by the UpdateProcurementCaseError union. Possible types: [ProcurementCaseCompletedError](https://developers.viio.io/#procurementcasecompletederror-object), [ProcurementCaseNotFoundError](https://developers.viio.io/#procurementcasenotfounderror-object) ## Enums ### ProcurementBaselineType enum Accepted values for the ProcurementBaselineType enum. | Value | Description | | ---------------- | ----------- | | `FIRST_QUOTE` | | | `LIST_PRICE` | | | `LAST_YEAR_COST` | | ### ProcurementCaseState enum Accepted values for the ProcurementCaseState enum. | Value | Description | | ---------------- | ----------- | | `PRE` | | | `R_FX` | | | `CONTRACT` | | | `IMPLEMENTATION` | | | `COMPLETED` | | # Surveys ## Queries ### survey query Retrieve survey data from the Viio GraphQL API. ```graphql survey(id: ID!): Survey ``` **Returns:** [Survey](https://developers.viio.io/#survey-object) **Arguments for `survey`** | Name | Description | | ------------ | ----------- | | `id` (`ID!`) | | ### surveys query Retrieve surveys data from the Viio GraphQL API. ```graphql surveys(first: Int, after: String, last: Int, before: String, where: SurveyFilterInput, order: [SurveySortInput!]): SurveysConnection ``` **Returns:** [SurveysConnection](https://developers.viio.io/#surveysconnection-object) **Arguments for `surveys`** | Name | Description | | ----------------------------------------------------------------------------------- | --------------------------------------------- | | `where` ([SurveyFilterInput](https://developers.viio.io/#surveyfilterinput-input)) | | | `order` ([\[SurveySortInput!\]](https://developers.viio.io/#surveysortinput-input)) | | | `first` (`Int`) | Returns the first *n* elements from the list. | | `after` (`String`) | Returns elements after the specified cursor. | | `last` (`Int`) | Returns the last *n* elements from the list. | | `before` (`String`) | Returns elements before the specified cursor. | ## Mutations ### createSurvey mutation Run the createSurvey mutation through the Viio GraphQL API. ```graphql createSurvey(input: CreateSurveyInput!): CreateSurveyPayload! ``` **Returns:** [CreateSurveyPayload!](https://developers.viio.io/#createsurveypayload-object) **Arguments for `createSurvey`** | Name | Description | | ----------------------------------------------------------------------------------- | ----------- | | `input` ([CreateSurveyInput!](https://developers.viio.io/#createsurveyinput-input)) | | ### removeSurveys mutation Run the removeSurveys mutation through the Viio GraphQL API. ```graphql removeSurveys(where: SurveyFilterInput): RemoveSurveysPayload! ``` **Returns:** [RemoveSurveysPayload!](https://developers.viio.io/#removesurveyspayload-object) **Arguments for `removeSurveys`** | Name | Description | | ---------------------------------------------------------------------------------- | ----------- | | `where` ([SurveyFilterInput](https://developers.viio.io/#surveyfilterinput-input)) | | ### sendSurveyReminder mutation Run the sendSurveyReminder mutation through the Viio GraphQL API. ```graphql sendSurveyReminder(input: SendSurveyReminderInput!): SendSurveyReminderPayload! ``` **Returns:** [SendSurveyReminderPayload!](https://developers.viio.io/#sendsurveyreminderpayload-object) **Arguments for `sendSurveyReminder`** | Name | Description | | ----------------------------------------------------------------------------------------------- | ----------- | | `input` ([SendSurveyReminderInput!](https://developers.viio.io/#sendsurveyreminderinput-input)) | | ### sendTestSurvey mutation Run the sendTestSurvey mutation through the Viio GraphQL API. ```graphql sendTestSurvey(input: SendTestSurveyInput!): SendTestSurveyPayload! ``` **Returns:** [SendTestSurveyPayload!](https://developers.viio.io/#sendtestsurveypayload-object) **Arguments for `sendTestSurvey`** | Name | Description | | --------------------------------------------------------------------------------------- | ----------- | | `input` ([SendTestSurveyInput!](https://developers.viio.io/#sendtestsurveyinput-input)) | | ## Objects ### CreateSurveyPayload object Fields returned by the CreateSurveyPayload object type. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `survey` ([CreatedSurvey](https://developers.viio.io/#createdsurvey-union)) | | | `errors` ([\[CreateSurveyError!\]](https://developers.viio.io/#createsurveyerror-union)) | | ### FailedToCreateSurveyError object Fields returned by the FailedToCreateSurveyError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FailedToRemoveSurveysError object Fields returned by the FailedToRemoveSurveysError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### InProgressSurveyReminderStatus object Fields returned by the InProgressSurveyReminderStatus object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `initiatedAt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | ### ProductSurveyScope object Fields returned by the ProductSurveyScope object type. | Name | Description | | -------------------------------------------------------------------------------------------------- | ----------- | | `productId` (`ID!`) | | | `vendorId` (`ID`) | | | `vendorName` (`String`) | | | `product` ([Product](https://developers.viio.io/gql-schema-reference/discovery#product-interface)) | | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | ### RemoveSurveysPayload object Fields returned by the RemoveSurveysPayload object type. | Name | Description | | ---------------------------------------------------------------------------------------- | ----------- | | `removedCount` (`Int`) | | | `errors` ([\[RemoveSurveyError!\]](https://developers.viio.io/#removesurveyerror-union)) | | ### SendSurveyError object Fields returned by the SendSurveyError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### SendSurveyReminderPayload object Fields returned by the SendSurveyReminderPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `survey` ([CreatedSurvey](https://developers.viio.io/#createdsurvey-union)) | | | `errors` ([\[SurveyReminderError!\]](https://developers.viio.io/#surveyremindererror-union)) | | ### SendTestSurveyPayload object Fields returned by the SendTestSurveyPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `ok` (`Boolean!`) | | | `errors` ([\[SendTestSurveyError!\]](https://developers.viio.io/#sendtestsurveyerror-union)) | | ### SentSurveyReminderStatus object Fields returned by the SentSurveyReminderStatus object type. | Name | Description | | -------------------------- | ----------- | | `recipientsCount` (`Int!`) | | ### Survey object Fields returned by the Survey object type. | Name | Description | | ------------------------------------------------------------------------------------------------------------------ | ----------- | | `id` (`ID!`) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `createdByUserId` (`ID!`) | | | `status` ([SurveyStatus!](https://developers.viio.io/#surveystatus-enum)) | | | `sentAt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `channels` ([\[SurveyChannel!\]!](https://developers.viio.io/#surveychannel-object)) | | | `title` (`String!`) | | | `context` ([SurveyContext!](https://developers.viio.io/#surveycontext-enum)) | | | `scope` ([SurveyScope!](https://developers.viio.io/#surveyscope-union)) | | | `messages` ([SurveyMessages!](https://developers.viio.io/#surveymessages-object)) | | | `recipientsSelection` ([SurveyRecipientsSelection!](https://developers.viio.io/#surveyrecipientsselection-object)) | | | `reminders` ([\[SurveyReminder!\]!](https://developers.viio.io/#surveyreminder-object)) | | | `questions` ([\[SurveyQuestion!\]](https://developers.viio.io/#surveyquestion-interface)) | | | `completion` ([SurveyCompletion!](https://developers.viio.io/#surveycompletion-object)) | | | `responses` ([SurveyResponsesConnection](https://developers.viio.io/#surveyresponsesconnection-object)) | | | `createdBy` ([User](https://developers.viio.io/gql-schema-reference/tenant#user-object)) | | ### SurveyApplicationUserRecipientsSelection object Which of the product's users the survey goes to. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------ | | `applicationUserIds` (`[ID!]`) | Only these application users. | | `groupIds` (`[ID!]`) | Only application users in these employee groups. | | `dataSources` ([\[DiscoverySourceName!\]](https://developers.viio.io/gql-schema-reference/discovery#discoverysourcename-enum)) | Only application users seen in these sources. | ### SurveyChannel object Fields returned by the SurveyChannel object type. | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `type` ([SurveyChannelType!](https://developers.viio.io/#surveychanneltype-enum)) | | ### SurveyCompletion object Fields returned by the SurveyCompletion object type. | Name | Description | | --------------------- | ----------- | | `recipients` (`Int!`) | | | `responses` (`Int!`) | | | `rate` (`Float!`) | | ### SurveyEmployeeRecipientsSelection object Which employees the survey goes to. | Name | Description | | ----------------------- | ------------------------------- | | `employeeIds` (`[ID!]`) | Only these employees. | | `groupIds` (`[ID!]`) | Only employees in these groups. | ### SurveyMessages object Fields returned by the SurveyMessages object type. | Name | Description | | -------------------------- | ----------- | | `introduction` (`String!`) | | ### SurveyNotFoundError object Fields returned by the SurveyNotFoundError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### SurveyRecipientsSelection object Who the survey goes to. | Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | | `employees` ([SurveyEmployeeRecipientsSelection](https://developers.viio.io/#surveyemployeerecipientsselection-object)) | The employees included. | | `applicationUsers` ([SurveyApplicationUserRecipientsSelection](https://developers.viio.io/#surveyapplicationuserrecipientsselection-object)) | The application users included. | | `emails` (`[String!]`) | The email addresses included. | ### SurveyReminder object Fields returned by the SurveyReminder object type. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `type` ([SurveyReminderType!](https://developers.viio.io/#surveyremindertype-enum)) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `status` ([SurveyReminderStatus!](https://developers.viio.io/#surveyreminderstatus-union)) | | ### SurveyReminderAlreadyInProgressError object Fields returned by the SurveyReminderAlreadyInProgressError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### SurveyReminderNoRecipientsError object Fields returned by the SurveyReminderNoRecipientsError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### SurveyResponse object Fields returned by the SurveyResponse object type. | Name | Description | | ---------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `recipient` ([SurveyResponseRecipient!](https://developers.viio.io/#surveyresponserecipient-object)) | | | `createdAt` ([DateTime!](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `completedAt` ([DateTime](https://developers.viio.io/gql-schema-reference/common#datetime-scalar)) | | | `answers` ([\[SurveyAnswer!\]!](https://developers.viio.io/#surveyanswer-interface)) | | ### SurveyResponseRecipient object Fields returned by the SurveyResponseRecipient object type. | Name | Description | | ---------------------- | ----------- | | `email` (`String!`) | | | `employeeId` (`ID`) | | | `firstName` (`String`) | | | `lastName` (`String`) | | ### SurveyResponsesConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[SurveyResponsesEdge!\]](https://developers.viio.io/#surveyresponsesedge-object)) | A list of edges. | | `nodes` ([\[SurveyResponse!\]](https://developers.viio.io/#surveyresponse-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### SurveyResponsesEdge object An edge in a connection. | Name | Description | | ----------------------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([SurveyResponse!](https://developers.viio.io/#surveyresponse-object)) | The item at the end of the edge. | ### SurveysConnection object A connection to a list of items. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `pageInfo` ([PageInfo!](https://developers.viio.io/gql-schema-reference/common#pageinfo-object)) | Information to aid in pagination. | | `edges` ([\[SurveysEdge!\]](https://developers.viio.io/#surveysedge-object)) | A list of edges. | | `nodes` ([\[Survey!\]](https://developers.viio.io/#survey-object)) | A flattened list of the nodes. | | `totalCount` (`Int!`) | Identifies the total count of items in the connection. | ### SurveysEdge object An edge in a connection. | Name | Description | | ------------------------------------------------------------- | -------------------------------- | | `cursor` (`String!`) | A cursor for use in pagination. | | `node` ([Survey!](https://developers.viio.io/#survey-object)) | The item at the end of the edge. | ### VendorSurveyScope object Fields returned by the VendorSurveyScope object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `vendorId` (`ID!`) | | | `vendorName` (`String`) | | | `vendor` ([Vendor](https://developers.viio.io/gql-schema-reference/discovery#vendor-object)) | | ## Input Types ### ComparableEmployeeOperationFilterInput input Matches any of the given IDs. | Name | Description | | --------------- | ----------------- | | `in` (`[ID!]!`) | The IDs to match. | ### ComparableUserOperationFilterInput input Matches any of the given IDs. | Name | Description | | --------------- | ----------------- | | `in` (`[ID!]!`) | The IDs to match. | ### CreateSurveyDefinitionInput input A survey to create. | Name | Description | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | | `title` (`String!`) | The survey's name. | | `context` ([SurveyContext!](https://developers.viio.io/#surveycontext-enum)) | Whether one response is collected per license or per person. | | `scope` ([SurveyScopeInput!](https://developers.viio.io/#surveyscopeinput-input)) | The product or vendor the survey is about. | | `channels` ([\[SurveyChannelInput!\]!](https://developers.viio.io/#surveychannelinput-input)) | Where the survey is delivered. | | `messages` ([SurveyMessagesInput!](https://developers.viio.io/#surveymessagesinput-input)) | The texts recipients see. | | `questions` ([\[SurveyQuestionInput!\]!](https://developers.viio.io/#surveyquestioninput-input)) | The questions to ask, in order. | | `recipients` ([SurveyRecipientsInput!](https://developers.viio.io/#surveyrecipientsinput-input)) | Who receives the survey. | ### CreateSurveyInput input What to create. | Name | Description | | ------------------------------------------------------------------------------------------------------- | --------------------- | | `survey` ([CreateSurveyDefinitionInput](https://developers.viio.io/#createsurveydefinitioninput-input)) | The survey to create. | ### DataSourceFilterInput input Matches any of the given sources. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------- | --------------------- | | `in` ([\[DiscoverySourceName!\]!](https://developers.viio.io/gql-schema-reference/discovery#discoverysourcename-enum)) | The sources to match. | ### ListComparableEmployeeOperationFilterInput input Matches when at least one entry matches. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------- | ----------------------- | | `some` ([ComparableEmployeeOperationFilterInput!](https://developers.viio.io/#comparableemployeeoperationfilterinput-input)) | The condition to match. | ### ListComparableUserOperationFilterInput input Matches when at least one entry matches. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------------------- | | `some` ([ComparableUserOperationFilterInput!](https://developers.viio.io/#comparableuseroperationfilterinput-input)) | The condition to match. | ### SendSurveyReminderInput input Input fields accepted by SendSurveyReminderInput. | Name | Description | | ------------------ | ----------- | | `surveyId` (`ID!`) | | ### SendTestRecipientEmailInput input Input fields accepted by SendTestRecipientEmailInput. | Name | Description | | ---------------------- | ----------- | | `email` (`String!`) | | | `firstName` (`String`) | | | `lastName` (`String`) | | ### SendTestRecipientInput input Input fields accepted by SendTestRecipientInput. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------------------------------------- | | `slack` ([SendTestRecipientSlackInput](https://developers.viio.io/#sendtestrecipientslackinput-input)) | | | `email` ([SendTestRecipientEmailInput](https://developers.viio.io/#sendtestrecipientemailinput-input)) | | | `teams` ([SendTestRecipientTeamsInput](https://developers.viio.io/#sendtestrecipientteamsinput-input)) | Sends the test survey to Microsoft Teams. | ### SendTestRecipientSlackInput input Input fields accepted by SendTestRecipientSlackInput. | Name | Description | | ---------------------- | ----------- | | `sourceId` (`String!`) | | | `tenant` (`String!`) | | ### SendTestRecipientTeamsInput input Microsoft Teams recipient details for a test survey. | Name | Description | | ---------------------- | ------------------------------------------------- | | `sourceId` (`String!`) | Microsoft Entra object ID of the recipient. | | `tenant` (`String!`) | Microsoft Entra tenant ID of the recipient. | | `firstName` (`String`) | First name displayed in the survey card greeting. | ### SendTestSurveyDefinitionInput input Input fields accepted by SendTestSurveyDefinitionInput. | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `recipient` ([SendTestRecipientInput!](https://developers.viio.io/#sendtestrecipientinput-input)) | | | `title` (`String!`) | | | `context` ([SurveyContext!](https://developers.viio.io/#surveycontext-enum)) | | | `scope` ([SurveyScopeInput!](https://developers.viio.io/#surveyscopeinput-input)) | | | `messages` ([SurveyMessagesInput!](https://developers.viio.io/#surveymessagesinput-input)) | | | `questions` ([\[SurveyQuestionInput!\]!](https://developers.viio.io/#surveyquestioninput-input)) | | ### SendTestSurveyInput input Input fields accepted by SendTestSurveyInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `survey` ([SendTestSurveyDefinitionInput](https://developers.viio.io/#sendtestsurveydefinitioninput-input)) | | ### SurveyAnswerFilterInput input Input fields accepted by SurveyAnswerFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | | `questionKey` (`String!`) | | | `yesNo` ([BooleanOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#booleanoperationfilterinput-input)) | | | `rating` ([IntOperationFilterInput](https://developers.viio.io/gql-schema-reference/discovery#intoperationfilterinput-input)) | | | `text` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `selectedOption` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `otherText` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `answered` (`Boolean`) | | ### SurveyApplicationUsersInput input Which of the product's users to pick. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | | `id` ([ComparableUserOperationFilterInput](https://developers.viio.io/#comparableuseroperationfilterinput-input)) | Only these application users. | | `groupIds` ([ListComparableUserOperationFilterInput](https://developers.viio.io/#listcomparableuseroperationfilterinput-input)) | Only application users in these employee groups. | | `dataSource` ([DataSourceFilterInput](https://developers.viio.io/#datasourcefilterinput-input)) | Only application users seen in these sources. | ### SurveyChannelInput input Input fields accepted by SurveyChannelInput. | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `type` ([SurveyChannelType!](https://developers.viio.io/#surveychanneltype-enum)) | | ### SurveyConditionGroupInput input Input fields accepted by SurveyConditionGroupInput. | Name | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | `operator` ([SurveyConditionGroupOperator!](https://developers.viio.io/#surveyconditiongroupoperator-enum)) | | | `rules` ([\[SurveyConditionRuleInput!\]!](https://developers.viio.io/#surveyconditionruleinput-input)) | | ### SurveyConditionRuleInput input Input fields accepted by SurveyConditionRuleInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `yesNo` ([SurveyYesNoConditionRuleInput](https://developers.viio.io/#surveyyesnoconditionruleinput-input)) | | | `ratingValue` ([SurveyRatingValueConditionRuleInput](https://developers.viio.io/#surveyratingvalueconditionruleinput-input)) | | | `ratingBetween` ([SurveyRatingBetweenConditionRuleInput](https://developers.viio.io/#surveyratingbetweenconditionruleinput-input)) | | | `radioGroupOption` ([SurveyRadioGroupOptionConditionRuleInput](https://developers.viio.io/#surveyradiogroupoptionconditionruleinput-input)) | | | `radioGroupOther` ([SurveyRadioGroupOtherConditionRuleInput](https://developers.viio.io/#surveyradiogroupotherconditionruleinput-input)) | | ### SurveyEmployeesInput input Which employees to pick. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | | `id` ([ComparableEmployeeOperationFilterInput](https://developers.viio.io/#comparableemployeeoperationfilterinput-input)) | Only these employees. | | `groupIds` ([ListComparableEmployeeOperationFilterInput](https://developers.viio.io/#listcomparableemployeeoperationfilterinput-input)) | Only employees in these groups. | ### SurveyFilterInput input Input fields accepted by SurveyFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[SurveyFilterInput!\]](https://developers.viio.io/#surveyfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[SurveyFilterInput!\]](https://developers.viio.io/#surveyfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `id` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `title` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `status` ([SurveyStatusOperationFilterInput](https://developers.viio.io/#surveystatusoperationfilterinput-input)) | | | `createdAt` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `productId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `vendorId` ([ComparableIdTypeOperationFilterInput](https://developers.viio.io/gql-schema-reference/common#comparableidtypeoperationfilterinput-input)) | | | `vendorName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### SurveyLongTextQuestionInput input Input fields accepted by SurveyLongTextQuestionInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | | `conditions` ([SurveyConditionGroupInput](https://developers.viio.io/#surveyconditiongroupinput-input)) | | ### SurveyMessagesInput input Input fields accepted by SurveyMessagesInput. | Name | Description | | -------------------------- | ----------- | | `introduction` (`String!`) | | ### SurveyQuestionInput input Input fields accepted by SurveyQuestionInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `rating` ([SurveyRatingQuestionInput](https://developers.viio.io/#surveyratingquestioninput-input)) | | | `radioGroup` ([SurveyRadioGroupQuestionInput](https://developers.viio.io/#surveyradiogroupquestioninput-input)) | | | `yesNo` ([SurveyYesNoQuestionInput](https://developers.viio.io/#surveyyesnoquestioninput-input)) | | | `shortText` ([SurveyShortTextQuestionInput](https://developers.viio.io/#surveyshorttextquestioninput-input)) | | | `longText` ([SurveyLongTextQuestionInput](https://developers.viio.io/#surveylongtextquestioninput-input)) | | ### SurveyRadioGroupOptionConditionRuleInput input Input fields accepted by SurveyRadioGroupOptionConditionRuleInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `operator` ([SurveyRadioGroupConditionOperator!](https://developers.viio.io/#surveyradiogroupconditionoperator-enum)) | | | `optionKey` (`String!`) | | | `questionKey` (`String!`) | | ### SurveyRadioGroupOptionInput input Input fields accepted by SurveyRadioGroupOptionInput. | Name | Description | | ------------------- | ----------- | | `key` (`String!`) | | | `value` (`String!`) | | ### SurveyRadioGroupOtherConditionRuleInput input Input fields accepted by SurveyRadioGroupOtherConditionRuleInput. | Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ----------- | | `operator` ([SurveyRadioGroupConditionOperator!](https://developers.viio.io/#surveyradiogroupconditionoperator-enum)) | | | `questionKey` (`String!`) | | ### SurveyRadioGroupQuestionInput input Input fields accepted by SurveyRadioGroupQuestionInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------- | ----------- | | `options` ([\[SurveyRadioGroupOptionInput!\]!](https://developers.viio.io/#surveyradiogroupoptioninput-input)) | | | `allowOther` (`Boolean!`) | | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | | `conditions` ([SurveyConditionGroupInput](https://developers.viio.io/#surveyconditiongroupinput-input)) | | ### SurveyRatingBetweenConditionRuleInput input Input fields accepted by SurveyRatingBetweenConditionRuleInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `operator` ([SurveyRatingConditionOperator!](https://developers.viio.io/#surveyratingconditionoperator-enum)) | | | `from` (`Int!`) | | | `to` (`Int!`) | | | `questionKey` (`String!`) | | ### SurveyRatingQuestionInput input Input fields accepted by SurveyRatingQuestionInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `scale` (`Int!`) | | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | | `conditions` ([SurveyConditionGroupInput](https://developers.viio.io/#surveyconditiongroupinput-input)) | | ### SurveyRatingValueConditionRuleInput input Input fields accepted by SurveyRatingValueConditionRuleInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------- | ----------- | | `operator` ([SurveyRatingConditionOperator!](https://developers.viio.io/#surveyratingconditionoperator-enum)) | | | `value` (`Int!`) | | | `questionKey` (`String!`) | | ### SurveyRecipientsInput input Who a survey goes to. | Name | Description | | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | `employees` ([SurveyEmployeesInput](https://developers.viio.io/#surveyemployeesinput-input)) | Employees to include. | | `applicationUsers` ([SurveyApplicationUsersInput](https://developers.viio.io/#surveyapplicationusersinput-input)) | People who use the survey's product. | | `emails` (`[String!]`) | Email addresses to include, employee or not. | ### SurveyResponseFilterInput input Input fields accepted by SurveyResponseFilterInput. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[SurveyResponseFilterInput!\]](https://developers.viio.io/#surveyresponsefilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[SurveyResponseFilterInput!\]](https://developers.viio.io/#surveyresponsefilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `recipient` ([SurveyResponseRecipientFilterInput](https://developers.viio.io/#surveyresponserecipientfilterinput-input)) | | | `completedAt` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `createdAt` ([DateTimeOperationFilterInput](https://developers.viio.io/gql-schema-reference/procurement#datetimeoperationfilterinput-input)) | | | `answers` ([\[SurveyAnswerFilterInput!\]](https://developers.viio.io/#surveyanswerfilterinput-input)) | Filter responses by their answers. Entries combine as AND. | ### SurveyResponseRecipientFilterInput input Input fields accepted by SurveyResponseRecipientFilterInput. | Name | Description | | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | `and` ([\[SurveyResponseRecipientFilterInput!\]](https://developers.viio.io/#surveyresponserecipientfilterinput-input)) | Matches when every one of the given filter expressions matches (logical AND). | | `or` ([\[SurveyResponseRecipientFilterInput!\]](https://developers.viio.io/#surveyresponserecipientfilterinput-input)) | Matches when at least one of the given filter expressions matches (logical OR). | | `email` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `firstName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | | `lastName` ([StringOperationFilterInput](https://developers.viio.io/gql-schema-reference/accounts#stringoperationfilterinput-input)) | | ### SurveyResponseRecipientSortInput input Input fields accepted by SurveyResponseRecipientSortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `email` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `firstName` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `lastName` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### SurveyResponseSortInput input Input fields accepted by SurveyResponseSortInput. | Name | Description | | -------------------------------------------------------------------------------------------------------------------- | ----------- | | `recipient` ([SurveyResponseRecipientSortInput](https://developers.viio.io/#surveyresponserecipientsortinput-input)) | | | `completedAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `createdAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### SurveyScopeInput input Input fields accepted by SurveyScopeInput. | Name | Description | | ------------------ | ----------- | | `productId` (`ID`) | | | `vendorId` (`ID`) | | ### SurveyShortTextQuestionInput input Input fields accepted by SurveyShortTextQuestionInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | | `conditions` ([SurveyConditionGroupInput](https://developers.viio.io/#surveyconditiongroupinput-input)) | | ### SurveySortInput input Input fields accepted by SurveySortInput. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `id` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | | `createdAt` ([SortEnumType](https://developers.viio.io/gql-schema-reference/common#sortenumtype-enum)) | | ### SurveyStatusOperationFilterInput input Input fields accepted by SurveyStatusOperationFilterInput. | Name | Description | | -------------------------------------------------------------------------- | --------------------------------------------------------------------- | | `eq` ([SurveyStatus](https://developers.viio.io/#surveystatus-enum)) | Matches when the field value is exactly equal to the given value. | | `neq` ([SurveyStatus](https://developers.viio.io/#surveystatus-enum)) | Matches when the field value is not equal to the given value. | | `in` ([\[SurveyStatus!\]](https://developers.viio.io/#surveystatus-enum)) | Matches when the field value is one of the values in the given list. | | `nin` ([\[SurveyStatus!\]](https://developers.viio.io/#surveystatus-enum)) | Matches when the field value is none of the values in the given list. | ### SurveyYesNoConditionRuleInput input Input fields accepted by SurveyYesNoConditionRuleInput. | Name | Description | | ---------------------------- | ----------- | | `expectedValue` (`Boolean!`) | | | `questionKey` (`String!`) | | ### SurveyYesNoQuestionInput input Input fields accepted by SurveyYesNoQuestionInput. | Name | Description | | ------------------------------------------------------------------------------------------------------- | ----------- | | `yesLabel` (`String!`) | | | `noLabel` (`String!`) | | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | | `conditions` ([SurveyConditionGroupInput](https://developers.viio.io/#surveyconditiongroupinput-input)) | | ## Interfaces ### SurveyAnswer interface Fields defined by the SurveyAnswer interface. | Name | Description | | -------------------------- | ----------- | | `questionKey` (`String!`) | | | `displayValue` (`String!`) | | ### SurveyQuestion interface Fields defined by the SurveyQuestion interface. | Name | Description | | ------------------------ | ----------- | | `key` (`String!`) | | | `title` (`String!`) | | | `description` (`String`) | | | `required` (`Boolean!`) | | ## Unions ### CreatedSurvey union Possible object types returned by the CreatedSurvey union. Possible types: [Survey](https://developers.viio.io/#survey-object) ### CreateSurveyError union Possible object types returned by the CreateSurveyError union. Possible types: [FailedToCreateSurveyError](https://developers.viio.io/#failedtocreatesurveyerror-object) ### RemoveSurveyError union Possible object types returned by the RemoveSurveyError union. Possible types: [FailedToRemoveSurveysError](https://developers.viio.io/#failedtoremovesurveyserror-object) ### SendTestSurveyError union Possible object types returned by the SendTestSurveyError union. Possible types: [SendSurveyError](https://developers.viio.io/#sendsurveyerror-object) ### SurveyReminderError union Possible object types returned by the SurveyReminderError union. Possible types: [SurveyNotFoundError](https://developers.viio.io/#surveynotfounderror-object), [SurveyReminderAlreadyInProgressError](https://developers.viio.io/#surveyreminderalreadyinprogresserror-object), [SurveyReminderNoRecipientsError](https://developers.viio.io/#surveyremindernorecipientserror-object) ### SurveyReminderStatus union Possible object types returned by the SurveyReminderStatus union. Possible types: [SentSurveyReminderStatus](https://developers.viio.io/#sentsurveyreminderstatus-object), [InProgressSurveyReminderStatus](https://developers.viio.io/#inprogresssurveyreminderstatus-object) ### SurveyScope union Possible object types returned by the SurveyScope union. Possible types: [ProductSurveyScope](https://developers.viio.io/#productsurveyscope-object), [VendorSurveyScope](https://developers.viio.io/#vendorsurveyscope-object) ## Enums ### SurveyChannelType enum Accepted values for the SurveyChannelType enum. | Value | Description | | ------- | ----------- | | `SLACK` | | | `EMAIL` | | | `TEAMS` | | ### SurveyConditionGroupOperator enum Accepted values for the SurveyConditionGroupOperator enum. | Value | Description | | ----- | ----------- | | `AND` | | | `OR` | | ### SurveyContext enum Accepted values for the SurveyContext enum. | Value | Description | | --------- | ----------- | | `LICENSE` | | | `USER` | | ### SurveyRadioGroupConditionOperator enum Accepted values for the SurveyRadioGroupConditionOperator enum. | Value | Description | | ------------ | ----------- | | `EQUALS` | | | `NOT_EQUALS` | | ### SurveyRatingConditionOperator enum Accepted values for the SurveyRatingConditionOperator enum. | Value | Description | | -------------- | ----------- | | `EQUALS` | | | `NOT_EQUALS` | | | `GREATER_THAN` | | | `LESS_THAN` | | | `BETWEEN` | | ### SurveyReminderType enum Accepted values for the SurveyReminderType enum. | Value | Description | | -------- | ----------- | | `MANUAL` | | ### SurveyStatus enum Accepted values for the SurveyStatus enum. | Value | Description | | ------------- | ----------- | | `CREATED` | | | `IN_PROGRESS` | | | `SENT` | | # Tenant ## Queries ### workspace query Retrieve workspace data from the Viio GraphQL API. ```graphql workspace(): Workspace! ``` **Returns:** [Workspace!](https://developers.viio.io/#workspace-object) This operation has no arguments. ### workspaceUsers query Retrieve workspaceUsers data from the Viio GraphQL API. ```graphql workspaceUsers(skip: Int, take: Int, search: String): WorkspaceUsersCollectionSegment ``` **Returns:** [WorkspaceUsersCollectionSegment](https://developers.viio.io/#workspaceuserscollectionsegment-object) **Arguments for `workspaceUsers`** | Name | Description | | ------------------- | ----------- | | `skip` (`Int`) | | | `take` (`Int`) | | | `search` (`String`) | | ## Mutations ### updateWorkspaceName mutation Run the updateWorkspaceName mutation through the Viio GraphQL API. ```graphql updateWorkspaceName(input: UpdateWorkspaceNameInput!): UpdateWorkspaceNamePayload! ``` **Returns:** [UpdateWorkspaceNamePayload!](https://developers.viio.io/#updateworkspacenamepayload-object) **Arguments for `updateWorkspaceName`** | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateWorkspaceNameInput!](https://developers.viio.io/#updateworkspacenameinput-input)) | | ### changeCurrency mutation Run the changeCurrency mutation through the Viio GraphQL API. ```graphql changeCurrency(input: ChangeCurrencyInput!): ChangeCurrencyPayload! ``` **Returns:** [ChangeCurrencyPayload!](https://developers.viio.io/#changecurrencypayload-object) **Arguments for `changeCurrency`** | Name | Description | | --------------------------------------------------------------------------------------- | ----------- | | `input` ([ChangeCurrencyInput!](https://developers.viio.io/#changecurrencyinput-input)) | | ### updateWorkspaceDataRetentionSettings mutation Run the updateWorkspaceDataRetentionSettings mutation through the Viio GraphQL API. ```graphql updateWorkspaceDataRetentionSettings(input: UpdateWorkspaceDataRetentionSettingsInput!): UpdateWorkspaceDataRetentionSettingsPayload! ``` **Returns:** [UpdateWorkspaceDataRetentionSettingsPayload!](https://developers.viio.io/#updateworkspacedataretentionsettingspayload-object) **Arguments for `updateWorkspaceDataRetentionSettings`** | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `input` ([UpdateWorkspaceDataRetentionSettingsInput!](https://developers.viio.io/#updateworkspacedataretentionsettingsinput-input)) | | ### removeWorkspaceUser mutation Run the removeWorkspaceUser mutation through the Viio GraphQL API. ```graphql removeWorkspaceUser(input: RemoveWorkspaceUserInput!): RemoveWorkspaceUserPayload! ``` **Returns:** [RemoveWorkspaceUserPayload!](https://developers.viio.io/#removeworkspaceuserpayload-object) **Arguments for `removeWorkspaceUser`** | Name | Description | | ------------------------------------------------------------------------------------------------- | ----------- | | `input` ([RemoveWorkspaceUserInput!](https://developers.viio.io/#removeworkspaceuserinput-input)) | | ## Objects ### BillingInfo object Fields returned by the BillingInfo object type. | Name | Description | | ----------------------- | ----------- | | `accessUrl` (`String!`) | | ### ChangeCurrencyPayload object Fields returned by the ChangeCurrencyPayload object type. | Name | Description | | -------------------------------------------------------------------------------------------- | ----------- | | `workspace` ([Workspace](https://developers.viio.io/#workspace-object)) | | | `errors` ([\[ChangeCurrencyError!\]](https://developers.viio.io/#changecurrencyerror-union)) | | ### DataRetentionSettings object Fields returned by the DataRetentionSettings object type. | Name | Description | | -------------------------------- | ----------- | | `retentionPeriodMonths` (`Int!`) | | ### FailedToChangeCurrencyError object Fields returned by the FailedToChangeCurrencyError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FailedToUpdateDataRetentionSettingsError object Fields returned by the FailedToUpdateDataRetentionSettingsError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FailedToUpdateWorkspaceNameError object Fields returned by the FailedToUpdateWorkspaceNameError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### FinanceDataAccess object Fields returned by the FinanceDataAccess object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------- | ----------- | | `cost` ([FinanceDataAccessAttributes!](https://developers.viio.io/#financedataaccessattributes-object)) | | | `payment` ([FinanceDataAccessAttributes!](https://developers.viio.io/#financedataaccessattributes-object)) | | ### FinanceDataAccessAttributes object Fields returned by the FinanceDataAccessAttributes object type. | Name | Description | | ---------------------- | ----------- | | `enabled` (`Boolean!`) | | ### ForbiddenToRemoveOrganizationOwnerError object Fields returned by the ForbiddenToRemoveOrganizationOwnerError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### Logo object Fields returned by the Logo object type. | Name | Description | | --------------------------------------------------------------------------------- | ----------- | | `url` ([URL!](https://developers.viio.io/gql-schema-reference/common#url-scalar)) | | ### NotSupportedCurrencyCodeError object Fields returned by the NotSupportedCurrencyCodeError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### RemoveWorkspaceUserPayload object Fields returned by the RemoveWorkspaceUserPayload object type. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `user` ([WorkspaceUser](https://developers.viio.io/#workspaceuser-object)) | | | `errors` ([\[RemoveWorkspaceUserError!\]](https://developers.viio.io/#removeworkspaceusererror-union)) | | ### UpdateWorkspaceDataRetentionSettingsPayload object Fields returned by the UpdateWorkspaceDataRetentionSettingsPayload object type. | Name | Description | | ---------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | `workspace` ([Workspace](https://developers.viio.io/#workspace-object)) | | | `errors` ([\[UpdateWorkspaceDataRetentionSettingsError!\]](https://developers.viio.io/#updateworkspacedataretentionsettingserror-union)) | | ### UpdateWorkspaceNamePayload object Fields returned by the UpdateWorkspaceNamePayload object type. | Name | Description | | ------------------------------------------------------------------------------------------------------ | ----------- | | `workspace` ([Workspace](https://developers.viio.io/#workspace-object)) | | | `errors` ([\[UpdateWorkspaceNameError!\]](https://developers.viio.io/#updateworkspacenameerror-union)) | | ### User object Fields returned by the User object type. | Name | Description | | ----------------------- | ----------- | | `id` (`ID!`) | | | `email` (`String!`) | | | `firstName` (`String!`) | | | `lastName` (`String`) | | | `role` (`String!`) | | ### UserProfile object Fields returned by the UserProfile object type. | Name | Description | | ------------------------------------------------------------------------ | ----------- | | `id` (`ID!`) | | | `email` (`String!`) | | | `name` (`String!`) | | | `roles` (`[String!]!`) | | | `features` (`[String!]!`) | | | `intercomUserHash` (`String!`) | | | `status` (`String!`) | | | `customer` ([Workspace!](https://developers.viio.io/#workspace-object)) | | | `workspace` ([Workspace!](https://developers.viio.io/#workspace-object)) | | ### Workspace object Fields returned by the Workspace object type. | Name | Description | | --------------------------------------------------------------------------------------------------------------- | ----------- | | `id` (`ID!`) | | | `name` (`String!`) | | | `primaryDomain` (`String!`) | | | `currency` (`String!`) | | | `companyLogo` ([Logo](https://developers.viio.io/#logo-object)) | | | `attributes` ([\[WorkspaceAttribute!\]!](https://developers.viio.io/#workspaceattribute-object)) | | | `dataRetentionSettings` ([DataRetentionSettings!](https://developers.viio.io/#dataretentionsettings-object)) | | | `domain` (`String!`) | | | `billing` ([BillingInfo](https://developers.viio.io/#billinginfo-object)) | | | `subscription` ([WorkspaceSubscription!](https://developers.viio.io/#workspacesubscription-object)) | | | `dataAccess` ([WorkspaceDataAvailability!](https://developers.viio.io/#workspacedataavailability-object)) | | | `dataAvailability` ([WorkspaceDataAvailability!](https://developers.viio.io/#workspacedataavailability-object)) | | | `features` (`[String!]!`) | | | `isRestrictedAccess` (`Boolean!`) | | ### WorkspaceAttribute object Fields returned by the WorkspaceAttribute object type. | Name | Description | | ------------------- | ----------- | | `key` (`String!`) | | | `value` (`String!`) | | ### WorkspaceDataAvailability object Fields returned by the WorkspaceDataAvailability object type. | Name | Description | | ----------------------------------------------------------------------------------------------------------------------------- | ----------- | | `finance` ([FinanceDataAccess](https://developers.viio.io/#financedataaccess-object)) | | | `ad` ([AdIntegrationDataAccess](https://developers.viio.io/gql-schema-reference/integrations#adintegrationdataaccess-object)) | | ### WorkspaceSubscription object Subscription of the workspace. | Name | Description | | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | `kind` ([WorkspaceSubscriptionKind!](https://developers.viio.io/#workspacesubscriptionkind-enum)) | Kind of the subscription. | | `planId` (`String!`) | Purchased plan, e.g. paid-12-eur or enterprise\_bill\_12. | ### WorkspaceUser object Fields returned by the WorkspaceUser object type. | Name | Description | | ------------------------- | ----------- | | `id` (`String!`) | | | `email` (`String!`) | | | `fullName` (`String!`) | | | `legacyUserId` (`String`) | | | `role` (`String!`) | | ### WorkspaceUserNotFoundError object Fields returned by the WorkspaceUserNotFoundError object type. | Name | Description | | --------------------- | ----------- | | `message` (`String!`) | | ### WorkspaceUsersCollectionSegment object A segment of a collection. | Name | Description | | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | | `pageInfo` ([CollectionSegmentInfo!](https://developers.viio.io/gql-schema-reference/people-organization#collectionsegmentinfo-object)) | Information to aid in pagination. | | `items` ([\[WorkspaceUser!\]](https://developers.viio.io/#workspaceuser-object)) | A flattened list of the items. | | `totalCount` (`Int!`) | | ## Input Types ### ChangeCurrencyInput input Input fields accepted by ChangeCurrencyInput. | Name | Description | | ---------------------- | ----------- | | `currency` (`String!`) | | ### RemoveWorkspaceUserInput input Input fields accepted by RemoveWorkspaceUserInput. | Name | Description | | -------------------- | ----------- | | `userId` (`String!`) | | ### UpdateWorkspaceDataRetentionSettingsInput input Input fields accepted by UpdateWorkspaceDataRetentionSettingsInput. | Name | Description | | -------------------------------- | ----------- | | `retentionPeriodMonths` (`Int!`) | | ### UpdateWorkspaceNameInput input Input fields accepted by UpdateWorkspaceNameInput. | Name | Description | | ------------------ | ----------- | | `name` (`String!`) | | ## Unions ### ChangeCurrencyError union Possible object types returned by the ChangeCurrencyError union. Possible types: [FailedToChangeCurrencyError](https://developers.viio.io/#failedtochangecurrencyerror-object), [NotSupportedCurrencyCodeError](https://developers.viio.io/#notsupportedcurrencycodeerror-object) ### RemoveWorkspaceUserError union Possible object types returned by the RemoveWorkspaceUserError union. Possible types: [WorkspaceUserNotFoundError](https://developers.viio.io/#workspaceusernotfounderror-object), [ForbiddenToRemoveOrganizationOwnerError](https://developers.viio.io/#forbiddentoremoveorganizationownererror-object) ### UpdateWorkspaceDataRetentionSettingsError union Possible object types returned by the UpdateWorkspaceDataRetentionSettingsError union. Possible types: [FailedToUpdateDataRetentionSettingsError](https://developers.viio.io/#failedtoupdatedataretentionsettingserror-object) ### UpdateWorkspaceNameError union Possible object types returned by the UpdateWorkspaceNameError union. Possible types: [FailedToUpdateWorkspaceNameError](https://developers.viio.io/#failedtoupdateworkspacenameerror-object) ## Enums ### WorkspaceSubscriptionKind enum Kind of a workspace subscription. | Value | Description | | --------- | ------------------------------ | | `FREE` | Free subscription. | | `PAID` | Paid subscription. | | `TRIAL` | Trial subscription. | | `POC` | Proof-of-concept subscription. | | `SANDBOX` | Sandbox subscription. | # Viio MCP Server The Viio MCP Server connects Claude, ChatGPT, Cursor, Microsoft Copilot, and other AI assistants or workflow builders to your Viio workspace. Use it to analyze your SaaS stack, generate reports, prepare renewals, and find optimization opportunities from structured Viio data. ## What is MCP? The **Model Context Protocol (MCP)** is an open standard that lets AI assistants access external tools and data sources. Instead of copying data into prompts, MCP gives the AI direct, structured access to your systems. ## What the Viio MCP Server Does The Viio MCP Server exposes **specialized tools** that AI assistants can call to analyze your SaaS portfolio. These tools cover: - **Cost optimization** — Find savings opportunities, wasted licenses, and overprovisioned apps - **Renewal management** — Get renewal briefs, seat recommendations, and negotiation leverage data - **Usage analysis** — Identify low-adoption apps, unused licenses, and leavers with active licenses - **Application insights** — Get detailed app data, license plans, and category breakdowns ## Server URL ```text https://mcp.viio.io/ ``` The server uses **Streamable HTTP** transport and supports two authentication methods: - **OAuth with Client ID Metadata Documents (CIMD)** — For AI clients that support browser-based authorization with CIMD. No API key is needed. - **API key** — For developer tools and programmatic access. Requires a Viio API key. ## Why Viio Uses CIMD To better protect customer data, Viio no longer supports OAuth Dynamic Client Registration (DCR). OAuth connections now use **Client ID Metadata Documents (CIMD)** instead. CIMD allows the Viio identity server to retrieve and validate an MCP client's identity, redirect URIs, and other OAuth metadata from a stable HTTPS document. This avoids accepting arbitrary client-registration requests and gives Viio tighter control over which clients can request access to customer data. Your MCP client must support OAuth with CIMD. If it does not, you can still connect securely by [creating a Viio API key](https://developers.viio.io/getting-started/authentication) and sending it as the `Authorization` header: ```text Authorization: YOUR_API_KEY ``` ## How It Works 1. You configure your AI assistant to connect to the Viio MCP Server. 2. The AI assistant discovers the available tools automatically. 3. When you ask a question about your SaaS portfolio, the AI calls the appropriate tools. 4. The server queries your Viio workspace data and returns structured results. 5. The AI interprets the data and provides actionable recommendations. ### Example Conversation > **You:** What are our biggest cost-saving opportunities? > > **AI:** Let me check your savings opportunities... > > *The AI calls the "Get Savings Opportunities" tool, then interprets the results:* > > You have 3 significant opportunities: > > 1. **Slack** — 45 unused licenses ($12,600/yr potential savings) > 2. **Figma** — 28 unused licenses ($8,400/yr potential savings) > 3. **Zoom** — Enterprise licenses downgradable to Pro ($15,000/yr potential savings) # Setup Connect your AI assistant to the Viio MCP Server to enable SaaS portfolio analysis. ## Prerequisites - A Viio account - For **OAuth setup**: An MCP client that supports OAuth with Client ID Metadata Documents (CIMD) - For **API key setup**: An [API key](https://developers.viio.io/getting-started/authentication) from the Viio dashboard ::callout{color="amber" icon="i-lucide-triangle-alert"} To better protect customer data, Viio does not support OAuth Dynamic Client Registration (DCR). Clients must support CIMD, or connect with a Viio API key in the `Authorization` header. :: ## Client Compatibility | Client | OAuth with CIMD | Notes | | --------------------------------------------------- | --------------- | -------------------------------------------------------------------------------- | | Claude.ai | Supported | Configure a custom connector. | | Claude Desktop | Supported | Uses the same connector flow as Claude.ai. | | Claude Code | Supported | Connect from the command line. | | ChatGPT web | Supported | Configure a custom plugin. | | ChatGPT desktop and Codex | Not supported | These clients currently use DCR. Use an API key if custom headers are supported. | | Visual Studio Code | Supported | Connect with OAuth using the Viio MCP Server URL. | | [Zed](https://zed.dev/){rel=""nofollow""} | Supported | Connect with OAuth using the Viio MCP Server URL. | ::callout{color="blue" icon="i-lucide-lightbulb"} Want to connect another AI assistant that supports OAuth with CIMD? If it is not currently on Viio's allowed client list, contact . Our team will review the client and help you get connected. :: ## Claude.ai and Claude Desktop 1. Open Claude and select **Customize** in the sidebar. 2. Select **Connectors**. 3. Click **Add**, then select **Add custom connector**. 4. Enter the following: - **Name:** `Viio MCP` - **URL:** `https://mcp.viio.io/` 5. Leave the optional OAuth client ID and client secret fields empty, then click **Add**. 6. Open the new connector and click **Connect**. 7. Sign in to the Viio identity server with your Google or Microsoft account. 8. Review the requested permissions and click **Allow and continue**. 9. Claude returns to the connector page with the connector approved and connected. ## ChatGPT Web 1. Open ChatGPT in your browser and select **Plugins** in the sidebar. 2. Click the **+** button on the Plugins page. 3. Enter the following: - **Name:** `Viio MCP` - **Connection:** `Server URL` - **Server URL:** `https://mcp.viio.io/` - **Authentication:** `OAuth` 4. Check **I understand and want to continue**. 5. Click **Create**. 6. In the confirmation dialog, click **Sign in with Viio MCP**. 7. Sign in to the Viio identity server with your Google or Microsoft account. 8. Review the requested permissions and click **Allow and continue**. 9. ChatGPT returns to the plugin page with the plugin connected. ::callout{color="amber" icon="i-lucide-triangle-alert"} ChatGPT web supports OAuth with CIMD. ChatGPT desktop and Codex currently attempt Dynamic Client Registration and cannot complete Viio's OAuth flow. Use the API key fallback below if the client supports custom headers. :: ## Claude Code Claude Code supports both OAuth and API key authentication. ### OAuth (recommended) ```bash claude mcp add viio --transport http https://mcp.viio.io/ ``` Claude Code will open a browser window for you to sign in with your Viio account. ## API Key Fallback If your MCP client does not support OAuth with CIMD, create a [Viio API key](https://developers.viio.io/getting-started/authentication) and set it as the raw value of the `Authorization` header: ```text Authorization: YOUR_API_KEY ``` Treat the API key as a secret and configure it only in an MCP client you trust. For Claude Code: ```bash claude mcp add viio --transport http https://mcp.viio.io/ \ --header "Authorization: YOUR_API_KEY" ``` Or add it manually to your `.claude/settings.json`: ```json { "mcpServers": { "viio": { "type": "streamable-http", "url": "https://mcp.viio.io/", "headers": { "Authorization": "YOUR_API_KEY" } } } } ``` ## Cursor In Cursor, go to **Settings** > **MCP Servers** and add a new server: ```json { "mcpServers": { "viio": { "url": "https://mcp.viio.io/", "headers": { "Authorization": "YOUR_API_KEY" } } } } ``` ## Other Clients Any MCP-compatible client that supports OAuth with CIMD or custom HTTP headers can connect to the Viio MCP Server. Use the following details to configure it: - **Server URL:** `https://mcp.viio.io/` - **Transport:** Streamable HTTP **If your client supports OAuth with CIMD:** Point it to the server URL and follow the browser-based sign-in and consent flow. No API key is needed. **If your client does not support CIMD:** Create a Viio API key and add it as the raw value of the `Authorization` header: ```json { "url": "https://mcp.viio.io/", "headers": { "Authorization": "YOUR_API_KEY" } } ``` Refer to your client's documentation for the exact configuration format and confirm that it supports custom HTTP headers. ## Tool Permissions MCP clients allow you to control how each tool is used. Most clients support three permission levels per tool: - **Always allow** — The tool runs automatically without prompting - **Ask each time** — You're asked for approval before each use - **Never allow** — The tool is disabled entirely All Viio MCP tools are **read-only** — they cannot modify any data in your workspace. ## Verifying the Connection After configuring your AI assistant, test the connection by asking: > List my most expensive applications. The AI should call the Viio MCP Server and return data from your workspace. If you see an authentication error, verify your API key is correct (for API key clients) or try reconnecting (for OAuth clients). ## Troubleshooting - **Connection fails** — Check that popup blockers are not preventing the OAuth redirect. Ensure the URL is exactly `https://mcp.viio.io/`. - **Authentication error** — Verify your Viio account is active. For API key clients, check the key has not been revoked. - **Client attempts Dynamic Client Registration** — The client does not support Viio's CIMD-based OAuth flow. Configure a Viio API key in the `Authorization` header instead. - **Tools not appearing** — Restart your AI client after adding the configuration. Some clients require a reload. # Available Tools The Viio MCP Server provides **read-only tools** for analyzing your SaaS portfolio. All tools are non-destructive and return data scoped to your workspace. Once connected, your AI client will automatically discover all available tools. Below is an overview of the tool categories and the tools within each. ## Applications Tools for browsing, inspecting, and surfacing optimization signals across your application portfolio. - **list-applications** — List applications with different views: most expensive (ranked by annual cost), most used (ranked by user activity), by category (grouped with spend totals), or ownerless (popular apps without assigned owners). - **get-application** — Get comprehensive details about a specific application including owners, state, portfolio type, users, license costs, contract data, renewal dates, usage trends, links, and tags. - **list-application-users** — List users for an application. Filter by all users (with employee info, licenses, accounts, and usage data) or only users with unused licenses (showing potential savings per user). - **list-app-insights** — List application insights by type: low-adoption (underutilized expensive apps), overlapping (similar/redundant apps with shared users), or overprovisioned (apps with more seats than needed). ## Licenses Tools for exploring license assignments, plans, pricing, and identifying savings opportunities. - **list-licenses** — List individual licenses with holder details, usage state, pricing, and potential savings. Filter by-product, vendor, or state, or drill into a specific license plan's assigned licenses. - **list-license-plans** — List license plans for a product or vendor with usage stats, pricing information, attributes, and pagination support. - **list-license-insights** — List license insights by type: savings opportunities (top savings ranked by potential annualized savings), downgradable (licenses that could be downgraded to a lower tier), wasted (apps/vendors with the most unused licenses), reclaim data (inactive licenses and impacted users for a specific app), renewal brief (comprehensive renewal data for a specific app), or leavers (deactivated users still holding paid licenses). ## Renewals Tools for preparing for upcoming contract renewals. - **list-renewals** — List contract renewals with different views: upcoming (sorted by cost), negotiation leverage (leverage scoring for negotiation), true-up risks (over-utilized apps with risk levels), or seat recommendations (right-sizing recommendations with savings). ## Employees Tools for looking up employee details and their application usage. - **get-employee** — Get employee details and their application usage. Search by name (partial match) or look up directly by employee ID. Returns employee metadata (department, manager, status) and their apps with licenses, usage data, and accounts. # SaaS Analysis Use Cases After connecting the Viio MCP Server, ask your AI assistant direct questions about your SaaS portfolio. The assistant chooses the relevant read-only tools and explains the returned workspace data. ## Find savings opportunities > Show our largest annual SaaS savings opportunities. Include the application, reason, estimated saving, and supporting license data. Follow up with: > For the top three opportunities, list the affected license holders and separate unused, downgradable, and no-data licenses. ## Prepare for renewals > List contracts renewing in the next 90 days, ordered by annual cost. Include termination deadlines, license utilization, and potential savings. Then request a focused brief: > Prepare a renewal brief for Figma. Summarize current spend, assigned and unused seats, usage risks, savings options, and negotiation questions. ## Reclaim unused licenses > Find unused paid licenses for employees who are still active. Group the results by application and rank them by potential annual saving. Review the evidence before taking action: > For Slack, explain why each license is classified as unused and include the latest available usage signal. ## Review overlapping applications > Identify applications with overlapping functionality and shared users. Rank the clusters by combined annual spend and explain the consolidation opportunity. ## Investigate an employee > Show the applications and paid licenses assigned to Alex Smith. Highlight unused licenses and applications with no recent activity. If multiple employees match, the assistant may ask you to select the intended person. ## Validate the result - Ask the assistant to state the time range and filters used. - Distinguish measured usage from missing usage data. - Keep currencies separate unless an approved conversion method is available. - Confirm application owners, contract constraints, and employee context before making a change. - Treat recommendations as decision support rather than automatic approval. ## Next steps - [Connect an AI client](https://developers.viio.io/mcp-server/setup) - [Review available MCP tools](https://developers.viio.io/mcp-server/tools) - [Generate a Viio API key](https://developers.viio.io/getting-started/authentication) # llms.txt This documentation is designed to be consumed by AI assistants, enabling them to help you build integrations with the Viio platform. The `llms.txt` standard provides a simple way for AI assistants to access documentation in a format optimized for large language models. ## Endpoints ### /llms.txt A concise, structured overview of the documentation with links to individual sections. ```text https://developers.viio.io/llms.txt ``` This endpoint returns: - Documentation title and description - List of available sections - Links to detailed documentation pages ### /llms-full.txt Complete documentation content in a single file, ideal for AI assistants that can process large contexts. ```text https://developers.viio.io/llms-full.txt ``` This endpoint includes the full content of all documentation pages, reducing the need for multiple requests. ## Raw Markdown Individual documentation pages are also available as raw Markdown: ```text https://developers.viio.io/raw/.md ``` For example: - `/raw/getting-started/authentication.md` - `/raw/graphql-api/querying.md` ## Usage Examples ### With cURL ```bash # Get documentation overview curl https://developers.viio.io/llms.txt # Get full documentation curl https://developers.viio.io/llms-full.txt # Get specific page as markdown curl https://developers.viio.io/raw/graphql-api/querying.md ``` ### In AI Prompts When working with an AI assistant, you can reference these URLs directly: > Read the Viio API documentation from {rel=""nofollow""} and help me write a query to fetch all applications. ## What's Included The AI-accessible documentation covers: - **Getting Started** — Authentication, API basics - **GraphQL API** — Querying, mutations, best practices - **GQL Schema Reference** — Types, inputs, enums, scalars - **MCP Server** — Tools for SaaS portfolio analysis ## About the Standard The `llms.txt` specification was proposed by Jeremy Howard in September 2024. Unlike `robots.txt` which targets web crawlers at training time, `llms.txt` targets AI tools at inference time — when users are actively asking questions. Learn more at [llmstxt.org](https://llmstxt.org/){rel=""nofollow""}.