Summary of The Tainted City (BEWARE SPOILERS!)

Dev is a desperate man. After helping his blood mage friend Kiran gain safe haven from Kiran's sadistic master within the warded country of Alathia, he's now held prisoner by the Alathian Council as combined bait and hostage to ensure Kiran does their bidding. But back in his home city of Ninavel, the innocent child he vowed to save faces a life of slavery if he can't reach her in time, and the days are fast slipping away.

Kiran is equally desperate. Guilty over the high price Dev paid to save him, he does all the Alathian Council asks of him, in hopes of earning Dev's freedom—and in hope that one day the Alathians' distrust of him will soften, and he'll be granted release from their binding of his magic. But when disastrous earthquakes strike Alathia and Kiran learns Alathia's wards are failing, he's terrified that his former master Ruslan is making good on his promise to destroy Alathia to reclaim him.

Dev shares Kiran's fear; when the Council recalls him to their stronghold, he suspects the Council intends to hand both him and Kiran over to Ruslan to save their country. But to Dev and Kiran's surprise, the Alathian mage Martennan—or Marten, as he asks them to call him—tells them the damage to Alathia is a mere side effect of someone casting spells against Ninavel, Dev and Kiran's home city in the country of Arkennland. At the Council's bidding, Marten intends to take a team to Ninavel to ensure the attacks are stopped before Alathia's wards are utterly destroyed. Marten wants Kiran to join him, saying his knowledge of forbidden magics will be vital to their success. Dev offers his help instead, pointing out his criminal connections and experience in the city—help Marten is glad to accept, so long as Kiran comes as well. Though Kiran balks at first, skeptical of Marten's claim he can protect them from Ruslan, in the end he cannot deny Dev the chance to save the child Melly.

But once in Ninavel, they find Ninavel's ruler Lord Sechaveh has tasked Ruslan—the most powerful mage in Ninavel, and Sechaveh's friend of old—with tracking down the enemy responsible for the attacks on his city. With Sechaveh's backing, Ruslan forces Marten to choose: give him Kiran in exchange for a blood vow from Ruslan to cast no spells against Marten's team, Dev, and the country of Alathia; or be banned from the city. To Dev and Kiran's horror, Marten accepts Ruslan's bargain and hands over Kiran, who is helpless to resist thanks to the Council's binding of his magic.

Furious, Dev tries first to kill Marten, then escape him, but fails at both thanks to Marten's magic. Marten tells Dev that while handing over Kiran was an unfortunate necessity, he has no intention of abandoning Kiran and will free him from Ruslan once they succeed in stopping the attacks. Dev doesn't believe a word, but when Marten offers him help in reaching Kiran if Dev will continue working with his team, he's forced to agree, knowing that without a mage's assistance he can't hope to cross Ruslan's wards.

Bitterly angry at Marten, Dev seeks out Cara, the friend and lover he had sent to Ninavel before his imprisonment in hopes she might rescue his mentor's daughter Melly in his stead. But the joy of their reunion is shortlived; Dev learns that in her own desperation to save Melly, Cara broke her promise to keep Dev's interest in Melly secret from the Alathians, unwittingly giving Marten the information he needed to pressure Kiran into going to Ninavel. Though Dev knows she acted with the best of intentions, he can't easily overcome his hurt and anger over the breach of trust.

Worse, Dev soon finds rescuing Kiran will be far more difficult than he'd imagined. Ruslan has destroyed Kiran's memories of recent years, erasing the trust and friendship he had built with Dev and leaving him once more loyal to Ruslan, albeit unaware of the full extent of Ruslan's darker nature. When Dev tries to once again befriend Kiran, Ruslan claims a sample of the child Melly's blood from her handler and threatens to cast spells of torture upon her if Dev tells Kiran the truth of his past. But Kiran, his curiosity piqued by Dev's efforts, launches his own attempt to discover the content of his missing memories, even as Ruslan plays on his love of magic to draw him down darker paths.

Dev must confront his own past when his former lover Jylla, who once betrayed him and stole all his earnings, approaches him with information vital to the investigation, including the news that Tainted children have been vanishing. But when Dev tries to chase down leads with the aid of Marten's lieutenant, Lena, he is kidnapped by an old enemy—the spy Pello, who is no longer working for Lord Sechaveh, but Ninavel's enemy, though Pello seems less than happy about his change in employment. Before Dev can learn more, Pello hands him off to Dev's old smuggling boss, who is furious that Dev's testimony at Kiran's trial in Alathia led to the destruction of his business. He uses a painbender charm to torture Dev, but is stopped by Kiran, who has come seeking Dev to demand answers about their shared past.

