[{"data":1,"prerenderedAt":1041},["ShallowReactive",2],{"docs:\u002Fdocs\u002Fidempotency":3,"i-lucide:moon":1032,"i-lucide:github":1037,"i-lucide:menu":1039},{"id":4,"title":5,"body":6,"description":1025,"extension":1026,"meta":1027,"navigation":84,"path":1028,"seo":1029,"stem":1030,"__hash__":1031},"docs\u002Fdocs\u002Fidempotency.md","Idempotency",{"type":7,"value":8,"toc":1016},"minimark",[9,25,30,43,194,233,244,255,259,266,463,478,490,493,563,566,634,638,646,649,709,712,740,749,809,824,835,839,865,876,880,895,947,953,956,962,969,985,989,992,1009,1012],[10,11,12,13,17,18,21,22,24],"p",{},"Nuxt Endpoints can add optional ",[14,15,16],"code",{},"Idempotency-Key"," replay protection to a non-idempotent operation, such as a ",[14,19,20],{},"POST"," that grants points, posts a comment, or increments a counter. It is opt-in per endpoint. Prefer a natural domain key plus a database uniqueness constraint when the operation already has one; reach for ",[14,23,16],{}," when there is no natural unique key, the original response must be replayed, or retries need to coordinate through a shared claim.",[26,27,29],"h2",{"id":28},"central-policy","Central policy",[10,31,32,33,36,37,42],{},"Storage, scope resolution, and authorization are usually the same for every idempotent endpoint in an application. Define them once in ",[14,34,35],{},"server\u002Fendpoints\u002Fruntime.ts",", alongside the other ",[38,39,41],"a",{"href":40},"\u002Fdocs\u002Fendpoints#hooks","application-wide endpoint settings",":",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-ts shiki shiki-themes github-light-default github-dark-default","\u002F\u002F server\u002Fendpoints\u002Fruntime.ts\nimport { createRedisIdempotencyStorage } from '..\u002Futils\u002Fidempotency-storage'\n\nconst storage = createRedisIdempotencyStorage()\n\nexport default defineEndpointRuntime({\n  idempotency: {\n    storage: () => storage,\n    scope: ({ event }) => event.context.auth.tenantId,\n    authorization: 'middleware',\n  },\n})\n","ts","",[14,51,52,61,79,86,106,111,127,133,148,168,180,188],{"__ignoreMap":49},[53,54,57],"span",{"class":55,"line":56},"line",1,[53,58,60],{"class":59},"sA0OV","\u002F\u002F server\u002Fendpoints\u002Fruntime.ts\n",[53,62,64,68,72,75],{"class":55,"line":63},2,[53,65,67],{"class":66},"swxxe","import",[53,69,71],{"class":70},"saQ_J"," { createRedisIdempotencyStorage } ",[53,73,74],{"class":66},"from",[53,76,78],{"class":77},"sZItA"," '..\u002Futils\u002Fidempotency-storage'\n",[53,80,82],{"class":55,"line":81},3,[53,83,85],{"emptyLinePlaceholder":84},true,"\n",[53,87,89,92,96,99,103],{"class":55,"line":88},4,[53,90,91],{"class":66},"const",[53,93,95],{"class":94},"sOOdx"," storage",[53,97,98],{"class":66}," =",[53,100,102],{"class":101},"s9HWX"," createRedisIdempotencyStorage",[53,104,105],{"class":70},"()\n",[53,107,109],{"class":55,"line":108},5,[53,110,85],{"emptyLinePlaceholder":84},[53,112,114,117,120,123],{"class":55,"line":113},6,[53,115,116],{"class":66},"export",[53,118,119],{"class":66}," default",[53,121,122],{"class":101}," defineEndpointRuntime",[53,124,126],{"class":125},"sVS1I","({\n",[53,128,130],{"class":55,"line":129},7,[53,131,132],{"class":70},"  idempotency: {\n",[53,134,136,139,142,145],{"class":55,"line":135},8,[53,137,138],{"class":101},"    storage",[53,140,141],{"class":70},": () ",[53,143,144],{"class":66},"=>",[53,146,147],{"class":70}," storage,\n",[53,149,151,154,157,160,163,165],{"class":55,"line":150},9,[53,152,153],{"class":101},"    scope",[53,155,156],{"class":70},": ({ ",[53,158,159],{"class":125},"event",[53,161,162],{"class":70}," }) ",[53,164,144],{"class":66},[53,166,167],{"class":70}," event.context.auth.tenantId,\n",[53,169,171,174,177],{"class":55,"line":170},10,[53,172,173],{"class":70},"    authorization: ",[53,175,176],{"class":77},"'middleware'",[53,178,179],{"class":70},",\n",[53,181,183,186],{"class":55,"line":182},11,[53,184,185],{"class":70},"  }",[53,187,179],{"class":125},[53,189,191],{"class":55,"line":190},12,[53,192,193],{"class":125},"})\n",[195,196,197,208,214,223],"ul",{},[198,199,200,203,204,207],"li",{},[14,201,202],{},"storage"," (required): returns an application-owned durable ",[14,205,206],{},"IdempotencyStorage"," adapter. It must return an existing adapter and must not open a connection per request.",[198,209,210,213],{},[14,211,212],{},"scope"," (required): returns a trusted server-derived string, such as an authenticated user or tenant id, or an explicit anonymous\u002Fglobal choice. The raw client must never select scope.",[198,215,216,219,220,222],{},[14,217,218],{},"authorization"," (required): either a callback run on every request, including replays, or the literal ",[14,221,176],{}," asserting that Nitro middleware already made the full authorization decision. There is no implicit default; authentication alone is not that assertion.",[198,224,225,228,229,232],{},[14,226,227],{},"leaseTtlMs"," \u002F ",[14,230,231],{},"replayTtlMs"," (optional): application-wide TTL defaults.",[10,234,235,236,239,240,243],{},"The policy file is server runtime code: it is bundled into the Nitro server and never evaluated during build-time discovery, so it can hold real infrastructure connections. It cannot live in ",[14,237,238],{},"nuxt.config.ts"," because module options must be serializable and cannot carry these functions into the server bundle. To use a different path, set ",[14,241,242],{},"endpoints: { runtime: { path: 'server\u002Fpolicies\u002Fendpoints.ts' } }",".",[10,245,246,247,250,251,254],{},"The convention path is looked up in every root that can contribute server routes: the project ",[14,248,249],{},"server\u002F"," directory, extended Nuxt layers, and custom Nitro ",[14,252,253],{},"scanDirs",". The first match wins, project first.",[26,256,258],{"id":257},"declare-it-on-an-endpoint","Declare it on an endpoint",[10,260,261,262,265],{},"With a central policy in place, an endpoint declares only its contract-side metadata, as an ",[14,263,264],{},"idempotency"," slot alongside the rest of the contract:",[44,267,269],{"className":46,"code":268,"language":48,"meta":49,"style":49},"import { z } from 'zod'\n\nexport default defineEndpoint({\n  operation: 'grantPoints',\n  body: z.object({ userId: z.string(), amount: z.number().int().positive() }),\n  responses: {\n    201: z.object({ balance: z.number() }),\n  },\n  idempotency: {\n    required: true,\n    replayStatuses: [201],\n  },\n  handler: ({ body, respond }) => {\n    return respond(201, { balance: grantPoints(body.userId, body.amount) })\n  },\n})\n",[14,270,271,283,287,298,308,344,349,367,373,377,387,398,404,428,451,458],{"__ignoreMap":49},[53,272,273,275,278,280],{"class":55,"line":56},[53,274,67],{"class":66},[53,276,277],{"class":70}," { z } ",[53,279,74],{"class":66},[53,281,282],{"class":77}," 'zod'\n",[53,284,285],{"class":55,"line":63},[53,286,85],{"emptyLinePlaceholder":84},[53,288,289,291,293,296],{"class":55,"line":81},[53,290,116],{"class":66},[53,292,119],{"class":66},[53,294,295],{"class":101}," defineEndpoint",[53,297,126],{"class":125},[53,299,300,303,306],{"class":55,"line":88},[53,301,302],{"class":70},"  operation: ",[53,304,305],{"class":77},"'grantPoints'",[53,307,179],{"class":125},[53,309,310,313,316,319,322,325,328,331,334,336,339,342],{"class":55,"line":108},[53,311,312],{"class":70},"  body: z.",[53,314,315],{"class":101},"object",[53,317,318],{"class":70},"({ userId: z.",[53,320,321],{"class":101},"string",[53,323,324],{"class":70},"(), amount: z.",[53,326,327],{"class":101},"number",[53,329,330],{"class":70},"().",[53,332,333],{"class":101},"int",[53,335,330],{"class":70},[53,337,338],{"class":101},"positive",[53,340,341],{"class":70},"() })",[53,343,179],{"class":125},[53,345,346],{"class":55,"line":113},[53,347,348],{"class":70},"  responses: {\n",[53,350,351,354,357,359,362,364],{"class":55,"line":129},[53,352,353],{"class":94},"    201",[53,355,356],{"class":70},": z.",[53,358,315],{"class":101},[53,360,361],{"class":70},"({ balance: z.",[53,363,327],{"class":101},[53,365,366],{"class":70},"() }),\n",[53,368,369,371],{"class":55,"line":135},[53,370,185],{"class":70},[53,372,179],{"class":125},[53,374,375],{"class":55,"line":150},[53,376,132],{"class":70},[53,378,379,382,385],{"class":55,"line":170},[53,380,381],{"class":70},"    required: ",[53,383,384],{"class":94},"true",[53,386,179],{"class":70},[53,388,389,392,395],{"class":55,"line":182},[53,390,391],{"class":70},"    replayStatuses: [",[53,393,394],{"class":94},"201",[53,396,397],{"class":70},"],\n",[53,399,400,402],{"class":55,"line":190},[53,401,185],{"class":70},[53,403,179],{"class":125},[53,405,407,410,412,415,418,421,423,425],{"class":55,"line":406},13,[53,408,409],{"class":101},"  handler",[53,411,156],{"class":70},[53,413,414],{"class":125},"body",[53,416,417],{"class":70},", ",[53,419,420],{"class":125},"respond",[53,422,162],{"class":70},[53,424,144],{"class":66},[53,426,427],{"class":70}," {\n",[53,429,431,434,437,440,442,445,448],{"class":55,"line":430},14,[53,432,433],{"class":66},"    return",[53,435,436],{"class":101}," respond",[53,438,439],{"class":70},"(",[53,441,394],{"class":94},[53,443,444],{"class":70},", { balance: ",[53,446,447],{"class":101},"grantPoints",[53,449,450],{"class":70},"(body.userId, body.amount) })\n",[53,452,454,456],{"class":55,"line":453},15,[53,455,185],{"class":70},[53,457,179],{"class":125},[53,459,461],{"class":55,"line":460},16,[53,462,193],{"class":125},[10,464,465,466,469,470,473,474,477],{},"The same options are also available as ",[14,467,468],{},".idempotency(options)",", an immutable method on a ",[14,471,472],{},"defineEndpoint(...)"," contract declared without a ",[14,475,476],{},"handler",": it returns a new endpoint and does not mutate the original. Both forms run the same code, so pick the one that fits the file.",[10,479,480,481,485,486,489],{},"Because these arguments are serializable metadata, the declaration also stays safe inside a ",[38,482,484],{"href":483},"\u002Fdocs\u002Fendpoints#separate-contract-files","separate contract file",", where the contract keeps the two-call form and ",[14,487,488],{},".idempotency()"," composes onto it.",[10,491,492],{},"An endpoint can override any runtime option for route-specific needs — authorization is the most common case:",[44,494,496],{"className":46,"code":495,"language":48,"meta":49,"style":49},"export const endpoint = defineEndpoint({ ... }).idempotency({\n  required: true,\n  authorization: ({ event }) => requirePermission(event, 'points:grant'),\n})\n",[14,497,498,525,534,559],{"__ignoreMap":49},[53,499,500,502,505,508,510,512,515,518,521,523],{"class":55,"line":56},[53,501,116],{"class":66},[53,503,504],{"class":66}," const",[53,506,507],{"class":94}," endpoint",[53,509,98],{"class":66},[53,511,295],{"class":101},[53,513,514],{"class":70},"({ ",[53,516,517],{"class":66},"...",[53,519,520],{"class":70}," }).",[53,522,264],{"class":101},[53,524,126],{"class":70},[53,526,527,530,532],{"class":55,"line":63},[53,528,529],{"class":70},"  required: ",[53,531,384],{"class":94},[53,533,179],{"class":70},[53,535,536,539,541,543,545,547,550,553,556],{"class":55,"line":81},[53,537,538],{"class":101},"  authorization",[53,540,156],{"class":70},[53,542,159],{"class":125},[53,544,162],{"class":70},[53,546,144],{"class":66},[53,548,549],{"class":101}," requirePermission",[53,551,552],{"class":70},"(event, ",[53,554,555],{"class":77},"'points:grant'",[53,557,558],{"class":70},"),\n",[53,560,561],{"class":55,"line":88},[53,562,193],{"class":70},[10,564,565],{},"Endpoints can also keep supplying everything locally, with no policy file — the original fully-explicit form is unchanged:",[44,567,569],{"className":46,"code":568,"language":48,"meta":49,"style":49},"defineEndpoint({ ... }).idempotency({\n  storage: () => storage,\n  scope: ({ event }) => event.context.tenantId,\n  authorization: 'middleware',\n  required: true,\n})\n",[14,570,571,586,597,613,622,630],{"__ignoreMap":49},[53,572,573,576,578,580,582,584],{"class":55,"line":56},[53,574,575],{"class":101},"defineEndpoint",[53,577,514],{"class":70},[53,579,517],{"class":66},[53,581,520],{"class":70},[53,583,264],{"class":101},[53,585,126],{"class":70},[53,587,588,591,593,595],{"class":55,"line":63},[53,589,590],{"class":101},"  storage",[53,592,141],{"class":70},[53,594,144],{"class":66},[53,596,147],{"class":70},[53,598,599,602,604,606,608,610],{"class":55,"line":81},[53,600,601],{"class":101},"  scope",[53,603,156],{"class":70},[53,605,159],{"class":125},[53,607,162],{"class":70},[53,609,144],{"class":66},[53,611,612],{"class":70}," event.context.tenantId,\n",[53,614,615,618,620],{"class":55,"line":88},[53,616,617],{"class":70},"  authorization: ",[53,619,176],{"class":77},[53,621,179],{"class":70},[53,623,624,626,628],{"class":55,"line":108},[53,625,529],{"class":70},[53,627,384],{"class":94},[53,629,179],{"class":70},[53,631,632],{"class":55,"line":113},[53,633,193],{"class":70},[26,635,637],{"id":636},"options-and-resolution-order","Options and resolution order",[10,639,640,641,645],{},"Each runtime option resolves per item: ",[642,643,644],"strong",{},"endpoint → central policy → library default"," (where one exists).",[10,647,648],{},"Contract-side, endpoint-only:",[195,650,651,660,669,679],{},[198,652,653,656,657,659],{},[14,654,655],{},"headerName"," (optional, default ",[14,658,16],{},"): overrides the header name. Matching is case-insensitive.",[198,661,662,656,665,668],{},[14,663,664],{},"required",[14,666,667],{},"false","): whether the header is mandatory. Reflected in the generated client type.",[198,670,671,674,675,678],{},[14,672,673],{},"replayStatuses"," (optional): extra declared statuses to record for replay. Successful ",[14,676,677],{},"2xx"," responses are recorded by default.",[198,680,681,684,685,690,691,417,694,697,698,700,701,704,705,708],{},[14,682,683],{},"fingerprint"," (",[642,686,687,688],{},"required when the endpoint declares no ",[14,689,414],{},", optional otherwise): projects the request into the stored fingerprint. The default projection covers what the handler can observe, which is what decides whether two requests are the same request: validated ",[14,692,693],{},"params",[14,695,696],{},"query",", and ",[14,699,414],{},", plus the negotiated media type when the endpoint offers more than one. Because the values are the validated ones rather than the raw bytes, a retry differing only in JSON key order, insignificant whitespace, or a value the schema coerces (",[14,702,703],{},"?limit=010"," and ",[14,706,707],{},"?limit=10",") is the same request. Provide this when behavior depends on something the projection does not include, such as a header carrying currency or API version.",[10,710,711],{},"Runtime, policy-defaulted and endpoint-overridable:",[195,713,714,723,732],{},[198,715,716,417,718,417,720,722],{},[14,717,202],{},[14,719,212],{},[14,721,218],{},": as described under Central policy. One of the two layers must provide each of them.",[198,724,725,727,728,731],{},[14,726,227],{}," (default ",[14,729,730],{},"60000","): in-flight lease duration. Size it for the maximum expected handler duration.",[198,733,734,727,736,739],{},[14,735,231],{},[14,737,738],{},"86400000","): how long a completed response remains replayable.",[10,741,742,743,745,746,748],{},"An endpoint with no ",[14,744,414],{}," contract must supply ",[14,747,683],{}," explicitly, because the default projection has no validated body to cover and cannot tell two cases apart: an operation that genuinely takes no input, where the key alone identifies it, and a handler that reads an undeclared body itself, where the default would give two different payloads the same fingerprint and replay the first response to the second. Rather than guess, the endpoint states what identifies the request:",[44,750,752],{"className":46,"code":751,"language":48,"meta":49,"style":49},"defineEndpoint({ operation: 'publishItem', params: z.object({ id: z.string() }) }).idempotency({\n  required: true,\n  fingerprint: ({ params }) => ({ params }),\n})\n",[14,753,754,781,789,805],{"__ignoreMap":49},[53,755,756,758,761,764,767,769,772,774,777,779],{"class":55,"line":56},[53,757,575],{"class":101},[53,759,760],{"class":70},"({ operation: ",[53,762,763],{"class":77},"'publishItem'",[53,765,766],{"class":70},", params: z.",[53,768,315],{"class":101},[53,770,771],{"class":70},"({ id: z.",[53,773,321],{"class":101},[53,775,776],{"class":70},"() }) }).",[53,778,264],{"class":101},[53,780,126],{"class":70},[53,782,783,785,787],{"class":55,"line":63},[53,784,529],{"class":70},[53,786,384],{"class":94},[53,788,179],{"class":70},[53,790,791,794,796,798,800,802],{"class":55,"line":81},[53,792,793],{"class":101},"  fingerprint",[53,795,156],{"class":70},[53,797,693],{"class":125},[53,799,162],{"class":70},[53,801,144],{"class":66},[53,803,804],{"class":70}," ({ params }),\n",[53,806,807],{"class":55,"line":88},[53,808,193],{"class":70},[10,810,811,812,816,817,819,820,823],{},"The route template and method are already part of the storage key, but a path ",[813,814,815],"em",{},"parameter"," is not — so ",[14,818,693],{}," is what distinguishes one resource from another under the same key. For an operation that truly takes no input, ",[14,821,822],{},"fingerprint: () => ({})"," says so.",[10,825,826,827,417,829,831,832,834],{},"If an idempotent endpoint ends up without ",[14,828,202],{},[14,830,212],{},", or ",[14,833,218],{}," after merging, the build fails when no policy file exists, and server startup fails when the merged configuration is still incomplete — an idempotent endpoint never silently runs unprotected.",[26,836,838],{"id":837},"http-behavior","HTTP behavior",[195,840,841,844,850,856,862],{},[198,842,843],{},"Optional and absent: execute normally.",[198,845,846,847,243],{},"Required and absent, or any present but malformed key: ",[14,848,849],{},"400 Bad Request",[198,851,852,853,243],{},"Same key and different request fingerprint: ",[14,854,855],{},"422 Unprocessable Content",[198,857,858,859,243],{},"Same key and same fingerprint still running: ",[14,860,861],{},"409 Conflict",[198,863,864],{},"Same key and completed fingerprint: replay the recorded response.",[10,866,867,868,871,872,875],{},"These framework-generated failures use a stable ",[14,869,870],{},"application\u002Fproblem+json"," Problem Details body. They are not added to the endpoint's declared ",[14,873,874],{},".result()"," response union.",[26,877,879],{"id":878},"client-usage","Client usage",[10,881,882,883,886,887,890,891,894],{},"The generated client accepts a typed ",[14,884,885],{},"idempotencyKey"," request option, separate from ",[14,888,889],{},"headers",", mapped to the configured header. It is required in the client type when ",[14,892,893],{},"required: true",", and optional otherwise. The client never auto-generates a key: a retry must reuse the caller's same key.",[44,896,898],{"className":46,"code":897,"language":48,"meta":49,"style":49},"await $endpoint('grantPoints', {\n  idempotencyKey: crypto.randomUUID(),\n  body: { userId: 'u_1', amount: 10 },\n})\n",[14,899,900,915,926,943],{"__ignoreMap":49},[53,901,902,905,908,910,912],{"class":55,"line":56},[53,903,904],{"class":66},"await",[53,906,907],{"class":101}," $endpoint",[53,909,439],{"class":70},[53,911,305],{"class":77},[53,913,914],{"class":70},", {\n",[53,916,917,920,923],{"class":55,"line":63},[53,918,919],{"class":70},"  idempotencyKey: crypto.",[53,921,922],{"class":101},"randomUUID",[53,924,925],{"class":70},"(),\n",[53,927,928,931,934,937,940],{"class":55,"line":81},[53,929,930],{"class":70},"  body: { userId: ",[53,932,933],{"class":77},"'u_1'",[53,935,936],{"class":70},", amount: ",[53,938,939],{"class":94},"10",[53,941,942],{"class":70}," },\n",[53,944,945],{"class":55,"line":88},[53,946,193],{"class":70},[10,948,949,950,952],{},"TanStack Query and Infinite Query include ",[14,951,885],{}," in the cache key segment.",[26,954,955],{"id":202},"Storage",[10,957,958,961],{},[14,959,960],{},"createMemoryIdempotencyStorage()"," is process-local and intended for development and tests only: its records disappear on restart and are not shared across processes.",[10,963,964,965,968],{},"A media 2xx cannot be recorded for replay: a stream, a ",[14,966,967],{},"Blob",", or raw bytes have no serializable snapshot, so an idempotent endpoint that answers with one fails loudly rather than replaying an empty object.",[10,970,971,972,974,975,228,978,228,981,984],{},"Production deployments must provide a durable adapter, such as Redis or SQL, implementing the ",[14,973,206],{}," contract (",[14,976,977],{},"claim",[14,979,980],{},"complete",[14,982,983],{},"release","), and that implementation must be atomic. Durable-adapter conformance requirements and Redis\u002FSQL recipes are documented in the project's storage recipes.",[26,986,988],{"id":987},"guarantees-and-limits","Guarantees and limits",[10,990,991],{},"With a correct durable store, the helper guarantees:",[195,993,994,997,1000,1003,1006],{},[198,995,996],{},"at most one active lease per endpoint, scope, and key;",[198,998,999],{},"rejection when the same key is reused with different request input;",[198,1001,1002],{},"replay of a completed response while it remains valid;",[198,1004,1005],{},"fencing so an expired older lease cannot overwrite a newer execution;",[198,1007,1008],{},"consistent behavior across instances that share one storage implementation.",[10,1010,1011],{},"It does not guarantee exactly-once side effects: a process can complete an external effect and then crash before recording the response. Use the downstream service's own idempotency key, a transactional outbox, or consumer-side deduplication when that boundary matters.",[1013,1014,1015],"style",{},"html pre.shiki code .sA0OV, html code.shiki .sA0OV{--shiki-light:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .swxxe, html code.shiki .swxxe{--shiki-light:#CF222E;--shiki-dark:#FF7B72}html pre.shiki code .saQ_J, html code.shiki .saQ_J{--shiki-light:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sZItA, html code.shiki .sZItA{--shiki-light:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sOOdx, html code.shiki .sOOdx{--shiki-light:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .s9HWX, html code.shiki .s9HWX{--shiki-light:#8250DF;--shiki-dark:#D2A8FF}html pre.shiki code .sVS1I, html code.shiki .sVS1I{--shiki-light:#953800;--shiki-dark:#FFA657}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 .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":49,"searchDepth":63,"depth":63,"links":1017},[1018,1019,1020,1021,1022,1023,1024],{"id":28,"depth":63,"text":29},{"id":257,"depth":63,"text":258},{"id":636,"depth":63,"text":637},{"id":837,"depth":63,"text":838},{"id":878,"depth":63,"text":879},{"id":202,"depth":63,"text":955},{"id":987,"depth":63,"text":988},"Optional Idempotency-Key replay protection for unsafe endpoints, with an application-owned durable storage contract.","md",{},"\u002Fdocs\u002Fidempotency",{"title":5,"description":1025},"docs\u002Fidempotency","GmeAbR1hr-6vgyDUyRLMc_4W8OnygSVHgEjLsaB_Lns",{"left":1033,"top":1033,"width":1034,"height":1034,"rotate":1033,"vFlip":1035,"hFlip":1035,"body":1036},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\u002F>",{"left":1033,"top":1033,"width":1034,"height":1034,"rotate":1033,"vFlip":1035,"hFlip":1035,"body":1038,"hidden":84},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5c.08-1.25-.27-2.48-1-3.5c.28-1.15.28-2.35 0-3.5c0 0-1 0-3 1.5c-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.4 5.4 0 0 0 4 9c0 3.5 3 5.5 6 5.5c-.39.49-.68 1.05-.85 1.65S8.93 17.38 9 18v4\"\u002F>\u003Cpath d=\"M9 18c-4.51 2-5-2-7-2\"\u002F>\u003C\u002Fg>",{"left":1033,"top":1033,"width":1034,"height":1034,"rotate":1033,"vFlip":1035,"hFlip":1035,"body":1040},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 5h16M4 12h16M4 19h16\"\u002F>",1787723882340]