India will play three Test matches in South Africa this season, the boards of both countries announced on Wednesday.
The first Test will start in Cape Town on January 5 while details of the remaining two Tests as well as six one-day internationals and three Twenty20 internationals will be announced later.
South Africa will also stage its first day-night Test, planned as a four-day match against Zimbabwe in Port Elizabeth from December 26 to 29.
Wednesday's announcement followed negotiations which have taken place over several months.
Cricket South Africa chief executive Haroon Lorgat admitted it had been necessary "to compromise to some extent" in order to fit in a tour between the end of India's series against Sri Lanka, ending on December 24, and the start of a Test series between South Africa and Australia starting on March 1.
"The time constraints faced by India have forced us to reduce the Test matches to three while increasing white ball cricket to six ODIs and three T20I matches," said Lorgat.
The original plan was for four Tests, three one-day internationals and three Twenty20 internationals.
The compromise over the India itinerary left a gap for what has become a traditional Boxing Day Test in South Africa.
That gap will be filled by Zimbabwe, who have not played a Test in South Africa since 2004/05.
Lorgat said there were new floodlights at Port Elizabeth's St George's Park.
"It will be the first-ever four-day day-night Test match and hopefully we will get International Cricket Council approval at their meeting in October to have an official Test match played over four days."
With a total of ten Test matches - two against Bangladesh, one against Zimbabwe, three against India and four against Australia - it will be South Africa's busiest Test summer.
Cricket South Africa wanted the first Test against India to start on December 26 but India want to spend time in South Africa after the end of the Sri Lanka series. They will play a two-day practice match in Paarl on December 30 and 31.