Panama Open Data Scraper - Datos Abiertos
parseforge/panama-open-data-scraper
Developer tools
Extract all 5,661 datasets from Panama's national open data portal with files, DataStore schemas and publisher contacts.
- Total runs
- 16
- Bookmarked
- 0
- Last modified
- 8 days ago
This scraper was last updated on .
What does the Panama Open Data Scraper - Datos Abiertos return?
Panama Open Data Scraper - Datos Abiertos CKAN API
Extract all 5,661 datasets from datosabiertos.gob.pa, Panama's national open data portal, in a single run. Every row carries 38 fields: title, description, publishing ministry, named contacts with emails, licence, declared update frequency, tags, categories, every downloadable file with its format and size, and a computed freshness age. No login, no API key, no registration. Exports to CSV, JSON, Excel and XML.
Panama publishes the portal as a CKAN instance, and the portal search page will only show you 20 datasets at a time behind a paginated UI. There is no bulk download button and no official export. This scraper walks the whole catalogue through the CKAN index, follows every publisher, category and tag directory, and reaches into the portal DataStore to give you the real column schema and exact row count behind each file, which the website never shows you at all.
| Who uses it | What they scrape Panama open data for |
|---|---|
| Journalists and transparency researchers | Public payroll (planilla) records across ministries, salary by position and contract status |
| Economists and analysts | Migration flows, port and maritime traffic, banking and budget execution series |
| Compliance and due diligence teams | Which government bodies publish what, who maintains it and how current it is |
| Civic tech and data engineers | A complete portal mirror with file URLs and DataStore schemas to build pipelines on |
| Academics and NGOs | Health, education and social development statistics with citable licences and provenance |
What it does
- 📚 Whole catalogue - all 5,661 datasets with 38 fields per row, or any slice of them
- 📎 Every downloadable file - format, MIME type, size, hash and a direct download URL
- 🗄️ DataStore tables - exact row counts, column names and PostgreSQL types for the 48% of files loaded into the portal database, plus real sample rows
- 🏛️ 114 publishing bodies - ministries, municipalities, courts, universities and authorities, with live dataset counts
- 📇 Publisher contacts - deduplicated names, emails and email domains for the people who maintain each dataset
- 🏷️ Full directories - 3,777 tags, 18 categories, 15 licences and the declared update frequency breakdown
- 🔍 14 filters - by organization, category, tag, format, licence, update cadence, date, file count and free text, all applied by the portal index before anything is billed
- ✅ Quality scoring - a 0 to 100 metadata completeness score with an A to F grade and the exact list of what the publisher left out
- 🔗 Link checking - HEAD every file to prove it actually downloads
What you can do with Panama open data
Track public payroll across the whole state. Panama publishes planilla (payroll) datasets for ministries, authorities and municipalities, and 101 datasets carry the planilla tag. Pull them all with their DataStore tables and you get position, name, role, monthly salary, start date and contract status as queryable rows rather than hundreds of separate spreadsheets.
Monitor what government actually publishes. Every row carries a declared update frequency and a computed age. Filter to the 1,284 datasets that promise monthly updates, then sort by days since modified, and the ones that broke their own promise surface immediately.
Build a research corpus with clean provenance. 5,640 of the 5,661 datasets carry an open licence, 3,881 of them CC-BY and 1,757 CC-Zero. Each row keeps the licence id, title and URL alongside the publisher and the source URL, so citation and reuse terms travel with the data.
Map the machinery of the Panamanian state. The organization directory returns 114 bodies with live dataset counts, descriptions and logos, from Caja de Seguro Social with 688 datasets to single-dataset municipalities. It is a usable inventory of who holds which public records.
Why choose this scraper
| What you get | |
|---|---|
| Coverage | The full 5,661 dataset catalogue, not the 20 per page the website shows |
| Depth | 10 output collections, from datasets and files down to DataStore column types and publisher contacts |
| Beyond the website | Exact row counts and PostgreSQL column types the portal UI never displays |
| Filters that are real | Every one of the 14 filters was measured against the unfiltered total before shipping |
| Honest sorting | Only sort orders the portal actually honours are offered; the ones that silently fall back to relevance are not |
| Speed and cost | 3,000 dataset rows with nested file lists in 28 seconds, at 76 MB of memory |
How it compares
The generic CKAN exporters on Apify point at any portal and hand back whatever the API returns, which means two events, raw upstream keys and no knowledge of the site. This actor is built against Panama specifically: it knows the portal's custom frecuency field (misspelled upstream, so a generic tool filtering on frequency silently returns nothing), it knows which endpoint the site's F5 firewall rejects, and it ships verified dropdowns of all 71 active publishers and 17 categories rather than making you guess slugs. It costs more per row than a generic exporter and it returns data those tools cannot reach.
| This actor | Generic CKAN exporters | |
|---|---|---|
| Billed events | 19 | 2 |
| Output collections | 10 | 1 |
| DataStore schema and row counts | Yes | No |
| Verified publisher and category dropdowns | Yes, 71 and 17 | No, free text slugs |
Panama frecuency filter |
Yes | No |
| Price per 1,000 rows | $7 | About $2 |
What a Panama dataset looks like
{
"id": "1aa157e4-275c-4287-ad6f-214effc96566",
"name": "proc-admon-discapacidad-2026",
"title": "Proc. Admon.- Discapacidad 2026",
"url": "https://www.datosabiertos.gob.pa/dataset/proc-admon-discapacidad-2026",
"notes": "Discapacidad del Primer Interviniente en Casos de Mediación Comunitaria",
"notesLength": 71,
"organizationName": "procuraduria-de-la-administracion",
"organizationTitle": "Procuraduria de la Administración",
"organizationUrl": "https://www.datosabiertos.gob.pa/organization/procuraduria-de-la-administracion",
"author": "Raúl Alvarado",
"authorEmail": "ralvarado@procuraduria-admon.gob.pa",
"maintainer": "Ambar Bonilla",
"maintainerEmail": "ambarbonilla@procuraduria-admon.gob.pa",
"sourceUrl": "https://www.procuraduria-admon.gob.pa/",
"licenseId": "cc-zero",
"licenseTitle": "Creative Commons CCZero",
"isOpenLicense": "Yes",
"version": "1.0",
"updateFrequency": "Semestral",
"metadataCreated": "2026-07-19T22:55:03.324552",
"metadataModified": "2026-08-27T14:31:21.503464",
"daysSinceModified": 0,
"isStale": "No",
"numResources": 3,
"numTags": 1,
"formats": ["CSV", "PDF", "XLSX"],
"totalSizeBytes": 143752,
"totalSizeMb": 0.137,
"hasDatastore": "No",
"tags": ["Discapacidad"],
"categories": ["Estadísticas de Gobierno", "Finanzas de Gobierno"],
"scrapedAt": "2026-08-27T19:03:00.512Z"
}
Configure the run
Pick a collection under What to scrape, then narrow it. The dropdowns for publishers, categories, formats, licences and update frequency are filled with the portal's live values and show the dataset count next to each one, so you can see what a filter is worth before you run it. Filters are applied by the portal search index, so narrowing costs nothing extra. You can also paste dataset URLs straight into Dataset URLs to scrape exactly those and skip the search entirely.
Every payroll dataset updated monthly, with its file list and a quality score:
{
"dataset": "datasets",
"searchQuery": "planilla",
"frequencies": ["Mensual"],
"sortBy": "modified-desc",
"includeDatasetResources": true,
"includeQualityScore": true,
"maxItems": 500
}
Every queryable DataStore table with its schema and 20 real rows:
{
"dataset": "datastore-tables",
"includeDatastorePreview": true,
"datastorePreviewRows": 20,
"maxItems": 1000
}
The complete publisher directory with profiles:
{
"dataset": "organizations",
"includeOrganizationProfile": true,
"maxItems": 200
}
Free users
Runs on the Apify free plan return the first 10 rows as a preview, which is enough to see the full field shape of every collection. Upgrade your plan to lift the cap to 1,000,000 rows.
Run it
- Create a free Apify account and claim the $5 free credit.
- Open the actor and pick a collection under What to scrape. Leave the defaults to pull the 10 most recently updated datasets.
- Add filters if you want a slice, and tick any optional blocks you need. Set Max Items.
- Click Start, then export the dataset as CSV, JSON, Excel or XML, or pull it from the Apify API.
Use with AI agents (MCP)
claude mcp add apify --transport sse https://mcp.apify.com/sse?actors=parseforge/panama-open-data-scraper
Then ask in plain language:
- "Find every Panama government payroll dataset updated monthly and show me which ministries publish them."
- "List the Panamanian public bodies with the most open datasets and how fresh their data is."
- "Get the column schema and 10 sample rows for the Metro de Panama payroll table."
Troubleshooting
No results at all. The most common cause is stacking filters that do not overlap, for example a category and a tag that never appear together. Clear the filters, run once, then add them back one at a time. The log prints how many datasets matched before any row is written.
Fewer rows than I asked for. Your filter matched fewer datasets than Max Items, or you are on the free plan and capped at 10. The log states the match count and warns explicitly when the free cap applies. The Only datasets with a queryable DataStore table filter is applied after the search, so it can also reduce the count below the match total.
A field comes back "Not Disclosed" or "N/A". The publisher left it empty. Panama's portal does not require a version, a source URL or an update frequency, so those are genuinely missing rather than missed by the scraper. Switch on the quality score block to see exactly which fields each publisher omitted.
DataStore fields are empty. Only about 48% of files are loaded into the portal DataStore; the rest are downloadable files only. Tick Only datasets with a queryable DataStore table to keep just the ones that have it.
The run is slow. The file download check sends one HEAD request per file and is the slowest option by a wide margin. Turn it off unless you specifically need dead-link detection, and it will run at full speed.
FAQ
| Question | Answer |
|---|---|
| Do I need an API key or a login? | No. The portal is fully anonymous and so is this actor. |
| How many datasets are there? | 5,661 at the time of writing, across 71 active publishing bodies. |
| How fast is it? | 3,000 dataset rows with nested file lists in 28 seconds on the platform. |
| Can I get the actual data inside the files? | Yes, for the 48% loaded into the DataStore. Use the DataStore sample rows block, or take the direct download URL from any file row. |
What is the frecuency field? |
The portal's own publication cadence field. It is misspelled upstream, which is why generic CKAN tools filtering on frequency return nothing. |
| Is the data in Spanish? | Yes. Titles, descriptions and category names are Spanish, as published. Field names in the output are English. |
| Can I scrape specific datasets only? | Yes. Paste their portal URLs into Dataset URLs and the search is skipped entirely. |
| Are the files reliable? | In a 90 URL sample every file downloaded successfully. The portal self hosts its uploads. Use the file download check to verify a specific set. |
| Can I run it on a schedule? | Yes, with Apify Schedules. Sort by recently updated and filter by date to catch only what changed. |
| What licence is the data under? | 5,640 of 5,661 datasets carry an open licence, mostly CC-BY and CC-Zero. The exact licence travels on every row. |
Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.
Disclaimer: this is an unofficial tool and is not affiliated with, endorsed by, or connected to the Government of Panama, the Autoridad Nacional para la Innovación Gubernamental, or datosabiertos.gob.pa. It collects only data that is already published publicly on the portal, under the open licences the publishers attached to it. Publisher contact details are official institutional contacts published by the government as dataset metadata, not private personal data. Review GDPR, CCPA and PIPL obligations for your own use case before processing or redistributing.
What input does the Panama Open Data Scraper - Datos Abiertos accept?
| Field | Type | What it does | Default |
|---|---|---|---|
| dataset | string (10 options) | Which collection to extract. "Datasets" is the catalogue itself (one row per dataset). The other collections are the portal directories and the DataStore tables behind the files. | datasets |
| searchQuery | string | Full text search across titles, descriptions and tags, for example "planilla" or "migracion". Leave empty to take the whole catalogue. | not set |
| startUrls | array | Optional. Paste datosabiertos.gob.pa dataset links to scrape exactly those datasets and skip the search. Overrides the query and the filters. | [] |
| maxItems | integer | Free users: limited to 10 items (preview). Paid users: up to 1,000,000. | 10 |
| sortBy | string (9 options) | Result order. Only these orders are honoured by the portal; anything else silently falls back to relevance. | modified-desc |
| organizations | array | Keep only datasets published by these bodies. The number in brackets is the live dataset count. | [] |
| categories | array | Keep only datasets in these portal categories (CKAN groups). | [] |
| tags | array | Keep only datasets carrying these tags, for example "planilla" or "salud". Free text, matched exactly against the portal tag list. | [] |
| formats | array | Keep only datasets that publish at least one file in these formats. In the Resources collection it also filters the individual files. | [] |
| licenses | array | Keep only datasets under these licenses. | [] |
| frequencies | array | Keep only datasets the publisher declares on this cadence. This is the portal Frecuencia de Publicacion field. | [] |
| modifiedAfter | string | Keep only datasets whose metadata changed on or after this date. Format YYYY-MM-DD. | not set |
| createdAfter | string | Keep only datasets first published on or after this date. Format YYYY-MM-DD. | not set |
| minResources | integer | Keep only datasets that ship at least this many downloadable files. Leave empty for no minimum. | not set |
| titleContains | string | Keep only datasets whose title matches this word, for example "migracion". | not set |
| notesContains | string | Keep only datasets whose description matches this word. | not set |
| authorContains | string | Keep only datasets whose author field matches this name or department. | not set |
| onlyOpenLicense | boolean | Keep only datasets the portal flags as an open license (5,640 of 5,661). | false |
| onlyWithDatastore | boolean | Keep only datasets with at least one file loaded into the portal DataStore, so the data is queryable row by row rather than only downloadable. Applied after the search, since the portal index does not expose this flag. | false |
| includeDatasetResources | boolean | Adds a nested resources array to every dataset row with each downloadable file, its format, size and download URL. Billed as dataset-resources. | false |
| includeQualityScore | boolean | Adds a 0 to 100 completeness score, an A to F grade and the list of failed checks (missing description, license, tags, contact, frequency, broken file entries). Billed as quality-score. | false |
| includeLinkCheck | boolean | Resources collection only. Sends a HEAD request per file and adds the HTTP status, content type and content length. Billed as link-check. Slower. | false |
| includeDatastoreSchema | boolean | Resources collection only. Adds the column names, PostgreSQL types and the exact row count for files loaded into the DataStore. Billed as datastore-schema. | false |
| includeDatastorePreview | boolean | Adds real data rows from inside each DataStore table, not just the metadata. Applies to the Resources and DataStore tables collections. Billed as datastore-preview. | false |
| datastorePreviewRows | integer | How many rows to pull when the DataStore preview block is on. | 5 |
| includeOrganizationProfile | boolean | Adds the organization total dataset count, follower count, logo and full description. Billed as organization-profile, once per organization then cached. | false |
| includeCategoryProfile | boolean | Adds the category description, logo and total dataset count. Billed as category-profile, once per category then cached. | false |
How much does the Panama Open Data Scraper - Datos Abiertos cost?
from $6.23 per 1,000 results
| Charged for | What it is | Price each |
|---|---|---|
| Actor Start | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.0178 to $0.02 |
| Catalogue page scanned | One page of the portal search index scanned, up to 100 datasets per page. This is the cost of paginating and of reading the facet directories. | $0.00356 to $0.004 |
| Dataset row | One dataset from the Panama open data catalogue with 38 fields: title, description, publisher, contacts, licence, update frequency, tags, categories, file formats, total size and freshness. | $0.00623 to $0.007 |
| File row | One downloadable file with its format, MIME type, size, hash, direct download URL and the dataset and publisher it belongs to. | $0.00445 to $0.005 |
| DataStore table row | One queryable DataStore table with its exact row count, column list, PostgreSQL column types, table type and storage size. | $0.00623 to $0.007 |
| Publisher contact row | One deduplicated publisher contact: name, email, email domain, role, the organization and a sample dataset they published. | $0.00445 to $0.005 |
| Organization row | One publishing body from the portal directory with its live dataset count, description, logo, follower count and creation date. | $0.00356 to $0.004 |
| Category row | One portal category with its live dataset count, description and logo. | $0.00356 to $0.004 |
| Tag row | One keyword from the portal tag directory with the number of datasets carrying it and a ready to use filter URL. | $0.00178 to $0.002 |
| Format row | One file format with the number of datasets publishing it and its share of the catalogue. | $0.00178 to $0.002 |
| Licence row | One licence with its title, URL, open data conformance flags and the number of datasets released under it. | $0.00267 to $0.003 |
| Update frequency row | One declared publication cadence with the number of datasets on it and its share of the catalogue. | $0.00178 to $0.002 |
| File list on a dataset row | Optional. Adds the full nested list of downloadable files to a dataset row, each with format, size, download URL and DataStore flag. Charged only when the dataset has files. | $0.00267 to $0.003 |
| Metadata quality score | Optional. Adds a 0 to 100 completeness score, an A to F grade and the list of failed checks across ten metadata rules. Charged only when the block is added to the row. | $0.00178 to $0.002 |
| File download check | Optional. Sends a HEAD request to a file and adds the HTTP status, content type and content length so dead links are visible. Charged once per file checked. | $0.00356 to $0.004 |
| DataStore schema | Optional. Adds the column names, PostgreSQL types, index flags and the exact row count of a file loaded into the portal DataStore. Charged only when the table exists. | $0.00445 to $0.005 |
| DataStore sample rows | Optional. Adds real data rows read from inside a DataStore table, up to 100 per table, plus the table total. Charged only when rows came back. | $0.00534 to $0.006 |
| Publisher profile | Optional. Adds the publishing body total dataset count, follower count, logo, full description and state. Fetched once per organization and cached for the rest of the run. | $0.00267 to $0.003 |
| Category profile | Optional. Adds the category description, logo, portal URL and total dataset count. Fetched once per category and cached for the rest of the run. | $0.00267 to $0.003 |
Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.
How do I call the Panama Open Data Scraper - Datos Abiertos API?
One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.
curl -X POST "https://api.apify.com/v2/acts/parseforge~panama-open-data-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"dataset": "datasets",
"startUrls": [],
"maxItems": 10,
"sortBy": "modified-desc",
"organizations": []
}' What example inputs can I use?
Use these inputs to see how a run is configured.
{
"dataset": "datasets",
"startUrls": [],
"maxItems": 10,
"sortBy": "modified-desc",
"organizations": []
} What do users say about the Panama Open Data Scraper - Datos Abiertos?
No reviews yet. Be the first.
How do I report an issue with the Panama Open Data Scraper - Datos Abiertos?
We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.
Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.
What related scrapers can I use?
Run Panama Open Data Scraper - Datos Abiertos on Apify All scrapers
