Skip to main content

gopro-api

PyPI version Python versions License CI Release Docs

Unofficial Python client for the GoPro cloud / Quik HTTP API at api.gopro.com: search your library and fetch download metadata (CDN URLs, filenames, variants). Built with Pydantic models, plus sync (requests) and async (aiohttp) clients and a small gopro-api CLI.

This project is not affiliated with or endorsed by GoPro.

Features

  • GoProAPI — synchronous client (requests), with context manager
  • AsyncGoProAPI — async client (aiohttp), async with context manager
  • Pydantic request/response types in gopro_api.api.models
  • CLIgopro-api search, gopro-api info, gopro-api pull, gopro-api auth
  • GP_ACCESS_TOKEN from environment / .env (browser cookie value)

Requirements

Install

From the repository root:

python -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -r requirements.txt
pip install -e .

From a local wheel (name matches your build):

pip install ./dist/gopro_api-*-py3-none-any.whl

Published package on PyPI (distribution name gopro-api, import gopro_api):

pip install gopro-api

CLI

After install, gopro-api is on your PATH:

gopro-api --help
gopro-api --version
gopro-api search --start 2026-03-01 --end 2026-03-03 --per-page 30
gopro-api search --start 2026-03-01 --end 2026-03-03 --all-pages
gopro-api search --start 2026-03-01 --end 2026-03-03 --json
gopro-api info MEDIA_ID
gopro-api info MEDIA_ID --json
gopro-api pull MEDIA_ID ./downloads
gopro-api pull MEDIA_ID ./downloads --height 1080
gopro-api pull MEDIA_ID ./downloads --width 1920 --height 1080
gopro-api auth
gopro-api auth --json
Command Purpose
search List media in a capture range. Default: a # _pages summary line, a tab-separated header (id, type, captured_at, filename, …; not gopro_user_id / source_gumi / source_mgumi), then one row per item (other API fields in an extra JSON column). --json: full API-shaped response; with --all-pages, a JSON array of every page.
info Show download metadata for one media id (filename + file lines with size and URL), or --json for the full payload.
pull Download asset(s) for a media id into destination (directory; created if missing). Videos (.mp4 extension, case-insensitive): one variations entry — tallest by default, or closest to --height / --width (sum of squared pixel deltas; ties broken by larger resolution). Photos: uses files (one request per file).
auth Verify that GP_ACCESS_TOKEN is configured and accepted by the API. Default: Rich panel; --json / --tsv for scripting. Exit code 0 when authenticated, 2 when the token is missing, 1 otherwise.

Global --timeout (seconds, default 60) applies to API calls and to pull CDN downloads (requests.get).

Run without an installed script:

python -m gopro_api.cli search --start 2026-03-01 --end 2026-03-02
python -m gopro_api.cli info MEDIA_ID
python -m gopro_api.cli pull MEDIA_ID ./out
python -m gopro_api.cli pull MEDIA_ID ./out --height 720
python -m gopro_api.cli auth

Configuration

gopro_api.config reads settings from the environment and from a .env file in the current working directory via pydantic-settings. Use get_settings() to access the memoized singleton; the only required setting is GP_ACCESS_TOKEN.

Example .env:

GP_ACCESS_TOKEN=your_token_here

The clients send it as a cookie: gp_access_token=<value>. Put only the token string in GP_ACCESS_TOKEN (not the gp_access_token= prefix).

You can override the token in code: GoProAPI(access_token="...") or AsyncGoProAPI(access_token="...").

Retrieving gp_access_token from your browser

Sign in to the GoPro web app (e.g. gopro.com media / Quik). The site sets a cookie gp_access_token.

