могу вручную делать return в каждом методе своего API, но это не выглядит правильным
Почему? Это нормальная практика. Каждый метод - это часть контроллера, а контроллер должен возвращать ответ. Ответ в Laravel должен быть инстансом Response (массив автоматически конвертируется в него).
если структура изменится, мне придется менять весь свой код
Для таких случаев Лара предоставляет возможность создать свой собственный тип ответа, например, ApiResponse. Соответственно, после создания будете вызывать в коде как-то так:
return response()->api($code, $data);
Все форматирование будете делать в классе ApiResponse.
Собственно, чтобы создать, регистрируете в сервис-провайдере новый тип response.
Response::macro('api', function ($code, $data) {
return new ApiResponse($code, $data);
});