A masked intruder barges into an apartment complex, where he attacks and kills a singer named Aarvi Malhotra [Tara Sutaria]. The cops, led by an ex-CBI officer and DCP Aditya Rathore [Shaad Randhawa], begin to piece together clues that suggest a motive deeper than random violence. A seasoned detective, ACP V.K. Ganesan [J. D. Chakravarthi], who has previously studied the notorious psychopath Rakesh Mahadkar [Ritesh Deshmukh], questions the idea that this is a straightforward case and pushes the investigation toward a more intricate pattern. The team notes that the killer seems to target young women with unrequited or complicated relationships, a clue that grows more chilling as the body count rises.
As the investigation unfolds, Gautam Mehra [Arjun Kapoor] surfaces as a central figure. Once a privileged son, he is tangled in a web of personal vendettas and public drama: a raucous scene at Siya’s wedding, a rap derived from Aarvi’s song, and a cascade of choices that seem to spiral out of control. Aarvi’s past is slowly revealed in flashbacks: she confronts the complicated truth about her father Balkrishnan Shastri and the way family ties have shaped her quest to prove herself as a singer. Gautam’s actions—pretending to be in love with Aarvi to drive away a rival, then leaking childhood photos that humiliate her—help seed a rift that fuels their later mutual but fragile feelings. After a tense reconciliation where Aarvi nurses and forgives him, she ultimately walks away, leaving Gautam with a heartbreak that shadows him as the present case deepens.
In the present timeline, Gautam is arrested but manages to escape. Ganesan deduces that Gautam isn’t the killer and the net tightens around Bhairav Purohit [John Abraham], a cab driver who also works as a part-time zookeeper. Bhairav’s past and present collide as the investigation uncovers a disturbing pattern: eighteen young women have been murdered in a similar fashion in the last six months. Rasika Mapuskar [Disha Patani], a mall salesgirl whom Bhairav loves, becomes a pivotal figure in his unraveling—her influence and the possessive, violent impulses she awakens in him push him toward a brutal path. The tension escalates as Bhairav confronts Aarvi’s world, and Gautam fights to protect what may still be salvageable from the wreckage of their earlier relationship.
Past memories return to reveal Bhairav’s psyche in greater depth. A cab driver who doubles as a zoo worker, Bhairav bonds with his widower friend Keshav [Digvijay Rohildas], even as he hides a darker urge beneath a calm exterior. His romance with Rasika Mapuskar [Disha Patani] turns possessive; Rasika’s provocations and her suggestion that she will abandon him fuel Bhairav’s descent. He begins to justify killing girls who do not reciprocate the affection of their boyfriends. On the day Aarvi leaves Gautam, she is unexpectedly in Bhairav’s cab, and Bhairav misreads the situation as another rejection, leading to a violent exertion of control that foreshadows the horror to come. The present chapters reveal that Aarvi’s survival is more than luck: she remains a target within Bhairav’s orbit.
The confrontation intensifies when Gautam learns Bhairav’s address at the zoo and heads there to confront him. In a brutal set of clashes, Ganesan is killed by Bhairav, who also reveals that Aarvi is still alive. Aarvi tries to flee the zoo where she’s kept, but Bhairav corners her and locks her in an underground cage. As Gautam and Bhairav prepare for a deadly duel, the police intervene and detain Bhairav. The investigation reveals a chilling twist: a dead body found in a freezer is not Aarvi, and Yash’s testimony attempts to shield Bhairav by pinning blame on Keshav. Outside the station, Gautam glimpses Bhairav and Rasika sharing an uneasy moment, adding a layer of heartbreak to a case already tangled in lies and desire.
That evening, Bhairav and Rasika return to the zoo to tend to Aarvi’s cage. Aarvi regains consciousness and fights back, stabbing Bhairav with a glass shard. Rasika’s laughter echoes through the chaos as Bhairav closes in on Aarvi. Gautam arrives just in time to intervene, and a vicious fight erupts between the two men. Bhairav lashes out, forcing Gautam to confront the reality of Bhairav’s illness. In a devastating revelation, Gautam exposes that Bhairav has been haunted by schizophrenia, and the romantic ideal of Rasika was a hallucination—an illusion Bhairav conjured around Rasika’s presence. Bhairav recalls Rasika describing how Atul planned to leave his family for her, and in a tragic moment Bhairav accidentally kills Rasika by breaking her back while pleading with her not to leave him. The body recovered from the freezer turns out to be Rasika, a cruel twist Bhairav has preserved for himself. Realizing his grave mistake, Bhairav seeks solace by stepping into the tiger cage, meeting the same fate as his victims. Aarvi and Gautam find a fragile redemption as she returns to the stage, singing for her fans with Gautam’s support.
In a mid-credits scene, at a mental asylum, Rakesh [Ritesh Deshmukh], who survived the accident and is now paraplegic, encounters Bhairav. Rakesh reiterates a promise from the past as Bhairav awakens, his fate once again teetering on the edge of the story’s bleak truth.