# UAE Tax Agents List (FTA Register): Emails, Phones, TAAN (`fifty50labs/uae-tax-agents-scraper`) Actor

Export the official UAE FTA register of approved tax agents to CSV, Excel or JSON: name, TAAN, firm, emirate, experience (VAT, Corporate Tax, Excise), emails, phones and website. Filter by emirate or tax type. Deduplicated, and you pay only per agent saved.

- **URL**: https://apify.com/fifty50labs/uae-tax-agents-scraper.md
- **Developed by:** [Fifty50 Labs](https://apify.com/fifty50labs) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 tax agent exporteds

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UAE Tax Agents Scraper (FTA Register)

Export the **UAE Federal Tax Authority (FTA) public register of approved tax agents** to JSON, CSV or Excel: agent name, Tax Agent Approval Number (TAAN), firm, emirate, listed experience, emails, phone numbers and website.

The FTA publishes this register at [tax.gov.ae › Registered Tax Agents](https://tax.gov.ae/en/tax.support/tax.agents/registered.tax.agents.aspx), but only as paged cards, 12 at a time, with no download button. This Actor walks every page for you, removes duplicates and gives you one clean table.

### Who uses it

- **Accounting, ERP and e-invoicing software vendors** building a list of UAE tax practitioners to partner with or sell to.
- **Tax and accounting firms** mapping who else is registered in their emirate or tax specialism.
- **Data, research and compliance teams** checking whether a named person holds a TAAN, or tracking how the register changes over time (run it on a schedule and compare TAANs).

### Features

- Whole register in one run, or filtered with the register's own filters:
  - **Emirate / branch location** (Abu Dhabi, Al Ain, Ajman, Dubai, Fujairah, Ras Al Khaimah, Sharjah, Umm Al Quwain)
  - **Previous experience** (VAT, Corporate Tax, Excise Tax Registration, Excise Product registration, Warehouse Keeper and Designated Zone, Non-resident business, Property owners, Government and charity, Home Builder and Mosque refund, SME Muwafaq)
  - **Keyword** (agent or firm name, e.g. `KPMG`)
- **Deduplicated by TAAN.** The register sometimes lists the same agent twice; you get one row per agent.
- **Only agents with an email** option, so you don't pay for rows you can't use.
- Multiple emails and multiple phone numbers are split into lists (the register runs phone numbers together in one string).
- `maxItems` cap for quick samples.
- Plain HTTP requests, no browser and no proxy, so runs are fast and cheap.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `emirate` | select | `all` | Branch location filter from the register |
| `sector` | select | `all` | "Previous Experience" filter from the register |
| `keyword` | string | empty | Free-text search on the register |
| `onlyWithEmail` | boolean | `false` | Skip agents with no listed email (they are not charged) |
| `maxItems` | integer | `0` (all) | Stop after this many agents |

Example: all Corporate Tax agents with a branch in Dubai who list an email

```json
{ "emirate": "dubai", "sector": "corporate_tax", "onlyWithEmail": true }
```

### Output

One dataset item per tax agent. Illustrative example (values invented to show the shape):

```json
{
  "agentName": "Jane Example Doe",
  "taan": "20012345",
  "firmName": "Example Accounting and Tax Consultancy LLC",
  "emirates": ["Dubai", "Sharjah"],
  "previousExperience": "Corporate Tax",
  "previousExperienceTruncated": false,
  "emails": ["info@example-accounting.ae"],
  "website": "http://www.example-accounting.ae",
  "phones": ["+97140000000", "+971500000000"],
  "profileAnchor": "https://tax.gov.ae/en/tax.support/tax.agents/registered.tax.agents.aspx#taxagent_jane.example.doe",
  "source": "UAE Federal Tax Authority - Registered Tax Agents",
  "sourceUrl": "https://tax.gov.ae/en/tax.support/tax.agents/registered.tax.agents.aspx",
  "scrapedAt": "2026-10-09T18:30:00Z"
}
```

| Field | Meaning |
|---|---|
| `agentName` | Agent's name as listed by the FTA |
| `taan` | Tax Agent Approval Number (unique key) |
| `firmName` | Tax agency / firm the agent is linked to |
| `emirates` | Branch locations listed on the card |
| `previousExperience` | Experience text as shown on the card. The FTA cuts long text with "..." on the list page; `previousExperienceTruncated` is `true` when that happened |
| `emails`, `phones`, `website` | Contact details exactly as the agent listed them with the FTA. Some contain typos made at source; check a domain before relying on it |
| `profileAnchor` | Link to the agent's card on the FTA page |
| `scrapedAt` | UTC time the record was read |

Download from the Dataset tab as JSON, CSV, Excel, XML or HTML, or through the Apify API.

### Pricing

Pay per result: you are charged per tax agent saved to the dataset (see the price on this page). Agents filtered out by `onlyWithEmail` are never charged. Set a max charge per run in the run options to cap your spend.

### How it works and limits

- Reads the public FTA page, then follows the page's own "Next" button (an ASP.NET postback), one request per second.
- The register's order can shift between pages. If a pass reads fewer entries than the register reports, the Actor walks the pages again (up to 3 passes) to pick up the missing agents.
- It reads only what the public list page shows. Fields that sit behind each card's "Read More" button are not collected.
- The data is as current as the FTA page at run time. The FTA, not this Actor, decides who is listed.
- If the FTA redesigns the page, the Actor may need an update. Open an issue on the Issues tab.

### Responsible use

The register is published by the FTA so taxpayers can find and contact approved tax agents. tax.gov.ae's robots.txt allows the `/en/` section this Actor reads. Some listings include individuals' personal email addresses and mobile numbers. If you use the data for outreach, you are responsible for complying with applicable law (including the UAE Personal Data Protection Law and anti-spam rules in your recipients' jurisdictions): contact people about their professional services only, identify yourself, offer an opt-out and honour it. Do not resell personal data or use it for anything unrelated to the agents' professional role.

This Actor is not affiliated with or endorsed by the UAE Federal Tax Authority.

# Actor input Schema

## `emirate` (type: `string`):

Only agents listing a branch in this location. 'all' exports the whole register.

## `sector` (type: `string`):

The register's own 'Previous Experience' filter.

## `keyword` (type: `string`):

Optional free-text search passed to the register (agent or firm name, e.g. 'KPMG').

## `onlyWithEmail` (type: `boolean`):

Skip (and don't charge for) agents that list no email.

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

Stop after this many agents. 0 = no limit.

## Actor input object example

```json
{
  "emirate": "all",
  "sector": "all",
  "onlyWithEmail": false,
  "maxItems": 20
}
```

# Actor output Schema

## `agents` (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 = {
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("fifty50labs/uae-tax-agents-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 = { "maxItems": 20 }

# Run the Actor and wait for it to finish
run = client.actor("fifty50labs/uae-tax-agents-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 '{
  "maxItems": 20
}' |
apify call fifty50labs/uae-tax-agents-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fifty50labs/uae-tax-agents-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/DatzPe7exFZqg47pB/builds/mHRLrx31EBydicLDP/openapi.json
