[{"data":1,"prerenderedAt":450},["ShallowReactive",2],{"docsv3-nav":3,"\u002Fdocs\u002Fv3\u002Fmigration\u002Foverview":236},[4],{"title":5,"path":6,"stem":7,"children":8,"page":188},"V3","\u002Fdocs\u002Fv3","1.docs\u002Fv3",[9,13,17,21,38,87,189,198,219],{"title":10,"path":11,"stem":12},"Introduction","\u002Fdocs\u002Fv3\u002Fintroduction","1.docs\u002Fv3\u002F1.Introduction",{"title":14,"path":15,"stem":16},"Quick start","\u002Fdocs\u002Fv3\u002Fquick-start","1.docs\u002Fv3\u002F2.Quick start",{"title":18,"path":19,"stem":20},"Challenge flow","\u002Fdocs\u002Fv3\u002Fchallenge-flow","1.docs\u002Fv3\u002F3.Challenge flow",{"title":22,"path":23,"stem":24,"children":25},"Fundamentals","\u002Fdocs\u002Fv3\u002Ffundamentals","1.docs\u002Fv3\u002F4.fundamentals",[26,30,34],{"title":27,"path":28,"stem":29},"Signup protection","\u002Fdocs\u002Fv3\u002Ffundamentals\u002Fsignup-protection","1.docs\u002Fv3\u002F4.fundamentals\u002F00.Signup protection",{"title":31,"path":32,"stem":33},"Login protection","\u002Fdocs\u002Fv3\u002Ffundamentals\u002Flogin-protection","1.docs\u002Fv3\u002F4.fundamentals\u002F01.Login protection",{"title":35,"path":36,"stem":37},"Access protection","\u002Fdocs\u002Fv3\u002Ffundamentals\u002Faccess-protection","1.docs\u002Fv3\u002F4.fundamentals\u002F02.Access protection",{"title":39,"path":40,"stem":41,"children":42},"Guides","\u002Fdocs\u002Fv3\u002Fguides","1.docs\u002Fv3\u002F5.guides",[43,47,51,55,59,63,67,71,75,79,83],{"title":44,"path":45,"stem":46},"Account sharing prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Faccount-sharing-prevention","1.docs\u002Fv3\u002F5.guides\u002F1.Account sharing prevention",{"title":48,"path":49,"stem":50},"Web scraping prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Fweb-scraping-prevention","1.docs\u002Fv3\u002F5.guides\u002F13.Web scraping prevention",{"title":52,"path":53,"stem":54},"Ban enforcement","\u002Fdocs\u002Fv3\u002Fguides\u002Fban-enforcement","1.docs\u002Fv3\u002F5.guides\u002F14.Ban enforcement",{"title":56,"path":57,"stem":58},"Chargeback dispute","\u002Fdocs\u002Fv3\u002Fguides\u002Fchargeback-dispute","1.docs\u002Fv3\u002F5.guides\u002F15.Chargeback dispute",{"title":60,"path":61,"stem":62},"Multi-accounting prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Fmulti-accounting-prevention","1.docs\u002Fv3\u002F5.guides\u002F16.Multi-accounting prevention",{"title":64,"path":65,"stem":66},"Account takeover prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Faccount-takeover-prevention","1.docs\u002Fv3\u002F5.guides\u002F2.Account takeover prevention",{"title":68,"path":69,"stem":70},"Risky transaction prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Frisky-transaction-prevention","1.docs\u002Fv3\u002F5.guides\u002F20.Risky transaction prevention",{"title":72,"path":73,"stem":74},"Fake account detection","\u002Fdocs\u002Fv3\u002Fguides\u002Ffake-account-detection","1.docs\u002Fv3\u002F5.guides\u002F3.Fake account detection",{"title":76,"path":77,"stem":78},"Bot detection","\u002Fdocs\u002Fv3\u002Fguides\u002Fbot-detection","1.docs\u002Fv3\u002F5.guides\u002F4.Bot detection",{"title":80,"path":81,"stem":82},"Card testing prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Fcard-testing-prevention","1.docs\u002Fv3\u002F5.guides\u002F5.Card testing prevention",{"title":84,"path":85,"stem":86},"Incentive abuse prevention","\u002Fdocs\u002Fv3\u002Fguides\u002Fincentive-abuse-prevention","1.docs\u002Fv3\u002F5.guides\u002F9.Incentive abuse prevention",{"title":88,"path":89,"stem":90,"children":91,"page":188},"Concepts","\u002Fdocs\u002Fv3\u002Fconcepts","1.docs\u002Fv3\u002F6.concepts",[92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184],{"title":93,"path":94,"stem":95},"Evaluations","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fevaluations","1.docs\u002Fv3\u002F6.concepts\u002F01.evaluations",{"title":97,"path":98,"stem":99},"Actions","\u002Fdocs\u002Fv3\u002Fconcepts\u002Factions","1.docs\u002Fv3\u002F6.concepts\u002F02.actions",{"title":101,"path":102,"stem":103},"Signals","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fsignals","1.docs\u002Fv3\u002F6.concepts\u002F03.signals",{"title":105,"path":106,"stem":107},"Checks","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fchecks","1.docs\u002Fv3\u002F6.concepts\u002F04.checks",{"title":109,"path":110,"stem":111},"Risks","\u002Fdocs\u002Fv3\u002Fconcepts\u002Frisks","1.docs\u002Fv3\u002F6.concepts\u002F05.risks",{"title":113,"path":114,"stem":115},"Verdicts","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fverdicts","1.docs\u002Fv3\u002F6.concepts\u002F06.verdicts",{"title":117,"path":118,"stem":119},"Policies","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fpolicies","1.docs\u002Fv3\u002F6.concepts\u002F07.policies",{"title":121,"path":122,"stem":123},"Challenges","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fchallenges","1.docs\u002Fv3\u002F6.concepts\u002F08.challenges",{"title":125,"path":126,"stem":127},"Concurrency","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fconcurrency","1.docs\u002Fv3\u002F6.concepts\u002F09.concurrency",{"title":129,"path":130,"stem":131},"Impossible travel","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fimpossible-travel","1.docs\u002Fv3\u002F6.concepts\u002F10.impossible-travel",{"title":133,"path":134,"stem":135},"Bots","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fbots","1.docs\u002Fv3\u002F6.concepts\u002F11.bots",{"title":137,"path":138,"stem":139},"Devices","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fdevices","1.docs\u002Fv3\u002F6.concepts\u002F12.devices",{"title":141,"path":142,"stem":143},"Fingerprints","\u002Fdocs\u002Fv3\u002Fconcepts\u002Ffingerprints","1.docs\u002Fv3\u002F6.concepts\u002F13.fingerprints",{"title":145,"path":146,"stem":147},"People","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fpeople","1.docs\u002Fv3\u002F6.concepts\u002F14.people",{"title":149,"path":150,"stem":151},"Lists","\u002Fdocs\u002Fv3\u002Fconcepts\u002Flists","1.docs\u002Fv3\u002F6.concepts\u002F15.lists",{"title":153,"path":154,"stem":155},"Account takeover","\u002Fdocs\u002Fv3\u002Fconcepts\u002Faccount-takeover","1.docs\u002Fv3\u002F6.concepts\u002F16.account-takeover",{"title":157,"path":158,"stem":159},"Account sharing","\u002Fdocs\u002Fv3\u002Fconcepts\u002Faccount-sharing","1.docs\u002Fv3\u002F6.concepts\u002F17.account-sharing",{"title":161,"path":162,"stem":163},"Fake account","\u002Fdocs\u002Fv3\u002Fconcepts\u002Ffake-account","1.docs\u002Fv3\u002F6.concepts\u002F18.fake-account",{"title":165,"path":166,"stem":167},"Scraping","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fscraping","1.docs\u002Fv3\u002F6.concepts\u002F19.scraping",{"title":169,"path":170,"stem":171},"Linked accounts","\u002Fdocs\u002Fv3\u002Fconcepts\u002Flinked-accounts","1.docs\u002Fv3\u002F6.concepts\u002F20.linked-accounts",{"title":173,"path":174,"stem":175},"New IP","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fip","1.docs\u002Fv3\u002F6.concepts\u002F21.ip",{"title":177,"path":178,"stem":179},"Anonymizing network","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fanonymizing-network","1.docs\u002Fv3\u002F6.concepts\u002F22.anonymizing-network",{"title":181,"path":182,"stem":183},"Email quality","\u002Fdocs\u002Fv3\u002Fconcepts\u002Femail","1.docs\u002Fv3\u002F6.concepts\u002F23.email",{"title":185,"path":186,"stem":187},"Velocity","\u002Fdocs\u002Fv3\u002Fconcepts\u002Fvelocity","1.docs\u002Fv3\u002F6.concepts\u002F24.velocity",false,{"title":190,"path":191,"stem":192,"children":193,"page":188},"Advanced","\u002Fdocs\u002Fv3\u002Fadvanced","1.docs\u002Fv3\u002F7.Advanced",[194],{"title":195,"path":196,"stem":197},"Proxy setup","\u002Fdocs\u002Fv3\u002Fadvanced\u002Fproxy-setup","1.docs\u002Fv3\u002F7.Advanced\u002F1.Proxy-setup",{"title":199,"path":200,"stem":201,"children":202},"Integrations","\u002Fdocs\u002Fv3\u002Fintegrations","1.docs\u002Fv3\u002F8.integrations",[203,207,211,215],{"title":204,"path":205,"stem":206},"Kajabi","\u002Fdocs\u002Fv3\u002Fintegrations\u002Fkajabi-account-sharing-prevention","1.docs\u002Fv3\u002F8.integrations\u002F1.Kajabi account sharing prevention",{"title":208,"path":209,"stem":210},"Teachable","\u002Fdocs\u002Fv3\u002Fintegrations\u002Fteachable-account-sharing-prevention","1.docs\u002Fv3\u002F8.integrations\u002F2.Teachable account sharing prevention",{"title":212,"path":213,"stem":214},"Thinkific","\u002Fdocs\u002Fv3\u002Fintegrations\u002Fthinkific-account-sharing-prevention","1.docs\u002Fv3\u002F8.integrations\u002F3.Thinkific account sharing prevention",{"title":216,"path":217,"stem":218},"LearnWorlds","\u002Fdocs\u002Fv3\u002Fintegrations\u002Flearnworlds-account-sharing-prevention","1.docs\u002Fv3\u002F8.integrations\u002F4.LearnWorlds account sharing prevention",{"title":220,"path":221,"stem":222,"children":223,"page":188},"Migration","\u002Fdocs\u002Fv3\u002Fmigration","1.docs\u002Fv3\u002F9.migration",[224,228,232],{"title":225,"path":226,"stem":227},"Overview","\u002Fdocs\u002Fv3\u002Fmigration\u002Foverview","1.docs\u002Fv3\u002F9.migration\u002F1.Overview",{"title":229,"path":230,"stem":231},"Account sharing on web","\u002Fdocs\u002Fv3\u002Fmigration\u002Faccount-sharing-on-web","1.docs\u002Fv3\u002F9.migration\u002F2.Account sharing on web",{"title":233,"path":234,"stem":235},"Account sharing on mobile","\u002Fdocs\u002Fv3\u002Fmigration\u002Faccount-sharing-on-mobile","1.docs\u002Fv3\u002F9.migration\u002F3.Account sharing on mobile",{"id":237,"title":225,"body":238,"description":443,"extension":444,"meta":445,"navigation":446,"path":226,"rawbody":447,"seo":448,"stem":227,"__hash__":449},"docsv3\u002F1.docs\u002Fv3\u002F9.migration\u002F1.Overview.md",{"type":239,"value":240,"toc":436},"minimark",[241,246,258,269,274,277,350,367,371,382,407,414,420,424],[242,243,245],"h1",{"id":244},"migrating-from-v2-to-v3","Migrating from v2 to v3",[247,248,249,250,257],"p",{},"v3 is a new API with a new SDK on every platform. The clients are not drop-in compatible with v2, so plan for a real upgrade. The upside is that the v3 client is smaller: most of the wiring you did by hand now lives on a ",[251,252,256],"a",{"href":253,"rel":254},"https:\u002F\u002Fapp.rupt.dev\u002Fpolicies",[255],"nofollow","policy"," in the dashboard, and the SDK handles the rest.",[247,259,260,261,264,265,268],{},"This section walks the migration one product at a time. It starts with account sharing, the simplest one, ",[251,262,263],{"href":230},"on web"," and ",[251,266,267],{"href":234},"on iOS and Android",".",[270,271,273],"h2",{"id":272},"what-changed-at-a-glance","What changed at a glance",[247,275,276],{},"v2 and v3 refer to the Rupt API. Each platform ships its own client library on top of it, and every library has its own version number. This table maps each API version to the library that talks to it:",[278,279,280,296],"table",{},[281,282,283],"thead",{},[284,285,286,290,293],"tr",{},[287,288,289],"th",{},"Platform",[287,291,292],{},"API v2 library",[287,294,295],{},"API v3 library",[297,298,299,318,334],"tbody",{},[284,300,301,305,312],{},[302,303,304],"td",{},"Web",[302,306,307,311],{},[308,309,310],"code",{},"rupt"," 2.x",[302,313,314,317],{},[308,315,316],{},"@ruptjs\u002Fclient"," 3.x",[284,319,320,323,329],{},[302,321,322],{},"iOS",[302,324,325,328],{},[308,326,327],{},"RuptClient"," 3.8.1",[302,330,331,333],{},[308,332,327],{}," 4.0.0",[284,335,336,339,345],{},[302,337,338],{},"Android",[302,340,341,344],{},[308,342,343],{},"com.github.getrupt:kotlin"," 2.1.0",[302,346,347,333],{},[308,348,349],{},"dev.rupt.android:rupt-android",[351,352,354],"alert",{"type":353},"info",[247,355,356,357,359,360,362,363,366],{},"The library version and the API version are two different numbers. The v3 clients are ",[308,358,316],{}," 3.x, ",[308,361,327],{}," 4.0.0, and ",[308,364,365],{},"rupt-android"," 4.0.0. They all talk to the same v3 API. When you see a version on a package, that's the library's version, not the API's.",[270,368,370],{"id":369},"the-one-idea-to-hold-onto","The one idea to hold onto",[247,372,373,374,377,378,381],{},"v2 gave each product its own method. Account sharing was ",[308,375,376],{},"attach",". v3 has a single entry point, ",[308,379,380],{},"evaluate",", and the action names the product:",[383,384,385,395,401],"ul",{},[386,387,388,391,392,394],"li",{},[308,389,390],{},"evaluate.access"," runs the account-sharing check (this was ",[308,393,376],{},").",[386,396,397,400],{},[308,398,399],{},"evaluate.login"," runs the login check.",[386,402,403,406],{},[308,404,405],{},"evaluate.signup"," runs the signup check.",[247,408,409,410,413],{},"Challenges are self-managed now. In v2 you passed redirect URLs and challenge callbacks into the client. In v3 the challenge is configured on a policy in the dashboard, gated on the ",[251,411,412],{"href":106},"checks"," you choose, and the SDK surfaces it for you. Your client code shrinks to one call.",[247,415,416,417,419],{},"Account sharing is fully client-side: you call ",[308,418,390],{}," and Rupt handles detection, the challenge, owner verification, and device capping. There is no server step and no evaluation to consume. Login and signup do add a server-side verification, and they will get their own migration pages here.",[270,421,423],{"id":422},"related","Related",[383,425,426,431],{},[386,427,428,430],{},[251,429,14],{"href":15},": the shape of a fresh v3 integration.",[386,432,433,435],{},[251,434,35],{"href":36},": the account-sharing fundamental in full.",{"title":437,"searchDepth":438,"depth":438,"links":439},"",2,[440,441,442],{"id":272,"depth":438,"text":273},{"id":369,"depth":438,"text":370},{"id":422,"depth":438,"text":423},"How to move an existing v2 integration onto the Rupt v3 API and SDKs, one product at a time. Start with account sharing.","md",{},true,"---\ntitle: Overview\ndescription: How to move an existing v2 integration onto the Rupt v3 API and SDKs, one product at a time. Start with account sharing.\n---\n\n# Migrating from v2 to v3\n\nv3 is a new API with a new SDK on every platform. The clients are not drop-in compatible with v2, so plan for a real upgrade. The upside is that the v3 client is smaller: most of the wiring you did by hand now lives on a [policy](https:\u002F\u002Fapp.rupt.dev\u002Fpolicies) in the dashboard, and the SDK handles the rest.\n\nThis section walks the migration one product at a time. It starts with account sharing, the simplest one, [on web](\u002Fdocs\u002Fv3\u002Fmigration\u002Faccount-sharing-on-web) and [on iOS and Android](\u002Fdocs\u002Fv3\u002Fmigration\u002Faccount-sharing-on-mobile).\n\n## What changed at a glance\n\nv2 and v3 refer to the Rupt API. Each platform ships its own client library on top of it, and every library has its own version number. This table maps each API version to the library that talks to it:\n\n| Platform | API v2 library                    | API v3 library                        |\n| -------- | --------------------------------- | ------------------------------------- |\n| Web      | `rupt` 2.x                        | `@ruptjs\u002Fclient` 3.x                  |\n| iOS      | `RuptClient` 3.8.1                | `RuptClient` 4.0.0                    |\n| Android  | `com.github.getrupt:kotlin` 2.1.0 | `dev.rupt.android:rupt-android` 4.0.0 |\n\n::alert{type=\"info\"}\nThe library version and the API version are two different numbers. The v3 clients are `@ruptjs\u002Fclient` 3.x, `RuptClient` 4.0.0, and `rupt-android` 4.0.0. They all talk to the same v3 API. When you see a version on a package, that's the library's version, not the API's.\n::\n\n## The one idea to hold onto\n\nv2 gave each product its own method. Account sharing was `attach`. v3 has a single entry point, `evaluate`, and the action names the product:\n\n- `evaluate.access` runs the account-sharing check (this was `attach`).\n- `evaluate.login` runs the login check.\n- `evaluate.signup` runs the signup check.\n\nChallenges are self-managed now. In v2 you passed redirect URLs and challenge callbacks into the client. In v3 the challenge is configured on a policy in the dashboard, gated on the [checks](\u002Fdocs\u002Fv3\u002Fconcepts\u002Fchecks) you choose, and the SDK surfaces it for you. Your client code shrinks to one call.\n\nAccount sharing is fully client-side: you call `evaluate.access` and Rupt handles detection, the challenge, owner verification, and device capping. There is no server step and no evaluation to consume. Login and signup do add a server-side verification, and they will get their own migration pages here.\n\n## Related\n\n- [Quick start](\u002Fdocs\u002Fv3\u002Fquick-start): the shape of a fresh v3 integration.\n- [Access protection](\u002Fdocs\u002Fv3\u002Ffundamentals\u002Faccess-protection): the account-sharing fundamental in full.\n",{"title":225,"description":443},"_TLIx3EMHhqjtgKO01T5fZZqswXcqmmiSQODOJe1SqA",1782933209969]