Skip to content
    ↑↓ to choose · Enter to open

    · 14 min read

    SGX Company Announcements Scraper: 19 Data Fields per Record (2026)

    By CrawlerBros Engineering Team

    Each extracted record carries 19 fields, including the company name, stock code, announcement title, submission details, and the direct document URL for the official filing. You can extract dividend disclosures, annual reports, and corporate actions directly from the Singapore Exchange database without needing any login or API keys. A thousand results cost $5.00 on the free-plan price, and Apify's free plan includes $5.00 of monthly usage to get you started. This tool is designed for equity researchers and compliance officers who need programmatic access to official SGX filings; it is not for those seeking raw market data or real-time order books.

    Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open SGX Company Announcements Scraper on Apify and run the prefilled example.

    How reliable is SGX Company Announcements Scraper in production?

    Across the last 30 days of public runs on the Apify platform, SGX Company Announcements Scraper recorded 108 runs with the following outcomes.

    Outcome Runs Share
    Succeeded 104 96.3%
    Failed 0 0.0%
    Aborted by the user 1 0.9%
    Timed out 3 2.8%
    Total 108 100.0%

    Based on the latest telemetry, about 3 in a hundred runs failed or timed out, which indicates a highly reliable connection to the SGX public gateway. When scheduling this scraper unattended, you should build simple retry logic to handle the occasional timeout without manual intervention. Because user-aborted runs do not represent system failures, you do not need to configure automated alerts for runs that you stop yourself.

    What does it cost to run SGX Company Announcements Scraper?

    Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.

    Apify plan Per result Per 1,000 results
    FREE $0.005 $5.00
    BRONZE $0.00433 $4.33
    SILVER $0.00367 $3.67
    GOLD $0.003 $3.00
    PLATINUM $0.003 $3.00
    DIAMOND $0.003 $3.00

    Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. With 2.8% of runs failing or timing out in the last 30 days, budget for re-running a portion of those batches rather than assuming every run completes.

    The maxItems parameter has the most direct impact on your final bill because result charges are calculated per dataset item written. To verify that your search filters return the exact records you expect before incurring charges, run your first test with maxItems set to a low value like 5.

    How do you run SGX Company Announcements Scraper from the API?

    None of its 8 controls is strictly required, so the defaults below produce a valid run on their own. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.

    Call the synchronous endpoint to start a run and receive dataset items in one request:

    curl -X POST "https://api.apify.com/v2/acts/crawlerbros~sgx-company-announcements-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"issuerQuery":"","category":"","subcategory":"","maxItems":100,"proxyConfiguration":{"useApifyProxy":true}}'
    

    The same run from Python, using the official client:

    from apify_client import ApifyClient
    
    client = ApifyClient("<YOUR_APIFY_TOKEN>")
    
    run_input = {
      "issuerQuery": "",
      "category": "",
      "subcategory": "",
      "maxItems": 100,
      "proxyConfiguration": {
        "useApifyProxy": True
      }
    }
    
    run = client.actor("crawlerbros~sgx-company-announcements-scraper").call(run_input=run_input)
    
    for item in client.dataset(run["defaultDatasetId"]).iterate_items():
        print(item)
    

    And from Node.js:

    import { ApifyClient } from 'apify-client'
    
    const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
    
    const input = {
      "issuerQuery": "",
      "category": "",
      "subcategory": "",
      "maxItems": 100,
      "proxyConfiguration": {
        "useApifyProxy": true
      }
    }
    
    const run = await client.actor('crawlerbros~sgx-company-announcements-scraper').call(input)
    const { items } = await client.dataset(run.defaultDatasetId).listItems()
    console.log(items)
    

    That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.

    Which SGX Company Announcements Scraper inputs matter, and which can you skip?

    The issuerQuery control is the primary way to restrict your search to a specific company using its name or stock code. For broad market monitoring, leave issuerQuery blank and select a specific classification from the category or subcategory dropdowns.

    • issuerQuery (string): Restrict results to one listed issuer. Enter part of the issuer/company name (e.g. DBS) or an exact stock code (e.g. D05). Leave blank to search across all listed issuers. Note: SGX doesn't file every issuer daily, so if you set this, also widen dateFrom/dateTo to make sure the issuer has a filing in range.
    • category (string): Top-level SGX announcement category. Leave as "All categories" to search every category. Default: "".
    • subcategory (string): Narrow to one specific announcement subcategory. Leave as "All subcategories" to search every subcategory within the chosen category. Default: "".
    • titleKeyword (string): Only return announcements whose title contains this word (case-insensitive).
    • dateFrom (string): Earliest announcement/broadcast date, YYYY-MM-DD. Defaults to 30 days before dateTo. Note: for replacement/amended filings (title starts with "REPL:"), this matches the record's broadcastDate, which can be later than its original publishDate.
    • dateTo (string): Latest announcement/broadcast date, YYYY-MM-DD. Defaults to today. Note: for replacement/amended filings (title starts with "REPL:"), this matches the record's broadcastDate, which can be later than its original publishDate.
    • maxItems (integer): Hard cap on emitted records. Default: 100.
    • proxyConfiguration (object): Only used as an automatic fallback if SGX starts rate-limiting the datacenter IP. Leave the default AUTO group enabled - no paid proxy is required. Default: {"useApifyProxy":true}.

    Fixed-choice controls: category accepts "" (All categories), ANNC (Announcements), CACT (Corporate Action), PLST (Product Announcements & Listings), TRAD (Trading Status); subcategory accepts 77 values (default ""), including "" (All subcategories), ANNC01 (Amendment to Articles), ANNC02 (Announcement in Relation to Regulatory Actions by SGX and/ or Other Authorities), ANNC03 (Announcement of Appointment).

    What does SGX Company Announcements Scraper return?

    The returned records are ideal for building compliance archives, tracking corporate actions, or pulling official financial reports via the direct documentUrl field. They do not contain market price data, trading volumes, or historical order books.

    • stockCode, stockCodes[] - primary and (for multi-security filings) all affected stock codes
    • isinCode, isinCodes[]
    • issuerName, issuerNames[]
    • title - the announcement headline
    • category - top-level SGX category (e.g. "Corporate Action")
    • categoryCode, subcategoryCode - machine-readable category codes
    • publishDate - submission date/time in Singapore time (ISO 8601)
    • broadcastDate - when the announcement was broadcast to the market (this is the field dateFrom/dateTo filter against, not publishDate); usually equal to publishDate except for replacement/amended filings
    • submittedBy
    • documentUrl, sourceUrl
    • refId, announcementId
    • recordType: "announcement", scrapedAt

    These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.

    How do you build the workflow end to end?

    Open SGX Company Announcements Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.

    1. Run a test query with issuerQuery set to D05 and maxItems capped at 5 to verify you can extract DBS Group Holdings disclosures.
    2. Inspect the resulting dataset to confirm that primary fields like stockCode, issuerName, and title are populated correctly.
    3. Look at the broadcastDate and publishDate of the retrieved items to understand how amended filings are dated.
    4. Verify that the documentUrl points directly to a valid PDF or official SGX filing document.
    5. Set the category to CACT and the subcategory to CACT06 to pull dividend distributions for your target date range.
    6. Check that the returned records contain the expected isinCode and submittedBy values before scaling up your query volume.
    7. Configure a scheduled run using Apify's scheduler with your finalized dateFrom and dateTo parameters to automate collection.

    How do you apply it? Three worked playbooks

    These are SGX Company Announcements Scraper's own documented use cases, each worked through as an operating pattern rather than a description.

    Use case 1: Investor relations monitoring

    Outcome: Track a specific issuer's full disclosure history by stock code

    Configure: Set issuerQuery to the target stock code such as D05, set dateFrom to the beginning of your historical monitoring window, and set maxItems to 50.

    Working method: Execute the run to pull the historical disclosure timeline for the specified stock code. Inspect the output to verify the timeline is continuous and that publishDate matches the official corporate filing sequence. Save this initial dataset as your historical baseline.

    Deliverable: A structured JSON dataset containing the complete historical disclosure history for the target stock code, including unique announcementId values, titles, and direct documentUrl links.

    Stop condition: The run emits zero results despite the issuer being actively traded, indicating the search parameters are misaligned or the stock code format is invalid.

    Use case 2: Financial data platforms

    Outcome: Build a searchable archive of SGX filings and corporate actions

    Configure: Leave issuerQuery blank to capture all issuers, set category to CACT to target corporate actions, and set dateFrom and dateTo to cover your ingestion window.

    Working method: Run the extraction over the defined date range to gather corporate actions across the entire exchange. Ingest the resulting dataset into your database, checking for unique refId values to prevent duplicate entries from amended filings. Index the records by stockCode and broadcastDate.

    Deliverable: A CSV or JSON archive of all corporate action announcements filed on SGX during the target period, ready to be indexed by an external search engine.

    Stop condition: The ingestion pipeline encounters records where critical indexing fields like stockCode or categoryCode are missing or null.

    Use case 3: Equity research

    Outcome: Screen annual reports and general announcements by category and date range

    Configure: Set category to ANNC, set subcategory to ANNC30 to isolate annual reports, and specify the target fiscal date range in dateFrom and dateTo.

    Working method: Execute the scraper to retrieve all annual report disclosures published within the specified date range. Filter the resulting dataset to ensure that only primary filings are included, and extract the documentUrl for each report to feed into your downstream financial modeling or PDF text extraction tools.

    Deliverable: A curated list of annual report filings including issuer names, stock codes, and direct links to the official PDF documents on the SGX servers.

    Stop condition: The returned dataset contains general press releases instead of annual report filings, indicating an incorrect subcategory selection.

    What breaks, and how do you design around it?

    • Over the last 30 days, 0.0% of public runs failed and 2.8% timed out. Build retries and alerting around those rates rather than assuming every run completes.

    When querying historical records for a replacement filing, be aware that the date filters match against the broadcastDate rather than the original publishDate. If you cannot find a specific older filing, try widening your date range to account for these post-publication amendments.

    When should you not use SGX Company Announcements Scraper?

    Do not use this scraper if you need real-time order book data, stock price charts, or historical transaction histories, as it is strictly designed for official regulatory disclosures and corporate filings. If you are tracking Hong Kong market disclosures instead of Singapore, you should use HKEX Disclosure & Announcements Scraper which is specifically built for that exchange's structure. For housing transaction datasets rather than corporate finance, look at the Singapore HDB Resale Flat Prices Scraper. If your goal is tracking global public offerings rather than local SGX announcements, the IPO Calendar Scraper provides a better fit for tracking listings across multiple international markets.

    What should you check before trusting the output?

    • Check that documentUrl is a non-empty string starting with the official SGX document domain.
    • Verify that publishDate and broadcastDate conform to valid ISO 8601 datetime strings.
    • Assert that stockCode is present and matches the alphanumeric format used by the Singapore Exchange.
    • Ensure that issuerName is not null and represents the registered name of the listed entity.
    • Monitor the proportion of returned records that contain empty arrays for stockCodes or isinCodes when querying multi-security issuers.

    None of this proves a record is correct. It gives a scheduled SGX Company Announcements Scraper run defined points where it should stop instead of quietly passing bad data downstream.

    Frequently asked questions

    How much does it cost to scrape 10,000 SGX announcements?

    At the free-plan price of $5.00 per 1,000 results, scraping 10,000 announcements costs $50.00 in result charges. Keep in mind that Apify also bills the platform usage each run consumes on top of these result charges, and each run start incurs a small memory-based fee.

    Can I run this scraper automatically every day without it failing?

    Yes. Telemetry shows that 104 of 108 public runs finished successfully in the last 30 days, representing a 96.3% success rate. Setting up a daily schedule is highly reliable, though you should implement standard error handling for the 2.8% of runs that timeout.

    Why does a record's publishDate sometimes differ from the search date range?

    The date filters search against the broadcastDate. For original filings, this is identical to the publishDate. However, for replacement or amended filings, SGX updates the broadcastDate to the reprint time while keeping the original submission time as the publishDate.

    Do I need to pay for premium proxies to scrape the Singapore Exchange?

    No. The scraper is configured to run without requiring paid proxy groups. It uses automatic proxy features as a fallback only if the exchange starts rate-limiting the standard IP pool.

    What is the difference between category and subcategory?

    Category represents one of the four top-level classifications on SGX, such as Corporate Action. Subcategory narrows your search to one of the 76 specific transaction types, like Cash Dividend/ Distribution.

    Where to go next

    When you are ready to run it, open SGX Company Announcements Scraper on Apify; the free plan covers up to 1,000 results a month.

    Start with the SGX Company Announcements Scraper Actor page for the current input schema, pricing tier, and run history.

    Other Actors we maintain for related data:

    Related guides:

    Resources

    • Actor documentation, input schema, and pricing: verified against the published Actor on 2026-10-04.

    • Actor last updated by its maintainers on 2026-07-11.

    • Run outcome figures cover the 30 day public window ending 2026-10-04.

    • SGX Company Announcements Scraper on Apify

    Featured actors

    SGX Company Announcements Scraper

    Scrape Singapore Exchange (SGX) listed-company announcements and disclosures. Search by issuer name or stock code, filter by category and date range. Get stock code, issuer name, announcement title, category, publish date, and direct document URL.

    Run on Apify ↗