Wary of Ruslan and desperate to keep Melly from harm, Dev refuses to divulge the truth unless Kiran brings him Melly's blood sample, so Ruslan can't target spells against her. Frustrated and conflicted, Kiran gives Dev a charm that will allow them to arrange another meeting, and returns to Ruslan's house. Before he can break into Ruslan's vault, he is discovered by his mage-brother Mikail, who tells him a distorted version of the truth that leaves Kiran believing that Dev betrayed him.

Loyal to Ruslan once more, Kiran learns with his master that Ninavel's enemy is a Kaithan tribesman named Vidai zha-Dakhar, who, despite being untalented, now wields a power strangely similar to the Taint yet far more brutal in effect. Bitter over the abuses of power by the city's mages, Vidai intends to disrupt the enormous confluence of magical power beneath Ninavel, which will kill every mage in the city and leave the surviving residents waterless. Each attack Vidai makes worsens the instability of the confluence; they have mere days before a magical conflagration. Ruslan asks Kiran to help him prepare a magefire strike to kill Vidai when he next attacks the city. Though dismayed by the realization that Ruslan's magefire is certain to kill innocent people along with Vidai, Kiran agrees, rationalizing that killing Vidai will save more lives than are taken in the strike.

Meanwhile, Dev suspects a traitor among the Alathians. He isn't sure which of Marten's team is the culprit, but he fears it is Lena, whom he had begun to trust, believing her sincerely remorseful over Marten's betrayal of Kiran. Dev asks Cara to work with his ex-lover Jylla to discover the traitor's identity, even as Dev helps Marten and Lena chase down Pello. But just when Dev finally catches Pello, Ruslan seizes the opportunity to strike at Vidai. His magefire fails to kill Vidai, but destroys an entire district of the city and leaves Dev and a mortally injured Pello trapped together under rubble.

Before he dies, Pello tells Dev he was not working for Ninavel's enemy by choice; that Vidai holds his nine-year-old son Janek hostage, and that Vidai's strange power is somehow fueled by the murder of Tainted children. He also reveals that the traitor among the Alathians is not Lena, but Marten's lover Talmaddis. Dev contacts Kiran via the charm Kiran gave him, asking for rescue but insisting Kiran must come alone so Ruslan will not discover they are working together. But Kiran, believing the danger to the city is too great to waste time attempting subterfuge, tells Ruslan everything, even knowing what punishments he and Dev will suffer.

When Kiran frees Dev from the rubble, Dev finds Ruslan waiting with Melly as his captive. Ruslan cannot cast against Dev thanks to the blood vow he made Sechaveh, but he intends to force information out of Dev using Melly, and then kill her to take revenge on Dev. Kiran intervenes, convincing Ruslan to first take Dev to Sechaveh, so one of Sechaveh's mages may cast a spell on him to confirm the truth of his answers.

Under truth spell, Dev manages to catch Sechaveh's interest and secure Melly's safety by agreeing to work for Sechaveh as a spy. Ruslan, angry at being thwarted, nonetheless takes pleasure in forcing Marten to give up his traitorous lover Talmaddis for brutal interrogation at the hands of Ruslan's mage-sister, Lizaveta.

Talmaddis believes along with Vidai that destruction is the only way to prevent the abuses of power so common in Ninavel. He begs Marten to walk away and let city and confluence burn; an outcome that would please many on the Alathian Council. Marten, though anguished, rejects such a course, believing the cost in innocent lives too high. He is forced to watch as Lizaveta rips apart Talmaddis's mind to leave him a drooling, mindburned shell. Seeing Marten's pain, Dev has his revenge for Marten's betrayal of Kiran, but the taste is ashes.

Sick at heart, wondering if Vidai is right that destroying mages like Ruslan is worth any price, and believing Kiran is now beyond any help, Dev returns to the Alathian embassy with Melly safe at his side and enjoys a bittersweet reunion with Cara. But mere moments later, Vidai attacks the embassy, killing the ambassador and Jylla and snatching away Melly so he may use her to further fuel his power. Dev nearly succumbs to despair, but Marten points out that Ruslan can track Melly with the blood sample he holds. Desperate to reach Melly before Vidai murders her, Dev is willing to work with anyone, even Ruslan, to get her back.

Ruslan's spellwork reveals Melly's location: a remote, forbidding cirque high in the Whitefire Mountains, accessible only by magic—or a talented climber like Dev. He agrees to guide Ruslan and the Alathians to the cirque, so they can avoid spellcasting and maintain the element of surprise. But he needs a belay partner; Cara volunteers, over his objections, though she insists Ruslan expand his blood vow against casting to include her and Melly. Ruslan agrees, since the vow does not prevent his mage-sister Lizaveta from casting. His highest priority is ensuring his own survival and that of Kiran, Mikail, and Lizaveta by stopping Vidai from disrupting the confluence; time enough for revenge later.

