[{"data":1,"prerenderedAt":869},["ShallowReactive",2],{"docs-nav":3,"docs-\u002Fdocs\u002Fapi\u002Fsubscribers":70},[4,10,14,19,23,26,29,33,36,40,43,47,50,54,58,62,66],{"title":5,"path":6,"order":7,"section":8,"group":9},"Concepts","\u002Fdocs\u002Fapi\u002Fconcepts",1,"api",null,{"title":11,"path":12,"order":7,"section":13,"group":9},"Introduction","\u002Fdocs","general",{"title":15,"path":16,"order":7,"section":17,"group":18},"Usage","\u002Fdocs\u002Fsdk\u002Fusage","sdk","Script",{"title":20,"path":21,"order":22,"section":8,"group":9},"\u002Fv1\u002Fme","\u002Fdocs\u002Fapi\u002Fme",2,{"title":24,"path":25,"order":22,"section":13,"group":9},"Getting started","\u002Fdocs\u002Fgetting-started",{"title":24,"path":27,"order":22,"section":17,"group":28},"\u002Fdocs\u002Fsdk\u002Fpackage","Package",{"title":30,"path":31,"order":32,"section":8,"group":9},"\u002Fv1\u002Fsubscribe","\u002Fdocs\u002Fapi\u002Fsubscribe",3,{"title":34,"path":35,"order":32,"section":17,"group":28},"Browser client","\u002Fdocs\u002Fsdk\u002Fpackage\u002Fclient",{"title":37,"path":38,"order":39,"section":8,"group":9},"\u002Fv1\u002Funsubscribe","\u002Fdocs\u002Fapi\u002Funsubscribe",4,{"title":41,"path":42,"order":39,"section":17,"group":28},"Server client","\u002Fdocs\u002Fsdk\u002Fpackage\u002Fserver",{"title":44,"path":45,"order":46,"section":8,"group":9},"\u002Fv1\u002Fevents","\u002Fdocs\u002Fapi\u002Fevents",5,{"title":48,"path":49,"order":46,"section":17,"group":28},"Types","\u002Fdocs\u002Fsdk\u002Fpackage\u002Ftypes",{"title":51,"path":52,"order":53,"section":8,"group":9},"\u002Fv1\u002Fsend","\u002Fdocs\u002Fapi\u002Fsend",6,{"title":55,"path":56,"order":57,"section":8,"group":9},"\u002Fv1\u002Fbroadcasts","\u002Fdocs\u002Fapi\u002Fbroadcasts",7,{"title":59,"path":60,"order":61,"section":8,"group":9},"\u002Fv1\u002Fgroups","\u002Fdocs\u002Fapi\u002Fgroups",8,{"title":63,"path":64,"order":65,"section":8,"group":9},"\u002Fv1\u002Fsubscribers","\u002Fdocs\u002Fapi\u002Fsubscribers",9,{"title":67,"path":68,"order":69,"section":8,"group":9},"Webhooks","\u002Fdocs\u002Fapi\u002Fwebhooks",10,{"id":71,"title":63,"apiModule":9,"body":72,"description":862,"extension":863,"generated":864,"group":9,"meta":865,"navigation":677,"order":65,"path":64,"section":8,"seo":866,"stem":867,"__hash__":868},"docs\u002Fdocs\u002Fapi\u002Fsubscribers.md",{"type":73,"value":74,"toc":855},"minimark",[75,82,92,99,120,123,130,140,146,151,193,198,229,238,270,279,281,287,300,305,311,316,346,350,365,371,393,398,411,413,419,424,429,433,437,456,470,475,573,579,581,585,588,806,810,813,843,851],[76,77,79],"h1",{"id":78},"v1subscribers",[80,81,63],"code",{},[83,84,85,86,91],"p",{},"Bearer auth. See ",[87,88,90],"a",{"href":89},"\u002Fdocs\u002Fapi\u002Fconcepts#authentication","Concepts → Authentication",".",[83,93,94,95,91],{},"These endpoints exist primarily to honour GDPR data-subject requests. Under GDPR you (the data controller) own the relationship with your end users; LitePush is the data processor. When one of your users invokes their rights, you handle the request — these calls let you satisfy it. The full controller-processor terms are in the ",[87,96,98],{"href":97},"\u002Fdpa","Data Processing Addendum",[100,101,102],"blockquote",{},[83,103,104,105,109,110,115,116,119],{},"For ",[106,107,108],"strong",{},"restriction \u002F objection"," (stop delivery without deleting history), use the project-authed ",[87,111,112],{"href":38},[80,113,114],{},"POST \u002Fv1\u002Funsubscribe"," instead — it flips ",[80,117,118],{},"status='unsubscribed'"," but keeps the row for analytics. The endpoints below hard-delete.",[121,122],"hr",{},[124,125,127],"h2",{"id":126},"delete-v1subscribersby-endpoint",[80,128,129],{},"DELETE \u002Fv1\u002Fsubscribers\u002Fby-endpoint",[83,131,132,135,136,139],{},[106,133,134],{},"What it does:"," Hard-deletes the subscriber row matching ",[80,137,138],{},"(project_id, endpoint)",". Event rows and group memberships cascade away via foreign key.",[83,141,142,145],{},[106,143,144],{},"When to use it:"," GDPR Article 17 (right to erasure) when the data subject hands you their device's push endpoint URL.",[83,147,148],{},[106,149,150],{},"Request body:",[152,153,154,173],"table",{},[155,156,157],"thead",{},[158,159,160,164,167,170],"tr",{},[161,162,163],"th",{},"Field",[161,165,166],{},"Type",[161,168,169],{},"Required",[161,171,172],{},"Description",[174,175,176],"tbody",{},[158,177,178,184,187,190],{},[179,180,181],"td",{},[80,182,183],{},"endpoint",[179,185,186],{},"string (URL, ≤ 2048 chars)",[179,188,189],{},"yes",[179,191,192],{},"The push endpoint to delete.",[83,194,195],{},[106,196,197],{},"Example:",[199,200,205],"pre",{"className":201,"code":202,"language":203,"meta":204,"style":204},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X DELETE https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-endpoint \\\n  -H \"Authorization: Bearer lpk_live_xxxxxxxx\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"endpoint\": \"https:\u002F\u002Ffcm.googleapis.com\u002Ffcm\u002Fsend\u002FcZxJ...\" }'\n","sh","",[80,206,207,214,219,224],{"__ignoreMap":204},[208,209,211],"span",{"class":210,"line":7},"line",[208,212,213],{},"curl -X DELETE https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-endpoint \\\n",[208,215,216],{"class":210,"line":22},[208,217,218],{},"  -H \"Authorization: Bearer lpk_live_xxxxxxxx\" \\\n",[208,220,221],{"class":210,"line":32},[208,222,223],{},"  -H \"Content-Type: application\u002Fjson\" \\\n",[208,225,226],{"class":210,"line":39},[208,227,228],{},"  -d '{ \"endpoint\": \"https:\u002F\u002Ffcm.googleapis.com\u002Ffcm\u002Fsend\u002FcZxJ...\" }'\n",[83,230,231],{},[106,232,233,234,237],{},"Success — ",[80,235,236],{},"200 OK",":",[199,239,243],{"className":240,"code":241,"language":242,"meta":204,"style":204},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"deleted\": 1 }\n","json",[80,244,245],{"__ignoreMap":204},[208,246,247,251,254,258,261,263,267],{"class":210,"line":7},[208,248,250],{"class":249},"sMK4o","{",[208,252,253],{"class":249}," \"",[208,255,257],{"class":256},"spNyl","deleted",[208,259,260],{"class":249},"\"",[208,262,237],{"class":249},[208,264,266],{"class":265},"sbssI"," 1",[208,268,269],{"class":249}," }\n",[83,271,272,274,275,278],{},[80,273,257],{}," is ",[80,276,277],{},"0"," if no subscriber matched.",[121,280],{},[124,282,284],{"id":283},"delete-v1subscribersby-external-ideid",[80,285,286],{},"DELETE \u002Fv1\u002Fsubscribers\u002Fby-external-id\u002F:eid",[83,288,289,291,292,295,296,299],{},[106,290,134],{}," Hard-deletes ",[106,293,294],{},"every"," subscriber row in this project that carries the given ",[80,297,298],{},"external_id"," — covers users with multiple devices.",[83,301,302,304],{},[106,303,144],{}," GDPR Article 17 when you only have your own user ID and want to wipe their LitePush footprint in one call. Common pattern: wire this into your user-deletion handler so deleting a user in your DB also deletes them from LitePush.",[83,306,307,310],{},[106,308,309],{},"Authentication:"," Bearer.",[83,312,313],{},[106,314,315],{},"Path parameter:",[152,317,318,329],{},[155,319,320],{},[158,321,322,325,327],{},[161,323,324],{},"Param",[161,326,169],{},[161,328,172],{},[174,330,331],{},[158,332,333,338,340],{},[179,334,335],{},[80,336,337],{},":eid",[179,339,189],{},[179,341,342,343,345],{},"The ",[80,344,298],{}," you passed at subscribe time, URL-encoded. Max 256 chars; only letters, numbers, underscores, and hyphens.",[83,347,348],{},[106,349,197],{},[199,351,353],{"className":201,"code":352,"language":203,"meta":204,"style":204},"curl -X DELETE https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-external-id\u002Fuser_42 \\\n  -H \"Authorization: Bearer lpk_live_xxxxxxxx\"\n",[80,354,355,360],{"__ignoreMap":204},[208,356,357],{"class":210,"line":7},[208,358,359],{},"curl -X DELETE https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-external-id\u002Fuser_42 \\\n",[208,361,362],{"class":210,"line":22},[208,363,364],{},"  -H \"Authorization: Bearer lpk_live_xxxxxxxx\"\n",[83,366,367],{},[106,368,233,369,237],{},[80,370,236],{},[199,372,374],{"className":240,"code":373,"language":242,"meta":204,"style":204},"{ \"deleted\": 2 }\n",[80,375,376],{"__ignoreMap":204},[208,377,378,380,382,384,386,388,391],{"class":210,"line":7},[208,379,250],{"class":249},[208,381,253],{"class":249},[208,383,257],{"class":256},[208,385,260],{"class":249},[208,387,237],{"class":249},[208,389,390],{"class":265}," 2",[208,392,269],{"class":249},[83,394,395],{},[106,396,397],{},"Errors:",[399,400,401],"ul",{},[402,403,404,407,408,91],"li",{},[80,405,406],{},"400 invalid_external_id"," — empty, longer than 256 chars, or containing characters outside ",[80,409,410],{},"A–Z a–z 0–9 _ -",[121,412],{},[124,414,416],{"id":415},"get-v1subscribersexport",[80,417,418],{},"GET \u002Fv1\u002Fsubscribers\u002Fexport",[83,420,421,423],{},[106,422,134],{}," Streams a CSV of every active subscriber in the project, with their group memberships joined in.",[83,425,426,428],{},[106,427,144],{}," GDPR Article 20 (right to portability), bulk inspection, or your own data warehousing.",[83,430,431,310],{},[106,432,309],{},[83,434,435],{},[106,436,197],{},[199,438,440],{"className":201,"code":439,"language":203,"meta":204,"style":204},"curl https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fexport \\\n  -H \"Authorization: Bearer lpk_live_xxxxxxxx\" \\\n  -o subscribers.csv\n",[80,441,442,447,451],{"__ignoreMap":204},[208,443,444],{"class":210,"line":7},[208,445,446],{},"curl https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fexport \\\n",[208,448,449],{"class":210,"line":22},[208,450,218],{},[208,452,453],{"class":210,"line":32},[208,454,455],{},"  -o subscribers.csv\n",[83,457,458,462,463,466,467,91],{},[106,459,233,460,237],{},[80,461,236],{}," CSV body, ",[80,464,465],{},"Content-Type: text\u002Fcsv; charset=utf-8",", ",[80,468,469],{},"Content-Disposition: attachment; filename=\"litepush-subscribers-\u003Cproject_id>.csv\"",[83,471,472],{},[106,473,474],{},"CSV columns:",[152,476,477,487],{},[155,478,479],{},[158,480,481,484],{},[161,482,483],{},"Column",[161,485,486],{},"Notes",[174,488,489,503,512,521,540,550,559],{},[158,490,491,496],{},[179,492,493],{},[80,494,495],{},"id",[179,497,498,499,502],{},"LitePush subscriber ID (",[80,500,501],{},"sub_*",").",[158,504,505,509],{},[179,506,507],{},[80,508,298],{},[179,510,511],{},"Your user ID, or empty.",[158,513,514,518],{},[179,515,516],{},[80,517,183],{},[179,519,520],{},"Push gateway URL.",[158,522,523,528],{},[179,524,525],{},[80,526,527],{},"status",[179,529,530,533,534,533,537,91],{},[80,531,532],{},"active"," \u002F ",[80,535,536],{},"unsubscribed",[80,538,539],{},"failed",[158,541,542,547],{},[179,543,544],{},[80,545,546],{},"created_at",[179,548,549],{},"ISO 8601 timestamp.",[158,551,552,557],{},[179,553,554],{},[80,555,556],{},"last_seen_at",[179,558,549],{},[158,560,561,566],{},[179,562,563],{},[80,564,565],{},"groups",[179,567,568,569,572],{},"Group names joined with ",[80,570,571],{},";",". Empty if the subscriber is in no groups.",[83,574,575,576,91],{},"The dashboard exposes the same export under ",[106,577,578],{},"Project → Subscribers → Export CSV",[121,580],{},[124,582,584],{"id":583},"wiring-erasure-into-your-user-lifecycle","Wiring erasure into your user lifecycle",[83,586,587],{},"A common pattern — in your own user-deletion handler, also wipe the user's LitePush rows so they stop receiving pushes and we don't keep their endpoint URL:",[199,589,593],{"className":590,"code":591,"language":592,"meta":204,"style":204},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","async function deleteUser(userId: string) {\n  \u002F\u002F Your usual cleanup\n  await db.users.delete({ id: userId });\n\n  \u002F\u002F Also wipe their LitePush subscriber row(s). encodeURIComponent guards\n  \u002F\u002F against user IDs that happen to contain '\u002F', '&', or whitespace.\n  await fetch(\n    `https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-external-id\u002F${encodeURIComponent(userId)}`,\n    {\n      method: \"DELETE\",\n      headers: { Authorization: `Bearer ${process.env.LITEPUSH_API_KEY}` },\n    }\n  );\n}\n","ts",[80,594,595,626,632,673,679,684,689,699,723,728,744,786,792,800],{"__ignoreMap":204},[208,596,597,600,603,607,610,614,616,620,623],{"class":210,"line":7},[208,598,599],{"class":256},"async",[208,601,602],{"class":256}," function",[208,604,606],{"class":605},"s2Zo4"," deleteUser",[208,608,609],{"class":249},"(",[208,611,613],{"class":612},"sHdIc","userId",[208,615,237],{"class":249},[208,617,619],{"class":618},"sBMFI"," string",[208,621,622],{"class":249},")",[208,624,625],{"class":249}," {\n",[208,627,628],{"class":210,"line":22},[208,629,631],{"class":630},"sHwdD","  \u002F\u002F Your usual cleanup\n",[208,633,634,638,642,644,647,649,652,655,657,660,662,665,668,670],{"class":210,"line":32},[208,635,637],{"class":636},"s7zQu","  await",[208,639,641],{"class":640},"sTEyZ"," db",[208,643,91],{"class":249},[208,645,646],{"class":640},"users",[208,648,91],{"class":249},[208,650,651],{"class":605},"delete",[208,653,609],{"class":654},"swJcz",[208,656,250],{"class":249},[208,658,659],{"class":654}," id",[208,661,237],{"class":249},[208,663,664],{"class":640}," userId",[208,666,667],{"class":249}," }",[208,669,622],{"class":654},[208,671,672],{"class":249},";\n",[208,674,675],{"class":210,"line":39},[208,676,678],{"emptyLinePlaceholder":677},true,"\n",[208,680,681],{"class":210,"line":46},[208,682,683],{"class":630},"  \u002F\u002F Also wipe their LitePush subscriber row(s). encodeURIComponent guards\n",[208,685,686],{"class":210,"line":53},[208,687,688],{"class":630},"  \u002F\u002F against user IDs that happen to contain '\u002F', '&', or whitespace.\n",[208,690,691,693,696],{"class":210,"line":57},[208,692,637],{"class":636},[208,694,695],{"class":605}," fetch",[208,697,698],{"class":654},"(\n",[208,700,701,704,708,711,714,717,720],{"class":210,"line":61},[208,702,703],{"class":249},"    `",[208,705,707],{"class":706},"sfazB","https:\u002F\u002Fapi.litepush.dev\u002Fv1\u002Fsubscribers\u002Fby-external-id\u002F",[208,709,710],{"class":249},"${",[208,712,713],{"class":605},"encodeURIComponent",[208,715,716],{"class":640},"(userId)",[208,718,719],{"class":249},"}`",[208,721,722],{"class":249},",\n",[208,724,725],{"class":210,"line":65},[208,726,727],{"class":249},"    {\n",[208,729,730,733,735,737,740,742],{"class":210,"line":69},[208,731,732],{"class":654},"      method",[208,734,237],{"class":249},[208,736,253],{"class":249},[208,738,739],{"class":706},"DELETE",[208,741,260],{"class":249},[208,743,722],{"class":249},[208,745,747,750,752,755,758,760,763,766,768,771,773,776,778,781,783],{"class":210,"line":746},11,[208,748,749],{"class":654},"      headers",[208,751,237],{"class":249},[208,753,754],{"class":249}," {",[208,756,757],{"class":654}," Authorization",[208,759,237],{"class":249},[208,761,762],{"class":249}," `",[208,764,765],{"class":706},"Bearer ",[208,767,710],{"class":249},[208,769,770],{"class":640},"process",[208,772,91],{"class":249},[208,774,775],{"class":640},"env",[208,777,91],{"class":249},[208,779,780],{"class":640},"LITEPUSH_API_KEY",[208,782,719],{"class":249},[208,784,785],{"class":249}," },\n",[208,787,789],{"class":210,"line":788},12,[208,790,791],{"class":249},"    }\n",[208,793,795,798],{"class":210,"line":794},13,[208,796,797],{"class":654},"  )",[208,799,672],{"class":249},[208,801,803],{"class":210,"line":802},14,[208,804,805],{"class":249},"}\n",[124,807,809],{"id":808},"data-we-hold","Data we hold",[83,811,812],{},"For every active subscriber we store:",[399,814,815,818,828,831,837,840],{},[402,816,817],{},"Push endpoint URL (browser-issued)",[402,819,820,823,824,827],{},[80,821,822],{},"p256dh"," + ",[80,825,826],{},"auth"," encryption keys",[402,829,830],{},"User-Agent at subscribe time (diagnostics)",[402,832,833,834,836],{},"Optional ",[80,835,298],{}," you provided",[402,838,839],{},"Group memberships",[402,841,842],{},"Per-event metadata (broadcast id, delivery \u002F click \u002F failure timestamps)",[83,844,845,846,850],{},"We do not store IP addresses, names, or fingerprinting data. Full list in the ",[87,847,849],{"href":848},"\u002Fprivacy","Privacy Policy"," §3.",[852,853,854],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":204,"searchDepth":22,"depth":22,"links":856},[857,858,859,860,861],{"id":126,"depth":22,"text":129},{"id":283,"depth":22,"text":286},{"id":415,"depth":22,"text":418},{"id":583,"depth":22,"text":584},{"id":808,"depth":22,"text":809},"GDPR erasure and portability — hard-delete subscribers by endpoint or external_id, and export the project's subscribers as CSV.","md",false,{},{"title":63,"description":862},"docs\u002Fapi\u002Fsubscribers","-LYq4eRYYGUogPMp5RygDtq8E-f5B3xlUVJ1wE1ecu8",1780560203630]