diff --git a/.circleci/config.yml b/.circleci/config.yml
index a47864ea0fabdc9665451722e053527fec17ce55..3702b0891ea03ed74a18f910d142c68fa3582e84 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -8,6 +8,9 @@ jobs:
   build-and-test: 
     docker:
       - image: cimg/python:3.10.2
+        environment:
+          LIMIT_NUMPY_VERSION: 2.0.0
+          LIMIT_SCIPY_VERSION: 1.13.1
     steps:
       - checkout
       - python/install-packages:
@@ -17,7 +20,7 @@ jobs:
           no_output_timeout: 30m
           command: |
             pip install --upgrade pip
-            pip install --only-binary=numpy,scipy numpy==1.22.4 scipy Cython pytest pytest-cov codecov
+            pip install --only-binary=numpy,scipy "numpy<$LIMIT_NUMPY_VERSION" "scipy<=$LIMIT_SCIPY_VERSION" Cython pytest pytest-cov codecov
             pip install -e .[tests]
       - run:
           name: Run tests
diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
index 9352892dea73e80e74b1ceaafde92daac282bdfb..f58e2abacc6eaabef8b17f81f09399976ccdc1ff 100644
--- a/.github/workflows/python-package.yml
+++ b/.github/workflows/python-package.yml
@@ -17,14 +17,10 @@ jobs:
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest, macos-13, macos-14]
-        # python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
-        versions:
-          - { python: "3.8", numpy: 1.22.4 }
-          - { python: "3.9", numpy: 1.22.4 }
-          - { python: "3.10", numpy: 1.22.4 }
-          - { python: "3.11", numpy: 1.24.3 }
-          - { python: "3.12", numpy: 1.26.4 }
-        
+        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
+    env:
+      LIMIT_NUMPY_VERSION: 2.0.0
+      LIMIT_SCIPY_VERSION: 1.13.1
     steps:
     - name: Get number of CPU cores
       uses: SimenB/github-actions-cpu-cores@v2
@@ -32,47 +28,47 @@ jobs:
 
     - uses: actions/checkout@v4
 
-    - name: Setup Python ${{ matrix.versions.python }}
-      if: ${{ (matrix.os != 'macos-14') || ((matrix.os == 'macos-14') && (matrix.versions.python != '3.8') && (matrix.versions.python != '3.9')) }}
+    - name: Setup Python ${{ matrix.python-version }}
+      if: ${{ (matrix.os != 'macos-14') || ((matrix.os == 'macos-14') && (matrix.python-version != '3.8') && (matrix.python-version != '3.9')) }}
       uses: actions/setup-python@v5
       id: pysetup
       with:
-        python-version: ${{ matrix.versions.python }}
+        python-version: ${{ matrix.python-version }}
         cache: 'pip'
 
     - name: Setup Python 3.8-3.9 - macos-arm
-      if: ${{ (matrix.os == 'macos-14') && ((matrix.versions.python == '3.8') || (matrix.versions.python == '3.9')) }}
+      if: ${{ (matrix.os == 'macos-14') && ((matrix.python-version == '3.8') || (matrix.python-version == '3.9')) }}
       run: |
         brew update
-        brew install python@${{ matrix.versions.python }}
+        brew install python@${{ matrix.python-version }}
         curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-        python${{ matrix.versions.python }} get-pip.py
+        python${{ matrix.python-version }} get-pip.py
 
     - name: Create Python alias for Windows 
       if: matrix.os == 'windows-latest'
       run: |
-        $newPath = "${{ steps.pysetup.outputs.python-path }}".Replace("python.exe", "python${{ matrix.versions.python }}.exe")
+        $newPath = "${{ steps.pysetup.outputs.python-path }}".Replace("python.exe", "python${{ matrix.python-version }}.exe")
         New-Item -ItemType HardLink -Path "$newPath" -Value "${{ steps.pysetup.outputs.python-path }}"
 
     - name: Display Python and Pip versions
       run: | 
-        python${{ matrix.versions.python }} -c "import sys; print(sys.version)"
+        python${{ matrix.python-version }} -c "import sys; print(sys.version)"
         pip --version
 
     - name: Upgrade pip wheel setuptools
-      run: pip install wheel setuptools pip --upgrade
-
-    - name: Install numpy ${{ matrix.versions.numpy }}
-      run: pip install numpy==${{ matrix.versions.numpy }}
-    
-    - name: Display numpy version
-      run: python${{ matrix.versions.python }} -c "import numpy; print(numpy.__version__)"
+      run: python${{ matrix.python-version }} -m pip install wheel setuptools pip --upgrade
+  
+    - name: Install other dependencies
+      run: python${{ matrix.python-version }} -m pip install Cython pytest pytest-cov flake8
 
     - name: Install other dependencies
       run: |
-        pip install scipy Cython pytest pytest-cov flake8
-        python${{ matrix.versions.python }} setup.py build_ext -j${{ steps.cpu-cores.outputs.count }}
-        pip install -e .[tests]
+        python${{ matrix.python-version }} -m pip install Cython pytest pytest-cov flake8 "numpy<${{ env.LIMIT_NUMPY_VERSION }}" "scipy<=${{ env.LIMIT_SCIPY_VERSION }}"
+        python${{ matrix.python-version }} setup.py build_ext -j${{ steps.cpu-cores.outputs.count }}
+        python${{ matrix.python-version }} -m pip install -e .[tests]
+
+    - name: Display numpy version
+      run: python${{ matrix.python-version }} -c "import numpy; print(numpy.__version__)"
 
     - name: Lint with flake8
       run: |
@@ -83,4 +79,4 @@ jobs:
     
     - name: Test with pytest
       run: |
