[{"data":1,"prerenderedAt":865},["ShallowReactive",2],{"navigation":3,"\u002Fgraphql-api\u002Fguides\u002Fhandle-errors":99,"\u002Fgraphql-api\u002Fguides\u002Fhandle-errors-surround":858},[4,16,52,71,91],{"title":5,"path":6,"stem":7,"children":8,"icon":15},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":10,"path":6,"stem":7,"children":-1},"Introduction",{"title":12,"path":13,"stem":14,"children":-1},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F2.authentication","i-lucide-rocket",{"title":17,"path":18,"stem":19,"children":20,"icon":51},"GraphQL API","\u002Fgraphql-api","2.graphql-api\u002F1.index",[21,23,27,31,35,39,43,47],{"title":22,"path":18,"stem":19,"children":-1},"API Overview",{"title":24,"path":25,"stem":26,"children":-1},"Querying Patterns","\u002Fgraphql-api\u002Fquerying","2.graphql-api\u002F2.querying",{"title":28,"path":29,"stem":30,"children":-1},"Mutation Patterns","\u002Fgraphql-api\u002Fmutations","2.graphql-api\u002F3.mutations",{"title":32,"path":33,"stem":34,"children":-1},"List SaaS Applications","\u002Fgraphql-api\u002Fguides\u002Flist-applications","2.graphql-api\u002F4.guides\u002F1.list-applications",{"title":36,"path":37,"stem":38,"children":-1},"Find Unused Licenses","\u002Fgraphql-api\u002Fguides\u002Ffind-unused-licenses","2.graphql-api\u002F4.guides\u002F2.find-unused-licenses",{"title":40,"path":41,"stem":42,"children":-1},"Retrieve Upcoming Renewals","\u002Fgraphql-api\u002Fguides\u002Fupcoming-renewals","2.graphql-api\u002F4.guides\u002F3.upcoming-renewals",{"title":44,"path":45,"stem":46,"children":-1},"Handle GraphQL Errors","\u002Fgraphql-api\u002Fguides\u002Fhandle-errors","2.graphql-api\u002F4.guides\u002F4.handle-errors",{"title":48,"path":49,"icon":50},"API Reference","\u002Fgql-schema-reference","i-lucide-file-code","i-lucide-braces",{"title":53,"path":54,"stem":55,"children":56,"icon":70},"Sync API","\u002Fsync-api","3.sync-api\u002F1.index",[57,59,63,67],{"title":58,"path":54,"stem":55,"children":-1},"Viio Sync API",{"title":60,"path":61,"stem":62,"children":-1},"Quickstart","\u002Fsync-api\u002Fquickstart","3.sync-api\u002F2.quickstart",{"title":64,"path":65,"icon":66},"Examples","\u002Fsync-api\u002Faws-lambda-python","i-lucide-code-xml",{"title":68,"path":69,"icon":50},"SDK Reference","\u002Fsync-api\u002Fapi-reference","i-lucide-refresh-cw",{"title":72,"path":73,"stem":74,"children":75,"icon":90},"MCP Server","\u002Fmcp-server","4.mcp-server\u002F1.index",[76,78,82,86],{"title":77,"path":73,"stem":74,"children":-1},"Viio MCP Server",{"title":79,"path":80,"stem":81,"children":-1},"Setup","\u002Fmcp-server\u002Fsetup","4.mcp-server\u002F2.setup",{"title":83,"path":84,"stem":85,"children":-1},"Available Tools","\u002Fmcp-server\u002Ftools","4.mcp-server\u002F3.tools",{"title":87,"path":88,"stem":89,"children":-1},"SaaS Analysis Use Cases","\u002Fmcp-server\u002Fuse-cases","4.mcp-server\u002F4.use-cases","i-lucide-bot",{"title":92,"path":93,"stem":94,"children":95,"icon":98},"AI Integration","\u002Fai","5.ai\u002F1.index",[96],{"title":97,"path":93,"stem":94,"children":-1},"llms.txt","i-lucide-sparkles",{"id":100,"title":44,"body":101,"dateModified":849,"datePublished":849,"description":850,"extension":851,"links":852,"meta":853,"navigation":261,"path":45,"seo":854,"stem":46,"__hash__":857},"docs\u002F2.graphql-api\u002F4.guides\u002F4.handle-errors.md",{"type":102,"value":103,"toc":843},"minimark",[104,117,122,150,799,803,806,809,813,816,820,839],[105,106,107,108,112,113,116],"p",{},"A successful HTTP response does not always mean that every GraphQL field succeeded. Handle transport status, the top-level ",[109,110,111],"code",{},"errors"," array, returned ",[109,114,115],{},"data",", and typed mutation errors separately.",[118,119,121],"h2",{"id":120},"check-every-response-layer","Check every response layer",[123,124,125,129,132,138,144],"ol",{},[126,127,128],"li",{},"Treat network failures and non-success HTTP status codes as transport failures.",[126,130,131],{},"Parse the JSON body only when the response declares a supported JSON content type.",[126,133,134,135,137],{},"Inspect the top-level ",[109,136,111],{}," array.",[126,139,140,141,143],{},"Accept partial ",[109,142,115],{}," only when your use case can safely operate without the failed fields.",[126,145,146,147,149],{},"For mutations, inspect the operation payload’s typed ",[109,148,111],{}," field before using the result.",[151,152,157],"pre",{"className":153,"code":154,"language":155,"meta":156,"style":156},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","type GraphQlError = {\n  message: string;\n  path?: Array\u003Cstring | number>;\n  extensions?: {\n    code?: string;\n  };\n};\n\ntype GraphQlResponse\u003CTData> = {\n  data?: TData;\n  errors?: GraphQlError[];\n};\n\nconst requestViio = async \u003CTData>(query: string, variables: Record\u003Cstring, object | string | number | boolean | null>) => {\n  const response = await fetch(\"https:\u002F\u002Fapi.viio.io\u002Fgraphql\", {\n    method: \"POST\",\n    headers: {\n      Authorization: process.env.VIIO_API_KEY ?? \"\",\n      \"Content-Type\": \"application\u002Fjson\",\n    },\n    body: JSON.stringify({ query, variables }),\n  });\n\n  if (!response.ok) {\n    throw new Error(\"Viio API request failed\");\n  }\n\n  const result: GraphQlResponse\u003CTData> = await response.json();\n\n  if (result.errors?.length) {\n    throw new Error(\"Viio API returned an unsuccessful response\");\n  }\n\n  if (!result.data) {\n    throw new Error(\"Viio API response did not include data\");\n  }\n\n  return result.data;\n};\n","typescript","",[109,158,159,179,195,222,232,244,250,256,263,283,296,312,317,322,399,434,453,463,493,515,521,557,567,572,598,623,629,634,668,673,697,719,724,729,748,770,775,780,794],{"__ignoreMap":156},[160,161,164,168,172,176],"span",{"class":162,"line":163},"line",1,[160,165,167],{"class":166},"spNyl","type",[160,169,171],{"class":170},"sBMFI"," GraphQlError",[160,173,175],{"class":174},"sMK4o"," =",[160,177,178],{"class":174}," {\n",[160,180,182,186,189,192],{"class":162,"line":181},2,[160,183,185],{"class":184},"swJcz","  message",[160,187,188],{"class":174},":",[160,190,191],{"class":170}," string",[160,193,194],{"class":174},";\n",[160,196,198,201,204,207,210,213,216,219],{"class":162,"line":197},3,[160,199,200],{"class":184},"  path",[160,202,203],{"class":174},"?:",[160,205,206],{"class":170}," Array",[160,208,209],{"class":174},"\u003C",[160,211,212],{"class":170},"string",[160,214,215],{"class":174}," |",[160,217,218],{"class":170}," number",[160,220,221],{"class":174},">;\n",[160,223,225,228,230],{"class":162,"line":224},4,[160,226,227],{"class":184},"  extensions",[160,229,203],{"class":174},[160,231,178],{"class":174},[160,233,235,238,240,242],{"class":162,"line":234},5,[160,236,237],{"class":184},"    code",[160,239,203],{"class":174},[160,241,191],{"class":170},[160,243,194],{"class":174},[160,245,247],{"class":162,"line":246},6,[160,248,249],{"class":174},"  };\n",[160,251,253],{"class":162,"line":252},7,[160,254,255],{"class":174},"};\n",[160,257,259],{"class":162,"line":258},8,[160,260,262],{"emptyLinePlaceholder":261},true,"\n",[160,264,266,268,271,273,276,279,281],{"class":162,"line":265},9,[160,267,167],{"class":166},[160,269,270],{"class":170}," GraphQlResponse",[160,272,209],{"class":174},[160,274,275],{"class":170},"TData",[160,277,278],{"class":174},">",[160,280,175],{"class":174},[160,282,178],{"class":174},[160,284,286,289,291,294],{"class":162,"line":285},10,[160,287,288],{"class":184},"  data",[160,290,203],{"class":174},[160,292,293],{"class":170}," TData",[160,295,194],{"class":174},[160,297,299,302,304,306,310],{"class":162,"line":298},11,[160,300,301],{"class":184},"  errors",[160,303,203],{"class":174},[160,305,171],{"class":170},[160,307,309],{"class":308},"sTEyZ","[]",[160,311,194],{"class":174},[160,313,315],{"class":162,"line":314},12,[160,316,255],{"class":174},[160,318,320],{"class":162,"line":319},13,[160,321,262],{"emptyLinePlaceholder":261},[160,323,325,328,331,334,337,340,342,345,349,351,353,356,359,361,364,366,368,370,373,375,377,379,381,383,386,388,391,394,397],{"class":162,"line":324},14,[160,326,327],{"class":166},"const",[160,329,330],{"class":308}," requestViio ",[160,332,333],{"class":174},"=",[160,335,336],{"class":166}," async",[160,338,339],{"class":174}," \u003C",[160,341,275],{"class":170},[160,343,344],{"class":174},">(",[160,346,348],{"class":347},"sHdIc","query",[160,350,188],{"class":174},[160,352,191],{"class":170},[160,354,355],{"class":174},",",[160,357,358],{"class":347}," variables",[160,360,188],{"class":174},[160,362,363],{"class":170}," Record",[160,365,209],{"class":174},[160,367,212],{"class":170},[160,369,355],{"class":174},[160,371,372],{"class":170}," object",[160,374,215],{"class":174},[160,376,191],{"class":170},[160,378,215],{"class":174},[160,380,218],{"class":170},[160,382,215],{"class":174},[160,384,385],{"class":170}," boolean",[160,387,215],{"class":174},[160,389,390],{"class":170}," null",[160,392,393],{"class":174},">)",[160,395,396],{"class":166}," =>",[160,398,178],{"class":174},[160,400,402,405,408,410,414,418,421,424,428,430,432],{"class":162,"line":401},15,[160,403,404],{"class":166},"  const",[160,406,407],{"class":308}," response",[160,409,175],{"class":174},[160,411,413],{"class":412},"s7zQu"," await",[160,415,417],{"class":416},"s2Zo4"," fetch",[160,419,420],{"class":184},"(",[160,422,423],{"class":174},"\"",[160,425,427],{"class":426},"sfazB","https:\u002F\u002Fapi.viio.io\u002Fgraphql",[160,429,423],{"class":174},[160,431,355],{"class":174},[160,433,178],{"class":174},[160,435,437,440,442,445,448,450],{"class":162,"line":436},16,[160,438,439],{"class":184},"    method",[160,441,188],{"class":174},[160,443,444],{"class":174}," \"",[160,446,447],{"class":426},"POST",[160,449,423],{"class":174},[160,451,452],{"class":174},",\n",[160,454,456,459,461],{"class":162,"line":455},17,[160,457,458],{"class":184},"    headers",[160,460,188],{"class":174},[160,462,178],{"class":174},[160,464,466,469,471,474,477,480,482,485,488,491],{"class":162,"line":465},18,[160,467,468],{"class":184},"      Authorization",[160,470,188],{"class":174},[160,472,473],{"class":308}," process",[160,475,476],{"class":174},".",[160,478,479],{"class":308},"env",[160,481,476],{"class":174},[160,483,484],{"class":308},"VIIO_API_KEY",[160,486,487],{"class":174}," ??",[160,489,490],{"class":174}," \"\"",[160,492,452],{"class":174},[160,494,496,499,502,504,506,508,511,513],{"class":162,"line":495},19,[160,497,498],{"class":174},"      \"",[160,500,501],{"class":184},"Content-Type",[160,503,423],{"class":174},[160,505,188],{"class":174},[160,507,444],{"class":174},[160,509,510],{"class":426},"application\u002Fjson",[160,512,423],{"class":174},[160,514,452],{"class":174},[160,516,518],{"class":162,"line":517},20,[160,519,520],{"class":174},"    },\n",[160,522,524,527,529,532,534,537,539,542,545,547,549,552,555],{"class":162,"line":523},21,[160,525,526],{"class":184},"    body",[160,528,188],{"class":174},[160,530,531],{"class":308}," JSON",[160,533,476],{"class":174},[160,535,536],{"class":416},"stringify",[160,538,420],{"class":184},[160,540,541],{"class":174},"{",[160,543,544],{"class":308}," query",[160,546,355],{"class":174},[160,548,358],{"class":308},[160,550,551],{"class":174}," }",[160,553,554],{"class":184},")",[160,556,452],{"class":174},[160,558,560,563,565],{"class":162,"line":559},22,[160,561,562],{"class":174},"  }",[160,564,554],{"class":184},[160,566,194],{"class":174},[160,568,570],{"class":162,"line":569},23,[160,571,262],{"emptyLinePlaceholder":261},[160,573,575,578,581,584,587,589,592,595],{"class":162,"line":574},24,[160,576,577],{"class":412},"  if",[160,579,580],{"class":184}," (",[160,582,583],{"class":174},"!",[160,585,586],{"class":308},"response",[160,588,476],{"class":174},[160,590,591],{"class":308},"ok",[160,593,594],{"class":184},") ",[160,596,597],{"class":174},"{\n",[160,599,601,604,607,610,612,614,617,619,621],{"class":162,"line":600},25,[160,602,603],{"class":412},"    throw",[160,605,606],{"class":174}," new",[160,608,609],{"class":416}," Error",[160,611,420],{"class":184},[160,613,423],{"class":174},[160,615,616],{"class":426},"Viio API request failed",[160,618,423],{"class":174},[160,620,554],{"class":184},[160,622,194],{"class":174},[160,624,626],{"class":162,"line":625},26,[160,627,628],{"class":174},"  }\n",[160,630,632],{"class":162,"line":631},27,[160,633,262],{"emptyLinePlaceholder":261},[160,635,637,639,642,644,646,648,650,652,654,656,658,660,663,666],{"class":162,"line":636},28,[160,638,404],{"class":166},[160,640,641],{"class":308}," result",[160,643,188],{"class":174},[160,645,270],{"class":170},[160,647,209],{"class":174},[160,649,275],{"class":170},[160,651,278],{"class":174},[160,653,175],{"class":174},[160,655,413],{"class":412},[160,657,407],{"class":308},[160,659,476],{"class":174},[160,661,662],{"class":416},"json",[160,664,665],{"class":184},"()",[160,667,194],{"class":174},[160,669,671],{"class":162,"line":670},29,[160,672,262],{"emptyLinePlaceholder":261},[160,674,676,678,680,683,685,687,690,693,695],{"class":162,"line":675},30,[160,677,577],{"class":412},[160,679,580],{"class":184},[160,681,682],{"class":308},"result",[160,684,476],{"class":174},[160,686,111],{"class":308},[160,688,689],{"class":174},"?.",[160,691,692],{"class":308},"length",[160,694,594],{"class":184},[160,696,597],{"class":174},[160,698,700,702,704,706,708,710,713,715,717],{"class":162,"line":699},31,[160,701,603],{"class":412},[160,703,606],{"class":174},[160,705,609],{"class":416},[160,707,420],{"class":184},[160,709,423],{"class":174},[160,711,712],{"class":426},"Viio API returned an unsuccessful response",[160,714,423],{"class":174},[160,716,554],{"class":184},[160,718,194],{"class":174},[160,720,722],{"class":162,"line":721},32,[160,723,628],{"class":174},[160,725,727],{"class":162,"line":726},33,[160,728,262],{"emptyLinePlaceholder":261},[160,730,732,734,736,738,740,742,744,746],{"class":162,"line":731},34,[160,733,577],{"class":412},[160,735,580],{"class":184},[160,737,583],{"class":174},[160,739,682],{"class":308},[160,741,476],{"class":174},[160,743,115],{"class":308},[160,745,594],{"class":184},[160,747,597],{"class":174},[160,749,751,753,755,757,759,761,764,766,768],{"class":162,"line":750},35,[160,752,603],{"class":412},[160,754,606],{"class":174},[160,756,609],{"class":416},[160,758,420],{"class":184},[160,760,423],{"class":174},[160,762,763],{"class":426},"Viio API response did not include data",[160,765,423],{"class":174},[160,767,554],{"class":184},[160,769,194],{"class":174},[160,771,773],{"class":162,"line":772},36,[160,774,628],{"class":174},[160,776,778],{"class":162,"line":777},37,[160,779,262],{"emptyLinePlaceholder":261},[160,781,783,786,788,790,792],{"class":162,"line":782},38,[160,784,785],{"class":412},"  return",[160,787,641],{"class":308},[160,789,476],{"class":174},[160,791,115],{"class":308},[160,793,194],{"class":174},[160,795,797],{"class":162,"line":796},39,[160,798,255],{"class":174},[118,800,802],{"id":801},"protect-user-facing-messages","Protect user-facing messages",[105,804,805],{},"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.”",[105,807,808],{},"Never log API keys, authorization headers, complete request bodies containing sensitive variables, or personal data returned by the API.",[118,810,812],{"id":811},"retry-selectively","Retry selectively",[105,814,815],{},"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.",[118,817,819],{"id":818},"related-reference","Related reference",[821,822,823,829,834],"ul",{},[126,824,825],{},[826,827,828],"a",{"href":18},"API overview and error responses",[126,830,831],{},[826,832,833],{"href":29},"Mutation response payloads",[126,835,836],{},[826,837,838],{"href":13},"API authentication",[840,841,842],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":156,"searchDepth":163,"depth":181,"links":844},[845,846,847,848],{"id":120,"depth":181,"text":121},{"id":801,"depth":181,"text":802},{"id":811,"depth":181,"text":812},{"id":818,"depth":181,"text":819},"2026-07-30","Handle transport, GraphQL, partial-data, authentication, and mutation errors safely.","md",null,{},{"title":855,"description":856},"Handle Viio GraphQL API Errors Safely","Build reliable Viio integrations by handling HTTP failures, GraphQL errors, partial data, authentication, and typed mutation errors.","L-LVVhv1aKcmDnWIqX-Yd5Y8gsOH1Ob91kDELE5KpK0",[859,861],{"title":40,"path":41,"stem":42,"description":860,"children":-1},"Query and sort SaaS license plans by upcoming contract-renewal date.",{"title":862,"path":49,"stem":863,"description":864,"children":-1},"GraphQL Schema Reference","3.gql-schema-reference\u002F1.index","Explore the Viio GraphQL API schema by product area.",1787319038267]