UK Takeover Bid Tracker
Pricing
from $0.60 / 1,000 disclosures
UK Takeover Bid Tracker
Tracks every UK company currently under a takeover bid. Returns the target, the named bidders, each class of securities in play with its ISIN and share count, and the Rule 2.6 put up or shut up deadline. Live offer periods from the Takeover Panel, updated every business day.
Every UK company currently in a takeover offer period, read straight from the Takeover Panel's Disclosure Table and returned as structured rows.
🔍 What does UK Takeover Bid Tracker do?
UK Takeover Bid Tracker returns every company currently in an offer period under the Takeover Code, with the bidders chasing it, the classes of relevant securities that carry a disclosure obligation, and the Rule 2.6 put up or shut up deadlines. The Panel rebuilds this table every business day, so the fastest way to try it is to run it with no filters at all and see the whole live UK bid list in a couple of seconds.
The Disclosure Table is the register that tells the market which securities are in play. Under Rule 8 of the Takeover Code, anyone holding 1% or more of any class of relevant securities in a company on this table has to publicly disclose their position and every subsequent dealing. This Actor gives you the register those obligations hang off, in a form you can query, join and schedule.
📊 What data can I extract from the Takeover Panel Disclosure Table?
One row per bidder in each offer period. A contested situation with two bidders is two rows, because each bidder carries its own deadline and its own securities.
| Field | Type | Description |
|---|---|---|
caseId | string | The Panel's own case number, stable for as long as the offer period runs |
changeType | string | What the Panel flagged today: added, amended, deleted or unchanged |
offereeName | string | The target company |
offereeLei | string | Legal Entity Identifier of the target |
offerPeriodCommenced | string | When the offer period began, as published, in London local time |
offerPeriodCommencedDate | string | Calendar date the offer period began, YYYY-MM-DD |
offerPeriodCommencedTime | string | London local time of day it began, 24 hour clock |
offerPeriodCommencedUtc | string | The same instant in UTC, with British Summer Time applied |
offerPeriodDays | number | Whole days the offer period had been running on the date of the table |
offereeSecurities | array | Each class of the target's relevant securities, with name, ISIN and number in issue |
offereeIsins | array | Just the target's ISINs, for joining against a position file |
offerorName | string | The bidder, or null while no bidder has been publicly named |
offerorLeis | array | LEIs of the bidder, more than one where the bid is a consortium |
hasNamedOfferor | boolean | false for a possible offer with nobody named yet |
offerorIdentified | string | When the bidder was publicly identified, as published |
offerorIdentifiedDate | string | Calendar date the bidder was identified, YYYY-MM-DD |
offerorIdentifiedUtc | string | The same instant in UTC |
rule26Deadline | string | The put up or shut up deadline, or null where none is set |
rule26DeadlineDate | string | Calendar date of the Rule 2.6 deadline, YYYY-MM-DD |
rule26DeadlineUtc | string | The same instant in UTC |
rule26DeadlineDaysAway | number | Days from the table date to the deadline, negative once it has passed |
rule26DeadlineRaw | string | The Rule 2.6 field exactly as published, which reads N/A where none applies |
disclosureRequiredInOfferor | boolean | Whether dealings in the bidder's own securities must be disclosed too |
offerorSecurities | array | The bidder's own classes of relevant securities, where disclosure in the bidder is required |
tableDate | string | Date of the Disclosure Table this row came from, YYYY-MM-DD |
tableDateRaw | string | Date of the table exactly as the Panel prints it |
tableIsFinal | boolean | Whether the Panel has marked the table final for the day |
sourceUrl | string | The Panel page this data is published on |
retrievedAt | string | When the row was collected, ISO 8601 |
Every numberInIssue is a real number rather than a string with commas in it, so you can divide a holding by it and get a percentage without cleaning anything first.
💡 Why track UK takeover offer periods?
- Disclosure obligations. A holding of 1% or more in any class of relevant securities on this table triggers a Rule 8 public disclosure. Run the Actor against your own book by ISIN and you get the list of positions that carry an obligation today.
- Put up or shut up calendars.
rule26DeadlineDateandrule26DeadlineDaysAwayturn the Panel's deadline column into a sortable diary. Sort by soonest deadline and the situations with a clock running come out on top. - Possible offers.
hasNamedOfferorisfalsewhile a company is in an offer period with nobody named. That is the earliest public flag that a company is in play, and it usually lands before any bidder is announced. - Contested bids. Two rows sharing a
caseIdis a company with more than one bidder, which is the shape of an auction. - Daily change feed.
changeTypereproduces the Panel's own additions, amendments and deletions for the day, so a scheduled run can report only what moved since yesterday. - Share count denominators.
numberInIssueper class is the denominator every percentage calculation needs, published by the regulator rather than estimated. - Reference data joins. LEIs on both sides and ISINs per class of security mean rows join cleanly to a holdings file, an order management system or a market data feed.
🚀 How do I use UK Takeover Bid Tracker?
- Click Try for free.
- Run it with the defaults first. With no filters set you get the whole live table, which is normally between thirty and eighty rows.
- Narrow it. Put part of a company name in Offeree company, or an ISIN in ISIN, or tick Only bids with a live Rule 2.6 deadline.
- Set Sort order to Soonest Rule 2.6 deadline first if you are building a deal calendar.
- Press Start and watch the log. A run takes a couple of seconds.
- Download the results as JSON, CSV or Excel, or read them straight from the API.
- Schedule it daily and set Change on today's table to Added today, Amended today and Removed today so each run reports only what changed.
⬇️ Input
Every field is optional. With no input at all the Actor returns the whole current Disclosure Table.
| Field | Type | Description |
|---|---|---|
offeree | string | Keep rows whose target company name contains this text, case insensitive |
offeror | string | Keep rows whose bidder name contains this text, case insensitive |
isin | string | Keep rows where this ISIN appears on any class of relevant securities |
changeTypes | array | Keep only added, amended, deleted or unchanged entries |
offerPeriodStartedAfter | string | Earliest offer period commencement date, YYYY-MM-DD, inclusive |
offerPeriodStartedBefore | string | Latest offer period commencement date, YYYY-MM-DD, inclusive |
withRule26DeadlineOnly | boolean | Keep only rows with a Rule 2.6 deadline set |
namedOfferorOnly | boolean | Drop the possible offers where no bidder is named |
sortBy | string | newest, oldest, deadline or offeree |
maxResults | integer | Cap on rows saved, which is also the cap on run cost |
Today's changes only, sorted by deadline:
{"changeTypes": ["added", "amended", "deleted"],"sortBy": "deadline","maxResults": 500}
Everything with a running put up or shut up clock:
{"withRule26DeadlineOnly": true,"sortBy": "deadline"}
One security you hold:
{"isin": "JE00B55Q3P39"}
⬆️ Output
Table view
| Offeree | Offeror | Offer period from | Rule 2.6 deadline | Days to deadline | Change today |
|---|---|---|---|---|---|
| Genel Energy plc | DNO ASA | 2026-08-07 | 2026-09-04 | 21 | unchanged |
| Alternative Income REIT plc | AEW UK REIT plc | 2026-05-15 | 2026-08-28 | 14 | unchanged |
| Alternative Income REIT plc | Glenstone REIT plc | 2026-05-15 | unchanged | ||
| Kore Potash plc | 2025-11-04 | unchanged |
JSON
{"caseId": "1633","changeType": "unchanged","offereeName": "Genel Energy plc","offereeLei": "549300IVCJDWC3LR8F94","offerPeriodCommenced": "07:00 07-Aug-2026","offerPeriodCommencedDate": "2026-08-07","offerPeriodCommencedTime": "07:00","offerPeriodCommencedUtc": "2026-08-07T06:00:00.000Z","offerPeriodDays": 7,"offereeSecurities": [{"name": "10p ordinary","isin": "JE00B55Q3P39","value": null,"numberInIssue": 279402863,"numberInIssueRaw": "279,402,863"}],"offereeIsins": ["JE00B55Q3P39"],"offerorName": "DNO ASA","offerorLeis": ["5967007LIEEXZXH3K072"],"hasNamedOfferor": true,"offerorIdentified": "07:00 07-Aug-2026","offerorIdentifiedDate": "2026-08-07","offerorIdentifiedUtc": "2026-08-07T06:00:00.000Z","rule26Deadline": "17:00 04-Sep-2026","rule26DeadlineDate": "2026-09-04","rule26DeadlineUtc": "2026-09-04T16:00:00.000Z","rule26DeadlineDaysAway": 21,"rule26DeadlineRaw": "17:00 04-Sep-2026","disclosureRequiredInOfferor": true,"offerorSecurities": [{"name": "Ordinary","isin": "NO0003921009","value": null,"numberInIssue": 975000000,"numberInIssueRaw": "975,000,000"}],"tableDate": "2026-08-14","tableDateRaw": "14 August 2026","tableIsFinal": true,"sourceUrl": "https://www.thetakeoverpanel.org.uk/disclosure/disclosure-table","retrievedAt": "2026-08-16T13:23:48.342Z"}
What this Actor is, and what it is not
This Actor reproduces the Takeover Panel's own published Disclosure Table, without addition. Every value in every row comes from the Panel's machine readable feed of that table. Nothing is inferred, enriched, cross referenced against another source, or supplemented from anywhere else. The only fields that are not lifted directly are offerPeriodDays and rule26DeadlineDaysAway, which are arithmetic on two dates that are both published, and the split of each published timestamp into its date, its time and its UTC equivalent.
The table names companies, funds, partnerships and occasionally individuals, because the Panel publishes those names itself as part of a statutory regulatory function. If you want a name corrected or removed, the Panel is the publisher and the only place that can change it.
This Actor does not return individual Rule 8 disclosure forms. Form 8.1, 8.3 and 8.5 disclosures are not published by the Takeover Panel. They are released through a Regulatory Information Service such as RNS, and the Panel's website carries only the register of offer periods that creates the obligation to file them. So this Actor tells you which securities carry a disclosure obligation today, and who the parties to each bid are. It does not tell you who dealt in them yesterday.
Coverage and currency
The Panel rebuilds the Disclosure Table on every business day and marks it final once the day's changes are settled, which tableIsFinal reports. A run before the table is finalised returns the working version, which is legitimate and clearly flagged.
The Panel publishes only the current table. There is no dated archive, so the Actor returns today's register and the changes the Panel flagged against it today. An offer period that ended before you first ran the Actor is not retrievable from the source. Running it on a schedule and appending to a dataset is how you build the history.
Coverage is the Takeover Code, so it is companies subject to the Code rather than every listed company. Typically thirty to eighty rows are live at once.
How the filters behave
All the filters are applied to the Panel's table after it is read, and they combine with AND. Text filters on offeree and offeror are case insensitive substring matches, so part of a name is enough. isin is an exact match and searches both the target's securities and the bidder's.
The date filters take YYYY-MM-DD only. A UK style date such as 10/08/2026 is rejected with an error rather than guessed at, because reading it as 8 October instead of 10 August is the kind of mistake that is silent and only ever wrong by a little.
An offer period whose commencement timestamp cannot be parsed is excluded from a date window rather than passed through, so a row that survives a date filter has genuinely been checked against it.
Dates, times and the clock change
The Panel stamps every timestamp in London local time and never says so. This Actor applies the British Summer Time rule properly, so 07:00 07-Aug-2026 becomes 2026-08-07T06:00:00.000Z in summer and a January timestamp keeps its hour under GMT. Calendar dates are assembled from the published month name and never pass through a timezone, so offerPeriodCommencedDate is the day the Panel printed regardless of where your run happens to execute.
💰 How much does it cost?
You pay per entry returned. A run that matches nothing returns nothing and costs nothing beyond the standard Actor start.
maxResults is the cap on both rows and cost. The whole live table is normally between thirty and eighty rows, so a full daily pull is a small, predictable charge, and filtering to changeTypes of added, amended and removed cuts most days to a handful of rows or none at all.
Paid Apify plans get a lower rate per entry. The current price and the plan discounts are shown on this Actor's pricing tab.
🔌 Integrations
Send results straight to Google Sheets, Slack, Airtable, Zapier, Make or your own webhook using Apify integrations. Schedule a run for each business morning with changeTypes set to added, amended and removed, point the webhook at a Slack channel, and the desk gets the day's movements on the UK bid list before the open. Runs can also be triggered from another tool, which is the usual way to attach the current offer period status to a position record.
🔗 Using UK Takeover Bid Tracker with the Apify API
curl -X POST "https://api.apify.com/v2/acts/spookyweb~uk-takeover-disclosures/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"withRule26DeadlineOnly": true, "sortBy": "deadline", "maxResults": 500}'
Or with the Apify client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('spookyweb/uk-takeover-disclosures').call({changeTypes: ['added', 'amended', 'deleted'],sortBy: 'deadline',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
In Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("spookyweb/uk-takeover-disclosures").call(run_input={"isin": "JE00B55Q3P39"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["offereeName"], item["offerorName"], item["rule26DeadlineDate"])
❓ FAQ
Does this return Form 8.3 disclosures?
No. Rule 8 disclosure forms are filed through a Regulatory Information Service, not through the Takeover Panel's website. The Panel publishes the Disclosure Table, which is the register of offer periods that creates the disclosure obligation in the first place. This Actor returns that register, including the exact classes of securities and share counts a Rule 8 calculation needs.
What is a Rule 2.6 deadline?
It is the put up or shut up deadline. Once a bidder is publicly named, the Panel normally sets a date by which it must either announce a firm intention to make an offer or announce that it will not. rule26DeadlineDate is that date and rule26DeadlineDaysAway counts down to it.
What does an empty offeror mean?
The company is in an offer period but no bidder has been publicly identified. That is a possible offer situation. hasNamedOfferor is false and offerorName is null.
Why do two rows share the same caseId?
Because that company has more than one bidder. Each bidder gets its own row, since each has its own identification date, its own Rule 2.6 deadline and possibly its own relevant securities.
What is NSI, and why does the Actor call it numberInIssue?
NSI is the Panel's abbreviation for the number of securities in issue for that class. It is renamed to numberInIssue and parsed to a number so it can be used as a denominator directly.
Can I get historic offer periods?
Not from the source. The Panel publishes only the current table with no dated archive. Schedule the Actor daily and append to a dataset to build your own history from the day you start.
How often does the table change?
Every business day. Most days bring a handful of additions, amendments and deletions, and some days bring none at all, which the Actor reports as a successful run with no changed rows.
What happens if nothing matches my filters?
The run succeeds with zero rows and the log explains which filter to widen. An empty result is a real answer about the UK takeover market rather than an error, so a scheduled monitor is not going to page anyone over a quiet day.
Do I need an account or an API key for the Takeover Panel?
No. The Disclosure Table is published openly with no key, no account and no cookie.
⚖️ Is it legal to use Takeover Panel disclosure data?
The Disclosure Table is published openly by the Panel on Takeovers and Mergers as part of its regulatory function, with no key, no account and no login. It is intended to be read by the market, because the whole purpose of the table is to tell shareholders which securities carry a Rule 8 disclosure obligation.
This Actor reads that published table and reproduces it without addition. It makes one small HTTP request per run, retries politely and backs off when asked to. It does not attempt to access anything behind a login.
The Panel is the publisher and the authoritative source. Where this Actor's output and the Panel's own page disagree, the Panel is right. Names on the table appear because the Panel publishes them, and any correction is a matter for the Panel. Check the Panel's copyright notice before republishing, and take your own advice on how you use the data, particularly where a decision is regulatory rather than informational.
👍 Your feedback
Found a case the parser handles badly, or want a field that is on the Panel's table and not in the output? Open an issue on the Issues tab and it will get looked at. Custom scrapers built to order are also an option, so say what you need.
🔎 You might also like
- UK FCA Register for the regulatory status of a firm or an individual
- UK Disqualified Directors for disqualification records from Companies House
- UK Land Registry Sold Prices for every residential sale in England and Wales since 1995
- Company Enrichment for company profiles built from a domain