[{"data":1,"prerenderedAt":696},["ShallowReactive",2],{"page:\u002Fpagination":3},{"id":4,"title":5,"body":6,"description":687,"extension":688,"meta":689,"navigation":463,"operation":690,"path":691,"rawbody":692,"seo":693,"stem":694,"__hash__":695},"docs\u002Fpagination.md","Pagination",{"type":7,"value":8,"toc":680},"minimark",[9,13,76,91,100,103,159,163,171,436,440,443,655,659,666,676],[10,11,12],"p",{},"List endpoints return results in pages, controlled by two query parameters:",[14,15,16,35],"table",{},[17,18,19],"thead",{},[20,21,22,26,29,32],"tr",{},[23,24,25],"th",{},"Parameter",[23,27,28],{},"Default",[23,30,31],{},"Range",[23,33,34],{},"Meaning",[36,37,38,58],"tbody",{},[20,39,40,47,52,55],{},[41,42,43],"td",{},[44,45,46],"code",{},"limit",[41,48,49],{},[44,50,51],{},"100",[41,53,54],{},"1–1000",[41,56,57],{},"Maximum number of results in the page.",[20,59,60,65,70,73],{},[41,61,62],{},[44,63,64],{},"offset",[41,66,67],{},[44,68,69],{},"0",[41,71,72],{},"≥ 0",[41,74,75],{},"Number of results to skip.",[10,77,78,79,86,87,90],{},"A value outside its range returns ",[80,81,83],"a",{"href":82},"\u002Ferrors#validation-errors",[44,84,85],{},"422",". There are no cursors or ",[44,88,89],{},"next"," links.",[92,93,95,96,99],"h2",{"id":94},"what-count-means","What ",[44,97,98],{},"count"," means",[10,101,102],{},"Both list endpoints report the total matching records across all pages, including when the requested page is empty.",[14,104,105,119],{},[17,106,107],{},[20,108,109,112,115],{},[23,110,111],{},"Endpoint",[23,113,114],{},"Order",[23,116,117],{},[44,118,98],{},[36,120,121,143],{},[20,122,123,129,136],{},[41,124,125],{},[80,126,128],{"href":127},"\u002Fproperties\u002Flist","List properties",[41,130,131,132,135],{},"Last updated first, unless ",[44,133,134],{},"sort"," is set",[41,137,138,142],{},[139,140,141],"strong",{},"Total"," matching properties, across all pages",[20,144,145,151,154],{},[41,146,147],{},[80,148,150],{"href":149},"\u002Fleads\u002Flist","List leads",[41,152,153],{},"Newest first",[41,155,156,158],{},[139,157,141],{}," contacts, across all pages",[92,160,162],{"id":161},"paging-through-properties","Paging through properties",[10,164,165,167,168,170],{},[44,166,98],{}," is the total, so stop when ",[44,169,64],{}," reaches it:",[172,173,179],"pre",{"className":174,"code":175,"filename":176,"language":177,"meta":178,"style":178},"language-javascript shiki shiki-themes github-light","async function listAllProperties() {\n  const properties = []\n  const limit = 100\n  for (let offset = 0; ; offset += limit) {\n    const url = `https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fproperties?limit=${limit}&offset=${offset}`\n    const response = await fetch(url, { headers: { 'X-Api-Key': process.env.VESTTA_API_KEY } })\n    if (!response.ok) throw new Error(`Vestta API ${response.status}`)\n    const page = await response.json()\n    properties.push(...page.data)\n    if (offset + limit >= page.count) return properties\n  }\n}\n","JavaScript","javascript","",[44,180,181,201,217,230,260,285,316,360,381,398,424,430],{"__ignoreMap":178},[182,183,186,190,193,197],"span",{"class":184,"line":185},"line",1,[182,187,189],{"class":188},"sD7c4","async",[182,191,192],{"class":188}," function",[182,194,196],{"class":195},"s7eDp"," listAllProperties",[182,198,200],{"class":199},"sgsFI","() {\n",[182,202,204,207,211,214],{"class":184,"line":203},2,[182,205,206],{"class":188},"  const",[182,208,210],{"class":209},"sYu0t"," properties",[182,212,213],{"class":188}," =",[182,215,216],{"class":199}," []\n",[182,218,220,222,225,227],{"class":184,"line":219},3,[182,221,206],{"class":188},[182,223,224],{"class":209}," limit",[182,226,213],{"class":188},[182,228,229],{"class":209}," 100\n",[182,231,233,236,239,242,245,248,251,254,257],{"class":184,"line":232},4,[182,234,235],{"class":188},"  for",[182,237,238],{"class":199}," (",[182,240,241],{"class":188},"let",[182,243,244],{"class":199}," offset ",[182,246,247],{"class":188},"=",[182,249,250],{"class":209}," 0",[182,252,253],{"class":199},"; ; offset ",[182,255,256],{"class":188},"+=",[182,258,259],{"class":199}," limit) {\n",[182,261,263,266,269,271,275,277,280,282],{"class":184,"line":262},5,[182,264,265],{"class":188},"    const",[182,267,268],{"class":209}," url",[182,270,213],{"class":188},[182,272,274],{"class":273},"sYBdl"," `https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fproperties?limit=${",[182,276,46],{"class":199},[182,278,279],{"class":273},"}&offset=${",[182,281,64],{"class":199},[182,283,284],{"class":273},"}`\n",[182,286,288,290,293,295,298,301,304,307,310,313],{"class":184,"line":287},6,[182,289,265],{"class":188},[182,291,292],{"class":209}," response",[182,294,213],{"class":188},[182,296,297],{"class":188}," await",[182,299,300],{"class":195}," fetch",[182,302,303],{"class":199},"(url, { headers: { ",[182,305,306],{"class":273},"'X-Api-Key'",[182,308,309],{"class":199},": process.env.",[182,311,312],{"class":209},"VESTTA_API_KEY",[182,314,315],{"class":199}," } })\n",[182,317,319,322,324,327,330,333,336,339,342,345,348,351,354,357],{"class":184,"line":318},7,[182,320,321],{"class":188},"    if",[182,323,238],{"class":199},[182,325,326],{"class":188},"!",[182,328,329],{"class":199},"response.ok) ",[182,331,332],{"class":188},"throw",[182,334,335],{"class":188}," new",[182,337,338],{"class":195}," Error",[182,340,341],{"class":199},"(",[182,343,344],{"class":273},"`Vestta API ${",[182,346,347],{"class":199},"response",[182,349,350],{"class":273},".",[182,352,353],{"class":199},"status",[182,355,356],{"class":273},"}`",[182,358,359],{"class":199},")\n",[182,361,363,365,368,370,372,375,378],{"class":184,"line":362},8,[182,364,265],{"class":188},[182,366,367],{"class":209}," page",[182,369,213],{"class":188},[182,371,297],{"class":188},[182,373,374],{"class":199}," response.",[182,376,377],{"class":195},"json",[182,379,380],{"class":199},"()\n",[182,382,384,387,390,392,395],{"class":184,"line":383},9,[182,385,386],{"class":199},"    properties.",[182,388,389],{"class":195},"push",[182,391,341],{"class":199},[182,393,394],{"class":188},"...",[182,396,397],{"class":199},"page.data)\n",[182,399,401,403,406,409,412,415,418,421],{"class":184,"line":400},10,[182,402,321],{"class":188},[182,404,405],{"class":199}," (offset ",[182,407,408],{"class":188},"+",[182,410,411],{"class":199}," limit ",[182,413,414],{"class":188},">=",[182,416,417],{"class":199}," page.count) ",[182,419,420],{"class":188},"return",[182,422,423],{"class":199}," properties\n",[182,425,427],{"class":184,"line":426},11,[182,428,429],{"class":199},"  }\n",[182,431,433],{"class":184,"line":432},12,[182,434,435],{"class":199},"}\n",[92,437,439],{"id":438},"paging-through-leads","Paging through leads",[10,441,442],{},"Stop when the offset reaches the total:",[172,444,449],{"className":445,"code":446,"filename":447,"language":448,"meta":178,"style":178},"language-python shiki shiki-themes github-light","import os\n\nimport requests\n\ndef list_all_leads():\n    leads, limit, offset = [], 100, 0\n    while True:\n        response = requests.get(\n            \"https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fleads\",\n            headers={\"X-Api-Key\": os.environ[\"VESTTA_API_KEY\"]},\n            params={\"limit\": limit, \"offset\": offset},\n        )\n        response.raise_for_status()\n        page = response.json()\n        leads.extend(page[\"data\"])\n        if offset + limit >= page[\"count\"]:\n            return leads\n        offset += limit\n","Python","python",[44,450,451,459,465,472,476,487,505,516,526,534,557,578,583,589,600,612,635,644],{"__ignoreMap":178},[182,452,453,456],{"class":184,"line":185},[182,454,455],{"class":188},"import",[182,457,458],{"class":199}," os\n",[182,460,461],{"class":184,"line":203},[182,462,464],{"emptyLinePlaceholder":463},true,"\n",[182,466,467,469],{"class":184,"line":219},[182,468,455],{"class":188},[182,470,471],{"class":199}," requests\n",[182,473,474],{"class":184,"line":232},[182,475,464],{"emptyLinePlaceholder":463},[182,477,478,481,484],{"class":184,"line":262},[182,479,480],{"class":188},"def",[182,482,483],{"class":195}," list_all_leads",[182,485,486],{"class":199},"():\n",[182,488,489,492,494,497,499,502],{"class":184,"line":287},[182,490,491],{"class":199},"    leads, limit, offset ",[182,493,247],{"class":188},[182,495,496],{"class":199}," [], ",[182,498,51],{"class":209},[182,500,501],{"class":199},", ",[182,503,504],{"class":209},"0\n",[182,506,507,510,513],{"class":184,"line":318},[182,508,509],{"class":188},"    while",[182,511,512],{"class":209}," True",[182,514,515],{"class":199},":\n",[182,517,518,521,523],{"class":184,"line":362},[182,519,520],{"class":199},"        response ",[182,522,247],{"class":188},[182,524,525],{"class":199}," requests.get(\n",[182,527,528,531],{"class":184,"line":383},[182,529,530],{"class":273},"            \"https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fleads\"",[182,532,533],{"class":199},",\n",[182,535,536,540,542,545,548,551,554],{"class":184,"line":400},[182,537,539],{"class":538},"sqxcx","            headers",[182,541,247],{"class":188},[182,543,544],{"class":199},"{",[182,546,547],{"class":273},"\"X-Api-Key\"",[182,549,550],{"class":199},": os.environ[",[182,552,553],{"class":273},"\"VESTTA_API_KEY\"",[182,555,556],{"class":199},"]},\n",[182,558,559,562,564,566,569,572,575],{"class":184,"line":426},[182,560,561],{"class":538},"            params",[182,563,247],{"class":188},[182,565,544],{"class":199},[182,567,568],{"class":273},"\"limit\"",[182,570,571],{"class":199},": limit, ",[182,573,574],{"class":273},"\"offset\"",[182,576,577],{"class":199},": offset},\n",[182,579,580],{"class":184,"line":432},[182,581,582],{"class":199},"        )\n",[182,584,586],{"class":184,"line":585},13,[182,587,588],{"class":199},"        response.raise_for_status()\n",[182,590,592,595,597],{"class":184,"line":591},14,[182,593,594],{"class":199},"        page ",[182,596,247],{"class":188},[182,598,599],{"class":199}," response.json()\n",[182,601,603,606,609],{"class":184,"line":602},15,[182,604,605],{"class":199},"        leads.extend(page[",[182,607,608],{"class":273},"\"data\"",[182,610,611],{"class":199},"])\n",[182,613,615,618,620,622,624,626,629,632],{"class":184,"line":614},16,[182,616,617],{"class":188},"        if",[182,619,244],{"class":199},[182,621,408],{"class":188},[182,623,411],{"class":199},[182,625,414],{"class":188},[182,627,628],{"class":199}," page[",[182,630,631],{"class":273},"\"count\"",[182,633,634],{"class":199},"]:\n",[182,636,638,641],{"class":184,"line":637},17,[182,639,640],{"class":188},"            return",[182,642,643],{"class":199}," leads\n",[182,645,647,650,652],{"class":184,"line":646},18,[182,648,649],{"class":199},"        offset ",[182,651,256],{"class":188},[182,653,654],{"class":199}," limit\n",[92,656,658],{"id":657},"consistency","Consistency",[10,660,661,662,665],{},"Pages are computed when each request arrives. If properties or leads change while you page through them, a result can move between pages and be skipped or returned twice. When you need a complete, exact copy, de-duplicate by ",[44,663,664],{},"id",", and run the sync again later rather than relying on a single pass.",[10,667,668,669,672,673,675],{},"Filters are applied before pagination, including the map areas of ",[80,670,128],{"href":671},"\u002Fproperties\u002Flist#map-areas",": ",[44,674,98],{}," and the pages only contain matching properties.",[677,678,679],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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 pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":178,"searchDepth":219,"depth":219,"links":681},[682,684,685,686],{"id":94,"depth":203,"text":683},"What count means",{"id":161,"depth":203,"text":162},{"id":438,"depth":203,"text":439},{"id":657,"depth":203,"text":658},"Page through properties and leads with limit and offset.","md",{},null,"\u002Fpagination","---\ntitle: Pagination\ndescription: Page through properties and leads with limit and offset.\n---\n\nList endpoints return results in pages, controlled by two query parameters:\n\n| Parameter | Default | Range | Meaning |\n| --- | --- | --- | --- |\n| `limit` | `100` | 1–1000 | Maximum number of results in the page. |\n| `offset` | `0` | ≥ 0 | Number of results to skip. |\n\nA value outside its range returns [`422`](\u002Ferrors#validation-errors). There are no cursors or `next` links.\n\n## What `count` means\n\nBoth list endpoints report the total matching records across all pages, including when the requested page is empty.\n\n| Endpoint | Order | `count` |\n| --- | --- | --- |\n| [List properties](\u002Fproperties\u002Flist) | Last updated first, unless `sort` is set | **Total** matching properties, across all pages |\n| [List leads](\u002Fleads\u002Flist) | Newest first | **Total** contacts, across all pages |\n\n## Paging through properties\n\n`count` is the total, so stop when `offset` reaches it:\n\n```javascript [JavaScript]\nasync function listAllProperties() {\n  const properties = []\n  const limit = 100\n  for (let offset = 0; ; offset += limit) {\n    const url = `https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fproperties?limit=${limit}&offset=${offset}`\n    const response = await fetch(url, { headers: { 'X-Api-Key': process.env.VESTTA_API_KEY } })\n    if (!response.ok) throw new Error(`Vestta API ${response.status}`)\n    const page = await response.json()\n    properties.push(...page.data)\n    if (offset + limit >= page.count) return properties\n  }\n}\n```\n\n## Paging through leads\n\nStop when the offset reaches the total:\n\n```python [Python]\nimport os\n\nimport requests\n\ndef list_all_leads():\n    leads, limit, offset = [], 100, 0\n    while True:\n        response = requests.get(\n            \"https:\u002F\u002Fapi.vestta.io\u002Fv1\u002Fleads\",\n            headers={\"X-Api-Key\": os.environ[\"VESTTA_API_KEY\"]},\n            params={\"limit\": limit, \"offset\": offset},\n        )\n        response.raise_for_status()\n        page = response.json()\n        leads.extend(page[\"data\"])\n        if offset + limit >= page[\"count\"]:\n            return leads\n        offset += limit\n```\n\n## Consistency\n\nPages are computed when each request arrives. If properties or leads change while you page through them, a result can move between pages and be skipped or returned twice. When you need a complete, exact copy, de-duplicate by `id`, and run the sync again later rather than relying on a single pass.\n\nFilters are applied before pagination, including the map areas of [List properties](\u002Fproperties\u002Flist#map-areas): `count` and the pages only contain matching properties.\n",{"title":5,"description":687},"pagination","UyoKhl-WsY-pOYyIsgQwbZnrh-CquPkBNry5V34G9x0",1791929309339]