The deal includes a full no-trade clause, which Pujols had been seeking and may have been a sticking point in his negotiations with the Miami Marlins.
Pujols had turned down an offer from the Cardinals, the only team he has ever played for, about a year ago, but St. Louis was still in the bidding as of Wednesday.