Skip to main content

Lightweight async Python client for the JellyJelly API

Project description

jellyjelly

Async Python client for the JellyJelly public API

PyPI Tests License Python

Search, retrieve, and analyze content from JellyJelly -- the video-first SocialFi platform built on Solana. No API key required.

What is JellyJelly?

JellyJelly is a video-first social platform founded by Iqram Magdon-Ismail (co-founder of Venmo). Users create short video "jellies" -- think conversations, interviews, and hot takes -- with built-in social tokens on Solana. Each jelly includes engagement metrics (views, likes, comments, tips) and Deepgram-powered transcripts.

The API is public and requires no authentication.

Installation

pip install jellyjelly

From source:

git clone https://github.com/Wayy-Research/jelly.git
cd jelly
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"

Quick Start

import asyncio
from jellyjelly import JellyClient

async def main():
    async with JellyClient() as client:
        # Search for jellies by keyword
        results = await client.search("fintech")
        for jelly in results.jellies:
            print(f"{jelly.title} by @{jelly.participants[0].username}")

        # Get full detail: transcript, engagement metrics, video info
        detail = await client.get_jelly(results.jellies[0].id)
        print(f"Views: {detail.all_views}")
        print(f"Likes: {detail.likes_count}")
        print(f"Transcript: {detail.transcript_text[:200]}")

asyncio.run(main())

Features

  • Async-first: Built on httpx -- non-blocking by default, works with asyncio
  • Typed responses: Pydantic v2 models for every API response, full mypy --strict compliance
  • Search + detail: Keyword search with pagination, full jelly detail with Deepgram transcripts
  • High-level helpers: trending(), by_creator(), by_topic(), search_all_pages() for common patterns
  • Automatic retries: Exponential backoff on 429 rate limits and 5xx server errors
  • Path traversal protection: ID validation prevents injection of malicious paths
  • No auth required: The JellyJelly API is public -- just install and go

Examples

Search with Pagination

from jellyjelly import JellyClient

async def main():
    async with JellyClient() as client:
        # Page through results (1-indexed, max 100 per page)
        page1 = await client.search("crypto", page=1, page_size=20)
        page2 = await client.search("crypto", page=2, page_size=20)

        print(f"Total results: {page1.total}")
        print(f"Page 1: {len(page1.jellies)} jellies")
        print(f"Page 2: {len(page2.jellies)} jellies")

High-Level Search Helpers

from jellyjelly import JellyClient, trending, by_creator, by_topic, search_all_pages

async def main():
    async with JellyClient() as client:
        # Trending jellies (empty query, sorted by recency)
        top = await trending(client)

        # Filter by creator username
        iqram = await by_creator(client, "iqram")

        # Topic search
        crypto = await by_topic(client, "crypto")

        # Auto-paginate up to N pages
        all_results = await search_all_pages(client, "startup", max_pages=3)
        print(f"Collected {len(all_results)} jellies across pages")

Working with Jelly Details

from jellyjelly import JellyClient

async def main():
    async with JellyClient() as client:
        results = await client.search("AI")
        detail = await client.get_jelly(results.jellies[0].id)

        # Engagement metrics
        print(f"Views: {detail.all_views}")
        print(f"Likes: {detail.likes_count}")
        print(f"Comments: {detail.comments_count}")
        print(f"Tips: {detail.tips_total}")

        # Transcript (Deepgram)
        print(f"Transcript: {detail.transcript_text}")

        # AI-generated summary
        print(f"Summary: {detail.summary}")

        # Video info
        print(f"Duration: {detail.duration_seconds}s")

        # Creator shortcut
        if detail.creator:
            print(f"Created by: @{detail.creator.username}")

Custom Client Configuration

from jellyjelly import JellyClient

async def main():
    async with JellyClient(
        timeout=60.0,           # Request timeout in seconds (default: 30)
        max_retries=5,          # Retry attempts on 429/5xx (default: 3)
        retry_backoff_base=2.0, # Base delay for exponential backoff (default: 1.0)
    ) as client:
        results = await client.search("fintech")

Error Handling

from jellyjelly import JellyClient, JellyAPIError

async def main():
    async with JellyClient() as client:
        try:
            detail = await client.get_jelly("nonexistent-id")
        except JellyAPIError as e:
            print(f"API error {e.status_code}: {e.detail}")

API Reference

JellyClient

Method Description
search(query, page=1, page_size=10) Search jellies by keyword. Returns SearchResponse.
get_jelly(jelly_id) Get full detail for a jelly. Returns JellyDetail.
close() Close the underlying httpx client.

Search Helpers

Function Description
trending(client, page_size=10) Fetch trending jellies. Returns list[Jelly].
by_creator(client, username, page_size=10) Search by creator username (client-side filtered). Returns list[Jelly].
by_topic(client, topic, page_size=10) Search by topic keyword. Returns list[Jelly].
search_all_pages(client, query, max_pages=5, page_size=10) Auto-paginate through results. Returns list[Jelly].

Models

Model Key Fields
SearchResponse jellies, total, page, page_size
Jelly id, title, participants, thumbnail_url, posted_at
JellyDetail Everything in Jelly + all_views, likes_count, comments_count, tips_total, summary, video, transcript_overlay
JellyDetail (properties) transcript_text, creator, duration_seconds
Participant id, username, full_name, pfp_url
VideoInfo original_duration, preview_timecode, hls_master
TranscriptWord word, start, end, confidence, punctuated_word

API Endpoints

Endpoint SDK Method
GET /v3/jelly/search?q=...&page=1&page_size=10 client.search()
GET /v3/jelly/{id} client.get_jelly()

Development

git clone https://github.com/Wayy-Research/jelly.git
cd jelly
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"

# Run tests
pytest -v

# Type checking
mypy --strict src/

# Linting + formatting
ruff check .
black .

License

MIT License - see LICENSE for details.


Built with frustration and determination by Wayy Research -- Buffalo, NY. People for research, research for people.

Project details


Download files

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

Source Distribution

jellyjelly-0.1.0.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

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

jellyjelly-0.1.0-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file jellyjelly-0.1.0.tar.gz.

File metadata

  • Download URL: jellyjelly-0.1.0.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for jellyjelly-0.1.0.tar.gz
Algorithm Hash digest
SHA256 cb3d20139c03167044022eea43d370f5ca9d38544dffb342a6dcd511f3d2d5ae
MD5 c29d6ba85bdfa8757acf07d43704c504
BLAKE2b-256 aeb1a058b516de9ddb8871f82c3957ea2accba8ca5b555f04cf93dd25a079113

See more details on using hashes here.

Provenance

The following attestation bundles were made for jellyjelly-0.1.0.tar.gz:

Publisher: publish.yml on Wayy-Research/jelly

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file jellyjelly-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: jellyjelly-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for jellyjelly-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6fcca03fbcf4bc0dbe42128489760e39829658bd569ffe0d8960a966d3fb8fa1
MD5 48db3821b8319fb971abf90f82a125d8
BLAKE2b-256 ea084502a53faac0b4107b7929f9d7234747112f2f9774b0580b20a1dee56eef

See more details on using hashes here.

Provenance

The following attestation bundles were made for jellyjelly-0.1.0-py3-none-any.whl:

Publisher: publish.yml on Wayy-Research/jelly

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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