{"model":"Xenova/all-MiniLM-L6-v2","queryPrefix":"","dimensions":384,"builtAt":"2026-10-20","contentHash":"4d6262740e3f4efa","chunks":[{"u":"/","a":"","p":"Introduction","h":"Introduction","t":"PULSE measures whether your product data can answer what shoppers ask, ranks the repairs worth making, and proves the fix worked. Start with one export.\n\nMost tools here rank what a shopper sees. PULSE asks the question underneath that one: can your\ncatalogue answer what they came to find out at all? You send a category export, get back the\nattributes worth recording in priority order, and re-measure once your team has filled them in.\n\nNothing goes on your site to begin with. The first useful answer comes from a file.\n\nWho builds this. \nPULSE is made by Resolve Labs, a small team working on one question: which product\ninformation is worth paying to fix. The marketing site is\nthepulseapi.com (https://thepulseapi.com/en). This site is for the people who have to wire it\nup.","l":"en"},{"u":"/","a":"what-problem-does-this-actually-solve","p":"Introduction","h":"What problem does this actually solve?","t":"A shopper leaves without buying. Either they could not find the product, or your catalogue could\nnot tell them apart.\n\nThe second one is larger and almost nobody measures it. On a 216-product laptop shelf we\nmeasured, 94 products remain indistinguishable after every question a shopper could answer,\nbecause the attributes that would separate them are not recorded anywhere. No ranking model fixes\nthat. Only recording the attribute does.\n\nSo PULSE starts at the catalogue rather than at the session:\n\nThe question What PULSE answers with \n--- --- \nWhich missing field costs the most? A ranking by how many shoppers need it, not by how empty the column is \nWhere does that fact already live? Often in your own titles and descriptions, recoverable before anyone types anything \nDid the repair work? The same measurement on the repaired export, with no traffic needed","l":"en"},{"u":"/","a":"where-should-i-start","p":"Introduction","h":"Where should I start?","t":"}\ntitle=\"You came from thepulseapi.com\"\nhref=\"/quickstart\"\ndescription=\"You have read what the audit does. This is how to run one yourself, in about ten lines.\"\n/ \n}\ntitle=\"You landed here first\"\nhref=\"/concepts/how-it-works\"\ndescription=\"Start with what the engine measures and why the number means anything.\"\n/","l":"en"},{"u":"/","a":"what-does-the-whole-journey-look-like","p":"Introduction","h":"What does the whole journey look like?","t":"Six steps, in the order you will meet them. Each one is useful on its own, and you can stop\nafter any of them.\n\nMeasure the catalogue. POST /catalog/audit takes a category export and returns the attributes worth recording, ranked,\nwith the affected products attached. Stateless, and it stores nothing unless you ask it to.\n\nRun your first audit (https://developer.thepulseapi.com/quickstart)\n\nUnderstand what came back. The ranking is measured in bits of decision information rather than guessed from clicks, and the\nemptiest column is usually the wrong one to fix. This explains what that means and, more\nusefully, the three cases where it is wrong.\n\nWhat the audit measures (https://developer.thepulseapi.com/concepts/what-the-audit-measures)\n\nRepair, then verify. Your team populates the top attribute. POST /catalog/verify runs the same measurement on the\nrepaired export and reports what moved, attribute by attribute. It reads your catalogue rather\nthan your traffic, so there is nothing to wait for.\n\nVerify endpoint (https://developer.thepulseapi.com/api/v1/audit)","l":"en"},{"u":"/","a":"what-does-the-whole-journey-look-like","p":"Introduction","h":"What does the whole journey look like?","t":"Put it in your stack. Only needed once you want the live parts. Framework guides for React, Vue, Angular, Astro, Alpine\nand Laravel; storefront guides for Shopify, WordPress and Magento; server guides for eight\nlanguages.\n\nFramework guides (https://developer.thepulseapi.com/frameworks) · Storefronts (https://developer.thepulseapi.com/platforms) · Backend (https://developer.thepulseapi.com/backend)","l":"en"},{"u":"/","a":"measure-the-catalogue","p":"Introduction","h":"Measure the catalogue","t":"POST /catalog/audit takes a category export and returns the attributes worth recording, ranked,\nwith the affected products attached. Stateless, and it stores nothing unless you ask it to.\n\nRun your first audit (https://developer.thepulseapi.com/quickstart)","l":"en"},{"u":"/","a":"understand-what-came-back","p":"Introduction","h":"Understand what came back","t":"The ranking is measured in bits of decision information rather than guessed from clicks, and the\nemptiest column is usually the wrong one to fix. This explains what that means and, more\nusefully, the three cases where it is wrong.\n\nWhat the audit measures (https://developer.thepulseapi.com/concepts/what-the-audit-measures)","l":"en"},{"u":"/","a":"repair-then-verify","p":"Introduction","h":"Repair, then verify","t":"Your team populates the top attribute. POST /catalog/verify runs the same measurement on the\nrepaired export and reports what moved, attribute by attribute. It reads your catalogue rather\nthan your traffic, so there is nothing to wait for.\n\nVerify endpoint (https://developer.thepulseapi.com/api/v1/audit)","l":"en"},{"u":"/","a":"put-it-in-your-stack","p":"Introduction","h":"Put it in your stack","t":"Only needed once you want the live parts. Framework guides for React, Vue, Angular, Astro, Alpine\nand Laravel; storefront guides for Shopify, WordPress and Magento; server guides for eight\nlanguages.\n\nFramework guides (https://developer.thepulseapi.com/frameworks) · Storefronts (https://developer.thepulseapi.com/platforms) · Backend (https://developer.thepulseapi.com/backend)","l":"en"},{"u":"/","a":"rank-live-sessions-if-you-want-to","p":"Introduction","h":"Rank live sessions, if you want to","t":"The optional part, and the only part that touches your storefront. The SDK sends signals, the\nengine ranks your catalogue against what the session implies, and every score comes with a\nper-factor breakdown.\n\nSDK reference (https://developer.thepulseapi.com/sdk) · API reference (https://developer.thepulseapi.com/api/v1)","l":"en"},{"u":"/","a":"go-live","p":"Introduction","h":"Go live","t":"What to check before you ship, what to watch afterwards, and the things we will not claim.\n\nGoing live (https://developer.thepulseapi.com/going-live)","l":"en"},{"u":"/","a":"install","p":"Introduction","h":"Install","t":"Or drop it on the page, which is what the storefront integrations use:\n\nThe script tag exposes the client as the global Pulse, so Pulse.init(...) works directly.\n\nWhat leaves the browser. \nSignals and a session id. Not names, not emails, not payment data. The audit never sees a\nshopper at all: it reads product data.","l":"en","c":{"l":"html","s":"<script src=\"https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js\" async></script>"}},{"u":"/","a":"what-should-i-know-before-trusting-the-numbers","p":"Introduction","h":"What should I know before trusting the numbers?","t":"} title=\"3.2 KB gzipped\" description=\"The script-tag build, with zero runtime dependencies.\" / \n} title=\"No history required\" description=\"The audit needs one export. The runtime ranks from the first visit.\" / \n} title=\"MIT licensed\" description=\"The client is open. Read every line before you ship it.\" / \n} title=\"No uplift claim\" description=\"We have run no live revenue experiment, so we quote no conversion figure.\" /","l":"en"},{"u":"/api","a":"","p":"What PULSE offers","h":"What PULSE offers","t":"Every API sold as a product, which calls count toward usage, and where the SDK stops.\n\nPULSE publishes two separate interfaces, and they are not the same size.\n\n} title=\"The HTTP API\" description=\"Twelve endpoints. One header. Callable from a browser, a server, a cron job or curl. This is the product.\" / \n} title=\"The browser SDK\" description=\"A convenience layer over six of them, which also manages the session id, buffers exposures and captures device and referrer for you.\" / \n\nThe SDK is a subset, not the whole product. \n@thepulseapi/sdk has a method for six of the twelve endpoints. Everything else, including\nthe Decision Audit, is HTTP only. If you are evaluating what PULSE can do, read this page\nrather than the SDK reference (https://developer.thepulseapi.com/sdk).","l":"en","v":"/vi/api"},{"u":"/api","a":"the-product-surface","p":"What PULSE offers","h":"The product surface","t":"Every row below is reachable with a publishable key and the x-api-key header. Nothing here\nneeds a login.\n\nEndpoint What it is for Counts toward usage SDK method \n--- --- --- --- \nPOST /track Signals in, personas out Yes track() \nPOST /track/behavior One named behaviour Yes none \nPOST /track/keywords A raw search query, extracted for you Yes none \nPOST /session The personas inferred so far Yes getSession() \nPOST /catalog/ranked Rank the catalogue PULSE holds Yes rankedCatalog() \nPOST /search Rank products you pass in Yes search() \nPOST /rerank Reorder a result set from your own engine Yes none \nPOST /suggest Query suggestions, scored on the session No none \nPOST /catalog/audit What a catalogue cannot answer Yes none \nPOST /catalog/verify What a repair actually changed Yes none \nPOST /event A named outcome No event() \nPOST /exposure What was actually rendered No exposure()","l":"en","v":"/vi/api"},{"u":"/api","a":"why-three-of-them-are-free","p":"What PULSE offers","h":"Why three of them are free","t":"/event and /exposure are how you prove the ranking worked. Charging for measurement makes\nswitching it off the rational move, which blinds the learning loop and destroys the value case\nin the same stroke.\n\n/suggest fires on every keystroke. Metering it like /search would bill per character typed,\nso someone spelling out a query would pay ten times for one search.\n\nUsage is grouped by the first path segment. \n/track and /track/behavior are both billed as track, and /catalog/ranked,\n/catalog/audit and /catalog/verify are all billed as catalog. Your invoice shows a line\nper operation rather than one total, because /search costs real compute and /session\ncosts almost nothing.","l":"en","v":"/vi/api"},{"u":"/api","a":"the-four-products-and-the-calls-behind-them","p":"What PULSE offers","h":"The four products, and the calls behind them","t":"} title=\"Decision Audit\" href=\"/api/v1/audit\" description=\"POST /catalog/audit. Which missing field to record first, ranked, in your own catalogue.\" / \n} title=\"Decision Verification\" href=\"/api/v1/audit\" description=\"POST /catalog/verify with repairs. Recompute after the work and see what moved.\" / \n} title=\"Decision Monitor\" href=\"/api/v1/audit\" description=\"The same call without repairs. Catalogues decay; this is what notices.\" / \n} title=\"Decision API\" href=\"/api/v1\" description=\"track, session, ranked, search, rerank, suggest. The live runtime.\" / \n\nAudit, Verification and Monitor are one computation over a diff. There is no third endpoint\nfor Monitor because there is no third thing to compute: the only difference is whether anything\nwas claimed about the change.","l":"en","v":"/vi/api"},{"u":"/api","a":"what-is-not-on-this-page","p":"What PULSE offers","h":"What is not on this page","t":"There is a second, much larger API behind a JWT, not an API key: organizations, users,\nroles, API keys, catalogue management, billing and subscriptions. That is the management plane\nthe merchant portal (https://app.thepulseapi.com) is built on. It is not metered, it is not\nsold as a product, and it is not documented here yet.\n\nTreat anything undocumented as unsupported. \nRoutes exist that are not on this page. Some are internal, some are reachable only with a\nlogin, and some resolve at the gateway and are not served downstream. If it is not written\ndown here, do not build on it.","l":"en","v":"/vi/api"},{"u":"/api/v1","a":"","p":"Authentication","h":"Authentication","t":"One header, one base URL, and which credential opens what.","l":"en","v":"/vi/api/v1"},{"u":"/api/v1","a":"the-header","p":"Authentication","h":"The header","t":"Authenticate with x-api-key. Not Authorization: Bearer.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/session\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{}'"},"v":"/vi/api/v1"},{"u":"/api/v1","a":"getting-a-key","p":"Authentication","h":"Getting a key","t":"Sign in to the dashboard (https://app.thepulseapi.com), open Integration → API keys, and\ncreate one.\n\n--- --- \nFormat Always pk_live_ followed by base64url randomness \nPublishable Designed to be visible in browser code. It can send signals and read rankings, nothing else \nScoped Belongs to one organization and cannot read another's data \nShown once The full value is returned only at creation. Only the hash is stored \nRevocable Revocation is immediate \n\nThere is no test key. \nEvery issued key is pk_live_. There is no pk_test_ and no sandbox environment yet. To keep\nexperiments out of your reporting, create a separate key for development and revoke it when\nyou are done.","l":"en","v":"/vi/api/v1"},{"u":"/api/v1","a":"what-a-publishable-key-cannot-do","p":"Authentication","h":"What a publishable key cannot do","t":"Catalogue writes (/products, /categories) authenticate as a signed-in dashboard session, not\nwith a publishable key. They are not part of this reference.","l":"en","v":"/vi/api/v1"},{"u":"/api/v1/audit","a":"","p":"Audit a catalogue","h":"Audit a catalogue","t":"POST /catalog/audit and /catalog/verify, which grade catalogue data rather than rank it.\n\nThe ranking endpoints answer \"which products first\". These two answer a different question:\ncan this catalogue answer the questions shoppers are asking of it at all. \n\nBoth take a CSV as a string in the body rather than a file upload. An audit is a pure function\nover text, so multipart would add a parser, a temporary file and a cleanup path for no gain at a\nsize where a category export is tens of kilobytes.\n\nNeither call stores anything unless you ask it to.","l":"en","v":"/vi/api/v1/audit"},{"u":"/api/v1/audit","a":"post-catalogaudit","p":"Audit a catalogue","h":"`POST /catalog/audit`","t":"Why the horizon is not guessed for you. \nWithout it the response carries no action. Comparing \"ask the shopper\" against \"record the\nfact once\" needs to know how many shoppers the fact would serve, and picking a number on your\nbehalf would bury the assumption the whole comparison rests on.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/catalog/audit\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"csv\": \"id,category,size,material\\n1,helmet,L,abs\\n2,helmet,,\\n\",\n    \"source\": \"merchant\",\n    \"amortisationHorizon\": 5000\n  }'"},"v":"/vi/api/v1/audit"},{"u":"/api/v1/audit","a":"post-catalogverify","p":"Audit a catalogue","h":"`POST /catalog/verify`","t":"The same request does two jobs. Send before and after on their own and it is a monitor: what\nchanged between two exports, with nothing claimed. Add repairs and the same diff grades the\nclaims.\n\nThere is no second endpoint for monitoring. \nMonitor and verification are the same computation over the same diff. The only difference is\nwhether anything was claimed about it.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/catalog/verify\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"before\": \"id,category,size\\n1,helmet,\\n\",\n    \"after\":  \"id,category,size\\n1,helmet,L\\n\",\n    \"repairs\": [{ \"attribute\": \"size\", \"method\": \"manual\", \"actualHours\": 3 }],\n    \"category\": \"Helmets\"\n  }'"},"v":"/vi/api/v1/audit"},{"u":"/api/v1/errors","a":"","p":"Errors","h":"Errors","t":"The real response shape, and what each code means.\n\nEvery error has the same envelope.\n\ncorrelationId is the useful field. \nQuote it when you report a problem. It is how a single request is found in the logs, and it\nturns \"ranking looked wrong yesterday\" into one lookup.","l":"en","c":{"l":"json","s":"{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNAUTHORIZED\",\n    \"message\": \"Invalid or revoked API key\"\n  },\n  \"timestamp\": \"2026-10-19T08:27:01.722Z\",\n  \"path\": \"/api/v1/session\",\n  \"correlationId\": \"a4cc87c6bf160f30\"\n}"},"v":"/vi/api/v1/errors"},{"u":"/api/v1/errors","a":"codes","p":"Errors","h":"Codes","t":"Code HTTP What it usually means \n--- --- --- \nBAD_REQUEST 400 Malformed body, or an empty body with a JSON content type \nUNAUTHORIZED 401 Missing, wrong, or revoked key. Check the header is x-api-key \nFORBIDDEN 403 The key is valid but not for this organization's data \nNOT_FOUND 404 No such route. Check the /api/v1 prefix \nTOO_MANY_REQUESTS 429 Rate limited at the gateway \nSERVICE_UNAVAILABLE 503 A downstream service is failing fast behind its circuit breaker","l":"en","v":"/vi/api/v1/errors"},{"u":"/api/v1/errors","a":"two-that-are-worth-knowing-apart","p":"Errors","h":"Two that are worth knowing apart","t":"401 on every request, including ones that worked yesterday. \nA revoked or expired key returns 401 exactly like a typo. Keys can be given an expiry at\ncreation. Check the dashboard before debugging your code.\n\n404 on a path that exists in the docs. \nThe base URL includes the version: https://api.thepulseapi.com/api/v1. A request to\nthepulseapi.com/v1/... reaches the marketing site, not the API, and will not look like an\nAPI error at all.","l":"en","v":"/vi/api/v1/errors"},{"u":"/api/v1/exposure","a":"","p":"Record exposure","h":"Record exposure","t":"POST /exposure, which is what makes ranking quality measurable.\n\nRanking cannot be graded without knowing what was actually shown. A click rate over results\nnobody saw is not a measurement.","l":"en","v":"/vi/api/v1/exposure"},{"u":"/api/v1/exposure","a":"post-exposure","p":"Record exposure","h":"`POST /exposure`","t":"exposure buffers, because a product grid renders many items at once and one request per card\nwould be absurd. flushExposures sends what is pending, and the SDK also flushes on page hide.\n\nSend what rendered, not what you requested. \nIf you asked for 24 and showed 12 above the fold, the honest exposure is what the shopper could\nactually see. Over-reporting exposure makes your own ranking look worse than it is.","l":"en","c":{"l":"ts","s":"pulse.exposure(decisionId, items);   // buffered\nawait pulse.flushExposures();        // send now"},"v":"/vi/api/v1/exposure"},{"u":"/api/v1/ranking","a":"","p":"Rank products","h":"Rank products","t":"/catalog/ranked, /search, /rerank and /suggest.","l":"en","v":"/vi/api/v1/ranking"},{"u":"/api/v1/ranking","a":"post-catalogranked","p":"Rank products","h":"`POST /catalog/ranked`","t":"Ranks the catalogue already synced to PULSE.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/catalog/ranked\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"sessionId\": \"sess_abc123\",\n    \"organizationId\": \"org_abc123\",\n    \"limit\": 24\n  }'"},"v":"/vi/api/v1/ranking"},{"u":"/api/v1/ranking","a":"post-search","p":"Rank products","h":"`POST /search`","t":"Ranks products you pass in, against the session.","l":"en","c":{"l":"ts","s":"const { results } = await pulse.search(products, { limit: 24 });\n\nresults[0].scoreBreakdown; // the signals that matched, and their weights"},"v":"/vi/api/v1/ranking"},{"u":"/api/v1/ranking","a":"post-rerank","p":"Rank products","h":"`POST /rerank`","t":"Reorders an existing result set you already produced elsewhere, which is the lightest way to put\nPULSE in front of a search engine you are keeping.","l":"en","v":"/vi/api/v1/ranking"},{"u":"/api/v1/ranking","a":"post-suggest","p":"Rank products","h":"`POST /suggest`","t":"Query suggestions scored against the current session.\n\nsearch and rankedCatalog are not interchangeable. One ranks what you hand it, the other\nranks what PULSE holds. Sending a catalogue you already synced to search is a wasted payload.","l":"en","v":"/vi/api/v1/ranking"},{"u":"/api/v1/session","a":"","p":"Read the session","h":"Read the session","t":"POST /session, which returns the personas inferred so far.","l":"en","v":"/vi/api/v1/session"},{"u":"/api/v1/session","a":"post-session","p":"Read the session","h":"`POST /session`","t":"Returns whether the session was found and the personas accumulated against it. A session id that\nhas never been written returns found: false, which is the quickest way to confirm your signals\nare landing.\n\nUse this while integrating. \nIf found is false after a track call, the signals are not arriving. That is one request to\ncheck, rather than reasoning backwards from a ranking that looks slightly wrong.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/session\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{ \"sessionId\": \"sess_abc123\" }'"},"v":"/vi/api/v1/session"},{"u":"/api/v1/track","a":"","p":"Send signals","h":"Send signals","t":"POST /track, the call everything else depends on.","l":"en","v":"/vi/api/v1/track"},{"u":"/api/v1/track","a":"post-track","p":"Send signals","h":"`POST /track`","t":"With the SDK:\n\nSignals are additive. Send them as they happen rather than batching a whole session at the end:\npersona scores decay, so ordering carries meaning.\n\norganizationId is required. \nEvery endpoint below reads it from the body, not from the API key. Omitting it returns 400\nwith a validation error naming the field. The SDK sends it for you from init().\n\n/track also captures device, referrer and time from the request itself, so a call with no\nsignals at all is still worth making: it opens the session with what the request already says.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/track\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"sessionId\": \"sess_abc123\",\n    \"organizationId\": \"org_abc123\",\n    \"signals\": [\n      { \"type\": \"category_view\", \"value\": \"helmets-safety\" },\n      { \"type\": \"price_filter\", \"value\": \"500000-1500000\" }\n    ]\n  }'"},"v":"/vi/api/v1/track"},{"u":"/api/v1/track","a":"post-trackbehavior","p":"Send signals","h":"`POST /track/behavior`","t":"One behaviour, named, when you have nothing to say about a category or a price.\n\nbehavior is your own slug, capped at 128 characters. Sorting by price ascending says something\nabout a shopper that no category view does.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/track/behavior\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"sessionId\": \"sess_abc123\",\n    \"organizationId\": \"org_abc123\",\n    \"behavior\": \"sort_price_asc\",\n    \"metadata\": { \"page\": \"category\" }\n  }'"},"v":"/vi/api/v1/track"},{"u":"/api/v1/track","a":"post-trackkeywords","p":"Send signals","h":"`POST /track/keywords`","t":"A search query, turned into keyword signals for you.\n\nSend the raw query. Extraction happens server-side, and the query is capped at 512 characters\nbecause the work is linear in its length.","l":"en","c":{"l":"bash","s":"curl -X POST \"https://api.thepulseapi.com/api/v1/track/keywords\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: pk_live_...\" \\\n  -d '{\n    \"sessionId\": \"sess_abc123\",\n    \"organizationId\": \"org_abc123\",\n    \"query\": \"mu bao hiem fullface\"\n  }'"},"v":"/vi/api/v1/track"},{"u":"/api/v1/track","a":"post-event","p":"Send signals","h":"`POST /event`","t":"A named event, for things that are not persona signals.","l":"en","c":{"l":"ts","s":"await pulse.event('checkout_started', { cartValue: 1250000 });"},"v":"/vi/api/v1/track"},{"u":"/api/versioning","a":"","p":"Versioning","h":"Versioning","t":"What is versioned, what is not, and what happens when something changes.","l":"en","v":"/vi/api/versioning"},{"u":"/api/versioning","a":"the-api-is-versioned-the-guides-are-not","p":"Versioning","h":"The API is versioned. The guides are not.","t":"Versioned Why \n--- --- --- \nAPI reference Yes, /api/v1 It is a contract. A request you wrote last year has to keep working, so the page describing it has to keep existing \nGuides, concepts, frameworks No They describe behaviour, not a contract. \"How inference works\" has no v1 and v2 \nSDK reference No The SDK follows the API. Where a method needs a minimum version, the page says so inline \n\nThe version in the docs URL matches the version in the request URL:\n\nOnly v1 exists. \nThere has never been another. The path carries the version anyway, because a URL is cheap to\nchoose now and expensive to change once people have linked to it.","l":"en","c":{"l":"bash","s":"https://api.thepulseapi.com/api/v1/track   →   /api/v1/track"},"v":"/vi/api/versioning"},{"u":"/api/versioning","a":"what-counts-as-a-breaking-change","p":"Versioning","h":"What counts as a breaking change","t":"A new major version happens only when an existing, correct request would start behaving\ndifferently.\n\nBreaking: needs a new version. \n- Removing an endpoint, a field, or an accepted value\n- Renaming anything in a request or response\n- Making an optional request field required\n- Narrowing a type, for example a string that becomes an enum\n- Changing the meaning of a field while keeping its name. This is the worst one, because nothing fails loudly\n\nNot breaking: ships into the current version. \n- Adding a new endpoint\n- Adding an optional request field\n- Adding a field to a response. Parse responses permissively: unknown fields will appear\n- Adding a new value to an output enum, unless the docs say the set is closed\n- Making a validation message clearer","l":"en","v":"/vi/api/versioning"},{"u":"/api/versioning","a":"what-we-owe-you-when-a-version-changes","p":"Versioning","h":"What we owe you when a version changes","t":"1. A new path, /api/v1/v2, with v1 still published and still working \n2. A migration page naming every behavioural difference, not a summary\n3. A deprecation notice on each v1 page pointing at its v2 equivalent\n4. A stated end date for v1, not \"eventually\"","l":"en","v":"/vi/api/versioning"},{"u":"/api/versioning","a":"the-sdk-versions-separately","p":"Versioning","h":"The SDK versions separately","t":"@thepulseapi/sdk (https://www.npmjs.com/package/@thepulseapi/sdk) follows\nsemver (https://semver.org) and tracks the API rather than mirroring it.\n\nWhile the SDK is 0.x. \nPre-1.0, a minor version may contain a breaking change. That is what 0.x means in semver,\nand it is worth pinning an exact version until 1.0.\n\nThe CDN build is versioned the same way, with an immutable path per release and a floating major:","l":"en","c":{"l":"","s":"https://cdn.thepulseapi.com/sdk/v0.1.5/pulse.iife.js   exact, never changes\nhttps://cdn.thepulseapi.com/sdk/v0/pulse.iife.js       patches arrive here"},"v":"/vi/api/versioning"},{"u":"/backend","a":"","p":"Overview","h":"Overview","t":"PULSE from a server, in any language that can send JSON over HTTPS.\n\nThere is no PULSE library for your backend language, and you do not need one. Every endpoint is\nPOST, every body is JSON, and authentication is one header.\n\nThat is the whole integration surface. The guides in this section are the same three calls\nwritten idiomatically per language, so you can copy one and delete the rest.","l":"en","c":{"l":"","s":"POST https://api.thepulseapi.com/api/v1/<endpoint>\nContent-Type: application/json\nx-api-key: pk_live_..."},"v":"/vi/backend"},{"u":"/backend","a":"which-calls-belong-on-a-server","p":"Overview","h":"Which calls belong on a server","t":"Most of PULSE is designed for the browser, where the SDK already handles sessions, batching and\nexposure buffering. Reach for the HTTP API directly when the work is genuinely server-side:\n\n} title=\"Server-rendered pages\" description=\"Ranking a grid during SSR, where there is no browser yet to hold a session.\" / \n} title=\"Catalogue audits\" description=\"A scheduled job grading an export. Nothing about it belongs in a page.\" / \n} title=\"Backfills and pipelines\" description=\"Replaying events you already collected, or recording outcomes your payment webhook knows about and the browser does not.\" /","l":"en","v":"/vi/backend"},{"u":"/backend","a":"one-thing-to-get-right-first","p":"Overview","h":"One thing to get right first","t":"sessionId and organizationId are required on nearly every call, and both come from the body\nrather than from the API key. A request without them returns 400 with the field named. See\nSend signals (https://developer.thepulseapi.com/api/v1/track).\n\nA session is yours to name. It is a string you generate, up to 128 characters, and the only rule\nis that the same shopper keeps the same one. If the browser is already running the SDK, read it\nwith pulse.getSessionId() and pass it to your server rather than inventing a second session for\nthe same person.\n\nThere is one kind of key. \nKeys are pk_live_, publishable, and the same key works from a browser and from a server.\nThere is no separate secret key today, which means a key leaked from your server is no worse\nand no better than one read out of your page source. Scope and rotate accordingly.","l":"en","v":"/vi/backend"},{"u":"/backend","a":"the-languages","p":"Overview","h":"The languages","t":"} title=\"Python\" href=\"/backend/python\" description=\"requests or httpx, with Django and FastAPI notes.\" / \n} title=\"C# and.NET\" href=\"/backend/csharp\" description=\"HttpClient, typed, with the DI registration.\" / \n} title=\"Go\" href=\"/backend/go\" description=\"net/http and encoding/json. No dependencies.\" / \n} title=\"Rust\" href=\"/backend/rust\" description=\"reqwest and serde.\" / \n} title=\"Java\" href=\"/backend/java\" description=\"java.net.http, built in since 11.\" / \n} title=\"Ruby\" href=\"/backend/ruby\" description=\"net/http from the standard library.\" / \n} title=\"PHP\" href=\"/backend/php\" description=\"cURL, and Guzzle for Laravel.\" / \n} title=\"Node.js\" href=\"/backend/nodejs\" description=\"The SDK runs server-side too.\" /","l":"en","v":"/vi/backend"},{"u":"/backend/csharp","a":"","p":"C# and .NET","h":"C# and .NET","t":"A typed HttpClient, registered once, injected where it is needed.\n\nNo package to install. HttpClient and System.Text.Json are in the framework.","l":"en","v":"/vi/backend/csharp"},{"u":"/backend/csharp","a":"registration","p":"C# and .NET","h":"Registration","t":"AddHttpClient is what you want rather than new HttpClient(): it pools handlers and rotates\nthem, which is the difference between reusing connections and exhausting sockets under load.\n\nProperty names. \nSystem.Text.Json serialises anonymous object members verbatim, so sessionId stays\nsessionId. If you swap in a named class with PascalCase properties, set\nJsonNamingPolicy.CamelCase or the API will reject the body as missing its required fields.","l":"en","c":{"l":"csharp","s":"builder.Services.AddHttpClient<PulseClient>(client =>\n{\n    // The trailing slash matters. Without it, a relative path replaces the last segment\n    // and every request goes to https://api.thepulseapi.com/api/track instead.\n    client.BaseAddress = new Uri(\"https://api.thepulseapi.com/api/v1/\");\n    client.DefaultRequestHeaders.Add(\"x-api-key\", builder.Configuration[\"Pulse:ApiKey\"]);\n    client.Timeout = TimeSpan.FromSeconds(5);\n});"},"v":"/vi/backend/csharp"},{"u":"/backend/go","a":"","p":"Go","h":"Go","t":"net/http and encoding/json. Nothing to install.\n\nPass the request context. \nThreading r.Context() through means a shopper who navigates away cancels the ranking call\ninstead of leaving it running against a response nobody will read.","l":"en","c":{"l":"go","s":"package pulse\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n)\n\nconst base = \"https://api.thepulseapi.com/api/v1\"\n\ntype Signal struct {\n\tType  string `json:\"type\"`\n\tValue string `json:\"value\"`\n}\n\ntype Client struct {\n\tapiKey string\n\torgID  string\n\thttp   *http.Client\n}\n\nfunc New(apiKey, orgID string) *Client {\n\treturn &Client{\n\t\tapiKey: apiKey,\n\t\torgID:  orgID,\n\t\t// http.DefaultClient has no timeout at all, which is a goroutine leak waiting\n\t\t// for a slow upstream. Always supply one.\n\t\thttp: &http.Client{Timeout: 5 * time.Second},\n\t}\n}\n\nfunc (c *Client) post(ctx context.Context, path string, body map[string]any, out any) error {\n\t// organizationId is read from the body rather than from the key, and is required\n\t// on nearly every endpoint.\n\tbody[\"organizationId\"] = c.orgID\n\n\tpayload, err := json.Marshal(body)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treq, err := http.NewRequestWithContext(ctx, http.MethodPost, base+path, bytes.NewReader(payload))\n\tif err != nil {\n\t\treturn err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.Header.Set(\"x-api-key\", c.apiKey)\n\n\tres, err := c.http.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer res.Body.Close()\n\n\tif res.StatusCode >= 300 {\n\t\treturn fmt.Errorf(\"pulse %s: %s\", path, res.Status)\n\t}\n\treturn json.NewDecoder(res.Body).Decode(out)\n}\n\nfunc (c *Client) Track(ctx context.Context, sessionID string, signals []Signal) (map[string]any, error) {\n\tvar out map[string]any\n\terr := c.post(ctx, \"/track\", map[string]any{\"sessionId\": sessionID, \"signals\": signals}, &out)\n\treturn out, err\n}\n\nfunc (c *Client) RankedCatalog(ctx context.Context, sessionID string, limit int) (map[string]any, error) {\n\tvar out map[string]any\n\terr := c.post(ctx, \"/catalog/ranked\", map[string]any{\"sessionId\": sessionID, \"limit\": limit}, &out)\n\treturn out, err\n}"},"v":"/vi/backend/go"},{"u":"/backend/java","a":"","p":"Java","h":"Java","t":"java.net.http, in the JDK since 11. No dependencies beyond a JSON library.\n\nHttpClient is thread safe and pools connections, so build one and keep it. In Spring, that\nmeans a @Bean, not a new inside a controller.\n\nTwo timeouts, not one. \nconnectTimeout on the client and timeout on the request do different jobs. Set only the\nfirst and a server that accepts your connection and then stalls will hold the thread\nindefinitely.","l":"en","c":{"l":"java","s":"import java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\nimport java.time.Duration;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.JsonNode;\n\npublic final class PulseClient {\n    private static final String BASE = \"https://api.thepulseapi.com/api/v1\";\n\n    private final HttpClient http = HttpClient.newBuilder()\n            .connectTimeout(Duration.ofSeconds(5))\n            .build();\n    private final ObjectMapper json = new ObjectMapper();\n    private final String apiKey;\n    private final String organizationId;\n\n    public PulseClient(String apiKey, String organizationId) {\n        this.apiKey = apiKey;\n        this.organizationId = organizationId;\n    }\n\n    public JsonNode track(String sessionId, Object signals) throws Exception {\n        return post(\"/track\", Map.of(\n                \"sessionId\", sessionId,\n                \"organizationId\", organizationId,\n                \"signals\", signals));\n    }\n\n    public JsonNode rankedCatalog(String sessionId, int limit) throws Exception {\n        return post(\"/catalog/ranked\", Map.of(\n                \"sessionId\", sessionId,\n                \"organizationId\", organizationId,\n                \"limit\", limit));\n    }\n\n    private JsonNode post(String path, Map<String, Object> body) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder(URI.create(BASE + path))\n                .header(\"Content-Type\", \"application/json\")\n                .header(\"x-api-key\", apiKey)\n                // connectTimeout above only covers establishing the connection. This is the\n                // one that bounds a server which accepted the socket and then went quiet.\n                .timeout(Duration.ofSeconds(5))\n                .POST(HttpRequest.BodyPublishers.ofString(json.writeValueAsString(body)))\n                .build();\n\n        HttpResponse<String> response = http.send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() >= 300) {\n            throw new IllegalStateException(\"PULSE \" + path + \": \" + response.statusCode());\n        }\n        return json.readTree(response.body());\n    }\n}"},"v":"/vi/backend/java"},{"u":"/backend/nodejs","a":"","p":"Node.js","h":"Node.js","t":"The SDK runs on the server too, and fetch is there if you would rather not install it.\n\n@thepulseapi/sdk is isomorphic. The same package works in Node, so a server-rendered page can\nuse the client it already knows.\n\nTurn autoTrack off on a server. \nIt exists to capture device, referrer and time from the browser. On a server those describe\nyour datacentre, and sending them pollutes the session with signals about a machine nobody\nshopped from.","l":"en","c":{"l":"ts","s":"import { PulseClient } from '@thepulseapi/sdk';\n\n// One client per process. It holds no per-shopper state: the session id is passed per call.\nexport const pulse = new PulseClient();\n\npulse.init({\n  apiKey: process.env.PULSE_API_KEY!,\n  organizationId: process.env.PULSE_ORG_ID!,\n  autoTrack: false, // there is no browser here to capture a device or a referrer from\n});"},"v":"/vi/backend/nodejs"},{"u":"/backend/nodejs","a":"without-the-package","p":"Node.js","h":"Without the package","t":"Node 18 and later ship fetch, so the whole integration is one function.","l":"en","c":{"l":"ts","s":"const BASE = 'https://api.thepulseapi.com/api/v1';\n\nasync function post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n  const response = await fetch(`${BASE}${path}`, {\n    method: 'POST',\n    headers: {\n      'content-type': 'application/json',\n      'x-api-key': process.env.PULSE_API_KEY!,\n    },\n    body: JSON.stringify({ organizationId: process.env.PULSE_ORG_ID, ...body }),\n    // fetch has no default timeout, and a hung ranking call should not hold a request.\n    signal: AbortSignal.timeout(5000),\n  });\n\n  if (!response.ok) throw new Error(`PULSE ${path}: ${response.status}`);\n  return response.json() as Promise<T>;\n}\n\nexport const track = (sessionId: string, signals: unknown[]) =>\n  post('/track', { sessionId, signals });\n\nexport const rankedCatalog = (sessionId: string, limit = 24) =>\n  post('/catalog/ranked', { sessionId, limit });"},"v":"/vi/backend/nodejs"},{"u":"/backend/php","a":"","p":"PHP","h":"PHP","t":"cURL from the standard library, and Guzzle where a framework already ships it.\n\nFor the browser half of a PHP app, see the Laravel guide (https://developer.thepulseapi.com/frameworks/laravel). This page is the\nserver half: calls your PHP makes itself.","l":"en","v":"/vi/backend/php"},{"u":"/backend/php","a":"laravel","p":"PHP","h":"Laravel","t":"Guzzle is already there, wrapped as Http.\n\nKeep it out of the view. \nA ranking call inside a Blade template runs on every render with no timeout you control and no\nway to fall back. Resolve it in the controller, pass the result in, and render catalogue order\nwhen it fails.","l":"en","c":{"l":"php","s":"<?php\n\nnamespace App\\Services;\n\nuse Illuminate\\Support\\Facades\\Http;\n\nclass Pulse\n{\n    public function rankedCatalog(string $sessionId, int $limit = 24): array\n    {\n        return Http::withHeaders(['x-api-key' => config('services.pulse.key')])\n            ->timeout(5)\n            ->post('https://api.thepulseapi.com/api/v1/catalog/ranked', [\n                'sessionId' => $sessionId,\n                'organizationId' => config('services.pulse.org'),\n                'limit' => $limit,\n            ])\n            ->throw()\n            ->json();\n    }\n}"},"v":"/vi/backend/php"},{"u":"/backend/python","a":"","p":"Python","h":"Python","t":"requests or httpx, plus where the call belongs in Django and FastAPI.\n\nOr requests, if it is already in the project. Both work; httpx is here because it gives you\nthe async client FastAPI wants without a second dependency.","l":"en","v":"/vi/backend/python"},{"u":"/backend/python","a":"django","p":"Python","h":"Django","t":"Build the client once at module level, not per request. httpx.Client keeps a connection pool\nand creating one per view throws that away.","l":"en","c":{"l":"python","s":"from django.shortcuts import render\nfrom .pulse import pulse\n\n\ndef category(request, slug):\n    # The browser owns the session. Read it rather than minting a second one for the\n    # same shopper: two session ids means the inference starts from nothing twice.\n    session_id = request.COOKIES.get(\"pulse_session\")\n    products = []\n\n    if session_id:\n        try:\n            products = pulse.ranked_catalog(session_id, limit=24, categorySlug=slug)[\"items\"]\n        except Exception:\n            # Ranking is an enhancement. A page that fails to render because personalisation\n            # was slow is worse than a page in catalogue order.\n            products = []\n\n    return render(request, \"category.html\", {\"products\": products or default_order(slug)})"},"v":"/vi/backend/python"},{"u":"/backend/python","a":"fastapi","p":"Python","h":"FastAPI","t":"Use the async client, and hold it on the app so it is created once and closed on shutdown.\n\nGive it a timeout. \nNeither requests nor httpx has a default timeout in the shape most people expect. A\nranking call that hangs will hold a worker until something else gives up. Five seconds is\ngenerous; the call is usually tens of milliseconds.","l":"en","c":{"l":"python","s":"import os\nfrom contextlib import asynccontextmanager\n\nimport httpx\nfrom fastapi import FastAPI\n\nBASE = \"https://api.thepulseapi.com/api/v1\"\nORG = os.environ[\"PULSE_ORG_ID\"]\n\n\n@asynccontextmanager\nasync def lifespan(app: FastAPI):\n    app.state.pulse = httpx.AsyncClient(\n        base_url=BASE,\n        timeout=5.0,\n        headers={\"x-api-key\": os.environ[\"PULSE_API_KEY\"]},\n    )\n    yield\n    await app.state.pulse.aclose()\n\n\napp = FastAPI(lifespan=lifespan)\n\n\n@app.get(\"/ranked/{session_id}\")\nasync def ranked(session_id: str, limit: int = 24):\n    response = await app.state.pulse.post(\n        \"/catalog/ranked\",\n        json={\"sessionId\": session_id, \"organizationId\": ORG, \"limit\": limit},\n    )\n    response.raise_for_status()\n    return response.json()"},"v":"/vi/backend/python"},{"u":"/backend/ruby","a":"","p":"Ruby","h":"Ruby","t":"net/http from the standard library. Nothing to add to the Gemfile.","l":"en","c":{"l":"ruby","s":"require \"json\"\nrequire \"net/http\"\nrequire \"uri\"\n\nclass Pulse\n  BASE = URI(\"https://api.thepulseapi.com/api/v1\").freeze\n\n  def initialize(api_key:, organization_id:)\n    @api_key = api_key\n    @organization_id = organization_id\n  end\n\n  def track(session_id, signals)\n    post(\"/track\", sessionId: session_id, signals: signals)\n  end\n\n  def ranked_catalog(session_id, limit: 24)\n    post(\"/catalog/ranked\", sessionId: session_id, limit: limit)\n  end\n\n  def session(session_id)\n    post(\"/session\", sessionId: session_id)\n  end\n\n  private\n\n  def post(path, **body)\n    # organizationId is required on nearly every endpoint and is read from the body,\n    # not from the key.\n    body[:organizationId] = @organization_id\n\n    request = Net::HTTP::Post.new(BASE.path + path)\n    request[\"Content-Type\"] = \"application/json\"\n    request[\"x-api-key\"] = @api_key\n    request.body = JSON.generate(body)\n\n    response = Net::HTTP.start(\n      BASE.host, BASE.port,\n      use_ssl: true,\n      open_timeout: 5,\n      read_timeout: 5,\n    ) { |http| http.request(request) }\n\n    raise \"PULSE #{path}: #{response.code}\" unless response.is_a?(Net::HTTPSuccess)\n\n    JSON.parse(response.body)\n  end\nend"},"v":"/vi/backend/ruby"},{"u":"/backend/ruby","a":"rails","p":"Ruby","h":"Rails","t":"Both timeouts. \nopen_timeout bounds the connection and read_timeout bounds the wait for a response. Set\nonly the first and a server that accepts your connection and then stalls holds the request\nuntil something upstream gives up.","l":"en","c":{"l":"ruby","s":"PULSE = Pulse.new(\n  api_key: ENV.fetch(\"PULSE_API_KEY\"),\n  organization_id: ENV.fetch(\"PULSE_ORG_ID\"),\n)"},"v":"/vi/backend/ruby"},{"u":"/backend/rust","a":"","p":"Rust","h":"Rust","t":"reqwest and serde, with the client built once and cloned.\n\nset_sensitive on the key header. \nIt keeps the value out of Debug output for the header map, which is the kind of log line\nthat ends up in an error report without anyone deciding to put it there.","l":"en","c":{"l":"toml","s":"[dependencies]\nreqwest = { version = \"0.12\", features = [\"json\"] }\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\ntokio = { version = \"1\", features = [\"macros\", \"rt-multi-thread\"] }"},"v":"/vi/backend/rust"},{"u":"/changelog","a":"","p":"Documentation changelog","h":"Documentation changelog","t":"Every change to these pages, newest first, read from git at build time rather than written by hand.\n\nWhat changed on this site, and when. The list is read from the repository's own history when the\nsite is built, so it cannot drift from what actually happened and nobody has to remember to\nupdate it.\n\nThis is not the API changelog. \nThe API's compatibility rules, what counts as a breaking change and what we owe you when one\nhappens, are on Versioning (https://developer.thepulseapi.com/api/versioning). The API is versioned by URL and these guides\nare not, which is a deliberate choice explained there. This page is the history of the\ndocumentation itself.","l":"en"},{"u":"/changelog","a":"reading-a-pages-own-history","p":"Documentation changelog","h":"Reading a page's own history","t":"Every page carries the date it last changed at the foot of the page, beside a link to that one\nfile's full commit history. That is the quickest way to answer \"did this page say something\ndifferent last month\", which is usually the real question.\n\nThe pages are MDX files in\ncontent/docs (https://github.com/mypulseapi/handbook/tree/main/content/docs), so the history is\nordinary git: every revision, who made it, and what else changed in the same commit.","l":"en"},{"u":"/concepts/how-it-works","a":"","p":"How inference works","h":"How inference works","t":"Signals in, personas out, your catalogue ranked against them.\n\nMost search and recommendation tools answer, because answering is all they can do. They rank\nsomething for any query, including the queries your catalogue has no data to resolve.\n\nPULSE does two things those do not.\n\n} title=\"Infers in-session\" description=\"Persona accumulates from behaviour within a single visit, with no identity and no history.\" / \n} title=\"Knows when it cannot answer\" description=\"If the catalogue cannot resolve a requirement, that is a reportable fact rather than a bad ranking.\" /","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"the-loop","p":"How inference works","h":"The loop","t":"A signal arrives. A category view, a price filter, a device class. See Signals (https://developer.thepulseapi.com/concepts/signals).\n\nThe persona updates. Each signal moves a set of persona scores. Scores decay, so a session that changes direction\nis followed rather than averaged.\n\nProducts are scored against it. search ranks products you pass in. rankedCatalog ranks the catalogue already synced to PULSE.\n\nExposure is recorded. What was actually shown is what makes ranking quality measurable later. See\nexposure (https://developer.thepulseapi.com/api/v1/exposure).","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"a-signal-arrives","p":"How inference works","h":"A signal arrives","t":"A category view, a price filter, a device class. See Signals (https://developer.thepulseapi.com/concepts/signals).","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"the-persona-updates","p":"How inference works","h":"The persona updates","t":"Each signal moves a set of persona scores. Scores decay, so a session that changes direction\nis followed rather than averaged.","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"products-are-scored-against-it","p":"How inference works","h":"Products are scored against it","t":"search ranks products you pass in. rankedCatalog ranks the catalogue already synced to PULSE.","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"exposure-is-recorded","p":"How inference works","h":"Exposure is recorded","t":"What was actually shown is what makes ranking quality measurable later. See\nexposure (https://developer.thepulseapi.com/api/v1/exposure).","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/how-it-works","a":"what-it-is-not","p":"How inference works","h":"What it is not","t":"PULSE is not a PIM and it replaces nothing you already run. It reads your catalogue and ranks\nagainst it. If a field is missing everywhere, ranking cannot invent it, and saying so is the\npoint.","l":"en","v":"/vi/concepts/how-it-works"},{"u":"/concepts/sessions","a":"","p":"Sessions","h":"Sessions","t":"How long a session lives, what identifies it, and how to reset one.\n\nA session is the unit everything attaches to. It is created by init() and held in browser\nstorage.","l":"en","c":{"l":"ts","s":"pulse.getSessionId();  // 'sess_...'\npulse.resetSession();  // start clean\nawait pulse.getSession(); // current personas, server side"},"v":"/vi/concepts/sessions"},{"u":"/concepts/sessions","a":"lifetime","p":"Sessions","h":"Lifetime","t":"Default \n--- --- --- \nsessionTtlMs 30 minutes Inactivity before a new session starts","l":"en","v":"/vi/concepts/sessions"},{"u":"/concepts/sessions","a":"watching-the-persona-change","p":"Sessions","h":"Watching the persona change","t":"Useful during integration: if personas never move, the signals are not arriving, and that is\nvisible in two lines rather than in a ranking that looks vaguely wrong.","l":"en","c":{"l":"ts","s":"pulse.onPersona((update) => {\n  console.log(update.primary, update.confidence);\n});"},"v":"/vi/concepts/sessions"},{"u":"/concepts/signals","a":"","p":"Signals","h":"Signals","t":"What you send, what is captured for you, and what is deliberately not a signal.\n\nA signal is one observation about the current session. Send them with\ntrack (https://developer.thepulseapi.com/api/v1/track).","l":"en","c":{"l":"ts","s":"await pulse.track([\n  { type: 'category_view', value: 'helmets-safety' },\n  { type: 'product_view', value: 'sku-123' },\n  { type: 'price_filter', value: '500000-1500000' },\n]);"},"v":"/vi/concepts/signals"},{"u":"/concepts/signals","a":"captured-for-you","p":"Signals","h":"Captured for you","t":"init() sends these once per session, unless autoTrack: false:\n\n--- --- \nDevice Class and capability, parsed from the user agent \nReferrer Where the session came from \nTime of day Local hour bucket \n\nThey cost no network beyond the one call, and they are exported individually so a host app can\nre-assert them on a later page load:","l":"en","c":{"l":"ts","s":"import { captureDeviceSignal, captureReferrerSignal, captureTimeSignal } from '@thepulseapi/sdk';"},"v":"/vi/concepts/signals"},{"u":"/concepts/signals","a":"what-is-not-a-signal","p":"Signals","h":"What is not a signal","t":"anonymousId never reaches inference. \nanonymousId is an identity label. Nothing in the engine matches on it, so labelling a session\ncannot change what is inferred about it. That separation is deliberate: it makes it possible to\nattribute a session without contaminating the result.\n\nAge, gender, job title and income are not inputs. The engine reads behaviour. If you hold\nthose attributes, they are ground truth to grade against, not features to feed in.","l":"en","v":"/vi/concepts/signals"},{"u":"/concepts/what-the-audit-measures","a":"","p":"What the audit measures","h":"What the audit measures","t":"Why the emptiest column is usually the wrong one to fix, what a bit of decision information buys, and the three cases where the ranking is wrong.\n\nThe audit returns attributes in priority order. The order is the product, and it is not the order\nyou would get by counting blanks.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"why-not-just-fix-the-emptiest-column","p":"What the audit measures","h":"Why not just fix the emptiest column?","t":"Because emptiness and usefulness are different quantities, and on a real shelf they invert.\n\nHere are two attributes from the 216-product laptop catalogue we use for our own research:\n\nAttribute Missing on Rank by emptiness Rank by decision value \n--- --- --- --- \nProcessor 162 of 216 1st last \nScreen size 80 of 216 4th 1st \n\nProcessor is missing twice as often and almost nobody is deciding on it: it appears in 2 of the 32\nbuying requirements we tested. Screen size appears in 13. Fill processor everywhere and you have\ndone the most visible work on the dashboard and moved the fewest decisions.\n\nThis is the whole argument. \nA completeness score measures your catalogue against itself. The audit measures it against what\nshoppers are trying to decide. Those produce different work orders, and only one of them is\nranked by what it buys.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"what-is-a-bit-of-decision-information","p":"What the audit measures","h":"What is a bit of decision information?","t":"One bit is one halving of the shelf.\n\nIf a shopper faces 216 products and an attribute splits them cleanly in two, that attribute is\nworth one bit: it takes 216 to 108. Two bits takes it to 54. The audit reports what each attribute\nwould be worth if it were recorded everywhere, minus what it is worth today, and the\ndifference is what the repair buys.\n\nThis is why the number is not a percentage. A percentage tells you how full a column is. Bits tell\nyou how much closer a shopper gets to a decision when you fill it.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"where-does-the-missing-value-already-live","p":"What the audit measures","h":"Where does the missing value already live?","t":"Often in text you already own. Before recommending that anyone type anything, the audit tries to\nrecover the value from your own titles and descriptions.\n\nOn that same laptop shelf, 161 of 216 missing screen sizes were already sitting in the product\ntitles. That is a parse, not a procurement project, and it changes what the repair costs enough\nto change whether it is worth doing.\n\nThe audit reports each attribute's provenance so you can tell the two apart:\n\nWhere the fact is What the repair actually is \n--- --- \nAlready in your text Extraction. Cheap, and often same-day \nIn a supplier feed Mapping. A ticket, not a project \nNowhere Acquisition. Someone has to go and find it","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"when-is-the-ranking-wrong","p":"What the audit measures","h":"When is the ranking wrong?","t":"Three cases, and we would rather you heard them from us.\n\nThe recorded values are not representative. Simulating a complete catalogue can only draw on values your shelf already holds. If an attribute\nis recorded on twenty products and those twenty are not typical of the range, the simulation is\nwrong in a way we can name and cannot yet correct.\n\nThe requirements are not yours. The buying requirements we test against are typed from public category guides and filter rails. If\nyour shoppers want something those do not cover, the ranking will not know. Sending us your own\nsearch and filter logs is what fixes this, and it is the single highest-value thing you can add.\n\nThe fact exists only in a photograph. A dietary claim printed on a pack, a material visible in an image. We can tell you the attribute\nis missing from your fields. We cannot yet read it out of your imagery, and we will say so on the\nrow rather than quietly scoring it as absent.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"the-recorded-values-are-not-representative","p":"What the audit measures","h":"The recorded values are not representative","t":"Simulating a complete catalogue can only draw on values your shelf already holds. If an attribute\nis recorded on twenty products and those twenty are not typical of the range, the simulation is\nwrong in a way we can name and cannot yet correct.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"the-requirements-are-not-yours","p":"What the audit measures","h":"The requirements are not yours","t":"The buying requirements we test against are typed from public category guides and filter rails. If\nyour shoppers want something those do not cover, the ranking will not know. Sending us your own\nsearch and filter logs is what fixes this, and it is the single highest-value thing you can add.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"the-fact-exists-only-in-a-photograph","p":"What the audit measures","h":"The fact exists only in a photograph","t":"A dietary claim printed on a pack, a material visible in an image. We can tell you the attribute\nis missing from your fields. We cannot yet read it out of your imagery, and we will say so on the\nrow rather than quietly scoring it as absent.","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/concepts/what-the-audit-measures","a":"what-happens-next","p":"What the audit measures","h":"What happens next?","t":"} title=\"Run it\" href=\"/api/v1/audit\" description=\"POST /catalog/audit and /catalog/verify, with the request and response shapes.\" / \n} title=\"The runtime\" href=\"/concepts/how-it-works\" description=\"The other half: ranking a live session once the catalogue can support it.\" /","l":"en","v":"/vi/concepts/what-the-audit-measures"},{"u":"/frameworks","a":"","p":"Overview","h":"Overview","t":"One core, no framework coupling. Three need an adapter pattern, three need nothing.\n\nThe client is plain TypeScript with no runtime dependencies and no framework coupling. Every\nbrowser API it touches sits behind a typeof guard, so importing it during server rendering is\nsafe. Only init() needs a browser.\n\n} title=\"React and Next.js\" href=\"/frameworks/react\" description=\"Provider and hooks. SSR-safe.\" / \n} title=\"Vue and Nuxt\" href=\"/frameworks/vue\" description=\"Plugin and provide/inject.\" / \n} title=\"Angular\" href=\"/frameworks/angular\" description=\"An injectable service.\" / \n} title=\"Astro\" href=\"/frameworks/astro\" description=\"Islands or a script tag.\" / \n} title=\"Alpine\" href=\"/frameworks/alpine\" description=\"The global, straight from HTML.\" / \n} title=\"Laravel\" href=\"/frameworks/laravel\" description=\"Blade partial, keys stay server-side.\" / \n\nAstro, Alpine and Laravel need no adapter at all. Astro ships whichever island framework you\nalready use, and the other two are a script tag.","l":"en","v":"/vi/frameworks"},{"u":"/frameworks/alpine","a":"","p":"Alpine","h":"Alpine","t":"No build step. The global, used straight from HTML attributes.\n\nAlpine is attribute-driven, so the script-tag build is the natural fit. No bundler, no install.\n\nThe global Pulse is the client, so call it directly from Alpine:\n\nThere is no default export on the global. Pulse.init resolves; Pulse.default.init does not.","l":"en","c":{"l":"html","s":"<script src=\"https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js\"></script>\n<script>\n  Pulse.init({ apiKey: 'pk_live_...', organizationId: 'org_...' });\n</script>"},"v":"/vi/frameworks/alpine"},{"u":"/frameworks/angular","a":"","p":"Angular","h":"Angular","t":"An injectable service, initialised once the browser is running.\n\nInitialise from APP_INITIALIZER, or from the first component that runs in the browser:","l":"en","c":{"l":"ts","s":"import { Injectable } from '@angular/core';\nimport { PulseClient } from '@thepulseapi/sdk';\n\n@Injectable({ providedIn: 'root' })\nexport class PulseService extends PulseClient {}"},"v":"/vi/frameworks/angular"},{"u":"/frameworks/astro","a":"","p":"Astro","h":"Astro","t":"Islands use the React or Vue guide. A plain page is one script tag.\n\nAstro ships whichever island framework you already use, so for islands follow\nReact (https://developer.thepulseapi.com/frameworks/react) or Vue (https://developer.thepulseapi.com/frameworks/vue).\n\nFor a plain Astro page, this is the whole integration:\n\nOr skip the install entirely and use the CDN build:","l":"en","c":{"l":"astro","s":"<script>\n  import { PulseClient } from '@thepulseapi/sdk';\n\n  const pulse = new PulseClient();\n  pulse.init({\n    apiKey: import.meta.env.PUBLIC_PULSE_API_KEY,\n    organizationId: import.meta.env.PUBLIC_PULSE_ORG_ID,\n  });\n</script>"},"v":"/vi/frameworks/astro"},{"u":"/frameworks/laravel","a":"","p":"Laravel","h":"Laravel","t":"A Blade partial for the browser half. Secrets stay on the server.\n\nLaravel renders on the server, so the browser half is a script tag, usually in a layout.\n\nWhich key goes in the page. \nThe publishable pk_live_ key is designed to be visible in browser code. Anything that\nadministers your account is not. Use @json() rather than string interpolation so a value\ncontaining a quote cannot break out of the script.","l":"en","c":{"l":"php","s":"'pulse' => [\n    'key' => env('PULSE_PUBLISHABLE_KEY'),\n    'org' => env('PULSE_ORGANIZATION_ID'),\n],"},"v":"/vi/frameworks/laravel"},{"u":"/frameworks/laravel","a":"calling-from-php","p":"Laravel","h":"Calling from PHP","t":"To talk to PULSE from PHP rather than the browser, use the REST API (https://developer.thepulseapi.com/api/v1) directly. There\nis no PHP package yet.","l":"en","v":"/vi/frameworks/laravel"},{"u":"/frameworks/react","a":"","p":"React and Next.js","h":"React and Next.js","t":"Create the client once, share it, and keep init() in the browser.","l":"en","v":"/vi/frameworks/react"},{"u":"/frameworks/react","a":"a-provider","p":"React and Next.js","h":"A provider","t":"Next.js specifics. \nThe component that calls init() must be a client component, because the session lives in\nthe browser. Server Components and SSR are otherwise fine: the import is side-effect free and\nevery browser API is guarded.","l":"en","c":{"l":"tsx","s":"'use client';\nimport { createContext, useContext, useRef } from 'react';\nimport { PulseClient } from '@thepulseapi/sdk';\n\nconst PulseContext = createContext<PulseClient | null>(null);\nexport const usePulse = () => useContext(PulseContext)!;\n\nexport function PulseProvider({ children }: { children: React.ReactNode }) {\n  const pulse = useRef<PulseClient>(null);\n  pulse.current ??= new PulseClient();\n\n  useEffect(() => {\n    pulse.current!.init({\n      apiKey: process.env.NEXT_PUBLIC_PULSE_API_KEY!,\n      organizationId: process.env.NEXT_PUBLIC_PULSE_ORG_ID!,\n    });\n  }, []);\n\n  return <PulseContext.Provider value={pulse.current}>{children}</PulseContext.Provider>;\n}"},"v":"/vi/frameworks/react"},{"u":"/frameworks/vue","a":"","p":"Vue and Nuxt","h":"Vue and Nuxt","t":"A plugin, provided to the app, guarded against SSR.","l":"en","c":{"l":"ts","s":"import { PulseClient } from '@thepulseapi/sdk';\nimport type { App } from 'vue';\n\nexport default {\n  install(app: App) {\n    const pulse = new PulseClient();\n\n    // Nuxt renders on the server first; init() is browser-only.\n    if (!import.meta.env.SSR) {\n      pulse.init({ apiKey: 'pk_live_...', organizationId: 'org_...' });\n    }\n\n    app.provide('pulse', pulse);\n  },\n};"},"v":"/vi/frameworks/vue"},{"u":"/going-live","a":"","p":"Going live","h":"Going live","t":"What to check before you ship PULSE, what to watch in the first week, and the claims we will not make for you.\n\nYou have run an audit, repaired something, and possibly wired up the runtime. This page is the\nend of the path: what to check before it goes in front of shoppers, and what to expect\nafterwards.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"what-should-i-check-before-shipping","p":"Going live","h":"What should I check before shipping?","t":"Keys are the right kind. A publishable key (pk_live_...) is designed to be visible in page source. A secret key is not,\nand belongs only in a server guide. If a secret key reached a theme file or a client bundle,\nrevoke it now rather than after the deploy.\n\nA held-back group exists. Decide what fraction of traffic never sees PULSE ranking, and keep it. Without a control arm you\ncannot tell a good quarter from a good ranker, and you will not be able to answer the first\nquestion your finance team asks.\n\nYour own order is the fallback. If the engine is slow or unavailable, the page should render your existing order rather than an\nempty shelf. Check it by pointing endpoint at a port nothing is listening on and loading the\npage.\n\n`init()` failure is visible to you. init() sends the automatic signals exactly once and swallows its own error. A session whose\ninit() failed stays thin for its whole life, and nothing in the page tells you. Log the\nfailure, or call\ncaptureAutoSignals() (https://developer.thepulseapi.com/sdk#beyond-the-client) again on a later page load.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"what-should-i-check-before-shipping","p":"Going live","h":"What should I check before shipping?","t":"Exposure is recorded. If you rank, call exposure() with what was actually rendered. A ranking you cannot tie to what\nthe shopper saw cannot be evaluated later, and the buffered call costs almost nothing.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"keys-are-the-right-kind","p":"Going live","h":"Keys are the right kind","t":"A publishable key (pk_live_...) is designed to be visible in page source. A secret key is not,\nand belongs only in a server guide. If a secret key reached a theme file or a client bundle,\nrevoke it now rather than after the deploy.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"a-held-back-group-exists","p":"Going live","h":"A held-back group exists","t":"Decide what fraction of traffic never sees PULSE ranking, and keep it. Without a control arm you\ncannot tell a good quarter from a good ranker, and you will not be able to answer the first\nquestion your finance team asks.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"your-own-order-is-the-fallback","p":"Going live","h":"Your own order is the fallback","t":"If the engine is slow or unavailable, the page should render your existing order rather than an\nempty shelf. Check it by pointing endpoint at a port nothing is listening on and loading the\npage.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"init-failure-is-visible-to-you","p":"Going live","h":"`init()` failure is visible to you","t":"init() sends the automatic signals exactly once and swallows its own error. A session whose\ninit() failed stays thin for its whole life, and nothing in the page tells you. Log the\nfailure, or call\ncaptureAutoSignals() (https://developer.thepulseapi.com/sdk#beyond-the-client) again on a later page load.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"exposure-is-recorded","p":"Going live","h":"Exposure is recorded","t":"If you rank, call exposure() with what was actually rendered. A ranking you cannot tie to what\nthe shopper saw cannot be evaluated later, and the buffered call costs almost nothing.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"what-should-i-watch-in-the-first-week","p":"Going live","h":"What should I watch in the first week?","t":"Watch Why it matters \n--- --- \nSessions with zero signals Almost always init() failing silently, or a key scoped to the wrong origin \nAbstention rate The engine declining to rank is working as designed. A sudden move in it usually means the catalogue changed, not the engine \nAudit readiness, re-run Catalogues decay. New products arrive unrecorded, and a shelf that scored well last quarter quietly stops \nFallback rate How often your own order was served instead. Should be near zero and is not always","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"what-will-you-not-claim-for-me","p":"Going live","h":"What will you not claim for me?","t":"Worth reading before you repeat anything from this site internally.\n\nNo uplift number. \nWe have run no live revenue experiment. We will not quote a conversion lift, a return-rate\nreduction or an ROI multiple, and any figure you see elsewhere attached to those words did not\ncome from us.\n\nWhat we can show is a property of your catalogue: which requirements it can and cannot resolve,\nbefore and after a repair. That is measured, it is reproducible, and it is not the same thing as\na sale.\n\nThree more limits, stated plainly:\n\n- A fact that exists only inside a photograph is one we can tell you is missing and cannot yet\nrecover for you. Extracting attributes from product imagery is research we are doing, not a\nfeature we ship.\n- Our simulation of a complete catalogue can only use values your shelf already records. \nWhere an attribute's recorded values do not represent its true range, the simulation is wrong\nin a way we can name and cannot yet correct.\n- We have no customers to name. When that changes we will say so with their permission.","l":"en","v":"/vi/going-live"},{"u":"/going-live","a":"where-does-this-go-next","p":"Going live","h":"Where does this go next?","t":"} title=\"API reference\" href=\"/api/v1\" description=\"Every endpoint a publishable key can call, with the error shapes.\" / \n} title=\"SDK reference\" href=\"/sdk\" description=\"Every method on the client, and the functions beside it.\" / \n} title=\"How inference works\" href=\"/concepts/how-it-works\" description=\"What the engine measures, and when it is wrong.\" /","l":"en","v":"/vi/going-live"},{"u":"/mcp","a":"","p":"MCP for agents","h":"MCP for agents","t":"Connect the PULSE documentation to Claude, Cursor or any MCP client, so an agent can search and read every page instead of guessing.\n\nEvery page on this site is available to an agent over the Model Context Protocol. An assistant\nwith this connected searches the documentation and quotes it, instead of recalling an endpoint\nthat may not exist.","l":"en"},{"u":"/mcp","a":"how-do-i-connect-it","p":"MCP for agents","h":"How do I connect it?","t":"Or point your client at it directly, with no install:\n\nThe same block works in Claude Code (.mcp.json), Cursor and anything else that speaks MCP over\nstdio.\n\nIt runs on your machine, not ours. \nThis site is a static export, so there is no server here to host an HTTP endpoint on. The\npackage runs wherever your agent runs and fetches the published documentation index, which\nmeans nothing about your prompts or your code reaches us.","l":"en","c":{"l":"json","s":"{\n  \"mcpServers\": {\n    \"pulse-docs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@thepulseapi/docs-mcp\"]\n    }\n  }\n}"}},{"u":"/mcp","a":"what-tools-does-it-expose","p":"MCP for agents","h":"What tools does it expose?","t":"Tool What it does \n--- --- \nsearch_docs Full-text search across every page. Returns the matching section, its URL and a score \nget_page One page as Markdown, by path, such as /quickstart or /api/v1/audit \nlist_pages Every page with its title, for orienting before a search \n\nAll three take a lang of en or vi.","l":"en"},{"u":"/mcp","a":"why-is-the-search-lexical-rather-than-semantic","p":"MCP for agents","h":"Why is the search lexical rather than semantic?","t":"The website embeds your question with a model it has already downloaded. Making an agent download\none to ask a question is a poor trade, because the agent is itself a language model: it can read\nthree candidate sections and decide which is right far better than a cosine can.\n\nIt also matters that an agent asking about /catalog/audit wants the page containing that exact\nstring, and lexical scoring is precise about that where an embedding blurs it.","l":"en"},{"u":"/mcp","a":"what-if-i-want-it-pointed-somewhere-else","p":"MCP for agents","h":"What if I want it pointed somewhere else?","t":"Set PULSE_DOCS_ORIGIN to serve from a different origin, which is mostly useful when you are\nworking on the documentation itself:","l":"en","c":{"l":"bash","s":"PULSE_DOCS_ORIGIN=http://localhost:3000 npx @thepulseapi/docs-mcp"}},{"u":"/mcp","a":"can-i-just-read-the-markdown","p":"MCP for agents","h":"Can I just read the Markdown?","t":"Yes, and you do not need MCP for it.\n\n--- --- \n/llms.txt (https://developer.thepulseapi.com/llms.txt) Every page, titled and linked, in one file \n/llms-full.txt (https://developer.thepulseapi.com/llms-full.txt) The whole documentation as one Markdown document \n/llms.mdx/docs/<path /content.md Any single page as Markdown \n/search-index.json (https://developer.thepulseapi.com/search-index.json) The chunked corpus with its embeddings \n\nEach page also carries a Copy Markdown button, which is the fastest route when you just want\nto paste one page into a conversation.","l":"en"},{"u":"/platforms","a":"","p":"Overview","h":"Overview","t":"What works on a hosted storefront today, and what is still a script tag rather than an app.\n\nThere is no PULSE app or plugin yet. \nNot in the Shopify App Store, not on the WordPress plugin directory, not in the Magento\nMarketplace. Anyone telling you otherwise is describing a plan. What exists today is the\nscript tag, and it works on all three.\n\nThat is less of a limitation than it sounds. PULSE needs three things from a storefront: the\nscript, an init call with your keys, and signals describing what the shopper is looking at.\nEvery platform here can supply all three from its own theme templates, which is also the only\nplace that knows what page the shopper is on.\n\n} title=\"Shopify\" href=\"/platforms/shopify\" description=\"theme.liquid, with signals from Liquid objects.\" / \n} title=\"WordPress and WooCommerce\" href=\"/platforms/wordpress\" description=\"wp_enqueue_script, with signals from the WooCommerce conditionals.\" / \n} title=\"Magento 2\" href=\"/platforms/magento\" description=\"Layout XML and a template block.\" /","l":"en","v":"/vi/platforms"},{"u":"/platforms","a":"what-an-app-would-add","p":"Overview","h":"What an app would add","t":"Worth being precise about what you give up by pasting a script instead:\n\nScript tag, today An app or plugin \n--- --- --- \nInstall Paste into a theme file One click, no theme edit \nKeys Typed into the theme Entered in an admin screen \nSurvives a theme change No Yes \nCatalogue sync You send products per request Pushed and kept current \nSignals You write them per template Mapped for you \n\nThe first four rows are convenience. The fifth is where the difference actually lives, and it is\nalso why a plugin is not just packaging: a good one knows what a \"collection page\" means on that\nplatform and sends the right signal without being told.","l":"en","v":"/vi/platforms"},{"u":"/platforms","a":"other-platforms","p":"Overview","h":"Other platforms","t":"Anything that lets you add a script to a page can run the browser SDK, and anything that can\nmake an HTTPS request can call the API directly. If your platform is not listed, the\nAlpine guide (https://developer.thepulseapi.com/frameworks/alpine) is the closest shape: a script tag and HTML attributes, no\nbuild step. For server-side work, see Backend (https://developer.thepulseapi.com/backend).","l":"en","v":"/vi/platforms"},{"u":"/platforms/magento","a":"","p":"Magento 2","h":"Magento 2","t":"Layout XML and a template block, which is how Magento adds a script.\n\nNot on the Marketplace. \nNo PULSE extension exists. This is a small module you add yourself, in the shape Magento\nexpects.\n\nMagento does not take a pasted script tag. Markup belongs to a template, templates are attached\nby layout XML, and both live in a module. That is three files before anything runs, which is the\nplatform rather than PULSE.","l":"en","v":"/vi/platforms/magento"},{"u":"/platforms/magento","a":"loading-the-sdk","p":"Magento 2","h":"Loading the SDK","t":"default.xml applies to every page, which is what you want for init.\n\nsrc_type=\"url\" is load bearing. Without it Magento treats the path as a local static asset and\ntries to resolve it inside pub/static, where it does not exist.","l":"en","c":{"l":"xml","s":"<?xml version=\"1.0\"?>\n<page xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      layout=\"1column\"\n      xsi:noNamespaceSchemaLocation=\"urn:magento:framework:View/Layout/etc/page_configuration.xsd\">\n    <head>\n        <script src=\"https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js\" src_type=\"url\" async=\"true\"/>\n    </head>\n    <body>\n        <referenceContainer name=\"before.body.end\">\n            <block class=\"Magento\\Framework\\View\\Element\\Template\"\n                   name=\"pulse.init\"\n                   template=\"Pulse_Tracking::init.phtml\"/>\n        </referenceContainer>\n    </body>\n</page>"},"v":"/vi/platforms/magento"},{"u":"/platforms/magento","a":"page-signals","p":"Magento 2","h":"Page signals","t":"Category and product pages each get their own layout handle, so each can attach its own block\nwithout any conditional logic.\n\nThe equivalent file for products is catalog_product_view.xml. Each template sends one track\ncall built from the registry object its block resolves.\n\nKeys belong in system configuration. \nHard-coding them in a template means a deployment to change a key. A system.xml field read\nthrough ScopeConfigInterface puts them in the admin, which is also where a store operator\nexpects to find them.","l":"en","c":{"l":"xml","s":"<?xml version=\"1.0\"?>\n<page xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      xsi:noNamespaceSchemaLocation=\"urn:magento:framework:View/Layout/etc/page_configuration.xsd\">\n    <body>\n        <referenceContainer name=\"before.body.end\">\n            <block class=\"Pulse\\Tracking\\Block\\Category\"\n                   name=\"pulse.category\"\n                   template=\"Pulse_Tracking::category.phtml\"/>\n        </referenceContainer>\n    </body>\n</page>"},"v":"/vi/platforms/magento"},{"u":"/platforms/shopify","a":"","p":"Shopify","h":"Shopify","t":"One script tag in theme.liquid, and signals built from Liquid objects.\n\nNot an App Store app. \nThis is a theme edit. It does not survive switching themes, and it puts your keys in a theme\nfile that anyone with theme access can read. Publishable keys are designed to be visible in\npage source, so that is a housekeeping problem rather than a security one.","l":"en","v":"/vi/platforms/shopify"},{"u":"/platforms/shopify","a":"1-add-the-script","p":"Shopify","h":"1. Add the script","t":"Online Store → Themes → Edit code → layout/theme.liquid, just before </head:\n\nThe script tag exposes the client as the global Pulse. async means it may not have loaded\nwhen inline script runs, which is why init goes inside a load listener rather than being\ncalled immediately.","l":"en","c":{"l":"liquid","s":"<script src=\"https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js\" async></script>\n<script>\n  window.addEventListener('load', function () {\n    Pulse.init({\n      apiKey: 'pk_live_...',\n      organizationId: 'org_...',\n    });\n  });\n</script>"},"v":"/vi/platforms/shopify"},{"u":"/platforms/shopify","a":"2-send-signals-from-the-templates","p":"Shopify","h":"2. Send signals from the templates","t":"Liquid already knows what the shopper is looking at. Each template sends what it knows.\n\nUse the json filter, not quotes. \n{{ product.vendor json }} escapes the value properly. Wrapping it in your own quotes breaks\non the first vendor with an apostrophe in the name, and does it only for that vendor, which is\nthe kind of bug that reaches production.","l":"en","c":{"l":"liquid","s":"<script>\n  window.addEventListener('load', function () {\n    Pulse.track([\n      { type: 'category_view', value: {{ collection.handle | json }} }\n    ]);\n  });\n</script>"},"v":"/vi/platforms/shopify"},{"u":"/platforms/shopify","a":"3-record-outcomes","p":"Shopify","h":"3. Record outcomes","t":"Shopify fires its own events. Forward the ones that mean something.\n\nThe event name varies by theme: Dawn and its descendants publish cart:item-added, older themes\npublish their own. Check what your theme dispatches before trusting this one.","l":"en","c":{"l":"liquid","s":"<script>\n  document.addEventListener('cart:item-added', function (event) {\n    Pulse.event('add_to_cart', { productId: event.detail?.id });\n  });\n</script>"},"v":"/vi/platforms/shopify"},{"u":"/platforms/shopify","a":"what-is-not-covered","p":"Shopify","h":"What is not covered","t":"Checkout. Shopify does not let a theme script run on checkout pages outside Plus, so purchase\noutcomes have to come from your server via a webhook, not from the browser. See\nBackend (https://developer.thepulseapi.com/backend) for the call to make when the webhook arrives.","l":"en","v":"/vi/platforms/shopify"},{"u":"/platforms/wordpress","a":"","p":"WordPress and WooCommerce","h":"WordPress and WooCommerce","t":"wp_enqueue_script in a small plugin, with signals from the WooCommerce conditionals.\n\nNot on the plugin directory. \nThere is no PULSE plugin to install. What follows is a short one you write yourself, which is\nperhaps twenty lines and does not need to be anything more.","l":"en","v":"/vi/platforms/wordpress"},{"u":"/platforms/wordpress","a":"write-it-as-a-plugin-not-a-theme-edit","p":"WordPress and WooCommerce","h":"Write it as a plugin, not a theme edit","t":"Put it in wp-content/plugins/pulse-tracking/pulse-tracking.php. A theme edit disappears the\nnext time the theme updates; a plugin does not, and a child theme is more work than this.\n\nKeys go in wp-config.php, not in the plugin file:","l":"en","c":{"l":"php","s":"<?php\n/**\n * Plugin Name: PULSE tracking\n * Description: Loads the PULSE SDK and sends signals from WooCommerce templates.\n * Version: 1.0.0\n */\n\ndefined('ABSPATH') || exit;\n\nadd_action('wp_enqueue_scripts', function () {\n    wp_enqueue_script(\n        'pulse-sdk',\n        'https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js',\n        [],\n        null,   // the CDN path is already versioned; a ?ver= query would only break caching\n        true    // in the footer, so it never blocks the first paint\n    );\n\n    // wp_add_inline_script with 'after' guarantees this runs once the SDK has loaded,\n    // which is what makes the global `Pulse` safe to touch here.\n    wp_add_inline_script('pulse-sdk', sprintf(\n        'Pulse.init({ apiKey: %s, organizationId: %s });',\n        wp_json_encode(PULSE_API_KEY),\n        wp_json_encode(PULSE_ORG_ID)\n    ), 'after');\n\n    $signals = pulse_signals_for_current_page();\n    if ($signals) {\n        wp_add_inline_script('pulse-sdk', 'Pulse.track(' . wp_json_encode($signals) . ');', 'after');\n    }\n});"},"v":"/vi/platforms/wordpress"},{"u":"/platforms/wordpress","a":"the-signals","p":"WordPress and WooCommerce","h":"The signals","t":"WooCommerce already answers \"what is this page\" through its conditional tags. The whole mapping\nis one function.\n\nwp_json_encode, every time. \nIt is WordPress's json_encode with the flags already set for embedding in HTML. Building the\nJavaScript by string concatenation breaks on the first product category with a quote in its\nname, and only for that category.","l":"en","c":{"l":"php","s":"function pulse_signals_for_current_page(): array\n{\n    if (!function_exists('is_product')) {\n        return [];   // WooCommerce is not active; nothing here applies\n    }\n\n    if (is_product()) {\n        $product = wc_get_product(get_the_ID());\n        if (!$product) {\n            return [];\n        }\n\n        $terms = get_the_terms($product->get_id(), 'product_cat');\n        $signals = [['type' => 'product_view', 'value' => (string) $product->get_id()]];\n\n        if (is_array($terms) && $terms) {\n            $signals[] = ['type' => 'category_view', 'value' => $terms[0]->slug];\n        }\n\n        return $signals;\n    }\n\n    if (is_product_category()) {\n        $term = get_queried_object();\n        return [['type' => 'category_view', 'value' => $term->slug]];\n    }\n\n    if (is_search()) {\n        return [['type' => 'search', 'value' => get_search_query()]];\n    }\n\n    return [];\n}"},"v":"/vi/platforms/wordpress"},{"u":"/platforms/wordpress","a":"outcomes","p":"WordPress and WooCommerce","h":"Outcomes","t":"For a purchase, woocommerce_thankyou runs on the order received page and has the order, which\nis the right place to record revenue. Orders that complete off-site need the\nserver-side call (https://developer.thepulseapi.com/backend/php) instead.","l":"en","c":{"l":"php","s":"add_action('woocommerce_add_to_cart', function ($cart_item_key, $product_id) {\n    // Fires server-side, so this records the outcome where it actually happened\n    // rather than guessing from a click in the page.\n    wp_add_inline_script('pulse-sdk', sprintf(\n        'Pulse.event(\"add_to_cart\", { productId: %s });',\n        wp_json_encode((string) $product_id)\n    ), 'after');\n}, 10, 2);"},"v":"/vi/platforms/wordpress"},{"u":"/quickstart","a":"","p":"Quick start","h":"Quick start","t":"From nothing to a ranked catalogue in about ten lines.","l":"en","v":"/vi/quickstart"},{"u":"/quickstart","a":"get-your-keys","p":"Quick start","h":"Get your keys","t":"Sign in to the dashboard (https://app.thepulseapi.com) and open Integration → API keys.\nCreate a key, name it for where it will run, and copy it immediately.\n\nShown once. \nThe full key is returned only at creation. Only its hash is stored. If you lose it, revoke it\nand create another.\n\nYour organization id is on the same page. You need both.","l":"en","v":"/vi/quickstart"},{"u":"/quickstart","a":"start-a-session","p":"Quick start","h":"Start a session","t":"init() also captures device, referrer and time of day once per session, unless you pass\nautoTrack: false.","l":"en","c":{"l":"ts","s":"import { PulseClient } from '@thepulseapi/sdk';\n\nexport const pulse = new PulseClient();\n\nawait pulse.init({\n  apiKey: 'pk_live_...',\n  organizationId: 'org_...',\n});"},"v":"/vi/quickstart"},{"u":"/quickstart","a":"rank-your-catalogue","p":"Quick start","h":"Rank your catalogue","t":"Every result carries the signals that matched it, so you can show a shopper why, or show\nyourself why when it looks wrong.","l":"en","c":{"l":"ts","s":"const { results } = await pulse.search(products);\n\nresults[0].scoreBreakdown; // why this one came first"},"v":"/vi/quickstart"},{"u":"/sdk","a":"","p":"SDK reference","h":"SDK reference","t":"Every method on PulseClient, the config it takes, and the functions the package exports beside it.","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"session","p":"SDK reference","h":"Session","t":"Method Returns \n--- --- --- \ninit(config) TrackResponse \\ null Start a session and send the automatic signals once \ngetSession() SessionResponse Current session and inferred personas \ngetSessionId() string The current session id \nresetSession() void Clear it and start fresh \nonPersona(cb) void Subscribe to persona updates","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"signals-and-ranking","p":"SDK reference","h":"Signals and ranking","t":"Method Returns \n--- --- --- \ntrack(signals) TrackResponse Send shopper signals \nsearch(products, options?) SearchResponse Rank products you pass in \nrankedCatalog(options?) RankedCatalogResponse Rank the catalogue already synced to PULSE \nevent(type, data?) EventResponse Record a named event \n\nsearch and rankedCatalog are not interchangeable. search ranks what you hand it;\nrankedCatalog ranks what PULSE already holds.","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"exposure","p":"SDK reference","h":"Exposure","t":"Method \n--- --- --- \nexposure(decisionId, items) void Record what was actually rendered, buffered \nflushExposures() Promise<void Send buffered exposures now","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"beyond-the-client","p":"SDK reference","h":"Beyond the client","t":"PulseClient is most of the package and not all of it. These are exported too, for the cases\nwhere you need a signal without a client, or need to look at what the SDK cached.","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"signal-capture","p":"SDK reference","h":"Signal capture","t":"init() calls captureAutoSignals() for you when autoTrack is on, so you only need these\ndirectly when you want a signal at a different moment, or want one the automatic set leaves out.\n\nExport Returns \n--- --- --- \ncaptureAutoSignals() Signal[] Device, referrer and time in one call. What init() sends \ncaptureDeviceSignal() Signal \\ null Device class from the user agent \ncaptureReferrerSignal() Signal \\ null Where the visit came from \ncaptureTimeSignal() Signal Time of day. Never null, there is always a clock \ncaptureEnhancedReferrerSignals() Signal[] Campaign and channel detail beyond the plain referrer \ncaptureDeviceInfoAsync(): Promise DeviceInfo Fuller device detail, including client hints \ncaptureGeoInfo(): Promise GeoInfo \\ null Coarse location from the IP \ngeoToSignals(geo) Signal[] Turn a GeoInfo into signals \ncaptureWeatherInfo(lat, lon, apiKey?): Promise WeatherInfo \\ null Conditions at a point \nweatherToSignals(weather) Signal[] Turn a WeatherInfo into signals \ncaptureCulturalCalendar(countryCode) Signal[] Seasonal and cultural events active today \nparseUserAgent(ua) DeviceInfo Parse a user agent string you already have","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"signal-capture","p":"SDK reference","h":"Signal capture","t":"captureWeatherInfo needs your own key. \nIt calls OpenWeatherMap and returns null without an apiKey, so nothing breaks if you leave\nit out. The free tier is 1,000 calls a day, which is why the result is cached per session\nrather than fetched per page.\n\ncaptureAutoSignals() is exported for one specific failure. init() sends the automatic\nsignals exactly once and swallows its own error, so a session whose init() failed never\nre-sends them and stays thin for its whole life. These signals cost no network of their own, so\ncalling this again on a later page load is cheaper than the alternative.","l":"en","v":"/vi/sdk"},{"u":"/sdk","a":"session-context","p":"SDK reference","h":"Session context","t":"Device, location and weather are properties of the session rather than of the page: they cannot\nchange between one page and the next. The SDK captures them once, keys the cache by session id so\nit cannot outlive the visitor it describes, and reuses it. You rarely need to touch this.\n\nExport Returns \n--- --- --- \nreadSessionContext(sessionId) SessionContext \\ null The cache, or null if it belongs to another session \nwriteSessionContext(sessionId, patch) void Merge fields into it \nisWeatherFresh(ctx, now?) boolean Whether the weather reading is still inside its TTL \nclearSessionContext() void Drop the cache \nWEATHER_TTL_MS number 10 minutes \n\nWeather is the only field here with a TTL. Everything else is immutable for the session, but a\n30-minute session can outlast a rain shower, and a weather:rain signal driving a\nrecommendation after the sun came out is the engine being confidently wrong.","l":"en","v":"/vi/sdk"},{"u":"/vi","a":"","p":"Giới thiệu","h":"Giới thiệu","t":"PULSE đo xem dữ liệu sản phẩm của bạn có trả lời được điều người mua đang hỏi hay không, xếp hạng những chỗ đáng sửa, và chứng minh bản sửa có tác dụng.\n\nPhần lớn công cụ ở lĩnh vực này xếp hạng những gì người mua nhìn thấy. PULSE hỏi câu nằm bên\ndưới câu đó: danh mục của bạn có trả lời được điều họ đến để tìm hiểu hay không? Bạn gửi một tệp\nxuất ngành hàng, nhận lại các thuộc tính đáng ghi theo thứ tự ưu tiên, rồi đo lại sau khi đội của\nbạn đã điền xong.\n\nBan đầu không có gì được cài lên website của bạn. Câu trả lời hữu ích đầu tiên đến từ một tệp.\n\nAi xây dựng sản phẩm này. \nPULSE do Resolve Labs làm ra, một đội nhỏ theo đuổi một câu hỏi: thông tin sản phẩm nào đáng\nbỏ tiền ra sửa. Trang giới thiệu là thepulseapi.com (https://thepulseapi.com/vi). Trang này\ndành cho những người phải tích hợp nó.","l":"vi"},{"u":"/vi","a":"sản-phẩm-này-thực-sự-giải-quyết-vấn-đề-gì","p":"Giới thiệu","h":"Sản phẩm này thực sự giải quyết vấn đề gì?","t":"Một người mua rời đi mà không mua gì. Hoặc là họ không tìm thấy sản phẩm, hoặc là danh mục của bạn\nkhông giúp họ phân biệt được các sản phẩm với nhau.\n\nVế thứ hai lớn hơn và gần như không ai đo nó. Trên một kệ 216 mẫu laptop mà chúng tôi đã đo,\n94 sản phẩm vẫn không thể phân biệt được sau mọi câu hỏi mà người mua có thể trả lời, bởi vì\nnhững thuộc tính giúp tách chúng ra không được ghi ở đâu cả. Không mô hình xếp hạng nào sửa được\nđiều đó. Chỉ có việc ghi lại thuộc tính mới sửa được.\n\nNên PULSE bắt đầu từ danh mục chứ không phải từ phiên truy cập:\n\nCâu hỏi PULSE trả lời bằng \n--- --- \nTrường dữ liệu còn thiếu nào tốn kém nhất? Một bảng xếp hạng theo số người mua cần nó, không phải theo mức độ trống của cột \nDữ kiện đó vốn đang nằm ở đâu? Thường là trong chính tiêu đề và mô tả của bạn, lấy lại được trước khi ai đó phải gõ gì \nBản sửa có tác dụng không? Cùng một phép đo trên tệp xuất đã sửa, không cần lưu lượng truy cập","l":"vi"},{"u":"/vi","a":"nên-bắt-đầu-từ-đâu","p":"Giới thiệu","h":"Nên bắt đầu từ đâu?","t":"}\ntitle=\"Bạn đến từ thepulseapi.com\"\nhref=\"/vi/quickstart\"\ndescription=\"Bạn đã đọc bản kiểm tra làm gì. Đây là cách tự chạy một bản, trong khoảng mười dòng.\"\n/ \n}\ntitle=\"Bạn vào thẳng trang này\"\nhref=\"/vi/concepts/what-the-audit-measures\"\ndescription=\"Bắt đầu từ việc bộ máy đo cái gì và vì sao con số đó có ý nghĩa.\"\n/","l":"vi"},{"u":"/vi","a":"toàn-bộ-hành-trình-trông-ra-sao","p":"Giới thiệu","h":"Toàn bộ hành trình trông ra sao?","t":"Sáu bước, theo đúng thứ tự bạn sẽ gặp. Mỗi bước tự nó đã hữu ích, và bạn có thể dừng lại sau bất\nkỳ bước nào.\n\nĐo danh mục. POST /catalog/audit nhận một tệp xuất ngành hàng và trả về các thuộc tính đáng ghi, đã xếp hạng,\nkèm danh sách sản phẩm bị ảnh hưởng. Không lưu trạng thái, và không lưu gì trừ khi bạn yêu cầu.\n\nChạy bản kiểm tra đầu tiên (https://developer.thepulseapi.com/vi/quickstart)\n\nHiểu kết quả trả về. Thứ hạng được đo bằng bit thông tin quyết định, không phải đoán từ lượt nhấp, và cột trống nhất\nthường là cột không đáng sửa nhất.\n\nBản kiểm tra đo gì (https://developer.thepulseapi.com/vi/concepts/what-the-audit-measures)\n\nSửa, rồi đo lại. Đội của bạn điền thuộc tính đứng đầu bảng. POST /catalog/verify chạy lại đúng phép đo đó trên\ntệp xuất đã sửa và báo cáo điều gì đã thay đổi, theo từng thuộc tính. Nó đọc danh mục chứ không\nđọc lưu lượng, nên không phải chờ gì cả.\n\nTài liệu endpoint (https://developer.thepulseapi.com/vi/api/v1/audit)\n\nĐưa vào hệ thống của bạn. Chỉ cần khi bạn muốn dùng phần thời gian thực. Có hướng dẫn cho React, Vue, Angular, Astro, Alpine\nvà Laravel; hướng dẫn gian hàng cho Shopify, WordPress và Magento; hướng dẫn máy chủ cho tám ngôn\nngữ.","l":"vi"},{"u":"/vi","a":"toàn-bộ-hành-trình-trông-ra-sao","p":"Giới thiệu","h":"Toàn bộ hành trình trông ra sao?","t":"Framework (https://developer.thepulseapi.com/vi/frameworks) · Gian hàng (https://developer.thepulseapi.com/vi/platforms) · Máy chủ (https://developer.thepulseapi.com/vi/backend)","l":"vi"},{"u":"/vi","a":"đo-danh-mục","p":"Giới thiệu","h":"Đo danh mục","t":"POST /catalog/audit nhận một tệp xuất ngành hàng và trả về các thuộc tính đáng ghi, đã xếp hạng,\nkèm danh sách sản phẩm bị ảnh hưởng. Không lưu trạng thái, và không lưu gì trừ khi bạn yêu cầu.\n\nChạy bản kiểm tra đầu tiên (https://developer.thepulseapi.com/vi/quickstart)","l":"vi"},{"u":"/vi","a":"hiểu-kết-quả-trả-về","p":"Giới thiệu","h":"Hiểu kết quả trả về","t":"Thứ hạng được đo bằng bit thông tin quyết định, không phải đoán từ lượt nhấp, và cột trống nhất\nthường là cột không đáng sửa nhất.\n\nBản kiểm tra đo gì (https://developer.thepulseapi.com/vi/concepts/what-the-audit-measures)","l":"vi"},{"u":"/vi","a":"sửa-rồi-đo-lại","p":"Giới thiệu","h":"Sửa, rồi đo lại","t":"Đội của bạn điền thuộc tính đứng đầu bảng. POST /catalog/verify chạy lại đúng phép đo đó trên\ntệp xuất đã sửa và báo cáo điều gì đã thay đổi, theo từng thuộc tính. Nó đọc danh mục chứ không\nđọc lưu lượng, nên không phải chờ gì cả.\n\nTài liệu endpoint (https://developer.thepulseapi.com/vi/api/v1/audit)","l":"vi"},{"u":"/vi","a":"đưa-vào-hệ-thống-của-bạn","p":"Giới thiệu","h":"Đưa vào hệ thống của bạn","t":"Chỉ cần khi bạn muốn dùng phần thời gian thực. Có hướng dẫn cho React, Vue, Angular, Astro, Alpine\nvà Laravel; hướng dẫn gian hàng cho Shopify, WordPress và Magento; hướng dẫn máy chủ cho tám ngôn\nngữ.\n\nFramework (https://developer.thepulseapi.com/vi/frameworks) · Gian hàng (https://developer.thepulseapi.com/vi/platforms) · Máy chủ (https://developer.thepulseapi.com/vi/backend)","l":"vi"},{"u":"/vi","a":"xếp-hạng-phiên-truy-cập-nếu-bạn-muốn","p":"Giới thiệu","h":"Xếp hạng phiên truy cập, nếu bạn muốn","t":"Phần tuỳ chọn, và là phần duy nhất chạm tới gian hàng của bạn. SDK gửi tín hiệu, bộ máy xếp hạng\ndanh mục theo những gì phiên truy cập hàm ý, và mọi điểm số đều kèm diễn giải theo từng yếu tố.\n\nTài liệu SDK (https://developer.thepulseapi.com/vi/sdk) · Tài liệu API (https://developer.thepulseapi.com/vi/api/v1)","l":"vi"},{"u":"/vi","a":"đưa-lên-production","p":"Giới thiệu","h":"Đưa lên production","t":"Cần kiểm tra gì trước khi phát hành, cần theo dõi gì sau đó, và những điều chúng tôi sẽ không\ntuyên bố.\n\nĐưa lên production (https://developer.thepulseapi.com/vi/going-live)","l":"vi"},{"u":"/vi","a":"cài-đặt","p":"Giới thiệu","h":"Cài đặt","t":"Hoặc nhúng thẳng vào trang, đây là cách các bản tích hợp gian hàng đang dùng:\n\nThẻ script này expose client ra biến toàn cục Pulse, nên gọi Pulse.init(...) là chạy được ngay.\n\nNhững gì rời khỏi trình duyệt. \nTín hiệu và một mã phiên. Không có tên, không có email, không có dữ liệu thanh toán. Bản kiểm\ntra thì không nhìn thấy người mua nào cả: nó đọc dữ liệu sản phẩm.","l":"vi","c":{"l":"html","s":"<script src=\"https://cdn.thepulseapi.com/sdk/v0/pulse.iife.js\" async></script>"}},{"u":"/vi","a":"cần-biết-gì-trước-khi-tin-vào-các-con-số","p":"Giới thiệu","h":"Cần biết gì trước khi tin vào các con số?","t":"} title=\"3,2 KB sau nén\" description=\"Bản dùng cho thẻ script, không phụ thuộc thư viện nào khi chạy.\" / \n} title=\"Không cần lịch sử\" description=\"Bản kiểm tra chỉ cần một tệp xuất. Phần thời gian thực xếp hạng ngay từ lượt truy cập đầu tiên.\" / \n} title=\"Giấy phép MIT\" description=\"Mã nguồn client là mở. Hãy đọc từng dòng trước khi đưa lên production.\" / \n} title=\"Không hứa hẹn tăng trưởng\" description=\"Chúng tôi chưa chạy thử nghiệm doanh thu thực tế nào, nên không đưa ra con số chuyển đổi.\" /","l":"vi"},{"u":"/vi/changelog","a":"","p":"Lịch sử tài liệu","h":"Lịch sử tài liệu","t":"Mọi thay đổi trên các trang này, mới nhất trước, đọc trực tiếp từ git khi dựng site chứ không viết tay.\n\nTrang này ghi lại điều gì đã thay đổi trên site và vào lúc nào. Danh sách được đọc từ lịch sử của\nchính kho mã khi site được dựng, nên nó không thể lệch khỏi những gì thực sự đã xảy ra và không ai\nphải nhớ cập nhật nó.\n\nĐây không phải nhật ký thay đổi của API. \nQuy tắc tương thích của API, thế nào là thay đổi phá vỡ, và chúng tôi có trách nhiệm gì khi điều\nđó xảy ra, nằm ở Phiên bản (https://developer.thepulseapi.com/vi/api/versioning). API được đánh phiên bản theo URL còn các\nhướng dẫn thì không, đó là lựa chọn có chủ đích và được giải thích ở trang đó. Trang này là\nlịch sử của chính bộ tài liệu.","l":"vi"},{"u":"/vi/changelog","a":"thay-đổi-gần-đây","p":"Lịch sử tài liệu","h":"Thay đổi gần đây","t":"Nội dung commit được giữ nguyên tiếng Anh, vì đó là ngôn ngữ của kho mã.","l":"vi"},{"u":"/vi/changelog","a":"xem-lịch-sử-của-từng-trang","p":"Lịch sử tài liệu","h":"Xem lịch sử của từng trang","t":"Mỗi trang đều hiển thị ngày sửa đổi gần nhất ở cuối trang, kèm liên kết tới toàn bộ lịch sử commit\ncủa riêng tệp đó. Đây là cách nhanh nhất để trả lời câu hỏi \"tháng trước trang này có viết khác\nkhông\", vốn thường mới là câu hỏi thật sự.\n\nCác trang là tệp MDX trong\ncontent/docs (https://github.com/mypulseapi/handbook/tree/main/content/docs), nên lịch sử chính\nlà git thông thường: mọi lần sửa, ai sửa, và những gì khác đã thay đổi trong cùng một commit.","l":"vi"},{"u":"/vi/mcp","a":"","p":"MCP cho tác tử","h":"MCP cho tác tử","t":"Kết nối tài liệu PULSE với Claude, Cursor hoặc bất kỳ MCP client nào, để tác tử tìm và đọc đúng trang thay vì đoán.\n\nMọi trang trên site này đều có thể truy cập bằng tác tử qua Model Context Protocol. Một trợ lý đã\nkết nối sẽ tìm trong tài liệu và trích dẫn, thay vì nhớ nhầm một endpoint không tồn tại.","l":"vi"},{"u":"/vi/mcp","a":"kết-nối-thế-nào","p":"MCP cho tác tử","h":"Kết nối thế nào?","t":"Hoặc trỏ thẳng client của bạn vào đó, không cần cài:\n\nCùng khối cấu hình đó dùng được cho Claude Code (.mcp.json), Cursor và mọi thứ nói MCP qua stdio.\n\nNó chạy trên máy bạn, không phải máy chúng tôi. \nSite này là bản xuất tĩnh nên ở đây không có máy chủ nào để dựng một endpoint HTTP. Gói này chạy\nở nơi tác tử của bạn chạy và tải chỉ mục tài liệu đã xuất bản, nghĩa là không có gì về câu lệnh\nhay mã nguồn của bạn đi tới chúng tôi.","l":"vi","c":{"l":"json","s":"{\n  \"mcpServers\": {\n    \"pulse-docs\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@thepulseapi/docs-mcp\"]\n    }\n  }\n}"}},{"u":"/vi/mcp","a":"có-những-công-cụ-nào","p":"MCP cho tác tử","h":"Có những công cụ nào?","t":"Công cụ Làm gì \n--- --- \nsearch_docs Tìm toàn văn trên mọi trang. Trả về đúng mục khớp, URL và điểm số \nget_page Một trang dạng Markdown, theo đường dẫn, ví dụ /quickstart hay /api/v1/audit \nlist_pages Mọi trang kèm tiêu đề, để định hướng trước khi tìm \n\nCả ba đều nhận lang là en hoặc vi.","l":"vi"},{"u":"/vi/mcp","a":"vì-sao-tìm-theo-từ-khoá-chứ-không-phải-theo-ngữ-nghĩa","p":"MCP cho tác tử","h":"Vì sao tìm theo từ khoá chứ không phải theo ngữ nghĩa?","t":"Website nhúng câu hỏi của bạn bằng một mô hình mà nó đã tải sẵn. Bắt một tác tử tải mô hình chỉ để\nđặt câu hỏi là đánh đổi không đáng, vì bản thân tác tử đã là một mô hình ngôn ngữ: nó đọc ba mục\nứng viên và tự quyết định tốt hơn nhiều so với một phép cosine.\n\nThêm nữa, một tác tử hỏi về /catalog/audit muốn đúng trang chứa chuỗi đó, và tìm theo từ khoá\nchính xác ở điểm này trong khi embedding thì làm nhoè đi.","l":"vi"},{"u":"/vi/mcp","a":"muốn-trỏ-sang-nơi-khác-thì-sao","p":"MCP cho tác tử","h":"Muốn trỏ sang nơi khác thì sao?","t":"Đặt PULSE_DOCS_ORIGIN để đọc từ một origin khác, chủ yếu hữu ích khi bạn đang sửa chính tài liệu\nnày:","l":"vi","c":{"l":"bash","s":"PULSE_DOCS_ORIGIN=http://localhost:3000 npx @thepulseapi/docs-mcp"}},{"u":"/vi/mcp","a":"đọc-thẳng-markdown-được-không","p":"MCP cho tác tử","h":"Đọc thẳng Markdown được không?","t":"Được, và không cần MCP.\n\n--- --- \n/llms.txt (https://developer.thepulseapi.com/llms.txt) Mọi trang, có tiêu đề và liên kết, trong một tệp \n/llms-full.txt (https://developer.thepulseapi.com/llms-full.txt) Toàn bộ tài liệu gộp thành một tài liệu Markdown \n/llms.mdx/docs/<path /content.md Một trang bất kỳ dạng Markdown \n/search-index.json (https://developer.thepulseapi.com/search-index.json) Kho văn bản đã chia khối kèm vector \n\nMỗi trang cũng có nút Sao chép Markdown, là cách nhanh nhất khi bạn chỉ muốn dán một trang vào\ncuộc hội thoại.","l":"vi"}],"vectors":"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"}