# PSX Company Announcements Scraper (`bareezh_codes/psx-company-announcements-scraper`) Actor

Pulls real-time corporate announcements from the Pakistan Stock Exchange (PSX) data portal — board-meeting notices, financial results, dividend/bonus declarations and shareholding disclosures — filterable by ticker symbol and date range.

- **URL**: https://apify.com/bareezh\_codes/psx-company-announcements-scraper.md
- **Developed by:** [Salman Bareesh](https://apify.com/bareezh_codes) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.40 / 1,000 results

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

Get real-time **Pakistan Stock Exchange (PSX)** corporate announcements — board-meeting notices, financial results, dividend/bonus declarations and shareholding disclosures — the moment they hit the PSX data portal. This actor is a lightweight wrapper around PSX's own public announcements feed at [dps.psx.com.pk](https://dps.psx.com.pk/announcements), filterable by ticker symbol and date range, with no login and no API key required.

### Why use PSX Company Announcements Scraper?

Every PSX-listed company must disclose board meetings, dividend/bonus declarations, financial results and shareholding changes to the exchange, and PSX publishes those disclosures as they arrive on its public data portal. That feed is high-signal for anyone tracking Pakistani listed companies, but it's only browsable one page at a time on the portal's own website — there's no official public API. This actor turns that feed into structured, filterable, exportable data.

Main capabilities:

- Queries PSX's own public announcements endpoint (`dps.psx.com.pk/announcements`) for the notice type, symbols and date range you choose.
- Parses PSX's server-rendered HTML results table into one flat, consistently-shaped JSON record per announcement, with links to the original PDF/image attachment.
- Covers all five PSX notice feeds: Companies Announcements (the default), PSX Notices, CDC Notices, SECP Notices, and NCCPL Notices.
- Runs on the Apify platform, so you get scheduling (e.g. hourly/daily monitoring of specific symbols), API and webhook access, and integrations out of the box.

Typical use cases:

- **Retail & diaspora investor alerts** — get pinged the moment a company you hold declares a dividend, calls a board meeting, or publishes results.
- **Brokerage / fintech products** — build a PSX announcements alert feature on top of structured data instead of screen-scraping the portal yourself.
- **Compliance / AML screening** — monitor PSX-listed entities for insider-disclosure and shareholding-change events.
- **Market research** — track board-meeting and results-announcement cadence across a sector or watchlist of symbols.

### What data can PSX Company Announcements Scraper extract?

| Field | Type | Description |
|---|---|---|
| `date`, `time` | string | When the announcement was published on the portal |
| `symbol` | string | PSX ticker symbol (Companies Announcements only) |
| `companyName` | string | Listed company name (Companies Announcements only) |
| `title` | string | Announcement headline/description |
| `noticeType` | string | Which of the five PSX feeds this came from |
| `pdfUrl` | string | Link to the announcement's PDF attachment |
| `imageUrl` | string | Link to a scanned-image attachment, when the disclosure was filed as an image instead of/alongside a PDF |

See [Output](#output) below for the full field reference and a complete real example.

### How to use PSX Company Announcements Scraper

1. Click **Try for free** (or **Run**) on this actor's page.
2. Optionally set `symbols` to a list of PSX ticker symbols to watch (e.g. `["HPL", "ABL"]`). Leave empty for all companies.
3. Optionally set `announcementType` to switch feeds (defaults to `companies`).
4. Optionally set `dateFrom` / `dateTo` to pick an announcement date range. Leave both empty to get the newest announcements regardless of date.
5. Set `maxItems` to cap how many announcements you want back.
6. Click **Start** and wait for the run to finish (a default run typically finishes in well under a minute).
7. Open the **Dataset** tab and export as JSON, CSV, or Excel — or pull it programmatically via the **API** tab.

### How much will it cost to use PSX Company Announcements Scraper?

You pay only for announcements delivered — no subscription.

| Your Apify discount tier | Price per result | 1,000 results |
|---|---|---|
| Free | $0.012 | $12 |
| Bronze | $0.0108 | $10.80 |
| Silver | $0.0096 | $9.60 |
| Gold | $0.0084 | $8.40 |
| Platinum / Diamond | $0.0084 | $8.40 |

Apify's free plan includes $5 of monthly credit — enough for well over 400 announcements at no cost. A daily pull of the newest 50 announcements costs about $0.60/day.

A run stops automatically once it has returned `maxItems` results or once it hits your run's maximum charge (Apify's pay-per-result cost cap), whichever comes first.

### Input

All fields are optional — running the actor with an empty input (`{}`) returns the newest ~50 Companies Announcements with no filters. See the **Input** tab for the full configuration schema.

| Field | Type | Default | Description |
|---|---|---|---|
| `symbols` | array of strings | `[]` (all) | PSX ticker symbols to filter to, e.g. `["HPL", "ABL"]`. Only applies to `companies` announcements. |
| `announcementType` | string | `"companies"` | Which feed to pull: `companies`, `psx`, `cdc`, `secp`, or `nccpl` |
| `dateFrom` | string (`YYYY-MM-DD`) | none (newest first) | Start of the announcement date range |
| `dateTo` | string (`YYYY-MM-DD`) | none (newest first) | End of the announcement date range, inclusive |
| `maxItems` | integer | `50` | Maximum number of announcements to return |

`dateFrom` must not be later than `dateTo` when both are set — the run fails immediately with an error message if it is.

Example input for "the last 20 announcements from Allied Bank and Hoechst Pakistan":

```json
{
  "symbols": ["ABL", "HPL"],
  "maxItems": 20
}
```

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. One item is produced per announcement, with the same keys every time (`null` when a field doesn't apply). This is a real item from a live run of this actor (`tests/smoke_input.json`, default `companies` feed):

```json
{
  "date": "Sep 11, 2026",
  "time": "4:29 PM",
  "symbol": "HPL",
  "companyName": "Hoechst Pakistan Limited",
  "title": "DISCLOSURE OF INTEREST BY AN ASSOCIATED COMPANY OF A LISTED COMPANY U/S 5.6.4 OF PSX REGULATIONS",
  "noticeType": "Companies Announcement",
  "pdfUrl": "https://dps.psx.com.pk/download/document/282580.pdf",
  "imageUrl": "https://dps.psx.com.pk/download/attachment/282580-1.gif"
}
```

#### Field reference

| Field | Description |
|---|---|
| `date`, `time` | Publication date/time as shown on the PSX portal (portal's own local formatting, e.g. "Sep 11, 2026" / "4:29 PM") |
| `symbol` | PSX ticker symbol; `null` for `psx`/`cdc`/`secp`/`nccpl` feeds, which are not tied to a single company |
| `companyName` | Listed company name; `null` for the same non-company feeds |
| `title` | Announcement headline/description as published |
| `noticeType` | `"Companies Announcement"`, `"PSX Notice"`, `"CDC Notice"`, `"SECP Notice"`, or `"NCCPL Notice"` |
| `pdfUrl` | Link to the PDF attachment, when one was filed |
| `imageUrl` | Link to a scanned-image attachment, when one was filed |

### FAQ, disclaimers, and support

**Is this legal?** This actor only reads PSX's own public announcements portal (dps.psx.com.pk), which requires no login, no cookies and no CAPTCHA to view. PSX's Terms of Use state the data is provided "for information and/or educational purposes"; this actor is a technical mirror of the same publicly viewable feed and does not access any non-public data.

**How fresh is the data?** As fresh as the portal itself — new announcements typically appear within minutes of being filed with PSX. Run this actor on a schedule (e.g. hourly) with your symbols of interest to build an ongoing alert feed.

**Why are `symbol` and `companyName` sometimes `null`?** Only the `companies` feed (`announcementType: "companies"`, PSX's "Companies Announcements" tab) is company-specific. The other four feeds (`psx`, `cdc`, `secp`, `nccpl`) are exchange/regulator-wide notices not tied to a single listed company, so the portal doesn't provide a symbol/company column for them, and the `symbols` input filter has no effect on them.

**Why is `imageUrl` sometimes present alongside `pdfUrl`?** Some disclosures are filed as a scanned image (shown as a "View" popup on the portal) in addition to a PDF; this actor exposes both links when both exist.

**Can I get very old announcements?** Yes — set `dateFrom` far enough in the past (the portal's own archive currently goes back for over 220,000 companies-announcement entries). Very large ranges take longer and return more items, so pair a wide date range with a sensible `maxItems`.

#### Legal & compliance note

All data comes from the Pakistan Stock Exchange's own public data portal (dps.psx.com.pk), which PSX operates for public dissemination of corporate disclosures it requires listed companies to make. This actor does not bypass any login, paywall or CAPTCHA, and does not access any data beyond what dps.psx.com.pk already serves to any visitor. Re-verify PSX's Terms of Use before building a redistribution product on top of this data, since terms can change independently of this actor.

#### Limits & notes

- This actor parses PSX's server-rendered HTML table rather than a documented API, because PSX does not publish one. If PSX changes the table's column layout, the actor fails the run loudly (rather than pushing malformed rows) so a broken parser is never silently mistaken for "no new announcements."
- The `symbols` filter is applied one symbol at a time against the portal (the portal's endpoint only accepts a single symbol per request), so a run with many symbols makes proportionally more requests.
- Only `companies`, `psx`, `cdc`, `secp` and `nccpl` are supported — these are the five tabs PSX itself exposes on the announcements portal.

#### Support

Found a bug or have a feature request? Use the **Issues** tab on this actor's page. For programmatic access, see the **API** tab for ready-made code snippets in your language of choice.

# Actor input Schema

## `symbols` (type: `array`):

Only include announcements from these PSX ticker symbols (e.g. "HPL", "ABL"). Leave empty to include all companies.

## `announcementType` (type: `string`):

Which PSX notice feed to pull. "Companies" (the default) is company-specific disclosures - board meetings, dividends, financial results. The others are regulator/exchange-wide notices not tied to a specific company (symbol filtering does not apply to them).

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

Start of the announcement date range (YYYY-MM-DD). Leave empty together with Date to, to fetch the newest announcements regardless of date.

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

End of the announcement date range (YYYY-MM-DD), inclusive. Leave empty together with Date from, to fetch the newest announcements regardless of date.

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

Maximum number of announcements to return.

## Actor input object example

```json
{
  "symbols": [],
  "announcementType": "companies",
  "maxItems": 50
}
```

# Actor output Schema

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

One item per matching PSX announcement

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("bareezh_codes/psx-company-announcements-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("bareezh_codes/psx-company-announcements-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 '{}' |
apify call bareezh_codes/psx-company-announcements-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bareezh_codes/psx-company-announcements-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/BdSUWXZE2RN2YV0cZ/builds/z1M0rheYwfoYODASa/openapi.json
