# Flathub App Scraper - Linux App Store Metadata & Releases (`ahmdshrif/flathub-app-metadata-scraper`) Actor

Fetches structured metadata, license, verification status, release history, and runtime/SDK details for Flathub Linux apps directly from Flathub's official appstream JSON API.

- **URL**: https://apify.com/ahmdshrif/flathub-app-metadata-scraper.md
- **Developed by:** [Ahmed](https://apify.com/ahmdshrif) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 actor run starteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Flathub App Scraper

Fetches structured metadata for Linux apps published on Flathub — name, developer, license, verification status, release history, and runtime/SDK details — directly from Flathub's official appstream JSON API. Built for developers maintaining app catalogs, Linux distro tooling, package monitoring dashboards, or anyone tracking Flatpak app updates and licensing at scale.

### Why this scraper

- Reads Flathub's official appstream JSON API instead of scraping rendered HTML, so fields like release history, verification method, runtime/SDK, and content-rating age come out structured and complete rather than parsed from markup.
- Returns 26 flattened fields per app, including release changelogs, developer verification, and license flags — data that thinner metadata scrapers typically don't expose.
- Priced at $0.002 per run, charged once per actor start regardless of how many app IDs you pass in.

### Output fields

| Field | Type | Description |
|---|---|---|
| appId | string | Flathub application ID, e.g. org.gimp.GIMP |
| name | string | Application display name |
| summary | string | Short one-line summary of the app |
| description | string | Full HTML description text |
| developerName | string | Name of the developer or team |
| projectLicense | string | SPDX project license identifier |
| isFreeLicense | boolean | Whether the license is a free/open-source license |
| categories | string | Comma-separated AppStream categories |
| keywords | string | Comma-separated search keywords |
| iconUrl | string | URL of the 128x128 app icon |
| homepageUrl | string | Project homepage URL |
| bugtrackerUrl | string | Bug tracker URL |
| donationUrl | string | Donation page URL |
| verified | boolean | Whether the developer identity is verified by Flathub |
| verificationMethod | string | Method used to verify the developer, e.g. website |
| isEol | boolean | Whether the app is marked end-of-life |
| latestVersion | string | Version string of the newest release |
| latestReleaseDate | string | Unix timestamp of the newest release |
| latestReleaseDescription | string | HTML changelog of the newest release |
| releaseCount | integer | Number of releases listed for the app |
| runtime | string | Flatpak runtime the app is built against |
| sdk | string | Flatpak SDK the app is built with |
| appType | string | AppStream component type, e.g. desktop-application |
| isMobileFriendly | boolean | Whether the app is flagged mobile-friendly |
| contentRatingAge | integer | Minimum content-rating age (ESRB) in years |
| screenshotCount | integer | Number of screenshots available for the app |

### Input

```json
{
  "startUrls": [
    { "url": "https://flathub.org/api/v2/appstream/org.gimp.GIMP" }
  ],
  "maxItems": 50
}
```

### Output

```json
{
  "appId": "org.gimp.GIMP",
  "name": "GNU Image Manipulation Program",
  "summary": "High-end image creation and manipulation",
  "developerName": "The GIMP team",
  "projectLicense": "GPL-3.0+ AND LGPL-3.0+",
  "isFreeLicense": true,
  "categories": "Graphics, 2DGraphics, RasterGraphics",
  "keywords": "GIMP, Photoshop",
  "iconUrl": "https://dl.flathub.org/media/org/gimp/GIMP/ab48223ba11e3bad9493fcda45e9ac04/icons/128x128/org.gimp.GIMP.png",
  "homepageUrl": "https://www.gimp.org/",
  "bugtrackerUrl": "https://gitlab.gnome.org/GNOME/gimp/issues/new",
  "donationUrl": "https://www.gimp.org/donating/",
  "verified": true,
  "verificationMethod": "website",
  "isEol": false,
  "latestVersion": "3.2.4",
  "latestReleaseDate": "1776384000",
  "releaseCount": 4,
  "runtime": "org.gnome.Platform/x86_64/50",
  "sdk": "org.gnome.Sdk/x86_64/50",
  "appType": "desktop-application",
  "isMobileFriendly": false,
  "contentRatingAge": 3,
  "screenshotCount": 4
}
```

### Pricing

$0.002 per actor run, charged once regardless of how many app IDs you list in `startUrls`. Scraping 50 apps in a single run still costs $0.002 total.

### Use cases

- Maintaining a third-party Flatpak catalog or search index that needs license, verification, and runtime data not shown in the Flathub web UI.
- Monitoring a set of apps for new releases by polling `latestVersion` and `latestReleaseDate` on a schedule.
- Auditing Flatpak dependencies across a distro or CI pipeline for license compliance using `projectLicense` and `isFreeLicense`.

# Actor input Schema

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

Pages to export.

## `maxItems` (type: `integer`):

Stop after this many records.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://flathub.org/api/v2/appstream/org.gimp.GIMP"
    },
    {
      "url": "https://flathub.org/api/v2/appstream/org.blender.Blender"
    },
    {
      "url": "https://flathub.org/api/v2/appstream/com.spotify.Client"
    }
  ],
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

One structured record per input URL.

# 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://flathub.org/api/v2/appstream/org.gimp.GIMP"
        },
        {
            "url": "https://flathub.org/api/v2/appstream/org.blender.Blender"
        },
        {
            "url": "https://flathub.org/api/v2/appstream/com.spotify.Client"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmdshrif/flathub-app-metadata-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://flathub.org/api/v2/appstream/org.gimp.GIMP" },
        { "url": "https://flathub.org/api/v2/appstream/org.blender.Blender" },
        { "url": "https://flathub.org/api/v2/appstream/com.spotify.Client" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ahmdshrif/flathub-app-metadata-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://flathub.org/api/v2/appstream/org.gimp.GIMP"
    },
    {
      "url": "https://flathub.org/api/v2/appstream/org.blender.Blender"
    },
    {
      "url": "https://flathub.org/api/v2/appstream/com.spotify.Client"
    }
  ]
}' |
apify call ahmdshrif/flathub-app-metadata-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmdshrif/flathub-app-metadata-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/y6g3qYlmSRCrJDtWt/builds/wn4WDpl2brgAS9rsg/openapi.json