Dev and Cara succeed in getting Ruslan, Kiran, Mikail, and the surviving Alathians into the cirque, though Cara is injured on the climb. Once there, Dev holds off Vidai with the aid of Kiran and a charm that reawakens Dev's childhood Taint; the charm causes severe internal damage to its wearer, but the Alathians stave off the effects by working to continuously heal Dev as he fights. While Dev and Kiran keep Vidai distracted, Ruslan and Mikail hastily prepare a spell that will break through the powerful wards protecting what Ruslan believes is an ancient artifact that provides Vidai's strange power. Destroy the artifact, and Vidai will be left helpless.

Ruslan pretended to bring enough stored power to fuel his spell, but in truth he intends to cast true blood magic, requiring a death to power his casting. As Dev engages Vidai in a violent Tainted battle, he realizes too late that Ruslan is about to kill the helplessly unconscious Melly to cast his spell. But Kiran, seeing Dev's despair, spares Melly's life in the only way he can—by killing an injured Alathian mage to provide Ruslan the necessary power to cast.

The spell destroys Vidai's wards. To everyone's shock, what lies behind the wards is no artifact, but a demon straight out of ancient legends. The demon, beautiful and merciless, kills Vidai and promptly focuses on Kiran—who, Dev realizes, bears a disturbing resemblance to the demon; Kiran's black hair, eerily pale skin, and blue eyes are a shadow of the demon's inhuman beauty. The demon says that Ruslan's life will be taken by "red-horned hunters" for the crime of stealing and binding a "temple child," and attacks Mikail—only to stop when Kiran stutters out a phrase in the demon's language and demands the demon leave. The demon yields, though not without a warning that Kiran will soon die, and the lives he claimed for his own will be forfeit. The demon vanishes; but before anyone can demand explanations of Kiran, he collapses in convulsions.

At Lena's urging, Marten reveals that the Alathians--without Kiran's knowledge--addicted him to a drug; without regular doses, he will die from withdrawal, and he is now so ill that any attempt at casting will only hasten his death, as he has become dangerously sensitive to magic. The Alathians hold the only knowledge of the drug's formula. Ruslan now has the choice: give Kiran up, or watch him die. But while Lena is clearly eager to save Kiran, Dev sees that Marten is unsure if Kiran should live, after his murder of Marten's friend.

Furious but unwilling to let Kiran die, Ruslan gives a reluctant, feverish Kiran to Marten, but not before telling Kiran he intends to bargain with demons to achieve Alathia's ruin. Marten and Lena take Kiran, Dev, Melly, Cara, and Pello's young son Janek—who Cara discovered and freed during the fight—to safety in Alathia.

When Kiran wakes under Lena's supervision in Alathia, he is horrified upon remembering Ruslan's words, certain that any bargain with demons will result in mass death, though he cannot remember the source of his certainty, or even the meaning of the foreign words he spoke to the demon in the cirque. For as long as Kiran can recall, a wall in his mind has blocked him from his earliest childhood memories; the wall may have cracked in the cirque, but it stands firm now. He demands that Lena let him go free; he is desperate to return to Ruslan and convince him to stay away from demons.

In an attempt to show Kiran just how dreadful a mistake his return to Ruslan would be, Dev convinces Kiran to look at his own memories, so Kiran will understand how terribly Ruslan has manipulated and abused him. Kiran is left reeling by what he sees, but his determination remains: he must get free so he can stop Ruslan. Yet the Alathian Council has decided Kiran is too dangerous to live; they order Marten to stop giving him doses of the drug and let him die. Dev demands that Marten give Kiran the chance to escape, in reparation for his use of Kiran in Ninavel. Marten will not break his oaths of loyalty to the Council, no matter his regret over Kiran's fate and guilt over his part in it.

Yet his lieutenant Lena believes that Kiran's intimate knowledge of his master and his mysterious connection to demonkind make him the best hope of saving her beloved country. She aids Kiran in escaping, after extracting a promise from Dev that he will accompany Kiran and keep him from sliding any further into blood magic as he fights Ruslan. Cara, meanwhile, will take Melly and Janek to foster them with her relatives in the far north of Arkennland, so that Melly can no longer be used as a pawn against Dev by Ruslan. Dev's love for Cara has grown deep, and the last thing he wants is to leave her. But the only hope of permanent safety for all those he loves is to kill Ruslan, and Kiran is in desperate need of help.

Dev and Kiran start the journey through the Whitefires, aiming for the border city of Prosul Akheba, where they intend to seek help from scholars of healing to wean Kiran off the Alathians' drug before he runs out of the scant supply Lena provided him. The larger problem looms in their minds: how can they possibly defeat a mage as powerful, ruthless, and viciously clever as Ruslan?