# Ameba Blog Profile Scraper (`hgservices/ameba-blog-profile-scraper`) Actor

Scrapes a complete Ameba (ameblo.jp) blog profile: blogger info, blog stats, themes, monthly archive counts, and every post,   with optional full post bodies, images, and hashtags.

- **URL**: https://apify.com/hgservices/ameba-blog-profile-scraper.md
- **Developed by:** [Harish Garg](https://apify.com/hgservices) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 scraped posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Ameba Blog Profile Scraper** extracts a complete public [Ameba](https://ameblo.jp/) (ameblo.jp) blog in one run: the **blogger profile**, **blog statistics**, **themes**, **monthly post archive**, and **every blog post** — with optional **full post text**, in-post **images**, and **hashtags**. Give it a blog URL such as `https://ameblo.jp/tsuji-nozomi/` and get clean, structured JSON.

Ameba is Japan's largest blogging platform and hosts most Japanese celebrity, idol, model, and official corporate blogs. This scraper turns those pages into a dataset you can download as **JSON, CSV, Excel, XML, or HTML**, pull through the **Apify API**, connect to Google Sheets, Slack, Zapier, or Make, or hand to an **AI agent over MCP**.

### What does Ameba Blog Profile Scraper do?

It reads one or more public ameblo.jp blogs and returns one dataset row per blog post. The blogger's profile and blog-level statistics are merged into every row, so a single export gives you both the author and the content.

It collects:

- **Blogger profile** — nickname, blog title, blog description, bio text, profile images, sex, birthday, blood type, official-blog and top-blogger flags, and official categories.
- **Blog statistics** — total post count, page count, per-theme post counts, and a per-month post archive that covers the blog's full history.
- **Posts** — title, canonical URL, entry ID, theme, hashtags, publish and update timestamps, lead image, and PR (sponsored) flag.
- **Post bodies (optional)** — full body text, raw HTML, and every in-post image URL at original resolution.

You can scrape the newest 20 to 5,000 posts per blog, or the complete history — including blogs with more than 20,000 posts.

### Why scrape Ameba blogs?

- **Japanese influencer and celebrity research** — Ameba blogs are the primary channel for many Japanese talents. Post frequency, themes, and PR flags map directly onto activity and sponsorship.
- **Social media monitoring and press clipping** — track what a person, agency, or brand publishes, and archive it with timestamps.
- **Trend and content analysis** — the monthly archive and per-theme counts give you a blog's whole posting history without downloading every post.
- **Market research on Japanese beauty, fashion, and lifestyle** — mine post text and hashtags for products, brands, and topics.
- **Dataset building** — export long-form Japanese blog text with metadata for analysis or NLP work.

### How to scrape an Ameba blog

1. Open Ameba Blog Profile Scraper in [Apify Console](https://console.apify.com/actors) and click **Try for free**.
2. In the **Input** tab, enter one or more Ameba blog URLs (`https://ameblo.jp/tsuji-nozomi/`) or bare Ameba IDs (`tsuji-nozomi`).
3. Choose whether you need post bodies, and set **Max posts per blog** if you do not want the full history.
4. Click **Save & Start**.
5. When the run finishes, open the **Output** tab to preview the data. Download it as JSON, CSV, or Excel, or fetch it from the API.

You can also **schedule** the run and set up **webhooks or integrations**, so new posts flow straight into your own systems.

### Input

| Field                                    | Type    | Default                           | Description                                                                                                                                          |
| ---------------------------------------- | ------- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Blog URLs or Ameba IDs** (`startUrls`) | array   | `https://ameblo.jp/tsuji-nozomi/` | One or more Ameba blogs. Full blog URLs, bare Ameba IDs, and any entry or archive URL of a blog all work.                                            |
| **Post body content** (`postBodyMode`)   | select  | `none`                            | `none` — no body. `text` — body text and in-post images. `text_html` — body text, raw HTML, and images. Bodies make a run slower and more expensive. |
| **Scrape all posts** (`scrapeAllPosts`)  | boolean | `false`                           | Scrape the complete history of each blog and ignore the post limit.                                                                                  |
| **Max posts per blog** (`maxPosts`)      | integer | `100`                             | Newest-first cap per blog, from 20 to 5,000. Ignored when **Scrape all posts** is on.                                                                |

Example input:

```json
{
    "startUrls": [{ "url": "https://ameblo.jp/tsuji-nozomi/" }],
    "postBodyMode": "text",
    "scrapeAllPosts": false,
    "maxPosts": 100
}
```

### Output

Each dataset row is one blog post, with the blogger profile merged in as `profile_*` fields. The **Output** tab offers an *Overview* view and a *Posts* view. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "item_type": "post",
    "ameba_id": "tsuji-nozomi",
    "entry_id": 12975182730,
    "url": "https://ameblo.jp/tsuji-nozomi/entry-12975182730.html",
    "title": "夢1歳♡",
    "theme_id": 10010811052,
    "theme_name": "ブログ",
    "hashtags": [],
    "published_at": "2026-08-09T00:28:38.000+09:00",
    "updated_at": "2026-08-09T00:28:52.000+09:00",
    "publish_flg": "open",
    "is_pr": false,
    "image_url": "https://stat.ameba.jp/user_images/...",
    "body_text": "８月８日❤️夢空が１歳になりましたぁ…",
    "images": [{ "url": "https://stat.ameba.jp/user_images/...", "image_id": "15810399127", "order": 0 }],
    "profile_blog_url": "https://ameblo.jp/tsuji-nozomi/",
    "profile_nickname": "辻希美",
    "profile_blog_title": "辻希美オフィシャルブログ「のんピース」Powered by Ameba",
    "profile_blog_description": "辻希美オフィシャルブログ",
    "profile_sex_text": "女性",
    "profile_birthday": "1987-06-17T09:00:00.000+09:00",
    "profile_bloodtype_text": "O型",
    "profile_free_text": "official instagram\n@tsujinozomi_official",
    "profile_image_url": "https://stat.profile.ameba.jp/...",
    "profile_is_official": true,
    "profile_total_entries": 24707,
    "profile_monthly_archive": [{ "year": 2026, "month": 8, "count": 1 }],
    "profile_themes": [{ "theme_id": "10010811052", "theme_name": "ブログ", "entry_cnt": 24615 }],
    "scraped_at": "2026-08-29T15:34:00.000Z"
}
```

### Output data fields

| Field                                                                 | Description                                            |
| --------------------------------------------------------------------- | ------------------------------------------------------ |
| `ameba_id`, `blog_id`                                                 | Blog owner's Ameba ID (URL slug) and numeric blog ID.  |
| `entry_id`, `url`                                                     | Post ID and canonical post URL.                        |
| `title`                                                               | Post title.                                            |
| `published_at`, `created_at`, `updated_at`                            | Post timestamps, ISO 8601 in Japan Standard Time.      |
| `theme_id`, `theme_name`                                              | Theme (category) the post belongs to.                  |
| `hashtags`                                                            | Hashtags on the post.                                  |
| `is_pr`, `publish_flg`                                                | PR (sponsored) flag and publish status.                |
| `image_url`, `image_id`                                               | Lead image at original resolution.                     |
| `body_text`                                                           | Full post text. Present when post bodies are enabled.  |
| `body_html`                                                           | Raw post HTML. Present in **Text and HTML** mode only. |
| `images`                                                              | Every in-post image, with URL, image ID, and order.    |
| `profile_nickname`                                                    | Blogger display name.                                  |
| `profile_blog_title`, `profile_blog_description`                      | Blog title and description.                            |
| `profile_free_text`                                                   | Blogger bio.                                           |
| `profile_sex_text`, `profile_birthday`, `profile_bloodtype_text`      | Demographic fields, when the blogger filled them in.   |
| `profile_image_url`, `profile_main_thumbnail_url`                     | Profile and cover images.                              |
| `profile_is_official`, `profile_is_top_blogger`, `profile_is_premium` | Account status flags.                                  |
| `profile_official_categories`                                         | Categories assigned to official blogs.                 |
| `profile_total_entries`                                               | Total number of posts on the blog.                     |
| `profile_monthly_archive`                                             | Post count for every month of the blog's history.      |
| `profile_themes`                                                      | All blog themes, with a post count for each.           |
| `scraped_at`                                                          | Time the row was collected.                            |

### How to scrape Ameba blogs with the Apify API

Every run and its dataset are available through the [Apify API](https://docs.apify.com/api/v2). Replace `<YOUR_API_TOKEN>` with your token from **Settings → Integrations** in Apify Console.

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('hgservices/ameba-blog-profile-scraper').call({
    startUrls: [{ url: 'https://ameblo.jp/tsuji-nozomi/' }],
    postBodyMode: 'text',
    maxPosts: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python** (`apify-client` 3.0 or later)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("hgservices/ameba-blog-profile-scraper").call(run_input={
    "startUrls": [{"url": "https://ameblo.jp/tsuji-nozomi/"}],
    "postBodyMode": "text",
    "maxPosts": 100,
})
if run is None:
    raise RuntimeError("Actor run was not found.")

for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

**cURL** — run the Actor and get the dataset in one synchronous call:

```bash
curl -X POST "https://api.apify.com/v2/actors/hgservices~ameba-blog-profile-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{ "url": "https://ameblo.jp/tsuji-nozomi/" }],
    "postBodyMode": "text",
    "maxPosts": 100
  }'
