[{"data":1,"prerenderedAt":1415},["ShallowReactive",2],{"content:pages:\u002Fproduct\u002Fapi-and-assistants":3,"code-html:":1059,"plan-catalog":1060},{"id":4,"title":5,"body":6,"canonical":1018,"card":1018,"cta":1018,"description":1019,"draft":1020,"extension":1021,"faq":1022,"hero":1041,"keywords":1045,"locale":1049,"meta":1050,"mockup":1051,"navigation":610,"noindex":1020,"og":1018,"path":1053,"pricing":1018,"resource":1018,"section":1054,"seo":1055,"stem":1056,"updated":1057,"__hash__":1058},"pages\u002Fproduct\u002Fapi-and-assistants.md","API, webhooks and assistants for feedback data",{"type":7,"value":8,"toc":1016},"minimark",[9,359,381,420,959,978,1007,1012],[10,11,16,20],"product-section",{"title":12,"eyebrow":13,"lede":14,"layout":15},"Send your first person in one request","Quick start","Tell Pulseri who someone is, then what they did. Surveys can start from either.","split",[17,18,19],"p",{},"A public key is safe in your web app because it only sends data in. Use a service account key on your server for everything else. The button at the top of this page opens the full reference.",[21,22,24],"template",{"v-slot:media":23},"",[25,26,27,137,285],"code-tabs",{},[28,29,34],"pre",{"className":30,"code":31,"filename":32,"language":33,"meta":23,"style":23},"language-bash shiki shiki-themes material-theme-lighter pulseri-code material-theme-palenight","curl https:\u002F\u002Fapi.pulseri.com\u002Fv1\u002Fidentify \\\n  -H \"Authorization: Bearer pk_live_...\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"external_id\": \"user_123\",\n    \"name\": \"Emily Carter\",\n    \"email\": \"emily@northwind.example\",\n    \"group_id\": \"northwind-books\",\n    \"traits\": { \"plan\": \"pro\", \"seats\": 12 }\n  }'\n","curl","bash",[35,36,37,53,72,86,98,104,110,116,122,128],"code",{"__ignoreMap":23},[38,39,42,45,49],"span",{"class":40,"line":41},"line",1,[38,43,32],{"class":44},"sRPBs",[38,46,48],{"class":47},"spJNI"," https:\u002F\u002Fapi.pulseri.com\u002Fv1\u002Fidentify",[38,50,52],{"class":51},"so3wE"," \\\n",[38,54,56,59,63,67,70],{"class":40,"line":55},2,[38,57,58],{"class":47},"  -H",[38,60,62],{"class":61},"sDqDV"," \"",[38,64,66],{"class":65},"sYyUr","Authorization: Bearer pk_live_...",[38,68,69],{"class":61},"\"",[38,71,52],{"class":51},[38,73,75,77,79,82,84],{"class":40,"line":74},3,[38,76,58],{"class":47},[38,78,62],{"class":61},[38,80,81],{"class":65},"Content-Type: application\u002Fjson",[38,83,69],{"class":61},[38,85,52],{"class":51},[38,87,89,92,95],{"class":40,"line":88},4,[38,90,91],{"class":47},"  -d",[38,93,94],{"class":61}," '",[38,96,97],{"class":65},"{\n",[38,99,101],{"class":40,"line":100},5,[38,102,103],{"class":65},"    \"external_id\": \"user_123\",\n",[38,105,107],{"class":40,"line":106},6,[38,108,109],{"class":65},"    \"name\": \"Emily Carter\",\n",[38,111,113],{"class":40,"line":112},7,[38,114,115],{"class":65},"    \"email\": \"emily@northwind.example\",\n",[38,117,119],{"class":40,"line":118},8,[38,120,121],{"class":65},"    \"group_id\": \"northwind-books\",\n",[38,123,125],{"class":40,"line":124},9,[38,126,127],{"class":65},"    \"traits\": { \"plan\": \"pro\", \"seats\": 12 }\n",[38,129,131,134],{"class":40,"line":130},10,[38,132,133],{"class":65},"  }",[38,135,136],{"class":61},"'\n",[28,138,143],{"className":139,"code":140,"filename":141,"language":142,"meta":23,"style":23},"language-js shiki shiki-themes material-theme-lighter pulseri-code material-theme-palenight","Pulseri.init('pk_live_...')\nPulseri.identify('user_123', { plan: 'pro', seats: 12 }, {\n  name: 'Emily Carter',\n  email: 'emily@northwind.example',\n  groupId: 'northwind-books',\n})\n","Browser","js",[35,144,145,174,229,246,262,278],{"__ignoreMap":23},[38,146,147,151,155,159,163,166,169,171],{"class":40,"line":41},[38,148,150],{"class":149},"sZbaC","Pulseri",[38,152,154],{"class":153},"sFaY5",".",[38,156,158],{"class":157},"s2jJG","init",[38,160,162],{"class":161},"sa8A-","(",[38,164,165],{"class":61},"'",[38,167,168],{"class":65},"pk_live_...",[38,170,165],{"class":61},[38,172,173],{"class":161},")\n",[38,175,176,178,180,183,185,187,190,192,195,198,202,205,207,210,212,214,217,219,223,226],{"class":40,"line":55},[38,177,150],{"class":149},[38,179,154],{"class":153},[38,181,182],{"class":157},"identify",[38,184,162],{"class":161},[38,186,165],{"class":61},[38,188,189],{"class":65},"user_123",[38,191,165],{"class":61},[38,193,194],{"class":153},",",[38,196,197],{"class":153}," {",[38,199,201],{"class":200},"sxCGI"," plan",[38,203,204],{"class":153},":",[38,206,94],{"class":61},[38,208,209],{"class":65},"pro",[38,211,165],{"class":61},[38,213,194],{"class":153},[38,215,216],{"class":200}," seats",[38,218,204],{"class":153},[38,220,222],{"class":221},"sB6OD"," 12",[38,224,225],{"class":153}," },",[38,227,228],{"class":153}," {\n",[38,230,231,234,236,238,241,243],{"class":40,"line":74},[38,232,233],{"class":200},"  name",[38,235,204],{"class":153},[38,237,94],{"class":61},[38,239,240],{"class":65},"Emily Carter",[38,242,165],{"class":61},[38,244,245],{"class":153},",\n",[38,247,248,251,253,255,258,260],{"class":40,"line":88},[38,249,250],{"class":200},"  email",[38,252,204],{"class":153},[38,254,94],{"class":61},[38,256,257],{"class":65},"emily@northwind.example",[38,259,165],{"class":61},[38,261,245],{"class":153},[38,263,264,267,269,271,274,276],{"class":40,"line":100},[38,265,266],{"class":200},"  groupId",[38,268,204],{"class":153},[38,270,94],{"class":61},[38,272,273],{"class":65},"northwind-books",[38,275,165],{"class":61},[38,277,245],{"class":153},[38,279,280,283],{"class":40,"line":106},[38,281,282],{"class":153},"}",[38,284,173],{"class":161},[28,286,289],{"className":30,"code":287,"filename":288,"language":33,"meta":23,"style":23},"curl https:\u002F\u002Fapi.pulseri.com\u002Fv1\u002Fevents \\\n  -H \"Authorization: Bearer sk_live_...\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"event_key\": \"ticket.closed\",\n    \"external_event_id\": \"evt_8f14e45f\",\n    \"person_id\": \"user_123\",\n    \"payload\": { \"email\": \"emily@northwind.example\" }\n  }'\n","Send an event",[35,290,291,300,313,325,333,338,343,348,353],{"__ignoreMap":23},[38,292,293,295,298],{"class":40,"line":41},[38,294,32],{"class":44},[38,296,297],{"class":47}," https:\u002F\u002Fapi.pulseri.com\u002Fv1\u002Fevents",[38,299,52],{"class":51},[38,301,302,304,306,309,311],{"class":40,"line":55},[38,303,58],{"class":47},[38,305,62],{"class":61},[38,307,308],{"class":65},"Authorization: Bearer sk_live_...",[38,310,69],{"class":61},[38,312,52],{"class":51},[38,314,315,317,319,321,323],{"class":40,"line":74},[38,316,58],{"class":47},[38,318,62],{"class":61},[38,320,81],{"class":65},[38,322,69],{"class":61},[38,324,52],{"class":51},[38,326,327,329,331],{"class":40,"line":88},[38,328,91],{"class":47},[38,330,94],{"class":61},[38,332,97],{"class":65},[38,334,335],{"class":40,"line":100},[38,336,337],{"class":65},"    \"event_key\": \"ticket.closed\",\n",[38,339,340],{"class":40,"line":106},[38,341,342],{"class":65},"    \"external_event_id\": \"evt_8f14e45f\",\n",[38,344,345],{"class":40,"line":112},[38,346,347],{"class":65},"    \"person_id\": \"user_123\",\n",[38,349,350],{"class":40,"line":118},[38,351,352],{"class":65},"    \"payload\": { \"email\": \"emily@northwind.example\" }\n",[38,354,355,357],{"class":40,"line":124},[38,356,133],{"class":65},[38,358,136],{"class":61},[10,360,364,367,371,374],{"title":361,"eyebrow":362,"tone":363},"Most of the dashboard is in the API","REST API","muted",[17,365,366],{},"The API reference covers people, groups, segments, campaigns, answers, alerts and team settings.",[368,369],"check-list",{":items":370},"[\"People, groups and traits: send, search and update them.\",\"Segments and campaigns: create, change, start and pause.\",\"Answers and score reports by campaign, group or person.\",\"Alert rules and webhook endpoints, with their delivery history.\",\"Your team, roles and service accounts.\"]",[17,372,373],{},"Lists use cursor paging, search and filters everywhere. Errors share one shape, and every response shows your remaining rate limit.",[21,375,376],{"v-slot:glance":23},[377,378],"glance-facts",{":chips":379,":items":380},"true","[{\"label\":\"Covers\",\"value\":\"People, groups, segments, campaigns, answers, alerts, team\"},{\"label\":\"Lists\",\"value\":\"Cursor paging, search, filters\"},{\"label\":\"Errors\",\"value\":\"One shape\"},{\"label\":\"Rate limit\",\"value\":\"In every response\"}]",[10,382,386,405,416],{"title":383,"eyebrow":384,"lede":385},"Keys, service accounts and limits by plan","Access","Two kinds of key keep browser code and server code apart.",[17,387,388,389,393,394,397,398,393,401,404],{},"A ",[390,391,392],"strong",{},"public key"," (",[35,395,396],{},"pk_live_",") goes into your web app and only sends data in. A ",[390,399,400],{},"service account key",[35,402,403],{},"sk_live_",") belongs to a service account, which has one role and does what that role allows. It never signs in and is not a team member.",[17,406,407,408,411,412,415],{},"Rate limits are per key and per minute. Every response shows the limit and what is left, and a ",[35,409,410],{},"429"," includes a ",[35,413,414],{},"Retry-After"," header. Limits grow with your plan:",[417,418],"plan-limits",{"keys":419},"api_rpm,mcp_rpm,service_accounts,public_keys,connected_apps",[10,421,425,480,487,498,509,520,526,572],{"title":422,"eyebrow":423,"lede":424,"layout":15},"Sign who is calling","Identity verification","A public key sits in browser code, where anyone can copy it. A signature from your server shows that a request came from your app.",[17,426,427,428,431,432,435,436,439,440,443,444,447,448,450,451,439,454,450,456,459,460,463,464,467,468,450,470,472,473,463,476,479],{},"Identity verification is optional and starts off. Create a signing secret in Settings, then have your server compute ",[35,429,430],{},"HMAC-SHA256(secret, message)"," as lowercase hex and send it as ",[35,433,434],{},"signature"," in the body of ",[35,437,438],{},"\u002Fidentify",", ",[35,441,442],{},"\u002Fgroup"," and ",[35,445,446],{},"\u002Ftrack",". For a person (",[35,449,438],{}," with its ",[35,452,453],{},"external_id",[35,455,446],{},[35,457,458],{},"person_id",") the message is ",[35,461,462],{},"person:"," followed by the id, such as ",[35,465,466],{},"person:user_123",". For a group (",[35,469,442],{},[35,471,453],{},") it is ",[35,474,475],{},"group:",[35,477,478],{},"group:acme",". The prefix means a person and a group with the same id never share a signature, and a signature of the bare id is refused. The secret stays on your server and never goes into browser code.",[17,481,482,483,486],{},"A request with a matching signature is verified and can set a person's email, name and group. A request without one still records traits and events and can show in-app surveys, but it leaves an existing person's name and group as they are and does not store an email. A signature that does not match gets ",[35,484,485],{},"401 invalid_signature",", whether or not you enforce signing.",[17,488,489,490,493,494,497],{},"When your server signs everything, turn on ",[390,491,492],{},"Reject unsigned requests"," in Settings. Public-key requests without a signature then get ",[35,495,496],{},"401 signature_required",". Settings shows how many requests of the last seven days were signed, so you can check before you switch. A new secret replaces the old one at once, so update your server first.",[17,499,500,501,504,505,508],{},"Email surveys that start from website events need a verified event. Pulseri refuses to start such an email survey until the account has a signing secret, with ",[35,502,503],{},"422 identity_verification_required",". Events from webhooks, integrations and ",[35,506,507],{},"\u002Fevents"," are already verified.",[17,510,511,443,513,515,516,519],{},[35,512,438],{},[35,514,442],{}," answer a public key with ",[35,517,518],{},"204 No Content",", so a browser never gets person data back.",[17,521,522,523,154],{},"A request without a signature cannot set an email, not even for a new person. It can still create a new person and, when the person is new, the group named by ",[35,524,525],{},"group_id",[17,527,528,531,532,534,535,439,538,541,542,545,546,548,549,541,552,555,556,558,559,561,562,565,566,568,569,154],{},[390,529,530],{},"Customers and employees."," ",[35,533,438],{}," takes an optional ",[35,536,537],{},"audience_type",[35,539,540],{},"customer"," (the default) or ",[35,543,544],{},"employee",", and ",[35,547,442],{}," takes ",[35,550,551],{},"customer_account",[35,553,554],{},"department",". Send it from any key. It only applies when Pulseri creates the person or group: on one that already exists it is ignored and nothing changes. A customer belongs to a customer account and an employee to a department. When ",[35,557,438],{}," creates the group named by ",[35,560,525],{},", the group gets the matching type, so an employee creates a department. If the group already exists with the other type, a secret key or a signed request gets ",[35,563,564],{},"422 group_audience_mismatch"," and nothing is written. An unsigned public key still gets ",[35,567,518],{}," and the person is saved without the link, so a browser cannot learn which groups exist. A value that is not one of the listed types gets ",[35,570,571],{},"422 validation_failed",[21,573,574],{"v-slot:media":23},[25,575,576,792,810,872],{},[28,577,580],{"className":139,"code":578,"filename":579,"language":142,"meta":23,"style":23},"import { createHmac } from 'node:crypto'\n\nconst sign = (kind, id) =>\n  createHmac('sha256', process.env.PULSERI_IDV_SECRET)\n    .update(`${kind}:${id}`)\n    .digest('hex')\n\nconst signature = sign('person', user.id)\nconst groupSignature = sign('group', company.id)\n","Node",[35,581,582,606,612,642,673,706,724,728,761],{"__ignoreMap":23},[38,583,584,588,590,593,596,599,601,604],{"class":40,"line":41},[38,585,587],{"class":586},"sVE1x","import",[38,589,197],{"class":153},[38,591,592],{"class":149}," createHmac",[38,594,595],{"class":153}," }",[38,597,598],{"class":586}," from",[38,600,94],{"class":61},[38,602,603],{"class":65},"node:crypto",[38,605,136],{"class":61},[38,607,608],{"class":40,"line":55},[38,609,611],{"emptyLinePlaceholder":610},true,"\n",[38,613,614,618,622,625,627,631,633,636,639],{"class":40,"line":74},[38,615,617],{"class":616},"scGce","const",[38,619,621],{"class":620},"sOO5n"," sign",[38,623,624],{"class":153}," =",[38,626,393],{"class":153},[38,628,630],{"class":629},"snPdx","kind",[38,632,194],{"class":153},[38,634,635],{"class":629}," id",[38,637,638],{"class":153},")",[38,640,641],{"class":616}," =>\n",[38,643,644,647,649,651,654,656,658,661,663,666,668,671],{"class":40,"line":88},[38,645,646],{"class":157},"  createHmac",[38,648,162],{"class":161},[38,650,165],{"class":61},[38,652,653],{"class":65},"sha256",[38,655,165],{"class":61},[38,657,194],{"class":153},[38,659,660],{"class":149}," process",[38,662,154],{"class":153},[38,664,665],{"class":149},"env",[38,667,154],{"class":153},[38,669,670],{"class":149},"PULSERI_IDV_SECRET",[38,672,173],{"class":161},[38,674,675,678,681,683,686,689,691,693,695,697,700,702,704],{"class":40,"line":100},[38,676,677],{"class":153},"    .",[38,679,680],{"class":157},"update",[38,682,162],{"class":161},[38,684,685],{"class":61},"`",[38,687,688],{"class":153},"${",[38,690,630],{"class":149},[38,692,282],{"class":153},[38,694,204],{"class":65},[38,696,688],{"class":153},[38,698,699],{"class":149},"id",[38,701,282],{"class":153},[38,703,685],{"class":61},[38,705,173],{"class":161},[38,707,708,710,713,715,717,720,722],{"class":40,"line":106},[38,709,677],{"class":153},[38,711,712],{"class":157},"digest",[38,714,162],{"class":161},[38,716,165],{"class":61},[38,718,719],{"class":65},"hex",[38,721,165],{"class":61},[38,723,173],{"class":161},[38,725,726],{"class":40,"line":112},[38,727,611],{"emptyLinePlaceholder":610},[38,729,730,732,735,738,740,742,744,747,749,751,754,756,759],{"class":40,"line":118},[38,731,617],{"class":616},[38,733,734],{"class":149}," signature ",[38,736,737],{"class":153},"=",[38,739,621],{"class":157},[38,741,162],{"class":161},[38,743,165],{"class":61},[38,745,746],{"class":65},"person",[38,748,165],{"class":61},[38,750,194],{"class":153},[38,752,753],{"class":149}," user",[38,755,154],{"class":153},[38,757,699],{"class":758},"sth0k",[38,760,173],{"class":161},[38,762,763,765,768,770,772,774,776,779,781,783,786,788,790],{"class":40,"line":124},[38,764,617],{"class":616},[38,766,767],{"class":149}," groupSignature ",[38,769,737],{"class":153},[38,771,621],{"class":157},[38,773,162],{"class":161},[38,775,165],{"class":61},[38,777,778],{"class":65},"group",[38,780,165],{"class":61},[38,782,194],{"class":153},[38,784,785],{"class":149}," company",[38,787,154],{"class":153},[38,789,699],{"class":758},[38,791,173],{"class":161},[28,793,798],{"className":794,"code":795,"filename":796,"language":797,"meta":23,"style":23},"language-php shiki shiki-themes material-theme-lighter pulseri-code material-theme-palenight","$signature = hash_hmac('sha256', 'person:'.$user->id, getenv('PULSERI_IDV_SECRET'));\n$groupSignature = hash_hmac('sha256', 'group:'.$company->id, getenv('PULSERI_IDV_SECRET'));\n","PHP","php",[35,799,800,805],{"__ignoreMap":23},[38,801,802],{"class":40,"line":41},[38,803,804],{},"$signature = hash_hmac('sha256', 'person:'.$user->id, getenv('PULSERI_IDV_SECRET'));\n",[38,806,807],{"class":40,"line":55},[38,808,809],{},"$groupSignature = hash_hmac('sha256', 'group:'.$company->id, getenv('PULSERI_IDV_SECRET'));\n",[28,811,816],{"className":812,"code":813,"filename":814,"language":815,"meta":23,"style":23},"language-python shiki shiki-themes material-theme-lighter pulseri-code material-theme-palenight","import hashlib, hmac, os\n\ndef sign(kind, id):\n    return hmac.new(\n        os.environ[\"PULSERI_IDV_SECRET\"].encode(),\n        f\"{kind}:{id}\".encode(),\n        hashlib.sha256,\n    ).hexdigest()\n\nsignature = sign(\"person\", user_id)\ngroup_signature = sign(\"group\", company_id)\n","Python","python",[35,817,818,823,827,832,837,842,847,852,857,861,866],{"__ignoreMap":23},[38,819,820],{"class":40,"line":41},[38,821,822],{},"import hashlib, hmac, os\n",[38,824,825],{"class":40,"line":55},[38,826,611],{"emptyLinePlaceholder":610},[38,828,829],{"class":40,"line":74},[38,830,831],{},"def sign(kind, id):\n",[38,833,834],{"class":40,"line":88},[38,835,836],{},"    return hmac.new(\n",[38,838,839],{"class":40,"line":100},[38,840,841],{},"        os.environ[\"PULSERI_IDV_SECRET\"].encode(),\n",[38,843,844],{"class":40,"line":106},[38,845,846],{},"        f\"{kind}:{id}\".encode(),\n",[38,848,849],{"class":40,"line":112},[38,850,851],{},"        hashlib.sha256,\n",[38,853,854],{"class":40,"line":118},[38,855,856],{},"    ).hexdigest()\n",[38,858,859],{"class":40,"line":124},[38,860,611],{"emptyLinePlaceholder":610},[38,862,863],{"class":40,"line":130},[38,864,865],{},"signature = sign(\"person\", user_id)\n",[38,867,869],{"class":40,"line":868},11,[38,870,871],{},"group_signature = sign(\"group\", company_id)\n",[28,873,875],{"className":139,"code":874,"filename":141,"language":142,"meta":23,"style":23},"Pulseri.identify('user_123', { plan: 'pro' }, { signature })\nPulseri.group('acme', { seats: 12 }, { signature: groupSignature })\n",[35,876,877,917],{"__ignoreMap":23},[38,878,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913,915],{"class":40,"line":41},[38,880,150],{"class":149},[38,882,154],{"class":153},[38,884,182],{"class":157},[38,886,162],{"class":161},[38,888,165],{"class":61},[38,890,189],{"class":65},[38,892,165],{"class":61},[38,894,194],{"class":153},[38,896,197],{"class":153},[38,898,201],{"class":200},[38,900,204],{"class":153},[38,902,94],{"class":61},[38,904,209],{"class":65},[38,906,165],{"class":61},[38,908,225],{"class":153},[38,910,197],{"class":153},[38,912,734],{"class":149},[38,914,282],{"class":153},[38,916,173],{"class":161},[38,918,919,921,923,925,927,929,932,934,936,938,940,942,944,946,948,951,953,955,957],{"class":40,"line":55},[38,920,150],{"class":149},[38,922,154],{"class":153},[38,924,778],{"class":157},[38,926,162],{"class":161},[38,928,165],{"class":61},[38,930,931],{"class":65},"acme",[38,933,165],{"class":61},[38,935,194],{"class":153},[38,937,197],{"class":153},[38,939,216],{"class":200},[38,941,204],{"class":153},[38,943,222],{"class":221},[38,945,225],{"class":153},[38,947,197],{"class":153},[38,949,950],{"class":200}," signature",[38,952,204],{"class":153},[38,954,767],{"class":149},[38,956,282],{"class":153},[38,958,173],{"class":161},[10,960,964,967,970,973],{"title":961,"eyebrow":962,"lede":963,"tone":363},"Connect an assistant","Assistants and MCP","Ask about your customers in plain words, and let an assistant save what it finds.",[17,965,966],{},"Pulseri has an MCP server. MCP, the Model Context Protocol, is a standard that lets an AI assistant use another product. A person connects an assistant and approves what it may do, and it then works with their feedback data as that person.",[368,968],{":items":969},"[\"Up to 14 tools, set by permissions: find people, read answers, see trends, run surveys.\",\"Claude, Claude Code, ChatGPT and Cursor work. Other MCP assistants can connect too.\",\"An assistant gets only what the person approved, and loses it when they do.\",\"Admins decide which apps may connect. Anyone can disconnect their own.\",\"Scripts and agents without a browser can use a service account key.\"]",[17,971,972],{},"Pulseri marks customer comments as untrusted text and tells the assistant so. Review what an assistant proposes before you approve it.",[21,974,975],{"v-slot:glance":23},[377,976],{":chips":379,":items":977},"[{\"label\":\"Protocol\",\"value\":\"MCP, the Model Context Protocol\"},{\"label\":\"Tools\",\"value\":\"Up to 14, by permission\"},{\"label\":\"Recognised\",\"value\":\"Claude, Claude Code, ChatGPT and Cursor\"},{\"label\":\"Access\",\"value\":\"Only what the person approved\"}]",[10,979,981],{"title":980,"tone":363},"Keep reading",[982,983,984,993,1000],"ul",{},[985,986,987,992],"li",{},[988,989,991],"a",{"href":990},"\u002Fintegrations\u002Frest-api","The REST API",": send people and events and read answers and score reports.",[985,994,995,999],{},[988,996,998],{"href":997},"\u002Fintegrations\u002Fassistants","AI assistants",": ask about your feedback in plain words, using only what you approve.",[985,1001,1002,1006],{},[988,1003,1005],{"href":1004},"\u002Fintegrations\u002Fwebhooks","Signed webhooks",": send events in and get alerts out.",[1008,1009],"cta-band",{":product":379,":proof":379,"lede":1010,"title":1011},"Open the docs, create a key and send your first person. Try the whole product for 14 days.","Start building with Pulseri",[1013,1014,1015],"style",{},"html pre.shiki code .sRPBs, html code.shiki .sRPBs{--shiki-light:#E2931D;--shiki-default:#7CCBC6;--shiki-dark:#FFCB6B}html pre.shiki code .spJNI, html code.shiki .spJNI{--shiki-light:#91B859;--shiki-default:#E0B676;--shiki-dark:#C3E88D}html pre.shiki code .so3wE, html code.shiki .so3wE{--shiki-light:#90A4AE;--shiki-default:#E0B676;--shiki-dark:#BABED8}html pre.shiki code .sDqDV, html code.shiki .sDqDV{--shiki-light:#39ADB5;--shiki-default:#8FCDA8;--shiki-dark:#89DDFF}html pre.shiki code .sYyUr, html code.shiki .sYyUr{--shiki-light:#91B859;--shiki-default:#8FCDA8;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZbaC, html code.shiki .sZbaC{--shiki-light:#90A4AE;--shiki-default:#E4E4E7;--shiki-dark:#BABED8}html pre.shiki code .sFaY5, html code.shiki .sFaY5{--shiki-light:#39ADB5;--shiki-default:#A1A1AA;--shiki-dark:#89DDFF}html pre.shiki code .s2jJG, html code.shiki .s2jJG{--shiki-light:#6182B8;--shiki-default:#7CCBC6;--shiki-dark:#82AAFF}html pre.shiki code .sa8A-, html code.shiki .sa8A-{--shiki-light:#90A4AE;--shiki-default:#A1A1AA;--shiki-dark:#BABED8}html pre.shiki code .sxCGI, html code.shiki .sxCGI{--shiki-light:#E53935;--shiki-default:#C4CBD6;--shiki-dark:#F07178}html pre.shiki code .sB6OD, html code.shiki .sB6OD{--shiki-light:#F76D47;--shiki-default:#E0B676;--shiki-dark:#F78C6C}html pre.shiki code .sVE1x, html code.shiki .sVE1x{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#7DB7E8;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .scGce, html code.shiki .scGce{--shiki-light:#9C3EDA;--shiki-default:#7DB7E8;--shiki-dark:#C792EA}html pre.shiki code .sOO5n, html code.shiki .sOO5n{--shiki-light:#90A4AE;--shiki-default:#7CCBC6;--shiki-dark:#BABED8}html pre.shiki code .snPdx, html code.shiki .snPdx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E4E4E7;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sth0k, html code.shiki .sth0k{--shiki-light:#90A4AE;--shiki-default:#C4CBD6;--shiki-dark:#BABED8}",{"title":23,"searchDepth":55,"depth":55,"links":1017},[],null,"Send people and events to Pulseri, read answers and reports, and let an AI assistant work with your feedback. Docs and code examples included.",false,"md",[1023,1026,1029,1032,1035,1038],{"q":1024,"a":1025},"What can I do with the Pulseri API?","Send people, groups and events, manage surveys and segments, read answers and score reports, set up alert rules and webhooks, and manage your team. The API reference lists every call.",{"q":1027,"a":1028},"How do I connect to the API?","Create a key in the dashboard and send it as a Bearer token. Public keys are for browser code and only send data in, and can be signed to prove who is calling. Service account keys are for your servers and do what their role allows.",{"q":1030,"a":1031},"What are the rate limits?","Limits are per key and per minute, and grow with your plan. The table on this page shows each plan's limits. A response that hits the limit carries a Retry-After header.",{"q":1033,"a":1034},"What is MCP?","MCP, the Model Context Protocol, is a standard way for an AI assistant to use another product. Pulseri's MCP server lets an assistant such as Claude read your feedback and make changes you allow.",{"q":1036,"a":1037},"Which assistants can connect?","Claude, Claude Code, ChatGPT and Cursor are recognised by name. Any MCP-capable assistant can connect once a person approves it.",{"q":1039,"a":1040},"Can an assistant do anything it likes?","No. It acts as the person who connected it and can use only what that person approved. Admins can allow, approve or block apps, and anyone can disconnect their own.",{"eyebrow":1042,"title":1043,"lede":1044},"API and assistants","Build on your feedback data, or just ask for it.","Send people and events in a few lines of code, read answers through the API, or ask an AI assistant in plain words.",[1046,1047,1048],"feedback API","NPS API","MCP server","en",{},{"id":1052},"assistant-chat","\u002Fproduct\u002Fapi-and-assistants","product",{"title":5,"description":1019},"product\u002Fapi-and-assistants","2026-10-19","dE59ioBDlQrTCbx_vPYaBJaz_KEkS2cTqzT0WxTvfhk",[],{"fetched_at":1061,"source":1062,"response":1063},"2026-11-05T19:47:02.540Z","https:\u002F\u002Fapi.pulseri.com\u002Fv1\u002Fbilling\u002Fplans",{"data":1064},{"id":1065,"type":1066,"attributes":1067},"catalog","plan_catalog",{"catalog_version":106,"currency":1068,"locale":1049,"tax_display":1069,"trial_days":1070,"links":1071,"plans":1077,"groups":1121,"add_ons":1377,"overage":1410},"EUR","excl_vat",14,{"contact_url":1072,"terms_url":1073,"privacy_url":1074,"dpa_url":1075,"terms_version":1076},"https:\u002F\u002Fwww.pulseri.com\u002Fcontact?topic=enterprise","https:\u002F\u002Fwww.pulseri.com\u002Flegal\u002Fterms","https:\u002F\u002Fwww.pulseri.com\u002Flegal\u002Fprivacy","https:\u002F\u002Fwww.pulseri.com\u002Flegal\u002Fdpa","2026-10-13",[1078,1092,1103,1114],{"key":1079,"name":1080,"description":1081,"rank":41,"highlights":1082,"self_serve":610,"cta":1085,"price":1086},"starter","Starter","For small teams just getting started with feedback.",[1083,1084],"people","sends_per_month","select",{"monthly":1087,"annual":1089,"annual_monthly_equivalent_minor":1091},{"amount_minor":1088,"currency":1068},4900,{"amount_minor":1090,"currency":1068},49000,4083,{"key":1093,"name":1094,"description":1095,"rank":55,"highlights":1096,"self_serve":610,"cta":1085,"price":1097},"growth","Growth","For growing teams that need more room to survey.",[1083,1084],{"monthly":1098,"annual":1100,"annual_monthly_equivalent_minor":1102},{"amount_minor":1099,"currency":1068},9900,{"amount_minor":1101,"currency":1068},99000,8250,{"key":1104,"name":1105,"description":1106,"rank":74,"highlights":1107,"self_serve":610,"cta":1085,"price":1108},"business","Business","For larger teams running feedback at scale.",[1083,1084],{"monthly":1109,"annual":1111,"annual_monthly_equivalent_minor":1113},{"amount_minor":1110,"currency":1068},19900,{"amount_minor":1112,"currency":1068},199000,16583,{"key":1115,"name":1116,"description":1117,"rank":88,"highlights":1118,"self_serve":1020,"cta":1119,"cta_label":1120,"contact_url":1072,"price":1018},"enterprise","Enterprise","For organisations with security, scale or contract requirements.",[1083,1084],"contact","Let's talk",[1122,1154,1176,1195,1215,1259,1298,1341],{"key":1123,"label":1124,"rows":1125},"core_data","Core data",[1126,1134,1142,1148],{"key":1083,"label":1127,"unit":1083,"enforced":610,"kind":1128,"values":1129},"People","limit",{"starter":1130,"growth":1131,"business":1132,"enterprise":1133},500,2500,10000,{"custom":610},{"key":1135,"label":1136,"unit":1135,"enforced":610,"kind":1128,"values":1137},"traits","Traits",{"starter":1138,"growth":1139,"business":1140,"enterprise":1141},50,150,300,{"custom":610},{"key":1143,"label":1144,"unit":1143,"enforced":610,"kind":1128,"values":1145},"segments","Segments",{"starter":130,"growth":1138,"business":1146,"enterprise":1147},200,{"custom":610},{"key":1149,"label":1150,"unit":1149,"enforced":610,"kind":1128,"values":1151},"themes","Themes",{"starter":1152,"growth":1152,"business":1152,"enterprise":1153},30,{"custom":610},{"key":1155,"label":1156,"rows":1157},"collection","Collection",[1158,1164,1171],{"key":1084,"label":1159,"unit":1160,"enforced":610,"kind":1128,"values":1161},"Survey sends a month","sends",{"starter":1131,"growth":1132,"business":1162,"enterprise":1163},30000,{"custom":610},{"key":1165,"label":1166,"unit":1167,"enforced":610,"kind":1128,"values":1168},"campaign_digests","Campaigns with their own AI digest","campaigns",{"starter":1169,"growth":130,"business":1138,"enterprise":1170},0,{"unlimited":610},{"key":1172,"label":1173,"enforced":610,"kind":1174,"values":1175},"custom_sending_domain","Custom sending domain","feature",{"starter":1020,"growth":610,"business":610,"enterprise":610},{"key":1177,"label":1178,"rows":1179},"automation","Automation",[1180,1188],{"key":1181,"label":1182,"unit":1183,"enforced":610,"kind":1128,"values":1184},"alert_rules","Alert rules","rules",{"starter":100,"growth":1185,"business":1186,"enterprise":1187},25,100,{"custom":610},{"key":1189,"label":1190,"unit":1191,"enforced":610,"kind":1128,"values":1192},"webhook_endpoints","Webhook endpoints","endpoints",{"starter":55,"growth":100,"business":1193,"enterprise":1194},20,{"custom":610},{"key":1196,"label":1197,"rows":1198},"integrations","Integrations",[1199,1203,1207,1211],{"key":1200,"label":1201,"enforced":610,"kind":1174,"values":1202},"integration.slack","Slack",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1204,"label":1205,"enforced":610,"kind":1174,"values":1206},"integration.teams","Microsoft Teams",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1208,"label":1209,"enforced":610,"kind":1174,"values":1210},"integration.stripe","Stripe",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1212,"label":1213,"enforced":610,"kind":1174,"values":1214},"integration.zendesk","Zendesk",{"starter":1020,"growth":610,"business":610,"enterprise":610},{"key":1216,"label":1217,"rows":1218},"access","Access and API",[1219,1225,1231,1237,1243,1252],{"key":1220,"label":1221,"unit":1222,"enforced":610,"kind":1128,"values":1223},"service_accounts","Service accounts","accounts",{"starter":55,"growth":100,"business":1193,"enterprise":1224},{"custom":610},{"key":1226,"label":1227,"unit":1228,"enforced":610,"kind":1128,"values":1229},"public_keys","Public keys","keys",{"starter":55,"growth":100,"business":130,"enterprise":1230},{"custom":610},{"key":1232,"label":1233,"unit":1234,"enforced":610,"kind":1128,"values":1235},"connected_apps","Connected assistants","apps",{"starter":74,"growth":130,"business":1138,"enterprise":1236},{"unlimited":610},{"key":1238,"label":1239,"unit":1240,"enforced":610,"kind":1128,"values":1241},"custom_roles","Custom roles","roles",{"starter":1169,"growth":74,"business":130,"enterprise":1242},{"unlimited":610},{"key":1244,"label":1245,"unit":1246,"enforced":610,"kind":1247,"values":1248},"api_rpm","API requests a minute per key","requests","rate",{"starter":1140,"growth":1249,"business":1250,"enterprise":1251},1000,3000,{"custom":610},{"key":1253,"label":1254,"unit":1246,"enforced":610,"kind":1247,"values":1255},"mcp_rpm","Assistant requests a minute per app",{"starter":1256,"growth":1140,"business":1257,"enterprise":1258},120,600,{"custom":610},{"key":1260,"label":1261,"rows":1262},"security","Security and compliance",[1263,1271,1275,1281,1286,1290,1294],{"key":1264,"label":1265,"unit":1266,"enforced":610,"kind":1128,"values":1267},"audit_retention_days","Audit log retention","days",{"starter":1152,"growth":1268,"business":1269,"enterprise":1270},90,365,{"custom":610},{"key":1272,"label":1273,"enforced":610,"kind":1174,"values":1274},"audit_api","Audit log API",{"starter":1020,"growth":1020,"business":610,"enterprise":610},{"key":1276,"label":1277,"enforced":610,"kind":1174,"values":1278},"sso","Single sign-on (OIDC, SAML)",{"starter":1020,"growth":1020,"business":1279,"enterprise":610},{"addon":1280},"sso_connection",{"key":1282,"label":1283,"enforced":610,"kind":1174,"values":1284},"sso.domains","Verified sign-in domains",{"starter":1020,"growth":1020,"business":1285,"enterprise":610},{"addon":1280},{"key":1287,"label":1288,"enforced":610,"kind":1174,"values":1289},"sso.enforcement","Enforced single sign-on and domain capture",{"starter":1020,"growth":1020,"business":1020,"enterprise":610},{"key":1291,"label":1292,"enforced":610,"kind":1174,"values":1293},"scim","SCIM user provisioning",{"starter":1020,"growth":1020,"business":1020,"enterprise":610},{"key":1295,"label":1296,"enforced":610,"kind":1174,"values":1297},"session_policy","Configurable session limits",{"starter":1020,"growth":1020,"business":1020,"enterprise":610},{"key":1299,"label":1300,"rows":1301},"platform","Platform",[1302,1310,1314,1318,1322,1326,1329,1333,1337],{"key":1303,"label":1304,"enforced":1020,"kind":1174,"values":1305},"team_members","Team members",{"starter":1306,"growth":1307,"business":1308,"enterprise":1309},{"unlimited":610},{"unlimited":610},{"unlimited":610},{"unlimited":610},{"key":1311,"label":1312,"enforced":1020,"kind":1174,"values":1313},"surveys","NPS, CSAT, CES and eNPS surveys",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1315,"label":1316,"enforced":1020,"kind":1174,"values":1317},"metrics","Metrics and reports",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1319,"label":1320,"enforced":1020,"kind":1174,"values":1321},"dashboard_widgets","Dashboards and widgets",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1323,"label":1324,"enforced":1020,"kind":1174,"values":1325},"groups","Groups and accounts",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1327,"label":362,"enforced":1020,"kind":1174,"values":1328},"rest_api",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1330,"label":1331,"enforced":1020,"kind":1174,"values":1332},"mcp","AI assistant access",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1334,"label":1335,"enforced":1020,"kind":1174,"values":1336},"global_search","Global search",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1338,"label":1339,"enforced":1020,"kind":1174,"values":1340},"saved_views","Saved views",{"starter":610,"growth":610,"business":610,"enterprise":610},{"key":1342,"label":1343,"rows":1344},"support","Support and terms",[1345,1352,1359,1365,1371],{"key":1342,"label":1346,"enforced":1020,"kind":1347,"values":1348},"Support","text",{"starter":1349,"growth":1349,"business":1350,"enterprise":1351},"Email","Priority email","Named contact",{"key":1353,"label":1354,"enforced":1020,"kind":1347,"values":1355},"security_paperwork","Security questionnaire and DPA",{"starter":1356,"growth":1356,"business":1357,"enterprise":1358},"Standard DPA","Standard DPA and questionnaire","Reviewed with your team",{"key":1360,"label":1361,"enforced":1020,"kind":1347,"values":1362},"sla","Service level agreement",{"starter":1363,"growth":1363,"business":1363,"enterprise":1364},"None","By contract",{"key":1366,"label":1367,"enforced":1020,"kind":1347,"values":1368},"billing_terms","Billing",{"starter":1369,"growth":1369,"business":1369,"enterprise":1370},"Card","Invoice",{"key":1372,"label":1373,"enforced":1020,"kind":1347,"values":1374},"contract","Contract",{"starter":1375,"growth":1375,"business":1375,"enterprise":1376},"Online terms","Custom contract",[1378,1388,1400],{"key":1280,"label":1379,"available_on":1380,"max_quantity":41,"price":1381,"grants":1386},"SSO connection",[1104],{"monthly":1382,"annual":1384},{"amount_minor":1383,"currency":1068},7900,{"amount_minor":1385,"currency":1068},79000,{"features":1387},[1276],{"key":1389,"label":1390,"available_on":1391,"max_quantity":74,"price":1392,"grants":1397},"people_pack_5k","People pack (+5,000)",[1104],{"monthly":1393,"annual":1395},{"amount_minor":1394,"currency":1068},7500,{"amount_minor":1396,"currency":1068},75000,{"limits":1398},{"people":1399},5000,{"key":1401,"label":1402,"available_on":1403,"max_quantity":130,"price":1404,"grants":1408},"send_pack_10k","Send pack (+10,000 a month)",[1104],{"monthly":1405,"annual":1406},{"amount_minor":1131,"currency":1068},{"amount_minor":1407,"currency":1068},25000,{"limits":1409},{"sends_per_month":1132},{"sends":1411},{"per_1000":1412,"applies_to_plans":1414},{"amount_minor":1413,"currency":1068},250,[1079,1093,1104],1793908068977]