Chrome / Edge / Brave

  1. Open the site while logged in.
  2. F12ApplicationCookies → choose the origin (often https://quik.gopro.com or another *.gopro.com host).
  3. Copy the Value of gp_access_token.

Firefox

F12StorageCookies → same idea.

Network panel (Chromium)

  1. Network → trigger requests to api.gopro.com.
  2. Pick a request → HeadersCookie.
  3. Copy the value after gp_access_token= up to the next ; (or end of string).

Notes

  • If the cookie is HttpOnly, use the Network method.
  • Tokens expire; refresh from the browser if you get 401.
  • Treat the token like a password.

Security: Do not commit .env or tokens. Keep .env in .gitignore.

Library usage

Async (AsyncGoProAPI)

import asyncio
from datetime import datetime

from gopro_api.api import AsyncGoProAPI
from gopro_api.api.models import CapturedRange, GoProMediaSearchParams


async def main() -> None:
    params = GoProMediaSearchParams(
        captured_range=CapturedRange(
            start=datetime.fromisoformat("2026-03-01"),
            end=datetime.fromisoformat("2026-03-02"),
        ),
        per_page=50,
        page=1,
    )

    async with AsyncGoProAPI() as api:
        search = await api.search(params)
        for item in search.embedded.media:
            meta = await api.download(item.id)
            print(meta.filename, len(meta.embedded.files), "files")


if __name__ == "__main__":
    asyncio.run(main())

Sync (GoProAPI)

from datetime import datetime

from gopro_api.api import GoProAPI
from gopro_api.api.models import CapturedRange, GoProMediaSearchParams


def main() -> None:
    params = GoProMediaSearchParams(
        captured_range=CapturedRange(
            start=datetime.fromisoformat("2026-03-01"),
            end=datetime.fromisoformat("2026-03-02"),
        ),
        per_page=50,
        page=1,
    )

    with GoProAPI() as api:
        search = api.search(params)
        for item in search.embedded.media:
            meta = api.download(item.id)
            print(meta.filename, len(meta.embedded.files), "files")


if __name__ == "__main__":
    main()

Models

  • Requests: GoProMediaSearchParams, CapturedRange, etc. in gopro_api.api.models.
  • Responses: search and download JSON shapes (including _embedded / _pages aliases).

List fields in search params are serialized to comma-separated strings when you call model_dump() (used by the HTTP clients).

Project layout

Path Role
gopro_api/api/gopro.py GoProAPI — sync search, download
gopro_api/api/async_gopro.py AsyncGoProAPI — async search, download
gopro_api/api/models.py Pydantic request/response models
gopro_api/api/__init__.py Re-exports GoProAPI, AsyncGoProAPI
gopro_api/config.py pydantic-settings Settings, lazy get_settings()
gopro_api/cli/ gopro-api CLI
setup.py Package metadata, dependencies, console entry point

CI and releases

.github/workflows/release.yml:

  • Push to main — builds wheel + source .zip, uploads workflow artifacts.
  • Push tag v* (e.g. v0.0.5) — attaches the same files to a GitHub Release.

License

MIT License.

GoPro, Quik, and related marks are trademarks of their respective owners.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gopro_api-0.0.11.tar.gz (143.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gopro_api-0.0.11-py3-none-any.whl (35.8 kB view details)

Uploaded Python 3

File details

Details for the file gopro_api-0.0.11.tar.gz.

File metadata

  • Download URL: gopro_api-0.0.11.tar.gz
  • Upload date:
  • Size: 143.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gopro_api-0.0.11.tar.gz
Algorithm Hash digest
SHA256 605d16b567d2d9ffe368e27183a41fd795e2f5d9cf287184a6c34387bfa0f3a9
MD5 ad423a9b97f14677ca6f71156117dee2
BLAKE2b-256 5d660135b0e3f4fadc809fa231fb1412f601b265e48f0220cbe35ae7fee93ba5

See more details on using hashes here.

File details

Details for the file gopro_api-0.0.11-py3-none-any.whl.

File metadata

  • Download URL: gopro_api-0.0.11-py3-none-any.whl
  • Upload date:
  • Size: 35.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for gopro_api-0.0.11-py3-none-any.whl
Algorithm Hash digest
SHA256 b851ba196b8c8366c0e73a99ae985031376c7cfa55fae2cbf2dc7b4ec04541c2
MD5 90a84dcb7e9dd07d3e6c333f85c92008
BLAKE2b-256 e381535240e524eac241beb550e2f77ef85b292f4ba85f13a79bc5cdd57b6a94

See more details on using hashes here.

Release history Release notifications | RSS feed

0.0.12

2 files

This release

0.0.11 This release

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page