[{"data":1,"prerenderedAt":1033},["ShallowReactive",2],{"skill":3},{"data":4,"body":6,"toc":1025},{"title":5,"description":5},"",{"type":7,"children":8},"root",[9,30,37,50,55,62,133,139,198,234,240,699,705,710,723,735,812,818,1020],{"type":10,"tag":11,"props":12,"children":13},"element","blockquote",{},[14],{"type":10,"tag":15,"props":16,"children":17},"p",{},[18,21],{"type":19,"value":20},"text","For the complete documentation index, see ",{"type":10,"tag":22,"props":23,"children":27},"a",{"href":24,"rel":25},"https:\u002F\u002Fshruwd.io\u002Fllms.txt",[26],"nofollow",[28],{"type":19,"value":29},"llms.txt",{"type":10,"tag":31,"props":32,"children":34},"h1",{"id":33},"skill-set-a-brand-up-in-shruwd",[35],{"type":19,"value":36},"Skill: set a brand up in Shruwd",{"type":10,"tag":15,"props":38,"children":39},{},[40,42,48],{"type":19,"value":41},"Shruwd (",{"type":10,"tag":22,"props":43,"children":46},{"href":44,"rel":45},"https:\u002F\u002Fshruwd.io",[26],[47],{"type":19,"value":44},{"type":19,"value":49},") measures how a brand appears in AI-generated answers, diagnoses\nwhy it is or is not cited, and re-checks fixes to prove whether anything moved.",{"type":10,"tag":15,"props":51,"children":52},{},[53],{"type":19,"value":54},"Everything below is doable over the REST API. There is no onboarding UI to drive\nand nothing to scrape — one step needs a human, and it is called out in step 1.",{"type":10,"tag":56,"props":57,"children":59},"h2",{"id":58},"interfaces-in-order-of-preference",[60],{"type":19,"value":61},"Interfaces, in order of preference",{"type":10,"tag":63,"props":64,"children":65},"ol",{},[66,103,114],{"type":10,"tag":67,"props":68,"children":69},"li",{},[70,72,79,81,87,89,95,97],{"type":19,"value":71},"The MCP server. Best if you are running in Claude, ChatGPT, Grok, Claude Code\nor Cursor: the tools carry their own descriptions. Hosted at ",{"type":10,"tag":73,"props":74,"children":76},"code",{"className":75},[],[77],{"type":19,"value":78},"https:\u002F\u002Fshruwd.io\u002Fmcp",{"type":19,"value":80},"\n(Streamable HTTP), where the human signs in with Shruwd when the app connects,\nor you send an API key as ",{"type":10,"tag":73,"props":82,"children":84},{"className":83},[],[85],{"type":19,"value":86},"Authorization: Bearer \u003Ckey>",{"type":19,"value":88},". Or local, as the\n",{"type":10,"tag":73,"props":90,"children":92},{"className":91},[],[93],{"type":19,"value":94},"shruwd-mcp",{"type":19,"value":96}," npm package over stdio, with a key. Setup for each app:\n",{"type":10,"tag":22,"props":98,"children":101},{"href":99,"rel":100},"https:\u002F\u002Fshruwd.io\u002Fdocs\u002Fapi\u002Fmcp-server",[26],[102],{"type":19,"value":99},{"type":10,"tag":67,"props":104,"children":105},{},[106,112],{"type":10,"tag":73,"props":107,"children":109},{"className":108},[],[110],{"type":19,"value":111},"@shruwd\u002Fsdk",{"type":19,"value":113}," — a typed TypeScript client. Best if you are writing code.",{"type":10,"tag":67,"props":115,"children":116},{},[117,123,125,131],{"type":10,"tag":73,"props":118,"children":120},{"className":119},[],[121],{"type":19,"value":122},"https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1",{"type":19,"value":124}," — plain REST, described at ",{"type":10,"tag":73,"props":126,"children":128},{"className":127},[],[129],{"type":19,"value":130},"https:\u002F\u002Fshruwd.io\u002Fopenapi.json",{"type":19,"value":132},".",{"type":10,"tag":56,"props":134,"children":136},{"id":135},"inputs",[137],{"type":19,"value":138},"Inputs",{"type":10,"tag":140,"props":141,"children":142},"ul",{},[143,176,187],{"type":10,"tag":67,"props":144,"children":145},{},[146,152,154,160,162,168,170],{"type":10,"tag":73,"props":147,"children":149},{"className":148},[],[150],{"type":19,"value":151},"name",{"type":19,"value":153}," and ",{"type":10,"tag":73,"props":155,"children":157},{"className":156},[],[158],{"type":19,"value":159},"domain",{"type":19,"value":161}," — the brand to track, e.g. ",{"type":10,"tag":73,"props":163,"children":165},{"className":164},[],[166],{"type":19,"value":167},"Northwind",{"type":19,"value":169}," \u002F ",{"type":10,"tag":73,"props":171,"children":173},{"className":172},[],[174],{"type":19,"value":175},"northwind.io",{"type":10,"tag":67,"props":177,"children":178},{},[179,185],{"type":10,"tag":73,"props":180,"children":182},{"className":181},[],[183],{"type":19,"value":184},"competitors",{"type":19,"value":186}," — the brands you expect to be compared against",{"type":10,"tag":67,"props":188,"children":189},{},[190,196],{"type":10,"tag":73,"props":191,"children":193},{"className":192},[],[194],{"type":19,"value":195},"prompts",{"type":19,"value":197}," — the questions buyers actually ask. Start with 10 to 25",{"type":10,"tag":15,"props":199,"children":200},{},[201,203,209,211,217,218,224,226,232],{"type":19,"value":202},"No lists yet? After step 2, ",{"type":10,"tag":73,"props":204,"children":206},{"className":205},[],[207],{"type":19,"value":208},"POST https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fsetup-suggestions",{"type":19,"value":210},"\ndrafts 10 to 25 prompts, each with the page that should answer it, and up to six\ncompetitors from the brand's homepage and sitemap. Nothing is added: review the draft\nwith the human, then add what they keep in steps 3 and 4. Send each competitor with the\ndraft's ",{"type":10,"tag":73,"props":212,"children":214},{"className":213},[],[215],{"type":19,"value":216},"aliases",{"type":19,"value":153},{"type":10,"tag":73,"props":219,"children":221},{"className":220},[],[222],{"type":19,"value":223},"contextTerms",{"type":19,"value":225}," (matching is exact), and each prompt with its ",{"type":10,"tag":73,"props":227,"children":229},{"className":228},[],[230],{"type":19,"value":231},"page",{"type":19,"value":233},".\nThree drafts per brand per day.",{"type":10,"tag":56,"props":235,"children":237},{"id":236},"procedure",[238],{"type":19,"value":239},"Procedure",{"type":10,"tag":63,"props":241,"children":242},{},[243,346,379,410,470,551],{"type":10,"tag":67,"props":244,"children":245},{},[246,252,254,259,261,266,268,274,278,280,286,288,293,295,298,300,306,308,314,316,322,324,330,332,338,339,345],{"type":10,"tag":247,"props":248,"children":249},"strong",{},[250],{"type":19,"value":251},"Get a key — this step is the human's.",{"type":19,"value":253}," On the hosted MCP server the human\nsigns in when their app connects instead, choosing read and write access, and\nyou can skip to step 2. API keys are minted only with an interactive session,\nso an agent cannot create its own. Ask the account owner\nto sign in at ",{"type":10,"tag":22,"props":255,"children":257},{"href":44,"rel":256},[26],[258],{"type":19,"value":44},{"type":19,"value":260},", open ",{"type":10,"tag":247,"props":262,"children":263},{},[264],{"type":19,"value":265},"Account → API keys",{"type":19,"value":267},", and create a key with\nread and write scope. Suggested message: ",{"type":10,"tag":269,"props":270,"children":271},"em",{},[272],{"type":19,"value":273},"\"Create a Shruwd API key under\nAccount → API keys and paste it to me — I'll do the rest.\"",{"type":10,"tag":275,"props":276,"children":277},"br",{},[],{"type":19,"value":279},"Keys look like ",{"type":10,"tag":73,"props":281,"children":283},{"className":282},[],[284],{"type":19,"value":285},"sh_live_...",{"type":19,"value":287}," and go in ",{"type":10,"tag":73,"props":289,"children":291},{"className":290},[],[292],{"type":19,"value":86},{"type":19,"value":294},". Treat\nit as a secret: put it in an environment variable, never in a committed file.",{"type":10,"tag":275,"props":296,"children":297},{},[],{"type":19,"value":299},"A key is bound to one workspace and reaches its holder's brands there:\nevery brand for the workspace owner, the brands they are a member of\notherwise. It never exceeds their role on a brand: reads need ",{"type":10,"tag":73,"props":301,"children":303},{"className":302},[],[304],{"type":19,"value":305},"viewer",{"type":19,"value":307},",\nwrites ",{"type":10,"tag":73,"props":309,"children":311},{"className":310},[],[312],{"type":19,"value":313},"editor",{"type":19,"value":315},", minting a log-ingest token ",{"type":10,"tag":73,"props":317,"children":319},{"className":318},[],[320],{"type":19,"value":321},"admin",{"type":19,"value":323},", and creating or\narchiving a brand needs the owner. If you are expected to create the brand\nin step 2, ask the owner for the key. A brand the key cannot reach is\n",{"type":10,"tag":73,"props":325,"children":327},{"className":326},[],[328],{"type":19,"value":329},"404",{"type":19,"value":331},"; refusals are ",{"type":10,"tag":73,"props":333,"children":335},{"className":334},[],[336],{"type":19,"value":337},"403 not_a_member",{"type":19,"value":153},{"type":10,"tag":73,"props":340,"children":342},{"className":341},[],[343],{"type":19,"value":344},"403 insufficient_role",{"type":19,"value":132},{"type":10,"tag":67,"props":347,"children":348},{},[349,354,356,362,364,370,372,377],{"type":10,"tag":247,"props":350,"children":351},{},[352],{"type":19,"value":353},"Create the brand.",{"type":19,"value":355}," ",{"type":10,"tag":73,"props":357,"children":359},{"className":358},[],[360],{"type":19,"value":361},"POST https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands { name, domain }",{"type":19,"value":363},". A caller who\nowns no workspace gets one automatically on this call — there is no workspace\nresource to create first. A short or common-word brand name (\"Front\") is\nrefused with ",{"type":10,"tag":73,"props":365,"children":367},{"className":366},[],[368],{"type":19,"value":369},"context_terms_required",{"type":19,"value":371}," until you add ",{"type":10,"tag":73,"props":373,"children":375},{"className":374},[],[376],{"type":19,"value":223},{"type":19,"value":378},", words\nthat mark a mention as being about this brand — otherwise every \"front-end\"\ncounts as one.",{"type":10,"tag":67,"props":380,"children":381},{},[382,387,388,394,396,401,403,408],{"type":10,"tag":247,"props":383,"children":384},{},[385],{"type":19,"value":386},"Add competitors, before any prompt.",{"type":19,"value":355},{"type":10,"tag":73,"props":389,"children":391},{"className":390},[],[392],{"type":19,"value":393},"POST https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fentities",{"type":19,"value":395},",\none call each. Matching is exact on token boundaries, never fuzzy, because a\nfalse positive here silently corrupts every metric downstream. A short or\ncommon-word name or alias is refused with ",{"type":10,"tag":73,"props":397,"children":399},{"className":398},[],[400],{"type":19,"value":369},{"type":19,"value":402}," until you supply\n",{"type":10,"tag":73,"props":404,"children":406},{"className":405},[],[407],{"type":19,"value":223},{"type":19,"value":409}," — the terms that make \"Arc\" mean the company rather than the\nword. If you need the human for those, ask now, before step 4.",{"type":10,"tag":67,"props":411,"children":412},{},[413,418,419,425,427,433,435,441,443,449,450,456,457,460,462,468],{"type":10,"tag":247,"props":414,"children":415},{},[416],{"type":19,"value":417},"Add every prompt in one call.",{"type":19,"value":355},{"type":10,"tag":73,"props":420,"children":422},{"className":421},[],[423],{"type":19,"value":424},"POST https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fprompts",{"type":19,"value":426},".\nThese are fixed for the brand and repeated every cycle, which is what makes\nweek-over-week comparison meaningful — so write them as a buyer would ask, not\nas keywords, and change them rarely. The plan's prompt allowance is one pool\nacross every brand in the workspace, not a per-brand limit; a batch that would\nexceed it is refused whole with ",{"type":10,"tag":73,"props":428,"children":430},{"className":429},[],[431],{"type":19,"value":432},"409 plan_limit",{"type":19,"value":434},", carrying ",{"type":10,"tag":73,"props":436,"children":438},{"className":437},[],[439],{"type":19,"value":440},"limit",{"type":19,"value":442},",\n",{"type":10,"tag":73,"props":444,"children":446},{"className":445},[],[447],{"type":19,"value":448},"current",{"type":19,"value":153},{"type":10,"tag":73,"props":451,"children":453},{"className":452},[],[454],{"type":19,"value":455},"submitted",{"type":19,"value":132},{"type":10,"tag":275,"props":458,"children":459},{},[],{"type":19,"value":461},"The first measurement starts within minutes of the first prompts and measures\nonly the prompts and competitors that exist at that moment. On the free plan it\nis the only measurement the domain ever gets, and there is none at all if step\n2 answered ",{"type":10,"tag":73,"props":463,"children":465},{"className":464},[],[466],{"type":19,"value":467},"snapshot: \"already_taken\"",{"type":19,"value":469},". That is why competitors come first\nand the prompts go in together.",{"type":10,"tag":67,"props":471,"children":472},{},[473,478,480,486,488,494,496],{"type":10,"tag":247,"props":474,"children":475},{},[476],{"type":19,"value":477},"Wait, then check.",{"type":19,"value":479}," Measurement is asynchronous: the first cycle starts\nwithin minutes of the prompts and completes within a day. Check after about\nfifteen minutes, then about once an hour, never in a tight loop:\n",{"type":10,"tag":73,"props":481,"children":483},{"className":482},[],[484],{"type":19,"value":485},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fcycles",{"type":19,"value":487},". It lists newest first, and on a weekly\nplan the first entry is next week's cycle, still ",{"type":10,"tag":73,"props":489,"children":491},{"className":490},[],[492],{"type":19,"value":493},"pending",{"type":19,"value":495},". Skip pending\ncycles, which have not started, and read the newest one that has:",{"type":10,"tag":140,"props":497,"children":498},{},[499,510,521,532],{"type":10,"tag":67,"props":500,"children":501},{},[502,508],{"type":10,"tag":73,"props":503,"children":505},{"className":504},[],[506],{"type":19,"value":507},"running",{"type":19,"value":509}," — still measuring.",{"type":10,"tag":67,"props":511,"children":512},{},[513,519],{"type":10,"tag":73,"props":514,"children":516},{"className":515},[],[517],{"type":19,"value":518},"complete",{"type":19,"value":520}," — the results are in.",{"type":10,"tag":67,"props":522,"children":523},{},[524,530],{"type":10,"tag":73,"props":525,"children":527},{"className":526},[],[528],{"type":19,"value":529},"partial",{"type":19,"value":531}," — some runs failed. Report what exists and say so.",{"type":10,"tag":67,"props":533,"children":534},{},[535,541,543,549],{"type":10,"tag":73,"props":536,"children":538},{"className":537},[],[539],{"type":19,"value":540},"failed",{"type":19,"value":542}," or ",{"type":10,"tag":73,"props":544,"children":546},{"className":545},[],[547],{"type":19,"value":548},"skipped_quota",{"type":19,"value":550}," — no new numbers. Say that rather than\nreporting older ones as new.",{"type":10,"tag":67,"props":552,"children":553},{},[554,559,565,567,573,575,581,583,589,591,597,599,605,606,612,613,619,620,626,628,634,636,641,643,649,651,657,659,665,667,673,675,681,683,689,691,697],{"type":10,"tag":247,"props":555,"children":556},{},[557],{"type":19,"value":558},"Read the results: every engine at once, then each engine.",{"type":10,"tag":73,"props":560,"children":562},{"className":561},[],[563],{"type":19,"value":564},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=all",{"type":19,"value":566}," returns every engine's\nmention rate for each entity in one call (",{"type":10,"tag":73,"props":568,"children":570},{"className":569},[],[571],{"type":19,"value":572},"byEngine",{"type":19,"value":574},"), plus the mention rate\nacross engines (",{"type":10,"tag":73,"props":576,"children":578},{"className":577},[],[579],{"type":19,"value":580},"mentionRate",{"type":19,"value":582},"): an equal-weight average over the engines that\nanswered through the whole window (",{"type":10,"tag":73,"props":584,"children":586},{"className":585},[],[587],{"type":19,"value":588},"engines",{"type":19,"value":590},"; ",{"type":10,"tag":73,"props":592,"children":594},{"className":593},[],[595],{"type":19,"value":596},"joining",{"type":19,"value":598}," names any that start\nlater). Use it for an overview, and say how many engines it covers. Findings,\nrechecks and movement are per engine: never report a change in the\ncross-engine rate as a result of a fix. For share of voice, named first and\nthe per-prompt rows, read each engine:\n",{"type":10,"tag":73,"props":600,"children":602},{"className":601},[],[603],{"type":19,"value":604},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=google_aio",{"type":19,"value":442},{"type":10,"tag":73,"props":607,"children":609},{"className":608},[],[610],{"type":19,"value":611},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=google_ai_mode",{"type":19,"value":442},{"type":10,"tag":73,"props":614,"children":616},{"className":615},[],[617],{"type":19,"value":618},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=chatgpt",{"type":19,"value":442},{"type":10,"tag":73,"props":621,"children":623},{"className":622},[],[624],{"type":19,"value":625},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=gemini",{"type":19,"value":627}," and\n",{"type":10,"tag":73,"props":629,"children":631},{"className":630},[],[632],{"type":19,"value":633},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fvisibility?engine=perplexity",{"type":19,"value":635}," — the brand's\n",{"type":10,"tag":73,"props":637,"children":639},{"className":638},[],[640],{"type":19,"value":588},{"type":19,"value":642}," lists the ones its plan measures. Without ",{"type":10,"tag":73,"props":644,"children":646},{"className":645},[],[647],{"type":19,"value":648},"engine",{"type":19,"value":650}," the call\nreturns Google AI Overviews only, so report each engine separately, never as\none \"AI visibility\" number. Each read's ",{"type":10,"tag":73,"props":652,"children":654},{"className":653},[],[655],{"type":19,"value":656},"intents",{"type":19,"value":658}," splits the brand's rate\nby question type, buying (",{"type":10,"tag":73,"props":660,"children":662},{"className":661},[],[663],{"type":19,"value":664},"commercial",{"type":19,"value":666},") first. Each company's\n",{"type":10,"tag":73,"props":668,"children":670},{"className":669},[],[671],{"type":19,"value":672},"firstNamed",{"type":19,"value":674}," is how often it is the first of the tracked companies an\nanswer names (n = share of voice's): a proxy for first pick, not a\nrecommendation.\n",{"type":10,"tag":73,"props":676,"children":678},{"className":677},[],[679],{"type":19,"value":680},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Ffindings",{"type":19,"value":682}," for the\ndiagnosed causes and the fixes they recommend. Where the plan shows only its\ntop findings, the list returns those and counts the rest in ",{"type":10,"tag":73,"props":684,"children":686},{"className":685},[],[687],{"type":19,"value":688},"locked",{"type":19,"value":690}," by\nseverity: say how many are withheld rather than reporting the list as the\nwhole set, and expect ",{"type":10,"tag":73,"props":692,"children":694},{"className":693},[],[695],{"type":19,"value":696},"403 not_entitled",{"type":19,"value":698}," on a locked one.",{"type":10,"tag":56,"props":700,"children":702},{"id":701},"reading-a-metric-correctly",[703],{"type":19,"value":704},"Reading a metric correctly",{"type":10,"tag":15,"props":706,"children":707},{},[708],{"type":19,"value":709},"This is the part agents most often get wrong, so check your output against it\nbefore reporting anything.",{"type":10,"tag":15,"props":711,"children":712},{},[713,715,721],{"type":19,"value":714},"Every metric comes back as a ",{"type":10,"tag":73,"props":716,"children":718},{"className":717},[],[719],{"type":19,"value":720},"DisplayableMetric",{"type":19,"value":722},":",{"type":10,"tag":724,"props":725,"children":730},"pre",{"className":726,"code":727,"language":728,"meta":5,"style":729},"language-json","{ \"state\": \"ok\", \"point\": 0.142, \"lo\": 0.081, \"hi\": 0.226, \"n\": 42 }\n","json","undefined",[731],{"type":10,"tag":73,"props":732,"children":733},{"__ignoreMap":5},[734],{"type":19,"value":727},{"type":10,"tag":140,"props":736,"children":737},{},[738,764,782,807],{"type":10,"tag":67,"props":739,"children":740},{},[741,747,749,755,756,762],{"type":10,"tag":73,"props":742,"children":744},{"className":743},[],[745],{"type":19,"value":746},"point",{"type":19,"value":748},", ",{"type":10,"tag":73,"props":750,"children":752},{"className":751},[],[753],{"type":19,"value":754},"lo",{"type":19,"value":153},{"type":10,"tag":73,"props":757,"children":759},{"className":758},[],[760],{"type":19,"value":761},"hi",{"type":19,"value":763}," are proportions from 0 to 1: 0.142 is 14.2%.",{"type":10,"tag":67,"props":765,"children":766},{},[767,773,775,780],{"type":10,"tag":73,"props":768,"children":770},{"className":769},[],[771],{"type":19,"value":772},"state: \"insufficient_data\"",{"type":19,"value":774}," means fewer than ten responses exist. ",{"type":10,"tag":247,"props":776,"children":777},{},[778],{"type":19,"value":779},"It is not\nzero.",{"type":19,"value":781}," Say \"not enough data yet\", never \"0%\".",{"type":10,"tag":67,"props":783,"children":784},{},[785,787,792,794,799,800,805],{"type":19,"value":786},"Never quote ",{"type":10,"tag":73,"props":788,"children":790},{"className":789},[],[791],{"type":19,"value":746},{"type":19,"value":793}," without ",{"type":10,"tag":73,"props":795,"children":797},{"className":796},[],[798],{"type":19,"value":754},{"type":19,"value":153},{"type":10,"tag":73,"props":801,"children":803},{"className":802},[],[804],{"type":19,"value":761},{"type":19,"value":806},". The interval is usually wide, and a\nbare number reads as far more certain than the measurement is.",{"type":10,"tag":67,"props":808,"children":809},{},[810],{"type":19,"value":811},"Never say a metric \"improved\" or \"dropped\" from two point estimates. Movement\nrequires a significant change whose 95% interval excludes zero AND at least 5\npercentage points of change.\nShruwd applies both gates itself — report what it says, do not recompute it.",{"type":10,"tag":56,"props":813,"children":815},{"id":814},"notes",[816],{"type":19,"value":817},"Notes",{"type":10,"tag":140,"props":819,"children":820},{},[821,834,846,913,924,974,992],{"type":10,"tag":67,"props":822,"children":823},{},[824,826,832],{"type":19,"value":825},"Engines tracked today: Google AI Overviews, Google AI Mode, ChatGPT, Gemini and\nPerplexity. Google AI Mode is measured from 2026-10-15, Gemini from 2026-11-10 and\nPerplexity from 2026-11-11, so a brand's numbers on each read ",{"type":10,"tag":73,"props":827,"children":829},{"className":828},[],[830],{"type":19,"value":831},"insufficient_data",{"type":19,"value":833},"\nuntil ten answers exist. Perplexity's answers come from Perplexity's Sonar API, not\nfrom the Perplexity app; say so when you report them.",{"type":10,"tag":67,"props":835,"children":836},{},[837,839,845],{"type":19,"value":838},"On Starter and Pro, cycles run weekly. The free plan takes one snapshot at setup and\nno scheduled cycles. A manual run is ",{"type":10,"tag":73,"props":840,"children":842},{"className":841},[],[843],{"type":19,"value":844},"POST https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fcycles",{"type":19,"value":132},{"type":10,"tag":67,"props":847,"children":848},{},[849,851,857,859,865,867,873,875,881,883,889,891,897,899,905,911],{"type":19,"value":850},"A finding about a question has ",{"type":10,"tag":73,"props":852,"children":854},{"className":853},[],[855],{"type":19,"value":856},"subjectType: \"prompt_group\"",{"type":19,"value":858},", and its ",{"type":10,"tag":73,"props":860,"children":862},{"className":861},[],[863],{"type":19,"value":864},"subjectRef",{"type":19,"value":866},"\nis the ",{"type":10,"tag":73,"props":868,"children":870},{"className":869},[],[871],{"type":19,"value":872},"promptGroupId",{"type":19,"value":874},". The answers behind it:\n",{"type":10,"tag":73,"props":876,"children":878},{"className":877},[],[879],{"type":19,"value":880},"GET https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fbrands\u002F{brandId}\u002Fanswers?promptGroupId={subjectRef}&limit=50",{"type":19,"value":882},". When its\n",{"type":10,"tag":73,"props":884,"children":886},{"className":885},[],[887],{"type":19,"value":888},"recommendation.target",{"type":19,"value":890}," is ",{"type":10,"tag":73,"props":892,"children":894},{"className":893},[],[895],{"type":19,"value":896},"null",{"type":19,"value":898},", no page of the brand's answers the question\nyet; once one does, set it with ",{"type":10,"tag":73,"props":900,"children":902},{"className":901},[],[903],{"type":19,"value":904},"PATCH https:\u002F\u002Fshruwd.io\u002Fapi\u002Fv1\u002Fprompts\u002F{promptGroupId}",{"type":10,"tag":73,"props":906,"children":908},{"className":907},[],[909],{"type":19,"value":910},"{ \"page\": \"https:\u002F\u002F…\" }",{"type":19,"value":912},", and later findings name it.",{"type":10,"tag":67,"props":914,"children":915},{},[916,918],{"type":19,"value":917},"Plans, prices and limits, as markdown: ",{"type":10,"tag":22,"props":919,"children":922},{"href":920,"rel":921},"https:\u002F\u002Fshruwd.io\u002Fpricing.md",[26],[923],{"type":19,"value":920},{"type":10,"tag":67,"props":925,"children":926},{},[927,929,935,937,943,944,950,952,958,960,966,968,973],{"type":19,"value":928},"Errors are ",{"type":10,"tag":73,"props":930,"children":932},{"className":931},[],[933],{"type":19,"value":934},"{ code, message, retryable, details? }",{"type":19,"value":936},". Retry ",{"type":10,"tag":73,"props":938,"children":940},{"className":939},[],[941],{"type":19,"value":942},"429",{"type":19,"value":153},{"type":10,"tag":73,"props":945,"children":947},{"className":946},[],[948],{"type":19,"value":949},"5xx",{"type":19,"value":951}," with\nbackoff and honour ",{"type":10,"tag":73,"props":953,"children":955},{"className":954},[],[956],{"type":19,"value":957},"Retry-After",{"type":19,"value":959},"; do not retry a ",{"type":10,"tag":73,"props":961,"children":963},{"className":962},[],[964],{"type":19,"value":965},"4xx",{"type":19,"value":967}," that is not ",{"type":10,"tag":73,"props":969,"children":971},{"className":970},[],[972],{"type":19,"value":942},{"type":19,"value":132},{"type":10,"tag":67,"props":975,"children":976},{},[977,979,985,987],{"type":19,"value":978},"Full documentation in one fetch: ",{"type":10,"tag":22,"props":980,"children":983},{"href":981,"rel":982},"https:\u002F\u002Fshruwd.io\u002Fllms-full.txt",[26],[984],{"type":19,"value":981},{"type":19,"value":986}," · index: ",{"type":10,"tag":22,"props":988,"children":990},{"href":24,"rel":989},[26],[991],{"type":19,"value":24},{"type":10,"tag":67,"props":993,"children":994},{},[995,997,1003,1005,1011,1013,1019],{"type":19,"value":996},"Any page is markdown with ",{"type":10,"tag":73,"props":998,"children":1000},{"className":999},[],[1001],{"type":19,"value":1002},".md",{"type":19,"value":1004}," appended, e.g.\n",{"type":10,"tag":22,"props":1006,"children":1009},{"href":1007,"rel":1008},"https:\u002F\u002Fshruwd.io\u002Fdocs\u002Fgetting-started\u002Foverview.md",[26],[1010],{"type":19,"value":1007},{"type":19,"value":1012},", or asked for with ",{"type":10,"tag":73,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":19,"value":1018},"Accept: text\u002Fmarkdown",{"type":19,"value":132},{"type":10,"tag":1021,"props":1022,"children":1023},"style",{},[1024],{"type":19,"value":5},{"title":5,"searchDepth":1026,"depth":1026,"links":1027},2,[1028,1029,1030,1031,1032],{"id":58,"depth":1026,"text":61},{"id":135,"depth":1026,"text":138},{"id":236,"depth":1026,"text":239},{"id":701,"depth":1026,"text":704},{"id":814,"depth":1026,"text":817},1794523286839]