Shulem Deen APIshulemdeen.com ↗
Access all past speaking events and book signings from shulemdeen.com. Returns event location, date, venue, description, and notes via a single endpoint.
What is the Shulem Deen API?
The Shulem Deen API exposes 1 endpoint — get_past_events — that returns the complete archive of past speaking engagements and book signings listed on shulemdeen.com. Each response includes a total count alongside an events array, with per-event fields covering location, date and time, venue, description, and notes. The dataset spans events from 2015 through 2018.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/ffc942cb-1d5a-45fd-8fb0-a34f1501678f/get_past_events' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace shulemdeen-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Shulem Deen Events API Client
This module provides a Python client for the Shulem Deen Events API,
which scrapes past events from shulemdeen.com.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Any, Dict, List
from datetime import datetime
class ParseClient:
"""Client for interacting with the Parse API."""
def __init__(self, api_key: str = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided,
will attempt to load from PARSE_API_KEY environment variable.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "ffc942cb-1d5a-45fd-8fb0-a34f1501678f"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError(
"API key not provided. Set PARSE_API_KEY environment variable "
"or pass api_key parameter."
)
def _call(
self, endpoint: str, method: str = "POST", **params
) -> Dict[str, Any]:
"""
Make an API call to the Parse API.
Args:
endpoint: The API endpoint name.
method: HTTP method ("GET" or "POST").
**params: Additional parameters to pass to the API.
Returns:
Dictionary containing the API response.
Raises:
requests.exceptions.RequestException: If the API call fails.
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method == "GET":
response = requests.get(url, headers=headers, params=params)
elif method == "POST":
payload = params if params else {}
response = requests.post(url, headers=headers, json=payload)
else:
raise ValueError(f"Unsupported HTTP method: {method}")
response.raise_for_status()
return response.json()
def get_past_events(self) -> Dict[str, Any]:
"""
Retrieve all past events from Shulem Deen's website.
Returns:
Dictionary containing:
- events: List of event objects with location, date, and details
- total: Total count of events returned
"""
return self._call("get_past_events", method="GET")
def parse_event_date(date_str: str) -> datetime:
"""
Parse event date string into a datetime object.
Args:
date_str: Date string in format like "Tue 3/24/2015 7pm"
Returns:
Parsed datetime object (time component approximated to hour only).
"""
# Simple parser for common date formats
formats = ["%a %m/%d/%Y %I%p", "%a %m/%d/%y %I%p"]
for fmt in formats:
try:
return datetime.strptime(date_str, fmt)
except ValueError:
continue
# Return None if parsing fails
return None
def format_event_display(event: Dict[str, str]) -> str:
"""
Format an event dictionary for display.
Args:
event: Event dictionary with location, date, and details.
Returns:
Formatted string representation of the event.
"""
location = event.get("location", "Unknown Location")
date = event.get("date", "Unknown Date")
details = event.get("details", [])
output = f"\n📍 {location}"
output += f"\n📅 {date}"
if details:
output += "\n📝 Details:"
for detail in details:
output += f"\n • {detail}"
return output
def main():
"""Main execution demonstrating practical API usage."""
# Initialize the client
client = ParseClient()
print("=" * 70)
print("Shulem Deen Events API - Event Retrieval Example")
print("=" * 70)
# Fetch all past events
print("\n🔄 Fetching past events from shulemdeen.com...")
response = client.get_past_events()
events = response.get("events", [])
total_count = response.get("total", 0)
print(f"\n✅ Retrieved {total_count} events total\n")
# Analyze and display events
print(f"Showing first 10 events:\n")
parsed_events = []
for idx, event in enumerate(events[:10], 1):
print(f"{idx}. {format_event_display(event)}\n")
# Attempt to parse date for sorting
parsed_date = parse_event_date(event.get("date", ""))
if parsed_date:
parsed_events.append({"event": event, "parsed_date": parsed_date})
# Group events by location (practical use case)
print("\n" + "=" * 70)
print("Events Grouped by Location (all events)")
print("=" * 70)
location_groups: Dict[str, List[Dict]] = {}
for event in events:
location = event.get("location", "Unknown")
if location not in location_groups:
location_groups[location] = []
location_groups[location].append(event)
# Sort locations by event count
sorted_locations = sorted(
location_groups.items(), key=lambda x: len(x[1]), reverse=True
)
print(f"\nFound {len(location_groups)} unique locations:\n")
for idx, (location, location_events) in enumerate(sorted_locations[:15], 1):
print(f"{idx}. {location}: {len(location_events)} event(s)")
# Summary statistics
print("\n" + "=" * 70)
print("Summary Statistics")
print("=" * 70)
print(f"Total Events: {total_count}")
print(f"Unique Locations: {len(location_groups)}")
print(f"Top Location: {sorted_locations[0][0]} ({len(sorted_locations[0][1])} events)")
if parsed_events:
# Sort by date
parsed_events.sort(key=lambda x: x["parsed_date"])
earliest = parsed_events[0]["parsed_date"]
latest = parsed_events[-1]["parsed_date"]
print(f"Date Range: {earliest.strftime('%B %Y')} to {latest.strftime('%B %Y')}")
if __name__ == "__main__":
main()Retrieves all past events listed on shulemdeen.com/events. Returns a list of events with location, date/time, and additional details such as venue, description, and notes. Events span from 2015 to 2018.
No input parameters required.
{
"type": "object",
"fields": {
"total": "integer count of events returned",
"events": "array of event objects with location, date, and details"
},
"sample": {
"total": 94,
"events": [
{
"date": "Tue 3/24/2015 7pm",
"details": [
"BOOK LAUNCH"
],
"location": "Brooklyn, NY"
},
{
"date": "Thur 3/26/15 7pm",
"details": [
"BOOK PARTY: For Footsteps members and guests only. If you are not a Footsteps member and would like to attend, please contact Footsteps.",
"The Footsteps Space",
"Books will be available for sale at cost."
],
"location": "New York City"
},
{
"date": "Thur 4/9/15 7pm",
"details": [
"Main Point Books, 1041 W Lancaster Ave, Bryn Mawr, PA 19010"
],
"location": "Philadelphia, PA"
}
]
}
}About the Shulem Deen API
What the API Returns
The get_past_events endpoint returns a structured list of all past events from shulemdeen.com/events. The top-level response includes a total integer showing how many events were found, and an events array containing one object per event. Each event object carries fields for location, date/time, venue, description, and any additional notes attached to the listing.
Event Coverage and Scope
All events in the dataset are historical, spanning 2015 to 2018. They include speaking engagements, book signings, and similar public appearances by author Shulem Deen. The endpoint takes no input parameters — a single call retrieves the full archive without pagination or filtering required.
Response Shape
The events array contains objects where each entry provides enough detail to reconstruct the public event listing: where it was held (location and venue), when it occurred (date and time), what it was about (description), and any supplementary remarks (notes). The total field at the top level gives an immediate count without iterating the array.
The Shulem Deen API is a managed, monitored endpoint for shulemdeen.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when shulemdeen.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official shulemdeen.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build an author profile page that lists Shulem Deen's full public appearance history with dates and venues.
- Aggregate event data from multiple authors to compare speaking tour patterns across years.
- Cross-reference event locations against a map to visualize geographic reach of a book promotion tour.
- Populate a research database of Jewish memoir author public engagements for academic study.
- Feed event descriptions and notes into a text corpus for NLP or sentiment analysis projects.
- Track how event activity changed year-over-year between 2015 and 2018 using the date fields.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does shulemdeen.com have an official developer API?+
What does `get_past_events` actually return for each event?+
events array includes the event location, date and time, venue name, a text description of the event, and any notes listed on the page. The top-level total field gives the count of all returned events.