Every product is served through the same request and response shape — datasets uploaded by sellers, third-party APIs we relay, and scripts we execute. The examples on this page are built from a product that really exists in the catalogue, not from an invented schema.
Seven distribution channels, one data model. Channels that are not open yet carry their stage.
Token auth, pagination, and filtering. The version is explicit in the URL — never swapped silently.
CSV, Parquet, and GeoJSON/GeoPackage for spatial data — via presigned URLs.
Webhook, object storage, SFTP, or online spreadsheet, with a delta option: changed rows only.
A DataDiti endpoint in front of third-party APIs: normalised responses, TTL-based caching, per-tier quotas.
An API wrapper around script products: synchronous or asynchronous (job + completion webhook), with per-call resource limits.
A thin layer over an API that is already clean — positioning DataDiti as a source of facts for AI agents.
Every request carries a bearer token belonging to your account. Tokens can be scoped per dataset and revoked at any time from the buyer area.
Authorization header, never as a URL parameter — URL parameters end up in intermediary logs.Three endpoints cover most of what you need: product metadata, data rows, and the column schema.
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/datasets | The products your token can reach. |
| GET | /v1/datasets/{slug} | Product metadata: latest version, score, coverage, access class. |
| GET | /v1/datasets/{slug}/rows | Data rows, with pagination and filtering. |
| GET | /v1/datasets/{slug}/schema | The data dictionary for that version: column names, types, units, notes. |
The example below uses Proyeksi Penduduk Kabupaten 2020-2025 — a real catalogue product, with its actual column names.
Request
Response
One row shown; the rest follows pagination.
Page-based pagination with a limit of 100 rows per request. Filters use the column names in that product’s data dictionary — there are no special filter names to memorise.
halaman and per_halaman control the slice; meta.total gives the full number of matching rows.HTTP status codes are used for what they mean, and the response body always names a cause you can act on.
| 401 | Token missing, expired, or revoked. |
| 403 | The token is valid but this product is out of its scope — or your jurisdiction may not receive this data. |
| 404 | No such product or version. Products removed by takedown also answer 404. |
| 410 | This version was retired after its service window ended. |
| 429 | Tier quota exceeded. The response headers say when the quota resets. |
Integrations break quietly when a column is renamed without warning. These three promises are what prevent that.
Every endpoint carries its version. A published version is never edited in place — fixes ship as a new version.
At least 90 days before release, through the changelog, in-app notifications, and email.
At least 180 days after the replacement ships, then retired with staged reminders.
AI agents call a tool, not a URL. The response carries provenance — version, source, and score — so an answer quoting these numbers can be traced back to where they came from.
Tool call
Response