# Ecuador SRI RUC Scraper — Company Registry & Fraud Flags (`registralia/ecuador-sri-ruc-scraper`) Actor

Scrape Ecuador SRI Consulta RUC taxpayer records by RUC or cedula. Get legal name, status, CIIU economic activity, tax regime, legal representatives and every registered establishment - plus the SRI's own ghost-taxpayer (contribuyente fantasma) and non-existent-transaction flags. JSON, CSV, Excel.

- **URL**: https://apify.com/registralia/ecuador-sri-ruc-scraper.md
- **Developed by:** [Nico Dennis Günther](https://apify.com/registralia) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 company record returneds

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?

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

## Ecuador SRI RUC Scraper — Company Registry & Fraud Flags

Scrape the official **Ecuador SRI RUC registry** (Consulta RUC, Servicio de Rentas Internas) by RUC or cédula and get back a clean, English-keyed record: legal name, registration status, economic activity, legal representatives, fraud risk flags, and every registered establishment with its full address.

One RUC in, one structured company profile out. No account, no API key, no captcha solving — this Actor reads the same public registry a Ecuadorian accountant uses, and normalizes it for machines.

### What you get

For RUC `1790016919001`:

```json
{
  "ruc": "1790016919001",
  "country": "EC",
  "legalName": "CORPORACION FAVORITA C.A.",
  "taxpayerType": "company",
  "status": "active",
  "mainEconomicActivity": "VENTA AL POR MAYOR DE OTROS PRODUCTOS DIVERSOS PARA EL CONSUMIDOR.",
  "taxRegime": "GENERAL",
  "activityStartDate": "1957-11-30",
  "registryUpdatedAt": "2026-08-18",
  "mustKeepAccounting": true,
  "isWithholdingAgent": true,
  "isSpecialTaxpayer": true,
  "isGhostTaxpayer": false,
  "hasNonExistentTransactions": false,
  "legalRepresentatives": [
    { "identification": "1701529958", "name": "WRIGHT DURAN BALLEN RONALD OWEN" }
  ],
  "headOfficeAddress": "PICHINCHA / RUMIÑAHUI / COTOGCHOA / AV. GENERAL ENRIQUEZ S/N",
  "establishmentCount": 327,
  "openEstablishmentCount": 312,
  "establishments": [
    {
      "number": "001",
      "commercialName": "CORPORACION FAVORITA C.A.",
      "type": "MAT",
      "isHeadOffice": true,
      "status": "open",
      "province": "PICHINCHA",
      "canton": "RUMIÑAHUI",
      "parish": "COTOGCHOA",
      "street": "AV. GENERAL ENRIQUEZ S/N"
    }
  ]
}
```

### Why this data matters

**The two risk flags are the point.** Ecuador's tax authority publicly marks taxpayers as *contribuyente fantasma* (ghost company) and *transacciones inexistentes* (non-existent transactions). Those are official fraud designations, exposed here as `isGhostTaxpayer` and `hasNonExistentTransactions`. If you onboard Ecuadorian merchants, suppliers or borrowers, this is the single most valuable field pair in the country's public data.

**Legal representatives come with their national ID**, which lets you chain into PEP and sanctions screening without a name-only match.

**Establishments are a branch map.** A retailer returns hundreds of open locations with province, canton, parish and street — a ready-made territory list for field sales, distribution planning or store-level analytics.

### Use cases

| You are | You use it for |
|---|---|
| KYB / AML platform | Merchant and supplier verification with official status plus fraud flags |
| Fintech / lender | Borrower checks: is the entity active, since when, who signs |
| B2B sales team | Qualify accounts by economic activity, regime and branch footprint |
| Procurement / compliance | Vendor due diligence, periodic re-screening of an existing book |
| Data team | Enrich an Ecuadorian company list with authoritative registry fields |

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `rucs` | array | — | 13-digit RUC numbers. Also accepts a newline- or comma-separated string, objects passed from another Actor, or a 10-digit cédula — the `001` head-office suffix is added for you. |
| `includeEstablishments` | boolean | `true` | Adds every registered branch with address. |
| `includeRaw` | boolean | `false` | Attaches the untouched Spanish payload under `raw` for auditing. |
| `skipInvalidChecksum` | boolean | `false` | Off by default — the registry holds historical records that predate today's check-digit rules. |
| `verifyNotFound` | boolean | `true` | On a miss, confirms against the registry's existence endpoint so a service hiccup is never reported as an unknown company. |
| `maxConcurrency` | integer | `5` | Parallel lookups, capped at 10. It is a public service; stay polite. |
| `requestTimeoutSecs` | integer | `30` | |
| `maxRetries` | integer | `3` | Exponential backoff on 429 and 5xx. |
| `proxyConfiguration` | object | off | Only needed if the registry rate-limits the datacenter IP. |

Simplest possible run:

```json
{ "rucs": ["1790016919001", "0990004196001"] }
```

### Three ways to read the results

The dataset ships with prepared views, so you do not have to flatten anything yourself:

- **Companies** — one row per RUC with the fields a reviewer reads first.
- **Legal representatives** — one row per person, ready for sanctions or PEP screening.
- **Establishments** — one row per branch, a territory list for field sales.

Export any of them as CSV, Excel, JSON or XML, or pull them from the API.

### Output notes

- Every input RUC produces exactly one dataset item, so a batch of 500 gives you 500 rows you can join back on `ruc`.
- Failures are data, not silence: unmatched or malformed inputs come back with `found: false` and an `error` of `not_found`, `invalid_ruc` or `lookup_failed`.
- Dates are ISO (`YYYY-MM-DD`). `registryUpdatedAt` tells you how fresh the authority's own record is.
- `SI`/`NO` registry values become real booleans; Spanish status values are mapped to `active` / `suspended` / `inactive`, with the original kept in `statusOriginal`.

### Pricing

Pay per event, and you only pay for what the registry actually returned:

| Event | Price | When |
|---|---|---|
| Company record | **$0.014** | Once per RUC found, including status, activity, legal representatives, ghost-taxpayer flags and the head office address |
| Additional branch | **$0.0005** | Per registered establishment beyond the head office, and only when you ask for establishments |
| Actor start | $0.0001 | Container startup. Not an access fee. |

**Not-found and invalid RUCs are free**, so a dirty input list costs you nothing extra. There is no minimum spend and no subscription.

A worked example: 500 Ecuadorian companies with establishments switched off — 500 × $0.014 = **$7.00**. One large retailer with 327 branches costs $0.014 for the record plus 326 × $0.0005 = **$0.18**.

For comparison, the manual alternative is opening the SRI portal and transcribing fields, one company at a time — two to four minutes each. At 500 companies that is roughly a full working day.

### Notes on the source

Data comes from the SRI's public RUC consultation service. This Actor does not bypass any access control, does not authenticate, and does not solve captchas — it reads endpoints the registry serves openly and passes the values through unchanged. Sole traders are natural persons, so treat their records as personal data under your own GDPR/LOPDP obligations.

Tax debt (`deudas`) is deliberately not included: that endpoint sits behind a web application firewall, and working around it would not be appropriate.

**Not an official SRI product.** This Actor is an independent tool built by Echocall LLC. It is not affiliated with, endorsed by, or operated by the Servicio de Rentas Internas or any Ecuadorian government body. "SRI" and "RUC" are used descriptively to name the public data source.

### Roadmap

Same schema, more countries — Costa Rica, Panama, Guatemala, Paraguay, Uruguay — plus a single cross-border lookup Actor so one call covers a whole region.

### FAQ

**How do I look up a RUC number in Ecuador?**

The SRI publishes its taxpayer registry (Consulta RUC) as an open service. This Actor queries it for you and hands back structured JSON, CSV or Excel instead of a web page you have to read by hand — one row per RUC, in bulk.

**What is a RUC number?**

The *Registro Único de Contribuyentes* is Ecuador's 13-digit tax ID. The first two digits encode the province, and the last three are the establishment number — `001` is always the head office.

**Can I search by cédula instead of RUC?**

Yes. A 10-digit cédula is completed to a RUC by appending `001`, so a sole trader's national ID works as input without any preparation on your side.

**What is a *contribuyente fantasma*?**

A taxpayer the SRI has officially designated a ghost company — one issuing invoices without real economic activity behind them. The Actor exposes that designation as `isGhostTaxpayer`, alongside `hasNonExistentTransactions`. These two fields are why most buyers use this Actor rather than a generic company-data source.

**Can I check whether an Ecuadorian company is active?**

Yes — `status` maps the registry's Spanish value to `active`, `suspended` or `inactive`, and `activityStartDate` tells you how long the entity has been trading.

**Is scraping the SRI registry legal?**

This Actor reads a public government service. It does not authenticate, does not bypass access controls and does not solve captchas. Sole traders are natural persons, so treat their records as personal data under your own GDPR/LOPDP obligations.

**What does it cost to try?**

Every new Apify account includes free monthly usage credit, which covers a few hundred lookups before you pay anything.

### Related Actors

- **Costa Rica Cedula Scraper** — the same idea for Costa Rica's Hacienda registry, including the *moroso* and *omiso* flags.
- **LATAM Company Registry Scraper** — one call for a mixed list of Ecuadorian RUCs and Costa Rican cédulas, returning a single shared schema.

# Actor input Schema

## `rucs` (type: `array`):

One or more 13-digit Ecuadorian RUC numbers, e.g. 1790016919001. A 10-digit cédula also works — the head-office suffix 001 is added for you.

## `includeEstablishments` (type: `boolean`):

Also return every registered branch with its full address. Large retailers can have hundreds.

## `includeRaw` (type: `boolean`):

Attach the untouched Spanish-language response under a `raw` field, for auditing.

## `skipInvalidChecksum` (type: `boolean`):

Off by default: the registry holds historical records that predate the current check-digit rules.

## `verifyNotFound` (type: `boolean`):

When a RUC returns nothing, confirm against the registry's existence endpoint so a service hiccup is not reported as an unknown company. Misses are free, so this costs you nothing.

## `maxConcurrency` (type: `integer`):

How many RUCs to query at once. The SRI is a public service — keep this low.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a registry to answer one request before giving up and retrying.

## `maxRetries` (type: `integer`):

How often to retry a request after rate limiting or a server error, with exponential backoff.

## `proxyConfiguration` (type: `object`):

Optional. Only needed if the registry starts rate-limiting the datacenter IP.

## Actor input object example

```json
{
  "rucs": [
    "1790016919001",
    "0990004196001"
  ],
  "includeEstablishments": true,
  "includeRaw": false,
  "skipInvalidChecksum": false,
  "verifyNotFound": true,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `companies` (type: `string`):

One normalized record per RUC: legal name, status, economic activity, legal representatives, the ghost-taxpayer flags and every registered establishment.

# 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 = {
    "rucs": [
        "1790016919001"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("registralia/ecuador-sri-ruc-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 = { "rucs": ["1790016919001"] }

# Run the Actor and wait for it to finish
run = client.actor("registralia/ecuador-sri-ruc-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 '{
  "rucs": [
    "1790016919001"
  ]
}' |
apify call registralia/ecuador-sri-ruc-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,registralia/ecuador-sri-ruc-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/3yqdmxRER2dNVVj6A/builds/8B7VRozsTpff7LU0T/openapi.json
