Есть мнение, что для API должен быть выделен отдельный набор контроллеров с отдельным базовыми классом. Структуру основного сайта вы можете менять как угодно и когда угодно, но на API будут завязаны программы сторонних разработчиков, так что его внешний интерфейс меняться не должен.
Чтобы не дублировать код — выности его в модели и в модули, код самого контроллера должен быть минимальным.