# Boletín Oficial Chubut Scraper (`automation-lab/chubut-official-bulletin-monitor`) Actor

Monitor Chubut official bulletin PDFs and export complete keyword-matched legal, procurement, judicial, and administrative sections with source links.

- **URL**: https://apify.com/automation-lab/chubut-official-bulletin-monitor.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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

## Boletín Oficial Chubut Scraper

Monitor the **boletín oficial chubut** and extract complete legal, procurement, judicial, and administrative sections that contain your keywords. The Actor discovers recent editions from the Province of Chubut website, downloads the official text PDFs, and returns the full matched section—not a summary or a short search snippet.

Use it for scheduled legal monitoring, public-tender discovery, entity-name alerts, judicial notices, and auditable research. Every result includes its bulletin date, edition, heading, inferred issuing body, PDF pages, and canonical source URL.

### What this Actor does

1. Reads the newest bulletins from `boletin.chubut.gov.ar`, or accepts specific official PDF URLs.
2. Applies edition and publication-date filters before downloading PDFs.
3. Extracts text directly from each public text-based PDF.
4. Splits the bulletin into legal and administrative sections.
5. Tests each complete section against up to 20 keywords.
6. Saves only matching sections to the default Apify dataset.

It does not send email itself. Schedule the Actor and connect its dataset to email, Slack, a webhook, Zapier, Make, Google Sheets, or your own monitoring service.

### Who is it for?

- **Procurement teams** tracking licitaciones and public purchasing notices.
- **Law firms** monitoring edicts, resolutions, decrees, and judicial publications.
- **Compliance teams** checking organization, director, property, or counterparty names.
- **Journalists and researchers** building a sourced chronology of provincial decisions.
- **Public-sector suppliers** watching newly published opportunities.
- **Automation teams** replacing manual daily PDF downloads and searches.

### Why use this Actor?

- Returns the **complete matched section**, preserving context around each match.
- Uses official Province of Chubut source URLs.
- Supports both newest-edition discovery and exact PDF processing.
- Ignores capitalization and Spanish accents by default.
- Supports `any` and `all` keyword logic.
- Produces structured records ready for scheduled Tasks and integrations.
- Uses lightweight HTTP and PDF text extraction instead of a browser.

### Input parameters

| Field | Type | Default | Purpose |
|---|---:|---:|---|
| `keywords` | string\[] | required | One to 20 words or phrases to find. |
| `startUrls` | URL\[] | empty | Specific official Chubut bulletin PDFs. |
| `editionNumbers` | string\[] | empty | Restrict discovery to exact edition numbers. |
| `dateFrom` | string | empty | Earliest publication date, `YYYY-MM-DD`. |
| `dateTo` | string | empty | Latest publication date, `YYYY-MM-DD`. |
| `matchMode` | `any` / `all` | `any` | Require any keyword or every keyword in one section. |
| `caseSensitive` | boolean | `false` | Enforce exact case when enabled. |
| `maxBulletins` | integer | `5` | Maximum PDFs to download, from 1 to 100. |
| `maxItems` | integer | `100` | Maximum matched sections to save, from 1 to 5,000. |

When `startUrls` is present, the Actor processes those PDFs instead of discovering recent bulletins. Only official `boletin.chubut.gov.ar` PDF URLs are accepted.

### Get started

1. Open the Actor in Apify Console.
2. Enter at least one keyword, such as `licitación`.
3. Keep `maxBulletins` at `1` for a fast newest-edition check.
4. Click **Start**.
5. Open the **Dataset** tab to inspect complete matched sections.
6. Save the input as an Apify Task if you want recurring monitoring.
7. Add a schedule and integration for downstream notifications.

#### Basic input

```json
{
  "keywords": ["licitación"],
  "maxBulletins": 1,
  "maxItems": 20
}
```

#### Match all phrases in a date range

```json
{
  "keywords": ["Poder Judicial", "concurso"],
  "matchMode": "all",
  "dateFrom": "2026-08-10",
  "dateTo": "2026-08-14",
  "maxBulletins": 5,
  "maxItems": 20
}
```

#### Process one known bulletin PDF

```json
{
  "keywords": ["ACUERDO REGISTRADO"],
  "startUrls": [
    {
      "url": "https://boletin.chubut.gov.ar/archivos/boletines/Agosto%2014,%202026.pdf"
    }
  ],
  "maxBulletins": 1,
  "maxItems": 10
}
```

### Output fields

| Field | Meaning |
|---|---|
| `editionNumber` | Official bulletin number, or `unknown` if unavailable from an explicit PDF. |
| `bulletinDate` | Publication date in `YYYY-MM-DD`, when available. |
| `heading` | Heading that begins the matched section. |
| `issuingBody` | Authority inferred from nearby source headings, when identifiable. |
| `matchedKeywords` | Supplied keywords found in the section. |
| `sectionText` | Complete extracted text of the matched section. |
| `sourceUrl` | Canonical official PDF URL. |
| `detailUrl` | Official HTML detail URL for discovered bulletins. |
| `pageStart` | First PDF page containing the section. |
| `pageEnd` | Last PDF page containing the section. |
| `scrapedAt` | UTC extraction timestamp. |

