Load public data without overwhelming upstream services, and plan for failures.
Live data makes an app useful. Caching keeps it fast, reduces unnecessary
requests, and gives the upstream service room to breathe.Use the bundled HTTP module to request public data while your app renders:
Set ttl_seconds based on how quickly the source changes and how often users
need a new frame. A transit app may need frequent updates; a daily quote does
not.
All hosted apps, including owner-private apps, run with network isolation. Private, loopback, link-local,
metadata, internal service, and non-approved destinations are blocked. Redirects
and DNS results are checked again before a request is allowed.
Before publishing, check that the service permits you to display and cache its
data at your expected request volume. Access to an API does not grant rights to
its data.
refresh_interval_seconds in the manifest controls hosted scheduling (30–86,400
seconds, default 300). render.Root(max_age=...) controls how long a frame remains
fresh; it does not schedule HTTP requests or override the refresh interval.
A max_age of 60 seconds is valid. If refresh happens every 300 seconds, that
frame can expire before its replacement arrives. Allow time for scheduling jitter
and network delays when choosing freshness.Local preview uses your computer’s network. Hosted rendering needs explicit
network_hosts declarations, or network_host_fields setting
support. Push a new revision after changing network declarations. Two working
public URLs can both fail in Cloud when neither is permitted by the revision.CLI v0.54.10 and later warn when a frame expires before its scheduled refresh.
The dashboard shows safe failure details alongside Refresh failed,
including last-attempt and success timestamps, retained-frame status and a support reference.
It excludes raw app output, credential values and full request URLs.
Last modified on August 29, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Niblet Docs","description":"Set up Niblet, build 64×32 apps locally, connect the CLI and MCP, and publish apps.","colors":{"primary":"#0D9373","light":"#55D799","dark":"#0D9373"},"logo":{"light":"https://mintcdn.com/niblet/y747dLAb64ljeiwb/logo-light.svg?fit=max\u0026auto=format\u0026n=y747dLAb64ljeiwb\u0026q=85\u0026s=c3aab484e020df576e873b07176c25f0","dark":"https://mintcdn.com/niblet/y747dLAb64ljeiwb/logo-dark.svg?fit=max\u0026auto=format\u0026n=y747dLAb64ljeiwb\u0026q=85\u0026s=dafff4c3f8d61b59a06c4ef0b0765a2d","href":"https://www.heyniblet.com"},"favicon":"https://mintcdn.com/niblet/y747dLAb64ljeiwb/favicon.svg?fit=max\u0026auto=format\u0026n=y747dLAb64ljeiwb\u0026q=85\u0026s=d116ef8db6451bb170463e286b7a30ca","navbar":{"links":[{"href":"https://discord.gg/Ch2yzgf55Z","label":"Join our Discord","type":"discord"},{"href":"https://github.com/heyniblet","type":"github"}],"primary":{"type":"button","label":"Dashboard","href":"https://www.heyniblet.com/dashboard"}},"footer":{"socials":{"instagram":"https://www.instagram.com/heyniblet","reddit":"https://www.reddit.com/r/heyniblet","discord":"https://discord.gg/Ch2yzgf55Z"}},"search":{"prompt":"Search Niblet guides and reference..."},"seo":{"metatags":{"og:site_name":"Niblet Docs","twitter:card":"summary_large_image"},"organization":{"name":"Niblet","url":"https://www.heyniblet.com","logo":"https://www.heyniblet.com/favicon.svg","sameAs":["https://github.com/heyniblet"]},"indexing":"navigable"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","latex":false},"contextual":{"options":["copy","view","assistant","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":true},"markdown":{"instructions":["Treat Niblet documentation as the source of truth for shipped Niblet behavior.","Keep app source editing, validation, preview, and rendering on the developer's system.","Never ask users to paste credentials, Wi-Fi passwords, OAuth codes, or bearer tokens into chat."]},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"niblet","hasAudioNarration":false,"actualSubdomain":"niblet","customDomains":["docs.heyniblet.com"],"gitSource":{"type":"github","owner":"heyniblet","repo":"niblet-mintlify","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ab5f86007d36642e2a07581","collectionId":"e2e768f8-298c-466a-8475-403c44304bae","liveDeploymentHistoryId":"6ab5f86007d36642e2a07581","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ab5f86007d36642e2a07581","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Guides","count":17},{"language":"default","tag":"Developer tools","count":9},{"language":"default","tag":"Build apps","count":6},{"language":"default","tag":"Reference","count":6},{"language":"default","tag":"Niblet MCP","count":5},{"language":"default","tag":"Niblet CLI","count":4},{"language":"default","tag":"App runtime","count":4},{"language":"default","tag":"Set up","count":3},{"language":"default","tag":"Help","count":3},{"language":"default","tag":"Publish","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".tidbyt-model-cards [data-component-part=card-image]{aspect-ratio:8/5;object-fit:cover}a[title=\"Join our Discord\"][href=\"https://discord.gg/Ch2yzgf55Z\"]>span+span{display:none}"}],"page":{"pagePath":"build/data-caching","slug":"/build/data-caching","pageMetadata":{"title":"Use APIs and caching","description":"Load public data without overwhelming upstream services, and plan for failures.","href":"/build/data-caching"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Load public data without overwhelming upstream services, and plan for failures.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Live data makes an app useful. Caching keeps it fast, reduces unnecessary\nrequests, and gives the upstream service room to breathe.`}),`\n`,_jsx(_components.p,{children:`Use the bundled HTTP module to request public data while your app renders:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`load(\"http.star\", \"http\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`def fetch_status():`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` response = http.get(`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` \"https://status.example.com/current.json\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ttl_seconds = 300,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` if response.status_code != 200:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` return None`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` return response.json()`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`This example reuses a response for five minutes before requesting fresh data.`}),`\n`,_jsx(Heading,{level:`2`,id:`pick-a-useful-refresh-rate`,children:`Pick a useful refresh rate`}),`\n`,_jsxs(_components.p,{children:[`Set `,_jsx(_components.code,{children:`ttl_seconds`}),` based on how quickly the source changes and how often users\nneed a new frame. A transit app may need frequent updates; a daily quote does\nnot.`]}),`\n`,_jsx(Heading,{level:`2`,id:`plan-for-failure`,children:`Plan for failure`}),`\n`,_jsx(_components.p,{children:`Prefer this order when an upstream request fails:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Reuse safe cached data.`}),`\n`,_jsx(_components.li,{children:`Show a clear stale or unavailable state.`}),`\n`,_jsx(_components.li,{children:`Log a short diagnostic without user data.`}),`\n`,_jsxs(_components.li,{children:[`Call `,_jsx(_components.code,{children:`fail()`}),` only when the app cannot produce a useful frame.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`know-what-hosted-apps-can-reach`,children:`Know what hosted apps can reach`}),`\n`,_jsx(_components.p,{children:`All hosted apps, including owner-private apps, run with network isolation. Private, loopback, link-local,\nmetadata, internal service, and non-approved destinations are blocked. Redirects\nand DNS results are checked again before a request is allowed.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Before publishing, check that the service permits you to display and cache its\ndata at your expected request volume. Access to an API does not grant rights to\nits data.`})}),`\n`,_jsx(Heading,{level:`2`,id:`refresh-timing-and-failures`,children:`Refresh timing and failures`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`refresh_interval_seconds`}),` in the manifest controls hosted scheduling (30–86,400\nseconds, default 300). `,_jsx(_components.code,{children:`render.Root(max_age=...)`}),` controls how long a frame remains\nfresh; it does not schedule HTTP requests or override the refresh interval.\nA `,_jsx(_components.code,{children:`max_age`}),` of 60 seconds is valid. If refresh happens every 300 seconds, that\nframe can expire before its replacement arrives. Allow time for scheduling jitter\nand network delays when choosing freshness.`]}),`\n`,_jsxs(_components.p,{children:[`Local preview uses your computer’s network. Hosted rendering needs explicit\n`,_jsx(_components.code,{children:`network_hosts`}),` declarations, or `,_jsx(_components.code,{children:`network_host_fields`}),` setting\nsupport. Push a new revision after changing network declarations. Two working\npublic URLs can both fail in Cloud when neither is permitted by the revision.`]}),`\n`,_jsxs(_components.p,{children:[`CLI v0.54.10 and later warn when a frame expires before its scheduled refresh.\nThe dashboard shows safe failure details alongside `,_jsx(_components.strong,{children:`Refresh failed`}),`,\nincluding last-attempt and success timestamps, retained-frame status and a support reference.\nIt excludes raw app output, credential values and full request URLs.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Use APIs and caching","description":"Load public data without overwhelming upstream services, and plan for failures.","href":"/build/data-caching"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Pick a useful refresh rate","slug":"pick-a-useful-refresh-rate","depth":2,"children":[]},{"title":"Plan for failure","slug":"plan-for-failure","depth":2,"children":[]},{"title":"Know what hosted apps can reach","slug":"know-what-hosted-apps-can-reach","depth":2,"children":[]},{"title":"Refresh timing and failures","slug":"refresh-timing-and-failures","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"niblet","siteName":"Niblet Docs","title":"Use APIs and caching - Niblet Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-25T04:28:19.076Z","gitLastModified":"2026-08-29T13:37:06.000Z","originalFileLocation":"build/data-caching.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Load public data without overwhelming upstream services, and plan for failures.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Niblet Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Use APIs and caching - Niblet Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Load public data without overwhelming upstream services, and plan for failures.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Niblet Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.heyniblet.com/build/data-caching\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://niblet.mintlify.app/_mintlify/api/og/v2?division=Build+apps\u0026amp;title=Use+APIs+and+caching\u0026amp;description=Load+public+data+without+overwhelming+upstream+services%2C+and+plan+for+failures.\u0026amp;theme=6a89cdeae9dc16f652461618\u0026amp;signature=74653d078877e6ddc69fa3eebd850932e3aae3338349b79c36e56d2fd70a6865\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Use APIs and caching - Niblet Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Load public data without overwhelming upstream services, and plan for failures.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://niblet.mintlify.app/_mintlify/api/og/v2?division=Build+apps\u0026amp;title=Use+APIs+and+caching\u0026amp;description=Load+public+data+without+overwhelming+upstream+services%2C+and+plan+for+failures.\u0026amp;theme=6a89cdeae9dc16f652461618\u0026amp;signature=74653d078877e6ddc69fa3eebd850932e3aae3338349b79c36e56d2fd70a6865\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/niblet/VcbLmH71GYgc0zDw/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Niblet Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0D9373\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.heyniblet.com/build/data-caching\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/build/data-caching.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.heyniblet.com/#organization\",\"name\":\"Niblet\",\"url\":\"https://www.heyniblet.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://www.heyniblet.com/favicon.svg\"},\"sameAs\":[\"https://github.com/heyniblet\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.heyniblet.com#website\",\"name\":\"Niblet Docs\",\"url\":\"https://docs.heyniblet.com\",\"publisher\":{\"@id\":\"https://www.heyniblet.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.heyniblet.com/build/data-caching#webpage\",\"url\":\"https://docs.heyniblet.com/build/data-caching\",\"name\":\"Use APIs and caching\",\"description\":\"Load public data without overwhelming upstream services, and plan for failures.\",\"dateModified\":\"2026-08-29T13:37:06.000Z\",\"isPartOf\":{\"@id\":\"https://docs.heyniblet.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.heyniblet.com/build/data-caching#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.heyniblet.com/build/data-caching#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Build apps\",\"item\":\"https://docs.heyniblet.com/build/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Use APIs and caching\",\"item\":\"https://docs.heyniblet.com/build/data-caching\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.heyniblet.com/build/data-caching#article\",\"headline\":\"Use APIs and caching\",\"name\":\"Use APIs and caching\",\"description\":\"Load public data without overwhelming upstream services, and plan for failures.\",\"url\":\"https://docs.heyniblet.com/build/data-caching\",\"mainEntityOfPage\":{\"@id\":\"https://docs.heyniblet.com/build/data-caching#webpage\"},\"dateModified\":\"2026-08-29T13:37:06.000Z\",\"publisher\":{\"@id\":\"https://www.heyniblet.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.heyniblet.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Niblet Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Niblet Docs","nav":{"global":null,"tabs":[{"tab":"Guides","icon":"book-open","groups":[{"group":"Start here","pages":[{"title":"Niblet for developers","sidebarTitle":"Overview","href":""},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Set up","pages":[{"title":"Install the CLI","href":"/getting-started/install-cli"},{"title":"Revive a Tidbyt with Niblet","href":"/getting-started/migrate-gen1"},{"title":"Change Wi-Fi and reset","href":"/getting-started/wifi-and-reset"}]},{"group":"Build apps","pages":[{"title":"Getting started","href":"/build/overview"},{"title":"Create your first app","href":"/build/first-app"},{"title":"Add app settings","description":"Let people personalize your app without editing its code.","href":"/build/configuration"},{"title":"Use APIs and caching","href":"/build/data-caching"},{"title":"Design for the display","description":"Make text, imagery, and motion easy to read at a glance.","href":"/build/design-64x32"},{"title":"App examples","href":"/build/examples"}]},{"group":"Publish","pages":[{"title":"Submit your app for review","href":"/publish/review-process"},{"title":"Update your app","href":"/publish/update-app"},{"title":"Before you submit","href":"/publish/checklist"}]},{"group":"Help","pages":[{"title":"Fix common problems","href":"/help/troubleshooting"},{"title":"FAQ","href":"/help/faq"},{"title":"Contact support","href":"/help/support"}]}]},{"tab":"Developer tools","icon":"terminal","pages":[{"title":"Developer tools","href":"/cli/overview"}]},{"tab":"Reference","icon":"braces","pages":[{"title":"Reference","href":"/reference/widgets"}]}]},"title":"Use APIs and caching - Niblet Docs","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}