[{"data":1,"prerenderedAt":939},["ShallowReactive",2],{"navigation":3,"page:\u002Ferrors":45,"error-codes":445},{"title":4,"links":5},"API reference",[6,9,12,15,18,21,24,27,30,33,36,39,42],{"title":7,"href":8},"Accounts","\u002Freference\u002Faccounts",{"title":10,"href":11},"Connect","\u002Freference\u002Fconnect",{"title":13,"href":14},"Calendars","\u002Freference\u002Fcalendars",{"title":16,"href":17},"Events","\u002Freference\u002Fevents",{"title":19,"href":20},"Availability","\u002Freference\u002Favailability",{"title":22,"href":23},"Meetings","\u002Freference\u002Fmeetings",{"title":25,"href":26},"Invitations","\u002Freference\u002Finvitations",{"title":28,"href":29},"Webhooks","\u002Freference\u002Fwebhooks",{"title":31,"href":32},"Metadata","\u002Freference\u002Fmetadata",{"title":34,"href":35},"Keys","\u002Freference\u002Fkeys",{"title":37,"href":38},"Sandbox","\u002Freference\u002Fsandbox",{"title":40,"href":41},"Usage","\u002Freference\u002Fusage",{"title":43,"href":44},"Logs","\u002Freference\u002Flogs",{"kind":46,"title":47,"description":48,"sections":49,"doc":56},"guide","Errors","Every error uses the same format, with a stable code, a hint, a link to the fix and the request's trace id.",[50,53],{"id":51,"title":52},"status-codes","Status codes",{"id":54,"title":55},"every-code","Every code",{"id":57,"title":47,"body":58,"description":48,"extension":436,"hero":437,"meta":438,"navigation":439,"path":440,"rawbody":441,"sections":442,"seo":443,"stem":64,"v1":442,"__hash__":444},"docs\u002Ferrors.md",{"type":59,"value":60,"toc":432},"minimark",[61,65,88,224,252,267,270,282,285,423,425,428],[62,63,47],"h1",{"id":64},"errors",[66,67,68],"lead",{},[69,70,71,72,75,76,79,80,83,84,87],"p",{},"Every error response has the same format. It includes a stable ",[73,74,73],"code",{}," that your code can check, a ",[73,77,78],{},"message"," that describes what went wrong, a ",[73,81,82],{},"hint"," that explains how to fix it, a link to the error code's page, and the ",[73,85,86],{},"traceId"," that identifies the request in your logs.",[89,90,95],"pre",{"className":91,"code":92,"language":93,"meta":94,"style":94},"language-json shiki shiki-themes css-variables","{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"CONNECTION_NOT_FOUND\",\n    \"message\": \"No connected account was found for this request.\",\n    \"hint\": \"The user may not have connected this provider yet. Start a connection with PyasConnect.\",\n    \"status\": 404,\n    \"traceId\": \"trc_5f2a9c1e7b3d4a6f8e0c2b1d\",\n    \"docs\": \"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_NOT_FOUND\"\n  }\n}\n","json","",[73,96,97,106,124,135,149,162,175,188,201,212,218],{"__ignoreMap":94},[98,99,102],"span",{"class":100,"line":101},"line",1,[98,103,105],{"class":104},"sqSWz","{\n",[98,107,109,113,117,121],{"class":100,"line":108},2,[98,110,112],{"class":111},"sag7P","  \"success\"",[98,114,116],{"class":115},"sEEt9",":",[98,118,120],{"class":119},"sXULy"," false",[98,122,123],{"class":115},",\n",[98,125,127,130,132],{"class":100,"line":126},3,[98,128,129],{"class":111},"  \"error\"",[98,131,116],{"class":115},[98,133,134],{"class":104}," {\n",[98,136,138,141,143,147],{"class":100,"line":137},4,[98,139,140],{"class":111},"    \"code\"",[98,142,116],{"class":115},[98,144,146],{"class":145},"sk1Au"," \"CONNECTION_NOT_FOUND\"",[98,148,123],{"class":115},[98,150,152,155,157,160],{"class":100,"line":151},5,[98,153,154],{"class":111},"    \"message\"",[98,156,116],{"class":115},[98,158,159],{"class":145}," \"No connected account was found for this request.\"",[98,161,123],{"class":115},[98,163,165,168,170,173],{"class":100,"line":164},6,[98,166,167],{"class":111},"    \"hint\"",[98,169,116],{"class":115},[98,171,172],{"class":145}," \"The user may not have connected this provider yet. Start a connection with PyasConnect.\"",[98,174,123],{"class":115},[98,176,178,181,183,186],{"class":100,"line":177},7,[98,179,180],{"class":111},"    \"status\"",[98,182,116],{"class":115},[98,184,185],{"class":119}," 404",[98,187,123],{"class":115},[98,189,191,194,196,199],{"class":100,"line":190},8,[98,192,193],{"class":111},"    \"traceId\"",[98,195,116],{"class":115},[98,197,198],{"class":145}," \"trc_5f2a9c1e7b3d4a6f8e0c2b1d\"",[98,200,123],{"class":115},[98,202,204,207,209],{"class":100,"line":203},9,[98,205,206],{"class":111},"    \"docs\"",[98,208,116],{"class":115},[98,210,211],{"class":145}," \"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_NOT_FOUND\"\n",[98,213,215],{"class":100,"line":214},10,[98,216,217],{"class":104},"  }\n",[98,219,221],{"class":100,"line":220},11,[98,222,223],{"class":104},"}\n",[225,226,227,237,243],"ul",{},[228,229,230,231,233,234,236],"li",{},"Check ",[73,232,73],{}," in your error handling, never ",[73,235,78],{},". Messages are written for people and can be improved over time, but codes don't change.",[228,238,239,240,242],{},"Write ",[73,241,82],{}," to your logs, where developers can read it.",[228,244,245,246,248,249,116],{},"Keep the ",[73,247,86],{},". Include it when you contact support so that we can help you faster. To see what the request did, how the provider responded and why the request failed, call the endpoint below or run ",[73,250,251],{},"pyas logs get trc_...",[89,253,257],{"className":254,"code":255,"language":256,"meta":94,"style":94},"language-http shiki shiki-themes css-variables","GET \u002Fv2\u002Flogs\u002F{traceId}\n","http",[73,258,259],{"__ignoreMap":94},[98,260,261,264],{"class":100,"line":101},[98,262,263],{"class":111},"GET",[98,265,266],{"class":104}," \u002Fv2\u002Flogs\u002F{traceId}\n",[69,268,269],{},"The error codes are also available as data, for use in your tooling and your coding agent. This request returns every code with its status, causes, fix, whether retrying helps, and related codes:",[89,271,273],{"className":254,"code":272,"language":256,"meta":94,"style":94},"GET https:\u002F\u002Fapi.pyas.io\u002Fv2\u002Ferrors\n",[73,274,275],{"__ignoreMap":94},[98,276,277,279],{"class":100,"line":101},[98,278,263],{"class":111},[98,280,281],{"class":104}," https:\u002F\u002Fapi.pyas.io\u002Fv2\u002Ferrors\n",[283,284,52],"h2",{"id":51},[286,287,288,301],"table",{},[289,290,291],"thead",{},[292,293,294,298],"tr",{},[295,296,297],"th",{},"Status",[295,299,300],{},"Meaning",[302,303,304,315,325,335,345,355,365,375,385,399,413],"tbody",{},[292,305,306,312],{},[307,308,309],"td",{},[73,310,311],{},"400 Bad Request",[307,313,314],{},"A parameter or the body is invalid. The message identifies the field.",[292,316,317,322],{},[307,318,319],{},[73,320,321],{},"401 Unauthorized",[307,323,324],{},"The API key is missing, wrong, revoked or expired.",[292,326,327,332],{},[307,328,329],{},[73,330,331],{},"402 Payment Required",[307,333,334],{},"Your plan needs attention: no subscription, an overdue payment, or the plan's connected account limit is reached.",[292,336,337,342],{},[307,338,339],{},[73,340,341],{},"403 Forbidden",[307,343,344],{},"The key isn't allowed to perform this action, because of its scopes, its mode (live or test) or your plan.",[292,346,347,352],{},[307,348,349],{},[73,350,351],{},"404 Not Found",[307,353,354],{},"The account, calendar or event doesn't exist for your app.",[292,356,357,362],{},[307,358,359],{},[73,360,361],{},"409 Conflict",[307,363,364],{},"Someone updated the resource after you read it, the same request is still in progress, or a sandbox limit is reached.",[292,366,367,372],{},[307,368,369],{},[73,370,371],{},"410 Gone",[307,373,374],{},"The sync token has expired. Read the calendar again without one.",[292,376,377,382],{},[307,378,379],{},[73,380,381],{},"413 Content Too Large",[307,383,384],{},"The body or the uploaded file is too large.",[292,386,387,392],{},[307,388,389],{},[73,390,391],{},"422 Unprocessable Entity",[307,393,394,395,398],{},"The request is valid but can't be completed: the provider doesn't support it or rejected it, the account must be reconnected, or an ",[73,396,397],{},"Idempotency-Key"," was reused for a different request.",[292,400,401,406],{},[307,402,403],{},[73,404,405],{},"429 Too Many Requests",[307,407,408,409,412],{},"You've sent too many requests. Wait the number of seconds in ",[73,410,411],{},"Retry-After",".",[292,414,415,420],{},[307,416,417],{},[73,418,419],{},"5xx",[307,421,422],{},"Pyas or the provider failed. Retry with backoff.",[283,424,55],{"id":54},[426,427],"error-codes",{},[429,430,431],"style",{},"html pre.shiki code .sqSWz, html code.shiki .sqSWz{--shiki-default:var(--shiki-foreground)}html pre.shiki code .sag7P, html code.shiki .sag7P{--shiki-default:var(--shiki-token-keyword)}html pre.shiki code .sEEt9, html code.shiki .sEEt9{--shiki-default:var(--shiki-token-punctuation)}html pre.shiki code .sXULy, html code.shiki .sXULy{--shiki-default:var(--shiki-token-constant)}html pre.shiki code .sk1Au, html code.shiki .sk1Au{--shiki-default:var(--shiki-token-string-expression)}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);}",{"title":94,"searchDepth":126,"depth":126,"links":433},[434,435],{"id":51,"depth":108,"text":52},{"id":54,"depth":108,"text":55},"md",false,{},true,"\u002Ferrors","---\ntitle: Errors\ndescription: Every error uses the same format, with a stable code, a hint, a link to the fix and the request's trace id.\n---\n\n# Errors\n\n::lead\nEvery error response has the same format. It includes a stable `code` that your code can check, a `message` that describes what went wrong, a `hint` that explains how to fix it, a link to the error code's page, and the `traceId` that identifies the request in your logs.\n::\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"CONNECTION_NOT_FOUND\",\n    \"message\": \"No connected account was found for this request.\",\n    \"hint\": \"The user may not have connected this provider yet. Start a connection with PyasConnect.\",\n    \"status\": 404,\n    \"traceId\": \"trc_5f2a9c1e7b3d4a6f8e0c2b1d\",\n    \"docs\": \"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_NOT_FOUND\"\n  }\n}\n```\n\n- Check `code` in your error handling, never `message`. Messages are written for people and can be improved over time, but codes don't change.\n- Write `hint` to your logs, where developers can read it.\n- Keep the `traceId`. Include it when you contact support so that we can help you faster. To see what the request did, how the provider responded and why the request failed, call the endpoint below or run `pyas logs get trc_...`:\n\n```http\nGET \u002Fv2\u002Flogs\u002F{traceId}\n```\n\nThe error codes are also available as data, for use in your tooling and your coding agent. This request returns every code with its status, causes, fix, whether retrying helps, and related codes:\n\n```http\nGET https:\u002F\u002Fapi.pyas.io\u002Fv2\u002Ferrors\n```\n\n## Status codes\n\n| Status | Meaning |\n|---|---|\n| `400 Bad Request` | A parameter or the body is invalid. The message identifies the field. |\n| `401 Unauthorized` | The API key is missing, wrong, revoked or expired. |\n| `402 Payment Required` | Your plan needs attention: no subscription, an overdue payment, or the plan's connected account limit is reached. |\n| `403 Forbidden` | The key isn't allowed to perform this action, because of its scopes, its mode (live or test) or your plan. |\n| `404 Not Found` | The account, calendar or event doesn't exist for your app. |\n| `409 Conflict` | Someone updated the resource after you read it, the same request is still in progress, or a sandbox limit is reached. |\n| `410 Gone` | The sync token has expired. Read the calendar again without one. |\n| `413 Content Too Large` | The body or the uploaded file is too large. |\n| `422 Unprocessable Entity` | The request is valid but can't be completed: the provider doesn't support it or rejected it, the account must be reconnected, or an `Idempotency-Key` was reused for a different request. |\n| `429 Too Many Requests` | You've sent too many requests. Wait the number of seconds in `Retry-After`. |\n| `5xx` | Pyas or the provider failed. Retry with backoff. |\n\n## Every code\n\n::error-codes\n::\n",null,{"title":47,"description":48},"6D0IVofXzD9rKGyLITcZ0Uw-mh64tarQm7dSzDE8tqs",[446,457,466,477,489,500,509,519,528,537,548,556,565,575,588,601,610,622,631,641,652,662,673,684,694,704,715,724,735,746,758,769,779,788,797,804,813,825,834,845,856,867,875,887,898,908,919,930],{"code":447,"status":448,"message":449,"hint":450,"retryable":437,"causes":451,"fix":453,"related":454,"docs":456},"AUTH_EXPIRED_KEY",401,"The API key has expired.","Use the key that replaced it. The rotation grace period for this key has ended.",[452],"The key was rotated and its grace period ended","Use the current key from the dashboard (API keys) and remove the old one from your configuration.",[455],"AUTH_INVALID_KEY","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_EXPIRED_KEY",{"code":458,"status":448,"message":459,"hint":460,"retryable":437,"causes":461,"fix":460,"related":463,"docs":465},"AUTH_EXPIRED_SESSION","The session has expired.","Sign in again.",[462],"Inactivity for longer than the session lifetime",[464],"AUTH_INVALID_SESSION","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_EXPIRED_SESSION",{"code":467,"status":468,"message":469,"hint":470,"retryable":437,"causes":471,"fix":474,"related":475,"docs":476},"AUTH_INSUFFICIENT_SCOPE",403,"The API key or session does not have permission to make this request.","Use an API key or session that has the permission this endpoint requires.",[472,473],"A restricted key used on an endpoint outside its scope","A team role without this permission","Create a key with the required scope, or ask an organization owner to grant you the permission.",[455],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_INSUFFICIENT_SCOPE",{"code":478,"status":448,"message":479,"hint":480,"retryable":437,"causes":481,"fix":485,"related":486,"docs":488},"AUTH_INVALID_CONNECT_SESSION","The connect session is missing, invalid, expired or already used.","Create a new connect session on your server and try again.",[482,483,484],"The session is older than 10 minutes","The session was already used to connect an account","The token was copied incorrectly","Create a new connect session (`POST \u002Fv2\u002Fconnect\u002Fsessions`) for each connection, and use it within 10 minutes.",[487],"AUTH_ORIGIN_NOT_ALLOWED","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_INVALID_CONNECT_SESSION",{"code":455,"status":448,"message":490,"hint":491,"retryable":437,"causes":492,"fix":496,"related":497,"docs":499},"The API key is missing, unknown or revoked.","Send a valid key in the `x-api-key` header. You can manage your keys in the Pyas dashboard.",[493,494,495],"A missing `x-api-key` header","A typo in the key","The key was revoked or deleted","Copy the key again from the dashboard (API keys) and send it as `x-api-key: \u003Ckey>`, not as a bearer token.",[447,498],"AUTH_SANDBOX_MISMATCH","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_INVALID_KEY",{"code":464,"status":448,"message":501,"hint":460,"retryable":437,"causes":502,"fix":506,"related":507,"docs":508},"The session is missing, invalid or revoked.",[503,504,505],"The user signed out in another tab","The session was revoked","The browser blocks cookies","Sign in again. If this keeps happening, allow cookies for the dashboard.",[458],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_INVALID_SESSION",{"code":510,"status":468,"message":511,"hint":512,"retryable":437,"causes":513,"fix":516,"related":517,"docs":518},"AUTH_KEY_IN_BROWSER","A live API key was sent from a web page. Live keys only work from a server.","Move this request to your server and keep the key in a server secret. Rotate the key, since anyone who opened the page could read it.",[514,515],"The key is in front-end code, so every visitor to the page can read it","An AI app builder put the API call in the browser instead of a server function","Make the request from your server (an API route, or a serverless or edge function) with the key kept as a secret, then rotate the key in the dashboard. Code in the browser never needs a key: to connect accounts, your server creates a connect session and the page uses its token.",[455,478],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_KEY_IN_BROWSER",{"code":487,"status":468,"message":520,"hint":521,"retryable":437,"causes":522,"fix":525,"related":526,"docs":527},"The request's origin is not in the app's allowed origins.","Add the site's origin to the app's allowed origins in the dashboard.",[523,524],"A new domain or port that has not been added to the app yet","A scheme or subdomain mismatch (`http` and `https`, or `www` and no `www`, are different origins)","Add the exact origin, including scheme, host and port, to the app's allowed origins.",[478],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_ORIGIN_NOT_ALLOWED",{"code":498,"status":468,"message":529,"hint":530,"retryable":437,"causes":531,"fix":534,"related":535,"docs":536},"A test key was used with live data, or a live key was used with sandbox data.","Use a test key for sandbox requests and a live key for real connections.",[532,533],"API keys swapped between environments","A request that only works with real accounts was sent with a test key: an account import, or connecting without PyasConnect (`GET \u002Fv2\u002Fconnect\u002Foauth`)","Check which key your environment loads. Test keys start with `pyas_sk_test_`. Live keys start with `pyas_sk_` and do not include `test_`. To test connecting accounts in the sandbox, use PyasConnect with a connect session created with your test key.",[455],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FAUTH_SANDBOX_MISMATCH",{"code":538,"status":539,"message":540,"hint":541,"retryable":437,"causes":542,"fix":544,"related":545,"docs":547},"BILLING_CONNECTION_LIMIT",402,"The plan's connected account limit has been reached.","Upgrade the plan or delete unused connected accounts.",[543],"More connected accounts than the plan includes","Upgrade the plan in the dashboard (Billing), or delete connected accounts you no longer need.",[546],"BILLING_FEATURE_UNAVAILABLE","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FBILLING_CONNECTION_LIMIT",{"code":546,"status":468,"message":549,"hint":550,"retryable":437,"causes":551,"fix":553,"related":554,"docs":555},"This feature is not included in the current plan.","Upgrade the plan to use this feature.",[552],"A feature that requires a higher plan","Upgrade the plan in the dashboard (Billing).",[538],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FBILLING_FEATURE_UNAVAILABLE",{"code":557,"status":539,"message":558,"hint":559,"retryable":437,"causes":560,"fix":562,"related":563,"docs":564},"BILLING_OVERDUE","The account has an overdue payment.","Update the payment method in the dashboard.",[561],"A failed card payment","Update the payment method in the dashboard (Billing). Service resumes once the payment succeeds.",[546],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FBILLING_OVERDUE",{"code":566,"status":539,"message":567,"hint":568,"retryable":437,"causes":569,"fix":572,"related":573,"docs":574},"BILLING_SUBSCRIPTION_REQUIRED","The organization has no active subscription.","Choose a plan in the dashboard (Billing).",[570,571],"No plan has been chosen","The subscription was canceled or has ended","Choose or renew a plan in the dashboard (Billing).",[557],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FBILLING_SUBSCRIPTION_REQUIRED",{"code":576,"status":577,"message":578,"hint":579,"retryable":437,"causes":580,"fix":584,"related":585,"docs":587},"CONNECTION_CONSENT_FAILED",422,"The provider did not complete the connection.","Ask the user to connect again.",[581,582,583],"The user canceled or declined consent","The authorization code expired or was already used","The provider returned no refresh token or no email address for the account","Start a new connect session. If it keeps failing for one user, check that their administrator allows the app.",[586],"CONNECTION_PROVIDER_NOT_CONFIGURED","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_CONSENT_FAILED",{"code":589,"status":590,"message":591,"hint":592,"retryable":437,"causes":593,"fix":597,"related":598,"docs":600},"CONNECTION_NOT_FOUND",404,"No connected account was found for this request.","The user may not have connected this provider yet. Start a connection with PyasConnect.",[594,595,596],"The `accountId` is wrong or belongs to another app","The user never connected this provider","The connected account was deleted","List the app's connected accounts with `GET \u002Fv2\u002Faccounts` to find the correct `accountId`, or connect the account with PyasConnect.",[599],"CONNECTION_REVOKED","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_NOT_FOUND",{"code":586,"status":577,"message":602,"hint":603,"retryable":437,"causes":604,"fix":607,"related":608,"docs":609},"The app is not configured to connect accounts from this provider.","Complete the provider's OAuth settings for the app in the dashboard.",[605,606],"The app uses Native Auth for this provider, and its client ID, client secret or callback URL is missing","The app uses Pyas Auth for Google and asked for a feature (`manageCalendars`, `sharing`, `meetingSettings` or `rooms`) whose permissions Google has not approved for Pyas's Google app yet","Enter the client ID, client secret and redirect URI for Native Auth, or switch the app back to Pyas Auth. For a Google feature Pyas Auth cannot ask for yet, set up Native Auth for Google or leave the feature out.",[576],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_PROVIDER_NOT_CONFIGURED",{"code":599,"status":577,"message":611,"hint":612,"retryable":437,"causes":613,"fix":617,"related":618,"docs":621},"The user revoked access, or the provider no longer accepts the stored credentials.","Ask the user to reconnect.",[614,615,616],"The user removed the app from their Google or Microsoft account","An administrator revoked access","The user changed their password and the provider invalidated the tokens","Have the user reconnect through PyasConnect. Listen for the `connection.broken` webhook to detect this early.",[619,620],"CONNECTION_SCOPE_INSUFFICIENT","CONNECTION_TOKEN_EXPIRED","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_REVOKED",{"code":619,"status":577,"message":623,"hint":624,"retryable":437,"causes":625,"fix":628,"related":629,"docs":630},"The connected account did not grant a permission that this operation requires.","Ask the user to reconnect and approve all requested permissions.",[626,627],"The user unchecked a permission on the consent screen","The operation requires a scope that was added after the user connected","Have the user reconnect through PyasConnect and accept every permission.",[599],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_SCOPE_INSUFFICIENT",{"code":620,"status":577,"message":632,"hint":633,"retryable":439,"causes":634,"fix":637,"related":638,"docs":640},"The provider's access token expired and could not be refreshed.","Retry the request shortly. If it keeps failing, ask the user to reconnect their account.",[635,636],"A temporary provider outage during refresh","The refresh token was invalidated","Retry with backoff. If the error persists, have the user reconnect through PyasConnect.",[599,639],"PROVIDER_UNAVAILABLE","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECTION_TOKEN_EXPIRED",{"code":642,"status":643,"message":644,"hint":645,"retryable":439,"causes":646,"fix":648,"related":649,"docs":651},"CONNECT_CANCELLED",0,"The user closed the widget before connecting.","No action is needed. The user can start again at any time.",[647],"The user closed the dialog, pressed Escape or chose Cancel","No action is needed. If your page should react, listen for the `cancel` event.",[650],"CONNECT_TIMEOUT","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_CANCELLED",{"code":653,"status":643,"message":654,"hint":655,"retryable":439,"causes":656,"fix":659,"related":660,"docs":661},"CONNECT_CONSENT_DENIED","The user did not grant access at the provider.","Let the user try again, and explain why your app needs access to their calendar.",[657,658],"The user chose Cancel or Deny on the consent screen","An administrator blocks the app for the user's organization","Explain how your app uses the calendar next to the connect button, then let the user try again.",[576],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_CONSENT_DENIED",{"code":663,"status":643,"message":664,"hint":665,"retryable":437,"causes":666,"fix":670,"related":671,"docs":672},"CONNECT_INVALID_CONFIG","The connect widget is not configured correctly.","Pass the widget a session token from your server, or a function that fetches one.",[667,668,669],"No session token, and no 1.x client ID and token name","A provider in `providers` that the widget does not support","Redirect mode used with 1.x keys","Create a connect session on your server (`POST \u002Fv2\u002Fconnect\u002Fsessions`) and pass its token to the widget.",[478],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_INVALID_CONFIG",{"code":674,"status":643,"message":675,"hint":676,"retryable":439,"causes":677,"fix":681,"related":682,"docs":683},"CONNECT_NETWORK_ERROR","The browser could not connect to the Pyas API.","Let the user try again once they are back online.",[678,679,680],"The user is offline or has an unstable connection","A Content Security Policy that does not allow the Pyas API in `connect-src`","An incorrect `api-url`","Check that the page allows `https:\u002F\u002Fapi.pyas.io` in `connect-src` and that `api-url` is correct. Otherwise, let the user try again.",[650],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_NETWORK_ERROR",{"code":685,"status":643,"message":686,"hint":687,"retryable":439,"causes":688,"fix":691,"related":692,"docs":693},"CONNECT_POPUP_BLOCKED","The browser blocked the sign-in window.","Open the widget directly from a click handler, or use redirect mode.",[689,690],"`open()` or the connect button was called after an `await`, outside the click handler","A strict pop-up blocker or an in-app browser","Call `open()` directly from the click handler. Where pop-ups don't work, such as in in-app browsers, set `mode=\"redirect\"` and use a session that has a `returnUrl`.",[650],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_POPUP_BLOCKED",{"code":695,"status":643,"message":696,"hint":697,"retryable":439,"causes":698,"fix":701,"related":702,"docs":703},"CONNECT_PROVIDER_ERROR","The calendar provider could not finish the sign-in.","Let the user try again, or choose another provider.",[699,700],"The provider responded with an error other than a refusal","The provider is experiencing issues","Let the user try again. If it keeps happening with one provider, check the provider's status page and your provider settings in the dashboard.",[653,576],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_PROVIDER_ERROR",{"code":705,"status":643,"message":706,"hint":707,"retryable":439,"causes":708,"fix":712,"related":713,"docs":714},"CONNECT_SESSION_FAILED","Your server could not create a connect session.","Check your session endpoint: the error event's message includes what it returned.",[709,710,711],"The endpoint behind `getSessionToken` failed or could not be reached","It responded without a `token` (it should return `{ \"token\": \"pcs_...\" }`, as the SDK's `sessionHandler` does)","Your server has no live API key set","Open your session endpoint's logs, set its live API key, and make it return `{ token }`. The person can try again from the dialog.",[674,478],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_SESSION_FAILED",{"code":650,"status":643,"message":716,"hint":717,"retryable":439,"causes":718,"fix":721,"related":722,"docs":723},"The sign-in timed out.","Let the user try again. If your users often need more time, increase `consentTimeoutMs`.",[719,720],"The user left the sign-in window open without finishing","A slow two-step verification at the provider","Let the user try again. The widget shows a retry option on its own screen. To log the error, listen for the `error` event.",[642,685],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FCONNECT_TIMEOUT",{"code":725,"status":726,"message":727,"hint":728,"retryable":439,"causes":729,"fix":731,"related":732,"docs":734},"INTERNAL_ERROR",500,"Something went wrong on our end.","Retry the request. If the error persists, contact support and include the trace ID.",[730],"A bug or an outage in Pyas","Retry with backoff. Every occurrence is reported to Pyas. If the error persists, contact support and include the trace ID.",[733],"PROVIDER_UNKNOWN_ERROR","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FINTERNAL_ERROR",{"code":736,"status":737,"message":738,"hint":739,"retryable":437,"causes":740,"fix":742,"related":743,"docs":745},"PROVIDER_PARTIAL_SUCCESS",207,"Some operations succeeded and some failed.","Check the result of each operation. Only the failed operations need attention.",[741],"One item in a batch was rejected while the others succeeded","Read the result of each operation, fix the failed operations, and resend only those.",[744],"VALIDATION_REJECTED_BY_PROVIDER","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FPROVIDER_PARTIAL_SUCCESS",{"code":747,"status":748,"message":749,"hint":750,"retryable":439,"causes":751,"fix":754,"related":755,"docs":757},"PROVIDER_RATE_LIMITED",429,"The calendar provider is rate limiting requests for this account.","Wait for the interval in the `Retry-After` header, then retry the request.",[752,753],"Many requests for one account in a short time","Provider-wide throttling","Retry after the `Retry-After` interval, and spread bulk work over time. Use webhooks instead of polling.",[756],"RATE_LIMIT_EXCEEDED","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FPROVIDER_RATE_LIMITED",{"code":759,"status":760,"message":761,"hint":762,"retryable":439,"causes":763,"fix":766,"related":767,"docs":768},"PROVIDER_TIMEOUT",504,"The calendar provider did not respond in time.","Retry the request. For large ranges, request a smaller time window.",[764,765],"A slow provider response","A very large time window or calendar","Retry with backoff, and narrow the `from` and `to` window for large reads.",[639],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FPROVIDER_TIMEOUT",{"code":639,"status":770,"message":771,"hint":772,"retryable":439,"causes":773,"fix":776,"related":777,"docs":778},503,"The calendar provider is not responding normally.","Retry the request with exponential backoff.",[774,775],"A Google or Microsoft outage","Provider maintenance","Retry with exponential backoff. Check the provider's status page for ongoing incidents.",[759],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FPROVIDER_UNAVAILABLE",{"code":733,"status":780,"message":781,"hint":782,"retryable":437,"causes":783,"fix":785,"related":786,"docs":787},502,"The calendar provider returned an error that Pyas could not classify.","Retry the request once. If the error repeats, contact support and include the trace ID.",[784],"A provider error that Pyas has not seen before","Contact support and include the trace ID. Pyas is notified of every occurrence, and classifies or fixes each one.",[639],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FPROVIDER_UNKNOWN_ERROR",{"code":789,"status":748,"message":790,"hint":791,"retryable":439,"causes":792,"fix":794,"related":795,"docs":796},"RATE_LIMIT_BURST","Too many requests were sent in a short period.","Wait a moment, then spread your requests out over time.",[793],"Many requests in the same second","Add a short delay between requests, or queue them.",[756],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRATE_LIMIT_BURST",{"code":756,"status":748,"message":798,"hint":750,"retryable":439,"causes":799,"fix":801,"related":802,"docs":803},"The request rate exceeds this plan's rate limit.",[800],"Sustained traffic above the plan's rate limit","Wait for the `Retry-After` interval, cache reads, and use webhooks instead of polling. Higher plans have higher limits.",[789,747],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRATE_LIMIT_EXCEEDED",{"code":805,"status":748,"message":806,"hint":807,"retryable":437,"causes":808,"fix":810,"related":811,"docs":812},"RATE_MONTHLY_QUOTA_EXCEEDED","This plan's monthly API request limit has been reached.","Upgrade the plan, or wait for the limit to reset at the start of next month.",[809],"More API requests this month than the plan includes","Upgrade the plan in the dashboard (Billing). To make fewer requests, cache reads and use webhooks instead of polling.",[756,566],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRATE_MONTHLY_QUOTA_EXCEEDED",{"code":814,"status":815,"message":816,"hint":817,"retryable":437,"causes":818,"fix":821,"related":822,"docs":824},"RESOURCE_CONFLICT",409,"The resource was modified or already exists.","Fetch the resource again and retry with its current version.",[819,820],"Someone else updated the event after you read it (`If-Match` did not match)","An attempt to create a resource that already exists","Fetch the latest version, reapply your change, and send it with the new `version` in the `If-Match` header.",[823],"VALIDATION_IDEMPOTENCY_CONFLICT","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRESOURCE_CONFLICT",{"code":826,"status":815,"message":827,"hint":828,"retryable":437,"causes":829,"fix":831,"related":832,"docs":833},"RESOURCE_LIMIT_REACHED","The limit for this resource has been reached.","Delete existing items first. The error message includes the limit.",[830],"The sandbox's limits on virtual accounts, calendars or events (test keys)","Delete items you no longer need, or reset the sandbox with `POST \u002Fv2\u002Fsandbox\u002Freset`.",[805],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRESOURCE_LIMIT_REACHED",{"code":835,"status":590,"message":836,"hint":837,"retryable":437,"causes":838,"fix":842,"related":843,"docs":844},"RESOURCE_NOT_FOUND","The calendar or event was not found.","Check the ID. The item may have been deleted, or it may not be visible to this account.",[839,840,841],"A wrong or outdated ID","The item was deleted","The account does not have access to this calendar","List the calendars or events again to get their current IDs.",[589],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRESOURCE_NOT_FOUND",{"code":846,"status":847,"message":848,"hint":849,"retryable":437,"causes":850,"fix":853,"related":854,"docs":855},"RESOURCE_SYNC_TOKEN_EXPIRED",410,"The sync token has expired.","Request the full list again without a `syncToken`, and store the new `syncToken` from the response.",[851,852],"The token is older than the provider's change history","The calendar was reset or its sharing settings changed","Discard the stored `syncToken`, list the events again from the beginning, and store the `syncToken` from the last page.",[835],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FRESOURCE_SYNC_TOKEN_EXPIRED",{"code":857,"status":577,"message":858,"hint":859,"retryable":437,"causes":860,"fix":863,"related":864,"docs":866},"VALIDATION_ENDPOINT_UNREACHABLE","The webhook endpoint did not accept a test delivery.","Make sure the endpoint responds with a 2xx status to a signed `POST` request, then try again.",[861,862],"Reactivating a webhook endpoint that still fails (Pyas sends a test delivery first)","The endpoint is down, responds with a non-2xx status, doesn't respond within 10 seconds, or resolves to a private network","Check the error message and fix the endpoint. Then reactivate it with `PATCH \u002Fv2\u002Fwebhooks\u002F:webhookId` and the body `{ \"status\": \"active\" }`.",[865],"VALIDATION_INVALID_BODY","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_ENDPOINT_UNREACHABLE",{"code":823,"status":577,"message":868,"hint":869,"retryable":437,"causes":870,"fix":872,"related":873,"docs":874},"This idempotency key was already used with a different request.","Use a new idempotency key for a new request.",[871],"The same key reused for different operations","Generate a new idempotency key for each distinct request. Reuse a key only to retry the same request.",[865],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_IDEMPOTENCY_CONFLICT",{"code":865,"status":876,"message":877,"hint":878,"retryable":437,"causes":879,"fix":883,"related":884,"docs":886},400,"The request body is not valid.","Check the fields listed in the error message against the API reference.",[880,881,882],"A missing required field","A field of the wrong type","Malformed JSON","Correct the fields listed in the error message and send the request again.",[885],"VALIDATION_INVALID_QUERY","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_INVALID_BODY",{"code":885,"status":876,"message":888,"hint":889,"retryable":437,"causes":890,"fix":894,"related":895,"docs":897},"A query parameter is not valid.","Check the parameters listed in the error message against the API reference.",[891,892,893],"An unknown parameter value","A date that is not in ISO 8601 format","`from` is later than `to`","Correct the parameters listed in the error message.",[865,896],"VALIDATION_INVALID_TIMEZONE","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_INVALID_QUERY",{"code":896,"status":876,"message":899,"hint":900,"retryable":437,"causes":901,"fix":905,"related":906,"docs":907},"The time zone is not an IANA time zone name.","Use an IANA time zone name such as `America\u002FNew_York`, not an abbreviation or an offset.",[902,903,904],"An abbreviation such as `EST`","A Windows time zone name such as `Eastern Standard Time`","An offset such as `-05:00`","Send an IANA time zone name, for example `America\u002FNew_York` or `Europe\u002FLondon`.",[885],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_INVALID_TIMEZONE",{"code":909,"status":910,"message":911,"hint":912,"retryable":437,"causes":913,"fix":916,"related":917,"docs":918},"VALIDATION_PAYLOAD_TOO_LARGE",413,"The request body exceeds the size limit for this endpoint.","Send a smaller request body. The error message includes the limit.",[914,915],"An attachment larger than the account's limit: 25 MB through Pyas, shown in its status as `capabilities.maxAttachmentBytes`","A file larger than 25 MB sent without a `Content-Length` header","Keep files within the limit in the error message, send a `Content-Length` header with large files, or attach a link to the file instead.",[865],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_PAYLOAD_TOO_LARGE",{"code":744,"status":577,"message":920,"hint":921,"retryable":437,"causes":922,"fix":926,"related":927,"docs":929},"The calendar provider rejected this input.","Change the input as described in the error message. Some values are valid in Pyas but not supported by every provider.",[923,924,925],"A recurrence rule the provider cannot represent","An attendee address the provider rejects","A value outside the provider's limits","Change the input as described in the error message. The connected account's capabilities describe what each provider supports.",[928],"VALIDATION_UNSUPPORTED_OPERATION","https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_REJECTED_BY_PROVIDER",{"code":928,"status":577,"message":931,"hint":932,"retryable":437,"causes":933,"fix":936,"related":937,"docs":938},"This provider does not support this operation.","Check the connected account's capabilities before making the request.",[934,935],"Calendar writes on a provider that does not support them","Incremental sync on a provider that does not support it","Check the connected account's capabilities, and skip or replace the operation for providers that do not support it.",[744],"https:\u002F\u002Fdeveloper.pyas.io\u002Ferrors\u002FVALIDATION_UNSUPPORTED_OPERATION",1794697271434]