[{"data":1,"prerenderedAt":796},["ShallowReactive",2],{"content-\u002Fchangelog\u002F2026-06-04-customers-rename":3},{"id":4,"title":5,"author":6,"beta":7,"body":8,"categories":6,"category":781,"categoryType":782,"date":783,"description":784,"extension":785,"isBlog":7,"isChangelog":457,"meta":786,"navigation":457,"path":791,"rawbody":792,"seo":793,"stem":794,"thumbnail":6,"__hash__":795},"content\u002Fchangelog\u002F2026-06-04-customers-rename.md","\"Receivers\" renamed to \"Customers\"",null,false,{"type":9,"value":10,"toc":763},"minimark",[11,15,20,76,80,89,99,102,106,126,188,205,211,215,218,246,261,276,280,405,414,433,436,469,473,519,523,580,584,590,622,628,632,635,674,678,683,704,708,711,715,723,727,738,742,759],[12,13,14],"p",{},"We're renaming \"Receivers\" to \"Customers\" across the entire BlindPay platform: API endpoints, SDKs, documentation, and dashboard.",[16,17,19],"h2",{"id":18},"tldr","TL;DR",[21,22,23,36,49,58,65],"ul",{},[24,25,26,27,31,32,35],"li",{},"All ",[28,29,30],"code",{},"\u002Freceivers"," endpoints now have ",[28,33,34],{},"\u002Fcustomers"," equivalents",[24,37,38,39,41,42,44,45],{},"Both ",[28,40,30],{}," and ",[28,43,34],{}," paths work identically through ",[46,47,48],"strong",{},"July 3, 2026",[24,50,51,52,54,55],{},"After that date, ",[28,53,30],{}," endpoints return ",[28,56,57],{},"301 Moved Permanently",[24,59,60,61,64],{},"IDs stay the same (",[28,62,63],{},"re_"," prefix), no data migration needed",[24,66,67,68,71,72,75],{},"SDKs add a ",[28,69,70],{},"customers"," accessor to their current majors and ",[28,73,74],{},"receivers"," is deprecated alongside, no import changes required",[16,77,79],{"id":78},"what-changed","What changed",[12,81,82,83,85,86,88],{},"Every API endpoint that previously used ",[28,84,30],{}," in its path now has a ",[28,87,34],{}," equivalent:",[90,91,96],"pre",{"className":92,"code":94,"language":95},[93],"language-text","GET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers                →  GET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\nPOST   \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers                →  POST   \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\nGET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  GET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\nPUT    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  PUT    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\nDELETE \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  DELETE \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\n","text",[28,97,94],{"__ignoreMap":98},"",[12,100,101],{},"This applies to all sub-resources too: bank accounts, wallets, virtual accounts, blockchain wallets, offramp wallets, and limit increases.",[16,103,105],{"id":104},"response-changes","Response changes",[12,107,108,109,111,112,114,115,118,119,121,122,125],{},"During the transition period, every customer record returned by either ",[28,110,34],{}," or ",[28,113,30],{}," carries a ",[28,116,117],{},"customer_id"," alias of its primary key. The underlying ID still uses the ",[28,120,63],{}," prefix and remains in the ",[28,123,124],{},"id"," field:",[90,127,131],{"className":128,"code":129,"language":130,"meta":98,"style":98},"language-json shiki shiki-themes github-light","{\n  \"id\": \"re_abc123456789\",\n  \"customer_id\": \"re_abc123456789\",\n  \"first_name\": \"Alice\"\n}\n","json",[28,132,133,142,159,171,182],{"__ignoreMap":98},[134,135,138],"span",{"class":136,"line":137},"line",1,[134,139,141],{"class":140},"sgsFI","{\n",[134,143,145,149,152,156],{"class":136,"line":144},2,[134,146,148],{"class":147},"sYu0t","  \"id\"",[134,150,151],{"class":140},": ",[134,153,155],{"class":154},"sYBdl","\"re_abc123456789\"",[134,157,158],{"class":140},",\n",[134,160,162,165,167,169],{"class":136,"line":161},3,[134,163,164],{"class":147},"  \"customer_id\"",[134,166,151],{"class":140},[134,168,155],{"class":154},[134,170,158],{"class":140},[134,172,174,177,179],{"class":136,"line":173},4,[134,175,176],{"class":147},"  \"first_name\"",[134,178,151],{"class":140},[134,180,181],{"class":154},"\"Alice\"\n",[134,183,185],{"class":136,"line":184},5,[134,186,187],{"class":140},"}\n",[12,189,190,191,41,194,196,197,200,201,204],{},"Payouts and payins that reference a customer expose both ",[28,192,193],{},"receiver_id",[28,195,117],{}," foreign-key fields during the transition; either accepts the same ",[28,198,199],{},"re_*"," value. Sub-resources scoped under ",[28,202,203],{},"\u002Fcustomers\u002F{id}\u002F…"," (bank accounts, wallets, virtual accounts, blockchain wallets, offramp wallets) derive the parent from the URL, so no FK alias appears in the response body.",[12,206,207,208,210],{},"After the sunset, the ",[28,209,117],{}," alias becomes the canonical field name across the API.",[16,212,214],{"id":213},"webhook-changes","Webhook changes",[12,216,217],{},"Three new webhook events fire alongside the existing ones:",[21,219,220,230,238],{},[24,221,222,225,226,229],{},[28,223,224],{},"customer.new",": fires whenever ",[28,227,228],{},"receiver.new"," fires",[24,231,232,225,235,229],{},[28,233,234],{},"customer.update",[28,236,237],{},"receiver.update",[24,239,240,225,243,229],{},[28,241,242],{},"customer.delete",[28,244,245],{},"receiver.delete",[12,247,248,249,256,257,260],{},"You ",[46,250,251,252,255],{},"must subscribe to ",[28,253,254],{},"customer.*"," before July 3, 2026",". After the sunset, ",[28,258,259],{},"receiver.*"," events stop firing entirely. If you don't migrate, your endpoint goes silent.",[12,262,263,264,266,267,269,270,272,273,275],{},"During the transition window (June 4 → July 3), every create and update emits both events: the legacy ",[28,265,259],{}," and its ",[28,268,254],{}," counterpart. If your endpoint is subscribed to both, your handler receives the same action twice. We intentionally dual-emit so you can migrate your handlers in any order, but make sure your processing is idempotent on the resource id, or drop the ",[28,271,259],{}," subscription once ",[28,274,254],{}," is wired up.",[16,277,279],{"id":278},"sdk-updates","SDK updates",[281,282,283,299],"table",{},[284,285,286],"thead",{},[287,288,289,293,296],"tr",{},[290,291,292],"th",{},"SDK",[290,294,295],{},"Now (transition)",[290,297,298],{},"At\u002Fafter sunset",[300,301,302,327,344,368,386],"tbody",{},[287,303,304,308,321],{},[305,306,307],"td",{},"Node.js",[305,309,310,311,313,314,316,317,320],{},"Minor release adds ",[28,312,70],{},", marks ",[28,315,74],{}," ",[28,318,319],{},"@deprecated"," in JSDoc.",[305,322,323,324,326],{},"Next major (4.0.0) removes ",[28,325,74],{},".",[287,328,329,332,339],{},[305,330,331],{},"Python",[305,333,310,334,313,336,338],{},[28,335,70],{},[28,337,74],{}," deprecated with warning.",[305,340,341,342,326],{},"Next major (2.0.0) removes ",[28,343,74],{},[287,345,346,349,360],{},[305,347,348],{},"Go",[305,350,310,351,353,354,357,358,326],{},[28,352,70],{}," package, ",[28,355,356],{},"\u002F\u002F Deprecated:"," on ",[28,359,74],{},[305,361,362,316,365,367],{},[46,363,364],{},"No v2 planned for this rename.",[28,366,74],{}," stays as a deprecated forwarder in v1.",[287,369,370,373,382],{},[305,371,372],{},"PHP",[305,374,310,375,313,377,316,379,381],{},[28,376,70],{},[28,378,74],{},[28,380,319],{}," in PHPDoc.",[305,383,341,384,326],{},[28,385,74],{},[287,387,388,391,401],{},[305,389,390],{},"Swift",[305,392,310,393,395,396,357,399,326],{},[28,394,70],{},", ",[28,397,398],{},"@available(*, deprecated)",[28,400,74],{},[305,402,341,403,326],{},[28,404,74],{},[12,406,407,408,410,411,413],{},"No import path changes during the transition. Just update to the latest version of your current major and the ",[28,409,70],{}," accessor is there. For Node, Python, PHP, and Swift, a future major release (after sunset) removes the deprecated ",[28,412,74],{}," surface; that's when imports change in those SDKs.",[12,415,416,316,419,421,422,395,425,428,429,432],{},[46,417,418],{},"Go is treated differently.",[28,420,74],{}," stays as a thin deprecated forwarder in v1 indefinitely. ",[28,423,424],{},"gopls",[28,426,427],{},"staticcheck SA1019",", and ",[28,430,431],{},"godoc"," will flag usage; nothing breaks.",[12,434,435],{},"Method signatures are unchanged. Only the resource accessor renames. For most projects this is a single find\u002Freplace. Example in Node.js SDK:",[90,437,441],{"className":438,"code":439,"language":440,"meta":98,"style":98},"language-diff shiki shiki-themes github-light","- await blindpay.receivers.list()\n+ await blindpay.customers.list()\n\n- await blindpay.receivers.bankAccounts.create({ ... })\n+ await blindpay.customers.bankAccounts.create({ ... })\n","diff",[28,442,443,448,453,459,464],{"__ignoreMap":98},[134,444,445],{"class":136,"line":137},[134,446,447],{},"- await blindpay.receivers.list()\n",[134,449,450],{"class":136,"line":144},[134,451,452],{},"+ await blindpay.customers.list()\n",[134,454,455],{"class":136,"line":161},[134,456,458],{"emptyLinePlaceholder":457},true,"\n",[134,460,461],{"class":136,"line":173},[134,462,463],{},"- await blindpay.receivers.bankAccounts.create({ ... })\n",[134,465,466],{"class":136,"line":184},[134,467,468],{},"+ await blindpay.customers.bankAccounts.create({ ... })\n",[16,470,472],{"id":471},"what-you-need-to-do","What you need to do",[474,475,476,487,499,510],"ol",{},[24,477,478,481,482,484,485],{},[46,479,480],{},"Update your API calls"," to use ",[28,483,34],{}," instead of ",[28,486,30],{},[24,488,489,492,493,495,496,498],{},[46,490,491],{},"Update field references"," from ",[28,494,193],{}," to ",[28,497,117],{}," in your code",[24,500,501,481,504,395,506,428,508],{},[46,502,503],{},"Update webhook subscriptions",[28,505,224],{},[28,507,234],{},[28,509,242],{},[24,511,512,515,516,518],{},[46,513,514],{},"Update your SDK"," to the latest version of its current major. The ",[28,517,70],{}," accessor is added there, no import changes required",[16,520,522],{"id":521},"timeline","Timeline",[21,524,525,549,566],{},[24,526,527,151,530,532,533,41,535,537,538,41,541,544,545,548],{},[46,528,529],{},"June 4, 2026",[28,531,34],{}," endpoints live. Both ",[28,534,30],{},[28,536,34],{}," accept requests. Receiver responses include ",[28,539,540],{},"Deprecation: true",[28,542,543],{},"Sunset: Fri, 03 Jul 2026 00:00:00 GMT"," headers, plus a ",[28,546,547],{},"Link: rel=\"successor-version\""," pointing to the customer equivalent.",[24,550,551,553,554,54,556,558,559,561,562,565],{},[46,552,48],{},": Sunset date. ",[28,555,30],{},[28,557,57],{}," redirecting to ",[28,560,34],{},". SDK code calling ",[28,563,564],{},"receivers.*"," continues to work via the redirect.",[24,567,568,151,571,573,574,576,577,579],{},[46,569,570],{},"Later",[28,572,30],{}," endpoints removed entirely. New SDK majors ship for Node (v4), Python (v2), PHP (v2), and Swift (v2), dropping the deprecated ",[28,575,74],{}," surface. The Go SDK keeps ",[28,578,74],{}," as a deprecated forwarder in v1; no v2 planned for this rename. Previous SDK majors enter maintenance mode (security fixes only).",[16,581,583],{"id":582},"detect-deprecation-programmatically","Detect deprecation programmatically",[12,585,586,587,589],{},"Every ",[28,588,30],{}," response carries deprecation metadata you can monitor in tests or runtime logs:",[90,591,595],{"className":592,"code":593,"language":594,"meta":98,"style":98},"language-http shiki shiki-themes github-light","HTTP\u002F1.1 200 OK\nDeprecation: true\nSunset: Fri, 03 Jul 2026 00:00:00 GMT\nLink: \u003C\u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers>; rel=\"successor-version\"\nContent-Type: application\u002Fjson\n","http",[28,596,597,602,607,612,617],{"__ignoreMap":98},[134,598,599],{"class":136,"line":137},[134,600,601],{},"HTTP\u002F1.1 200 OK\n",[134,603,604],{"class":136,"line":144},[134,605,606],{},"Deprecation: true\n",[134,608,609],{"class":136,"line":161},[134,610,611],{},"Sunset: Fri, 03 Jul 2026 00:00:00 GMT\n",[134,613,614],{"class":136,"line":173},[134,615,616],{},"Link: \u003C\u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers>; rel=\"successor-version\"\n",[134,618,619],{"class":136,"line":184},[134,620,621],{},"Content-Type: application\u002Fjson\n",[12,623,624,625,627],{},"Useful in CI: fail a smoke test if production traffic still hits ",[28,626,540],{}," endpoints close to the sunset date.",[16,629,631],{"id":630},"verification-checklist","Verification checklist",[12,633,634],{},"Before considering your migration complete:",[21,636,637,644,650,659,665,668],{},[24,638,639,640,643],{},"Logs show zero requests to ",[28,641,642],{},"\u002Fv1\u002Finstances\u002F*\u002Freceivers*"," paths from your services",[24,645,646,647,649],{},"CI \u002F monitoring asserts no ",[28,648,540],{}," header on production responses",[24,651,652,653,395,655,428,657],{},"Webhook handlers process ",[28,654,224],{},[28,656,234],{},[28,658,242],{},[24,660,661,662],{},"No code paths reference ",[28,663,664],{},"response.receiver_id",[24,666,667],{},"SDK updated to the latest minor release of its current major",[24,669,670,671],{},"Saved dashboard URLs use ",[28,672,673],{},"\u002Fcustomers\u002F",[16,675,677],{"id":676},"faq","FAQ",[679,680,682],"h3",{"id":681},"what-if-i-dont-migrate-before-july-3-2026","What if I don't migrate before July 3, 2026?",[12,684,685,687,688,690,691,693,694,395,697,395,700,703],{},[28,686,30],{}," paths return ",[28,689,57],{}," pointing to the equivalent ",[28,692,34],{}," URL. Most HTTP clients (browsers, ",[28,695,696],{},"curl",[28,698,699],{},"requests",[28,701,702],{},"axios",", official SDKs, Postman) follow redirects automatically, so traffic keeps working, but you spend an extra round-trip per call and rely on redirect semantics. Migrate before that date.",[679,705,707],{"id":706},"can-i-migrate-one-resource-group-at-a-time","Can I migrate one resource group at a time?",[12,709,710],{},"Yes. The customer mirrors are independent per resource group (customers, bank accounts, wallets, virtual accounts, etc.). You can switch your customer-creation flow over this week and your bank-account-creation flow next week without coordination. Each endpoint accepts the new path independently.",[679,712,714],{"id":713},"will-i-get-duplicate-webhook-events-during-the-transition","Will I get duplicate webhook events during the transition?",[12,716,717,718,41,720,722],{},"Yes, every create and update emits both ",[28,719,259],{},[28,721,254],{}," if you are subscribed to both. We dual-emit so you can migrate handlers in any order. Subscribe to one set or the other to avoid handling the same event twice.",[679,724,726],{"id":725},"do-i-need-to-migrate-my-stored-ids","Do I need to migrate my stored IDs?",[12,728,729,730,732,733,41,735,737],{},"No. All IDs keep the ",[28,731,63],{}," prefix. The same ID works with both ",[28,734,30],{},[28,736,34],{}," endpoints. We are renaming the API surface, not the underlying resource.",[679,739,741],{"id":740},"how-do-i-report-issues-with-the-migration","How do I report issues with the migration?",[12,743,744,745,750,751,754,755,758],{},"Use the feedback button in the dashboard (under your profile dropdown) or email ",[746,747,749],"a",{"href":748},"mailto:support@blindpay.com","support@blindpay.com"," with ",[28,752,753],{},"migration"," in the subject. Including the request ID from a deprecated response (",[28,756,757],{},"x-blindpay-request-id"," header) speeds up the lookup.",[760,761,762],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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);}",{"title":98,"searchDepth":144,"depth":144,"links":764},[765,766,767,768,769,770,771,772,773,774],{"id":18,"depth":144,"text":19},{"id":78,"depth":144,"text":79},{"id":104,"depth":144,"text":105},{"id":213,"depth":144,"text":214},{"id":278,"depth":144,"text":279},{"id":471,"depth":144,"text":472},{"id":521,"depth":144,"text":522},{"id":582,"depth":144,"text":583},{"id":630,"depth":144,"text":631},{"id":676,"depth":144,"text":677,"children":775},[776,777,778,779,780],{"id":681,"depth":161,"text":682},{"id":706,"depth":161,"text":707},{"id":713,"depth":161,"text":714},{"id":725,"depth":161,"text":726},{"id":740,"depth":161,"text":741},"Migration","update","2026-06-04","We're renaming \"Receivers\" to \"Customers\" across the entire BlindPay platform. Both endpoints will work during a 1-month transition period.","md",{"excerpt":787},{"type":9,"value":788},[789],[12,790,14],{},"\u002Fchangelog\u002F2026-06-04-customers-rename","---\ntitle: '\"Receivers\" renamed to \"Customers\"'\ndescription: We're renaming \"Receivers\" to \"Customers\" across the entire BlindPay platform. Both endpoints will work during a 1-month transition period.\ndate: 2026-06-04\ncategory: Migration\ncategoryType: update\nisChangelog: true\n---\n\nWe're renaming \"Receivers\" to \"Customers\" across the entire BlindPay platform: API endpoints, SDKs, documentation, and dashboard.\n\n\u003C!--more-->\n\n## TL;DR\n\n- All `\u002Freceivers` endpoints now have `\u002Fcustomers` equivalents\n- Both `\u002Freceivers` and `\u002Fcustomers` paths work identically through **July 3, 2026**\n- After that date, `\u002Freceivers` endpoints return `301 Moved Permanently`\n- IDs stay the same (`re_` prefix), no data migration needed\n- SDKs add a `customers` accessor to their current majors and `receivers` is deprecated alongside, no import changes required\n\n## What changed\n\nEvery API endpoint that previously used `\u002Freceivers` in its path now has a `\u002Fcustomers` equivalent:\n\n```\nGET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers                →  GET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\nPOST   \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers                →  POST   \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\nGET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  GET    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\nPUT    \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  PUT    \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\nDELETE \u002Fv1\u002Finstances\u002F{instance_id}\u002Freceivers\u002F{receiver_id}  →  DELETE \u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers\u002F{customer_id}\n```\n\nThis applies to all sub-resources too: bank accounts, wallets, virtual accounts, blockchain wallets, offramp wallets, and limit increases.\n\n## Response changes\n\nDuring the transition period, every customer record returned by either `\u002Fcustomers` or `\u002Freceivers` carries a `customer_id` alias of its primary key. The underlying ID still uses the `re_` prefix and remains in the `id` field:\n\n```json\n{\n  \"id\": \"re_abc123456789\",\n  \"customer_id\": \"re_abc123456789\",\n  \"first_name\": \"Alice\"\n}\n```\n\nPayouts and payins that reference a customer expose both `receiver_id` and `customer_id` foreign-key fields during the transition; either accepts the same `re_*` value. Sub-resources scoped under `\u002Fcustomers\u002F{id}\u002F…` (bank accounts, wallets, virtual accounts, blockchain wallets, offramp wallets) derive the parent from the URL, so no FK alias appears in the response body.\n\nAfter the sunset, the `customer_id` alias becomes the canonical field name across the API.\n\n## Webhook changes\n\nThree new webhook events fire alongside the existing ones:\n\n- `customer.new`: fires whenever `receiver.new` fires\n- `customer.update`: fires whenever `receiver.update` fires\n- `customer.delete`: fires whenever `receiver.delete` fires\n\nYou **must subscribe to `customer.*` before July 3, 2026**. After the sunset, `receiver.*` events stop firing entirely. If you don't migrate, your endpoint goes silent.\n\nDuring the transition window (June 4 → July 3), every create and update emits both events: the legacy `receiver.*` and its `customer.*` counterpart. If your endpoint is subscribed to both, your handler receives the same action twice. We intentionally dual-emit so you can migrate your handlers in any order, but make sure your processing is idempotent on the resource id, or drop the `receiver.*` subscription once `customer.*` is wired up.\n\n## SDK updates\n\n| SDK     | Now (transition)                                                            | At\u002Fafter sunset                                                                       |\n| ------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |\n| Node.js | Minor release adds `customers`, marks `receivers` `@deprecated` in JSDoc.   | Next major (4.0.0) removes `receivers`.                                               |\n| Python  | Minor release adds `customers`, marks `receivers` deprecated with warning.  | Next major (2.0.0) removes `receivers`.                                               |\n| Go      | Minor release adds `customers` package, `\u002F\u002F Deprecated:` on `receivers`.    | **No v2 planned for this rename.** `receivers` stays as a deprecated forwarder in v1. |\n| PHP     | Minor release adds `customers`, marks `receivers` `@deprecated` in PHPDoc.  | Next major (2.0.0) removes `receivers`.                                               |\n| Swift   | Minor release adds `customers`, `@available(*, deprecated)` on `receivers`. | Next major (2.0.0) removes `receivers`.                                               |\n\nNo import path changes during the transition. Just update to the latest version of your current major and the `customers` accessor is there. For Node, Python, PHP, and Swift, a future major release (after sunset) removes the deprecated `receivers` surface; that's when imports change in those SDKs.\n\n**Go is treated differently.** `receivers` stays as a thin deprecated forwarder in v1 indefinitely. `gopls`, `staticcheck SA1019`, and `godoc` will flag usage; nothing breaks.\n\nMethod signatures are unchanged. Only the resource accessor renames. For most projects this is a single find\u002Freplace. Example in Node.js SDK:\n\n```diff\n- await blindpay.receivers.list()\n+ await blindpay.customers.list()\n\n- await blindpay.receivers.bankAccounts.create({ ... })\n+ await blindpay.customers.bankAccounts.create({ ... })\n```\n\n## What you need to do\n\n1. **Update your API calls** to use `\u002Fcustomers` instead of `\u002Freceivers`\n2. **Update field references** from `receiver_id` to `customer_id` in your code\n3. **Update webhook subscriptions** to use `customer.new`, `customer.update`, and `customer.delete`\n4. **Update your SDK** to the latest version of its current major. The `customers` accessor is added there, no import changes required\n\n## Timeline\n\n- **June 4, 2026**: `\u002Fcustomers` endpoints live. Both `\u002Freceivers` and `\u002Fcustomers` accept requests. Receiver responses include `Deprecation: true` and `Sunset: Fri, 03 Jul 2026 00:00:00 GMT` headers, plus a `Link: rel=\"successor-version\"` pointing to the customer equivalent.\n- **July 3, 2026**: Sunset date. `\u002Freceivers` endpoints return `301 Moved Permanently` redirecting to `\u002Fcustomers`. SDK code calling `receivers.*` continues to work via the redirect.\n- **Later**: `\u002Freceivers` endpoints removed entirely. New SDK majors ship for Node (v4), Python (v2), PHP (v2), and Swift (v2), dropping the deprecated `receivers` surface. The Go SDK keeps `receivers` as a deprecated forwarder in v1; no v2 planned for this rename. Previous SDK majors enter maintenance mode (security fixes only).\n\n## Detect deprecation programmatically\n\nEvery `\u002Freceivers` response carries deprecation metadata you can monitor in tests or runtime logs:\n\n```http\nHTTP\u002F1.1 200 OK\nDeprecation: true\nSunset: Fri, 03 Jul 2026 00:00:00 GMT\nLink: \u003C\u002Fv1\u002Finstances\u002F{instance_id}\u002Fcustomers>; rel=\"successor-version\"\nContent-Type: application\u002Fjson\n```\n\nUseful in CI: fail a smoke test if production traffic still hits `Deprecation: true` endpoints close to the sunset date.\n\n## Verification checklist\n\nBefore considering your migration complete:\n\n- Logs show zero requests to `\u002Fv1\u002Finstances\u002F*\u002Freceivers*` paths from your services\n- CI \u002F monitoring asserts no `Deprecation: true` header on production responses\n- Webhook handlers process `customer.new`, `customer.update`, and `customer.delete`\n- No code paths reference `response.receiver_id`\n- SDK updated to the latest minor release of its current major\n- Saved dashboard URLs use `\u002Fcustomers\u002F`\n\n## FAQ\n\n### What if I don't migrate before July 3, 2026?\n\n`\u002Freceivers` paths return `301 Moved Permanently` pointing to the equivalent `\u002Fcustomers` URL. Most HTTP clients (browsers, `curl`, `requests`, `axios`, official SDKs, Postman) follow redirects automatically, so traffic keeps working, but you spend an extra round-trip per call and rely on redirect semantics. Migrate before that date.\n\n### Can I migrate one resource group at a time?\n\nYes. The customer mirrors are independent per resource group (customers, bank accounts, wallets, virtual accounts, etc.). You can switch your customer-creation flow over this week and your bank-account-creation flow next week without coordination. Each endpoint accepts the new path independently.\n\n### Will I get duplicate webhook events during the transition?\n\nYes, every create and update emits both `receiver.*` and `customer.*` if you are subscribed to both. We dual-emit so you can migrate handlers in any order. Subscribe to one set or the other to avoid handling the same event twice.\n\n### Do I need to migrate my stored IDs?\n\nNo. All IDs keep the `re_` prefix. The same ID works with both `\u002Freceivers` and `\u002Fcustomers` endpoints. We are renaming the API surface, not the underlying resource.\n\n### How do I report issues with the migration?\n\nUse the feedback button in the dashboard (under your profile dropdown) or email support@blindpay.com with `migration` in the subject. Including the request ID from a deprecated response (`x-blindpay-request-id` header) speeds up the lookup.\n",{"title":5,"description":784},"changelog\u002F2026-06-04-customers-rename","3GTHn1M85AXi0fzUqpqGq30uLdi1gnkolw4p2hrLgJw",1780599233632]