When a young girl, Amanda McCready, goes missing in Boston, the case attracts widespread media attention. Private investigator Patrick Kenzie (played by Casey Affleck) and his partner and girlfriend Angie Gennaro (played by Michelle Monaghan) are hired by the child's Aunt Beatrice to find her. Kenzie and Angie discover Amanda's mother Helene and her boyfriend "Skinny Ray" had recently stolen money from a local drug lord. After Ray is murdered, Patrick and Angie join the police detectives investigating the case, Nick Poole and Remy Bressant, to arrange a trade of the money for Amanda. Police Captain Doyle shows Kenzie a telephone transcript of the drug lord setting up an exchange for Amanda. The exchange at a nearby quarry in Quincy is botched and Amanda is believed to have drowned. Captain Doyle, whose own daughter was also killed years before, takes responsibility and goes into early retirement.
Two months later, a seven-year-old boy is abducted in Everett and Kenzie receives information that the boy was taken by a known child molester. After entering the house and finding evidence of the abducted boy, Kenzie returns later with Nick and Remy to rescue him. They are seen by the residents and Nick is shot. Kenzie enters the house and finds one of the residents dead. After being shot at, Kenzie retreats into the child molester's room. He finds the child molester in the room and the boy's dead body in the bathroom, and kills the child molester.
Nick later dies in a hospital. Trying to alleviate Kenzie's guilt over the murder, Remy confides in Kenzie that he once planted evidence on someone. During the story, Remy inadvertently reveals that he knew "Skinny Ray" prior to Amanda's abduction. The fact that Remy lied during the investigation puzzles Kenzie, who speaks to a police officer after Nick's funeral. The police officer tells Kenzie that Remy had been asking about the drug lord's stolen money before the drug lord knew it was missing. Kenzie questions Amanda's Uncle Lionel and pieces together that Lionel and Remy conspired in a false kidnapping in order to take the money for themselves and to save Amanda from her mother's poor parenting. At that point, Remy enters the bar and stages a robbery while wearing a latex mask and holding a shotgun. He points the shotgun at Lionel's head, but the bartender shoots Remy twice in the back. Remy flees and is pursued by Kenzie to the rooftop of a nearby building, where he dies.
Kenzie is later questioned about Remy's death, and discovers that the transcript that led to the botched exchange for Amanda was a forgery. Kenzie drives with Angie to Captain Doyle's home looking for answers. He discovers Amanda is alive and living very happily with Doyle and his wife. A flashback reveals Amanda's death was staged, and that Doyle was a part of the phony kidnapping all along. Kenzie threatens to call the authorities, but Doyle attempts to convince him that Amanda is better off living with them than with her drug-addicted, careless mother. Kenzie departs to discuss the choice with Angie, who says she will leave him if he calls the police. The police arrive and Doyle is arrested. Amanda is reunited with her mother, and Kenzie and Angie break up. Kenzie later visits Amanda and Helene as Helene is about to leave on a date. She has no babysitter and just plans on having a neighbor check on Amanda, so Kenzie volunteers to watch Amanda. The film ends with Kenzie and Amanda watching television.