[{"data":1,"prerenderedAt":582},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdocs\u002Ferrors-and-retries":60},[4,8,12,16,20,24,28,32,36,40,44,48,52,56],{"path":5,"title":6,"description":7},"\u002Fdocs\u002Fquickstart","Quickstart","Read both sides of an INE from your backend and receive structured JSON.",{"path":9,"title":10,"description":11},"\u002Fdocs\u002Fauthentication","Authentication","Keep company API keys on the server and separate them from dashboard access.",{"path":13,"title":14,"description":15},"\u002Fdocs\u002Fcreate-reading","Create a reading","Submit one front and back pair with a stable idempotency key.",{"path":17,"title":18,"description":19},"\u002Fdocs\u002Fretrieve-result","Retrieve a result","Read an existing job without repeating extraction or consuming another unit.",{"path":21,"title":22,"description":23},"\u002Fdocs\u002Fresponse-fields","Response fields","Choose the standard or extended response and use literal fields with review warnings.",{"path":25,"title":26,"description":27},"\u002Fdocs\u002Ferrors-and-retries","Errors and retries","Recover from errors without accidentally creating another charged reading.",{"path":29,"title":30,"description":31},"\u002Fdocs\u002Flimits-and-billing","Limits and billing","Plan allowances, shared admission limits and how reading units are counted.",{"path":33,"title":34,"description":35},"\u002Fdocs\u002Fprivacy-and-security","Privacy and security","Understand result retention, access controls and your backend's responsibilities.",{"path":37,"title":38,"description":39},"\u002Fdocs\u002Fexamples","Integration examples","Copyable server-side Node.js, Python and cURL examples with one POST per attempt.",{"path":41,"title":42,"description":43},"\u002Fdocs\u002Fdashboard","Dashboard usage","View your company's quota and request counts without exposing OCR data.",{"path":45,"title":46,"description":47},"\u002Fdocs\u002Fextended-reading","Extended extraction","Opt in to printed fields, separated address components, provenance and review checks.",{"path":49,"title":50,"description":51},"\u002Fdocs\u002Fwebhooks","Completion webhooks","Receive signed completion events without exposing OCR data in callbacks.",{"path":53,"title":54,"description":55},"\u002Fdocs\u002Fevaluation","Evaluation and limitations","Measured illustration results, remaining errors, and the limits of the extended profile.",{"path":57,"title":58,"description":59},"\u002Fdocs\u002Faddress-parts","Address parts","Use separate address inputs while retaining literal OCR and exact text sources.",{"id":61,"title":26,"body":62,"description":27,"extension":576,"meta":577,"navigation":578,"path":25,"seo":579,"stem":580,"__hash__":581},"docs\u002Fdocs\u002F06.errors-and-retries.md",{"type":63,"value":64,"toc":571},"minimark",[65,69,208,223,228,422,428,432,455,504,507,511,535,548,558,567],[66,67,68],"p",{},"API errors use an English message, a stable code and an action:",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-json shiki shiki-themes material-theme-lighter github-light github-light","{\n  \"request_id\": \"00000000-0000-4000-8000-000000000001\",\n  \"error\": {\n    \"code\": \"concurrency_limited\",\n    \"message\": \"The company has reached its limit of active readings. Follow Retry-After.\",\n    \"action\": \"retry_later\"\n  }\n}\n","json","",[77,78,79,88,118,133,155,176,196,202],"code",{"__ignoreMap":75},[80,81,84],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"sYEpm","{\n",[80,89,91,95,99,102,105,109,113,115],{"class":82,"line":90},2,[80,92,94],{"class":93},"s4hL5","  \"",[80,96,98],{"class":97},"sup7M","request_id",[80,100,101],{"class":93},"\"",[80,103,104],{"class":86},":",[80,106,108],{"class":107},"sU42L"," \"",[80,110,112],{"class":111},"sN0tt","00000000-0000-4000-8000-000000000001",[80,114,101],{"class":107},[80,116,117],{"class":86},",\n",[80,119,121,123,126,128,130],{"class":82,"line":120},3,[80,122,94],{"class":93},[80,124,125],{"class":97},"error",[80,127,101],{"class":93},[80,129,104],{"class":86},[80,131,132],{"class":86}," {\n",[80,134,136,139,142,144,146,148,151,153],{"class":82,"line":135},4,[80,137,138],{"class":93},"    \"",[80,140,77],{"class":141},"s2tOn",[80,143,101],{"class":93},[80,145,104],{"class":86},[80,147,108],{"class":107},[80,149,150],{"class":111},"concurrency_limited",[80,152,101],{"class":107},[80,154,117],{"class":86},[80,156,158,160,163,165,167,169,172,174],{"class":82,"line":157},5,[80,159,138],{"class":93},[80,161,162],{"class":141},"message",[80,164,101],{"class":93},[80,166,104],{"class":86},[80,168,108],{"class":107},[80,170,171],{"class":111},"The company has reached its limit of active readings. Follow Retry-After.",[80,173,101],{"class":107},[80,175,117],{"class":86},[80,177,179,181,184,186,188,190,193],{"class":82,"line":178},6,[80,180,138],{"class":93},[80,182,183],{"class":141},"action",[80,185,101],{"class":93},[80,187,104],{"class":86},[80,189,108],{"class":107},[80,191,192],{"class":111},"retry_later",[80,194,195],{"class":107},"\"\n",[80,197,199],{"class":82,"line":198},7,[80,200,201],{"class":86},"  }\n",[80,203,205],{"class":82,"line":204},8,[80,206,207],{"class":86},"}\n",[66,209,210,211,213,214,216,217,213,219,222],{},"Use ",[77,212,77],{}," and ",[77,215,183],{}," in application logic; do not parse the human-readable message. Preserve the HTTP status, ",[77,218,98],{},[77,220,221],{},"Retry-After"," for troubleshooting. An edge or network failure may not have the API's JSON envelope.",[224,225,227],"h2",{"id":226},"actions","Actions",[229,230,231,247],"table",{},[232,233,234],"thead",{},[235,236,237,241,244],"tr",{},[238,239,240],"th",{},"Action",[238,242,243],{},"Typical codes",[238,245,246],{},"Next step",[248,249,250,282,297,327,352,370,397],"tbody",{},[235,251,252,258,279],{},[253,254,255],"td",{},[77,256,257],{},"fix_request",[253,259,260,263,264,263,267,263,270,263,273,263,276],{},[77,261,262],{},"invalid_idempotency_key",", ",[77,265,266],{},"missing_images",[77,268,269],{},"invalid_content_type",[77,271,272],{},"invalid_options",[77,274,275],{},"idempotency_conflict",[77,277,278],{},"result_expired",[253,280,281],{},"Correct the request. Recover an expired result from your saved copy.",[235,283,284,289,294],{},[253,285,286],{},[77,287,288],{},"check_api_key",[253,290,291],{},[77,292,293],{},"invalid_api_key",[253,295,296],{},"Check the server's key or contact support.",[235,298,299,304,324],{},[253,300,301],{},[77,302,303],{},"replace_images",[253,305,306,263,309,263,312,263,315,263,318,263,321],{},[77,307,308],{},"invalid_image",[77,310,311],{},"file_too_large",[77,313,314],{},"image_dimensions",[77,316,317],{},"identical_sides",[77,319,320],{},"image_too_complex",[77,322,323],{},"no_fields",[253,325,326],{},"Obtain suitable photographs. Changed bytes require a new transaction key.",[235,328,329,333,346],{},[253,330,331],{},[77,332,192],{},[253,334,335,263,338,263,340,263,343],{},[77,336,337],{},"rate_limited",[77,339,150],{},[77,341,342],{},"admission_changed",[77,344,345],{},"image_service_unavailable",[253,347,348,349,351],{},"Respect ",[77,350,221],{}," when present. Keep the same key and files.",[235,353,354,359,367],{},[253,355,356],{},[77,357,358],{},"check_quota",[253,360,361,263,364],{},[77,362,363],{},"quota_exceeded",[77,365,366],{},"trial_exhausted",[253,368,369],{},"Review the company's monthly allowance and contact support if needed.",[235,371,372,377,391],{},[253,373,374],{},[77,375,376],{},"check_status",[253,378,379,263,382,263,385,263,388],{},[77,380,381],{},"submission_unknown",[77,383,384],{},"service_unavailable",[77,386,387],{},"upstream_busy",[77,389,390],{},"upstream_timeout",[253,392,393,394,396],{},"GET the known ",[77,395,98],{}," before considering another submission.",[235,398,399,404,419],{},[253,400,401],{},[77,402,403],{},"contact_support",[253,405,406,263,409,263,412,263,415,418],{},[77,407,408],{},"trial_expired",[77,410,411],{},"invalid_ocr_response",[77,413,414],{},"result_unavailable",[77,416,417],{},"processing_expired",", terminal failure",[253,420,421],{},"Contact support with the request identifier, without secrets or document data.",[66,423,424,425,427],{},"The action is recovery guidance, not a promise that a request consumed no quota. Completed readings and ",[77,426,323],{}," failures remain billable. New technical failures are credited in quota when recorded; their attempt history remains. Historical failures keep their recorded usage. A quota credit is not a cash refund or an automatic retry.",[224,429,431],{"id":430},"idempotency-rules","Idempotency rules",[66,433,434,435,263,438,263,441,263,444,263,447,263,450,213,452,446],{},"Create a stable key once per business transaction and save it before sending. Use 8–128 characters from ",[77,436,437],{},"A–Z",[77,439,440],{},"a–z",[77,442,443],{},"0–9",[77,445,446],{},".",[77,448,449],{},"_",[77,451,104],{},[77,453,454],{},"-",[229,456,457,467],{},[232,458,459],{},[235,460,461,464],{},[238,462,463],{},"Situation",[238,465,466],{},"Behavior",[248,468,469,477,488,496],{},[235,470,471,474],{},[253,472,473],{},"Same company, key, exact bytes, mode and profile",[253,475,476],{},"Reuses the existing job, including across API versions. No extra unit.",[235,478,479,482],{},[253,480,481],{},"Same key, changed bytes, mode or profile",[253,483,484,485,446],{},"HTTP ",[77,486,487],{},"409 idempotency_conflict",[235,489,490,493],{},[253,491,492],{},"New key, even with the same photographs",[253,494,495],{},"Can create a new reserved job and consume another unit.",[235,497,498,501],{},[253,499,500],{},"Expired or failed existing job replay",[253,502,503],{},"Returns that job's expiry or failure; it does not restart OCR.",[66,505,506],{},"Do not generate a fresh key in an automatic retry loop. A timeout or disconnect does not reveal whether the server reserved a job, ran OCR or saved a result. If a request identifier is known, query it first. If it is not known, retain the same key and bytes when making an explicit recovery attempt.",[224,508,510],{"id":509},"rate-limits-and-terminal-failures","Rate limits and terminal failures",[66,512,513,514,517,518,520,521,523,524,526,527,530,531,534],{},"Admission rejections use HTTP ",[77,515,516],{},"429",". ",[77,519,150],{}," normally asks you to wait two seconds; ",[77,522,337],{}," uses a rolling-window delay of 1–60 seconds; ",[77,525,342],{}," asks for one second. Read the actual header. A monthly quota error does not promise a short retry interval. An expired pilot returns ",[77,528,529],{},"403 trial_expired","; an exhausted pilot returns ",[77,532,533],{},"429 trial_exhausted",". Neither creates a new job. Existing results remain retrievable within their normal access window.",[66,536,537,538,541,542,544,545,547],{},"GET or replay can return HTTP ",[77,539,540],{},"422"," for a failed reserved job. Stop polling that job. When a stored failure would otherwise suggest ",[77,543,376],{},", the action becomes ",[77,546,403],{}," to prevent a loop.",[66,549,550,551,554,555,557],{},"If a GET returns ",[77,552,553],{},"404"," after a confirmed pre-reservation rejection, an explicit POST retry can retain the same key and files. Do not infer that every ",[77,556,553],{}," authorizes a new transaction: check the company, request identifier and original error first.",[66,559,560,561,566],{},"Contact ",[562,563,565],"a",{"href":564},"mailto:ecodevcontact@gmail.com","ecodevcontact@gmail.com"," with the request identifier and error code. Keep API keys, dashboard codes, photographs and extracted personal data out of support messages and logs.",[568,569,570],"style",{},"html pre.shiki code .sYEpm, html code.shiki .sYEpm{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#24292E}html pre.shiki code .s4hL5, html code.shiki .s4hL5{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#005CC5}html pre.shiki code .sup7M, html code.shiki .sup7M{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#005CC5}html pre.shiki code .sU42L, html code.shiki .sU42L{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#032F62}html pre.shiki code .sN0tt, html code.shiki .sN0tt{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#032F62}html pre.shiki code .s2tOn, html code.shiki .s2tOn{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#005CC5}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":75,"searchDepth":90,"depth":90,"links":572},[573,574,575],{"id":226,"depth":90,"text":227},{"id":430,"depth":90,"text":431},{"id":509,"depth":90,"text":510},"md",{},{"title":26},{"title":26,"description":27},"docs\u002F06.errors-and-retries","WZSLsQR0kcsCMnYvbhVIFzYVKK4iGjToU7WZTuQctPg",1790659707420]