### Example result

```json
{
  "editionNumber": "14911",
  "bulletinDate": "2026-08-14",
  "heading": "LICITACIÓN PÚBLICA DE PRECIOS N° 8/2026",
  "issuingBody": "SUPERIOR TRIBUNAL DE JUSTICIA",
  "matchedKeywords": ["licitación"],
  "sectionText": "LICITACIÓN PÚBLICA DE PRECIOS N° 8/2026\nObjeto: ...",
  "sourceUrl": "https://boletin.chubut.gov.ar/archivos/boletines/Agosto%2014,%202026.pdf",
  "detailUrl": "https://boletin.chubut.gov.ar/mostrar/6588",
  "pageStart": 17,
  "pageEnd": 18,
  "scrapedAt": "2026-08-14T20:00:00.000Z"
}
```

The example shortens `sectionText` for display. Dataset records contain the extracted section in full.

### How much does it cost to monitor Chubut official bulletins?

The Actor uses pay-per-event pricing:

- a one-time **Start** event of **$0.005 per run**;
- an **Item processed** event for each matched section saved;
- no item charge for downloaded bulletins or sections that do not match.

At the Bronze tier, the current item price is **$0.0062878 per matched section**. Example totals are approximately:

| Run | Calculation | Approximate total |
|---|---:|---:|
| Daily check with no matches | 0.005 + 0 | 0.005 USD |
| 10 matched sections | 0.005 + (10 × 0.0062878) | 0.067878 USD |
| 100 matched sections | 0.005 + (100 × 0.0062878) | 0.633780 USD |

Higher subscription tiers receive lower per-item prices. Apify compute charges, if applicable to your plan, are shown by the platform before and after each run.

### Schedule a daily bulletin monitor

Create an Apify Task with a stable input, then add a daily schedule after the bulletin's normal publication time. Keep `maxBulletins` low for daily checks. Your downstream system can deduplicate records by `editionNumber`, `heading`, and `sourceUrl`.

A schedule triggers a fresh run; the Actor does not maintain a hidden alert list or send notifications by itself.

### Procurement monitoring workflow

Use keywords such as `licitación`, a product phrase, a municipal name, or a supplier category. Export matched records to a spreadsheet or CRM, then qualify each opportunity using its complete notice text and source PDF.

`matchMode: "all"` is useful when a generic term produces too many results—for example, requiring both an agency name and a procurement phrase.

### Legal and entity-name monitoring

Search for a company, person, court phrase, decree number, or property-related term. Keyword matching is literal substring matching after optional case/accent normalization; it is not fuzzy entity resolution.

Names can be misspelled, hyphenated across PDF lines, or published in inflected forms. Consider multiple variants when completeness matters.

### Export to Sheets, Make, Zapier, or webhooks

The default dataset works with standard Apify integrations:

1. Run the Actor manually or on a schedule.
2. Select an integration from the run or Task.
3. Map `bulletinDate`, `heading`, `matchedKeywords`, `sectionText`, and `sourceUrl`.
4. Use `sourceUrl` as the audit link in alerts.
5. Deduplicate downstream if schedules overlap publication windows.

For high-volume text fields, confirm that the destination preserves multiline values.

### Use the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~chubut-official-bulletin-monitor/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["licitación"],"maxBulletins":1,"maxItems":20}'
```

To wait for completion and receive dataset items:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~chubut-official-bulletin-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["licitación"],"maxBulletins":1,"maxItems":20}'
```