-        pytest --cov=cornac
+        python${{ matrix.python-version }} -m pytest --cov=cornac
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
index 32e0236e540373e3ddc6c475feedc9da38ed0e4e..fdb260c79719c07a28d399fd71f2a0283b2cafca 100644
--- a/.github/workflows/python-publish.yml
+++ b/.github/workflows/python-publish.yml
@@ -12,6 +12,10 @@ on:
   release:
     types: [published]
 
+env:
+  LIMIT_NUMPY_VERSION: 2.0.0
+  LIMIT_SCIPY_VERSION: 1.13.1
+
 jobs:
   build-wheels:
     name: Building on ${{ matrix.os }}
@@ -20,58 +24,52 @@ jobs:
       fail-fast: false
       matrix:
         os: [windows-latest, ubuntu-latest, macos-13, macos-14]
-        versions:
-          - { python: "3.8", numpy: 1.22.4 }
-          - { python: "3.9", numpy: 1.22.4 }
-          - { python: "3.10", numpy: 1.22.4 }
-          - { python: "3.11", numpy: 1.24.3 }
-          - { python: "3.12", numpy: 1.26.4 }
-
+        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
     steps:
     - uses: actions/checkout@v4
     
-    - name: Setup Python ${{ matrix.versions.python }}
-      if: ${{ (matrix.os != 'macos-14') || ((matrix.os == 'macos-14') && (matrix.versions.python != '3.8') && (matrix.versions.python != '3.9')) }}
+    - name: Setup Python ${{ matrix.python-version }}
+      if: ${{ (matrix.os != 'macos-14') || ((matrix.os == 'macos-14') && (matrix.python-version != '3.8') && (matrix.python-version != '3.9')) }}
       uses: actions/setup-python@v5
       id: pysetup
       with:
-        python-version: ${{ matrix.versions.python }}
+        python-version: ${{ matrix.python-version }}
         cache: 'pip'
 
     - name: Setup Python 3.8-3.9 - macos-arm
-      if: ${{ (matrix.os == 'macos-14') && ((matrix.versions.python == '3.8') || (matrix.versions.python == '3.9')) }}
+      if: ${{ (matrix.os == 'macos-14') && ((matrix.python-version == '3.8') || (matrix.python-version == '3.9')) }}
       run: |
         brew update
-        brew install python@${{ matrix.versions.python }}
+        brew install python@${{ matrix.python-version }}
         curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-        python${{ matrix.versions.python }} get-pip.py
+        python${{ matrix.python-version }} get-pip.py
 
     - name: Create Python alias for Windows 
       if: matrix.os == 'windows-latest'
       run: |
-        $newPath = "${{ steps.pysetup.outputs.python-path }}".Replace("python.exe", "python${{ matrix.versions.python }}.exe")
+        $newPath = "${{ steps.pysetup.outputs.python-path }}".Replace("python.exe", "python${{ matrix.python-version }}.exe")
         New-Item -ItemType HardLink -Path "$newPath" -Value "${{ steps.pysetup.outputs.python-path }}"
 
     - name: Display Python and Pip versions
       run: | 
-        python${{ matrix.versions.python }} -c "import sys; print(sys.version)"
+        python${{ matrix.python-version }} -c "import sys; print(sys.version)"
         pip --version
 
     - name: Upgrade pip wheel setuptools
-      run: pip install wheel setuptools pip --upgrade
+      run: python${{ matrix.python-version }} -m pip install wheel setuptools pip --upgrade
 
-    - name: Install numpy ${{ matrix.versions.numpy }}
-      run: pip install numpy==${{ matrix.versions.numpy }}
+    - name: Install numpy, scipy
+      run: pip install "numpy<${{ env.LIMIT_NUMPY_VERSION }}" "scipy<=${{ env.LIMIT_SCIPY_VERSION }}"
     
-    - name: Display numpy version
-      run: python${{ matrix.versions.python }} -c "import numpy; print(numpy.__version__)"
-
     - name: Install other dependencies
       run: |
-        pip install scipy Cython wheel
+        pip install Cython wheel
     
+    - name: Display numpy version
+      run: python${{ matrix.python-version }} -c "import numpy; print(numpy.__version__)"
+
     - name: Build wheels
-      run: python${{ matrix.versions.python }} setup.py bdist_wheel
+      run: python${{ matrix.python-version }} setup.py bdist_wheel
         
     - name: Rename Linux wheels to supported platform of PyPI
       if: matrix.os == 'ubuntu-latest'
@@ -105,12 +103,12 @@ jobs:
 
     - name: Install numpy
       run: |
-        python -m pip install numpy==1.22.4
+        python -m pip install "numpy<${{ env.LIMIT_NUMPY_VERSION }}" "scipy<=${{ env.LIMIT_SCIPY_VERSION }}"
         python -c "import numpy; print(numpy.__version__)"
 
     - name: Install other dependencies
       run: |
-        python -m pip install scipy Cython wheel
+        python -m pip install Cython wheel
 
     - name: Build source tar file
       run: python setup.py sdist
diff --git a/setup.py b/setup.py
index 44384bf2882b117f6e6529aba76649dd1af66d99..0862ce415787414763340005ffa0fb1830205fac 100644
--- a/setup.py
+++ b/setup.py
@@ -343,7 +343,7 @@ setup(
         "recommendation",
     ],
     ext_modules=extensions,
-    install_requires=["numpy", "scipy", "tqdm", "powerlaw"],
+    install_requires=["numpy<2.0.0", "scipy<=1.13.1", "tqdm", "powerlaw"],
     extras_require={"tests": ["pytest", "pytest-pep8", "pytest-xdist", "pytest-cov", "Flask"]},
     cmdclass=cmdclass,
     packages=find_packages(),