{"id":47400,"date":"2026-09-17T13:30:04","date_gmt":"2026-09-17T13:30:04","guid":{"rendered":"https:\/\/taggbox.com\/support\/?p=47400"},"modified":"2026-09-17T13:30:06","modified_gmt":"2026-09-17T13:30:06","slug":"taggbox-api-with-ai","status":"publish","type":"post","link":"https:\/\/taggbox.com\/support\/taggbox-api-with-ai\/","title":{"rendered":"How to Build a Social Media Widget with the Taggbox API and AI (No Coding Needed)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">People are already posting about your brand on Instagram, LinkedIn, YouTube, X, TikTok and Google. A <a href=\"https:\/\/taggbox.com\/social-media-widget\/\">social media feed widget<\/a> puts all of it in one place, live, in your design. This guide gives you a prompt that makes an AI tool build the page for you. Pick the tool you already have open, paste, done.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is a social widget?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A live page that shows posts from many networks together. You see them on event screens, on homepages, in stores, offices and stadiums.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Taggbox does the hard part. It connects to every network, collects the posts, lets you approve or hide them, and keeps them fresh. This guide covers the last step: showing those posts in a page that is completely yours.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why use the Taggbox API instead of the embed code?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Taggbox embed code puts a themed widget on your site in two minutes. Use it if that is all you need.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use the <a href=\"https:\/\/taggbox.com\/support\/api\/widget-api\/\">Taggbox API<\/a> when you want more:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Your own design. Your layout, your fonts, your brand. No theme limits.<\/li>\n\n\n\n<li>Any screen. A 4K event display, a kiosk, a page inside your own app.<\/li>\n\n\n\n<li>Anywhere on the website, or page inside your app, or even on your event screens as a <a href=\"https:\/\/socialwalls.com\/\">social wall<\/a> or venue signage.<\/li>\n\n\n\n<li>One connection instead of five. You never deal with Instagram or LinkedIn directly, their logins or their rule changes. Taggbox hands you approved posts in one clean format.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">And you no longer need a developer to use it. An AI tool writes the page; you paste one prompt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How do you get your access token?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every request needs a token so Taggbox knows which widget to show.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/app.taggbox.com\/\">Log in to your Taggbox dashboard<\/a>.<\/li>\n\n\n\n<li>Open the gallery you want the posts from, or create one.<\/li>\n\n\n\n<li>On that gallery&#8217;s card, click the \u22ee (three dots) menu.<\/li>\n\n\n\n<li>Click Access Token and copy the value.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Which token should you use? <\/strong>A gallery token starts with wt1_ and opens that one gallery and nothing else, so it is safe to give to an agency or paste into a single website. Your account key opens every gallery you own. Use the gallery token unless you have a reason not to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treat it like a password. Anyone with it can read that gallery&#8217;s approved posts. The prompt below tells the AI to keep it on the server and never in the page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">API access is included in {{PLAN_NAME}}.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Which request does your widget need?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Just one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET https:\/\/api.taggbox.com\/api\/v3\/posts?limit=24\nAuthorization: Bearer wt1_YOUR_ACCESS_TOKEN\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You do not have to run this yourself. It is here so you can see how small the moving part really is \u2014 and so you can check it with curl if the page ever comes back empty.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What an AI gets wrong unless you tell it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AI tools have read a lot of other social-wall APIs, and that muscle memory produces code that looks right and returns nothing. These are the five that matter. They are all in the prompt below, which is why the prompt is worth pasting whole.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>IT WILL ASSUME<\/strong><\/th><th><strong>ACTUALLY<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Posts are at the top level of the JSON<\/td><td>They are at body.posts \u2014 every response is enveloped<\/td><\/tr><tr><td>?fields= slims the response<\/td><td>There is no fields parameter; the full post object always comes back<\/td><\/tr><tr><td>media[0] is the image<\/td><td>media[0] can be a video file. Take the first entry whose type is &#8220;image&#8221;, then its cdn_url<\/td><\/tr><tr><td>Missing values are &#8220;&#8221; or 0<\/td><td>They are null \u2014 including author.name, which falls back to author.handle<\/td><\/tr><tr><td>The default sort needs fixing<\/td><td>It is already right: pinned first, then newest<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Write it yourself: PHP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you would rather not involve an AI at all, here is the whole thing. Save it as index.php, set the two environment variables, and run php -S localhost:8080. Nothing to install.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/\/ index.php - one file: fetch, cache, render. Run: php -S localhost:8080\nconst CACHE_TTL = 300; \/\/ 5 minutes\n$base = rtrim(getenv('API_BASE_URL') ?: 'https:\/\/api.taggbox.com\/api', '\/');\n$token = getenv('ACCESS_TOKEN') ?: '';\n$dir = __DIR__ . '\/cache';\n$file = $dir . '\/posts.json';\n \nfunction fetchPosts(string $base, string $token): ?array {\n    $ch = curl_init(\"$base\/v3\/posts?\" . http_build_query(&#91;'limit' => 24]));\n    curl_setopt_array($ch, &#91;\n        CURLOPT_RETURNTRANSFER => true,\n        CURLOPT_TIMEOUT => 10,\n        CURLOPT_HTTPHEADER => &#91;\"Authorization: Bearer $token\"],\n    ]);\n    $raw = curl_exec($ch);\n    $code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\n    curl_close($ch);\n    if ($raw === false || $code !== 200) return null;\n    $json = json_decode($raw, true);\n    \/\/ the payload sits inside the envelope: { status, code, body }\n    return ($json&#91;'status'] ?? false) ? ($json&#91;'body']&#91;'posts'] ?? &#91;]) : null;\n}\n \nfunction getPosts(string $base, string $token, string $dir, string $file): array {\n    if (is_file($file) &amp;&amp; time() - filemtime($file) &lt; CACHE_TTL) {\n        return json_decode(file_get_contents($file), true) ?? &#91;];\n    }\n    $posts = fetchPosts($base, $token);\n    if ($posts !== null) {\n        if (!is_dir($dir)) @mkdir($dir, 0775, true); \/\/ first run\n        $tmp = $file . '.' . getmypid() . '.tmp'; \/\/ write then rename, so\n        if (@file_put_contents($tmp, json_encode($posts)) !== false) {\n            @rename($tmp, $file); \/\/ nobody reads half a file\n        }\n        return $posts;\n    }\n    \/\/ refresh failed: the last good copy beats an empty page, at any age\n    return is_file($file) ? (json_decode(file_get_contents($file), true) ?? &#91;]) : &#91;];\n}\n \n$posts = getPosts($base, $token, $dir, $file);\n$e = fn($v) => htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');\n \nfunction firstImage(array $p): ?string { \/\/ media&#91;0] can be a video FILE\n    foreach ($p&#91;'media'] ?? &#91;] as $m)\n        if (($m&#91;'type'] ?? '') === 'image') return $m&#91;'cdn_url'];\n    return null;\n}\n \nfunction permalink(array $p): ?string { \/\/ escaping alone is not enough\n    $u = $p&#91;'source']&#91;'permalink'] ?? '';\n    return preg_match('#^https?:\/\/#i', $u) ? $u : null;\n}\n?>\n&lt;!doctype html>\n&lt;html lang=\"en\">&lt;head>&lt;meta charset=\"utf-8\">\n&lt;title>What people are saying&lt;\/title>&lt;\/head>\n&lt;body>\n&lt;h1>What people are saying&lt;\/h1>\n&lt;?php if (!$posts): ?>&lt;p>No posts to show yet.&lt;\/p>&lt;?php endif; ?>\n&lt;?php foreach ($posts as $p): $img = firstImage($p); $url = permalink($p); ?>\n&lt;article>\n&lt;?php if ($img): ?>\n&lt;img src=\"&lt;?= $e($img) ?>\" alt=\"\" loading=\"lazy\" width=\"300\">\n&lt;?php endif; ?>\n&lt;p>&lt;strong>&lt;?= $e($p&#91;'author']&#91;'name'] ?? $p&#91;'author']&#91;'handle'] ?? 'Unknown') ?>&lt;\/strong>\n&lt;small>&lt;?= $e($p&#91;'network']&#91;'name'] ?? '') ?>&lt;\/small>&lt;\/p>\n&lt;p>&lt;?= nl2br($e($p&#91;'content']&#91;'text'] ?? '')) ?>&lt;\/p>\n&lt;?php if ($url): ?>\n&lt;a href=\"&lt;?= $e($url) ?>\" rel=\"noopener noreferrer\">View post&lt;\/a>\n&lt;?php endif; ?>\n&lt;\/article>\n&lt;?php endforeach; ?>\n&lt;\/body>&lt;\/html>\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Write it yourself: Node.js<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same page in Node.js 18 or newer, which has fetch built in. Save it as server.js, run npm install express, then node server.js.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ server.js - npm install express, then: node server.js\nconst express = require('express');\nconst fs = require('fs');\nconst path = require('path');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\nconst BASE = (process.env.API_BASE_URL || 'https:\/\/api.taggbox.com\/api')\n    .replace(\/\\\/$\/, '');\nconst TOKEN = process.env.ACCESS_TOKEN || '';\nconst CACHE_TTL = 5 * 60 * 1000; \/\/ 5 minutes\nconst CACHE_DIR = path.join(__dirname, 'cache');\nconst CACHE_FILE = path.join(CACHE_DIR, 'posts.json');\n \nasync function fetchPosts() {\n    const res = await fetch(`${BASE}\/v3\/posts?limit=24`, {\n        headers: { Authorization: `Bearer ${TOKEN}` },\n    });\n    const json = await res.json().catch(() => null);\n    \/\/ a request can fail while still returning HTTP 200\n    if (!res.ok || !json || json.status !== true) {\n        throw new Error(json?.message || `API error ${res.status}`);\n    }\n    return json.body.posts || &#91;]; \/\/ payload is inside body\n}\n \nfunction readCache() {\n    try { return JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8')); }\n    catch { return null; }\n}\n \nasync function getPosts() {\n    try {\n        const age = Date.now() - fs.statSync(CACHE_FILE).mtimeMs;\n        if (age &lt; CACHE_TTL) return readCache() || &#91;];\n    } catch { \/* no cache yet - fall through and fetch *\/ }\n    try {\n        const posts = await fetchPosts();\n        fs.mkdirSync(CACHE_DIR, { recursive: true }); \/\/ first run\n        const tmp = `${CACHE_FILE}.${process.pid}.tmp`; \/\/ write then rename, so\n        fs.writeFileSync(tmp, JSON.stringify(posts)); \/\/ nobody reads half a file\n        fs.renameSync(tmp, CACHE_FILE);\n        return posts;\n    } catch (err) {\n        console.error(err.message);\n        return readCache() || &#91;]; \/\/ last good copy, any age\n    }\n}\n \nconst esc = (s = '') => String(s).replace(\/&#91;&amp;&lt;>\"']\/g,\n    c => ({ '&amp;':'&amp;amp;','&lt;':'&amp;lt;','>':'&amp;gt;','\"':'&amp;quot;',\"'\":'&amp;#39;' }&#91;c]));\nconst safe = u => \/^https?:\\\/\\\/\/i.test(u || '') ? u : null;\n \nfunction card(p) {\n    const img = p.media?.find(m => m.type === 'image')?.cdn_url; \/\/ not media&#91;0]\n    const url = safe(p.source?.permalink);\n    return `&lt;article>\n${img ? `&lt;img src=\"${esc(img)}\" alt=\"\" loading=\"lazy\" width=\"300\">` : ''}\n&lt;p>&lt;strong>${esc(p.author?.name || p.author?.handle || 'Unknown')}&lt;\/strong>\n&lt;small>${esc(p.network?.name || '')}&lt;\/small>&lt;\/p>\n&lt;p>${esc(p.content?.text || '')}&lt;\/p>\n${url ? `&lt;a href=\"${esc(url)}\" rel=\"noopener noreferrer\">View post&lt;\/a>` : ''}\n&lt;\/article>`;\n}\n \napp.get('\/', async (_req, res) => {\n    const posts = await getPosts();\n    res.send(`&lt;!doctype html>&lt;html lang=\"en\">&lt;head>&lt;meta charset=\"utf-8\">\n&lt;title>What people are saying&lt;\/title>&lt;\/head>&lt;body>\n&lt;h1>What people are saying&lt;\/h1>\n${posts.length ? posts.map(card).join('') : '&lt;p>No posts to show yet.&lt;\/p>'}\n&lt;\/body>&lt;\/html>`);\n});\n \napp.listen(PORT, () => console.log(`http:\/\/localhost:${PORT}`));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Both versions do the same five things: call the API once, cache the answer for five minutes, fall back to the last good copy when the API is unreachable, escape everything they print, and keep the token on the server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The prompt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Paste this into whichever AI tool you use \u2014 Claude Code, Cursor, Codex, Copilot, ChatGPT or Gemini. It is self-contained: everything the AI cannot guess is written into it, so it still works if the tool cannot open links.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Build me a social widget: a web page, rendered by my own server, that\nshows a live feed of the social posts collected in my Taggbox gallery.\n \nThe API is documented here - read it before writing anything, because\nthe field names below are not the ones other social-wall APIs use:\nhttps:&#47;&#47;raw.githubusercontent.com\/wallapi\/taggbox.com-API-Docs\/main\/llms.txt\n \nWhat to deliver - both of these, in this reply, not a choice:\n- index.php: ONE self-contained PHP 8 file with everything in it, the\n  API call, the cache, the HTML and the CSS.\n- server.js + package.json: the same four things again in Node.js 18+\n  with Express. No separate stylesheet in either version.\n- README.md covering both: the files, the two environment variables,\n  how to run each one written for someone who has never opened a\n  terminal, how the cache works, and what to check when it goes wrong.\n \nCalling the API\n- GET https:\/\/api.taggbox.com\/api\/v3\/posts?limit=24, with the header\n  Authorization: Bearer &lt;my token>.\n- Take the token from the ACCESS_TOKEN environment variable and the\n  base URL from API_BASE_URL. Neither belongs in the source.\n- The response is wrapped. Posts are at body.posts and paging at\n  body.paging - never at the top level. A request can fail while\n  returning HTTP 200, so check the envelope's `status` flag too.\n- Do not add a `fields` parameter; it does not exist.\n- Do not touch `sort`. Pinned first, newest after, is already default.\n \nCaching - this is code you write, not a file you hand me\n- Keep the last response in a local JSON file and reuse it until it is\n  5 minutes old. Put that 5 in one named constant at the top.\n- Create the cache directory yourself on first run; a fresh copy with\n  no cache must work, not crash.\n- Write to a temp file and rename it into place, so a visitor arriving\n  mid-write never gets half a JSON document.\n- When a refresh fails, keep serving the cached copy however old it is.\n  Render the empty state only if nothing has ever succeeded.\n \nWhat each post gives you\n- author.name, or author.handle when the name is null - either can be\n  null, so handle that rather than printing \"null\".\n- network.name, content.text (plain text), created_at for the date.\n- The image is the FIRST entry in `media` whose type is \"image\", read\n  from its cdn_url. Do not reach for media&#91;0]: that is often a video.\n- source.permalink links back; add rel=\"noopener noreferrer\".\n \nNon-negotiable\n- Every API call happens on the server. The token must not reach the\n  browser - not in the HTML, not in a comment, not in an attribute.\n- Escape everything you print; allow only http and https URLs.\n \nFinish by commenting each part, then ask me for my access token and\ntell me how to set the environment variables and run each version.<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Set up your AI agent once<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every agent reads a project context file before it writes anything. Drop one in, and every later request can be a single line \u2014 \u201cadd a network filter\u201d, \u201cswitch the cache to Redis\u201d \u2014 because the rules are already in the project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The contents are the same for every tool. Only the filename and location change, so write this once and save it at the path your tool expects:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Taggbox social widget - project context\n \nData source: GET https:\/\/api.taggbox.com\/api\/v3\/posts\nFull spec: https:\/\/raw.githubusercontent.com\/wallapi\/taggbox.com-API-Docs\/main\/llms.txt\n \nRules for all code in this project:\n- Read the token from ACCESS_TOKEN and the base URL from API_BASE_URL.\n  Never hard-code either.\n- Render on the server. The token must never reach the browser.\n- The payload is inside the envelope: body.posts \/ body.paging. Check the\n  HTTP status AND the envelope's own `status` flag.\n- There is no `fields` parameter, and the default sort (pinned first,\n  then newest) is already correct - do not change it.\n- The image is the first `media` entry whose type is \"image\", via its\n  cdn_url. media&#91;0] is often a video file.\n- Absent values are null, never \"\" or 0. author.name falls back to\n  author.handle.\n- Cache to a JSON file for 5 minutes: create the directory on first run,\n  write through a temp file and rename it into place, and serve the last\n  good copy if a refresh fails.\n- Escape everything printed; allow only http(s) URLs in href and src.\n- Build both an index.php and a server.js, each self-contained with its\n  CSS inside it, plus one README.md covering both.<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>TOOL<\/strong><\/th><th><strong>SAVE IT AS<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Claude Code<\/td><td>CLAUDE.md in the project root<\/td><\/tr><tr><td>OpenAI Codex \/ Grok<\/td><td>Build AGENTS.md in the project root<\/td><\/tr><tr><td>Google Antigravity \/ Gemini CLI<\/td><td>GEMINI.md in the project root<\/td><\/tr><tr><td>Cursor<\/td><td>.cursor\/rules\/taggbox.mdc \u2014 add alwaysApply: true to its frontmatter<\/td><\/tr><tr><td>GitHub Copilot<\/td><td>.github\/copilot-instructions.md<\/td><\/tr><tr><td>Windsurf<\/td><td>.windsurf\/rules\/taggbox.md<\/td><\/tr><tr><td>Cline<\/td><td>.clinerules<\/td><\/tr><tr><td>Aider<\/td><td>CONVENTIONS.md, passed with aider &#8211;read CONVENTIONS.md<\/td><\/tr><tr><td>ChatGPT, Gemini, Claude.ai (browser)<\/td><td>no file \u2014 paste it as your first message, or into Custom Instructions<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">With that file in place, the long prompt above becomes optional: \u201cBuild the <a href=\"https:\/\/taggbox.com\/widget\/\">Taggbox widget<\/a> described in the context file, both languages\u201d is enough.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What you get back<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Two complete versions, so you can hand whichever one fits your hosting to whoever deploys it. Each is self-contained \u2014 the CSS is inside the file, so there is no stylesheet to wire up.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>PHP<\/strong><\/th><th><strong>NODE.JS<\/strong><\/th><\/tr><\/thead><tbody><tr><td>index.php \u2014 one file: the API call, the cache, the HTML and the CSS. Nothing to install.<\/td><td>server.js with the same four things, plus package.json.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Plus a README.md that documents both: where each file goes, how to set the two environment variables, how to run each version, and what to check when something looks wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neither version ships a cache file. Each creates its own cache directory on first run, writes through a temporary file so a visitor never catches a half-written one, and keeps serving the last good copy if the API is unreachable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting the two values<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One you fetch, one you already know:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>VALUE<\/strong><\/th><th><strong>ENVIRONMENT VARIABLE<\/strong><\/th><th><strong>WHERE IT COMES FROM<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Token<\/td><td>ACCESS_TOKEN<\/td><td>your dashboard \u2014 the four steps above<\/td><\/tr><tr><td>API base URL<\/td><td>API_BASE_URL<\/td><td>always https:\/\/api.taggbox.com\/api<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The AI asks you for the token at the end of its reply, after the code is written, so you are never waiting on a question before you have anything. Put both in a .env file (or your host&#8217;s environment settings) \u2014 never in the code itself, and never in a chat window.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">If it goes wrong<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Blank page, no error. <\/strong>The gallery has no approved posts yet, or the filters in your dashboard are hiding all of them. Check the gallery first, not the code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>401 from the API. <\/strong>The token is missing or wrong in the environment, or API access is not enabled on the account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Posts look stale. <\/strong>That is the five-minute cache doing its job. Delete the cache file to force a refresh.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>The AI asked questions instead of writing code. <\/strong>Reply: \u201cBuild it now with sensible defaults and ask me for the token at the end.\u201d<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How many API calls is this?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">About 288 a day, whatever your traffic, because the page serves a cached copy for five minutes at a time. Two things break that number: running several PHP workers or Node instances that each keep their own cache file, and paging through posts without caching each page. The prompt covers both.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>People are already posting about your brand on Instagram, LinkedIn, YouTube, X, TikTok and Google. A social media feed widget puts all of it in one place, live, in your design. This guide gives you a prompt that makes an AI tool build the page for you. Pick the tool you already have open, paste, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[279],"tags":[],"class_list":["post-47400","post","type-post","status-publish","format-standard","hentry","category-integration-widget"],"_links":{"self":[{"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/posts\/47400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/comments?post=47400"}],"version-history":[{"count":2,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/posts\/47400\/revisions"}],"predecessor-version":[{"id":47402,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/posts\/47400\/revisions\/47402"}],"wp:attachment":[{"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/media?parent=47400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/categories?post=47400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/taggbox.com\/support\/wp-json\/wp\/v2\/tags?post=47400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}