# Open Source License Obligation Scanner (`seeb/open-source-license-obligation-scanner`) Actor

Extract license names, attribution duties, copyleft signals, commercial-use limits, notice requirements, and compliance actions from open-source project pages.

- **URL**: https://apify.com/seeb/open-source-license-obligation-scanner.md
- **Developed by:** [Techionik](https://apify.com/seeb) (community)
- **Categories:** Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$25.00 / 1,000 license obligations

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

## Open Source License Obligation Scanner

Extract license names, attribution duties, copyleft signals, commercial-use limits, notice requirements, and compliance actions from open-source project pages.

### Why This Actor Is Useful

This actor helps teams turn open-source project pages, README license sections, and package notices into compliance-ready rows. It is useful when a buyer needs to know whether a dependency is permissive, copyleft, network-copyleft, attribution-only, or risky for commercial distribution.

It does not replace legal advice, but it gives reviewers clean evidence and obligation fields instead of a raw page dump.

### What It Extracts

- `projectName` - Project.
- `licenseName` - License.
- `licenseType` - License type.
- `commercialUse` - Commercial use.
- `attributionRequired` - Attribution required.
- `copyleftSignal` - Copyleft signal.
- `noticeRequirement` - Notice requirement.
- `sourceDistributionDuty` - Source duty.
- `recommendedAction` - Recommended action.
- `sourceUrl` - Source URL.
- `evidenceText` - Evidence.

### Practical Workflows

- Review dependency pages before procurement approval.
- Find copyleft obligations that may require legal review.
- Prepare attribution and notice inventories for shipped products.
- Compare project license risk across a vendor shortlist.

### Input

Paste one or more public license, README, repository, package, or project URLs. The actor scans those pages and returns license obligations, commercial-use signals, attribution requirements, copyleft risk, and recommended review actions.

- `startUrls` - Add public README, license, package, GitHub, npm, PyPI, or project pages that mention an open-source license.
- `sourceText` - Optional: paste license sections, README license notes, package license text, or dependency review notes. Use this when a page is blocked or you already have the text.
- `maxResults` - Stop after this many useful rows. Most users can leave this at 100.
- `requestTimeoutSecs` - How long to wait for each URL. Increase only for slow public pages.

### Example Input

```json
{
    "sourceText": [
        "VectorKit is released under AGPL-3.0. Commercial use is allowed, but network service modifications require source code disclosure. Copyright notice and license text must be included.",
        "TinyCharts license: MIT. Permission is granted for commercial use, modification, distribution, and private use. Include copyright notice in copies."
    ],
    "maxResults": 10,
    "requestTimeoutSecs": 20
}
```

### Example Output

```json
{
    "projectName": "VectorKit",
    "licenseName": "AGPL-3.0",
    "licenseType": "network service",
    "commercialUse": "Commercial use is allowed, but network service modifications require source code disclosure",
    "attributionRequired": "Copyright notice and license text must be included",
    "copyleftSignal": "AGPL",
    "noticeRequirement": "license text must be included",
    "sourceDistributionDuty": "source code disclosure",
    "recommendedAction": "AGPL",
    "sourceUrl": "pasted://source-1",
    "evidenceText": "VectorKit is released under AGPL-3.0. Commercial use is allowed, but network service modifications require source code disclosure. Copyright notice and license text must be included."
}
```

### Reliability Notes

The actor is intentionally lightweight and fast. It does not try to bypass captcha systems, private pages, paywalls, or login walls. When a site blocks direct fetching, paste the public visible text into `sourceText`; the same actor-specific parser will still produce structured rows.

### Limitations

- The actor extracts only information present in the supplied source.
- Missing source details remain blank instead of being guessed.
- Highly unusual wording may require pasted text or cleaner source snippets for best results.

### Output

Rows are written to the default Apify dataset with actor-specific fields and source evidence. The output is designed for spreadsheets, dashboards, client audits, procurement notes, SEO reports, developer research, and other marketplace buyer workflows.

# Actor input Schema

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

Paste one or more public pages to scan, such as LICENSE files, GitHub repositories, README pages, npm/PyPI package pages, or open-source project pages.

## `maxResults` (type: `integer`):

Stop after this many useful rows. Leave this at 100 for normal runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://github.com/apify/apify-sdk-js/blob/master/LICENSE"
    }
  ],
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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://github.com/apify/apify-sdk-js/blob/master/LICENSE"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seeb/open-source-license-obligation-scanner").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://github.com/apify/apify-sdk-js/blob/master/LICENSE" }] }

# Run the Actor and wait for it to finish
run = client.actor("seeb/open-source-license-obligation-scanner").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://github.com/apify/apify-sdk-js/blob/master/LICENSE"
    }
  ]
}' |
apify call seeb/open-source-license-obligation-scanner --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seeb/open-source-license-obligation-scanner"
        }
    }
}

```

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/jmuZkSnOswmmaiTHO/builds/sOXEa3PTkuCklsV68/openapi.json
