WarmySender APIwarmysender.com ↗
Access WarmySender's LinkedIn outreach content, guides, documentation articles, and blog posts via 7 structured endpoints. Filter by collection, category, or slug.
What is the WarmySender API?
The WarmySender API exposes 7 endpoints that return structured data from warmysender.com, covering product features, use cases, integrations, competitor comparisons, glossary terms, documentation articles, and blog posts. The get_documentation_article endpoint delivers full article bodies with last-updated dates — useful for tracking LinkedIn rate-limit guidance and campaign pacing rules. The list_content endpoint covers six distinct collections and returns per-item slugs, headlines, and category labels in a single response.
curl -X GET 'https://api.parse.bot/scraper/c4c989fb-060c-4145-904f-522b9a831f9d/list_content?collection=features' \ -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 warmysender-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.
"""Walkthrough: WarmySender public content API — bounded, re-runnable."""
from parse_apis.warmysender_com_api import WarmySender, Collection, InputNotFound
client = WarmySender()
# Browse feature pages and drill into the first one for full content.
feature = client.content_summaries.list(collection=Collection.FEATURES, limit=3).first()
if feature is not None:
print(feature.title, feature.headline)
detail = feature.details(collection=Collection.FEATURES)
print(detail.meta_title)
if detail.faqs:
print("FAQ:", detail.faqs[0].question)
# List blog categories, pick one, then list its posts.
category = client.blog_post_summaries.list_categories(limit=5).first()
if category is not None:
for post_summary in client.blog_post_summaries.list(category=category, limit=3):
print(post_summary.title, post_summary.author_name)
# Drill into a post for the full body and metadata.
summary = client.blog_post_summaries.list(category=category, limit=1).first()
if summary is not None:
post = summary.details()
print(post.title, post.read_time_minutes, post.tags)
# Point-lookup a blog post by slug discovered above.
if summary is not None:
try:
full = client.blog_posts.get(slug=summary.slug)
print(full.content_text[:120])
except InputNotFound:
print("Post not found")
# Documentation: list articles, then fetch the first one.
doc_summary = client.documentation_summaries.list(limit=3).first()
if doc_summary is not None:
article = doc_summary.details()
print(article.title, article.last_updated)
print("exercised: content_summaries.list / details / blog_post_summaries.list_categories"
" / blog_post_summaries.list / details / blog_posts.get / documentation_summaries.list / details")
Lists the published entries of one WarmySender content collection (features, guides, use_cases, glossary, integrations or comparisons) as summaries, one row per page. The site returns the whole collection in one response (35 features, 37 guides observed), so there is no pagination; `limit` caps the number of rows from the top of the site's ordering. The optional `category` filter is forwarded to the site and was verified on guides (e.g. 'linkedin' returns the 7 LinkedIn guides); other collections carry no category values, so filtering them returns an empty list. `category`, `industry` and `competitor_name` are null for collections that do not carry them. Each row's `slug` is the key for get_content with the same `collection`.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of rows to return, from the top of the site's ordering. Omitted = the whole collection. |
| category | string | Exact category label to filter by, forwarded to the site. Observed on guides (e.g. 'linkedin'). Omitted = no filter. |
| collectionrequired | string | Which content collection to list. |
{
"type": "object",
"fields": {
"count": "number of rows returned",
"items": "array of content summaries: slug, title, headline, description, category, industry, competitor_name, locale",
"category": "echo of the category filter, null when omitted",
"collection": "echo of the requested collection"
},
"sample": {
"data": {
"count": 35,
"items": [
{
"slug": "linkedin-outreach",
"title": "LinkedIn Outreach",
"locale": "en",
"category": null,
"headline": "LinkedIn Outreach on Autopilot, Inside Safe Limits",
"industry": null,
"description": "Connect a LinkedIn account, pick a ramp, and the scheduler paces every invite, message and profile view inside safe limits.",
"competitor_name": null
}
],
"category": null,
"collection": "features"
},
"status": "success"
}
}About the WarmySender API
Content Collections
list_content accepts a required collection parameter drawn from six values — features, guides, use_cases, glossary, integrations, or comparisons — and returns an array of summaries with fields slug, title, headline, description, category, industry, competitor_name, and locale. Observed sizes are 35 features and 37 guides in a single unpaginated response. An optional category filter (case-sensitive, e.g. 'linkedin') limits results to a specific label when working with guides. get_content takes any slug from that index plus its collection name and returns the full page: content_html, content_text, faqs, benefits (features only), features (integrations only), verdict (comparisons only), and industry (use_cases only) — fields that don't apply to the requested collection come back as null.
Documentation
list_documentation returns the full documentation index with no parameters — each item carries slug, title, description, and position. get_documentation_article resolves a slug to the complete article body in both HTML and plain text, plus a last_updated date in YYYY-MM-DD format (may be null). Articles cover in-product behaviour such as LinkedIn connection-request limits, InMail quotas, message ramp schedules, and troubleshooting steps.
Blog
list_blog_categories returns all published category labels (103 observed), including mixed-casing variants like 'LinkedIn', 'linkedin-automation', and 'LinkedIn Outreach'. These exact strings feed the required category parameter of list_blog_posts, which returns post summaries including excerpt, author_name, read_time_minutes, published_at, last_updated, and tags. get_blog_post adds content_html, content_text, author_bio, meta_title, meta_description, and a citations array to the summary fields.
The WarmySender API is a managed, monitored endpoint for warmysender.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when warmysender.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 warmysender.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?+
- Monitor WarmySender's published LinkedIn connection and InMail rate-limit documentation by polling
get_documentation_articlefor changes to thelast_updatedfield. - Build a competitor-intelligence feed using the
comparisonscollection vialist_contentandget_content, surfacingverdicttext and feature breakdowns for each compared tool. - Index WarmySender's glossary collection with
list_contentto populate a LinkedIn automation terminology reference or knowledge base. - Track new blog posts across all 103 categories by calling
list_blog_categoriesthenlist_blog_poststo surface freshpublished_atentries and theirtags. - Aggregate use-case pages filtered by
industryfield fromget_contentto map which verticals WarmySender targets with LinkedIn outreach workflows. - Pull integration pages from the
integrationscollection to extractfeaturesarrays showing which capabilities WarmySender documents for each connected tool. - Retrieve full guide bodies with
get_contenton theguidescollection, filtered bycategory: 'linkedin', to extract structuredfaqsfor customer-support tooling.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does WarmySender have an official developer API?+
What does `get_documentation_article` return beyond the article text?+
title, description, content_html, content_text, slug, and a last_updated date in YYYY-MM-DD format. The date may be null when the site does not report one. Slugs must come from list_documentation — an unrecognised slug does not throw an error but may return stale or empty content.How do blog category labels work, and are they case-sensitive?+
'LinkedIn' and 'linkedin-automation' are distinct values. Retrieve the full list from list_blog_categories before calling list_blog_posts; a label the site does not recognise returns an empty list rather than an error.Does the API expose WarmySender account-level data, such as campaign metrics or connected LinkedIn account status?+
Is there pagination for large collections?+
list_content accepts an optional limit integer to cap the rows returned, but there is no page or offset parameter because the source does not paginate these collections. Blog post listings are also returned in one response per category with no pagination.