[{"data":1,"prerenderedAt":795},["ShallowReactive",2],{"docs:\u002Fdocs\u002Flimits":3,"docs:nav":746},{"id":4,"title":5,"badge":6,"body":7,"description":99,"extension":738,"meta":739,"navigation":740,"order":729,"path":741,"section":742,"seo":743,"stem":744,"__hash__":745},"docs\u002Fdocs\u002Flimits.md","Limits & quotas",null,{"type":8,"value":9,"toc":725},"minimark",[10,15,77,90,100,107,121,125,132,220,228,232,235,294,300,349,356,360,448,452,550,554,615,623,627,632,658,662,672,676,722],[11,12,14],"h2",{"id":13},"rate-limits","Rate limits",[16,17,18,34],"table",{},[19,20,21],"thead",{},[22,23,24,28,31],"tr",{},[25,26,27],"th",{},"Limit",[25,29,30],{},"Value",[25,32,33],{},"Scope",[35,36,37,52,64],"tbody",{},[22,38,39,43,49],{},[40,41,42],"td",{},"Sustained request rate",[40,44,45],{},[46,47,48],"strong",{},"30 per minute",[40,50,51],{},"Per credential",[22,53,54,57,62],{},[40,55,56],{},"Burst",[40,58,59],{},[46,60,61],{},"3 per second",[40,63,51],{},[22,65,66,69,74],{},[40,67,68],{},"Credential provisioning",[40,70,71],{},[46,72,73],{},"5 per hour",[40,75,76],{},"Per source address",[78,79,80,81,85,86,89],"p",{},"Exceeding a request limit returns ",[82,83,84],"code",{},"429"," with ",[82,87,88],{},"Retry-After: 5",":",[91,92,97],"pre",{"className":93,"code":95,"language":96},[94],"language-text","HTTP\u002F1.1 429 Too Many Requests\nRetry-After: 5\n\n{\"error\":\"rate limited\",\"retryAfter\":5}\n","text",[82,98,95],{"__ignoreMap":99},"",[78,101,102,103,106],{},"The rate limit is keyed on the ",[82,104,105],{},"credential"," query parameter, so separate credentials get separate\nbudgets. If you need more throughput for a single workload, do not rotate credentials to get around\nit.",[108,109,112],"app-callout",{"title":110,"tone":111},"Thirty per minute is lower than it sounds — design for it","note",[78,113,114,115,120],{},"The API is a control plane, not a data path: object bytes never traverse it, so a well-built client\nmakes very few calls. A 1 GiB upload is two calls plus the direct shard writes. A client that hits 30\nper minute is usually making one call per small object rather than packing them into shared slabs —\nsee ",[116,117,119],"a",{"href":118},"\u002Fdocs\u002Fapi\u002Fslabs#packing-strategy","Packing strategy",".",[11,122,124],{"id":123},"account-billing-limits","Account & billing limits",[78,126,127,128,131],{},"The account API at ",[82,129,130],{},"https:\u002F\u002Ftessera.storage\u002Fapi\u002Fv1"," applies its own limits, separate from the\nstorage rate limits above:",[16,133,134,142],{},[19,135,136],{},[22,137,138,140],{},[25,139,27],{},[25,141,30],{},[35,143,144,156,179,197,208],{},[22,145,146,149],{},[40,147,148],{},"Public signup & auth endpoints",[40,150,151,152,155],{},"Rate limited at the edge by nginx zones. Any challenge, where enabled, is scoped to ",[82,153,154],{},"\u002Fapi\u002Fv1\u002Fauth\u002F*"," and never applied to the rest of the API.",[22,157,158,161],{},[40,159,160],{},"New accounts",[40,162,163,166,167,170,171,174,175,178],{},[46,164,165],{},"3 per source IP"," (IPv6 \u002F64) and ",[46,168,169],{},"20 per \u002F24"," (IPv6 \u002F48) per rolling 24 hours, agents and humans together; ",[82,172,173],{},"429 signup_limit"," beyond that. Each signup also needs an ALTCHA proof of work (",[82,176,177],{},"X-Altcha",").",[22,180,181,184],{},[40,182,183],{},"Top-up amount",[40,185,186,189,190,193,194,120],{},[46,187,188],{},"$0.01–$10,000"," per intent (Tessera's floor; x402 uses only this), quantized to whole cents. Crypto through the payment processor (deposit address or invoice) also needs the coin's processor minimum — about ",[46,191,192],{},"$0.38"," for USDC on Base, more for most other coins; live values from ",[82,195,196],{},"GET \u002Fbilling\u002Ftopup\u002Fminimums",[22,198,199,202],{},[40,200,201],{},"Sign-in links",[40,203,204,205,120],{},"Single use, expire after ",[46,206,207],{},"15 minutes",[22,209,210,213],{},[40,211,212],{},"Browser sessions",[40,214,215,216,219],{},"30-day ",[82,217,218],{},"tessera_session"," cookie; state-changing requests must match the site origin.",[78,221,222,223,227],{},"See ",[116,224,226],{"href":225},"\u002Fdocs\u002Faccounts","Accounts & billing"," for the endpoints these apply to.",[11,229,231],{"id":230},"storage-caps","Storage caps",[78,233,234],{},"Each credential carries caps recorded at provisioning:",[16,236,237,247],{},[19,238,239],{},[22,240,241,244],{},[25,242,243],{},"Cap",[25,245,246],{},"Enforced",[35,248,249,272,280,287],{},[22,250,251,254],{},[40,252,253],{},"Maximum stored bytes",[40,255,256,257,260,261,264,265,268,269],{},"Yes — ",[82,258,259],{},"402"," on ",[82,262,263],{},"prepare-write",", ",[82,266,267],{},"slabs",", and ",[82,270,271],{},"objects",[22,273,274,277],{},[40,275,276],{},"Daily read bytes",[40,278,279],{},"Recorded, not currently enforced",[22,281,282,285],{},[40,283,284],{},"Daily write bytes",[40,286,279],{},[22,288,289,292],{},[40,290,291],{},"Monthly spend",[40,293,279],{},[78,295,296,297,89],{},"Cap accounting is in ",[46,298,299],{},"whole 4 MiB sectors",[16,301,302,312],{},[19,303,304],{},[22,305,306,309],{},[25,307,308],{},"Endpoint",[25,310,311],{},"Accounted as",[35,313,314,326,339],{},[22,315,316,321],{},[40,317,318],{},[82,319,320],{},"POST \u002Fprepare-write",[40,322,323],{},[82,324,325],{},"totalShards × 4 MiB",[22,327,328,333],{},[40,329,330],{},[82,331,332],{},"POST \u002Fslabs",[40,334,335,338],{},[82,336,337],{},"sectors × 4 MiB"," per slab",[22,340,341,346],{},[40,342,343],{},[82,344,345],{},"POST \u002Fobjects",[40,347,348],{},"4 KiB per object",[108,350,353],{"title":351,"tone":352},"Small objects in their own slabs are expensive","warn",[78,354,355],{},"A 100 KiB object written as its own 10-of-30 slab is accounted at 30 whole sectors — 120 MiB, a 1200×\noverhead against its logical size. This is arithmetic, not a penalty: 30 providers each hold a\nsector, and a sector is the unit they deal in. Pack small objects into shared slabs and the overhead\ndisappears.",[11,357,359],{"id":358},"erasure-coding-constraints","Erasure coding constraints",[16,361,362,371],{},[19,363,364],{},[22,365,366,369],{},[25,367,368],{},"Constraint",[25,370,30],{},[35,372,373,385,393,406,414,425,433,440],{},[22,374,375,382],{},[40,376,377,378,381],{},"Minimum redundancy (",[82,379,380],{},"totalShards \u002F minShards",")",[40,383,384],{},"1.5×",[22,386,387,390],{},[40,388,389],{},"Maximum redundancy",[40,391,392],{},"4.0×",[22,394,395,400],{},[40,396,397],{},[82,398,399],{},"minShards",[40,401,402,403],{},"≤ ",[82,404,405],{},"totalShards",[22,407,408,411],{},[40,409,410],{},"Default geometry",[40,412,413],{},"10 data + 20 parity = 30",[22,415,416,422],{},[40,417,418,421],{},[82,419,420],{},"encryptionKey"," length",[40,423,424],{},"exactly 32 bytes",[22,426,427,430],{},[40,428,429],{},"Duplicate provider within a slab",[40,431,432],{},"rejected",[22,434,435,438],{},[40,436,437],{},"Duplicate sector root within a slab",[40,439,432],{},[22,441,442,445],{},[40,443,444],{},"Sector size",[40,446,447],{},"4 MiB",[11,449,451],{"id":450},"request-constraints","Request constraints",[16,453,454,462],{},[19,455,456],{},[22,457,458,460],{},[25,459,368],{},[25,461,30],{},[35,463,464,475,483,494,502,520,532,540],{},[22,465,466,469],{},[40,467,468],{},"Object key",[40,470,471,472],{},"exactly 32 bytes, 64 hex characters, no ",[82,473,474],{},"\u002F",[22,476,477,480],{},[40,478,479],{},"Slab ID",[40,481,482],{},"exactly 32 bytes, 64 hex characters",[22,484,485,488],{},[40,486,487],{},"Provider public key",[40,489,490,493],{},[82,491,492],{},"ed25519:"," + 64 hex characters",[22,495,496,499],{},[40,497,498],{},"Sector root",[40,500,501],{},"64 hex characters",[22,503,504,513],{},[40,505,506,508,509,512],{},[82,507,105],{}," \u002F ",[82,510,511],{},"signature"," encoding",[40,514,515,516,519],{},"base64url ",[46,517,518],{},"with"," padding",[22,521,522,527],{},[40,523,524,512],{},[82,525,526],{},"appKey",[40,528,515,529,519],{},[46,530,531],{},"without",[22,533,534,537],{},[40,535,536],{},"Byte-slice JSON fields",[40,538,539],{},"standard base64 with padding",[22,541,542,547],{},[40,543,544],{},[82,545,546],{},"validUntil",[40,548,549],{},"unix seconds, decimal in the query, little-endian uint64 in the hash",[11,551,553],{"id":552},"pagination","Pagination",[16,555,556,571],{},[19,557,558],{},[22,559,560,562,565,568],{},[25,561,308],{},[25,563,564],{},"Mechanism",[25,566,567],{},"Default",[25,569,570],{},"Notes",[35,572,573,595],{},[22,574,575,580,589,592],{},[40,576,577],{},[82,578,579],{},"GET \u002Fslabs",[40,581,582,585,586],{},[82,583,584],{},"limit"," + ",[82,587,588],{},"offset",[40,590,591],{},"50",[40,593,594],{},"Not a stable cursor; entries can be missed if the set changes between pages.",[22,596,597,602,610,612],{},[40,598,599],{},[82,600,601],{},"GET \u002Fobjects",[40,603,604,585,606,609],{},[82,605,584],{},[82,607,608],{},"after"," timestamp",[40,611,591],{},[40,613,614],{},"Preferred. Stable enough for synchronisation; make application idempotent for timestamp ties.",[78,616,617,618,620,621,120],{},"For a complete enumeration, walk ",[82,619,601],{}," and collect slab IDs from the records rather than\npaging ",[82,622,579],{},[11,624,626],{"id":625},"signature-expiry","Signature expiry",[78,628,629,631],{},[82,630,546],{}," is chosen entirely by you. There is no server-imposed maximum, which means the\ndiscipline is yours:",[633,634,635,642,648],"ul",{},[636,637,638,641],"li",{},[46,639,640],{},"60 seconds"," for interactive calls.",[636,643,644,647],{},[46,645,646],{},"Minutes, not days."," A signed URL is a bearer capability until it expires; expiry is the only\nreplay protection in the scheme.",[636,649,650,657],{},[46,651,652,653,656],{},"Never sign a ",[82,654,655],{},"DELETE"," far into the future."," That signature is a deletion capability for as long\nas it remains valid, wherever the URL was logged.",[11,659,661],{"id":660},"no-cors","No CORS",[108,663,665],{"title":664,"tone":352},"The API cannot be called from a browser",[78,666,667,668,671],{},"No ",[82,669,670],{},"Access-Control-Allow-Origin"," header is sent on any endpoint, so cross-origin browser requests are\nblocked by the browser regardless of what you do client-side. Call the API from a server-side runtime,\nor proxy it through your own backend — which is the better pattern anyway, since it keeps your\ncredential's private key off the client.",[11,673,675],{"id":674},"availability-expectations","Availability expectations",[16,677,678,687],{},[19,679,680],{},[22,681,682,684],{},[25,683,308],{},[25,685,686],{},"Behaviour",[35,688,689,702,714],{},[22,690,691,695],{},[40,692,693],{},[82,694,263],{},[40,696,697,698,701],{},"May return ",[82,699,700],{},"503"," when provider availability dips. Always retry with backoff.",[22,703,704,707],{},[40,705,706],{},"Manifest endpoints",[40,708,709,710,713],{},"Expected to be consistently available; ",[82,711,712],{},"500"," is a bug worth reporting.",[22,715,716,719],{},[40,717,718],{},"Shard reads and writes",[40,720,721],{},"Depend on individual providers, which fail routinely. Your client should treat individual provider failure as normal and route around it.",[78,723,724],{},"The service is provided without a service level agreement.",{"title":99,"searchDepth":726,"depth":726,"links":727},3,[728,730,731,732,733,734,735,736,737],{"id":13,"depth":729,"text":14},2,{"id":123,"depth":729,"text":124},{"id":230,"depth":729,"text":231},{"id":358,"depth":729,"text":359},{"id":450,"depth":729,"text":451},{"id":552,"depth":729,"text":553},{"id":625,"depth":729,"text":626},{"id":660,"depth":729,"text":661},{"id":674,"depth":729,"text":675},"md",{},true,"\u002Fdocs\u002Flimits","Reference",{"title":5,"description":99},"docs\u002Flimits","x6UNCRRZrGVpLgXXGcWrxQ6-Z8AUV29zqwBTW2LXOHE",[747,749,755,760,764,767,770,773,776,780,783,786,787,792],{"path":225,"title":226,"description":99,"section":748,"order":729,"badge":6},"Guides",{"path":750,"title":751,"description":752,"section":753,"order":754,"badge":6},"\u002Fdocs\u002Fapi-quickstart","API quickstart","Create a billing account over HTTP, then register a storage key with the SDK.","API",1,{"path":756,"title":757,"description":99,"section":758,"order":759,"badge":6},"\u002Fdocs\u002Fapi\u002Faccount","Account","API reference",5,{"path":761,"title":762,"description":99,"section":758,"order":763,"badge":6},"\u002Fdocs\u002Fapi\u002Fobjects","Objects",4,{"path":765,"title":766,"description":99,"section":758,"order":729,"badge":6},"\u002Fdocs\u002Fapi\u002Fplacement","Placement",{"path":768,"title":769,"description":99,"section":758,"order":754,"badge":6},"\u002Fdocs\u002Fapi\u002Fprovisioning","Credentials",{"path":771,"title":772,"description":99,"section":758,"order":726,"badge":6},"\u002Fdocs\u002Fapi\u002Fslabs","Slabs",{"path":774,"title":775,"description":99,"section":748,"order":726,"badge":6},"\u002Fdocs\u002Fauthentication","Authentication",{"path":777,"title":778,"description":99,"section":779,"order":729,"badge":6},"\u002Fdocs\u002Fconcepts","Concepts & data model","Introduction",{"path":781,"title":782,"description":99,"section":742,"order":754,"badge":6},"\u002Fdocs\u002Ferrors","Errors",{"path":784,"title":785,"description":99,"section":753,"order":754,"badge":6},"\u002Fdocs","Overview",{"path":741,"title":5,"description":99,"section":742,"order":729,"badge":6},{"path":788,"title":789,"description":790,"section":791,"order":754,"badge":6},"\u002Fdocs\u002Fquickstart","CLI quickstart","Install the CLI, create an account, store one file, and read it back.","CLI",{"path":793,"title":794,"description":99,"section":748,"order":763,"badge":6},"\u002Fdocs\u002Frecovery","Recovery without Tessera",1794060205067]