[{"data":1,"prerenderedAt":1501},["ShallowReactive",2],{"docs:\u002Fdocs\u002Fapi\u002Fobjects":3,"docs:nav":1453},{"id":4,"title":5,"badge":6,"body":7,"description":1445,"extension":1446,"meta":1447,"navigation":1077,"order":95,"path":1448,"section":1449,"seo":1450,"stem":1451,"__hash__":1452},"docs\u002Fdocs\u002Fapi\u002Fobjects.md","Objects",null,{"type":8,"value":9,"toc":1438},"minimark",[10,14,19,27,141,270,276,331,341,359,364,454,458,461,482,636,647,722,736,740,747,767,814,944,1003,1009,1014,1267,1273,1279,1283,1286,1310,1317,1374,1377,1408,1414,1418,1431,1434],[11,12,13],"p",{},"An object is the addressable unit of your data: an ordered list of slab segments, plus wrapped key\nmaterial and an encrypted metadata blob Tessera never interprets.",[15,16,18],"h2",{"id":17},"post-objects","POST \u002Fobjects",[11,20,21,22,26],{},"Registers or replaces an object. Idempotent on ",[23,24,25],"code",{},"id"," — posting the same key again replaces the record,\nwhich is how you update an object.",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-bash shiki shiki-themes github-dark-default github-dark-default","curl -X POST \"$TESSERA_API\u002Fobjects?$AUTH\" \\\n  -H 'content-type: application\u002Fjson' \\\n  -d '{\n    \"id\": \"8f14e45fce...\",\n    \"encryptedDataKey\": \"d3JhcHBlZC1kYXRhLWtleQ==\",\n    \"slabs\": [{ \"id\": \"4f2a1b8c...\", \"offset\": 0, \"length\": 1048576 }],\n    \"encryptedMetadata\": \"ZW5jcnlwdGVkLW1ldGFkYXRh\",\n    \"encryptedMetadataKey\": \"d3JhcHBlZC1tZXRhZGF0YS1rZXk=\",\n    \"dataSignature\": \"9f3c1a4b...\",\n    \"metadataSignature\": \"22ab7c1d...\"\n  }'\n","bash","",[23,35,36,73,84,93,99,105,111,117,123,129,135],{"__ignoreMap":33},[37,38,41,45,49,53,56,60,63,66,69],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sAxfE","curl",[37,46,48],{"class":47},"sEQcL"," -X",[37,50,52],{"class":51},"skZ57"," POST",[37,54,55],{"class":51}," \"",[37,57,59],{"class":58},"sb7RM","$TESSERA_API",[37,61,62],{"class":51},"\u002Fobjects?",[37,64,65],{"class":58},"$AUTH",[37,67,68],{"class":51},"\"",[37,70,72],{"class":71},"srH4v"," \\\n",[37,74,76,79,82],{"class":39,"line":75},2,[37,77,78],{"class":47},"  -H",[37,80,81],{"class":51}," 'content-type: application\u002Fjson'",[37,83,72],{"class":71},[37,85,87,90],{"class":39,"line":86},3,[37,88,89],{"class":47},"  -d",[37,91,92],{"class":51}," '{\n",[37,94,96],{"class":39,"line":95},4,[37,97,98],{"class":51},"    \"id\": \"8f14e45fce...\",\n",[37,100,102],{"class":39,"line":101},5,[37,103,104],{"class":51},"    \"encryptedDataKey\": \"d3JhcHBlZC1kYXRhLWtleQ==\",\n",[37,106,108],{"class":39,"line":107},6,[37,109,110],{"class":51},"    \"slabs\": [{ \"id\": \"4f2a1b8c...\", \"offset\": 0, \"length\": 1048576 }],\n",[37,112,114],{"class":39,"line":113},7,[37,115,116],{"class":51},"    \"encryptedMetadata\": \"ZW5jcnlwdGVkLW1ldGFkYXRh\",\n",[37,118,120],{"class":39,"line":119},8,[37,121,122],{"class":51},"    \"encryptedMetadataKey\": \"d3JhcHBlZC1tZXRhZGF0YS1rZXk=\",\n",[37,124,126],{"class":39,"line":125},9,[37,127,128],{"class":51},"    \"dataSignature\": \"9f3c1a4b...\",\n",[37,130,132],{"class":39,"line":131},10,[37,133,134],{"class":51},"    \"metadataSignature\": \"22ab7c1d...\"\n",[37,136,138],{"class":39,"line":137},11,[37,139,140],{"class":51},"  }'\n",[142,143,144,163],"table",{},[145,146,147],"thead",{},[148,149,150,154,157,160],"tr",{},[151,152,153],"th",{},"Field",[151,155,156],{},"Type",[151,158,159],{},"Required",[151,161,162],{},"Description",[164,165,166,182,197,212,227,242,256],"tbody",{},[148,167,168,173,176,179],{},[169,170,171],"td",{},[23,172,25],{},[169,174,175],{},"hex, 32 bytes",[169,177,178],{},"yes",[169,180,181],{},"The object key. You choose it.",[148,183,184,189,192,194],{},[169,185,186],{},[23,187,188],{},"encryptedDataKey",[169,190,191],{},"base64",[169,193,178],{},[169,195,196],{},"The object's data key, wrapped by your key.",[148,198,199,204,207,209],{},[169,200,201],{},[23,202,203],{},"slabs",[169,205,206],{},"array",[169,208,178],{},[169,210,211],{},"Ordered slab segments. Concatenated in order, these are the object.",[148,213,214,219,222,224],{},[169,215,216],{},[23,217,218],{},"dataSignature",[169,220,221],{},"hex, 64 bytes",[169,223,178],{},[169,225,226],{},"Your signature over the data portion.",[148,228,229,234,236,239],{},[169,230,231],{},[23,232,233],{},"encryptedMetadata",[169,235,191],{},[169,237,238],{},"no",[169,240,241],{},"Opaque blob. Filenames, content types, anything.",[148,243,244,249,251,253],{},[169,245,246],{},[23,247,248],{},"encryptedMetadataKey",[169,250,191],{},[169,252,238],{},[169,254,255],{},"Wrapped key for the metadata blob.",[148,257,258,263,265,267],{},[169,259,260],{},[23,261,262],{},"metadataSignature",[169,264,221],{},[169,266,238],{},[169,268,269],{},"Your signature over the metadata.",[11,271,272],{},[273,274,275],"strong",{},"Slab segment",[142,277,278,288],{},[145,279,280],{},[148,281,282,284,286],{},[151,283,153],{},[151,285,156],{},[151,287,162],{},[164,289,290,306,319],{},[148,291,292,296,299],{},[169,293,294],{},[23,295,25],{},[169,297,298],{},"hex",[169,300,301,302,305],{},"Slab ID from ",[23,303,304],{},"POST \u002Fslabs",".",[148,307,308,313,316],{},[169,309,310],{},[23,311,312],{},"offset",[169,314,315],{},"uint32",[169,317,318],{},"Byte offset within the reconstructed slab.",[148,320,321,326,328],{},[169,322,323],{},[23,324,325],{},"length",[169,327,315],{},[169,329,330],{},"Byte length of this segment.",[11,332,333,336,337,340],{},[273,334,335],{},"Response"," — ",[23,338,339],{},"200 OK",", empty body.",[342,343,346],"app-callout",{"title":344,"tone":345},"Register slabs first","warn",[11,347,348,349,352,353,355,356,358],{},"Referencing a slab that does not exist is rejected with ",[23,350,351],{},"400 manifest: object references missing slab",". Always ",[23,354,304],{}," before ",[23,357,18],{}," — the object record is a set of references, and\nthe references are checked.",[11,360,361],{},[273,362,363],{},"Errors",[142,365,366,379],{},[145,367,368],{},[148,369,370,373,376],{},[151,371,372],{},"Status",[151,374,375],{},"Body",[151,377,378],{},"Cause",[164,380,381,396,410,424,439],{},[148,382,383,388,393],{},[169,384,385],{},[23,386,387],{},"400",[169,389,390],{},[23,391,392],{},"invalid request body: ...",[169,394,395],{},"Malformed JSON.",[148,397,398,402,407],{},[169,399,400],{},[23,401,387],{},[169,403,404],{},[23,405,406],{},"manifest: object references missing slab",[169,408,409],{},"A slab ID does not exist for your account.",[148,411,412,416,421],{},[169,413,414],{},[23,415,387],{},[169,417,418],{},[23,419,420],{},"manifest: empty account",[169,422,423],{},"No account on the request.",[148,425,426,431,436],{},[169,427,428],{},[23,429,430],{},"402",[169,432,433],{},[23,434,435],{},"{\"error\": \"storage cap exceeded\", \"capBytes\": …}",[169,437,438],{},"Metadata registration would exceed your cap.",[148,440,441,446,451],{},[169,442,443],{},[23,444,445],{},"405",[169,447,448],{},[23,449,450],{},"method not allowed",[169,452,453],{},"Wrong method.",[15,455,457],{"id":456},"get-objectskey","GET \u002Fobjects\u002F{key}",[11,459,460],{},"Reads an object's placement record.",[28,462,464],{"className":30,"code":463,"language":32,"meta":33,"style":33},"curl \"$TESSERA_API\u002Fobjects\u002F8f14e45fce...?$AUTH\"\n",[23,465,466],{"__ignoreMap":33},[37,467,468,470,472,474,477,479],{"class":39,"line":40},[37,469,44],{"class":43},[37,471,55],{"class":51},[37,473,59],{"class":58},[37,475,476],{"class":51},"\u002Fobjects\u002F8f14e45fce...?",[37,478,65],{"class":58},[37,480,481],{"class":51},"\"\n",[28,483,487],{"className":484,"code":485,"language":486,"meta":33,"style":33},"language-json shiki shiki-themes github-dark-default github-dark-default","{\n  \"id\": \"8f14e45fce...\",\n  \"encryptedDataKey\": \"d3JhcHBlZC1kYXRhLWtleQ==\",\n  \"slabs\": [{ \"id\": \"4f2a1b8c...\", \"offset\": 0, \"length\": 1048576 }],\n  \"encryptedMetadata\": \"ZW5jcnlwdGVkLW1ldGFkYXRh\",\n  \"encryptedMetadataKey\": \"d3JhcHBlZC1tZXRhZGF0YS1rZXk=\",\n  \"dataSignature\": \"9f3c1a4b...\",\n  \"metadataSignature\": \"22ab7c1d...\",\n  \"createdAt\": \"2026-04-02T09:14:00Z\",\n  \"updatedAt\": \"2026-04-02T09:14:00Z\"\n}\n","json",[23,488,489,494,509,521,561,573,585,597,609,621,631],{"__ignoreMap":33},[37,490,491],{"class":39,"line":40},[37,492,493],{"class":58},"{\n",[37,495,496,500,503,506],{"class":39,"line":75},[37,497,499],{"class":498},"sV7Mv","  \"id\"",[37,501,502],{"class":58},": ",[37,504,505],{"class":51},"\"8f14e45fce...\"",[37,507,508],{"class":58},",\n",[37,510,511,514,516,519],{"class":39,"line":86},[37,512,513],{"class":498},"  \"encryptedDataKey\"",[37,515,502],{"class":58},[37,517,518],{"class":51},"\"d3JhcHBlZC1kYXRhLWtleQ==\"",[37,520,508],{"class":58},[37,522,523,526,529,532,534,537,540,543,545,548,550,553,555,558],{"class":39,"line":95},[37,524,525],{"class":498},"  \"slabs\"",[37,527,528],{"class":58},": [{ ",[37,530,531],{"class":498},"\"id\"",[37,533,502],{"class":58},[37,535,536],{"class":51},"\"4f2a1b8c...\"",[37,538,539],{"class":58},", ",[37,541,542],{"class":498},"\"offset\"",[37,544,502],{"class":58},[37,546,547],{"class":47},"0",[37,549,539],{"class":58},[37,551,552],{"class":498},"\"length\"",[37,554,502],{"class":58},[37,556,557],{"class":47},"1048576",[37,559,560],{"class":58}," }],\n",[37,562,563,566,568,571],{"class":39,"line":101},[37,564,565],{"class":498},"  \"encryptedMetadata\"",[37,567,502],{"class":58},[37,569,570],{"class":51},"\"ZW5jcnlwdGVkLW1ldGFkYXRh\"",[37,572,508],{"class":58},[37,574,575,578,580,583],{"class":39,"line":107},[37,576,577],{"class":498},"  \"encryptedMetadataKey\"",[37,579,502],{"class":58},[37,581,582],{"class":51},"\"d3JhcHBlZC1tZXRhZGF0YS1rZXk=\"",[37,584,508],{"class":58},[37,586,587,590,592,595],{"class":39,"line":113},[37,588,589],{"class":498},"  \"dataSignature\"",[37,591,502],{"class":58},[37,593,594],{"class":51},"\"9f3c1a4b...\"",[37,596,508],{"class":58},[37,598,599,602,604,607],{"class":39,"line":119},[37,600,601],{"class":498},"  \"metadataSignature\"",[37,603,502],{"class":58},[37,605,606],{"class":51},"\"22ab7c1d...\"",[37,608,508],{"class":58},[37,610,611,614,616,619],{"class":39,"line":125},[37,612,613],{"class":498},"  \"createdAt\"",[37,615,502],{"class":58},[37,617,618],{"class":51},"\"2026-04-02T09:14:00Z\"",[37,620,508],{"class":58},[37,622,623,626,628],{"class":39,"line":131},[37,624,625],{"class":498},"  \"updatedAt\"",[37,627,502],{"class":58},[37,629,630],{"class":51},"\"2026-04-02T09:14:00Z\"\n",[37,632,633],{"class":39,"line":137},[37,634,635],{"class":58},"}\n",[11,637,638,639,642,643,646],{},"This returns ",[273,640,641],{},"metadata, not data",". To get bytes: read the object, read each referenced slab, fetch\n",[23,644,645],{},"minShards"," shards per slab directly from providers, reconstruct, decrypt.",[142,648,649,659],{},[145,650,651],{},[148,652,653,655,657],{},[151,654,372],{},[151,656,375],{},[151,658,378],{},[164,660,661,678,692,707],{},[148,662,663,667,672],{},[169,664,665],{},[23,666,387],{},[169,668,669],{},[23,670,671],{},"missing object key",[169,673,674,675,305],{},"Empty key, or a key containing ",[23,676,677],{},"\u002F",[148,679,680,684,689],{},[169,681,682],{},[23,683,387],{},[169,685,686],{},[23,687,688],{},"invalid object key: ...",[169,690,691],{},"Not 64 hex characters.",[148,693,694,699,704],{},[169,695,696],{},[23,697,698],{},"403",[169,700,701],{},[23,702,703],{},"manifest: forbidden for this account",[169,705,706],{},"The object belongs to another account.",[148,708,709,714,719],{},[169,710,711],{},[23,712,713],{},"404",[169,715,716],{},[23,717,718],{},"manifest: not found",[169,720,721],{},"No such object, for you.",[342,723,726],{"title":724,"tone":725},"Keys may not contain slashes","note",[11,727,728,729,732,733,735],{},"The key is parsed as a single path segment, so ",[23,730,731],{},"\u002Fobjects\u002F{key}\u002Fanything"," is rejected with ",[23,734,387],{},", not\nrouted. There is no sub-resource under an object.",[15,737,739],{"id":738},"get-objects","GET \u002Fobjects",[11,741,742,743,746],{},"Lists object ",[273,744,745],{},"change events"," — a log, not a snapshot. This is the endpoint to use for\nsynchronisation and for exports.",[28,748,750],{"className":30,"code":749,"language":32,"meta":33,"style":33},"curl \"$TESSERA_API\u002Fobjects?limit=100&after=2026-04-02T09:14:00Z&$AUTH\"\n",[23,751,752],{"__ignoreMap":33},[37,753,754,756,758,760,763,765],{"class":39,"line":40},[37,755,44],{"class":43},[37,757,55],{"class":51},[37,759,59],{"class":58},[37,761,762],{"class":51},"\u002Fobjects?limit=100&after=2026-04-02T09:14:00Z&",[37,764,65],{"class":58},[37,766,481],{"class":51},[142,768,769,781],{},[145,770,771],{},[148,772,773,776,779],{},[151,774,775],{},"Parameter",[151,777,778],{},"Default",[151,780,162],{},[164,782,783,798],{},[148,784,785,790,795],{},[169,786,787],{},[23,788,789],{},"limit",[169,791,792],{},[23,793,794],{},"50",[169,796,797],{},"Maximum events returned.",[148,799,800,805,811],{},[169,801,802],{},[23,803,804],{},"after",[169,806,807],{},[808,809,810],"em",{},"(none)",[169,812,813],{},"RFC 3339 timestamp. Returns only events strictly after it.",[28,815,817],{"className":484,"code":816,"language":486,"meta":33,"style":33},"[\n  {\n    \"key\": \"8f14e45fce...\",\n    \"deleted\": false,\n    \"updatedAt\": \"2026-04-02T09:14:00Z\",\n    \"object\": { \"id\": \"8f14e45fce...\", \"slabs\": [ ... ] }\n  },\n  {\n    \"key\": \"3c59dc048e...\",\n    \"deleted\": true,\n    \"updatedAt\": \"2026-04-02T09:20:00Z\"\n  }\n]\n",[23,818,819,824,829,840,852,863,892,897,901,912,923,932,938],{"__ignoreMap":33},[37,820,821],{"class":39,"line":40},[37,822,823],{"class":58},"[\n",[37,825,826],{"class":39,"line":75},[37,827,828],{"class":58},"  {\n",[37,830,831,834,836,838],{"class":39,"line":86},[37,832,833],{"class":498},"    \"key\"",[37,835,502],{"class":58},[37,837,505],{"class":51},[37,839,508],{"class":58},[37,841,842,845,847,850],{"class":39,"line":95},[37,843,844],{"class":498},"    \"deleted\"",[37,846,502],{"class":58},[37,848,849],{"class":47},"false",[37,851,508],{"class":58},[37,853,854,857,859,861],{"class":39,"line":101},[37,855,856],{"class":498},"    \"updatedAt\"",[37,858,502],{"class":58},[37,860,618],{"class":51},[37,862,508],{"class":58},[37,864,865,868,871,873,875,877,879,882,885,889],{"class":39,"line":107},[37,866,867],{"class":498},"    \"object\"",[37,869,870],{"class":58},": { ",[37,872,531],{"class":498},[37,874,502],{"class":58},[37,876,505],{"class":51},[37,878,539],{"class":58},[37,880,881],{"class":498},"\"slabs\"",[37,883,884],{"class":58},": [ ",[37,886,888],{"class":887},"sg4rT","...",[37,890,891],{"class":58}," ] }\n",[37,893,894],{"class":39,"line":113},[37,895,896],{"class":58},"  },\n",[37,898,899],{"class":39,"line":119},[37,900,828],{"class":58},[37,902,903,905,907,910],{"class":39,"line":125},[37,904,833],{"class":498},[37,906,502],{"class":58},[37,908,909],{"class":51},"\"3c59dc048e...\"",[37,911,508],{"class":58},[37,913,914,916,918,921],{"class":39,"line":131},[37,915,844],{"class":498},[37,917,502],{"class":58},[37,919,920],{"class":47},"true",[37,922,508],{"class":58},[37,924,925,927,929],{"class":39,"line":137},[37,926,856],{"class":498},[37,928,502],{"class":58},[37,930,931],{"class":51},"\"2026-04-02T09:20:00Z\"\n",[37,933,935],{"class":39,"line":934},12,[37,936,937],{"class":58},"  }\n",[37,939,941],{"class":39,"line":940},13,[37,942,943],{"class":58},"]\n",[142,945,946,954],{},[145,947,948],{},[148,949,950,952],{},[151,951,153],{},[151,953,162],{},[164,955,956,966,982,994],{},[148,957,958,963],{},[169,959,960],{},[23,961,962],{},"key",[169,964,965],{},"The object key this event concerns.",[148,967,968,973],{},[169,969,970],{},[23,971,972],{},"deleted",[169,974,975,977,978,981],{},[23,976,920],{}," for a tombstone. ",[23,979,980],{},"object"," is absent in that case.",[148,983,984,989],{},[169,985,986],{},[23,987,988],{},"updatedAt",[169,990,991,992,305],{},"When the change occurred. Use the last one as your next ",[23,993,804],{},[148,995,996,1000],{},[169,997,998],{},[23,999,980],{},[169,1001,1002],{},"The full record, for non-deletion events.",[11,1004,1005,1006,305],{},"Always an array, never ",[23,1007,1008],{},"null",[11,1010,1011],{},[273,1012,1013],{},"Iterating to completion",[28,1015,1019],{"className":1016,"code":1017,"language":1018,"meta":33,"style":33},"language-ts shiki shiki-themes github-dark-default github-dark-default","let after: string | undefined\nconst state = new Map\u003Cstring, unknown>()\n\nfor (;;) {\n  const qs = new URLSearchParams({ limit: '100', ...(after ? { after } : {}) })\n  const events = await call('GET', `\u002Fobjects?${qs}`)\n  if (!events.length) break\n\n  for (const ev of events) {\n    if (ev.deleted) state.delete(ev.key)\n    else state.set(ev.key, ev.object)\n  }\n  after = events.at(-1).updatedAt\n}\n","ts",[23,1020,1021,1041,1073,1079,1087,1126,1161,1183,1187,1205,1219,1233,1237,1262],{"__ignoreMap":33},[37,1022,1023,1026,1029,1032,1035,1038],{"class":39,"line":40},[37,1024,1025],{"class":71},"let",[37,1027,1028],{"class":58}," after",[37,1030,1031],{"class":71},":",[37,1033,1034],{"class":47}," string",[37,1036,1037],{"class":71}," |",[37,1039,1040],{"class":47}," undefined\n",[37,1042,1043,1046,1049,1052,1055,1059,1062,1065,1067,1070],{"class":39,"line":75},[37,1044,1045],{"class":71},"const",[37,1047,1048],{"class":47}," state",[37,1050,1051],{"class":71}," =",[37,1053,1054],{"class":71}," new",[37,1056,1058],{"class":1057},"sYGIp"," Map",[37,1060,1061],{"class":58},"\u003C",[37,1063,1064],{"class":47},"string",[37,1066,539],{"class":58},[37,1068,1069],{"class":47},"unknown",[37,1071,1072],{"class":58},">()\n",[37,1074,1075],{"class":39,"line":86},[37,1076,1078],{"emptyLinePlaceholder":1077},true,"\n",[37,1080,1081,1084],{"class":39,"line":95},[37,1082,1083],{"class":71},"for",[37,1085,1086],{"class":58}," (;;) {\n",[37,1088,1089,1092,1095,1097,1099,1102,1105,1108,1110,1112,1115,1118,1121,1123],{"class":39,"line":101},[37,1090,1091],{"class":71},"  const",[37,1093,1094],{"class":47}," qs",[37,1096,1051],{"class":71},[37,1098,1054],{"class":71},[37,1100,1101],{"class":1057}," URLSearchParams",[37,1103,1104],{"class":58},"({ limit: ",[37,1106,1107],{"class":51},"'100'",[37,1109,539],{"class":58},[37,1111,888],{"class":71},[37,1113,1114],{"class":58},"(after ",[37,1116,1117],{"class":71},"?",[37,1119,1120],{"class":58}," { after } ",[37,1122,1031],{"class":71},[37,1124,1125],{"class":58}," {}) })\n",[37,1127,1128,1130,1133,1135,1138,1141,1144,1147,1149,1152,1155,1158],{"class":39,"line":107},[37,1129,1091],{"class":71},[37,1131,1132],{"class":47}," events",[37,1134,1051],{"class":71},[37,1136,1137],{"class":71}," await",[37,1139,1140],{"class":1057}," call",[37,1142,1143],{"class":58},"(",[37,1145,1146],{"class":51},"'GET'",[37,1148,539],{"class":58},[37,1150,1151],{"class":51},"`\u002Fobjects?${",[37,1153,1154],{"class":58},"qs",[37,1156,1157],{"class":51},"}`",[37,1159,1160],{"class":58},")\n",[37,1162,1163,1166,1169,1172,1175,1177,1180],{"class":39,"line":113},[37,1164,1165],{"class":71},"  if",[37,1167,1168],{"class":58}," (",[37,1170,1171],{"class":71},"!",[37,1173,1174],{"class":58},"events.",[37,1176,325],{"class":47},[37,1178,1179],{"class":58},") ",[37,1181,1182],{"class":71},"break\n",[37,1184,1185],{"class":39,"line":119},[37,1186,1078],{"emptyLinePlaceholder":1077},[37,1188,1189,1192,1194,1196,1199,1202],{"class":39,"line":125},[37,1190,1191],{"class":71},"  for",[37,1193,1168],{"class":58},[37,1195,1045],{"class":71},[37,1197,1198],{"class":47}," ev",[37,1200,1201],{"class":71}," of",[37,1203,1204],{"class":58}," events) {\n",[37,1206,1207,1210,1213,1216],{"class":39,"line":131},[37,1208,1209],{"class":71},"    if",[37,1211,1212],{"class":58}," (ev.deleted) state.",[37,1214,1215],{"class":1057},"delete",[37,1217,1218],{"class":58},"(ev.key)\n",[37,1220,1221,1224,1227,1230],{"class":39,"line":137},[37,1222,1223],{"class":71},"    else",[37,1225,1226],{"class":58}," state.",[37,1228,1229],{"class":1057},"set",[37,1231,1232],{"class":58},"(ev.key, ev.object)\n",[37,1234,1235],{"class":39,"line":934},[37,1236,937],{"class":58},[37,1238,1239,1242,1245,1248,1251,1253,1256,1259],{"class":39,"line":940},[37,1240,1241],{"class":58},"  after ",[37,1243,1244],{"class":71},"=",[37,1246,1247],{"class":58}," events.",[37,1249,1250],{"class":1057},"at",[37,1252,1143],{"class":58},[37,1254,1255],{"class":71},"-",[37,1257,1258],{"class":47},"1",[37,1260,1261],{"class":58},").updatedAt\n",[37,1263,1265],{"class":39,"line":1264},14,[37,1266,635],{"class":58},[342,1268,1270],{"title":1269,"tone":725},"Why a change log rather than a listing",[11,1271,1272],{},"Because the log lets you maintain a local index incrementally with a single cursor, and because\ntombstones let you learn about deletions you did not perform locally. Persist your cursor and\nsynchronisation costs one call per interval regardless of how much you have stored.",[342,1274,1276],{"title":1275,"tone":345},"Timestamp cursors and ties",[11,1277,1278],{},"The cursor is a timestamp, so events sharing a timestamp can straddle a page boundary and be seen\ntwice. Make your event application idempotent — the code above is, because it sets and deletes by\nkey rather than appending.",[15,1280,1282],{"id":1281},"delete-objectskey","DELETE \u002Fobjects\u002F{key}",[11,1284,1285],{},"Deletes an object.",[28,1287,1289],{"className":30,"code":1288,"language":32,"meta":33,"style":33},"curl -X DELETE \"$TESSERA_API\u002Fobjects\u002F8f14e45fce...?$AUTH\"\n",[23,1290,1291],{"__ignoreMap":33},[37,1292,1293,1295,1297,1300,1302,1304,1306,1308],{"class":39,"line":40},[37,1294,44],{"class":43},[37,1296,48],{"class":47},[37,1298,1299],{"class":51}," DELETE",[37,1301,55],{"class":51},[37,1303,59],{"class":58},[37,1305,476],{"class":51},[37,1307,65],{"class":58},[37,1309,481],{"class":51},[11,1311,1312,336,1314,305],{},[273,1313,335],{},[23,1315,1316],{},"204 No Content",[142,1318,1319,1329],{},[145,1320,1321],{},[148,1322,1323,1325,1327],{},[151,1324,372],{},[151,1326,375],{},[151,1328,378],{},[164,1330,1331,1348,1361],{},[148,1332,1333,1337,1345],{},[169,1334,1335],{},[23,1336,387],{},[169,1338,1339,1341,1342],{},[23,1340,671],{}," \u002F ",[23,1343,1344],{},"invalid object key",[169,1346,1347],{},"Bad key.",[148,1349,1350,1354,1358],{},[169,1351,1352],{},[23,1353,698],{},[169,1355,1356],{},[23,1357,703],{},[169,1359,1360],{},"Not your object.",[148,1362,1363,1367,1371],{},[169,1364,1365],{},[23,1366,713],{},[169,1368,1369],{},[23,1370,718],{},[169,1372,1373],{},"No such object.",[11,1375,1376],{},"What happens, precisely:",[1378,1379,1380,1384,1390,1405],"ol",{},[1381,1382,1383],"li",{},"The object is removed from the manifest immediately. It is no longer readable through the API and\nwe can no longer locate it.",[1381,1385,1386,1387,1389],{},"A tombstone appears in ",[23,1388,739],{}," so other clients learn of the deletion.",[1381,1391,1392,1393,1396,1397,1404],{},"Slabs it referenced are ",[273,1394,1395],{},"not"," deleted — another object may reference them. Run\n",[1398,1399,1401],"a",{"href":1400},"\u002Fdocs\u002Fapi\u002Fslabs#post-slabsprune",[23,1402,1403],{},"POST \u002Fslabs\u002Fprune"," to reclaim any that are now orphaned.",[1381,1406,1407],{},"Shards on providers stop being retained as the covering storage contracts lapse.",[342,1409,1411],{"title":1410,"tone":345},"Deletion is not instantaneous erasure",[11,1412,1413],{},"Step 4 is not immediate. Encrypted shards may persist on providers until reclamation completes or the\ncontract expires — at most the contract term. What is immediate is the loss of the ability to locate\nand reconstruct them, since we discard the placement record. If your compliance requirement is\nprovable erasure within a fixed window, discuss it with us rather than assuming this satisfies it.",[15,1415,1417],{"id":1416},"updating-an-object","Updating an object",[11,1419,1420,1421,1424,1425,1427,1428,1430],{},"There is no ",[23,1422,1423],{},"PATCH",". To update, write new slabs and ",[23,1426,18],{}," with the same ",[23,1429,25],{}," — the record\nis replaced. Then prune to reclaim the slabs the previous version referenced, if nothing else uses\nthem.",[11,1432,1433],{},"Because objects reference immutable, content-addressed slabs, an update that changes one region of a\nlarge object only needs to rewrite the slabs covering that region. Keep the segment list aligned to\nyour natural write boundaries and partial updates stay cheap.",[1435,1436,1437],"style",{},"html pre.shiki code .sAxfE, html code.shiki .sAxfE{--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .sEQcL, html code.shiki .sEQcL{--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .skZ57, html code.shiki .skZ57{--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sb7RM, html code.shiki .sb7RM{--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .srH4v, html code.shiki .srH4v{--shiki-default:#FF7B72;--shiki-dark:#FF7B72}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);}html pre.shiki code .sV7Mv, html code.shiki .sV7Mv{--shiki-default:#7EE787;--shiki-dark:#7EE787}html pre.shiki code .sg4rT, html code.shiki .sg4rT{--shiki-default:#FFA198;--shiki-default-font-style:italic;--shiki-dark:#FFA198;--shiki-dark-font-style:italic}html pre.shiki code .sYGIp, html code.shiki .sYGIp{--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}",{"title":33,"searchDepth":86,"depth":86,"links":1439},[1440,1441,1442,1443,1444],{"id":17,"depth":75,"text":18},{"id":456,"depth":75,"text":457},{"id":738,"depth":75,"text":739},{"id":1281,"depth":75,"text":1282},{"id":1416,"depth":75,"text":1417},"Register, read, list, and delete objects — ordered lists of slab segments with encrypted keys and opaque metadata.","md",{},"\u002Fdocs\u002Fapi\u002Fobjects","API reference",{"title":5,"description":1445},"docs\u002Fapi\u002Fobjects","Vff8je1F-RJAYYeUVtXy9m2rky7OOejW9ClsSfkKLpk",[1454,1458,1459,1463,1467,1471,1476,1481,1485,1489,1493,1497],{"path":1455,"title":1456,"description":1457,"section":1449,"order":101,"badge":6},"\u002Fdocs\u002Fapi\u002Faccount","Account","GET \u002Faccount — stored, read, and written byte counters for your credential.",{"path":1448,"title":5,"description":1445,"section":1449,"order":95,"badge":6},{"path":1460,"title":1461,"description":1462,"section":1449,"order":75,"badge":6},"\u002Fdocs\u002Fapi\u002Fplacement","Placement","POST \u002Fprepare-write — get the providers, contracts, and access tokens for writing a slab's shards.",{"path":1464,"title":1465,"description":1466,"section":1449,"order":40,"badge":6},"\u002Fdocs\u002Fapi\u002Fprovisioning","Credentials","Provision, verify, and revoke the ed25519 credential that is both your API identity and your account.",{"path":1468,"title":1469,"description":1470,"section":1449,"order":86,"badge":6},"\u002Fdocs\u002Fapi\u002Fslabs","Slabs","Register, read, list, unpin, and prune erasure-coded slabs — the layer that records which provider holds which shard.",{"path":1472,"title":1473,"description":1474,"section":1475,"order":75,"badge":6},"\u002Fdocs\u002Fauthentication","Authentication","Every request is signed with ed25519 over a blake2b hash of the method, host, path, expiry, and body. Here is the exact construction, with working code.","Guides",{"path":1477,"title":1478,"description":1479,"section":1480,"order":75,"badge":6},"\u002Fdocs\u002Fconcepts","Concepts & data model","Sectors, shards, slabs, objects, and accounts — what each one is, why the model has no filenames, and what that means for your integration.","Introduction",{"path":1482,"title":363,"description":1483,"section":1484,"order":40,"badge":6},"\u002Fdocs\u002Ferrors","Status codes, the two different error body formats, and the one case where a failure arrives with a 200.","Reference",{"path":1486,"title":1487,"description":1488,"section":1480,"order":40,"badge":6},"\u002Fdocs","Overview","Tessera is an HTTP API for storing encrypted, erasure-coded objects across independent storage providers. This is the reference for it.",{"path":1490,"title":1491,"description":1492,"section":1484,"order":75,"badge":6},"\u002Fdocs\u002Flimits","Limits & quotas","Rate limits, storage caps, geometry constraints, and the size and encoding limits that apply to every request.",{"path":1494,"title":1495,"description":1496,"section":1475,"order":40,"badge":6},"\u002Fdocs\u002Fquickstart","Quickstart","Provision a credential, upload an object across 15 providers, and read it back. Fifteen minutes, one file of code.",{"path":1498,"title":1499,"description":1500,"section":1475,"order":86,"badge":6},"\u002Fdocs\u002Frecovery","Recovery without Tessera","How to retrieve your data if Tessera is unavailable, unwilling, or permanently gone — and what you need to keep on hand for that to work.",1786190914652]