Mapping suites
A mapping suite groups a set of physical tables that share a structure but
are partitioned — for example orders_1996, orders_1997, orders_1998 — into
a single logical mapping you can query as one.
A suite is built from three things:
- a base mapping (e.g.
public+orders) plus a pattern containing a${partition}token (e.g.orders_${partition}), - a list of partition values (e.g.
1996,1997,1998), - the generated entries — one per (mapping × partition) — each resolved to
a real table name. Generation (
_generate) materializes them.
The collection endpoints that list a datasource's suites
(GET /api/datasources/{id}/suites and /suites-list) are documented under
Links & suites. This page covers
creating a suite and managing one.
POST /api/datasources/{id}/suites
Create a suite. Provide the base mapping(s) with their patterns and the initial partitions; generation runs automatically.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Suite name. |
label | string | No | Label for the partition dimension (e.g. year). |
mappings | array | No | { id, pattern, substitutions? } — base mapping id and a pattern with a ${partition} token. |
partitions | array | No | Partition values (strings). |
generateAllEntries | boolean | No | Generate every entry up front (default false). |
preserveSubstitutions | boolean | No | Keep manual substitutions on regenerate (default true). |
Returns 201 with a Location header. (See
Links & suites for the seeded
example payload.)
GET /api/datasources/{id}/suites/{suiteId}
Get a suite with its partitions, mappings, and entries. {suiteId} resolves by
id or name.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001"
},
"inf:suite-mappings": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings"
},
"inf:suite-partitions": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions"
},
"inf:suite-generate": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate"
}
},
"permissions": {
"delete": true,
"rename": true,
"write": true
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000001",
"name": "Orders by Year",
"slug": "orders-by-year",
"description": null,
"label": "year",
"defaultPartitionId": "00000000-0000-4000-8000-000000000002",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"datasourceId": "00000000-0000-4000-8000-000000000003",
"_embedded": {
"inf:suite-mapping": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000004"
}
},
"id": "00000000-0000-4000-8000-000000000004",
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"pattern": "orders_${partition}",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"name": "Orders",
"mapping_mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
],
"inf:suite-partition": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/00000000-0000-4000-8000-000000000005"
}
},
"id": "00000000-0000-4000-8000-000000000005",
"name": "1996",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
},
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/00000000-0000-4000-8000-000000000006"
}
},
"id": "00000000-0000-4000-8000-000000000006",
"name": "1997",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
},
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/00000000-0000-4000-8000-000000000002"
}
},
"id": "00000000-0000-4000-8000-000000000002",
"name": "1998",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
}
],
"inf:suite-entry": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries/00000000-0000-4000-8000-000000000007"
}
},
"id": "00000000-0000-4000-8000-000000000007",
"partitionId": "00000000-0000-4000-8000-000000000005",
"mappingId": "00000000-0000-4000-8000-000000000004",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tableName": "orders_1996",
"substitutions": {}
},
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries/00000000-0000-4000-8000-000000000008"
}
},
"id": "00000000-0000-4000-8000-000000000008",
"partitionId": "00000000-0000-4000-8000-000000000006",
"mappingId": "00000000-0000-4000-8000-000000000004",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tableName": "orders_1997",
"substitutions": {}
},
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries/00000000-0000-4000-8000-000000000009"
}
},
"id": "00000000-0000-4000-8000-000000000009",
"partitionId": "00000000-0000-4000-8000-000000000002",
"mappingId": "00000000-0000-4000-8000-000000000004",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tableName": "orders_1998",
"substitutions": {}
}
]
}
}
PUT /api/datasources/{id}/suites/{suiteId}
Update the suite's own attributes (e.g. label). Requires suite:write.
{
"label": "Year"
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001"
},
"inf:suite-mappings": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings"
},
"inf:suite-partitions": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions"
},
"inf:suite-generate": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate"
}
},
"permissions": {
"delete": true,
"rename": true,
"write": true
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000001",
"name": "Orders by Year",
"slug": "orders-by-year",
"description": null,
"label": "Year",
"defaultPartitionId": "00000000-0000-4000-8000-000000000002",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
DELETE /api/datasources/{id}/suites/{suiteId}
Delete the suite and all its mappings, partitions, and entries. Requires
suite:delete. Returns 200 with an empty body.
POST /api/datasources/{id}/suites/{suiteId}/_generate
Re-materialize the suite's entries, optionally adding partitions.
| Field | Type | Description |
|---|---|---|
mappings | array | Base mappings + patterns to (re)generate. |
partitions | array | Partition values to add. |
generateAllEntries | boolean | Generate every entry (default false). |
preserveSubstitutions | boolean | Keep manual substitutions (default true). |
preserveTableNames | boolean | Keep manually-overridden table names (default true). |
preserveSubstitutions / preserveTableNames protect manual edits made to
existing entries. Returns the regenerated suite.
{
"generateAllEntries": true,
"partitions": [],
"preserveSubstitutions": true,
"preserveTableNames": true
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate"
},
"inf:suite-mappings": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate/mappings"
},
"inf:suite-partitions": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate/partitions"
},
"inf:suite-generate": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/_generate/_generate"
}
},
"permissions": {
"delete": true,
"rename": true,
"write": true
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000001",
"name": "Orders by Year",
"slug": "orders-by-year",
"description": null,
"label": "Year",
"defaultPartitionId": "00000000-0000-4000-8000-000000000002",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
Mappings
A suite can span more than one base mapping. These endpoints manage them.
GET /api/datasources/{id}/suites/{suiteId}/mappings
List the base mappings the suite spans, each with its pattern.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings"
}
},
"items": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
}
],
"start": 0,
"count": 1,
"total": 1
}
POST /api/datasources/{id}/suites/{suiteId}/mappings
Add a base mapping to the suite. Payload { mappingId, pattern, substitutions?, preserveSubstitutions?, generateAllEntries? }; generation runs for it.
GET /api/datasources/{id}/suites/{suiteId}/mappings/{mappingId}
Get one suite mapping ({mappingId} is the suite-mapping row id).
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000002"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"_embedded": {
"inf:mapping": {
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/00000000-0000-4000-8000-000000000003/mappings/public+orders"
}
},
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"name": "Orders",
"permissions": {
"write": true,
"hide": true,
"delete": true,
"rename": true,
"changeSet": true,
"restoreDefaults": true,
"scan": true
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
}
}
PUT /api/datasources/{id}/suites/{suiteId}/mappings/{mappingId}
Re-run generation for one base mapping with a (possibly new) pattern or
substitutions. With both preserveSubstitutions and preserveTableNames false,
it instead clears and re-adds the mapping.
{
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"pattern": "orders_${partition}",
"preserveSubstitutions": true,
"preserveTableNames": true
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000002"
},
"inf:suite-mappings": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000002/mappings"
},
"inf:suite-partitions": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000002/partitions"
},
"inf:suite-generate": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/mappings/00000000-0000-4000-8000-000000000002/_generate"
}
},
"permissions": {
"delete": true,
"rename": true,
"write": true
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000001",
"name": "Orders by Year",
"slug": "orders-by-year",
"description": null,
"label": "Year",
"defaultPartitionId": "00000000-0000-4000-8000-000000000004",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
DELETE /api/datasources/{id}/suites/{suiteId}/mappings/{mappingId}
Remove a base mapping (and its entries) from the suite. Returns 200 with an
empty body.
Partitions
GET /api/datasources/{id}/suites/{suiteId}/partitions
List the partition values.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions"
}
},
"items": [
{
"entryMap": {
"00000000-0000-4000-8000-000000000002:public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000004",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
},
"public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000004",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000004",
"name": "1996",
"suiteId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"entries": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000004",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
]
},
{
"entryMap": {
"00000000-0000-4000-8000-000000000002:public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000006",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000007",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1997",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
},
"public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000006",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000007",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1997",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000007",
"name": "1997",
"suiteId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"entries": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000006",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000007",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1997",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
]
},
{
"entryMap": {
"00000000-0000-4000-8000-000000000002:public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000008",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000009",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1998",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
},
"public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000008",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000009",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1998",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000009",
"name": "1998",
"suiteId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"entries": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000008",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000009",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1998",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000002:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000002:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000002"
}
}
}
]
}
],
"start": 0,
"count": 3,
"total": 3
}
POST /api/datasources/{id}/suites/{suiteId}/partitions
Add a partition value and generate its entries. Payload { name, generateAllEntries?, preserveSubstitutions? }. Returns the suite.
{
"name": "1999"
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions"
},
"inf:suite-mappings": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/mappings"
},
"inf:suite-partitions": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/partitions"
},
"inf:suite-generate": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/_generate"
}
},
"permissions": {
"delete": true,
"rename": true,
"write": true
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000001",
"name": "Orders by Year",
"slug": "orders-by-year",
"description": null,
"label": "Year",
"defaultPartitionId": "00000000-0000-4000-8000-000000000002",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
GET /api/datasources/{id}/suites/{suiteId}/partitions/{partitionId}
Get one partition.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/partitions/00000000-0000-4000-8000-000000000002"
}
},
"entryMap": {
"00000000-0000-4000-8000-000000000003:public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000004",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000002",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
}
},
"public+orders": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000004",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000002",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"name": "Orders",
"permissions": {
"write": false,
"hide": false,
"delete": false,
"rename": false,
"changeSet": false,
"restoreDefaults": false,
"scan": false
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
}
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"name": "1996",
"suiteId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"entries": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000004",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000002",
"mappingId": "00000000-0000-4000-8000-000000000005",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"pattern": "orders_${partition}",
"substitutions": {},
"mappingId": "00000000-0000-4000-8000-000000000003:public+orders",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"mapping": {
"id": "00000000-0000-4000-8000-000000000003:public+orders",
"name": "Orders",
"permissions": {
"write": true,
"hide": true,
"delete": true,
"rename": true,
"changeSet": true,
"restoreDefaults": true,
"scan": true
},
"schemaId": "public",
"mappingId": "orders",
"datasourceId": "00000000-0000-4000-8000-000000000003"
}
}
}
]
}
PUT /api/datasources/{id}/suites/{suiteId}/partitions/{partitionId}
Rename a partition (clears and regenerates its entries). Payload { name, generateAllEntries?, preserveSubstitutions? }.
DELETE /api/datasources/{id}/suites/{suiteId}/partitions/{partitionId}
Remove a partition (and its entries). Returns 200 with an empty body.
Entries
Entries are the generated rows that map each (mapping × partition) to a real table. They are usually managed through generation, but a single entry's table can be overridden when a table doesn't follow the pattern.
GET /api/datasources/{id}/suites/{suiteId}/entries
List the materialized entries (each pointing at a real table such as
orders_1996).
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries"
}
},
"items": [
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000003",
"mappingId": "00000000-0000-4000-8000-000000000004",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
},
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000005",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000006",
"mappingId": "00000000-0000-4000-8000-000000000004",
"tableName": "orders_1997",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
},
{
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000007",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000008",
"mappingId": "00000000-0000-4000-8000-000000000004",
"tableName": "orders_1998",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
},
"… 1 more items (4 total) — omitted from docs"
],
"start": 0,
"count": 4,
"total": 4
}
GET /api/datasources/{id}/suites/{suiteId}/entries/{entryId}
Get one entry.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries/00000000-0000-4000-8000-000000000002"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000003",
"mappingId": "00000000-0000-4000-8000-000000000004",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
}
PUT /api/datasources/{id}/suites/{suiteId}/entries/{entryId}
Override which physical table an entry maps to. Payload { tableName, substitutions? }.
{
"tableName": "orders_1996"
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/datasources/admin%3Anorthwind/suites/00000000-0000-4000-8000-000000000001/entries/00000000-0000-4000-8000-000000000002"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"suiteId": "00000000-0000-4000-8000-000000000001",
"partitionId": "00000000-0000-4000-8000-000000000003",
"mappingId": "00000000-0000-4000-8000-000000000004",
"tableName": "orders_1996",
"substitutions": {},
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
}
GET /api/suite-mappings
List the distinct base-mapping ids that participate in any suite (tenant-wide). Used to flag which mappings are part of a suite.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/suite-mappings"
}
},
"00000000-0000-4000-8000-000000000001:public+orders": {
"mappingId": "00000000-0000-4000-8000-000000000001:public+orders"
}
}