Public API v1
Public API v1 is the read-only part of the DataForge public API: RMD content, the data model and data marts. Authentication, common conventions and error codes are described on the API page.
1 Public DF API — RMD content (df-api/v1)
Base path: /df-api/v1. Auth: X-Api-Key. All endpoints are read-only and gated by company license (section 5 of the API page). This group covers access to projects, versions, and RMD content (measures, dimensions, facts); the data-model and data-mart endpoints are described in section 9.8. The RMD content endpoints are mounted directly under the version — …/versions/{version_id}/measures, with no intermediate /rmd/ segment.
Common to every endpoint of the group: only projects the key owner can access are visible (section 2.2 of the API page); page and pageSize are not capped on this group (section 3.2 of the API page); format=xlsx answers { "downloadUrl": "<signed URL valid for 15 minutes>" } instead of the JSON body (section 3.5 of the API page).
1.1 List projects
Request
GET /df-api/v1/projects
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20; not capped |
format |
query | json | xlsx |
no | Output format. Default json; xlsx produces a one-sheet workbook Projects |
Details
The list is filtered to the projects the key owner can access; inaccessible projects are excluded from the page and from total. The language parameter is not accepted — no field of the response is localized.
Response
200 OK
{
"projects": [
{ "id": 12, "name": "Sales Analytics", "description": "Production sales warehouse" }
],
"pagination": { "total": 1, "page": 1, "pageSize": 20, "totalPages": 1 }
}
| Field | Type | Description |
|---|---|---|
projects[].id |
integer | Project identifier |
projects[].name |
string | Project name |
projects[].description |
string | null | Project description |
pagination |
object | total, page, pageSize, totalPages (section 3.2 of the API page) |
Errors. Common errors only (section 4 of the API page).
1.2 List versions
Request
GET /df-api/v1/projects/{id}/versions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id |
path | integer | yes | Project identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20; not capped |
format |
query | json | xlsx |
no | Output format. Default json; xlsx produces a one-sheet workbook Versions |
Details
Soft-deleted versions are not returned. A project the key owner cannot access answers 404 — existence is not disclosed.
Response
200 OK
{
"versions": [ { "id": 33, "name": "Q4 2025", "is_global": true } ],
"pagination": { "total": 1, "page": 1, "pageSize": 20, "totalPages": 1 }
}
| Field | Type | Description |
|---|---|---|
versions[].id |
integer | Version identifier |
versions[].name |
string | Version name |
versions[].is_global |
boolean | true for the project's published (global) version |
pagination |
object | total, page, pageSize, totalPages |
Errors. Common errors only (section 4 of the API page).
1.3 Get measures
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/measures
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
language |
query | ru | en |
no | Language of the select-type labels. Default: Accept-Language, then en |
format |
query | json | xlsx |
no | Output format. Default json |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20; not capped |
Details
The set of returned keys reflects the RMD column layout of the measures table: every row carries all columns, empty ones as null. Select-type fields (measure_type, display_data_type, status, relevance, …) are returned as localized labels (Base / Calculated, Number, …), not as slugs. Formula fields have measure references substituted from numeric IDs to human-readable names. original_source and original_object are free text from the RMD.
Response
200 OK
{
"measures": [
{
"row_number": 1,
"group": "Revenue",
"block": "Sales",
"measure_name": "Total revenue",
"measure_description": "Gross revenue across all channels",
"original_source_type": "Database",
"original_source": "ERP",
"original_object": "sales.amount",
"display_data_type": "Number",
"measure_type": "Base",
"restrictions": null,
"formula": null,
"report_for_verification": null,
"comment": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null,
"variation": null
}
],
"pagination": { "total": 42, "page": 1, "pageSize": 20, "totalPages": 3 }
}
| Field | Type | Description |
|---|---|---|
measures[].row_number |
integer | Position of the row in the RMD table |
measures[].group, block |
string | null | Grouping columns of the RMD |
measures[].measure_name |
string | Measure name |
measures[].measure_description |
string | null | Description |
measures[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
measures[].display_data_type |
string | null | Localized data type label (Number, Text, Date, …) |
measures[].measure_type |
string | Localized label: Base or Calculated |
measures[].restrictions |
string | null | Restrictions column |
measures[].formula |
string | null | Formula of a calculated measure with references rendered as [Name] |
measures[].report_for_verification, comment, responsible_for_data, variation |
string | null | Free-text columns |
measures[].status, relevance, required, visibility |
string | null | Localized select labels |
pagination |
object | total, page, pageSize, totalPages |
Errors. Common errors only (section 4 of the API page).
1.4 Get dimensions
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/dimensions
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
language |
query | ru | en |
no | Language of the select-type labels |
format |
query | json | xlsx |
no | Output format. Default json |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20; not capped |
Details
Every row carries all columns of the dimensions table of the RMD, empty ones as null; select-type fields (dimension_type, display_data_type, status, …) are returned as localized labels, formula references as human-readable names. source_data_type is derived from connected_source: the API parses the source object (db, schema, table, column) and resolves the column type from the cached schema of the referenced connection. The value is null when the connected source is absent, cannot be resolved to a column, or when no row in the version has a connected_source. connected_source is the source object of section 3.6 of the API page without connection (v1).
Response
200 OK
{
"dimensions": [
{
"row_number": 1,
"group": "Customer",
"block": "Profile",
"dimension_name": "Customer name",
"dimension_description": "Full customer name",
"original_source_type": null,
"original_source": null,
"original_object": null,
"dimension_group": "Customers",
"display_data_type": "Text",
"source_data_type": "VARCHAR(255)",
"dimension_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "dim_customer", "column": "customer_name" },
"comment": null,
"value_options": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"pagination": { "total": 18, "page": 1, "pageSize": 20, "totalPages": 1 }
}
| Field | Type | Description |
|---|---|---|
dimensions[].row_number |
integer | Position of the row in the RMD table |
dimensions[].group, block |
string | null | Grouping columns of the RMD |
dimensions[].dimension_name, dimension_description |
string / string | null | Name and description |
dimensions[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
dimensions[].dimension_group |
string | null | Name of the dimension group the dimension belongs to |
dimensions[].display_data_type |
string | null | Localized data type label |
dimensions[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
dimensions[].dimension_type |
string | Localized label: Primary or Derived |
dimensions[].formula |
string | null | Formula of a derived dimension |
dimensions[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
dimensions[].comment, responsible_for_data |
string | null | Free-text columns |
dimensions[].value_options |
string | null | Allowed values column |
dimensions[].status, relevance, required, visibility |
string | null | Localized select labels |
pagination |
object | total, page, pageSize, totalPages |
Errors. Common errors only (section 4 of the API page).
1.5 Get facts
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/facts
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
language |
query | ru | en |
no | Language of the select-type labels |
format |
query | json | xlsx |
no | Output format. Default json |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20; not capped |
Details
Every row carries all columns of the facts table of the RMD, empty ones as null; select-type fields are returned as localized labels, formula references as human-readable names. source_data_type is resolved from connected_source through the cached schema of the referenced connection and is null when the connected source is absent or cannot be resolved.
Response
200 OK
{
"facts": [
{
"row_number": 1,
"group": "Sales",
"block": "Orders",
"fact_name": "Order line",
"fact_description": "An individual line item on a sales order",
"original_source_type": null,
"original_source": null,
"original_object": null,
"source_data_type": "DECIMAL(18,2)",
"fact_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "fact_order_line", "column": "amount" },
"report_for_verification": null,
"comment": null,
"status": null,
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"pagination": { "total": 6, "page": 1, "pageSize": 20, "totalPages": 1 }
}
| Field | Type | Description |
|---|---|---|
facts[].row_number |
integer | Position of the row in the RMD table |
facts[].group, block |
string | null | Grouping columns of the RMD |
facts[].fact_name, fact_description |
string / string | null | Name and description |
facts[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
facts[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
facts[].fact_type |
string | Localized label: Primary or Derived |
facts[].formula |
string | null | Formula of a derived fact |
facts[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
facts[].report_for_verification, comment, responsible_for_data |
string | null | Free-text columns |
facts[].status, relevance, required, visibility |
string | null | Localized select labels |
pagination |
object | total, page, pageSize, totalPages |
Errors. Common errors only (section 4 of the API page).
1.6 Get full RMD (content)
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/rmd
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
language |
query | ru | en |
no | Language of the select-type labels |
format |
query | json | xlsx |
no | Output format. Default json |
Details
On df-api/v1 this path is the combined RMD export: measures, dimensions and facts together with the data model (dimension groups, fact tables, relationships), not paginated. It returns a complete metadata snapshot of the version with an exported_at timestamp and is designed for downstream catalogs and full-state synchronization.
Response
200 OK
{
"project": {
"id": "12",
"name": "Sales Analytics",
"description": "Production sales warehouse"
},
"version": {
"id": "33",
"name": "Q4 2025",
"is_global": true
},
"measures": [
{
"row_number": 1,
"group": "Revenue",
"block": "Sales",
"measure_name": "Total revenue",
"measure_description": "Gross revenue across all channels",
"original_source_type": "Database",
"original_source": "ERP",
"original_object": "sales.amount",
"display_data_type": "Number",
"measure_type": "Base",
"restrictions": null,
"formula": null,
"report_for_verification": null,
"comment": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null,
"variation": null
}
],
"dimensions": [
{
"row_number": 1,
"group": "Customer",
"block": "Profile",
"dimension_name": "Customer name",
"dimension_description": "Full customer name",
"original_source_type": null,
"original_source": null,
"original_object": null,
"dimension_group": "Customers",
"display_data_type": "Text",
"source_data_type": "VARCHAR(255)",
"dimension_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "dim_customer", "column": "customer_name" },
"comment": null,
"value_options": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"facts": [
{
"row_number": 1,
"group": "Sales",
"block": "Orders",
"fact_name": "Order line",
"fact_description": "An individual line item on a sales order",
"original_source_type": null,
"original_source": null,
"original_object": null,
"source_data_type": "DECIMAL(18,2)",
"fact_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "fact_order_line", "column": "amount" },
"report_for_verification": null,
"comment": null,
"status": null,
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"dimension_groups": [
{
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": {
"db": "analytics_db",
"schema": "public",
"table": "dim_geography",
"column": "region_id"
},
"dimensions": [
{ "id": "722", "name": "Region", "level": 1, "data_type": "Text", "physical_column": "region_name" },
{ "id": "723", "name": "Country", "level": 2, "data_type": "Text", "physical_column": "country_code" }
],
"related_fact_tables": ["11", "14"],
"created_at": null
}
],
"fact_tables": [
{
"id": "11",
"name": "fact_sales",
"description": "Primary sales facts",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"measures_count": 5,
"dimensions_count": 3,
"facts_count": 2,
"verification_filters_count": 2,
"related_dimension_groups_count": 1
}
],
"relationships": [
{
"id": "1101",
"source_fact_table": { "id": "11", "name": "fact_sales" },
"target_dimension_group": { "id": "9", "name": "Geography" },
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" },
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"relationship_type": "Many-to-one",
"created_at": null
}
],
"exported_at": "2026-05-05T08:30:00Z"
}
| Field | Type | Description |
|---|---|---|
project |
object | id, name, description of the project (id as a string) |
version |
object | id, name, is_global of the version |
measures[].row_number |
integer | Position of the row in the RMD table |
measures[].group, block |
string | null | Grouping columns of the RMD |
measures[].measure_name |
string | Measure name |
measures[].measure_description |
string | null | Description |
measures[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
measures[].display_data_type |
string | null | Localized data type label (Number, Text, Date, …) |
measures[].measure_type |
string | Localized label: Base or Calculated |
measures[].restrictions |
string | null | Restrictions column |
measures[].formula |
string | null | Formula of a calculated measure with references rendered as [Name] |
measures[].report_for_verification, comment, responsible_for_data, variation |
string | null | Free-text columns |
measures[].status, relevance, required, visibility |
string | null | Localized select labels |
dimensions[].row_number |
integer | Position of the row in the RMD table |
dimensions[].group, block |
string | null | Grouping columns of the RMD |
dimensions[].dimension_name, dimension_description |
string / string | null | Name and description |
dimensions[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
dimensions[].dimension_group |
string | null | Name of the dimension group the dimension belongs to |
dimensions[].display_data_type |
string | null | Localized data type label |
dimensions[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
dimensions[].dimension_type |
string | Localized label: Primary or Derived |
dimensions[].formula |
string | null | Formula of a derived dimension |
dimensions[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
dimensions[].comment, responsible_for_data |
string | null | Free-text columns |
dimensions[].value_options |
string | null | Allowed values column |
dimensions[].status, relevance, required, visibility |
string | null | Localized select labels |
facts[].row_number |
integer | Position of the row in the RMD table |
facts[].group, block |
string | null | Grouping columns of the RMD |
facts[].fact_name, fact_description |
string / string | null | Name and description |
facts[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
facts[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
facts[].fact_type |
string | Localized label: Primary or Derived |
facts[].formula |
string | null | Formula of a derived fact |
facts[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
facts[].report_for_verification, comment, responsible_for_data |
string | null | Free-text columns |
facts[].status, relevance, required, visibility |
string | null | Localized select labels |
dimension_groups[].id, name, description |
string / string / string | null | Identity |
dimension_groups[].primary_key |
object | null | Source object { db, schema, table, column } |
dimension_groups[].dimensions[] |
array | Members ordered by hierarchy level; data_type is the localized display data type, physical_column the column in the source table |
dimension_groups[].related_fact_tables[] |
string | IDs of fact tables that reference the group; their configuration is available through the fact table endpoints |
dimension_groups[].created_at |
null | Not populated in v1 |
fact_tables[].id, name, description, owner, created_at |
— | Identity; owner is the creator's name |
fact_tables[].measures_count, dimensions_count, facts_count |
integer | Elements assigned directly to the fact table |
fact_tables[].verification_filters_count |
integer | Per-fact-table verification filters |
fact_tables[].related_dimension_groups_count |
integer | Dimension groups assigned to the fact table |
relationships[].id |
string | Relationship identifier |
relationships[].source_fact_table |
object | id, name of the fact table holding the foreign key |
relationships[].target_dimension_group |
object | id, name of the dimension group holding the primary key |
relationships[].foreign_key, primary_key |
object | null | Source objects of the join |
relationships[].relationship_type |
string | Localized cardinality label |
relationships[].created_at |
null | Not populated in v1 |
exported_at |
string | When the snapshot was taken, ISO 8601 |
Errors. Common errors only (section 4 of the API page).
2 Public DF API — data model and data marts (df-api/v1)
Base path: /df-api/v1. Auth: X-Api-Key. All endpoints are read-only.
This group is organized into six logical areas: data marts, connections, dimension groups, fact tables, relationships, and a combined RMD export. The data-marts and connections endpoints return JSON only; the dimension-groups, fact-tables, relationships, and RMD-export endpoints additionally support ?format=xlsx (see section 3.5 of the API page). The RMD content endpoints (projects, versions, measures, dimensions, facts) are documented in section 9.7.
Common to every endpoint of the group: {project_id} and {version_id} are required path parameters (integers); a project the key owner cannot access answers 404; list endpoints refuse pageSize above 100 with 400 DF_API.PAGE_SIZE_EXCEEDED and paginate with total_pages (not totalPages, section 3.2 of the API page). Source objects (primary_key, foreign_key) carry db, schema, table, column and no connection field (section 3.6 of the API page).
2.1 List data marts
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/data-marts
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20, maximum 100 |
language |
query | ru | en |
no | Language of the type label |
type |
query | string | no | Filter by mart type: with_grouping, without_grouping, with_grouping_and_pivoting |
merge_type |
query | string | no | Filter by merge type: union, join |
search |
query | string | no | Case-insensitive substring search across name and description |
Details
type is returned as a localized label (depends on language / Accept-Language), e.g. "With grouping" for en, while the filter takes the raw slug. merge_type is always the raw slug (union / join), never localized. When a mart has no description the description key is absent (v2 returns null). JSON only — format is not accepted.
Response
200 OK
{
"data_marts": [
{
"id": "57",
"name": "Monthly Sales Mart",
"description": "Aggregated by month and region",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"type": "With grouping",
"merge_type": "union",
"source_fact_table_count": 2,
"has_physical_view": true
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 45, "total_pages": 3 }
}
| Field | Type | Description |
|---|---|---|
data_marts[].id |
string | Data mart identifier |
data_marts[].name |
string | Display name |
data_marts[].description |
string | Description; the key is omitted when unset |
data_marts[].owner |
string | Owner's name, or the e-mail when no name is set |
data_marts[].created_at |
string | Creation timestamp, ISO 8601 |
data_marts[].type |
string | Localized mart type label |
data_marts[].merge_type |
string | null | union / join; null for marts built on a single fact table |
data_marts[].source_fact_table_count |
integer | Number of distinct source fact tables |
data_marts[].has_physical_view |
boolean | Whether a physical object has been materialized for the mart |
pagination |
object | page, pageSize, total, total_pages |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.INVALID_TYPE |
400 | type is outside the allowed set |
DF_API.INVALID_MERGE_TYPE |
400 | merge_type is outside the allowed set |
DF_API.PAGE_SIZE_EXCEEDED |
400 | pageSize above 100 |
| Common errors | — | Section 4 of the API page |
2.2 Get data mart details
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/data-marts/{data_mart_id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
data_mart_id |
path | integer | yes | Data mart identifier |
language |
query | ru | en |
no | Language of the localized labels (type, data_type) |
Details
Returns the full configuration of a data mart. For pivoted (transposed) marts (type = with_grouping_and_pivoting) the response additionally includes selected_measure_attributes, where the implicit pivot key Measure name is always prepended to any explicitly stored attributes:
"selected_measure_attributes": [
{ "attribute_id": "3", "attribute_name": "Measure name" },
{ "attribute_id": "27", "attribute_name": "Measure description" }
]
Response
200 OK
{
"id": "57",
"name": "Monthly Sales Mart",
"description": "Aggregated by month and region",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"type": "with_grouping",
"merge_type": "union",
"source_fact_tables": [
{ "id": "11", "name": "fact_sales", "description": "Primary sales facts" }
],
"selected_measures": [
{
"instance_id": "204",
"measure_id": "501",
"measure_name": "Total revenue",
"description": "Gross revenue",
"formula": "SUM([Amount])",
"data_type": "Numeric",
"display_name": "Revenue",
"aggregation_configuration": { "type": "default", "group_by_fields": [] },
"source_fact_table_id": "11"
}
],
"selected_facts": [
{
"fact_id": "611",
"fact_name": "Order line",
"data_type": "Numeric",
"display_name": "Order line",
"include_in_result": true,
"filter_condition": null,
"source_fact_table_id": "11"
}
],
"selected_dimensions": [
{
"dimension_id": "722",
"dimension_name": "Region",
"description": "Geographic region",
"data_type": "Text",
"display_name": "Region",
"include_in_result": true,
"filter_condition": null,
"source_fact_table_id": "11",
"source_dimension_group_id": "9",
"source_dimension_group_name": "Geography"
}
],
"physical_view": {
"exists": false,
"type": null, "database": null, "schema": null, "name": null, "created_at": null
}
}
| Field | Type | Description |
|---|---|---|
id |
string | Data mart identifier |
name |
string | Display name |
description |
string | Description; the key is omitted when unset |
owner |
string | Owner's name, or the e-mail when no name is set |
created_at |
string | Creation timestamp, ISO 8601 |
type |
string | Localized mart type label |
merge_type |
string | null | union / join; null for marts built on a single fact table |
source_fact_tables[] |
array | Fact tables the mart draws from: id, name, description |
selected_measures[].instance_id |
string | Unique identifier of the measure instance inside the mart (the same measure may appear several times with different aggregation settings) |
selected_measures[].measure_id |
string | Identifier of the measure in the RMD |
selected_measures[].formula |
string | null | Formula of a calculated measure |
selected_measures[].data_type |
string | Localized data type label |
selected_measures[].display_name |
string | Column name in the mart |
selected_measures[].aggregation_configuration.type |
string | default, none, custom, or global |
selected_measures[].aggregation_configuration.group_by_fields |
array | Column-value IDs of the fields the measure is grouped by |
selected_facts[], selected_dimensions[] |
array | Facts and dimensions used by the mart |
…include_in_result |
boolean | false means the element is used only for filtering and is not projected into the result |
…filter_condition |
string | null | Filter expression with column-value references replaced by names; null if no filter |
selected_dimensions[].source_dimension_group_id / source_dimension_group_name |
string | null | Resolved from the data model even if the dimension group is not explicitly listed in the mart's attributes |
physical_view |
object | Metadata of the materialized object: exists, type (localized label of the object kind), database (raw slug), schema, name, created_at; the connection field is not included here |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.DATA_MART_NOT_FOUND |
404 | The mart does not exist in the given version |
| Common errors | — | Section 4 of the API page |
2.3 Get physical view metadata
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/data-marts/{data_mart_id}/view
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
data_mart_id |
path | integer | yes | Data mart identifier |
language |
query | ru | en |
no | Language of the type label |
Details
Returns metadata of the physical object DataForge has materialized for the data mart. No connection to the target database is performed — only what the platform already knows is returned. When no view has been materialized, exists is false and every other field is null:
{ "exists": false, "type": null, "database": null, "schema": null, "name": null, "created_at": null, "connection": null }
Response
200 OK
{
"exists": true,
"type": "materialized_view",
"database": "postgresql",
"schema": "marts",
"name": "monthly_sales",
"created_at": "2026-04-21T09:00:00Z",
"connection": { "id": "3", "name": "Production PostgreSQL", "db_type": "postgres" }
}
| Field | Type | Description |
|---|---|---|
exists |
boolean | Whether the object is materialized |
type |
string | null | Localized label for the physical object kind (depends on language); raw slugs are regular_view, materialized_view, table |
database |
string | null | Raw database-type slug: postgresql, clickhouse, sqlserver (not localized) |
schema |
string | null | Schema of the object. For ClickHouse v1 returns the database name here; v2 returns null |
name |
string | null | Object name in the database |
created_at |
string | null | When the object was created, ISO 8601 |
connection |
object | null | id, name, db_type of the connection the object lives in; no credentials |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.DATA_MART_NOT_FOUND |
404 | The mart does not exist in the given version |
| Common errors | — | Section 4 of the API page |
2.4 Generate SQL script
Request
POST /df-api/v1/projects/{project_id}/versions/{version_id}/data-marts/{data_mart_id}/generate-sql
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
data_mart_id |
path | integer | yes | Data mart identifier |
limit |
body | integer > 0 | no | Appends a row limit using dialect-appropriate syntax: LIMIT n OFFSET m for PostgreSQL/ClickHouse, OFFSET m ROWS FETCH NEXT n ROWS ONLY for MS SQL |
offset |
body | integer ≥ 0 | no | Row offset; effective only together with limit. offset alone is ignored |
Request body (optional):
{ "limit": 100, "offset": 0 }
Details
Generates the SQL SELECT statement of the mart. SQL is only generated and returned — it is not executed, and nothing is persisted. For MS SQL, if the generated SQL has no ORDER BY, the service appends ORDER BY (SELECT NULL) to make OFFSET … FETCH NEXT syntactically valid.
The endpoint answers 201 Created — the default POST status in v1; the same endpoint in v2 answers 200 and takes limit / offset from the query string.
If SQL generation fails (broken metric formulas or missing source mappings), the response is still successful (the same 201) and carries the failure in validation_errors. This lets clients distinguish "the mart cannot currently produce SQL" from "the mart does not exist" (404). In v1 the message field carries the raw key of the cause (e.g. FORMULA.SOURCE_NOT_FOUND_FOR_METRIC); only v2 returns localized text.
Response
201 Created
{
"sql_script": "SELECT ...\nFROM ...\nGROUP BY ...\nLIMIT 100 OFFSET 0",
"target_db_type": "postgres",
"validation_errors": []
}
On a generation failure:
{
"sql_script": "",
"target_db_type": null,
"validation_errors": [
{ "code": "SQL_GENERATION_FAILED", "message": "FORMULA.SOURCE_NOT_FOUND_FOR_METRIC" }
]
}
| Field | Type | Description |
|---|---|---|
sql_script |
string | The generated SELECT; empty string on failure |
target_db_type |
string | null | Target database type (postgres, clickhouse, sqlserver); null on failure |
validation_errors[] |
array | Empty on success |
validation_errors[].code |
string | Always SQL_GENERATION_FAILED |
validation_errors[].message |
string | Raw key of the cause (v1) |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.DATA_MART_NOT_FOUND |
404 | The mart does not exist in the given version |
| Common errors | — | Section 4 of the API page |
2.5 List connections
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/connections
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20, maximum 100 |
language |
query | ru | en |
no | Accepted for contract parity; no field of the response is localized |
db_type |
query | string | no | Filter by database type: postgresql, clickhouse, sqlserver |
status |
query | string | no | Filter by status: active, inactive, never_verified, failed |
Details
Credentials are never returned (section 6 of the API page). schema is only returned for PostgreSQL: for MS SQL Server it is folded into the table name elsewhere, for ClickHouse the database name is used in lieu of a schema — null in both cases. Connections whose database type the public API does not expose (MySQL, for instance) are omitted from the list and from total.
status is mapped from the internal connection state: never_verified takes priority — without a successful update timestamp the system cannot claim a state; failed corresponds to internal UPDATE_ERROR; inactive corresponds to DISABLED; otherwise the status is active.
Response
200 OK
{
"connections": [
{
"id": "1",
"name": "Production PostgreSQL",
"db_type": "postgresql",
"host": "db.production.company.com",
"port": 5432,
"database": "analytics_db",
"schema": "public",
"username": "analytics_user",
"status": "active",
"last_updated_at": "2026-04-15T08:30:00Z"
},
{
"id": "2",
"name": "Legacy SQL Server",
"db_type": "sqlserver",
"host": "sqlserver.legacy.company.com",
"port": 1433,
"database": "legacy_warehouse",
"schema": null,
"username": "etl_service",
"status": "active",
"last_updated_at": "2026-04-14T10:00:00Z"
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 8, "total_pages": 1 }
}
| Field | Type | Description |
|---|---|---|
connections[].id |
string | Connection identifier |
connections[].name |
string | Display name (unique within the version) |
connections[].db_type |
string | Raw slug: postgresql, clickhouse, sqlserver |
connections[].host, port, database |
string / integer / string | Network coordinates |
connections[].schema |
string | null | Connection schema; PostgreSQL only |
connections[].username |
string | Database user name (not a secret) |
connections[].status |
string | active, inactive, never_verified, failed |
connections[].last_updated_at |
string | null | When the schema snapshot was last refreshed successfully |
pagination |
object | page, pageSize, total, total_pages |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.INVALID_DB_TYPE |
400 | db_type is outside the allowed set |
DF_API.INVALID_STATUS |
400 | status is outside the allowed set |
DF_API.PAGE_SIZE_EXCEEDED |
400 | pageSize above 100 |
| Common errors | — | Section 4 of the API page |
2.6 Get connection details
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/connections/{connection_id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
connection_id |
path | integer | yes | Connection identifier |
language |
query | ru | en |
no | Accepted for contract parity; no field is localized |
include_db_schema |
query | boolean | no | Default false. When true, replaces the lightweight db_tables array with the full db_schema object |
Details
db_tables[] carries name only. db_schema.tables[] carries table_name, schema (the table's own schema; null for ClickHouse, which has no schemas) and columns[] of column_name and data_type. The same structure object is called db_schema in this endpoint and schema in the schema endpoint (GET …/connections/{connection_id}/schema); the table contents are identical in both. In v1 the container carries no connection field — only v2 adds it. The schema is a cached snapshot taken at connection setup or during a manual refresh; last_updated_at records when it was taken.
Response
200 OK — include_db_schema=false:
{
"id": "1",
"name": "Production PostgreSQL",
"db_type": "postgresql",
"host": "db.production.company.com",
"port": 5432,
"database": "analytics_db",
"schema": "public",
"username": "analytics_user",
"status": "active",
"last_updated_at": "2026-04-15T08:30:00Z",
"db_tables": [ { "name": "fact_sales" }, { "name": "dim_customer" } ]
}
200 OK — include_db_schema=true:
{
"id": "1",
"name": "Production PostgreSQL",
"db_type": "postgresql",
"host": "db.production.company.com",
"port": 5432,
"database": "analytics_db",
"schema": "public",
"username": "analytics_user",
"status": "active",
"last_updated_at": "2026-04-15T08:30:00Z",
"db_schema": {
"tables": [
{
"table_name": "fact_sales",
"schema": "public",
"columns": [
{ "column_name": "sale_id", "data_type": "int" },
{ "column_name": "sale_date", "data_type": "datetime" },
{ "column_name": "amount", "data_type": "decimal(18,2)" }
]
}
]
}
}
| Field | Type | Description |
|---|---|---|
id |
string | Connection identifier |
name |
string | Display name (unique within the version) |
db_type |
string | Raw slug: postgresql, clickhouse, sqlserver |
host, port, database |
string / integer / string | Network coordinates |
schema |
string | null | Connection schema; PostgreSQL only |
username |
string | Database user name (not a secret) |
status |
string | active, inactive, never_verified, failed |
last_updated_at |
string | null | When the schema snapshot was last refreshed successfully |
db_tables[].name |
string | Table name; present when include_db_schema is not set |
db_schema |
object | Full structure; present instead of db_tables when include_db_schema=true |
db_schema.tables[].table_name |
string | Table name |
db_schema.tables[].schema |
string | null | The table's schema; null for ClickHouse |
db_schema.tables[].columns[].column_name, data_type |
string | Column name and type as read from the database |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.CONNECTION_NOT_FOUND |
404 | The connection does not exist in the given version |
| Common errors | — | Section 4 of the API page |
2.7 Get connection schema
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/connections/{connection_id}/schema
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
connection_id |
path | integer | yes | Connection identifier |
Details
Returns only the cached schema (tables and columns) of a connection, without the network coordinates. The top-level key is schema (the connection details endpoint calls the same object db_schema); its contents are identical: tables[] with table_name, the table's schema (null for ClickHouse) and columns[] of column_name and data_type.
The schema returned is a cached snapshot taken at connection setup or during a manual refresh. It does not reflect real-time changes in the target database; last_updated_at records when the snapshot was taken.
Response
200 OK
{
"id": "1",
"name": "Production PostgreSQL",
"db_type": "postgresql",
"last_updated_at": "2026-04-15T08:30:00Z",
"schema": {
"tables": [
{ "table_name": "fact_sales", "schema": "public",
"columns": [
{ "column_name": "sale_id", "data_type": "int" },
{ "column_name": "sale_date", "data_type": "datetime" }
]
}
]
}
}
| Field | Type | Description |
|---|---|---|
id, name, db_type |
string | Connection identity |
last_updated_at |
string | null | When the snapshot was taken |
schema.tables[].table_name |
string | Table name |
schema.tables[].schema |
string | null | The table's schema; null for ClickHouse |
schema.tables[].columns[].column_name, data_type |
string | Column name and type as read from the database |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.CONNECTION_NOT_FOUND |
404 | The connection does not exist in the given version |
| Common errors | — | Section 4 of the API page |
2.8 List dimension groups
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/dimension-groups
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20, maximum 100 |
language |
query | ru | en |
no | Language of the data_type labels |
format |
query | json | xlsx |
no | Default json. xlsx produces a one-sheet workbook Dimension Groups |
Details
Returns the dimension groups (справочники) defined in the project version, with their primary key, member dimensions, and the IDs of fact tables that reference them. primary_key is the source object of section 3.6 of the API page without connection, or null when the group has no resolved physical key; v1 answers the schema stored on the row as-is. created_at is present but not populated for dimension groups — returned as null.
Response
200 OK
{
"dimension_groups": [
{
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": {
"db": "analytics_db",
"schema": "public",
"table": "dim_geography",
"column": "region_id"
},
"dimensions": [
{ "id": "722", "name": "Region", "level": 1, "data_type": "Text", "physical_column": "region_name" },
{ "id": "723", "name": "Country", "level": 2, "data_type": "Text", "physical_column": "country_code" }
],
"related_fact_tables": ["11", "14"],
"created_at": null
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 12, "total_pages": 1 }
}
| Field | Type | Description |
|---|---|---|
dimension_groups[].id, name, description |
string / string / string | null | Identity |
dimension_groups[].primary_key |
object | null | Source object { db, schema, table, column } |
dimension_groups[].dimensions[] |
array | Members ordered by hierarchy level; data_type is the localized display data type, physical_column the column in the source table |
dimension_groups[].related_fact_tables[] |
string | IDs of fact tables that reference the group; their configuration is available through the fact table endpoints |
dimension_groups[].created_at |
null | Not populated in v1 |
pagination |
object | page, pageSize, total, total_pages |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.PAGE_SIZE_EXCEEDED |
400 | pageSize above 100 |
| Common errors | — | Section 4 of the API page |
2.9 Get dimension group details
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/dimension-groups/{dimension_group_id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
dimension_group_id |
path | integer | yes | Dimension group identifier |
language |
query | ru | en |
no | Localization |
format |
query | json | xlsx |
no | Default json |
Details
Returns the full configuration of a single dimension group, including the related fact tables with their foreign key columns. Unlike the list endpoint, the v1 details do not include the dimensions array (v2 does). created_at / updated_at are present but null.
Response
200 OK
{
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": {
"db": "analytics_db",
"schema": "public",
"table": "dim_geography",
"column": "region_id"
},
"related_fact_tables": [
{ "fact_table_id": "11", "fact_table_name": "fact_sales", "foreign_key_column": "region_id" },
{ "fact_table_id": "14", "fact_table_name": "fact_inventory", "foreign_key_column": "region_id" }
],
"created_at": null,
"updated_at": null
}
| Field | Type | Description |
|---|---|---|
id, name, description |
string / string / string | null | Identity |
primary_key |
object | null | Source object { db, schema, table, column } |
related_fact_tables[] |
array | fact_table_id, fact_table_name, foreign_key_column of every fact table joined to the group |
created_at, updated_at |
null | Not populated in v1 |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.DIMENSION_GROUP_NOT_FOUND |
404 | The dimension group does not exist in the version |
| Common errors | — | Section 4 of the API page |
2.10 List fact tables
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/fact-tables
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20, maximum 100 |
language |
query | ru | en |
no | Accepted; the list has no localized field |
format |
query | json | xlsx |
no | Default json. xlsx produces a one-sheet workbook Fact Tables |
Details
dimensions_count counts only dimensions added directly to the fact table (not part of any dimension group). Dimensions inherited via dimension groups are accessible through related_dimension_groups_count and through the detail endpoint.
Response
200 OK
{
"fact_tables": [
{
"id": "11",
"name": "fact_sales",
"description": "Primary sales facts",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"measures_count": 5,
"dimensions_count": 3,
"facts_count": 2,
"verification_filters_count": 2,
"related_dimension_groups_count": 1
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 6, "total_pages": 1 }
}
| Field | Type | Description |
|---|---|---|
fact_tables[].id, name, description, owner, created_at |
— | Identity; owner is the creator's name |
fact_tables[].measures_count, dimensions_count, facts_count |
integer | Elements assigned directly to the fact table |
fact_tables[].verification_filters_count |
integer | Per-fact-table verification filters |
fact_tables[].related_dimension_groups_count |
integer | Dimension groups assigned to the fact table |
pagination |
object | page, pageSize, total, total_pages |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.PAGE_SIZE_EXCEEDED |
400 | pageSize above 100 |
| Common errors | — | Section 4 of the API page |
2.11 Get fact table details
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/fact-tables/{fact_table_id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
fact_table_id |
path | integer | yes | Fact table identifier |
language |
query | ru | en |
no | Language of the data_type labels and invalid_reason |
include_dependencies |
query | boolean | no | Default false. When true, every measure carries a recursive dependencies tree resolving formula references to their target measures |
format |
query | json | xlsx |
no | Default json. xlsx produces five sheets: Measures, Dimensions, Facts, Dimension Groups, Verification Filters |
Details
Returns the full configuration of a fact table — its measures, dimensions, facts, dimension groups (with primary and foreign keys), and verification filters. measure_type and fact_type are raw slugs here (base / calculated, primary / derived / constant). In v1 the element data type field is called data_type (v2: display_data_type, section 1 of the Public API v2 page).
Response
200 OK
{
"id": "11",
"name": "fact_sales",
"description": "Primary sales facts",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"updated_at": "2026-04-21T09:00:00Z",
"measures": [
{
"id": "501",
"name": "Total revenue",
"description": "Gross revenue",
"formula": "SUM([Amount])",
"data_type": "Numeric",
"measure_type": "base",
"dependencies": null
}
],
"dimensions": [
{
"id": "801",
"name": "Sale date",
"description": "Calendar date of the sale",
"data_type": "Date",
"physical_column": "sale_date",
"is_from_dimension_group": false,
"dimension_group_id": null
}
],
"facts": [
{
"id": "611",
"name": "Order line",
"description": null,
"data_type": "Numeric",
"fact_type": "primary",
"formula": null,
"physical_column": "amount"
}
],
"dimension_groups": [
{
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" }
}
],
"verification_filters": [
{
"id": "301",
"name": "Valid sales only",
"description": "Excludes test and cancelled orders",
"conditions": "[Status] != 'cancelled'",
"is_valid": true,
"invalid_reason": null
}
]
}
| Field | Type | Description |
|---|---|---|
measures[].measure_type |
string | base (sourced directly) or calculated (derived from a formula) |
measures[].dependencies |
array | null | Present and populated only when include_dependencies=true; each node has id, name, type, formula and a recursive dependencies array |
dimensions[].is_from_dimension_group |
boolean | true for dimensions inherited from a linked dimension group; false for dimensions defined directly on the fact table |
dimensions[].dimension_group_id |
string | null | The group an inherited dimension comes from |
facts[].fact_type |
string | primary, derived, or constant |
…physical_column |
string | null | Column bound to the element in the source table |
dimension_groups[].primary_key, foreign_key |
object | null | Source objects of the join (section 3.6 of the API page) |
verification_filters[].is_valid |
boolean | false when the filter expression cannot be resolved (missing reference, syntax error); invalid_reason carries the localized explanation |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.FACT_TABLE_NOT_FOUND |
404 | The fact table does not exist in the version |
| Common errors | — | Section 4 of the API page |
2.12 List relationships
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/relationships
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
page |
query | integer | no | Page number, 1-indexed. Default 1 |
pageSize |
query | integer | no | Items per page. Default 20, maximum 100 |
language |
query | ru | en |
no | Language of the relationship_type label |
fact_table_id |
query | integer | no | Only relationships whose source is the given fact table |
dimension_group_id |
query | integer | no | Only relationships whose target is the given dimension group |
format |
query | json | xlsx |
no | Default json |
Details
Returns foreign-key relationships between fact tables and dimension groups in the project version. relationship_type describes the cardinality from source fact table to target dimension group; in v1 it is a localized label (Many-to-one / Многие-к-одному depending on language) — only v2 returns the slug many_to_one. created_at is not populated in v1 (null). foreign_key and primary_key may be null if the underlying mapping is incomplete; in that case the relationship is exposed for visibility but cannot be used to build SQL joins.
Response
200 OK
{
"relationships": [
{
"id": "1101",
"source_fact_table": { "id": "11", "name": "fact_sales" },
"target_dimension_group": { "id": "9", "name": "Geography" },
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" },
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"relationship_type": "Many-to-one",
"created_at": null
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 4, "total_pages": 1 }
}
| Field | Type | Description |
|---|---|---|
relationships[].id |
string | Relationship identifier |
relationships[].source_fact_table |
object | id, name of the fact table holding the foreign key |
relationships[].target_dimension_group |
object | id, name of the dimension group holding the primary key |
relationships[].foreign_key, primary_key |
object | null | Source objects of the join |
relationships[].relationship_type |
string | Localized cardinality label |
relationships[].created_at |
null | Not populated in v1 |
pagination |
object | page, pageSize, total, total_pages |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.PAGE_SIZE_EXCEEDED |
400 | pageSize above 100 |
| Common errors | — | Section 4 of the API page |
2.13 Get relationship details
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/relationships/{relationship_id}
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
relationship_id |
path | integer | yes | Relationship identifier |
language |
query | ru | en |
no | Language of the relationship_type label |
format |
query | json | xlsx |
no | Default json |
Details
Returns a single relationship with descriptive fields on both sides; the target dimension group additionally carries its primary_key.
Response
200 OK
{
"id": "1101",
"source_fact_table": {
"id": "11",
"name": "fact_sales",
"description": "Primary sales facts"
},
"target_dimension_group": {
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" }
},
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" },
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"relationship_type": "Many-to-one",
"created_at": null,
"updated_at": null
}
| Field | Type | Description |
|---|---|---|
source_fact_table, target_dimension_group |
object | Both sides with description; the group side repeats its primary_key |
id |
string | Relationship identifier |
foreign_key, primary_key |
object | null | Source objects of the join |
relationship_type |
string | Localized cardinality label |
created_at, updated_at |
null | Not populated in v1 |
Errors
| Code | HTTP | Condition |
|---|---|---|
DF_API.RELATIONSHIP_NOT_FOUND |
404 | The relationship does not exist in the version |
| Common errors | — | Section 4 of the API page |
2.14 Combined RMD export
Request
GET /df-api/v1/projects/{project_id}/versions/{version_id}/rmd
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
project_id |
path | integer | yes | Project identifier |
version_id |
path | integer | yes | Version identifier |
language |
query | ru | en |
no | Language of the select-type labels |
format |
query | json | xlsx |
no | Default json. xlsx produces six sheets: Measures, Dimensions, Facts, Dimension Groups, Fact Tables, Relationships |
Details
Returns a complete metadata snapshot of the project version — the RMD content (measures, dimensions, facts) plus the data model (dimension groups, fact tables, relationships) — in a single, non-paginated payload with an exported_at timestamp. Designed for downstream catalogs and full-state synchronization. Use the section 1 endpoints for individual, paginated RMD sections.
Response
200 OK
{
"project": {
"id": "12",
"name": "Sales Analytics",
"description": "Production sales warehouse"
},
"version": {
"id": "33",
"name": "Q4 2025",
"is_global": true
},
"measures": [
{
"row_number": 1,
"group": "Revenue",
"block": "Sales",
"measure_name": "Total revenue",
"measure_description": "Gross revenue across all channels",
"original_source_type": "Database",
"original_source": "ERP",
"original_object": "sales.amount",
"display_data_type": "Number",
"measure_type": "Base",
"restrictions": null,
"formula": null,
"report_for_verification": null,
"comment": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null,
"variation": null
}
],
"dimensions": [
{
"row_number": 1,
"group": "Customer",
"block": "Profile",
"dimension_name": "Customer name",
"dimension_description": "Full customer name",
"original_source_type": null,
"original_source": null,
"original_object": null,
"dimension_group": "Customers",
"display_data_type": "Text",
"source_data_type": "VARCHAR(255)",
"dimension_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "dim_customer", "column": "customer_name" },
"comment": null,
"value_options": null,
"status": "Active",
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"facts": [
{
"row_number": 1,
"group": "Sales",
"block": "Orders",
"fact_name": "Order line",
"fact_description": "An individual line item on a sales order",
"original_source_type": null,
"original_source": null,
"original_object": null,
"source_data_type": "DECIMAL(18,2)",
"fact_type": "Primary",
"formula": null,
"connected_source": { "db": "analytics_db", "schema": "public", "table": "fact_order_line", "column": "amount" },
"report_for_verification": null,
"comment": null,
"status": null,
"relevance": null,
"required": null,
"visibility": null,
"responsible_for_data": null
}
],
"dimension_groups": [
{
"id": "9",
"name": "Geography",
"description": "Geographic regions and countries",
"primary_key": {
"db": "analytics_db",
"schema": "public",
"table": "dim_geography",
"column": "region_id"
},
"dimensions": [
{ "id": "722", "name": "Region", "level": 1, "data_type": "Text", "physical_column": "region_name" },
{ "id": "723", "name": "Country", "level": 2, "data_type": "Text", "physical_column": "country_code" }
],
"related_fact_tables": ["11", "14"],
"created_at": null
}
],
"fact_tables": [
{
"id": "11",
"name": "fact_sales",
"description": "Primary sales facts",
"owner": "Pavel Shalavin",
"created_at": "2026-04-15T08:30:00Z",
"measures_count": 5,
"dimensions_count": 3,
"facts_count": 2,
"verification_filters_count": 2,
"related_dimension_groups_count": 1
}
],
"relationships": [
{
"id": "1101",
"source_fact_table": { "id": "11", "name": "fact_sales" },
"target_dimension_group": { "id": "9", "name": "Geography" },
"foreign_key": { "db": "analytics_db", "schema": "public", "table": "fact_sales", "column": "region_id" },
"primary_key": { "db": "analytics_db", "schema": "public", "table": "dim_geography", "column": "region_id" },
"relationship_type": "Many-to-one",
"created_at": null
}
],
"exported_at": "2026-05-05T08:30:00Z"
}
| Field | Type | Description |
|---|---|---|
project |
object | id, name, description of the project (id as a string) |
version |
object | id, name, is_global of the version |
measures[].row_number |
integer | Position of the row in the RMD table |
measures[].group, block |
string | null | Grouping columns of the RMD |
measures[].measure_name |
string | Measure name |
measures[].measure_description |
string | null | Description |
measures[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
measures[].display_data_type |
string | null | Localized data type label (Number, Text, Date, …) |
measures[].measure_type |
string | Localized label: Base or Calculated |
measures[].restrictions |
string | null | Restrictions column |
measures[].formula |
string | null | Formula of a calculated measure with references rendered as [Name] |
measures[].report_for_verification, comment, responsible_for_data, variation |
string | null | Free-text columns |
measures[].status, relevance, required, visibility |
string | null | Localized select labels |
dimensions[].row_number |
integer | Position of the row in the RMD table |
dimensions[].group, block |
string | null | Grouping columns of the RMD |
dimensions[].dimension_name, dimension_description |
string / string | null | Name and description |
dimensions[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
dimensions[].dimension_group |
string | null | Name of the dimension group the dimension belongs to |
dimensions[].display_data_type |
string | null | Localized data type label |
dimensions[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
dimensions[].dimension_type |
string | Localized label: Primary or Derived |
dimensions[].formula |
string | null | Formula of a derived dimension |
dimensions[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
dimensions[].comment, responsible_for_data |
string | null | Free-text columns |
dimensions[].value_options |
string | null | Allowed values column |
dimensions[].status, relevance, required, visibility |
string | null | Localized select labels |
facts[].row_number |
integer | Position of the row in the RMD table |
facts[].group, block |
string | null | Grouping columns of the RMD |
facts[].fact_name, fact_description |
string / string | null | Name and description |
facts[].original_source_type, original_source, original_object |
string | null | Provenance columns; free text |
facts[].source_data_type |
string | null | Physical column type resolved from the connection's cached schema |
facts[].fact_type |
string | Localized label: Primary or Derived |
facts[].formula |
string | null | Formula of a derived fact |
facts[].connected_source |
object | null | Source object { db, schema, table, column } (section 3.6 of the API page) |
facts[].report_for_verification, comment, responsible_for_data |
string | null | Free-text columns |
facts[].status, relevance, required, visibility |
string | null | Localized select labels |
dimension_groups[].id, name, description |
string / string / string | null | Identity |
dimension_groups[].primary_key |
object | null | Source object { db, schema, table, column } |
dimension_groups[].dimensions[] |
array | Members ordered by hierarchy level; data_type is the localized display data type, physical_column the column in the source table |
dimension_groups[].related_fact_tables[] |
string | IDs of fact tables that reference the group; their configuration is available through the fact table endpoints |
dimension_groups[].created_at |
null | Not populated in v1 |
fact_tables[].id, name, description, owner, created_at |
— | Identity; owner is the creator's name |
fact_tables[].measures_count, dimensions_count, facts_count |
integer | Elements assigned directly to the fact table |
fact_tables[].verification_filters_count |
integer | Per-fact-table verification filters |
fact_tables[].related_dimension_groups_count |
integer | Dimension groups assigned to the fact table |
relationships[].id |
string | Relationship identifier |
relationships[].source_fact_table |
object | id, name of the fact table holding the foreign key |
relationships[].target_dimension_group |
object | id, name of the dimension group holding the primary key |
relationships[].foreign_key, primary_key |
object | null | Source objects of the join |
relationships[].relationship_type |
string | Localized cardinality label |
relationships[].created_at |
null | Not populated in v1 |
exported_at |
string | When the snapshot was taken, ISO 8601 |
Errors. Common errors only (section 4 of the API page).