```

The synchronous call above returns HTTP 408 if the run takes longer than 300 seconds, so use it only for small, capped runs. For a full-history run, start it with `POST /v2/actors/hgservices~ameba-blog-profile-scraper/runs`, then poll the run or use a webhook, and read the dataset when the run succeeds.

### Use Ameba Blog Profile Scraper with AI agents (MCP)

This Actor works as a tool for LLM agents through the [Apify MCP server](https://mcp.apify.com/). Claude, ChatGPT, Cursor, and other MCP clients can find it, read its input schema, run it, and read the results back. No glue code is needed.

Add the Apify MCP server to your client. In Claude Code, for example:

```bash
claude mcp add --transport http apify https://mcp.apify.com
```

Then ask your agent in plain language:

> Use the Ameba Blog Profile Scraper to get the newest 50 posts with body text from https://ameblo.jp/tsuji-nozomi/, then summarize the topics from this month.

Agents get the best results when the request names the blog URL, says whether post bodies are needed, and gives a post limit. That keeps the run fast and the cost predictable.

### How much does it cost to scrape Ameba blogs?

This Actor uses **pay per event** pricing, so you pay for the results you get, not for compute time. See the **Pricing** tab for the current price of each event.

| Event            | Charged when                                                                     | How often      |
| ---------------- | -------------------------------------------------------------------------------- | -------------- |
| `profile`        | The blogger profile, blog statistics, themes, and monthly archive are collected. | Once per blog. |
| `post`           | One post row is stored without a body.                                           | Once per post. |
| `post-with-body` | One post row is stored with body text (and HTML in **Text and HTML** mode).      | Once per post. |

A run without post bodies is the cheapest way to get a blog's full history and profile. Post bodies cost more per post, so cap the run when you do not need everything.

To control your spend, set **Maximum cost per run** when you start the Actor. The run stops cleanly as soon as it reaches that limit, and it never stores an item you were not charged for. **Max posts per blog** caps the volume directly.

Every Apify account also gets **$5 in free platform credit each month**, which is enough to try this Actor on a real blog.

### Tips

- **Start capped.** On a first run, set **Max posts per blog** to 100 and turn on post bodies. Check the data shape before you commit to a full-history run.
- **Skip bodies when you can.** Titles, themes, hashtags, timestamps, lead images, and the full profile are all available without post bodies, at a much lower cost.
- **Monitor new posts.** Schedule a daily run with **Max posts per blog** set to 20 and no bodies. That covers everything an active celebrity blog publishes in a day.
- **Scrape many blogs at once.** Put every blog URL in **Blog URLs or Ameba IDs** and get one dataset for all of them. The `ameba_id` field tells the rows apart.
- **Read `profile_monthly_archive` first.** It gives you a blog's complete posting history by month, without a single post body.

### FAQ

**Is it legal to scrape Ameba?**
Scraping publicly available data is generally legal. This Actor reads only public pages, at a polite rate, and never signs in. You are still responsible for Ameba's Terms of Service and for any personal-data law that applies to you. Ameba blogs are personal content, and profile fields include personal details. Do not republish scraped content in a way that infringes the blogger's copyright.

**Can it scrape private posts, comments, likes, or reader counts?**
No. It returns only publicly visible posts and profile data. Member-only (amember) posts, comments, and reactions are out of scope.

**Can it scrape more than one blog in a run?**
Yes. Add as many blog URLs or Ameba IDs as you want. Each blog's profile is merged into its own rows.

**Why are some profile fields empty?**
Those fields are optional on Ameba. Birthday, blood type, sex, and bio appear only when the blogger filled them in.

**Can it handle blogs with tens of thousands of posts?**
Yes. Turn on **Scrape all posts** to get the complete history. Use **Maximum cost per run** to keep the spend under control.

**Does it work with `ameblo.jp` URLs only?**
Yes — that is Ameba's blog domain. Any blog, entry, or archive URL under `ameblo.jp` is accepted, as is the bare Ameba ID.

**Can I get the data into Google Sheets, Slack, or my database?**
Yes. Use the Apify platform's integrations and webhooks, or read the dataset from the API in the format you need.

### Support and custom solutions

Did you find a bug, a missing field, or a blog that does not parse? Open a ticket on the **Issues** tab in Apify Console. Feature requests are welcome, and custom scraping solutions for Japanese platforms are available on request.

# Actor input Schema

## `startUrls` (type: `array`):

Ameba blog URLs (e.g. https://ameblo.jp/tsuji-nozomi/) or bare Ameba IDs (e.g. tsuji-nozomi). Any entrylist/entry URL of a blog also works — the blog home is derived from it.

## `postBodyMode` (type: `string`):

What to include for each post body. 'Text and HTML' fetches every post page for full body text, raw HTML, images, and JSON-LD metadata (much slower for large blogs). 'Text only' skips the raw HTML.

## `scrapeAllPosts` (type: `boolean`):

Scrape every post of each blog, ignoring the 'Max posts per blog' limit. Enable with care on very large blogs.

## `maxPosts` (type: `integer`):

Maximum number of posts to scrape per blog — the newest posts are selected first. Ignored when 'Scrape all posts' is enabled.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://ameblo.jp/tsuji-nozomi/"
    }
  ],
  "postBodyMode": "none",
  "scrapeAllPosts": false,
  "maxPosts": 100
}
```

# Actor output Schema

## `posts` (type: `string`):

One row per blog post, with the blogger profile merged in as profile\_\* columns.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://ameblo.jp/tsuji-nozomi/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("hgservices/ameba-blog-profile-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://ameblo.jp/tsuji-nozomi/" }] }

# Run the Actor and wait for it to finish
run = client.actor("hgservices/ameba-blog-profile-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://ameblo.jp/tsuji-nozomi/"
    }
  ]
}' |
apify call hgservices/ameba-blog-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hgservices/ameba-blog-profile-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/c1BVefe5nTh9pPgfv/builds/gKPnsqNWXq5eZwBWO/openapi.json
