Lightweight async Python client for the JellyJelly API
Project description
jellyjelly
Async Python client for the JellyJelly public API
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 withasyncio - Typed responses: Pydantic v2 models for every API response, full
mypy --strictcompliance - 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb3d20139c03167044022eea43d370f5ca9d38544dffb342a6dcd511f3d2d5ae
|
|
| MD5 |
c29d6ba85bdfa8757acf07d43704c504
|
|
| BLAKE2b-256 |
aeb1a058b516de9ddb8871f82c3957ea2accba8ca5b555f04cf93dd25a079113
|
Provenance
The following attestation bundles were made for jellyjelly-0.1.0.tar.gz:
Publisher:
publish.yml on Wayy-Research/jelly
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jellyjelly-0.1.0.tar.gz -
Subject digest:
cb3d20139c03167044022eea43d370f5ca9d38544dffb342a6dcd511f3d2d5ae - Sigstore transparency entry: 1008610568
- Sigstore integration time:
-
Permalink:
Wayy-Research/jelly@d50993fe1924d6a04315bbf9c2d91823fb03297b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Wayy-Research
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d50993fe1924d6a04315bbf9c2d91823fb03297b -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fcca03fbcf4bc0dbe42128489760e39829658bd569ffe0d8960a966d3fb8fa1
|
|
| MD5 |
48db3821b8319fb971abf90f82a125d8
|
|
| BLAKE2b-256 |
ea084502a53faac0b4107b7929f9d7234747112f2f9774b0580b20a1dee56eef
|
Provenance
The following attestation bundles were made for jellyjelly-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Wayy-Research/jelly
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jellyjelly-0.1.0-py3-none-any.whl -
Subject digest:
6fcca03fbcf4bc0dbe42128489760e39829658bd569ffe0d8960a966d3fb8fa1 - Sigstore transparency entry: 1008610571
- Sigstore integration time:
-
Permalink:
Wayy-Research/jelly@d50993fe1924d6a04315bbf9c2d91823fb03297b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Wayy-Research
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@d50993fe1924d6a04315bbf9c2d91823fb03297b -
Trigger Event:
release
-
Statement type: