How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
https://wordpress.org/newsin WordPress site URLs. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Export public WordPress posts and pages with HTML, plain text, dates, categories and tags. Add one site URL for a small content sample. The site must allow its public WordPress REST API. Limits and source errors are shown in the run summary.
Who uses it
Site migration teams
Export content as JSON for your migration tool.
SEO specialists
Get a list of posts with dates and tags to review in a sheet.
Text researchers
Collect plain text of blog posts for your analysis.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.0045 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Saved post or page | $0.0019 | One unique public published post or page saved to the Dataset. |
Examples
- One post or page: about $0.0064.
- 1,000 posts and pages: about $1.90.
- Every day 100 posts and pages, for 30 days: about $5.83 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 2,600 posts and pages.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can it get drafts or private posts?
No. It reads only published, public posts and pages.
Why does a site not work?
Some sites turn off the public WordPress REST API. Then the tool cannot read them.
Does it change anything on the site?
No. It only reads data. It never edits the site.
Does it get comments or images?
No. Comments, media files and author profiles are not included.
Do I need a WordPress login?
No. The source API must be public. The Actor does not accept passwords or cookies.
Does it work on every WordPress site?
No. It needs a reachable core REST API on that site. Some hosted sites, plugins and firewalls change or block the API.
Is an empty run free?
No. It has the start event and Apify platform usage, but no saved-record event.
Can it collect all content without a limit?
No. Each run has explicit result, page, time, request and size limits. Check the summary before using an export.
Are category and tag names always available?
No. IDs can be present while embedded names are missing. Those values stay null and extractionStatus is partial. Standard pages have empty taxonomy arrays.
Details
Step by step on Apify
- Open Input.
- Add
https://wordpress.org/newsto WordPress site URLs (siteUrls). - Choose
postsandpages. - Set
maxResultsto 4,perPageto 2 andmaxPagesPerTypeto 1. - Click Start. Open the Dataset and check
id,titleTextandlink. - Open KVS
RUN_SUMMARY. The sample ispartialbecause more posts exist.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Content migration | Choose posts and pages | content.rendered, title.rendered, slug, link | Export JSON for your migration tool. |
| SEO content list | Add a site and small limit | id, titleText, link, date, categories | Export CSV for review. |
| Text collection | Choose posts and optional search | contentText, excerptText, sourceUrl | Read Dataset records in your text workflow. |
Tips for better results
- Start small: 4 results and 1 page per type. Check the output first.
- Read the run summary. An empty dataset alone does not tell you what happened.
- Use the search field to export only posts about one topic.
Limits and good to know
The result cap is 1,000 saved records per run. A live WordPress News export returned 1,000 supported posts at 512 MB. This proves that sample, not every WordPress site. Sources can change, block cloud IPs, disable REST API routes or return large content.
Troubleshooting
| Symptom | Possible reason | Check and next action |
|---|---|---|
| 0 rows, complete | A valid collection is empty or search has no matches | Check search and selected types. Remove search for a small new run. |
| 0 rows, error | Non-WordPress HTML, denied REST API or malformed JSON | Check outcomes.errorCode. Use the WordPress installation root and verify its public REST API. |
| not_found | Both supported REST route formats return 404 | Check the site root or subdirectory. This Actor cannot enable the API. |
| Some rows, partial | A limit, missing terms or one failed site | Check row extractionStatus and outcomes. Increase page/result caps only within the allowed range. |
| HTTP_429 or HTTP_5xx | Source rate limit or server problem | The Actor retries temporary failures up to twice. Increase requestDelayMs or try a small run later. Long Retry-After values stop with a clear code. |
| UNSAFE_ADDRESS or CROSS_SITE_REDIRECT | Private address or another destination host | Use a public site root. Private addresses and unrelated redirect hosts are rejected. |
| RESPONSE_TOO_LARGE or CONTENT_TOO_LARGE | The source payload exceeds a size limit | Lower perPage for response size. A single oversized field remains unsupported. |
| PAGE_LIMIT or RESULT_LIMIT | More source records exist than requested | The result is a bounded sample. Increase the matching cap to read more. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"sourceUrl": "https://wordpress.org/news",
"recordType": "POST",
"id": 21731,
"type": "post",
"status": "publish",
"link": "https://wordpress.org/news/2026/09/wordpress-7-1-2-release/",
"date": "2026-09-22T14:01:20",
"date_gmt": "2026-09-22T14:01:20",
"title": {
"rendered": "WordPress 7.1.2 Release"
},
"titleText": "WordPress 7.1.2 Release",
"categories": [
14,
15
],
"tags": [],
"categoryDetails": [
{
"id": 14,
"name": "Releases",
"slug": "releases",
"link": "https://wordpress.org/news/category/releases/"
},
{
"id": 15,
"name": "Security",
"slug": "security",
"link": "https://wordpress.org/news/category/security/"
}
],
"tagDetails": [],
"extractionStatus": "complete",
"content": {
"rendered": "\n<p class=\"wp-block-paragraph\">This security release features a fix for a critical severity security vulnerability.</p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong",
"protected": false
},
"contentText": "This security release features a fix for a critical severity security vulnerability.\n\nBecause this is a security release, it is recommended that you update your"
}Use it from code
Actor ID: cliqtomedia/wordpress-posts-pages-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/wordpress-posts-pages-scraper").call(run_input={
"siteUrls": [
"https://wordpress.org/news"
],
"contentTypes": [
"posts",
"pages"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~wordpress-posts-pages-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"siteUrls": ["https://wordpress.org/news"], "contentTypes": ["posts", "pages"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/wordpress-posts-pages-scraper")
result = tool.invoke({"run_input": {"siteUrls": ["https://wordpress.org/news"], "contentTypes": ["posts", "pages"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (23)
| Field | Type |
|---|---|
sourceUrl | string |
recordType | string |
type | string |
status | string |
link | string |
titleText | string |
contentText | string |
excerptText | string |
extractionStatus | string |
observedAt | string |
slug | string |
date | string |
date_gmt | string |
modified | string |
modified_gmt | string |
id | integer |
title | object |
content | object |
excerpt | object |
categories | array |
tags | array |
categoryDetails | array |
tagDetails | array |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| WordPress site URLs required | siteUrls | array | ["https://wordpress.org/news"] |
| Content to collect | contentTypes | array | ["posts", "pages"] |
| Maximum saved records | maxResults | integer | 100 |
| Maximum pages per content type | maxPagesPerType | integer | 5 |
| Records per API page | perPage | integer | 20 |
| Search in WordPress | search | string | "" |
| Delay between requests (ms) | requestDelayMs | integer | 1000 |