Хороша ли архитектура моего кода? Информация цепляется по API?
Первое, вы при каждом получении свойства будете лезть в апи, нужно делать подобие кэша
private function getDetail()
 {
    if (!$this->detailCache) { 
        // Здесь запрос к API который возвращает JSON с информацией о товаре.
       $this->detailCache = $data;
    }
 
    return $this->detailCache;
 }
Второе, все свойства должны быть приватными или защищенными
Третье, метод который лезет в апи не должен быть публичным
Я бы сделал как-то так. Но не претендую на истину в последней инстанции.
spoilerclass API
{
    public function getProduct(int $productId): Product
    {
        $product = $this->request(...); // Получение данных из API
        return Product::from($product)
    {
}

class Product
{
    private int $id;
    private string $title;
    // прочие свойства

    public function getId(): int
    {
        return $this->id;
    }
    
    public function getTitle(): int
    {
        return $this->title;
    }

    // прочие геттеры

    // сеттеры, если нужны
 
    public static function from(object $source): self
    {
        $product = new static();
        $product->id = $source->id;
        $product->title = $source->title;
        // заполнение свойств
        return $product;
    }
}

...
$api = new API($login, $password);
$product = $api->getProduct(325);
Хотя, для современных версий PHP можно описать преобразование из json с помощью атрибутов и сделать трейт с функцией from, которая будет парсить полученный из API объект согласно этим атрибутам. Плюс аналогичный трейт, реализующий JsonSerializable::jsonSerialize по атрибутам.