ParseForge Scrapers

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.

Run this scraper See the API call
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?

ParseForge

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

  1. Create a free Apify account and claim the $5 free credit.
  2. Open the actor and pick a collection under What to scrape. Leave the defaults to pull the 10 most recently updated datasets.
  3. Add filters if you want a slice, and tick any optional blocks you need. Set Max Items.
  4. 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?

FieldTypeWhat it doesDefault
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 forWhat it isPrice 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.

POST · run and get results
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.

input.json
{
  "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