Purefeed API

Connect your AI tools directly to your Purefeed intelligence feed. Use the REST API or install the OpenClaw skill to access your signals, search tweets, generate content, and publish — all from your AI assistant.

Quick Start

1

Get your API key

Go to purefeed.ai/profile and create an API key in the Public API Keys section.

2

Test your key

Terminal
curl -s https://purefeed.ai/api/v1/auth/me \
  -H "Authorization: Bearer YOUR_API_KEY"
3

Start using the API

Use the REST endpoints below directly, or install the OpenClaw skill for the easiest AI integration.

OpenClaw Setup

The fastest way to connect Purefeed to your AI assistant. One command installs everything — no MCP server, no npm packages, no Node.js required.

Terminal
# Install the Purefeed skill
clawhub install purefeed

# Set your API key
openclaw config set skills.purefeed.env.PUREFEED_API_KEY "pf_live_YOUR_KEY_HERE"

That's it. OpenClaw will automatically use the Purefeed API when you ask about your Twitter feed, signals, or content generation. The skill teaches your AI assistant how to call the REST API directly via curl.

Don't have OpenClaw? You can use the REST API directly from any tool or script. All endpoints are documented below with curl examples.

API Reference

Base URL: https://purefeed.ai/api/v1

All requests require an Authorization: Bearer YOUR_API_KEY header. Responses return { "data": ..., "error": null } on success.

Account

GET/auth/me

Get the authenticated user's profile. Use to verify your API key works.

Feed & Discovery

GET/feed

Retrieve tweets ranked by signal relevance.

limitint
Max number of tweets to return
searchstring
Filter tweets by text search
signal_idsstring
Comma-separated signal IDs to filter by
POST/search

Full-text search across your signal-matched tweets.

querystringrequired
Natural language search query
limitint
Max number of results
GET/feed/signals

Get AI signal analysis for specific tweet IDs.

tweet_idsstringrequired
Comma-separated tweet IDs to analyze

Folders

GET/folders

List all bookmark folders.

GET/folders/:id/tweets

Get tweets saved in a specific folder.

limitint
Max number of tweets to return

Signals

GET/signals

List all signal configurations.

POST/signals

Create and auto-activate a new signal. Takes up to 6 hours to process existing tweets.

namestringrequired
Name for the signal
descriptionstring
Natural language description of what to detect
tagsstring[]
Tags for categorization
include_keywordsstring[]
Keywords to include in matching
exclude_keywordsstring[]
Keywords to exclude from matching
cronstring
Cron schedule (default: "0 */6 * * *"). Use "* * * * *" for realtime
timezonestring
IANA timezone for the schedule (default: "UTC")
GET/signals/:id

Get details of a specific signal.

PUT/signals/:id

Update a signal's name, description, or schedule.

namestring
New name
descriptionstring
New description
cronstring
New cron schedule (e.g. "0 5 * * 4" for Thursdays at 5am)
timezonestring
IANA timezone (e.g. "Europe/Madrid")
DELETE/signals/:id

Permanently delete a signal (irreversible).

GET/signals/:id/matches

Get tweets matching a specific signal.

limitint
Max number of matches to return

Content Studio

GET/styles

List available writing styles. Call before generating posts.

POST/studio/generate

Generate a tweet or thread using a writing style. Returns streaming text.

styleIdintrequired
Writing style ID (from /styles)
tweetIdsstring[]
Tweet IDs to use as inspiration
ideaPromptstring
Free-form prompt describing what to write about
POST/studio/humanize

Score a post for AI-likeness (1-100) and get a rewrite if score > 30. Returns streaming text.

postsstring[]required
Array of post texts to evaluate
POST/studio/publish

Publish a post to X/Twitter immediately. Requires Typefully connection.

postsstring[]required
Array of post texts (multiple = thread)
POST/studio/schedule

Schedule a post for a specific time.

postsstring[]required
Array of post texts
scheduledAtstring (ISO 8601)required
When to publish
POST/studio/draft

Save a post as a draft in Typefully.

postsstring[]required
Array of post texts
POST/studio/queue

Add a post to the next available posting slot.

postsstring[]required
Array of post texts

Response Examples

Feed / Search Response

GET /feed
{
  "data": [
    {
      "tweet_id": "1234567890",
      "full_text": "The latest AI breakthroughs are...",
      "creation_date": "2026-03-10T14:30:00Z",
      "views": 12500,
      "replies": 42,
      "retweets": 189,
      "screen_name": "techleader",
      "profile_image_url": "https://pbs.twimg.com/...",
      "signals": [
        {
          "signal_name": "AI Research",
          "content": "Discusses new transformer architecture...",
          "sentiment": "positive",
          "industry_category": "Technology"
        }
      ]
    }
  ]
}

Signals List Response

GET /signals
{
  "data": [
    {
      "id": 1,
      "user_signal_name": "AI Research",
      "signal_description": "Track breakthroughs in AI...",
      "creation_date": "2026-01-15T09:00:00Z"
    }
  ]
}

Humanize Response (Pass)

POST /studio/humanize — score below threshold
{
  "data": {
    "score": 22,
    "reasons": "Natural tone, varied sentence structure...",
    "rewrite": null
  }
}

Humanize Response (Fail)

When the score exceeds 30, the response includes a rewritten version. The first line is JSON with the score and reasons, followed by the rewritten text.

POST /studio/humanize — score above threshold
{"score": 78, "reasons": "Repetitive structure, overly formal..."}
Here's a more natural version of your post that maintains
the core message while sounding more authentic...

Error Reference

ErrorWhat to do
401 UnauthorizedAPI key is invalid or expired. Create a new key at purefeed.ai/profile.
429 Too Many RequestsRate limit exceeded. Wait and retry (60 req/min).
No Typefully connectionConnect your Typefully account in settings to publish posts.
No LLM API keys configuredAdd your LLM API keys in Studio settings.
Writing style not foundCall GET /styles to get valid style IDs.
Signal not foundCall GET /signals to get valid signal IDs.

Rate Limits

60 requests per minute

  • Rate limits are per API key.
  • Streaming endpoints count as 1 request each.
  • When rate-limited, the response includes a Retry-After header indicating how long to wait.
  • HTTP status 429 is returned when the limit is exceeded.
Need help? Reach out at team@purefeed.ai or check your profile settings for API key management.