### Use the Apify API with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/chubut-official-bulletin-monitor').call({
  keywords: ['Poder Judicial', 'concurso'],
  matchMode: 'all',
  maxBulletins: 5,
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use the Apify API with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/chubut-official-bulletin-monitor").call(
    run_input={
        "keywords": ["licitación"],
        "maxBulletins": 1,
        "maxItems": 20,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with Apify MCP

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/chubut-official-bulletin-monitor"
```

#### Claude Desktop setup

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/chubut-official-bulletin-monitor"
    }
  }
}
```

#### Cursor setup

Use the same HTTP MCP URL in **Cursor Settings → MCP → Add server** and name it `apify`.

#### VS Code setup

Add the same HTTP MCP URL to your VS Code MCP server configuration and start the `apify` server from the MCP panel.

Example prompts:

- “Run the Chubut bulletin monitor for `licitación` against the newest edition.”
- “Find sections containing both `Poder Judicial` and `concurso` in the last five bulletins.”
- “Return the official PDF links and complete matching text.”

### Limits and source behavior

- The source is the public Province of Chubut bulletin website.
- Only text-based official PDFs are supported; scanned image-only PDFs may return no text.
- Section boundaries are inferred from official headings and can vary between editions.
- `issuingBody` can be null when the bulletin does not identify an authority near a section heading.
- Discovery scans newest editions first and is capped at 100 PDFs per run.
- The Actor does not bypass login controls or process private documents.
- Source availability and publication timing are controlled by the Province of Chubut.

### Failure and no-result behavior

Malformed dates, unsupported hosts, non-PDF start URLs, and invalid limits fail the run with a clear error. Temporary HTTP failures are retried up to three times with bounded backoff.

A successful empty dataset means the selected bulletins contained no complete section matching the requested keyword logic. Try spelling variants, `matchMode: "any"`, a wider date range, or more bulletins.

### Responsible use

Official bulletins are public government records, but they can contain personal and legally sensitive information. Use the data for lawful research, compliance, procurement, and notification purposes. Verify important decisions against the linked PDF, follow applicable privacy and retention rules, and do not use results for harassment or unlawful profiling.

This Actor is not affiliated with the Government of Chubut and does not provide legal advice.

### FAQ

#### Does the Actor summarize a notice?

No. It returns extracted complete section text so users can preserve the source context.

#### Can it monitor several keywords?

Yes. Supply up to 20 keywords and choose whether any or all must occur in one section.

#### Can I process an exact PDF?

Yes. Add one or more official `boletin.chubut.gov.ar` PDF URLs to `startUrls`.

#### Why did I get no records?

No section matched the literal keyword logic, the PDF may be image-only, or the selected date/edition filters may not include a published bulletin. Start with one broad keyword and the latest edition.

#### Why is an issuing body null?

Some general notices do not expose a distinct authority heading that can be safely associated with the section. The complete text and source pages remain available.

#### How do I avoid duplicate alerts?

Store a key composed from `editionNumber`, `heading`, `pageStart`, and `sourceUrl` in your downstream workflow.

### Related Actors

- [Cal eProcure Solicitations Scraper](https://apify.com/automation-lab/cal-eprocure-solicitations-contracts) for structured California procurement opportunities.
- [PDF Text Extractor](https://apify.com/automation-lab/pdf-text-extractor) when you need generic text extraction from your own PDF URLs rather than Chubut-specific discovery and section matching.

This Actor otherwise works as a standalone Chubut monitoring product; related Actors are not required.

### Support

When reporting a problem, include the Actor run URL, sanitized input, expected edition or PDF URL, and one expected keyword. Do not paste access tokens or private downstream credentials.

# Actor input Schema

## `keywords` (type: `array`):

One to 20 words or phrases. Accents are ignored unless case-sensitive matching is enabled.

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

Optional official boletin.chubut.gov.ar PDF URLs. Leave empty to scan the newest bulletins.

## `editionNumbers` (type: `array`):

Optional official bulletin edition numbers, such as 14911. Applied during website discovery.

## `dateFrom` (type: `string`):

Optional lower publication-date boundary in YYYY-MM-DD format.

## `dateTo` (type: `string`):

Optional upper publication-date boundary in YYYY-MM-DD format.

## `matchMode` (type: `string`):

Return a section when it contains any keyword or require all supplied keywords.

## `caseSensitive` (type: `boolean`):

When disabled, capitalization and Spanish accents do not affect matching.

## `maxBulletins` (type: `integer`):

Maximum number of bulletin PDFs to download and inspect.

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

Stop after saving this many complete keyword-matched sections.

## Actor input object example

```json
{
  "keywords": [
    "licitación"
  ],
  "startUrls": [],
  "editionNumbers": [],
  "matchMode": "any",
  "caseSensitive": false,
  "maxBulletins": 1,
  "maxItems": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

Complete legal, procurement, and administrative sections with bulletin context.

# 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 = {
    "keywords": [
        "licitación"
    ],
    "startUrls": [],
    "editionNumbers": [],
    "matchMode": "any",
    "caseSensitive": false,
    "maxBulletins": 1,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/chubut-official-bulletin-monitor").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 = {
    "keywords": ["licitación"],
    "startUrls": [],
    "editionNumbers": [],
    "matchMode": "any",
    "caseSensitive": False,
    "maxBulletins": 1,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/chubut-official-bulletin-monitor").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 '{
  "keywords": [
    "licitación"
  ],
  "startUrls": [],
  "editionNumbers": [],
  "matchMode": "any",
  "caseSensitive": false,
  "maxBulletins": 1,
  "maxItems": 20
}' |
apify call automation-lab/chubut-official-bulletin-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/chubut-official-bulletin-monitor"
        }
    }
}

```

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/7PEXsHJEACgbKJgHo/builds/MBC6Zm5nmQgF6dDpH/openapi.json
